Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.vaadin.polymer.public.bower_components.hydrolysis.hydrolysis.js Maven / Gradle / Ivy
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) {
console.error("Only one base tag per document!");
throw "Multiple base tags in " + href;
} else if (parsed.base.length == 1) {
var baseHref = dom5.getAttribute(parsed.base[0], "href");
if (baseHref) {
baseHref = baseHref + "/";
baseUri = url.resolve(baseUri, baseHref);
}
}
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = parsed.import[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var link = _step2.value;
var linkurl = dom5.getAttribute(link, 'href');
if (linkurl) {
var resolvedUrl = url.resolve(baseUri, linkurl);
depHrefs.push(resolvedUrl);
depsLoaded.push(this._dependenciesLoadedFor(resolvedUrl, href));
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = parsed.style[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var styleElement = _step3.value;
if (polymerExternalStyle(styleElement)) {
var styleHref = dom5.getAttribute(styleElement, 'href');
if (href) {
styleHref = url.resolve(baseUri, styleHref);
depsLoaded.push(this.loader.request(styleHref).then(function (content) {
_this2._content[styleHref] = content;
return {};
}));
}
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
}
var depsStrLoaded = Promise.all(depsLoaded).then(function () {
return depHrefs;
}).catch(function (err) {
throw err;
});
this.parsedDocuments[href] = parsed.ast;
this.html[href] = {
href: href,
htmlLoaded: htmlLoaded,
metadataLoaded: metadataLoaded,
depHrefs: depHrefs,
depsLoaded: depsStrLoaded
};
return this.html[href];
}
}, {
key: '_processScripts',
value: function _processScripts(scripts, href) {
var _this3 = this;
var scriptPromises = [];
scripts.forEach(function (script) {
scriptPromises.push(_this3._processScript(script, href));
});
return Promise.all(scriptPromises).then(function (metadataList) {
// TODO(ajo) remove this cast.
var list = metadataList;
return list.reduce(reduceMetadata, EMPTY_METADATA);
});
}
}, {
key: '_processScript',
value: function _processScript(script, href) {
var _this4 = this;
var src = dom5.getAttribute(script, 'src');
var parsedJs;
if (!src) {
try {
parsedJs = js_parse_1.jsParse(script.childNodes.length ? script.childNodes[0].value : '');
} catch (err) {
// Figure out the correct line number for the error.
var line = 0;
var col = 0;
if (script.__ownerDocument && script.__ownerDocument == href) {
line = script.__locationDetail.line - 1;
col = script.__locationDetail.column - 1;
}
line += err.lineNumber;
col += err.column;
var message = "Error parsing script in " + href + " at " + line + ":" + col;
message += "\n" + err.stack;
var fixedErr = new Error(message);
fixedErr.location = { line: line, column: col };
fixedErr.ownerDocument = script.__ownerDocument;
return Promise.reject(fixedErr);
}
if (parsedJs.elements) {
parsedJs.elements.forEach(function (element) {
element.scriptElement = script;
element.contentHref = href;
_this4.elements.push(element);
if (element.is in _this4.elementsByTagName) {
console.warn('Ignoring duplicate element definition: ' + element.is);
} else {
_this4.elementsByTagName[element.is] = element;
}
});
}
if (parsedJs.features) {
parsedJs.features.forEach(function (feature) {
feature.contentHref = href;
feature.scriptElement = script;
});
this.features = this.features.concat(parsedJs.features);
}
if (parsedJs.behaviors) {
parsedJs.behaviors.forEach(function (behavior) {
behavior.contentHref = href;
_this4.behaviorsByName[behavior.is] = behavior;
_this4.behaviorsByName[behavior.symbol] = behavior;
});
this.behaviors = this.behaviors.concat(parsedJs.behaviors);
}
if (!Object.hasOwnProperty.call(this.parsedScripts, href)) {
this.parsedScripts[href] = [];
}
var scriptElement;
if (script.__ownerDocument && script.__ownerDocument == href) {
scriptElement = script;
}
this.parsedScripts[href].push({
ast: parsedJs.parsedScript,
scriptElement: scriptElement
});
return Promise.resolve(parsedJs);
}
if (this.loader) {
var resolvedSrc = url.resolve(href, src);
return this.loader.request(resolvedSrc).then(function (content) {
_this4._content[resolvedSrc] = content;
var scriptText = dom5.constructors.text(content);
dom5.append(script, scriptText);
dom5.removeAttribute(script, 'src');
script.__hydrolysisInlined = src;
return _this4._processScript(script, resolvedSrc);
}).catch(function (err) {
throw err;
});
} else {
return Promise.resolve(EMPTY_METADATA);
}
}
}, {
key: '_dependenciesLoadedFor',
value: function _dependenciesLoadedFor(href, root) {
var _this5 = this;
var found = {};
if (root !== undefined) {
found[root] = true;
}
return this._getDependencies(href, found).then(function (deps) {
var depPromises = deps.map(function (depHref) {
return _this5.load(depHref).then(function (htmlMonomer) {
return htmlMonomer.metadataLoaded;
});
});
return Promise.all(depPromises);
});
}
}, {
key: '_getDependencies',
/**
* List all the html dependencies for the document at `href`.
* @param {string} href The href to get dependencies for.
* @param {Object.=} found An object keyed by URL of the
* already resolved dependencies.
* @param {boolean=} transitive Whether to load transitive
* dependencies. Defaults to true.
* @return {Array.} A list of all the html dependencies.
*/
value: function _getDependencies(href, found, transitive) {
var _this6 = this;
if (found === undefined) {
found = {};
found[href] = true;
}
if (transitive === undefined) {
transitive = true;
}
var deps = [];
return this.load(href).then(function (htmlMonomer) {
var transitiveDeps = [];
htmlMonomer.depHrefs.forEach(function (depHref) {
if (found[depHref]) {
return;
}
deps.push(depHref);
found[depHref] = true;
if (transitive) {
transitiveDeps.push(_this6._getDependencies(depHref, found));
}
});
return Promise.all(transitiveDeps);
}).then(function (transitiveDeps) {
var alldeps = transitiveDeps.reduce(function (a, b) {
return a.concat(b);
}, []).concat(deps);
return alldeps;
});
}
}, {
key: 'elementsForFolder',
/**
* Returns the elements defined in the folder containing `href`.
* @param {string} href path to search.
*/
value: function elementsForFolder(href) {
return this.elements.filter(function (element) {
return matchesDocumentFolder(element, href);
});
}
}, {
key: 'behaviorsForFolder',
/**
* Returns the behaviors defined in the folder containing `href`.
* @param {string} href path to search.
* @return {Array.}
*/
value: function behaviorsForFolder(href) {
return this.behaviors.filter(function (behavior) {
return matchesDocumentFolder(behavior, href);
});
}
}, {
key: 'metadataTree',
/**
* Returns a promise that resolves to a POJO representation of the import
* tree, in a format that maintains the ordering of the HTML imports spec.
* @param {string} href the import to get metadata for.
* @return {Promise}
*/
value: function metadataTree(href) {
var _this7 = this;
return this.load(href).then(function (monomer) {
var loadedHrefs = {};
loadedHrefs[href] = true;
return _this7._metadataTree(monomer, loadedHrefs);
});
}
}, {
key: '_metadataTree',
value: function _metadataTree(htmlMonomer, loadedHrefs) {
return __awaiter(this, void 0, void 0, regeneratorRuntime.mark(function _callee() {
var metadata, hrefs, depMetadata, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, href, metadataPromise;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (loadedHrefs === undefined) {
loadedHrefs = {};
}
_context.next = 3;
return htmlMonomer.metadataLoaded;
case 3:
metadata = _context.sent;
metadata = {
elements: metadata.elements,
features: metadata.features,
behaviors: [],
href: htmlMonomer.href
};
_context.next = 7;
return htmlMonomer.depsLoaded;
case 7:
hrefs = _context.sent;
depMetadata = [];
_iteratorNormalCompletion4 = true;
_didIteratorError4 = false;
_iteratorError4 = undefined;
_context.prev = 12;
_iterator4 = hrefs[Symbol.iterator]();
case 14:
if (_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done) {
_context.next = 29;
break;
}
href = _step4.value;
metadataPromise = undefined;
if (loadedHrefs[href]) {
_context.next = 24;
break;
}
loadedHrefs[href] = true;
metadataPromise = this._metadataTree(this.html[href], loadedHrefs);
_context.next = 22;
return metadataPromise;
case 22:
_context.next = 25;
break;
case 24:
metadataPromise = Promise.resolve({});
case 25:
depMetadata.push(metadataPromise);
case 26:
_iteratorNormalCompletion4 = true;
_context.next = 14;
break;
case 29:
_context.next = 35;
break;
case 31:
_context.prev = 31;
_context.t0 = _context['catch'](12);
_didIteratorError4 = true;
_iteratorError4 = _context.t0;
case 35:
_context.prev = 35;
_context.prev = 36;
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
case 38:
_context.prev = 38;
if (!_didIteratorError4) {
_context.next = 41;
break;
}
throw _iteratorError4;
case 41:
return _context.finish(38);
case 42:
return _context.finish(35);
case 43:
return _context.abrupt('return', Promise.all(depMetadata).then(function (importMetadata) {
// TODO(ajo): remove this when tsc stops having issues.
metadata.imports = importMetadata;
return htmlMonomer.htmlLoaded.then(function (parsedHtml) {
metadata.html = parsedHtml;
if (metadata.elements) {
metadata.elements.forEach(function (element) {
attachDomModule(parsedHtml, element);
});
}
return metadata;
});
}));
case 44:
case 'end':
return _context.stop();
}
}
}, _callee, this, [[12, 31, 35, 43], [36,, 38, 42]]);
}));
}
}, {
key: '_inlineStyles',
value: function _inlineStyles(ast, href) {
var _this8 = this;
var cssLinks = dom5.queryAll(ast, polymerExternalStyle);
cssLinks.forEach(function (link) {
var linkHref = dom5.getAttribute(link, 'href');
var uri = url.resolve(href, linkHref);
var content = _this8._content[uri];
var style = dom5.constructors.element('style');
dom5.setTextContent(style, '\n' + content + '\n');
dom5.replace(link, style);
});
return cssLinks.length > 0;
}
}, {
key: '_inlineScripts',
value: function _inlineScripts(ast, href) {
var _this9 = this;
var scripts = dom5.queryAll(ast, externalScript);
scripts.forEach(function (script) {
var scriptHref = dom5.getAttribute(script, 'src');
var uri = url.resolve(href, scriptHref);
var content = _this9._content[uri];
var inlined = dom5.constructors.element('script');
dom5.setTextContent(inlined, '\n' + content + '\n');
dom5.replace(script, inlined);
});
return scripts.length > 0;
}
}, {
key: '_inlineImports',
value: function _inlineImports(ast, href, loaded) {
var _this10 = this;
var imports = dom5.queryAll(ast, isHtmlImportNode);
imports.forEach(function (htmlImport) {
var importHref = dom5.getAttribute(htmlImport, 'href');
var uri = url.resolve(href, importHref);
if (loaded[uri]) {
dom5.remove(htmlImport);
return;
}
var content = _this10.getLoadedAst(uri, loaded);
dom5.replace(htmlImport, content);
});
return imports.length > 0;
}
}, {
key: 'getLoadedAst',
/**
* Returns a promise resolving to a form of the AST with all links replaced
* with the document they link to. .css and .script files become <style> and
* <script>, respectively.
*
* The elements in the loaded document are unmodified from their original
* documents.
*
* @param {string} href The document to load.
* @param {Object.=} loaded An object keyed by already loaded documents.
* @return {Promise.}
*/
value: function getLoadedAst(href, loaded) {
if (!loaded) {
loaded = {};
}
loaded[href] = true;
var parsedDocument = this.parsedDocuments[href];
var analyzedDocument = this.html[href];
var astCopy = dom5.parse(dom5.serialize(parsedDocument));
// Whenever we inline something, reset inlined to true to know that anoather
// inlining pass is needed;
this._inlineStyles(astCopy, href);
this._inlineScripts(astCopy, href);
this._inlineImports(astCopy, href, loaded);
return astCopy;
}
}, {
key: 'nodeWalkDocuments',
/**
* Calls `dom5.nodeWalkAll` on each document that `Anayzler` has laoded.
*/
value: function nodeWalkDocuments(predicate) {
var results = [];
for (var href in this.parsedDocuments) {
var newNodes = dom5.nodeWalkAll(this.parsedDocuments[href], predicate);
results = results.concat(newNodes);
}
return results;
}
}, {
key: 'nodeWalkAllDocuments',
/**
* Calls `dom5.nodeWalkAll` on each document that `Anayzler` has laoded.
*
* TODO: make nodeWalkAll & nodeWalkAllDocuments distict, or delete one.
*/
value: function nodeWalkAllDocuments(predicate) {
var results = [];
for (var href in this.parsedDocuments) {
var newNodes = dom5.nodeWalkAll(this.parsedDocuments[href], predicate);
results = results.concat(newNodes);
}
return results;
}
}, {
key: 'annotate',
/** Annotates all loaded metadata with its documentation. */
value: function annotate() {
var _this11 = this;
if (this.features.length > 0) {
var featureEl = docs.featureElement(this.features);
this.elements.unshift(featureEl);
this.elementsByTagName[featureEl.is] = featureEl;
}
var behaviorsByName = this.behaviorsByName;
var elementHelper = function elementHelper(descriptor) {
docs.annotateElement(descriptor, behaviorsByName);
};
this.elements.forEach(elementHelper);
this.behaviors.forEach(elementHelper); // Same shape.
this.behaviors.forEach(function (behavior) {
if (behavior.is !== behavior.symbol && behavior.symbol) {
_this11.behaviorsByName[behavior.symbol] = undefined;
}
});
}
}, {
key: 'clean',
/** Removes redundant properties from the collected descriptors. */
value: function clean() {
this.elements.forEach(docs.cleanElement);
}
}]);
return Analyzer;
}();
/**
* Shorthand for transitively loading and processing all imports beginning at
* `href`.
*
* In order to properly filter paths, `href` _must_ be an absolute URI.
*
* @param {string} href The root import to begin loading from.
* @param {LoadOptions=} options Any additional options for the load.
* @return {Promise} A promise that will resolve once `href` and its
* dependencies have been loaded and analyzed.
*/
Analyzer.analyze = function analyze(href, options) {
options = options || {};
options.filter = options.filter || _defaultFilter(href);
var loader = new file_loader_1.FileLoader();
var resolver = options.resolver;
if (resolver === undefined) {
if (typeof window === 'undefined') {
resolver = 'fs';
} else {
resolver = 'xhr';
}
}
var primaryResolver = undefined;
if (resolver === 'fs') {
primaryResolver = new fs_resolver_1.FSResolver(options);
} else if (resolver === 'xhr') {
primaryResolver = new xhr_resolver_1.XHRResolver(options);
} else if (resolver === 'permissive') {
primaryResolver = new error_swallowing_fs_resolver_1.ErrorSwallowingFSResolver(options);
} else {
throw new Error("Resolver must be one of 'fs', 'xhr', or 'permissive'");
}
loader.addResolver(primaryResolver);
if (options.content) {
loader.addResolver(new string_resolver_1.StringResolver({ url: href, content: options.content }));
}
loader.addResolver(new noop_resolver_1.NoopResolver({ test: options.filter }));
var analyzer = new Analyzer(false, loader);
return analyzer.metadataTree(href).then(function (root) {
if (!options.noAnnotations) {
analyzer.annotate();
}
if (options.clean) {
analyzer.clean();
}
return Promise.resolve(analyzer);
});
};
exports.Analyzer = Analyzer;
;
/**
* @private
* @param {string} href
* @return {function(string): boolean}
*/
function _defaultFilter(href) {
// Everything up to the last `/` or `\`.
var base = href.match(/^(.*?)[^\/\\]*$/)[1];
return function (uri) {
return uri.indexOf(base) !== 0;
};
}
function matchesDocumentFolder(descriptor, href) {
if (!descriptor.contentHref) {
return false;
}
var descriptorDoc = url.parse(descriptor.contentHref);
if (!descriptorDoc || !descriptorDoc.pathname) {
return false;
}
var searchDoc = url.parse(href);
if (!searchDoc || !searchDoc.pathname) {
return false;
}
var searchPath = searchDoc.pathname;
var lastSlash = searchPath.lastIndexOf("/");
if (lastSlash > 0) {
searchPath = searchPath.slice(0, lastSlash);
}
return descriptorDoc.pathname.indexOf(searchPath) === 0;
}
// TODO(ajo): Refactor out of vulcanize into dom5.
var polymerExternalStyle = dom5.predicates.AND(dom5.predicates.hasTagName('link'), dom5.predicates.hasAttrValue('rel', 'import'), dom5.predicates.hasAttrValue('type', 'css'));
var externalScript = dom5.predicates.AND(dom5.predicates.hasTagName('script'), dom5.predicates.hasAttr('src'));
var isHtmlImportNode = dom5.predicates.AND(dom5.predicates.hasTagName('link'), dom5.predicates.hasAttrValue('rel', 'import'), dom5.predicates.NOT(dom5.predicates.hasAttrValue('type', 'css')));
function attachDomModule(parsedImport, element) {
var domModules = parsedImport['dom-module'];
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = domModules[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var domModule = _step5.value;
if (dom5.getAttribute(domModule, 'id') === element.is) {
element.domModule = domModule;
return;
}
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
}
},{"./ast-utils/docs":6,"./ast-utils/import-parse":10,"./ast-utils/js-parse":11,"./loader/error-swallowing-fs-resolver":13,"./loader/file-loader":14,"./loader/fs-resolver":15,"./loader/noop-resolver":16,"./loader/string-resolver":19,"./loader/xhr-resolver":20,"dom5":227,"url":286}],2:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
var esutil = require('./esutil');
var astValue = require('./ast-value');
function analyzeProperties(node) {
var analyzedProps = [];
if (node.type != 'ObjectExpression') {
return analyzedProps;
}
var obEx = node;
for (var i = 0; i < obEx.properties.length; i++) {
var property = obEx.properties[i];
var prop = esutil.toPropertyDescriptor(property);
prop.published = true;
if (property.value.type == 'ObjectExpression') {
/**
* Parse the expression inside a property object block. e.g.
* property: {
* key: {
* type: String,
* notify: true,
* value: -1,
* readOnly: true,
* reflectToAttribute: true
* }
* }
*/
var propDescExpr = property.value;
for (var j = 0; j < propDescExpr.properties.length; j++) {
var propertyArg = propDescExpr.properties[j];
var propertyKey = esutil.objectKeyToString(propertyArg.key);
switch (propertyKey) {
case 'type':
{
prop.type = esutil.objectKeyToString(propertyArg.value);
if (prop.type === undefined) {
throw {
message: 'Invalid type in property object.',
location: propertyArg.loc.start
};
}
}
break;
case 'notify':
{
prop.notify = astValue.expressionToValue(propertyArg.value);
if (prop.notify === undefined) prop.notify = astValue.CANT_CONVERT;
}
break;
case 'observer':
{
prop.observer = astValue.expressionToValue(propertyArg.value);
prop.observerNode = propertyArg.value;
if (prop.observer === undefined) prop.observer = astValue.CANT_CONVERT;
}
break;
case 'readOnly':
{
prop.readOnly = astValue.expressionToValue(propertyArg.value);
if (prop.readOnly === undefined) prop.readOnly = astValue.CANT_CONVERT;
}
break;
case 'reflectToAttribute':
{
prop.reflectToAttribute = astValue.expressionToValue(propertyArg);
if (prop.reflectToAttribute === undefined) prop.reflectToAttribute = astValue.CANT_CONVERT;
}
break;
case 'value':
{
prop.default = astValue.expressionToValue(propertyArg.value);
if (prop.default === undefined) prop.default = astValue.CANT_CONVERT;
}
break;
default:
break;
}
}
}
if (!prop.type) {
throw {
message: 'Unable to determine name for property key.',
location: node.loc.start
};
}
analyzedProps.push(prop);
}
return analyzedProps;
}
exports.analyzeProperties = analyzeProperties;
;
},{"./ast-value":3,"./esutil":8}],3:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
// useful tool to visualize AST: http://esprima.org/demo/parse.html
/**
* converts literal: {"type": "Literal", "value": 5, "raw": "5" }
* to string
*/
function literalToValue(literal) {
return literal.value;
}
/**
* converts unary to string
*/
function unaryToValue(unary) {
var argValue = expressionToValue(unary.argument);
if (argValue === undefined) return;
return unary.operator + argValue;
}
/**
* converts identifier to its value
* identifier { "type": "Identifier", "name": "Number }
*/
function identifierToValue(identifier) {
return identifier.name;
}
/**
* Function is a block statement.
*/
function functionDeclarationToValue(fn) {
if (fn.body.type == "BlockStatement") return blockStatementToValue(fn.body);
}
function functionExpressionToValue(fn) {
if (fn.body.type == "BlockStatement") return blockStatementToValue(fn.body);
}
/**
* Block statement: find last return statement, and return its value
*/
function blockStatementToValue(block) {
for (var i = block.body.length - 1; i >= 0; i--) {
if (block.body[i].type === "ReturnStatement") return returnStatementToValue(block.body[i]);
}
}
/**
* Evaluates return's argument
*/
function returnStatementToValue(ret) {
return expressionToValue(ret.argument);
}
/**
* Enclose containing values in []
*/
function arrayExpressionToValue(arry) {
var value = '[';
for (var i = 0; i < arry.elements.length; i++) {
var v = expressionToValue(arry.elements[i]);
if (v === undefined) continue;
if (i !== 0) value += ', ';
value += v;
}
value += ']';
return value;
}
/**
* Make it look like an object
*/
function objectExpressionToValue(obj) {
var value = '{';
for (var i = 0; i < obj.properties.length; i++) {
var k = expressionToValue(obj.properties[i].key);
var v = expressionToValue(obj.properties[i].value);
if (v === undefined) continue;
if (i !== 0) value += ', ';
value += '"' + k + '": ' + v;
}
value += '}';
return value;
}
/**
* BinaryExpressions are of the form "literal" + "literal"
*/
function binaryExpressionToValue(member) {
if (member.operator == "+") {
// We need to cast to `any` here because, while it's usually not the right
// thing to do to use '+' on two values of a mix of types because it's
// unpredictable, that is what the original code we're evaluating does.
return expressionToValue(member.left) + expressionToValue(member.right);
}
return;
}
/**
* MemberExpression references a variable with name
*/
function memberExpressionToValue(member) {
return expressionToValue(member.object) + "." + expressionToValue(member.property);
}
/**
* Tries to get the value of an expression. Returns undefined on failure.
*/
function expressionToValue(valueExpression) {
switch (valueExpression.type) {
case 'Literal':
return literalToValue(valueExpression);
case 'UnaryExpression':
return unaryToValue(valueExpression);
case 'Identifier':
return identifierToValue(valueExpression);
case 'FunctionDeclaration':
return functionDeclarationToValue(valueExpression);
case 'FunctionExpression':
return functionExpressionToValue(valueExpression);
case 'ArrayExpression':
return arrayExpressionToValue(valueExpression);
case 'ObjectExpression':
return objectExpressionToValue(valueExpression);
case 'Identifier':
return identifierToValue(valueExpression);
case 'MemberExpression':
return memberExpressionToValue(valueExpression);
case 'BinaryExpression':
return binaryExpressionToValue(valueExpression);
default:
return;
}
}
exports.expressionToValue = expressionToValue;
exports.CANT_CONVERT = 'UNKNOWN';
},{}],4:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
var docs = require('./docs');
var esutil = require('./esutil');
var jsdoc = require('./jsdoc');
var astValue = require('./ast-value');
var declaration_property_handlers_1 = require('./declaration-property-handlers');
function dedupe(array, keyFunc) {
var bucket = {};
array.forEach(function (el) {
var key = keyFunc(el);
if (key in bucket) {
return;
}
bucket[key] = el;
});
var returned = [];
Object.keys(bucket).forEach(function (k) {
returned.push(bucket[k]);
});
return returned;
}
// TODO(rictic): turn this into a class.
function behaviorFinder() {
/** The behaviors we've found. */
var behaviors = [];
var currentBehavior = null;
var propertyHandlers = null;
/**
* merges behavior with preexisting behavior with the same name.
* here to support multiple @polymerBehavior tags referring
* to same behavior. See iron-multi-selectable for example.
*/
function mergeBehavior(newBehavior) {
var isBehaviorImpl = function isBehaviorImpl(b) {
// filter out BehaviorImpl
return b.indexOf(newBehavior.is) === -1;
};
for (var i = 0; i < behaviors.length; i++) {
if (newBehavior.is !== behaviors[i].is) continue;
// merge desc, longest desc wins
if (newBehavior.desc) {
if (behaviors[i].desc) {
if (newBehavior.desc.length > behaviors[i].desc.length) behaviors[i].desc = newBehavior.desc;
} else {
behaviors[i].desc = newBehavior.desc;
}
}
// merge demos
behaviors[i].demos = (behaviors[i].demos || []).concat(newBehavior.demos || []);
// merge events,
behaviors[i].events = (behaviors[i].events || []).concat(newBehavior.events || []);
behaviors[i].events = dedupe(behaviors[i].events, function (e) {
return e.name;
});
// merge properties
behaviors[i].properties = (behaviors[i].properties || []).concat(newBehavior.properties || []);
// merge observers
behaviors[i].observers = (behaviors[i].observers || []).concat(newBehavior.observers || []);
// merge behaviors
behaviors[i].behaviors = (behaviors[i].behaviors || []).concat(newBehavior.behaviors || []).filter(isBehaviorImpl);
return behaviors[i];
}
return newBehavior;
}
/**
* gets the expression representing a behavior from a node.
*/
function behaviorExpression(node) {
switch (node.type) {
case 'ExpressionStatement':
// need to cast to `any` here because ExpressionStatement is super
// super general. this code is suspicious.
return node.expression.right;
case 'VariableDeclaration':
var n = node;
return n.declarations.length > 0 ? n.declarations[0].init : null;
}
}
/**
* checks whether an expression is a simple array containing only member
* expressions or identifiers.
*/
function isSimpleBehaviorArray(expression) {
if (!expression || expression.type !== 'ArrayExpression') return false;
var arrayExpr = expression;
for (var i = 0; i < arrayExpr.elements.length; i++) {
if (arrayExpr.elements[i].type !== 'MemberExpression' && arrayExpr.elements[i].type !== 'Identifier') {
return false;
}
}
return true;
}
var templatizer = "Polymer.Templatizer";
function _parseChainedBehaviors(node) {
// if current behavior is part of an array, it gets extended by other behaviors
// inside the array. Ex:
// Polymer.IronMultiSelectableBehavior = [ {....}, Polymer.IronSelectableBehavior]
// We add these to behaviors array
var expression = behaviorExpression(node);
var chained = [];
if (expression && expression.type === 'ArrayExpression') {
var arrExpr = expression;
for (var i = 0; i < arrExpr.elements.length; i++) {
if (arrExpr.elements[i].type === 'MemberExpression' || arrExpr.elements[i].type === 'Identifier') {
chained.push(astValue.expressionToValue(arrExpr.elements[i]));
}
}
if (chained.length > 0) currentBehavior.behaviors = chained;
}
}
function _initBehavior(node, getName) {
var comment = esutil.getAttachedComment(node);
var symbol = getName();
// Quickly filter down to potential candidates.
if (!comment || comment.indexOf('@polymerBehavior') === -1) {
if (symbol !== templatizer) {
return;
}
}
currentBehavior = {
type: 'behavior',
desc: comment,
events: esutil.getEventComments(node).map(function (event) {
return { desc: event };
})
};
propertyHandlers = declaration_property_handlers_1.declarationPropertyHandlers(currentBehavior);
docs.annotateBehavior(currentBehavior);
// Make sure that we actually parsed a behavior tag!
if (!jsdoc.hasTag(currentBehavior.jsdoc, 'polymerBehavior') && symbol !== templatizer) {
currentBehavior = null;
propertyHandlers = null;
return;
}
var name = jsdoc.getTag(currentBehavior.jsdoc, 'polymerBehavior', 'name');
currentBehavior.symbol = symbol;
if (!name) {
name = currentBehavior.symbol;
}
if (!name) {
console.warn('Unable to determine name for @polymerBehavior:', comment);
}
currentBehavior.is = name;
_parseChainedBehaviors(node);
currentBehavior = mergeBehavior(currentBehavior);
propertyHandlers = declaration_property_handlers_1.declarationPropertyHandlers(currentBehavior);
// Some behaviors are just lists of other behaviors. If this is one then
// add it to behaviors right away.
if (isSimpleBehaviorArray(behaviorExpression(node))) {
// TODO(ajo): Add a test to confirm the presence of `properties`
if (!currentBehavior.observers) currentBehavior.observers = [];
if (!currentBehavior.properties) currentBehavior.properties = [];
if (behaviors.indexOf(currentBehavior) === -1) behaviors.push(currentBehavior);
currentBehavior = null;
propertyHandlers = null;
}
}
var visitors = {
/**
* Look for object declarations with @behavior in the docs.
*/
enterVariableDeclaration: function enterVariableDeclaration(node, parent) {
if (node.declarations.length !== 1) return; // Ambiguous.
_initBehavior(node, function () {
return esutil.objectKeyToString(node.declarations[0].id);
});
},
/**
* Look for object assignments with @polymerBehavior in the docs.
*/
enterAssignmentExpression: function enterAssignmentExpression(node, parent) {
_initBehavior(parent, function () {
return esutil.objectKeyToString(node.left);
});
},
/**
* We assume that the object expression after such an assignment is the
* behavior's declaration. Seems to be a decent assumption for now.
*/
enterObjectExpression: function enterObjectExpression(node, parent) {
if (!currentBehavior || currentBehavior.properties) return;
currentBehavior.properties = currentBehavior.properties || [];
currentBehavior.observers = currentBehavior.observers || [];
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
var name = esutil.objectKeyToString(prop.key);
if (!name) {
throw {
message: 'Cant determine name for property key.',
location: node.loc.start
};
}
if (name in propertyHandlers) {
propertyHandlers[name](prop.value);
} else {
currentBehavior.properties.push(esutil.toPropertyDescriptor(prop));
}
}
behaviors.push(currentBehavior);
currentBehavior = null;
}
};
return { visitors: visitors, behaviors: behaviors };
}
exports.behaviorFinder = behaviorFinder;
;
},{"./ast-value":3,"./declaration-property-handlers":5,"./docs":6,"./esutil":8,"./jsdoc":12}],5:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
var astValue = require('./ast-value');
var analyze_properties_1 = require('./analyze-properties');
/**
* Returns an object containing functions that will annotate `declaration` with
* the polymer-specificmeaning of the value nodes for the named properties.
*
* @param {ElementDescriptor} declaration The descriptor to annotate.
* @return {object.} An object containing property
* handlers.
*/
function declarationPropertyHandlers(declaration) {
return {
is: function is(node) {
if (node.type == 'Literal') {
declaration.is = node.value.toString();
}
},
properties: function properties(node) {
var props = analyze_properties_1.analyzeProperties(node);
for (var i = 0; i < props.length; i++) {
declaration.properties.push(props[i]);
}
},
behaviors: function behaviors(node) {
if (node.type != 'ArrayExpression') {
return;
}
var arrNode = node;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = arrNode.elements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var element = _step.value;
var v = astValue.expressionToValue(element);
if (v === undefined) {
v = astValue.CANT_CONVERT;
}
declaration.behaviors.push(v);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
},
observers: function observers(node) {
if (node.type != 'ArrayExpression') {
return;
}
var arrNode = node;
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = arrNode.elements[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var element = _step2.value;
var v = astValue.expressionToValue(element);
if (v === undefined) v = astValue.CANT_CONVERT;
declaration.observers.push({
javascriptNode: element,
expression: v
});
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
};
}
exports.declarationPropertyHandlers = declarationPropertyHandlers;
},{"./analyze-properties":2,"./ast-value":3}],6:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
var jsdoc = require('./jsdoc');
var dom5 = require('dom5');
/** Properties on element prototypes that are purely configuration. */
var ELEMENT_CONFIGURATION = ['attached', 'attributeChanged', 'beforeRegister', 'configure', 'constructor', 'created', 'detached', 'enableCustomStyleProperties', 'extends', 'hostAttributes', 'is', 'listeners', 'mixins', 'properties', 'ready', 'registered'];
/** Tags understood by the annotation process, to be removed during `clean`. */
var HANDLED_TAGS = ['param', 'return', 'type'];
/**
* Annotates Hydrolysis descriptors, processing any `desc` properties as JSDoc.
*
* You probably want to use a more specialized version of this, such as
* `annotateElement`.
*
* Processed JSDoc values will be made available via the `jsdoc` property on a
* descriptor node.
*
* @param {Object} descriptor The descriptor node to process.
* @return {Object} The descriptor that was given.
*/
function annotate(descriptor) {
if (!descriptor || descriptor.jsdoc) return descriptor;
if (typeof descriptor.desc === 'string') {
descriptor.jsdoc = jsdoc.parseJsdoc(descriptor.desc);
// We want to present the normalized form of a descriptor.
descriptor.jsdoc.orig = descriptor.desc;
descriptor.desc = descriptor.jsdoc.description;
}
return descriptor;
}
exports.annotate = annotate;
/**
* Annotates @event, @hero, & @demo tags
*/
function annotateElementHeader(descriptor) {
if (descriptor.events) {
descriptor.events.forEach(function (event) {
_annotateEvent(event);
});
descriptor.events.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
}
descriptor.demos = [];
if (descriptor.jsdoc && descriptor.jsdoc.tags) {
descriptor.jsdoc.tags.forEach(function (tag) {
switch (tag.tag) {
case 'hero':
descriptor.hero = tag.name || 'hero.png';
break;
case 'demo':
descriptor.demos.push({
desc: tag.description || 'demo',
path: tag.name || 'demo/index.html'
});
break;
}
});
}
}
exports.annotateElementHeader = annotateElementHeader;
function copyProperties(from, to, behaviorsByName) {
if (from.properties) {
from.properties.forEach(function (fromProp) {
for (var toProp, i = 0; i < to.properties.length; i++) {
toProp = to.properties[i];
if (fromProp.name === toProp.name) {
return;
}
}
var newProp = { __fromBehavior: from.is };
if (fromProp.__fromBehavior) {
return;
}
Object.keys(fromProp).forEach(function (propertyField) {
newProp[propertyField] = fromProp[propertyField];
});
to.properties.push(newProp);
});
from.events.forEach(function (fromEvent) {
for (var toEvent, i = 0; i < to.events.length; i++) {
toEvent = to.events[i];
if (fromEvent.name === toEvent.name) {
return;
}
}
if (fromEvent.__fromBehavior) {
return;
}
var newEvent = { __fromBehavior: from.is };
Object.keys(fromEvent).forEach(function (eventField) {
newEvent[eventField] = fromEvent[eventField];
});
to.events.push(newEvent);
});
}
if (!from.behaviors) {
return;
}
for (var i = from.behaviors.length - 1; i >= 0; i--) {
// TODO: what's up with behaviors sometimes being a literal, and sometimes
// being a descriptor object?
var localBehavior = from.behaviors[i];
var definedBehavior = behaviorsByName[localBehavior] || behaviorsByName[localBehavior.symbol];
if (!definedBehavior) {
console.warn("Behavior " + localBehavior + " not found when mixing " + "properties into " + to.is + "!");
return;
}
copyProperties(definedBehavior, to, behaviorsByName);
}
}
function mixinBehaviors(descriptor, behaviorsByName) {
if (descriptor.behaviors) {
for (var i = descriptor.behaviors.length - 1; i >= 0; i--) {
var behavior = descriptor.behaviors[i];
if (!behaviorsByName[behavior]) {
console.warn("Behavior " + behavior + " not found when mixing " + "properties into " + descriptor.is + "!");
break;
}
var definedBehavior = behaviorsByName[behavior];
copyProperties(definedBehavior, descriptor, behaviorsByName);
}
}
}
/**
* Annotates documentation found within a Hydrolysis element descriptor. Also
* supports behaviors.
*
* If the element was processed via `hydrolize`, the element's documentation
* will also be extracted via its .
*
* @param {Object} descriptor The element descriptor.
* @return {Object} The descriptor that was given.
*/
function annotateElement(descriptor, behaviorsByName) {
if (!descriptor.desc && descriptor.type === 'element') {
descriptor.desc = _findElementDocs(descriptor.is, descriptor.domModule, descriptor.scriptElement);
}
annotate(descriptor);
// The `` is too low level for most needs, and it is _not_
// serializable. So we drop it now that we've extracted all the useful bits
// from it.
// TODO: Don't worry about serializability here, provide an API to get JSON.
delete descriptor.domModule;
mixinBehaviors(descriptor, behaviorsByName);
// Descriptors that should have their `desc` properties parsed as JSDoc.
descriptor.properties.forEach(function (property) {
// Feature properties are special, configuration is really just a matter of
// inheritance...
annotateProperty(property, descriptor.abstract);
});
// It may seem like overkill to always sort, but we have an assumption that
// these properties are typically being consumed by user-visible tooling.
// As such, it's good to have consistent output/ordering to aid the user.
descriptor.properties.sort(function (a, b) {
// Private properties are always last.
if (a.private && !b.private) {
return 1;
} else if (!a.private && b.private) {
return -1;
} else {
return a.name.localeCompare(b.name);
}
});
annotateElementHeader(descriptor);
return descriptor;
}
exports.annotateElement = annotateElement;
/**
* Annotates behavior descriptor.
* @param {Object} descriptor behavior descriptor
* @return {Object} descriptor passed in as param
*/
function annotateBehavior(descriptor) {
annotate(descriptor);
annotateElementHeader(descriptor);
return descriptor;
}
exports.annotateBehavior = annotateBehavior;
/**
* Annotates event documentation
*/
function _annotateEvent(descriptor) {
annotate(descriptor);
// process @event
var eventTag = jsdoc.getTag(descriptor.jsdoc, 'event');
descriptor.name = eventTag ? eventTag.description : "N/A";
// process @params
descriptor.params = (descriptor.jsdoc.tags || []).filter(function (tag) {
return tag.tag === 'param';
}).map(function (tag) {
return {
type: tag.type || "N/A",
desc: tag.description,
name: tag.name || "N/A"
};
});
// process @params
return descriptor;
}
/**
* Annotates documentation found about a Hydrolysis property descriptor.
*
* @param {Object} descriptor The property descriptor.
* @param {boolean} ignoreConfiguration If true, `configuration` is not set.
* @return {Object} The descriptior that was given.
*/
function annotateProperty(descriptor, ignoreConfiguration) {
annotate(descriptor);
if (descriptor.name[0] === '_' || jsdoc.hasTag(descriptor.jsdoc, 'private')) {
descriptor.private = true;
}
if (!ignoreConfiguration && ELEMENT_CONFIGURATION.indexOf(descriptor.name) !== -1) {
descriptor.private = true;
descriptor.configuration = true;
}
// @type JSDoc wins
descriptor.type = jsdoc.getTag(descriptor.jsdoc, 'type', 'type') || descriptor.type;
if (descriptor.type.match(/^function/i)) {
_annotateFunctionProperty(descriptor);
}
// @default JSDoc wins
var defaultTag = jsdoc.getTag(descriptor.jsdoc, 'default');
if (defaultTag !== null) {
var newDefault = (defaultTag.name || '') + (defaultTag.description || '');
if (newDefault !== '') {
descriptor.default = newDefault;
}
}
return descriptor;
}
function _annotateFunctionProperty(descriptor) {
descriptor.function = true;
var returnTag = jsdoc.getTag(descriptor.jsdoc, 'return');
if (returnTag) {
descriptor.return = {
type: returnTag.type,
desc: returnTag.description
};
}
var paramsByName = {};
(descriptor.params || []).forEach(function (param) {
paramsByName[param.name] = param;
});
(descriptor.jsdoc && descriptor.jsdoc.tags || []).forEach(function (tag) {
if (tag.tag !== 'param') return;
var param = paramsByName[tag.name];
if (!param) {
return;
}
param.type = tag.type || param.type;
param.desc = tag.description;
});
}
/**
* Converts raw features into an abstract `Polymer.Base` element.
*
* Note that docs on this element _are not processed_. You must call
* `annotateElement` on it yourself if you wish that.
*
* @param {Array} features
* @return {ElementDescriptor}
*/
function featureElement(features) {
var properties = features.reduce(function (result, feature) {
return result.concat(feature.properties);
}, []);
return {
type: 'element',
is: 'Polymer.Base',
abstract: true,
properties: properties,
desc: '`Polymer.Base` acts as a base prototype for all Polymer ' + 'elements. It is composed via various calls to ' + '`Polymer.Base._addFeature()`.\n' + '\n' + 'The properties reflected here are the combined view of all ' + 'features found in this library. There may be more properties ' + 'added via other libraries, as well.'
};
}
exports.featureElement = featureElement;
/**
* Cleans redundant properties from a descriptor, assuming that you have already
* called `annotate`.
*
* @param {Object} descriptor
*/
function clean(descriptor) {
if (!descriptor.jsdoc) return;
// The doctext was written to `descriptor.desc`
delete descriptor.jsdoc.description;
delete descriptor.jsdoc.orig;
var cleanTags = [];
(descriptor.jsdoc.tags || []).forEach(function (tag) {
// Drop any tags we've consumed.
if (HANDLED_TAGS.indexOf(tag.tag) !== -1) return;
cleanTags.push(tag);
});
if (cleanTags.length === 0) {
// No tags? no docs left!
delete descriptor.jsdoc;
} else {
descriptor.jsdoc.tags = cleanTags;
}
}
exports.clean = clean;
/**
* Cleans redundant properties from an element, assuming that you have already
* called `annotateElement`.
*
* @param {ElementDescriptor|BehaviorDescriptor} element
*/
function cleanElement(element) {
clean(element);
element.properties.forEach(cleanProperty);
}
exports.cleanElement = cleanElement;
/**
* Cleans redundant properties from a property, assuming that you have already
* called `annotateProperty`.
*
* @param {PropertyDescriptor} property
*/
function cleanProperty(property) {
clean(property);
}
/**
* Parse elements defined only in comments.
* @param {comments} Array A list of comments to parse.
* @return {ElementDescriptor} A list of pseudo-elements.
*/
function parsePseudoElements(comments) {
var elements = [];
comments.forEach(function (comment) {
var parsedJsdoc = jsdoc.parseJsdoc(comment);
var pseudoTag = jsdoc.getTag(parsedJsdoc, 'pseudoElement', 'name');
if (pseudoTag) {
var element = {
is: pseudoTag,
type: 'element',
jsdoc: { description: parsedJsdoc.description, tags: parsedJsdoc.tags },
properties: [],
desc: parsedJsdoc.description
};
annotateElementHeader(element);
elements.push(element);
}
});
return elements;
}
exports.parsePseudoElements = parsePseudoElements;
/**
* @param {string} elementId
* @param {DocumentAST} domModule
* @param {DocumentAST} scriptElement The script that the element was
* defined in.
*/
function _findElementDocs(elementId, domModule, scriptElement) {
// Note that we concatenate docs from all sources if we find them.
// element can be defined in:
// html comment right before dom-module
// html commnet right before script defining the module,
// if dom-module is empty
var found = [];
// Do we have a HTML comment on the `` or ` i)if(has(O, key = names[i++])){
~arrayIndexOf(result, key) || result.push(key);
}
return result;
};
};
var Empty = function(){};
$export($export.S, 'Object', {
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
getPrototypeOf: $.getProto = $.getProto || function(O){
O = toObject(O);
if(has(O, IE_PROTO))return O[IE_PROTO];
if(typeof O.constructor == 'function' && O instanceof O.constructor){
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
},
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
create: $.create = $.create || function(O, /*?*/Properties){
var result;
if(O !== null){
Empty.prototype = anObject(O);
result = new Empty();
Empty.prototype = null;
// add "__proto__" for Object.getPrototypeOf shim
result[IE_PROTO] = O;
} else result = createDict();
return Properties === undefined ? result : defineProperties(result, Properties);
},
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)
});
var construct = function(F, len, args){
if(!(len in factories)){
for(var n = [], i = 0; i < len; i++)n[i] = 'a[' + i + ']';
factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
}
return factories[len](F, args);
};
// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
$export($export.P, 'Function', {
bind: function bind(that /*, args... */){
var fn = aFunction(this)
, partArgs = arraySlice.call(arguments, 1);
var bound = function(/* args... */){
var args = partArgs.concat(arraySlice.call(arguments));
return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
};
if(isObject(fn.prototype))bound.prototype = fn.prototype;
return bound;
}
});
// fallback for not array-like ES3 strings and DOM objects
$export($export.P + $export.F * fails(function(){
if(html)arraySlice.call(html);
}), 'Array', {
slice: function(begin, end){
var len = toLength(this.length)
, klass = cof(this);
end = end === undefined ? len : end;
if(klass == 'Array')return arraySlice.call(this, begin, end);
var start = toIndex(begin, len)
, upTo = toIndex(end, len)
, size = toLength(upTo - start)
, cloned = Array(size)
, i = 0;
for(; i < size; i++)cloned[i] = klass == 'String'
? this.charAt(start + i)
: this[start + i];
return cloned;
}
});
$export($export.P + $export.F * (IObject != Object), 'Array', {
join: function join(separator){
return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);
}
});
// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
$export($export.S, 'Array', {isArray: require('./$.is-array')});
var createArrayReduce = function(isRight){
return function(callbackfn, memo){
aFunction(callbackfn);
var O = IObject(this)
, length = toLength(O.length)
, index = isRight ? length - 1 : 0
, i = isRight ? -1 : 1;
if(arguments.length < 2)for(;;){
if(index in O){
memo = O[index];
index += i;
break;
}
index += i;
if(isRight ? index < 0 : length <= index){
throw TypeError('Reduce of empty array with no initial value');
}
}
for(;isRight ? index >= 0 : length > index; index += i)if(index in O){
memo = callbackfn(memo, O[index], index, this);
}
return memo;
};
};
var methodize = function($fn){
return function(arg1/*, arg2 = undefined */){
return $fn(this, arg1, arguments[1]);
};
};
$export($export.P, 'Array', {
// 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
forEach: $.each = $.each || methodize(createArrayMethod(0)),
// 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
map: methodize(createArrayMethod(1)),
// 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
filter: methodize(createArrayMethod(2)),
// 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
some: methodize(createArrayMethod(3)),
// 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
every: methodize(createArrayMethod(4)),
// 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
reduce: createArrayReduce(false),
// 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
reduceRight: createArrayReduce(true),
// 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
indexOf: methodize(arrayIndexOf),
// 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
lastIndexOf: function(el, fromIndex /* = @[*-1] */){
var O = toIObject(this)
, length = toLength(O.length)
, index = length - 1;
if(arguments.length > 1)index = Math.min(index, toInteger(fromIndex));
if(index < 0)index = toLength(length + index);
for(;index >= 0; index--)if(index in O)if(O[index] === el)return index;
return -1;
}
});
// 20.3.3.1 / 15.9.4.4 Date.now()
$export($export.S, 'Date', {now: function(){ return +new Date; }});
var lz = function(num){
return num > 9 ? num : '0' + num;
};
// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
// PhantomJS / old WebKit has a broken implementations
$export($export.P + $export.F * (fails(function(){
return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';
}) || !fails(function(){
new Date(NaN).toISOString();
})), 'Date', {
toISOString: function toISOString(){
if(!isFinite(this))throw RangeError('Invalid time value');
var d = this
, y = d.getUTCFullYear()
, m = d.getUTCMilliseconds()
, s = y < 0 ? '-' : y > 9999 ? '+' : '';
return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +
'-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +
'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +
':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
}
});
},{"./$":76,"./$.a-function":32,"./$.an-object":34,"./$.array-includes":37,"./$.array-methods":38,"./$.cof":41,"./$.descriptors":49,"./$.dom-create":50,"./$.export":52,"./$.fails":54,"./$.has":60,"./$.html":62,"./$.invoke":63,"./$.iobject":64,"./$.is-array":66,"./$.is-object":68,"./$.property-desc":89,"./$.to-index":106,"./$.to-integer":107,"./$.to-iobject":108,"./$.to-length":109,"./$.to-object":110,"./$.uid":112}],116:[function(require,module,exports){
// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
var $export = require('./$.export');
$export($export.P, 'Array', {copyWithin: require('./$.array-copy-within')});
require('./$.add-to-unscopables')('copyWithin');
},{"./$.add-to-unscopables":33,"./$.array-copy-within":35,"./$.export":52}],117:[function(require,module,exports){
// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
var $export = require('./$.export');
$export($export.P, 'Array', {fill: require('./$.array-fill')});
require('./$.add-to-unscopables')('fill');
},{"./$.add-to-unscopables":33,"./$.array-fill":36,"./$.export":52}],118:[function(require,module,exports){
'use strict';
// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
var $export = require('./$.export')
, $find = require('./$.array-methods')(6)
, KEY = 'findIndex'
, forced = true;
// Shouldn't skip holes
if(KEY in [])Array(1)[KEY](function(){ forced = false; });
$export($export.P + $export.F * forced, 'Array', {
findIndex: function findIndex(callbackfn/*, that = undefined */){
return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
require('./$.add-to-unscopables')(KEY);
},{"./$.add-to-unscopables":33,"./$.array-methods":38,"./$.export":52}],119:[function(require,module,exports){
'use strict';
// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
var $export = require('./$.export')
, $find = require('./$.array-methods')(5)
, KEY = 'find'
, forced = true;
// Shouldn't skip holes
if(KEY in [])Array(1)[KEY](function(){ forced = false; });
$export($export.P + $export.F * forced, 'Array', {
find: function find(callbackfn/*, that = undefined */){
return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
require('./$.add-to-unscopables')(KEY);
},{"./$.add-to-unscopables":33,"./$.array-methods":38,"./$.export":52}],120:[function(require,module,exports){
'use strict';
var ctx = require('./$.ctx')
, $export = require('./$.export')
, toObject = require('./$.to-object')
, call = require('./$.iter-call')
, isArrayIter = require('./$.is-array-iter')
, toLength = require('./$.to-length')
, getIterFn = require('./core.get-iterator-method');
$export($export.S + $export.F * !require('./$.iter-detect')(function(iter){ Array.from(iter); }), 'Array', {
// 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){
var O = toObject(arrayLike)
, C = typeof this == 'function' ? this : Array
, $$ = arguments
, $$len = $$.length
, mapfn = $$len > 1 ? $$[1] : undefined
, mapping = mapfn !== undefined
, index = 0
, iterFn = getIterFn(O)
, length, result, step, iterator;
if(mapping)mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2);
// if object isn't iterable or it's array with default iterator - use simple case
if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){
result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;
}
} else {
length = toLength(O.length);
for(result = new C(length); length > index; index++){
result[index] = mapping ? mapfn(O[index], index) : O[index];
}
}
result.length = index;
return result;
}
});
},{"./$.ctx":47,"./$.export":52,"./$.is-array-iter":65,"./$.iter-call":70,"./$.iter-detect":73,"./$.to-length":109,"./$.to-object":110,"./core.get-iterator-method":114}],121:[function(require,module,exports){
'use strict';
var addToUnscopables = require('./$.add-to-unscopables')
, step = require('./$.iter-step')
, Iterators = require('./$.iterators')
, toIObject = require('./$.to-iobject');
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
module.exports = require('./$.iter-define')(Array, 'Array', function(iterated, kind){
this._t = toIObject(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function(){
var O = this._t
, kind = this._k
, index = this._i++;
if(!O || index >= O.length){
this._t = undefined;
return step(1);
}
if(kind == 'keys' )return step(0, index);
if(kind == 'values')return step(0, O[index]);
return step(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators.Arguments = Iterators.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');
},{"./$.add-to-unscopables":33,"./$.iter-define":72,"./$.iter-step":74,"./$.iterators":75,"./$.to-iobject":108}],122:[function(require,module,exports){
'use strict';
var $export = require('./$.export');
// WebKit Array.of isn't generic
$export($export.S + $export.F * require('./$.fails')(function(){
function F(){}
return !(Array.of.call(F) instanceof F);
}), 'Array', {
// 22.1.2.3 Array.of( ...items)
of: function of(/* ...args */){
var index = 0
, $$ = arguments
, $$len = $$.length
, result = new (typeof this == 'function' ? this : Array)($$len);
while($$len > index)result[index] = $$[index++];
result.length = $$len;
return result;
}
});
},{"./$.export":52,"./$.fails":54}],123:[function(require,module,exports){
require('./$.set-species')('Array');
},{"./$.set-species":95}],124:[function(require,module,exports){
'use strict';
var $ = require('./$')
, isObject = require('./$.is-object')
, HAS_INSTANCE = require('./$.wks')('hasInstance')
, FunctionProto = Function.prototype;
// 19.2.3.6 Function.prototype[@@hasInstance](V)
if(!(HAS_INSTANCE in FunctionProto))$.setDesc(FunctionProto, HAS_INSTANCE, {value: function(O){
if(typeof this != 'function' || !isObject(O))return false;
if(!isObject(this.prototype))return O instanceof this;
// for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
while(O = $.getProto(O))if(this.prototype === O)return true;
return false;
}});
},{"./$":76,"./$.is-object":68,"./$.wks":113}],125:[function(require,module,exports){
var setDesc = require('./$').setDesc
, createDesc = require('./$.property-desc')
, has = require('./$.has')
, FProto = Function.prototype
, nameRE = /^\s*function ([^ (]*)/
, NAME = 'name';
// 19.2.4.2 name
NAME in FProto || require('./$.descriptors') && setDesc(FProto, NAME, {
configurable: true,
get: function(){
var match = ('' + this).match(nameRE)
, name = match ? match[1] : '';
has(this, NAME) || setDesc(this, NAME, createDesc(5, name));
return name;
}
});
},{"./$":76,"./$.descriptors":49,"./$.has":60,"./$.property-desc":89}],126:[function(require,module,exports){
'use strict';
var strong = require('./$.collection-strong');
// 23.1 Map Objects
require('./$.collection')('Map', function(get){
return function Map(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
// 23.1.3.6 Map.prototype.get(key)
get: function get(key){
var entry = strong.getEntry(this, key);
return entry && entry.v;
},
// 23.1.3.9 Map.prototype.set(key, value)
set: function set(key, value){
return strong.def(this, key === 0 ? 0 : key, value);
}
}, strong, true);
},{"./$.collection":45,"./$.collection-strong":42}],127:[function(require,module,exports){
// 20.2.2.3 Math.acosh(x)
var $export = require('./$.export')
, log1p = require('./$.math-log1p')
, sqrt = Math.sqrt
, $acosh = Math.acosh;
// V8 bug https://code.google.com/p/v8/issues/detail?id=3509
$export($export.S + $export.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710), 'Math', {
acosh: function acosh(x){
return (x = +x) < 1 ? NaN : x > 94906265.62425156
? Math.log(x) + Math.LN2
: log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
}
});
},{"./$.export":52,"./$.math-log1p":80}],128:[function(require,module,exports){
// 20.2.2.5 Math.asinh(x)
var $export = require('./$.export');
function asinh(x){
return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
}
$export($export.S, 'Math', {asinh: asinh});
},{"./$.export":52}],129:[function(require,module,exports){
// 20.2.2.7 Math.atanh(x)
var $export = require('./$.export');
$export($export.S, 'Math', {
atanh: function atanh(x){
return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
}
});
},{"./$.export":52}],130:[function(require,module,exports){
// 20.2.2.9 Math.cbrt(x)
var $export = require('./$.export')
, sign = require('./$.math-sign');
$export($export.S, 'Math', {
cbrt: function cbrt(x){
return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
}
});
},{"./$.export":52,"./$.math-sign":81}],131:[function(require,module,exports){
// 20.2.2.11 Math.clz32(x)
var $export = require('./$.export');
$export($export.S, 'Math', {
clz32: function clz32(x){
return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
}
});
},{"./$.export":52}],132:[function(require,module,exports){
// 20.2.2.12 Math.cosh(x)
var $export = require('./$.export')
, exp = Math.exp;
$export($export.S, 'Math', {
cosh: function cosh(x){
return (exp(x = +x) + exp(-x)) / 2;
}
});
},{"./$.export":52}],133:[function(require,module,exports){
// 20.2.2.14 Math.expm1(x)
var $export = require('./$.export');
$export($export.S, 'Math', {expm1: require('./$.math-expm1')});
},{"./$.export":52,"./$.math-expm1":79}],134:[function(require,module,exports){
// 20.2.2.16 Math.fround(x)
var $export = require('./$.export')
, sign = require('./$.math-sign')
, pow = Math.pow
, EPSILON = pow(2, -52)
, EPSILON32 = pow(2, -23)
, MAX32 = pow(2, 127) * (2 - EPSILON32)
, MIN32 = pow(2, -126);
var roundTiesToEven = function(n){
return n + 1 / EPSILON - 1 / EPSILON;
};
$export($export.S, 'Math', {
fround: function fround(x){
var $abs = Math.abs(x)
, $sign = sign(x)
, a, result;
if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
a = (1 + EPSILON32 / EPSILON) * $abs;
result = a - (a - $abs);
if(result > MAX32 || result != result)return $sign * Infinity;
return $sign * result;
}
});
},{"./$.export":52,"./$.math-sign":81}],135:[function(require,module,exports){
// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
var $export = require('./$.export')
, abs = Math.abs;
$export($export.S, 'Math', {
hypot: function hypot(value1, value2){ // eslint-disable-line no-unused-vars
var sum = 0
, i = 0
, $$ = arguments
, $$len = $$.length
, larg = 0
, arg, div;
while(i < $$len){
arg = abs($$[i++]);
if(larg < arg){
div = larg / arg;
sum = sum * div * div + 1;
larg = arg;
} else if(arg > 0){
div = arg / larg;
sum += div * div;
} else sum += arg;
}
return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
}
});
},{"./$.export":52}],136:[function(require,module,exports){
// 20.2.2.18 Math.imul(x, y)
var $export = require('./$.export')
, $imul = Math.imul;
// some WebKit versions fails with big numbers, some has wrong arity
$export($export.S + $export.F * require('./$.fails')(function(){
return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
}), 'Math', {
imul: function imul(x, y){
var UINT16 = 0xffff
, xn = +x
, yn = +y
, xl = UINT16 & xn
, yl = UINT16 & yn;
return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
}
});
},{"./$.export":52,"./$.fails":54}],137:[function(require,module,exports){
// 20.2.2.21 Math.log10(x)
var $export = require('./$.export');
$export($export.S, 'Math', {
log10: function log10(x){
return Math.log(x) / Math.LN10;
}
});
},{"./$.export":52}],138:[function(require,module,exports){
// 20.2.2.20 Math.log1p(x)
var $export = require('./$.export');
$export($export.S, 'Math', {log1p: require('./$.math-log1p')});
},{"./$.export":52,"./$.math-log1p":80}],139:[function(require,module,exports){
// 20.2.2.22 Math.log2(x)
var $export = require('./$.export');
$export($export.S, 'Math', {
log2: function log2(x){
return Math.log(x) / Math.LN2;
}
});
},{"./$.export":52}],140:[function(require,module,exports){
// 20.2.2.28 Math.sign(x)
var $export = require('./$.export');
$export($export.S, 'Math', {sign: require('./$.math-sign')});
},{"./$.export":52,"./$.math-sign":81}],141:[function(require,module,exports){
// 20.2.2.30 Math.sinh(x)
var $export = require('./$.export')
, expm1 = require('./$.math-expm1')
, exp = Math.exp;
// V8 near Chromium 38 has a problem with very small numbers
$export($export.S + $export.F * require('./$.fails')(function(){
return !Math.sinh(-2e-17) != -2e-17;
}), 'Math', {
sinh: function sinh(x){
return Math.abs(x = +x) < 1
? (expm1(x) - expm1(-x)) / 2
: (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
}
});
},{"./$.export":52,"./$.fails":54,"./$.math-expm1":79}],142:[function(require,module,exports){
// 20.2.2.33 Math.tanh(x)
var $export = require('./$.export')
, expm1 = require('./$.math-expm1')
, exp = Math.exp;
$export($export.S, 'Math', {
tanh: function tanh(x){
var a = expm1(x = +x)
, b = expm1(-x);
return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
}
});
},{"./$.export":52,"./$.math-expm1":79}],143:[function(require,module,exports){
// 20.2.2.34 Math.trunc(x)
var $export = require('./$.export');
$export($export.S, 'Math', {
trunc: function trunc(it){
return (it > 0 ? Math.floor : Math.ceil)(it);
}
});
},{"./$.export":52}],144:[function(require,module,exports){
'use strict';
var $ = require('./$')
, global = require('./$.global')
, has = require('./$.has')
, cof = require('./$.cof')
, toPrimitive = require('./$.to-primitive')
, fails = require('./$.fails')
, $trim = require('./$.string-trim').trim
, NUMBER = 'Number'
, $Number = global[NUMBER]
, Base = $Number
, proto = $Number.prototype
// Opera ~12 has broken Object#toString
, BROKEN_COF = cof($.create(proto)) == NUMBER
, TRIM = 'trim' in String.prototype;
// 7.1.3 ToNumber(argument)
var toNumber = function(argument){
var it = toPrimitive(argument, false);
if(typeof it == 'string' && it.length > 2){
it = TRIM ? it.trim() : $trim(it, 3);
var first = it.charCodeAt(0)
, third, radix, maxCode;
if(first === 43 || first === 45){
third = it.charCodeAt(2);
if(third === 88 || third === 120)return NaN; // Number('+0x1') should be NaN, old V8 fix
} else if(first === 48){
switch(it.charCodeAt(1)){
case 66 : case 98 : radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i
case 79 : case 111 : radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i
default : return +it;
}
for(var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++){
code = digits.charCodeAt(i);
// parseInt parses a string to a first unavailable symbol
// but ToNumber should return NaN if a string contains unavailable symbols
if(code < 48 || code > maxCode)return NaN;
} return parseInt(digits, radix);
}
} return +it;
};
if(!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')){
$Number = function Number(value){
var it = arguments.length < 1 ? 0 : value
, that = this;
return that instanceof $Number
// check on 1..constructor(foo) case
&& (BROKEN_COF ? fails(function(){ proto.valueOf.call(that); }) : cof(that) != NUMBER)
? new Base(toNumber(it)) : toNumber(it);
};
$.each.call(require('./$.descriptors') ? $.getNames(Base) : (
// ES3:
'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
// ES6 (in case, if modules with ES6 Number statics required before):
'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'
).split(','), function(key){
if(has(Base, key) && !has($Number, key)){
$.setDesc($Number, key, $.getDesc(Base, key));
}
});
$Number.prototype = proto;
proto.constructor = $Number;
require('./$.redefine')(global, NUMBER, $Number);
}
},{"./$":76,"./$.cof":41,"./$.descriptors":49,"./$.fails":54,"./$.global":59,"./$.has":60,"./$.redefine":91,"./$.string-trim":104,"./$.to-primitive":111}],145:[function(require,module,exports){
// 20.1.2.1 Number.EPSILON
var $export = require('./$.export');
$export($export.S, 'Number', {EPSILON: Math.pow(2, -52)});
},{"./$.export":52}],146:[function(require,module,exports){
// 20.1.2.2 Number.isFinite(number)
var $export = require('./$.export')
, _isFinite = require('./$.global').isFinite;
$export($export.S, 'Number', {
isFinite: function isFinite(it){
return typeof it == 'number' && _isFinite(it);
}
});
},{"./$.export":52,"./$.global":59}],147:[function(require,module,exports){
// 20.1.2.3 Number.isInteger(number)
var $export = require('./$.export');
$export($export.S, 'Number', {isInteger: require('./$.is-integer')});
},{"./$.export":52,"./$.is-integer":67}],148:[function(require,module,exports){
// 20.1.2.4 Number.isNaN(number)
var $export = require('./$.export');
$export($export.S, 'Number', {
isNaN: function isNaN(number){
return number != number;
}
});
},{"./$.export":52}],149:[function(require,module,exports){
// 20.1.2.5 Number.isSafeInteger(number)
var $export = require('./$.export')
, isInteger = require('./$.is-integer')
, abs = Math.abs;
$export($export.S, 'Number', {
isSafeInteger: function isSafeInteger(number){
return isInteger(number) && abs(number) <= 0x1fffffffffffff;
}
});
},{"./$.export":52,"./$.is-integer":67}],150:[function(require,module,exports){
// 20.1.2.6 Number.MAX_SAFE_INTEGER
var $export = require('./$.export');
$export($export.S, 'Number', {MAX_SAFE_INTEGER: 0x1fffffffffffff});
},{"./$.export":52}],151:[function(require,module,exports){
// 20.1.2.10 Number.MIN_SAFE_INTEGER
var $export = require('./$.export');
$export($export.S, 'Number', {MIN_SAFE_INTEGER: -0x1fffffffffffff});
},{"./$.export":52}],152:[function(require,module,exports){
// 20.1.2.12 Number.parseFloat(string)
var $export = require('./$.export');
$export($export.S, 'Number', {parseFloat: parseFloat});
},{"./$.export":52}],153:[function(require,module,exports){
// 20.1.2.13 Number.parseInt(string, radix)
var $export = require('./$.export');
$export($export.S, 'Number', {parseInt: parseInt});
},{"./$.export":52}],154:[function(require,module,exports){
// 19.1.3.1 Object.assign(target, source)
var $export = require('./$.export');
$export($export.S + $export.F, 'Object', {assign: require('./$.object-assign')});
},{"./$.export":52,"./$.object-assign":83}],155:[function(require,module,exports){
// 19.1.2.5 Object.freeze(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('freeze', function($freeze){
return function freeze(it){
return $freeze && isObject(it) ? $freeze(it) : it;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],156:[function(require,module,exports){
// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
var toIObject = require('./$.to-iobject');
require('./$.object-sap')('getOwnPropertyDescriptor', function($getOwnPropertyDescriptor){
return function getOwnPropertyDescriptor(it, key){
return $getOwnPropertyDescriptor(toIObject(it), key);
};
});
},{"./$.object-sap":84,"./$.to-iobject":108}],157:[function(require,module,exports){
// 19.1.2.7 Object.getOwnPropertyNames(O)
require('./$.object-sap')('getOwnPropertyNames', function(){
return require('./$.get-names').get;
});
},{"./$.get-names":58,"./$.object-sap":84}],158:[function(require,module,exports){
// 19.1.2.9 Object.getPrototypeOf(O)
var toObject = require('./$.to-object');
require('./$.object-sap')('getPrototypeOf', function($getPrototypeOf){
return function getPrototypeOf(it){
return $getPrototypeOf(toObject(it));
};
});
},{"./$.object-sap":84,"./$.to-object":110}],159:[function(require,module,exports){
// 19.1.2.11 Object.isExtensible(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('isExtensible', function($isExtensible){
return function isExtensible(it){
return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],160:[function(require,module,exports){
// 19.1.2.12 Object.isFrozen(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('isFrozen', function($isFrozen){
return function isFrozen(it){
return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],161:[function(require,module,exports){
// 19.1.2.13 Object.isSealed(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('isSealed', function($isSealed){
return function isSealed(it){
return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],162:[function(require,module,exports){
// 19.1.3.10 Object.is(value1, value2)
var $export = require('./$.export');
$export($export.S, 'Object', {is: require('./$.same-value')});
},{"./$.export":52,"./$.same-value":93}],163:[function(require,module,exports){
// 19.1.2.14 Object.keys(O)
var toObject = require('./$.to-object');
require('./$.object-sap')('keys', function($keys){
return function keys(it){
return $keys(toObject(it));
};
});
},{"./$.object-sap":84,"./$.to-object":110}],164:[function(require,module,exports){
// 19.1.2.15 Object.preventExtensions(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('preventExtensions', function($preventExtensions){
return function preventExtensions(it){
return $preventExtensions && isObject(it) ? $preventExtensions(it) : it;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],165:[function(require,module,exports){
// 19.1.2.17 Object.seal(O)
var isObject = require('./$.is-object');
require('./$.object-sap')('seal', function($seal){
return function seal(it){
return $seal && isObject(it) ? $seal(it) : it;
};
});
},{"./$.is-object":68,"./$.object-sap":84}],166:[function(require,module,exports){
// 19.1.3.19 Object.setPrototypeOf(O, proto)
var $export = require('./$.export');
$export($export.S, 'Object', {setPrototypeOf: require('./$.set-proto').set});
},{"./$.export":52,"./$.set-proto":94}],167:[function(require,module,exports){
'use strict';
// 19.1.3.6 Object.prototype.toString()
var classof = require('./$.classof')
, test = {};
test[require('./$.wks')('toStringTag')] = 'z';
if(test + '' != '[object z]'){
require('./$.redefine')(Object.prototype, 'toString', function toString(){
return '[object ' + classof(this) + ']';
}, true);
}
},{"./$.classof":40,"./$.redefine":91,"./$.wks":113}],168:[function(require,module,exports){
'use strict';
var $ = require('./$')
, LIBRARY = require('./$.library')
, global = require('./$.global')
, ctx = require('./$.ctx')
, classof = require('./$.classof')
, $export = require('./$.export')
, isObject = require('./$.is-object')
, anObject = require('./$.an-object')
, aFunction = require('./$.a-function')
, strictNew = require('./$.strict-new')
, forOf = require('./$.for-of')
, setProto = require('./$.set-proto').set
, same = require('./$.same-value')
, SPECIES = require('./$.wks')('species')
, speciesConstructor = require('./$.species-constructor')
, asap = require('./$.microtask')
, PROMISE = 'Promise'
, process = global.process
, isNode = classof(process) == 'process'
, P = global[PROMISE]
, Wrapper;
var testResolve = function(sub){
var test = new P(function(){});
if(sub)test.constructor = Object;
return P.resolve(test) === test;
};
var USE_NATIVE = function(){
var works = false;
function P2(x){
var self = new P(x);
setProto(self, P2.prototype);
return self;
}
try {
works = P && P.resolve && testResolve();
setProto(P2, P);
P2.prototype = $.create(P.prototype, {constructor: {value: P2}});
// actual Firefox has broken subclass support, test that
if(!(P2.resolve(5).then(function(){}) instanceof P2)){
works = false;
}
// actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162
if(works && require('./$.descriptors')){
var thenableThenGotten = false;
P.resolve($.setDesc({}, 'then', {
get: function(){ thenableThenGotten = true; }
}));
works = thenableThenGotten;
}
} catch(e){ works = false; }
return works;
}();
// helpers
var sameConstructor = function(a, b){
// library wrapper special case
if(LIBRARY && a === P && b === Wrapper)return true;
return same(a, b);
};
var getConstructor = function(C){
var S = anObject(C)[SPECIES];
return S != undefined ? S : C;
};
var isThenable = function(it){
var then;
return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};
var PromiseCapability = function(C){
var resolve, reject;
this.promise = new C(function($$resolve, $$reject){
if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');
resolve = $$resolve;
reject = $$reject;
});
this.resolve = aFunction(resolve),
this.reject = aFunction(reject)
};
var perform = function(exec){
try {
exec();
} catch(e){
return {error: e};
}
};
var notify = function(record, isReject){
if(record.n)return;
record.n = true;
var chain = record.c;
asap(function(){
var value = record.v
, ok = record.s == 1
, i = 0;
var run = function(reaction){
var handler = ok ? reaction.ok : reaction.fail
, resolve = reaction.resolve
, reject = reaction.reject
, result, then;
try {
if(handler){
if(!ok)record.h = true;
result = handler === true ? value : handler(value);
if(result === reaction.promise){
reject(TypeError('Promise-chain cycle'));
} else if(then = isThenable(result)){
then.call(result, resolve, reject);
} else resolve(result);
} else reject(value);
} catch(e){
reject(e);
}
};
while(chain.length > i)run(chain[i++]); // variable length - can't use forEach
chain.length = 0;
record.n = false;
if(isReject)setTimeout(function(){
var promise = record.p
, handler, console;
if(isUnhandled(promise)){
if(isNode){
process.emit('unhandledRejection', value, promise);
} else if(handler = global.onunhandledrejection){
handler({promise: promise, reason: value});
} else if((console = global.console) && console.error){
console.error('Unhandled promise rejection', value);
}
} record.a = undefined;
}, 1);
});
};
var isUnhandled = function(promise){
var record = promise._d
, chain = record.a || record.c
, i = 0
, reaction;
if(record.h)return false;
while(chain.length > i){
reaction = chain[i++];
if(reaction.fail || !isUnhandled(reaction.promise))return false;
} return true;
};
var $reject = function(value){
var record = this;
if(record.d)return;
record.d = true;
record = record.r || record; // unwrap
record.v = value;
record.s = 2;
record.a = record.c.slice();
notify(record, true);
};
var $resolve = function(value){
var record = this
, then;
if(record.d)return;
record.d = true;
record = record.r || record; // unwrap
try {
if(record.p === value)throw TypeError("Promise can't be resolved itself");
if(then = isThenable(value)){
asap(function(){
var wrapper = {r: record, d: false}; // wrap
try {
then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
} catch(e){
$reject.call(wrapper, e);
}
});
} else {
record.v = value;
record.s = 1;
notify(record, false);
}
} catch(e){
$reject.call({r: record, d: false}, e); // wrap
}
};
// constructor polyfill
if(!USE_NATIVE){
// 25.4.3.1 Promise(executor)
P = function Promise(executor){
aFunction(executor);
var record = this._d = {
p: strictNew(this, P, PROMISE), // <- promise
c: [], // <- awaiting reactions
a: undefined, // <- checked in isUnhandled reactions
s: 0, // <- state
d: false, // <- done
v: undefined, // <- value
h: false, // <- handled rejection
n: false // <- notify
};
try {
executor(ctx($resolve, record, 1), ctx($reject, record, 1));
} catch(err){
$reject.call(record, err);
}
};
require('./$.redefine-all')(P.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected){
var reaction = new PromiseCapability(speciesConstructor(this, P))
, promise = reaction.promise
, record = this._d;
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
record.c.push(reaction);
if(record.a)record.a.push(reaction);
if(record.s)notify(record, false);
return promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function(onRejected){
return this.then(undefined, onRejected);
}
});
}
$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: P});
require('./$.set-to-string-tag')(P, PROMISE);
require('./$.set-species')(PROMISE);
Wrapper = require('./$.core')[PROMISE];
// statics
$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r){
var capability = new PromiseCapability(this)
, $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x){
// instanceof instead of internal slot check because we should fix it without replacement native Promise core
if(x instanceof P && sameConstructor(x.constructor, this))return x;
var capability = new PromiseCapability(this)
, $$resolve = capability.resolve;
$$resolve(x);
return capability.promise;
}
});
$export($export.S + $export.F * !(USE_NATIVE && require('./$.iter-detect')(function(iter){
P.all(iter)['catch'](function(){});
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable){
var C = getConstructor(this)
, capability = new PromiseCapability(C)
, resolve = capability.resolve
, reject = capability.reject
, values = [];
var abrupt = perform(function(){
forOf(iterable, false, values.push, values);
var remaining = values.length
, results = Array(remaining);
if(remaining)$.each.call(values, function(promise, index){
var alreadyCalled = false;
C.resolve(promise).then(function(value){
if(alreadyCalled)return;
alreadyCalled = true;
results[index] = value;
--remaining || resolve(results);
}, reject);
});
else resolve(results);
});
if(abrupt)reject(abrupt.error);
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable){
var C = getConstructor(this)
, capability = new PromiseCapability(C)
, reject = capability.reject;
var abrupt = perform(function(){
forOf(iterable, false, function(promise){
C.resolve(promise).then(capability.resolve, reject);
});
});
if(abrupt)reject(abrupt.error);
return capability.promise;
}
});
},{"./$":76,"./$.a-function":32,"./$.an-object":34,"./$.classof":40,"./$.core":46,"./$.ctx":47,"./$.descriptors":49,"./$.export":52,"./$.for-of":57,"./$.global":59,"./$.is-object":68,"./$.iter-detect":73,"./$.library":78,"./$.microtask":82,"./$.redefine-all":90,"./$.same-value":93,"./$.set-proto":94,"./$.set-species":95,"./$.set-to-string-tag":96,"./$.species-constructor":98,"./$.strict-new":99,"./$.wks":113}],169:[function(require,module,exports){
// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
var $export = require('./$.export')
, _apply = Function.apply;
$export($export.S, 'Reflect', {
apply: function apply(target, thisArgument, argumentsList){
return _apply.call(target, thisArgument, argumentsList);
}
});
},{"./$.export":52}],170:[function(require,module,exports){
// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
var $ = require('./$')
, $export = require('./$.export')
, aFunction = require('./$.a-function')
, anObject = require('./$.an-object')
, isObject = require('./$.is-object')
, bind = Function.bind || require('./$.core').Function.prototype.bind;
// MS Edge supports only 2 arguments
// FF Nightly sets third argument as `new.target`, but does not create `this` from it
$export($export.S + $export.F * require('./$.fails')(function(){
function F(){}
return !(Reflect.construct(function(){}, [], F) instanceof F);
}), 'Reflect', {
construct: function construct(Target, args /*, newTarget*/){
aFunction(Target);
var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
if(Target == newTarget){
// w/o altered newTarget, optimization for 0-4 arguments
if(args != undefined)switch(anObject(args).length){
case 0: return new Target;
case 1: return new Target(args[0]);
case 2: return new Target(args[0], args[1]);
case 3: return new Target(args[0], args[1], args[2]);
case 4: return new Target(args[0], args[1], args[2], args[3]);
}
// w/o altered newTarget, lot of arguments case
var $args = [null];
$args.push.apply($args, args);
return new (bind.apply(Target, $args));
}
// with altered newTarget, not support built-in constructors
var proto = newTarget.prototype
, instance = $.create(isObject(proto) ? proto : Object.prototype)
, result = Function.apply.call(Target, instance, args);
return isObject(result) ? result : instance;
}
});
},{"./$":76,"./$.a-function":32,"./$.an-object":34,"./$.core":46,"./$.export":52,"./$.fails":54,"./$.is-object":68}],171:[function(require,module,exports){
// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
var $ = require('./$')
, $export = require('./$.export')
, anObject = require('./$.an-object');
// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
$export($export.S + $export.F * require('./$.fails')(function(){
Reflect.defineProperty($.setDesc({}, 1, {value: 1}), 1, {value: 2});
}), 'Reflect', {
defineProperty: function defineProperty(target, propertyKey, attributes){
anObject(target);
try {
$.setDesc(target, propertyKey, attributes);
return true;
} catch(e){
return false;
}
}
});
},{"./$":76,"./$.an-object":34,"./$.export":52,"./$.fails":54}],172:[function(require,module,exports){
// 26.1.4 Reflect.deleteProperty(target, propertyKey)
var $export = require('./$.export')
, getDesc = require('./$').getDesc
, anObject = require('./$.an-object');
$export($export.S, 'Reflect', {
deleteProperty: function deleteProperty(target, propertyKey){
var desc = getDesc(anObject(target), propertyKey);
return desc && !desc.configurable ? false : delete target[propertyKey];
}
});
},{"./$":76,"./$.an-object":34,"./$.export":52}],173:[function(require,module,exports){
'use strict';
// 26.1.5 Reflect.enumerate(target)
var $export = require('./$.export')
, anObject = require('./$.an-object');
var Enumerate = function(iterated){
this._t = anObject(iterated); // target
this._i = 0; // next index
var keys = this._k = [] // keys
, key;
for(key in iterated)keys.push(key);
};
require('./$.iter-create')(Enumerate, 'Object', function(){
var that = this
, keys = that._k
, key;
do {
if(that._i >= keys.length)return {value: undefined, done: true};
} while(!((key = keys[that._i++]) in that._t));
return {value: key, done: false};
});
$export($export.S, 'Reflect', {
enumerate: function enumerate(target){
return new Enumerate(target);
}
});
},{"./$.an-object":34,"./$.export":52,"./$.iter-create":71}],174:[function(require,module,exports){
// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
var $ = require('./$')
, $export = require('./$.export')
, anObject = require('./$.an-object');
$export($export.S, 'Reflect', {
getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey){
return $.getDesc(anObject(target), propertyKey);
}
});
},{"./$":76,"./$.an-object":34,"./$.export":52}],175:[function(require,module,exports){
// 26.1.8 Reflect.getPrototypeOf(target)
var $export = require('./$.export')
, getProto = require('./$').getProto
, anObject = require('./$.an-object');
$export($export.S, 'Reflect', {
getPrototypeOf: function getPrototypeOf(target){
return getProto(anObject(target));
}
});
},{"./$":76,"./$.an-object":34,"./$.export":52}],176:[function(require,module,exports){
// 26.1.6 Reflect.get(target, propertyKey [, receiver])
var $ = require('./$')
, has = require('./$.has')
, $export = require('./$.export')
, isObject = require('./$.is-object')
, anObject = require('./$.an-object');
function get(target, propertyKey/*, receiver*/){
var receiver = arguments.length < 3 ? target : arguments[2]
, desc, proto;
if(anObject(target) === receiver)return target[propertyKey];
if(desc = $.getDesc(target, propertyKey))return has(desc, 'value')
? desc.value
: desc.get !== undefined
? desc.get.call(receiver)
: undefined;
if(isObject(proto = $.getProto(target)))return get(proto, propertyKey, receiver);
}
$export($export.S, 'Reflect', {get: get});
},{"./$":76,"./$.an-object":34,"./$.export":52,"./$.has":60,"./$.is-object":68}],177:[function(require,module,exports){
// 26.1.9 Reflect.has(target, propertyKey)
var $export = require('./$.export');
$export($export.S, 'Reflect', {
has: function has(target, propertyKey){
return propertyKey in target;
}
});
},{"./$.export":52}],178:[function(require,module,exports){
// 26.1.10 Reflect.isExtensible(target)
var $export = require('./$.export')
, anObject = require('./$.an-object')
, $isExtensible = Object.isExtensible;
$export($export.S, 'Reflect', {
isExtensible: function isExtensible(target){
anObject(target);
return $isExtensible ? $isExtensible(target) : true;
}
});
},{"./$.an-object":34,"./$.export":52}],179:[function(require,module,exports){
// 26.1.11 Reflect.ownKeys(target)
var $export = require('./$.export');
$export($export.S, 'Reflect', {ownKeys: require('./$.own-keys')});
},{"./$.export":52,"./$.own-keys":86}],180:[function(require,module,exports){
// 26.1.12 Reflect.preventExtensions(target)
var $export = require('./$.export')
, anObject = require('./$.an-object')
, $preventExtensions = Object.preventExtensions;
$export($export.S, 'Reflect', {
preventExtensions: function preventExtensions(target){
anObject(target);
try {
if($preventExtensions)$preventExtensions(target);
return true;
} catch(e){
return false;
}
}
});
},{"./$.an-object":34,"./$.export":52}],181:[function(require,module,exports){
// 26.1.14 Reflect.setPrototypeOf(target, proto)
var $export = require('./$.export')
, setProto = require('./$.set-proto');
if(setProto)$export($export.S, 'Reflect', {
setPrototypeOf: function setPrototypeOf(target, proto){
setProto.check(target, proto);
try {
setProto.set(target, proto);
return true;
} catch(e){
return false;
}
}
});
},{"./$.export":52,"./$.set-proto":94}],182:[function(require,module,exports){
// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
var $ = require('./$')
, has = require('./$.has')
, $export = require('./$.export')
, createDesc = require('./$.property-desc')
, anObject = require('./$.an-object')
, isObject = require('./$.is-object');
function set(target, propertyKey, V/*, receiver*/){
var receiver = arguments.length < 4 ? target : arguments[3]
, ownDesc = $.getDesc(anObject(target), propertyKey)
, existingDescriptor, proto;
if(!ownDesc){
if(isObject(proto = $.getProto(target))){
return set(proto, propertyKey, V, receiver);
}
ownDesc = createDesc(0);
}
if(has(ownDesc, 'value')){
if(ownDesc.writable === false || !isObject(receiver))return false;
existingDescriptor = $.getDesc(receiver, propertyKey) || createDesc(0);
existingDescriptor.value = V;
$.setDesc(receiver, propertyKey, existingDescriptor);
return true;
}
return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
}
$export($export.S, 'Reflect', {set: set});
},{"./$":76,"./$.an-object":34,"./$.export":52,"./$.has":60,"./$.is-object":68,"./$.property-desc":89}],183:[function(require,module,exports){
var $ = require('./$')
, global = require('./$.global')
, isRegExp = require('./$.is-regexp')
, $flags = require('./$.flags')
, $RegExp = global.RegExp
, Base = $RegExp
, proto = $RegExp.prototype
, re1 = /a/g
, re2 = /a/g
// "new" creates a new object, old webkit buggy here
, CORRECT_NEW = new $RegExp(re1) !== re1;
if(require('./$.descriptors') && (!CORRECT_NEW || require('./$.fails')(function(){
re2[require('./$.wks')('match')] = false;
// RegExp constructor can alter flags and IsRegExp works correct with @@match
return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
}))){
$RegExp = function RegExp(p, f){
var piRE = isRegExp(p)
, fiU = f === undefined;
return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p
: CORRECT_NEW
? new Base(piRE && !fiU ? p.source : p, f)
: Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f);
};
$.each.call($.getNames(Base), function(key){
key in $RegExp || $.setDesc($RegExp, key, {
configurable: true,
get: function(){ return Base[key]; },
set: function(it){ Base[key] = it; }
});
});
proto.constructor = $RegExp;
$RegExp.prototype = proto;
require('./$.redefine')(global, 'RegExp', $RegExp);
}
require('./$.set-species')('RegExp');
},{"./$":76,"./$.descriptors":49,"./$.fails":54,"./$.flags":56,"./$.global":59,"./$.is-regexp":69,"./$.redefine":91,"./$.set-species":95,"./$.wks":113}],184:[function(require,module,exports){
// 21.2.5.3 get RegExp.prototype.flags()
var $ = require('./$');
if(require('./$.descriptors') && /./g.flags != 'g')$.setDesc(RegExp.prototype, 'flags', {
configurable: true,
get: require('./$.flags')
});
},{"./$":76,"./$.descriptors":49,"./$.flags":56}],185:[function(require,module,exports){
// @@match logic
require('./$.fix-re-wks')('match', 1, function(defined, MATCH){
// 21.1.3.11 String.prototype.match(regexp)
return function match(regexp){
'use strict';
var O = defined(this)
, fn = regexp == undefined ? undefined : regexp[MATCH];
return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
};
});
},{"./$.fix-re-wks":55}],186:[function(require,module,exports){
// @@replace logic
require('./$.fix-re-wks')('replace', 2, function(defined, REPLACE, $replace){
// 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
return function replace(searchValue, replaceValue){
'use strict';
var O = defined(this)
, fn = searchValue == undefined ? undefined : searchValue[REPLACE];
return fn !== undefined
? fn.call(searchValue, O, replaceValue)
: $replace.call(String(O), searchValue, replaceValue);
};
});
},{"./$.fix-re-wks":55}],187:[function(require,module,exports){
// @@search logic
require('./$.fix-re-wks')('search', 1, function(defined, SEARCH){
// 21.1.3.15 String.prototype.search(regexp)
return function search(regexp){
'use strict';
var O = defined(this)
, fn = regexp == undefined ? undefined : regexp[SEARCH];
return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
};
});
},{"./$.fix-re-wks":55}],188:[function(require,module,exports){
// @@split logic
require('./$.fix-re-wks')('split', 2, function(defined, SPLIT, $split){
// 21.1.3.17 String.prototype.split(separator, limit)
return function split(separator, limit){
'use strict';
var O = defined(this)
, fn = separator == undefined ? undefined : separator[SPLIT];
return fn !== undefined
? fn.call(separator, O, limit)
: $split.call(String(O), separator, limit);
};
});
},{"./$.fix-re-wks":55}],189:[function(require,module,exports){
'use strict';
var strong = require('./$.collection-strong');
// 23.2 Set Objects
require('./$.collection')('Set', function(get){
return function Set(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
// 23.2.3.1 Set.prototype.add(value)
add: function add(value){
return strong.def(this, value = value === 0 ? 0 : value, value);
}
}, strong);
},{"./$.collection":45,"./$.collection-strong":42}],190:[function(require,module,exports){
'use strict';
var $export = require('./$.export')
, $at = require('./$.string-at')(false);
$export($export.P, 'String', {
// 21.1.3.3 String.prototype.codePointAt(pos)
codePointAt: function codePointAt(pos){
return $at(this, pos);
}
});
},{"./$.export":52,"./$.string-at":100}],191:[function(require,module,exports){
// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
'use strict';
var $export = require('./$.export')
, toLength = require('./$.to-length')
, context = require('./$.string-context')
, ENDS_WITH = 'endsWith'
, $endsWith = ''[ENDS_WITH];
$export($export.P + $export.F * require('./$.fails-is-regexp')(ENDS_WITH), 'String', {
endsWith: function endsWith(searchString /*, endPosition = @length */){
var that = context(this, searchString, ENDS_WITH)
, $$ = arguments
, endPosition = $$.length > 1 ? $$[1] : undefined
, len = toLength(that.length)
, end = endPosition === undefined ? len : Math.min(toLength(endPosition), len)
, search = String(searchString);
return $endsWith
? $endsWith.call(that, search, end)
: that.slice(end - search.length, end) === search;
}
});
},{"./$.export":52,"./$.fails-is-regexp":53,"./$.string-context":101,"./$.to-length":109}],192:[function(require,module,exports){
var $export = require('./$.export')
, toIndex = require('./$.to-index')
, fromCharCode = String.fromCharCode
, $fromCodePoint = String.fromCodePoint;
// length should be 1, old FF problem
$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
// 21.1.2.2 String.fromCodePoint(...codePoints)
fromCodePoint: function fromCodePoint(x){ // eslint-disable-line no-unused-vars
var res = []
, $$ = arguments
, $$len = $$.length
, i = 0
, code;
while($$len > i){
code = +$$[i++];
if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');
res.push(code < 0x10000
? fromCharCode(code)
: fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
);
} return res.join('');
}
});
},{"./$.export":52,"./$.to-index":106}],193:[function(require,module,exports){
// 21.1.3.7 String.prototype.includes(searchString, position = 0)
'use strict';
var $export = require('./$.export')
, context = require('./$.string-context')
, INCLUDES = 'includes';
$export($export.P + $export.F * require('./$.fails-is-regexp')(INCLUDES), 'String', {
includes: function includes(searchString /*, position = 0 */){
return !!~context(this, searchString, INCLUDES)
.indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
}
});
},{"./$.export":52,"./$.fails-is-regexp":53,"./$.string-context":101}],194:[function(require,module,exports){
'use strict';
var $at = require('./$.string-at')(true);
// 21.1.3.27 String.prototype[@@iterator]()
require('./$.iter-define')(String, 'String', function(iterated){
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function(){
var O = this._t
, index = this._i
, point;
if(index >= O.length)return {value: undefined, done: true};
point = $at(O, index);
this._i += point.length;
return {value: point, done: false};
});
},{"./$.iter-define":72,"./$.string-at":100}],195:[function(require,module,exports){
var $export = require('./$.export')
, toIObject = require('./$.to-iobject')
, toLength = require('./$.to-length');
$export($export.S, 'String', {
// 21.1.2.4 String.raw(callSite, ...substitutions)
raw: function raw(callSite){
var tpl = toIObject(callSite.raw)
, len = toLength(tpl.length)
, $$ = arguments
, $$len = $$.length
, res = []
, i = 0;
while(len > i){
res.push(String(tpl[i++]));
if(i < $$len)res.push(String($$[i]));
} return res.join('');
}
});
},{"./$.export":52,"./$.to-iobject":108,"./$.to-length":109}],196:[function(require,module,exports){
var $export = require('./$.export');
$export($export.P, 'String', {
// 21.1.3.13 String.prototype.repeat(count)
repeat: require('./$.string-repeat')
});
},{"./$.export":52,"./$.string-repeat":103}],197:[function(require,module,exports){
// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
'use strict';
var $export = require('./$.export')
, toLength = require('./$.to-length')
, context = require('./$.string-context')
, STARTS_WITH = 'startsWith'
, $startsWith = ''[STARTS_WITH];
$export($export.P + $export.F * require('./$.fails-is-regexp')(STARTS_WITH), 'String', {
startsWith: function startsWith(searchString /*, position = 0 */){
var that = context(this, searchString, STARTS_WITH)
, $$ = arguments
, index = toLength(Math.min($$.length > 1 ? $$[1] : undefined, that.length))
, search = String(searchString);
return $startsWith
? $startsWith.call(that, search, index)
: that.slice(index, index + search.length) === search;
}
});
},{"./$.export":52,"./$.fails-is-regexp":53,"./$.string-context":101,"./$.to-length":109}],198:[function(require,module,exports){
'use strict';
// 21.1.3.25 String.prototype.trim()
require('./$.string-trim')('trim', function($trim){
return function trim(){
return $trim(this, 3);
};
});
},{"./$.string-trim":104}],199:[function(require,module,exports){
'use strict';
// ECMAScript 6 symbols shim
var $ = require('./$')
, global = require('./$.global')
, has = require('./$.has')
, DESCRIPTORS = require('./$.descriptors')
, $export = require('./$.export')
, redefine = require('./$.redefine')
, $fails = require('./$.fails')
, shared = require('./$.shared')
, setToStringTag = require('./$.set-to-string-tag')
, uid = require('./$.uid')
, wks = require('./$.wks')
, keyOf = require('./$.keyof')
, $names = require('./$.get-names')
, enumKeys = require('./$.enum-keys')
, isArray = require('./$.is-array')
, anObject = require('./$.an-object')
, toIObject = require('./$.to-iobject')
, createDesc = require('./$.property-desc')
, getDesc = $.getDesc
, setDesc = $.setDesc
, _create = $.create
, getNames = $names.get
, $Symbol = global.Symbol
, $JSON = global.JSON
, _stringify = $JSON && $JSON.stringify
, setter = false
, HIDDEN = wks('_hidden')
, isEnum = $.isEnum
, SymbolRegistry = shared('symbol-registry')
, AllSymbols = shared('symbols')
, useNative = typeof $Symbol == 'function'
, ObjectProto = Object.prototype;
// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc = DESCRIPTORS && $fails(function(){
return _create(setDesc({}, 'a', {
get: function(){ return setDesc(this, 'a', {value: 7}).a; }
})).a != 7;
}) ? function(it, key, D){
var protoDesc = getDesc(ObjectProto, key);
if(protoDesc)delete ObjectProto[key];
setDesc(it, key, D);
if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc);
} : setDesc;
var wrap = function(tag){
var sym = AllSymbols[tag] = _create($Symbol.prototype);
sym._k = tag;
DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {
configurable: true,
set: function(value){
if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
setSymbolDesc(this, tag, createDesc(1, value));
}
});
return sym;
};
var isSymbol = function(it){
return typeof it == 'symbol';
};
var $defineProperty = function defineProperty(it, key, D){
if(D && has(AllSymbols, key)){
if(!D.enumerable){
if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key] = true;
} else {
if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
D = _create(D, {enumerable: createDesc(0, false)});
} return setSymbolDesc(it, key, D);
} return setDesc(it, key, D);
};
var $defineProperties = function defineProperties(it, P){
anObject(it);
var keys = enumKeys(P = toIObject(P))
, i = 0
, l = keys.length
, key;
while(l > i)$defineProperty(it, key = keys[i++], P[key]);
return it;
};
var $create = function create(it, P){
return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key){
var E = isEnum.call(this, key);
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]
? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
var D = getDesc(it = toIObject(it), key);
if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it){
var names = getNames(toIObject(it))
, result = []
, i = 0
, key;
while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key);
return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
var names = getNames(toIObject(it))
, result = []
, i = 0
, key;
while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]);
return result;
};
var $stringify = function stringify(it){
if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
var args = [it]
, i = 1
, $$ = arguments
, replacer, $replacer;
while($$.length > i)args.push($$[i++]);
replacer = args[1];
if(typeof replacer == 'function')$replacer = replacer;
if($replacer || !isArray(replacer))replacer = function(key, value){
if($replacer)value = $replacer.call(this, key, value);
if(!isSymbol(value))return value;
};
args[1] = replacer;
return _stringify.apply($JSON, args);
};
var buggyJSON = $fails(function(){
var S = $Symbol();
// MS Edge converts symbol values to JSON as {}
// WebKit converts symbol values to JSON as null
// V8 throws on boxed symbols
return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
});
// 19.4.1.1 Symbol([description])
if(!useNative){
$Symbol = function Symbol(){
if(isSymbol(this))throw TypeError('Symbol is not a constructor');
return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));
};
redefine($Symbol.prototype, 'toString', function toString(){
return this._k;
});
isSymbol = function(it){
return it instanceof $Symbol;
};
$.create = $create;
$.isEnum = $propertyIsEnumerable;
$.getDesc = $getOwnPropertyDescriptor;
$.setDesc = $defineProperty;
$.setDescs = $defineProperties;
$.getNames = $names.get = $getOwnPropertyNames;
$.getSymbols = $getOwnPropertySymbols;
if(DESCRIPTORS && !require('./$.library')){
redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
}
}
var symbolStatics = {
// 19.4.2.1 Symbol.for(key)
'for': function(key){
return has(SymbolRegistry, key += '')
? SymbolRegistry[key]
: SymbolRegistry[key] = $Symbol(key);
},
// 19.4.2.5 Symbol.keyFor(sym)
keyFor: function keyFor(key){
return keyOf(SymbolRegistry, key);
},
useSetter: function(){ setter = true; },
useSimple: function(){ setter = false; }
};
// 19.4.2.2 Symbol.hasInstance
// 19.4.2.3 Symbol.isConcatSpreadable
// 19.4.2.4 Symbol.iterator
// 19.4.2.6 Symbol.match
// 19.4.2.8 Symbol.replace
// 19.4.2.9 Symbol.search
// 19.4.2.10 Symbol.species
// 19.4.2.11 Symbol.split
// 19.4.2.12 Symbol.toPrimitive
// 19.4.2.13 Symbol.toStringTag
// 19.4.2.14 Symbol.unscopables
$.each.call((
'hasInstance,isConcatSpreadable,iterator,match,replace,search,' +
'species,split,toPrimitive,toStringTag,unscopables'
).split(','), function(it){
var sym = wks(it);
symbolStatics[it] = useNative ? sym : wrap(sym);
});
setter = true;
$export($export.G + $export.W, {Symbol: $Symbol});
$export($export.S, 'Symbol', symbolStatics);
$export($export.S + $export.F * !useNative, 'Object', {
// 19.1.2.2 Object.create(O [, Properties])
create: $create,
// 19.1.2.4 Object.defineProperty(O, P, Attributes)
defineProperty: $defineProperty,
// 19.1.2.3 Object.defineProperties(O, Properties)
defineProperties: $defineProperties,
// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
// 19.1.2.7 Object.getOwnPropertyNames(O)
getOwnPropertyNames: $getOwnPropertyNames,
// 19.1.2.8 Object.getOwnPropertySymbols(O)
getOwnPropertySymbols: $getOwnPropertySymbols
});
// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', {stringify: $stringify});
// 19.4.3.5 Symbol.prototype[@@toStringTag]
setToStringTag($Symbol, 'Symbol');
// 20.2.1.9 Math[@@toStringTag]
setToStringTag(Math, 'Math', true);
// 24.3.3 JSON[@@toStringTag]
setToStringTag(global.JSON, 'JSON', true);
},{"./$":76,"./$.an-object":34,"./$.descriptors":49,"./$.enum-keys":51,"./$.export":52,"./$.fails":54,"./$.get-names":58,"./$.global":59,"./$.has":60,"./$.is-array":66,"./$.keyof":77,"./$.library":78,"./$.property-desc":89,"./$.redefine":91,"./$.set-to-string-tag":96,"./$.shared":97,"./$.to-iobject":108,"./$.uid":112,"./$.wks":113}],200:[function(require,module,exports){
'use strict';
var $ = require('./$')
, redefine = require('./$.redefine')
, weak = require('./$.collection-weak')
, isObject = require('./$.is-object')
, has = require('./$.has')
, frozenStore = weak.frozenStore
, WEAK = weak.WEAK
, isExtensible = Object.isExtensible || isObject
, tmp = {};
// 23.3 WeakMap Objects
var $WeakMap = require('./$.collection')('WeakMap', function(get){
return function WeakMap(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
// 23.3.3.3 WeakMap.prototype.get(key)
get: function get(key){
if(isObject(key)){
if(!isExtensible(key))return frozenStore(this).get(key);
if(has(key, WEAK))return key[WEAK][this._i];
}
},
// 23.3.3.5 WeakMap.prototype.set(key, value)
set: function set(key, value){
return weak.def(this, key, value);
}
}, weak, true, true);
// IE11 WeakMap frozen keys fix
if(new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7){
$.each.call(['delete', 'has', 'get', 'set'], function(key){
var proto = $WeakMap.prototype
, method = proto[key];
redefine(proto, key, function(a, b){
// store frozen objects on leaky map
if(isObject(a) && !isExtensible(a)){
var result = frozenStore(this)[key](a, b);
return key == 'set' ? this : result;
// store all the rest on native weakmap
} return method.call(this, a, b);
});
});
}
},{"./$":76,"./$.collection":45,"./$.collection-weak":44,"./$.has":60,"./$.is-object":68,"./$.redefine":91}],201:[function(require,module,exports){
'use strict';
var weak = require('./$.collection-weak');
// 23.4 WeakSet Objects
require('./$.collection')('WeakSet', function(get){
return function WeakSet(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
// 23.4.3.1 WeakSet.prototype.add(value)
add: function add(value){
return weak.def(this, value, true);
}
}, weak, false, true);
},{"./$.collection":45,"./$.collection-weak":44}],202:[function(require,module,exports){
'use strict';
var $export = require('./$.export')
, $includes = require('./$.array-includes')(true);
$export($export.P, 'Array', {
// https://github.com/domenic/Array.prototype.includes
includes: function includes(el /*, fromIndex = 0 */){
return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
}
});
require('./$.add-to-unscopables')('includes');
},{"./$.add-to-unscopables":33,"./$.array-includes":37,"./$.export":52}],203:[function(require,module,exports){
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./$.export');
$export($export.P, 'Map', {toJSON: require('./$.collection-to-json')('Map')});
},{"./$.collection-to-json":43,"./$.export":52}],204:[function(require,module,exports){
// http://goo.gl/XkBrjD
var $export = require('./$.export')
, $entries = require('./$.object-to-array')(true);
$export($export.S, 'Object', {
entries: function entries(it){
return $entries(it);
}
});
},{"./$.export":52,"./$.object-to-array":85}],205:[function(require,module,exports){
// https://gist.github.com/WebReflection/9353781
var $ = require('./$')
, $export = require('./$.export')
, ownKeys = require('./$.own-keys')
, toIObject = require('./$.to-iobject')
, createDesc = require('./$.property-desc');
$export($export.S, 'Object', {
getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object){
var O = toIObject(object)
, setDesc = $.setDesc
, getDesc = $.getDesc
, keys = ownKeys(O)
, result = {}
, i = 0
, key, D;
while(keys.length > i){
D = getDesc(O, key = keys[i++]);
if(key in result)setDesc(result, key, createDesc(0, D));
else result[key] = D;
} return result;
}
});
},{"./$":76,"./$.export":52,"./$.own-keys":86,"./$.property-desc":89,"./$.to-iobject":108}],206:[function(require,module,exports){
// http://goo.gl/XkBrjD
var $export = require('./$.export')
, $values = require('./$.object-to-array')(false);
$export($export.S, 'Object', {
values: function values(it){
return $values(it);
}
});
},{"./$.export":52,"./$.object-to-array":85}],207:[function(require,module,exports){
// https://github.com/benjamingr/RexExp.escape
var $export = require('./$.export')
, $re = require('./$.replacer')(/[\\^$*+?.()|[\]{}]/g, '\\$&');
$export($export.S, 'RegExp', {escape: function escape(it){ return $re(it); }});
},{"./$.export":52,"./$.replacer":92}],208:[function(require,module,exports){
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./$.export');
$export($export.P, 'Set', {toJSON: require('./$.collection-to-json')('Set')});
},{"./$.collection-to-json":43,"./$.export":52}],209:[function(require,module,exports){
'use strict';
// https://github.com/mathiasbynens/String.prototype.at
var $export = require('./$.export')
, $at = require('./$.string-at')(true);
$export($export.P, 'String', {
at: function at(pos){
return $at(this, pos);
}
});
},{"./$.export":52,"./$.string-at":100}],210:[function(require,module,exports){
'use strict';
var $export = require('./$.export')
, $pad = require('./$.string-pad');
$export($export.P, 'String', {
padLeft: function padLeft(maxLength /*, fillString = ' ' */){
return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
}
});
},{"./$.export":52,"./$.string-pad":102}],211:[function(require,module,exports){
'use strict';
var $export = require('./$.export')
, $pad = require('./$.string-pad');
$export($export.P, 'String', {
padRight: function padRight(maxLength /*, fillString = ' ' */){
return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
}
});
},{"./$.export":52,"./$.string-pad":102}],212:[function(require,module,exports){
'use strict';
// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
require('./$.string-trim')('trimLeft', function($trim){
return function trimLeft(){
return $trim(this, 1);
};
});
},{"./$.string-trim":104}],213:[function(require,module,exports){
'use strict';
// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
require('./$.string-trim')('trimRight', function($trim){
return function trimRight(){
return $trim(this, 2);
};
});
},{"./$.string-trim":104}],214:[function(require,module,exports){
// JavaScript 1.6 / Strawman array statics shim
var $ = require('./$')
, $export = require('./$.export')
, $ctx = require('./$.ctx')
, $Array = require('./$.core').Array || Array
, statics = {};
var setStatics = function(keys, length){
$.each.call(keys.split(','), function(key){
if(length == undefined && key in $Array)statics[key] = $Array[key];
else if(key in [])statics[key] = $ctx(Function.call, [][key], length);
});
};
setStatics('pop,reverse,shift,keys,values,entries', 1);
setStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes', 3);
setStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' +
'reduce,reduceRight,copyWithin,fill');
$export($export.S, 'Array', statics);
},{"./$":76,"./$.core":46,"./$.ctx":47,"./$.export":52}],215:[function(require,module,exports){
require('./es6.array.iterator');
var global = require('./$.global')
, hide = require('./$.hide')
, Iterators = require('./$.iterators')
, ITERATOR = require('./$.wks')('iterator')
, NL = global.NodeList
, HTC = global.HTMLCollection
, NLProto = NL && NL.prototype
, HTCProto = HTC && HTC.prototype
, ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;
if(NLProto && !NLProto[ITERATOR])hide(NLProto, ITERATOR, ArrayValues);
if(HTCProto && !HTCProto[ITERATOR])hide(HTCProto, ITERATOR, ArrayValues);
},{"./$.global":59,"./$.hide":61,"./$.iterators":75,"./$.wks":113,"./es6.array.iterator":121}],216:[function(require,module,exports){
var $export = require('./$.export')
, $task = require('./$.task');
$export($export.G + $export.B, {
setImmediate: $task.set,
clearImmediate: $task.clear
});
},{"./$.export":52,"./$.task":105}],217:[function(require,module,exports){
// ie9- setTimeout & setInterval additional parameters fix
var global = require('./$.global')
, $export = require('./$.export')
, invoke = require('./$.invoke')
, partial = require('./$.partial')
, navigator = global.navigator
, MSIE = !!navigator && /MSIE .\./.test(navigator.userAgent); // <- dirty ie9- check
var wrap = function(set){
return MSIE ? function(fn, time /*, ...args */){
return set(invoke(
partial,
[].slice.call(arguments, 2),
typeof fn == 'function' ? fn : Function(fn)
), time);
} : set;
};
$export($export.G + $export.B + $export.F * MSIE, {
setTimeout: wrap(global.setTimeout),
setInterval: wrap(global.setInterval)
});
},{"./$.export":52,"./$.global":59,"./$.invoke":63,"./$.partial":87}],218:[function(require,module,exports){
require('./modules/es5');
require('./modules/es6.symbol');
require('./modules/es6.object.assign');
require('./modules/es6.object.is');
require('./modules/es6.object.set-prototype-of');
require('./modules/es6.object.to-string');
require('./modules/es6.object.freeze');
require('./modules/es6.object.seal');
require('./modules/es6.object.prevent-extensions');
require('./modules/es6.object.is-frozen');
require('./modules/es6.object.is-sealed');
require('./modules/es6.object.is-extensible');
require('./modules/es6.object.get-own-property-descriptor');
require('./modules/es6.object.get-prototype-of');
require('./modules/es6.object.keys');
require('./modules/es6.object.get-own-property-names');
require('./modules/es6.function.name');
require('./modules/es6.function.has-instance');
require('./modules/es6.number.constructor');
require('./modules/es6.number.epsilon');
require('./modules/es6.number.is-finite');
require('./modules/es6.number.is-integer');
require('./modules/es6.number.is-nan');
require('./modules/es6.number.is-safe-integer');
require('./modules/es6.number.max-safe-integer');
require('./modules/es6.number.min-safe-integer');
require('./modules/es6.number.parse-float');
require('./modules/es6.number.parse-int');
require('./modules/es6.math.acosh');
require('./modules/es6.math.asinh');
require('./modules/es6.math.atanh');
require('./modules/es6.math.cbrt');
require('./modules/es6.math.clz32');
require('./modules/es6.math.cosh');
require('./modules/es6.math.expm1');
require('./modules/es6.math.fround');
require('./modules/es6.math.hypot');
require('./modules/es6.math.imul');
require('./modules/es6.math.log10');
require('./modules/es6.math.log1p');
require('./modules/es6.math.log2');
require('./modules/es6.math.sign');
require('./modules/es6.math.sinh');
require('./modules/es6.math.tanh');
require('./modules/es6.math.trunc');
require('./modules/es6.string.from-code-point');
require('./modules/es6.string.raw');
require('./modules/es6.string.trim');
require('./modules/es6.string.iterator');
require('./modules/es6.string.code-point-at');
require('./modules/es6.string.ends-with');
require('./modules/es6.string.includes');
require('./modules/es6.string.repeat');
require('./modules/es6.string.starts-with');
require('./modules/es6.array.from');
require('./modules/es6.array.of');
require('./modules/es6.array.iterator');
require('./modules/es6.array.species');
require('./modules/es6.array.copy-within');
require('./modules/es6.array.fill');
require('./modules/es6.array.find');
require('./modules/es6.array.find-index');
require('./modules/es6.regexp.constructor');
require('./modules/es6.regexp.flags');
require('./modules/es6.regexp.match');
require('./modules/es6.regexp.replace');
require('./modules/es6.regexp.search');
require('./modules/es6.regexp.split');
require('./modules/es6.promise');
require('./modules/es6.map');
require('./modules/es6.set');
require('./modules/es6.weak-map');
require('./modules/es6.weak-set');
require('./modules/es6.reflect.apply');
require('./modules/es6.reflect.construct');
require('./modules/es6.reflect.define-property');
require('./modules/es6.reflect.delete-property');
require('./modules/es6.reflect.enumerate');
require('./modules/es6.reflect.get');
require('./modules/es6.reflect.get-own-property-descriptor');
require('./modules/es6.reflect.get-prototype-of');
require('./modules/es6.reflect.has');
require('./modules/es6.reflect.is-extensible');
require('./modules/es6.reflect.own-keys');
require('./modules/es6.reflect.prevent-extensions');
require('./modules/es6.reflect.set');
require('./modules/es6.reflect.set-prototype-of');
require('./modules/es7.array.includes');
require('./modules/es7.string.at');
require('./modules/es7.string.pad-left');
require('./modules/es7.string.pad-right');
require('./modules/es7.string.trim-left');
require('./modules/es7.string.trim-right');
require('./modules/es7.regexp.escape');
require('./modules/es7.object.get-own-property-descriptors');
require('./modules/es7.object.values');
require('./modules/es7.object.entries');
require('./modules/es7.map.to-json');
require('./modules/es7.set.to-json');
require('./modules/js.array.statics');
require('./modules/web.timers');
require('./modules/web.immediate');
require('./modules/web.dom.iterable');
module.exports = require('./modules/$.core');
},{"./modules/$.core":46,"./modules/es5":115,"./modules/es6.array.copy-within":116,"./modules/es6.array.fill":117,"./modules/es6.array.find":119,"./modules/es6.array.find-index":118,"./modules/es6.array.from":120,"./modules/es6.array.iterator":121,"./modules/es6.array.of":122,"./modules/es6.array.species":123,"./modules/es6.function.has-instance":124,"./modules/es6.function.name":125,"./modules/es6.map":126,"./modules/es6.math.acosh":127,"./modules/es6.math.asinh":128,"./modules/es6.math.atanh":129,"./modules/es6.math.cbrt":130,"./modules/es6.math.clz32":131,"./modules/es6.math.cosh":132,"./modules/es6.math.expm1":133,"./modules/es6.math.fround":134,"./modules/es6.math.hypot":135,"./modules/es6.math.imul":136,"./modules/es6.math.log10":137,"./modules/es6.math.log1p":138,"./modules/es6.math.log2":139,"./modules/es6.math.sign":140,"./modules/es6.math.sinh":141,"./modules/es6.math.tanh":142,"./modules/es6.math.trunc":143,"./modules/es6.number.constructor":144,"./modules/es6.number.epsilon":145,"./modules/es6.number.is-finite":146,"./modules/es6.number.is-integer":147,"./modules/es6.number.is-nan":148,"./modules/es6.number.is-safe-integer":149,"./modules/es6.number.max-safe-integer":150,"./modules/es6.number.min-safe-integer":151,"./modules/es6.number.parse-float":152,"./modules/es6.number.parse-int":153,"./modules/es6.object.assign":154,"./modules/es6.object.freeze":155,"./modules/es6.object.get-own-property-descriptor":156,"./modules/es6.object.get-own-property-names":157,"./modules/es6.object.get-prototype-of":158,"./modules/es6.object.is":162,"./modules/es6.object.is-extensible":159,"./modules/es6.object.is-frozen":160,"./modules/es6.object.is-sealed":161,"./modules/es6.object.keys":163,"./modules/es6.object.prevent-extensions":164,"./modules/es6.object.seal":165,"./modules/es6.object.set-prototype-of":166,"./modules/es6.object.to-string":167,"./modules/es6.promise":168,"./modules/es6.reflect.apply":169,"./modules/es6.reflect.construct":170,"./modules/es6.reflect.define-property":171,"./modules/es6.reflect.delete-property":172,"./modules/es6.reflect.enumerate":173,"./modules/es6.reflect.get":176,"./modules/es6.reflect.get-own-property-descriptor":174,"./modules/es6.reflect.get-prototype-of":175,"./modules/es6.reflect.has":177,"./modules/es6.reflect.is-extensible":178,"./modules/es6.reflect.own-keys":179,"./modules/es6.reflect.prevent-extensions":180,"./modules/es6.reflect.set":182,"./modules/es6.reflect.set-prototype-of":181,"./modules/es6.regexp.constructor":183,"./modules/es6.regexp.flags":184,"./modules/es6.regexp.match":185,"./modules/es6.regexp.replace":186,"./modules/es6.regexp.search":187,"./modules/es6.regexp.split":188,"./modules/es6.set":189,"./modules/es6.string.code-point-at":190,"./modules/es6.string.ends-with":191,"./modules/es6.string.from-code-point":192,"./modules/es6.string.includes":193,"./modules/es6.string.iterator":194,"./modules/es6.string.raw":195,"./modules/es6.string.repeat":196,"./modules/es6.string.starts-with":197,"./modules/es6.string.trim":198,"./modules/es6.symbol":199,"./modules/es6.weak-map":200,"./modules/es6.weak-set":201,"./modules/es7.array.includes":202,"./modules/es7.map.to-json":203,"./modules/es7.object.entries":204,"./modules/es7.object.get-own-property-descriptors":205,"./modules/es7.object.values":206,"./modules/es7.regexp.escape":207,"./modules/es7.set.to-json":208,"./modules/es7.string.at":209,"./modules/es7.string.pad-left":210,"./modules/es7.string.pad-right":211,"./modules/es7.string.trim-left":212,"./modules/es7.string.trim-right":213,"./modules/js.array.statics":214,"./modules/web.dom.iterable":215,"./modules/web.immediate":216,"./modules/web.timers":217}],219:[function(require,module,exports){
/*
Copyright (C) 2012-2014 Yusuke Suzuki
Copyright (C) 2014 Dan Tao
Copyright (C) 2013 Andrew Eisenberg
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
var typed,
utility,
isArray,
jsdoc,
esutils,
hasOwnProperty;
esutils = require('esutils');
isArray = require('isarray');
typed = require('./typed');
utility = require('./utility');
function sliceSource(source, index, last) {
return source.slice(index, last);
}
hasOwnProperty = (function () {
var func = Object.prototype.hasOwnProperty;
return function hasOwnProperty(obj, name) {
return func.call(obj, name);
};
}());
function shallowCopy(obj) {
var ret = {}, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
ret[key] = obj[key];
}
}
return ret;
}
function isASCIIAlphanumeric(ch) {
return (ch >= 0x61 /* 'a' */ && ch <= 0x7A /* 'z' */) ||
(ch >= 0x41 /* 'A' */ && ch <= 0x5A /* 'Z' */) ||
(ch >= 0x30 /* '0' */ && ch <= 0x39 /* '9' */);
}
function isParamTitle(title) {
return title === 'param' || title === 'argument' || title === 'arg';
}
function isReturnTitle(title) {
return title === 'return' || title === 'returns';
}
function isProperty(title) {
return title === 'property' || title === 'prop';
}
function isNameParameterRequired(title) {
return isParamTitle(title) || isProperty(title) ||
title === 'alias' || title === 'this' || title === 'mixes' || title === 'requires';
}
function isAllowedName(title) {
return isNameParameterRequired(title) || title === 'const' || title === 'constant';
}
function isAllowedNested(title) {
return isProperty(title) || isParamTitle(title);
}
function isTypeParameterRequired(title) {
return isParamTitle(title) || isReturnTitle(title) ||
title === 'define' || title === 'enum' ||
title === 'implements' || title === 'this' ||
title === 'type' || title === 'typedef' || isProperty(title);
}
// Consider deprecation instead using 'isTypeParameterRequired' and 'Rules' declaration to pick when a type is optional/required
// This would require changes to 'parseType'
function isAllowedType(title) {
return isTypeParameterRequired(title) || title === 'throws' || title === 'const' || title === 'constant' ||
title === 'namespace' || title === 'member' || title === 'var' || title === 'module' ||
title === 'constructor' || title === 'class' || title === 'extends' || title === 'augments' ||
title === 'public' || title === 'private' || title === 'protected';
}
function trim(str) {
return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
function unwrapComment(doc) {
// JSDoc comment is following form
// /**
// * .......
// */
// remove /**, */ and *
var BEFORE_STAR = 0,
STAR = 1,
AFTER_STAR = 2,
index,
len,
mode,
result,
ch;
doc = doc.replace(/^\/\*\*?/, '').replace(/\*\/$/, '');
index = 0;
len = doc.length;
mode = BEFORE_STAR;
result = '';
while (index < len) {
ch = doc.charCodeAt(index);
switch (mode) {
case BEFORE_STAR:
if (esutils.code.isLineTerminator(ch)) {
result += String.fromCharCode(ch);
} else if (ch === 0x2A /* '*' */) {
mode = STAR;
} else if (!esutils.code.isWhiteSpace(ch)) {
result += String.fromCharCode(ch);
mode = AFTER_STAR;
}
break;
case STAR:
if (!esutils.code.isWhiteSpace(ch)) {
result += String.fromCharCode(ch);
}
mode = esutils.code.isLineTerminator(ch) ? BEFORE_STAR : AFTER_STAR;
break;
case AFTER_STAR:
result += String.fromCharCode(ch);
if (esutils.code.isLineTerminator(ch)) {
mode = BEFORE_STAR;
}
break;
}
index += 1;
}
return result.replace(/\s+$/, '');
}
// JSDoc Tag Parser
(function (exports) {
var Rules,
index,
lineNumber,
length,
source,
recoverable,
sloppy,
strict;
function advance() {
var ch = source.charCodeAt(index);
index += 1;
if (esutils.code.isLineTerminator(ch) && !(ch === 0x0D /* '\r' */ && source.charCodeAt(index) === 0x0A /* '\n' */)) {
lineNumber += 1;
}
return String.fromCharCode(ch);
}
function scanTitle() {
var title = '';
// waste '@'
advance();
while (index < length && isASCIIAlphanumeric(source.charCodeAt(index))) {
title += advance();
}
return title;
}
function seekContent() {
var ch, waiting, last = index;
waiting = false;
while (last < length) {
ch = source.charCodeAt(last);
if (esutils.code.isLineTerminator(ch) && !(ch === 0x0D /* '\r' */ && source.charCodeAt(last + 1) === 0x0A /* '\n' */)) {
waiting = true;
} else if (waiting) {
if (ch === 0x40 /* '@' */) {
break;
}
if (!esutils.code.isWhiteSpace(ch)) {
waiting = false;
}
}
last += 1;
}
return last;
}
// type expression may have nest brace, such as,
// { { ok: string } }
//
// therefore, scanning type expression with balancing braces.
function parseType(title, last) {
var ch, brace, type, direct = false;
// search '{'
while (index < last) {
ch = source.charCodeAt(index);
if (esutils.code.isWhiteSpace(ch)) {
advance();
} else if (ch === 0x7B /* '{' */) {
advance();
break;
} else {
// this is direct pattern
direct = true;
break;
}
}
if (direct) {
return null;
}
// type expression { is found
brace = 1;
type = '';
while (index < last) {
ch = source.charCodeAt(index);
if (esutils.code.isLineTerminator(ch)) {
advance();
} else {
if (ch === 0x7D /* '}' */) {
brace -= 1;
if (brace === 0) {
advance();
break;
}
} else if (ch === 0x7B /* '{' */) {
brace += 1;
}
type += advance();
}
}
if (brace !== 0) {
// braces is not balanced
return utility.throwError('Braces are not balanced');
}
if (isParamTitle(title)) {
return typed.parseParamType(type);
}
return typed.parseType(type);
}
function scanIdentifier(last) {
var identifier;
if (!esutils.code.isIdentifierStart(source.charCodeAt(index))) {
return null;
}
identifier = advance();
while (index < last && esutils.code.isIdentifierPart(source.charCodeAt(index))) {
identifier += advance();
}
return identifier;
}
function skipWhiteSpace(last) {
while (index < last && (esutils.code.isWhiteSpace(source.charCodeAt(index)) || esutils.code.isLineTerminator(source.charCodeAt(index)))) {
advance();
}
}
function parseName(last, allowBrackets, allowNestedParams) {
var name = '', useBrackets;
skipWhiteSpace(last);
if (index >= last) {
return null;
}
if (allowBrackets && source.charCodeAt(index) === 0x5B /* '[' */) {
useBrackets = true;
name = advance();
}
if (!esutils.code.isIdentifierStart(source.charCodeAt(index))) {
return null;
}
name += scanIdentifier(last);
if (allowNestedParams) {
if (source.charCodeAt(index) === 0x3A /* ':' */ && (
name === 'module' ||
name === 'external' ||
name === 'event')) {
name += advance();
name += scanIdentifier(last);
}
if(source.charCodeAt(index) === 0x5B /* '[' */ && source.charCodeAt(index + 1) === 0x5D /* ']' */){
name += advance();
name += advance();
}
while (source.charCodeAt(index) === 0x2E /* '.' */ ||
source.charCodeAt(index) === 0x23 /* '#' */ ||
source.charCodeAt(index) === 0x7E /* '~' */) {
name += advance();
name += scanIdentifier(last);
}
}
if (useBrackets) {
// do we have a default value for this?
if (source.charCodeAt(index) === 0x3D /* '=' */) {
// consume the '='' symbol
name += advance();
var bracketDepth = 1;
// scan in the default value
while (index < last) {
if (source.charCodeAt(index) === 0x5B /* '[' */) {
bracketDepth++;
} else if (source.charCodeAt(index) === 0x5D /* ']' */ &&
--bracketDepth === 0) {
break;
}
name += advance();
}
}
if (index >= last || source.charCodeAt(index) !== 0x5D /* ']' */) {
// we never found a closing ']'
return null;
}
// collect the last ']'
name += advance();
}
return name;
}
function skipToTag() {
while (index < length && source.charCodeAt(index) !== 0x40 /* '@' */) {
advance();
}
if (index >= length) {
return false;
}
utility.assert(source.charCodeAt(index) === 0x40 /* '@' */);
return true;
}
function TagParser(options, title) {
this._options = options;
this._title = title;
this._tag = {
title: title,
description: null
};
if (this._options.lineNumbers) {
this._tag.lineNumber = lineNumber;
}
this._last = 0;
// space to save special information for title parsers.
this._extra = { };
}
// addError(err, ...)
TagParser.prototype.addError = function addError(errorText) {
var args = Array.prototype.slice.call(arguments, 1),
msg = errorText.replace(
/%(\d)/g,
function (whole, index) {
utility.assert(index < args.length, 'Message reference must be in range');
return args[index];
}
);
if (!this._tag.errors) {
this._tag.errors = [];
}
if (strict) {
utility.throwError(msg);
}
this._tag.errors.push(msg);
return recoverable;
};
TagParser.prototype.parseType = function () {
// type required titles
if (isTypeParameterRequired(this._title)) {
try {
this._tag.type = parseType(this._title, this._last);
if (!this._tag.type) {
if (!isParamTitle(this._title) && !isReturnTitle(this._title)) {
if (!this.addError('Missing or invalid tag type')) {
return false;
}
}
}
} catch (error) {
this._tag.type = null;
if (!this.addError(error.message)) {
return false;
}
}
} else if (isAllowedType(this._title)) {
// optional types
try {
this._tag.type = parseType(this._title, this._last);
} catch (e) {
//For optional types, lets drop the thrown error when we hit the end of the file
}
}
return true;
};
TagParser.prototype._parseNamePath = function (optional) {
var name;
name = parseName(this._last, sloppy && isParamTitle(this._title), true);
if (!name) {
if (!optional) {
if (!this.addError('Missing or invalid tag name')) {
return false;
}
}
}
this._tag.name = name;
return true;
};
TagParser.prototype.parseNamePath = function () {
return this._parseNamePath(false);
};
TagParser.prototype.parseNamePathOptional = function () {
return this._parseNamePath(true);
};
TagParser.prototype.parseName = function () {
var assign, name;
// param, property requires name
if (isAllowedName(this._title)) {
this._tag.name = parseName(this._last, sloppy && isParamTitle(this._title), isAllowedNested(this._title));
if (!this._tag.name) {
if (!isNameParameterRequired(this._title)) {
return true;
}
// it's possible the name has already been parsed but interpreted as a type
// it's also possible this is a sloppy declaration, in which case it will be
// fixed at the end
if (isParamTitle(this._title) && this._tag.type && this._tag.type.name) {
this._extra.name = this._tag.type;
this._tag.name = this._tag.type.name;
this._tag.type = null;
} else {
if (!this.addError('Missing or invalid tag name')) {
return false;
}
}
} else {
name = this._tag.name;
if (name.charAt(0) === '[' && name.charAt(name.length - 1) === ']') {
// extract the default value if there is one
// example: @param {string} [somebody=John Doe] description
assign = name.substring(1, name.length - 1).split('=');
if (assign[1]) {
this._tag['default'] = assign[1];
}
this._tag.name = assign[0];
// convert to an optional type
if (this._tag.type && this._tag.type.type !== 'OptionalType') {
this._tag.type = {
type: 'OptionalType',
expression: this._tag.type
};
}
}
}
}
return true;
};
TagParser.prototype.parseDescription = function parseDescription() {
var description = trim(sliceSource(source, index, this._last));
if (description) {
if ((/^-\s+/).test(description)) {
description = description.substring(2);
}
this._tag.description = description;
}
return true;
};
TagParser.prototype.parseKind = function parseKind() {
var kind, kinds;
kinds = {
'class': true,
'constant': true,
'event': true,
'external': true,
'file': true,
'function': true,
'member': true,
'mixin': true,
'module': true,
'namespace': true,
'typedef': true
};
kind = trim(sliceSource(source, index, this._last));
this._tag.kind = kind;
if (!hasOwnProperty(kinds, kind)) {
if (!this.addError('Invalid kind name \'%0\'', kind)) {
return false;
}
}
return true;
};
TagParser.prototype.parseAccess = function parseAccess() {
var access;
access = trim(sliceSource(source, index, this._last));
this._tag.access = access;
if (access !== 'private' && access !== 'protected' && access !== 'public') {
if (!this.addError('Invalid access name \'%0\'', access)) {
return false;
}
}
return true;
};
TagParser.prototype.parseVariation = function parseVariation() {
var variation, text;
text = trim(sliceSource(source, index, this._last));
variation = parseFloat(text, 10);
this._tag.variation = variation;
if (isNaN(variation)) {
if (!this.addError('Invalid variation \'%0\'', text)) {
return false;
}
}
return true;
};
TagParser.prototype.ensureEnd = function () {
var shouldBeEmpty = trim(sliceSource(source, index, this._last));
if (shouldBeEmpty) {
if (!this.addError('Unknown content \'%0\'', shouldBeEmpty)) {
return false;
}
}
return true;
};
TagParser.prototype.epilogue = function epilogue() {
var description;
description = this._tag.description;
// un-fix potentially sloppy declaration
if (isParamTitle(this._title) && !this._tag.type && description && description.charAt(0) === '[') {
this._tag.type = this._extra.name;
if (!this._tag.name) {
this._tag.name = undefined;
}
if (!sloppy) {
if (!this.addError('Missing or invalid tag name')) {
return false;
}
}
}
return true;
};
Rules = {
// http://usejsdoc.org/tags-access.html
'access': ['parseAccess'],
// http://usejsdoc.org/tags-alias.html
'alias': ['parseNamePath', 'ensureEnd'],
// http://usejsdoc.org/tags-augments.html
'augments': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-constructor.html
'constructor': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// Synonym: http://usejsdoc.org/tags-constructor.html
'class': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// Synonym: http://usejsdoc.org/tags-extends.html
'extends': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-deprecated.html
'deprecated': ['parseDescription'],
// http://usejsdoc.org/tags-global.html
'global': ['ensureEnd'],
// http://usejsdoc.org/tags-inner.html
'inner': ['ensureEnd'],
// http://usejsdoc.org/tags-instance.html
'instance': ['ensureEnd'],
// http://usejsdoc.org/tags-kind.html
'kind': ['parseKind'],
// http://usejsdoc.org/tags-mixes.html
'mixes': ['parseNamePath', 'ensureEnd'],
// http://usejsdoc.org/tags-mixin.html
'mixin': ['parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-member.html
'member': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-method.html
'method': ['parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-module.html
'module': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// Synonym: http://usejsdoc.org/tags-method.html
'func': ['parseNamePathOptional', 'ensureEnd'],
// Synonym: http://usejsdoc.org/tags-method.html
'function': ['parseNamePathOptional', 'ensureEnd'],
// Synonym: http://usejsdoc.org/tags-member.html
'var': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-name.html
'name': ['parseNamePath', 'ensureEnd'],
// http://usejsdoc.org/tags-namespace.html
'namespace': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
// http://usejsdoc.org/tags-private.html
'private': ['parseType', 'parseDescription'],
// http://usejsdoc.org/tags-protected.html
'protected': ['parseType', 'parseDescription'],
// http://usejsdoc.org/tags-public.html
'public': ['parseType', 'parseDescription'],
// http://usejsdoc.org/tags-readonly.html
'readonly': ['ensureEnd'],
// http://usejsdoc.org/tags-requires.html
'requires': ['parseNamePath', 'ensureEnd'],
// http://usejsdoc.org/tags-since.html
'since': ['parseDescription'],
// http://usejsdoc.org/tags-static.html
'static': ['ensureEnd'],
// http://usejsdoc.org/tags-summary.html
'summary': ['parseDescription'],
// http://usejsdoc.org/tags-this.html
'this': ['parseNamePath', 'ensureEnd'],
// http://usejsdoc.org/tags-todo.html
'todo': ['parseDescription'],
// http://usejsdoc.org/tags-typedef.html
'typedef': ['parseType', 'parseNamePathOptional'],
// http://usejsdoc.org/tags-variation.html
'variation': ['parseVariation'],
// http://usejsdoc.org/tags-version.html
'version': ['parseDescription']
};
TagParser.prototype.parse = function parse() {
var i, iz, sequences, method;
// empty title
if (!this._title) {
if (!this.addError('Missing or invalid title')) {
return null;
}
}
// Seek to content last index.
this._last = seekContent(this._title);
if (hasOwnProperty(Rules, this._title)) {
sequences = Rules[this._title];
} else {
// default sequences
sequences = ['parseType', 'parseName', 'parseDescription', 'epilogue'];
}
for (i = 0, iz = sequences.length; i < iz; ++i) {
method = sequences[i];
if (!this[method]()) {
return null;
}
}
return this._tag;
};
function parseTag(options) {
var title, parser, tag;
// skip to tag
if (!skipToTag()) {
return null;
}
// scan title
title = scanTitle();
// construct tag parser
parser = new TagParser(options, title);
tag = parser.parse();
// Seek global index to end of this tag.
while (index < parser._last) {
advance();
}
return tag;
}
//
// Parse JSDoc
//
function scanJSDocDescription(preserveWhitespace) {
var description = '', ch, atAllowed;
atAllowed = true;
while (index < length) {
ch = source.charCodeAt(index);
if (atAllowed && ch === 0x40 /* '@' */) {
break;
}
if (esutils.code.isLineTerminator(ch)) {
atAllowed = true;
} else if (atAllowed && !esutils.code.isWhiteSpace(ch)) {
atAllowed = false;
}
description += advance();
}
return preserveWhitespace ? description : trim(description);
}
function parse(comment, options) {
var tags = [], tag, description, interestingTags, i, iz;
if (options === undefined) {
options = {};
}
if (typeof options.unwrap === 'boolean' && options.unwrap) {
source = unwrapComment(comment);
} else {
source = comment;
}
// array of relevant tags
if (options.tags) {
if (isArray(options.tags)) {
interestingTags = { };
for (i = 0, iz = options.tags.length; i < iz; i++) {
if (typeof options.tags[i] === 'string') {
interestingTags[options.tags[i]] = true;
} else {
utility.throwError('Invalid "tags" parameter: ' + options.tags);
}
}
} else {
utility.throwError('Invalid "tags" parameter: ' + options.tags);
}
}
length = source.length;
index = 0;
lineNumber = 0;
recoverable = options.recoverable;
sloppy = options.sloppy;
strict = options.strict;
description = scanJSDocDescription(options.preserveWhitespace);
while (true) {
tag = parseTag(options);
if (!tag) {
break;
}
if (!interestingTags || interestingTags.hasOwnProperty(tag.title)) {
tags.push(tag);
}
}
return {
description: description,
tags: tags
};
}
exports.parse = parse;
}(jsdoc = {}));
exports.version = utility.VERSION;
exports.parse = jsdoc.parse;
exports.parseType = typed.parseType;
exports.parseParamType = typed.parseParamType;
exports.unwrapComment = unwrapComment;
exports.Syntax = shallowCopy(typed.Syntax);
exports.Error = utility.DoctrineError;
exports.type = {
Syntax: exports.Syntax,
parseType: typed.parseType,
parseParamType: typed.parseParamType,
stringify: typed.stringify
};
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{"./typed":220,"./utility":221,"esutils":225,"isarray":258}],220:[function(require,module,exports){
/*
Copyright (C) 2012-2014 Yusuke Suzuki
Copyright (C) 2014 Dan Tao
Copyright (C) 2013 Andrew Eisenberg
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// "typed", the Type Expression Parser for doctrine.
(function () {
'use strict';
var Syntax,
Token,
source,
length,
index,
previous,
token,
value,
esutils,
utility;
esutils = require('esutils');
utility = require('./utility');
Syntax = {
NullableLiteral: 'NullableLiteral',
AllLiteral: 'AllLiteral',
NullLiteral: 'NullLiteral',
UndefinedLiteral: 'UndefinedLiteral',
VoidLiteral: 'VoidLiteral',
UnionType: 'UnionType',
ArrayType: 'ArrayType',
RecordType: 'RecordType',
FieldType: 'FieldType',
FunctionType: 'FunctionType',
ParameterType: 'ParameterType',
RestType: 'RestType',
NonNullableType: 'NonNullableType',
OptionalType: 'OptionalType',
NullableType: 'NullableType',
NameExpression: 'NameExpression',
TypeApplication: 'TypeApplication'
};
Token = {
ILLEGAL: 0, // ILLEGAL
DOT_LT: 1, // .<
REST: 2, // ...
LT: 3, // <
GT: 4, // >
LPAREN: 5, // (
RPAREN: 6, // )
LBRACE: 7, // {
RBRACE: 8, // }
LBRACK: 9, // [
RBRACK: 10, // ]
COMMA: 11, // ,
COLON: 12, // :
STAR: 13, // *
PIPE: 14, // |
QUESTION: 15, // ?
BANG: 16, // !
EQUAL: 17, // =
NAME: 18, // name token
STRING: 19, // string
NUMBER: 20, // number
EOF: 21
};
function isTypeName(ch) {
return '><(){}[],:*|?!='.indexOf(String.fromCharCode(ch)) === -1 && !esutils.code.isWhiteSpace(ch) && !esutils.code.isLineTerminator(ch);
}
function Context(previous, index, token, value) {
this._previous = previous;
this._index = index;
this._token = token;
this._value = value;
}
Context.prototype.restore = function () {
previous = this._previous;
index = this._index;
token = this._token;
value = this._value;
};
Context.save = function () {
return new Context(previous, index, token, value);
};
function advance() {
var ch = source.charAt(index);
index += 1;
return ch;
}
function scanHexEscape(prefix) {
var i, len, ch, code = 0;
len = (prefix === 'u') ? 4 : 2;
for (i = 0; i < len; ++i) {
if (index < length && esutils.code.isHexDigit(source.charCodeAt(index))) {
ch = advance();
code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
} else {
return '';
}
}
return String.fromCharCode(code);
}
function scanString() {
var str = '', quote, ch, code, unescaped, restore; //TODO review removal octal = false
quote = source.charAt(index);
++index;
while (index < length) {
ch = advance();
if (ch === quote) {
quote = '';
break;
} else if (ch === '\\') {
ch = advance();
if (!esutils.code.isLineTerminator(ch.charCodeAt(0))) {
switch (ch) {
case 'n':
str += '\n';
break;
case 'r':
str += '\r';
break;
case 't':
str += '\t';
break;
case 'u':
case 'x':
restore = index;
unescaped = scanHexEscape(ch);
if (unescaped) {
str += unescaped;
} else {
index = restore;
str += ch;
}
break;
case 'b':
str += '\b';
break;
case 'f':
str += '\f';
break;
case 'v':
str += '\v';
break;
default:
if (esutils.code.isOctalDigit(ch.charCodeAt(0))) {
code = '01234567'.indexOf(ch);
// \0 is not octal escape sequence
// Deprecating unused code. TODO review removal
//if (code !== 0) {
// octal = true;
//}
if (index < length && esutils.code.isOctalDigit(source.charCodeAt(index))) {
//TODO Review Removal octal = true;
code = code * 8 + '01234567'.indexOf(advance());
// 3 digits are only allowed when string starts
// with 0, 1, 2, 3
if ('0123'.indexOf(ch) >= 0 &&
index < length &&
esutils.code.isOctalDigit(source.charCodeAt(index))) {
code = code * 8 + '01234567'.indexOf(advance());
}
}
str += String.fromCharCode(code);
} else {
str += ch;
}
break;
}
} else {
if (ch === '\r' && source.charCodeAt(index) === 0x0A /* '\n' */) {
++index;
}
}
} else if (esutils.code.isLineTerminator(ch.charCodeAt(0))) {
break;
} else {
str += ch;
}
}
if (quote !== '') {
utility.throwError('unexpected quote');
}
value = str;
return Token.STRING;
}
function scanNumber() {
var number, ch;
number = '';
ch = source.charCodeAt(index);
if (ch !== 0x2E /* '.' */) {
number = advance();
ch = source.charCodeAt(index);
if (number === '0') {
if (ch === 0x78 /* 'x' */ || ch === 0x58 /* 'X' */) {
number += advance();
while (index < length) {
ch = source.charCodeAt(index);
if (!esutils.code.isHexDigit(ch)) {
break;
}
number += advance();
}
if (number.length <= 2) {
// only 0x
utility.throwError('unexpected token');
}
if (index < length) {
ch = source.charCodeAt(index);
if (esutils.code.isIdentifierStart(ch)) {
utility.throwError('unexpected token');
}
}
value = parseInt(number, 16);
return Token.NUMBER;
}
if (esutils.code.isOctalDigit(ch)) {
number += advance();
while (index < length) {
ch = source.charCodeAt(index);
if (!esutils.code.isOctalDigit(ch)) {
break;
}
number += advance();
}
if (index < length) {
ch = source.charCodeAt(index);
if (esutils.code.isIdentifierStart(ch) || esutils.code.isDecimalDigit(ch)) {
utility.throwError('unexpected token');
}
}
value = parseInt(number, 8);
return Token.NUMBER;
}
if (esutils.code.isDecimalDigit(ch)) {
utility.throwError('unexpected token');
}
}
while (index < length) {
ch = source.charCodeAt(index);
if (!esutils.code.isDecimalDigit(ch)) {
break;
}
number += advance();
}
}
if (ch === 0x2E /* '.' */) {
number += advance();
while (index < length) {
ch = source.charCodeAt(index);
if (!esutils.code.isDecimalDigit(ch)) {
break;
}
number += advance();
}
}
if (ch === 0x65 /* 'e' */ || ch === 0x45 /* 'E' */) {
number += advance();
ch = source.charCodeAt(index);
if (ch === 0x2B /* '+' */ || ch === 0x2D /* '-' */) {
number += advance();
}
ch = source.charCodeAt(index);
if (esutils.code.isDecimalDigit(ch)) {
number += advance();
while (index < length) {
ch = source.charCodeAt(index);
if (!esutils.code.isDecimalDigit(ch)) {
break;
}
number += advance();
}
} else {
utility.throwError('unexpected token');
}
}
if (index < length) {
ch = source.charCodeAt(index);
if (esutils.code.isIdentifierStart(ch)) {
utility.throwError('unexpected token');
}
}
value = parseFloat(number);
return Token.NUMBER;
}
function scanTypeName() {
var ch, ch2;
value = advance();
while (index < length && isTypeName(source.charCodeAt(index))) {
ch = source.charCodeAt(index);
if (ch === 0x2E /* '.' */) {
if ((index + 1) >= length) {
return Token.ILLEGAL;
}
ch2 = source.charCodeAt(index + 1);
if (ch2 === 0x3C /* '<' */) {
break;
}
}
value += advance();
}
return Token.NAME;
}
function next() {
var ch;
previous = index;
while (index < length && esutils.code.isWhiteSpace(source.charCodeAt(index))) {
advance();
}
if (index >= length) {
token = Token.EOF;
return token;
}
ch = source.charCodeAt(index);
switch (ch) {
case 0x27: /* ''' */
case 0x22: /* '"' */
token = scanString();
return token;
case 0x3A: /* ':' */
advance();
token = Token.COLON;
return token;
case 0x2C: /* ',' */
advance();
token = Token.COMMA;
return token;
case 0x28: /* '(' */
advance();
token = Token.LPAREN;
return token;
case 0x29: /* ')' */
advance();
token = Token.RPAREN;
return token;
case 0x5B: /* '[' */
advance();
token = Token.LBRACK;
return token;
case 0x5D: /* ']' */
advance();
token = Token.RBRACK;
return token;
case 0x7B: /* '{' */
advance();
token = Token.LBRACE;
return token;
case 0x7D: /* '}' */
advance();
token = Token.RBRACE;
return token;
case 0x2E: /* '.' */
if (index + 1 < length) {
ch = source.charCodeAt(index + 1);
if (ch === 0x3C /* '<' */) {
advance(); // '.'
advance(); // '<'
token = Token.DOT_LT;
return token;
}
if (ch === 0x2E /* '.' */ && index + 2 < length && source.charCodeAt(index + 2) === 0x2E /* '.' */) {
advance(); // '.'
advance(); // '.'
advance(); // '.'
token = Token.REST;
return token;
}
if (esutils.code.isDecimalDigit(ch)) {
token = scanNumber();
return token;
}
}
token = Token.ILLEGAL;
return token;
case 0x3C: /* '<' */
advance();
token = Token.LT;
return token;
case 0x3E: /* '>' */
advance();
token = Token.GT;
return token;
case 0x2A: /* '*' */
advance();
token = Token.STAR;
return token;
case 0x7C: /* '|' */
advance();
token = Token.PIPE;
return token;
case 0x3F: /* '?' */
advance();
token = Token.QUESTION;
return token;
case 0x21: /* '!' */
advance();
token = Token.BANG;
return token;
case 0x3D: /* '=' */
advance();
token = Token.EQUAL;
return token;
default:
if (esutils.code.isDecimalDigit(ch)) {
token = scanNumber();
return token;
}
// type string permits following case,
//
// namespace.module.MyClass
//
// this reduced 1 token TK_NAME
utility.assert(isTypeName(ch));
token = scanTypeName();
return token;
}
}
function consume(target, text) {
utility.assert(token === target, text || 'consumed token not matched');
next();
}
function expect(target, message) {
if (token !== target) {
utility.throwError(message || 'unexpected token');
}
next();
}
// UnionType := '(' TypeUnionList ')'
//
// TypeUnionList :=
// <>
// | NonemptyTypeUnionList
//
// NonemptyTypeUnionList :=
// TypeExpression
// | TypeExpression '|' NonemptyTypeUnionList
function parseUnionType() {
var elements;
consume(Token.LPAREN, 'UnionType should start with (');
elements = [];
if (token !== Token.RPAREN) {
while (true) {
elements.push(parseTypeExpression());
if (token === Token.RPAREN) {
break;
}
expect(Token.PIPE);
}
}
consume(Token.RPAREN, 'UnionType should end with )');
return {
type: Syntax.UnionType,
elements: elements
};
}
// ArrayType := '[' ElementTypeList ']'
//
// ElementTypeList :=
// <>
// | TypeExpression
// | '...' TypeExpression
// | TypeExpression ',' ElementTypeList
function parseArrayType() {
var elements;
consume(Token.LBRACK, 'ArrayType should start with [');
elements = [];
while (token !== Token.RBRACK) {
if (token === Token.REST) {
consume(Token.REST);
elements.push({
type: Syntax.RestType,
expression: parseTypeExpression()
});
break;
} else {
elements.push(parseTypeExpression());
}
if (token !== Token.RBRACK) {
expect(Token.COMMA);
}
}
expect(Token.RBRACK);
return {
type: Syntax.ArrayType,
elements: elements
};
}
function parseFieldName() {
var v = value;
if (token === Token.NAME || token === Token.STRING) {
next();
return v;
}
if (token === Token.NUMBER) {
consume(Token.NUMBER);
return String(v);
}
utility.throwError('unexpected token');
}
// FieldType :=
// FieldName
// | FieldName ':' TypeExpression
//
// FieldName :=
// NameExpression
// | StringLiteral
// | NumberLiteral
// | ReservedIdentifier
function parseFieldType() {
var key;
key = parseFieldName();
if (token === Token.COLON) {
consume(Token.COLON);
return {
type: Syntax.FieldType,
key: key,
value: parseTypeExpression()
};
}
return {
type: Syntax.FieldType,
key: key,
value: null
};
}
// RecordType := '{' FieldTypeList '}'
//
// FieldTypeList :=
// <>
// | FieldType
// | FieldType ',' FieldTypeList
function parseRecordType() {
var fields;
consume(Token.LBRACE, 'RecordType should start with {');
fields = [];
if (token === Token.COMMA) {
consume(Token.COMMA);
} else {
while (token !== Token.RBRACE) {
fields.push(parseFieldType());
if (token !== Token.RBRACE) {
expect(Token.COMMA);
}
}
}
expect(Token.RBRACE);
return {
type: Syntax.RecordType,
fields: fields
};
}
// NameExpression :=
// Identifier
// | TagIdentifier ':' Identifier
//
// Tag identifier is one of "module", "external" or "event"
// Identifier is the same as Token.NAME, including any dots, something like
// namespace.module.MyClass
function parseNameExpression() {
var name = value;
expect(Token.NAME);
if (token === Token.COLON && (
name === 'module' ||
name === 'external' ||
name === 'event')) {
consume(Token.COLON);
name += ':' + value;
expect(Token.NAME);
}
return {
type: Syntax.NameExpression,
name: name
};
}
// TypeExpressionList :=
// TopLevelTypeExpression
// | TopLevelTypeExpression ',' TypeExpressionList
function parseTypeExpressionList() {
var elements = [];
elements.push(parseTop());
while (token === Token.COMMA) {
consume(Token.COMMA);
elements.push(parseTop());
}
return elements;
}
// TypeName :=
// NameExpression
// | NameExpression TypeApplication
//
// TypeApplication :=
// '.<' TypeExpressionList '>'
// | '<' TypeExpressionList '>' // this is extension of doctrine
function parseTypeName() {
var expr, applications;
expr = parseNameExpression();
if (token === Token.DOT_LT || token === Token.LT) {
next();
applications = parseTypeExpressionList();
expect(Token.GT);
return {
type: Syntax.TypeApplication,
expression: expr,
applications: applications
};
}
return expr;
}
// ResultType :=
// <>
// | ':' void
// | ':' TypeExpression
//
// BNF is above
// but, we remove <> pattern, so token is always TypeToken::COLON
function parseResultType() {
consume(Token.COLON, 'ResultType should start with :');
if (token === Token.NAME && value === 'void') {
consume(Token.NAME);
return {
type: Syntax.VoidLiteral
};
}
return parseTypeExpression();
}
// ParametersType :=
// RestParameterType
// | NonRestParametersType
// | NonRestParametersType ',' RestParameterType
//
// RestParameterType :=
// '...'
// '...' Identifier
//
// NonRestParametersType :=
// ParameterType ',' NonRestParametersType
// | ParameterType
// | OptionalParametersType
//
// OptionalParametersType :=
// OptionalParameterType
// | OptionalParameterType, OptionalParametersType
//
// OptionalParameterType := ParameterType=
//
// ParameterType := TypeExpression | Identifier ':' TypeExpression
//
// Identifier is "new" or "this"
function parseParametersType() {
var params = [], optionalSequence = false, expr, rest = false;
while (token !== Token.RPAREN) {
if (token === Token.REST) {
// RestParameterType
consume(Token.REST);
rest = true;
}
expr = parseTypeExpression();
if (expr.type === Syntax.NameExpression && token === Token.COLON) {
// Identifier ':' TypeExpression
consume(Token.COLON);
expr = {
type: Syntax.ParameterType,
name: expr.name,
expression: parseTypeExpression()
};
}
if (token === Token.EQUAL) {
consume(Token.EQUAL);
expr = {
type: Syntax.OptionalType,
expression: expr
};
optionalSequence = true;
} else {
if (optionalSequence) {
utility.throwError('unexpected token');
}
}
if (rest) {
expr = {
type: Syntax.RestType,
expression: expr
};
}
params.push(expr);
if (token !== Token.RPAREN) {
expect(Token.COMMA);
}
}
return params;
}
// FunctionType := 'function' FunctionSignatureType
//
// FunctionSignatureType :=
// | TypeParameters '(' ')' ResultType
// | TypeParameters '(' ParametersType ')' ResultType
// | TypeParameters '(' 'this' ':' TypeName ')' ResultType
// | TypeParameters '(' 'this' ':' TypeName ',' ParametersType ')' ResultType
function parseFunctionType() {
var isNew, thisBinding, params, result, fnType;
utility.assert(token === Token.NAME && value === 'function', 'FunctionType should start with \'function\'');
consume(Token.NAME);
// Google Closure Compiler is not implementing TypeParameters.
// So we do not. if we don't get '(', we see it as error.
expect(Token.LPAREN);
isNew = false;
params = [];
thisBinding = null;
if (token !== Token.RPAREN) {
// ParametersType or 'this'
if (token === Token.NAME &&
(value === 'this' || value === 'new')) {
// 'this' or 'new'
// 'new' is Closure Compiler extension
isNew = value === 'new';
consume(Token.NAME);
expect(Token.COLON);
thisBinding = parseTypeName();
if (token === Token.COMMA) {
consume(Token.COMMA);
params = parseParametersType();
}
} else {
params = parseParametersType();
}
}
expect(Token.RPAREN);
result = null;
if (token === Token.COLON) {
result = parseResultType();
}
fnType = {
type: Syntax.FunctionType,
params: params,
result: result
};
if (thisBinding) {
// avoid adding null 'new' and 'this' properties
fnType['this'] = thisBinding;
if (isNew) {
fnType['new'] = true;
}
}
return fnType;
}
// BasicTypeExpression :=
// '*'
// | 'null'
// | 'undefined'
// | TypeName
// | FunctionType
// | UnionType
// | RecordType
// | ArrayType
function parseBasicTypeExpression() {
var context;
switch (token) {
case Token.STAR:
consume(Token.STAR);
return {
type: Syntax.AllLiteral
};
case Token.LPAREN:
return parseUnionType();
case Token.LBRACK:
return parseArrayType();
case Token.LBRACE:
return parseRecordType();
case Token.NAME:
if (value === 'null') {
consume(Token.NAME);
return {
type: Syntax.NullLiteral
};
}
if (value === 'undefined') {
consume(Token.NAME);
return {
type: Syntax.UndefinedLiteral
};
}
context = Context.save();
if (value === 'function') {
try {
return parseFunctionType();
} catch (e) {
context.restore();
}
}
return parseTypeName();
default:
utility.throwError('unexpected token');
}
}
// TypeExpression :=
// BasicTypeExpression
// | '?' BasicTypeExpression
// | '!' BasicTypeExpression
// | BasicTypeExpression '?'
// | BasicTypeExpression '!'
// | '?'
// | BasicTypeExpression '[]'
function parseTypeExpression() {
var expr;
if (token === Token.QUESTION) {
consume(Token.QUESTION);
if (token === Token.COMMA || token === Token.EQUAL || token === Token.RBRACE ||
token === Token.RPAREN || token === Token.PIPE || token === Token.EOF ||
token === Token.RBRACK || token === Token.GT) {
return {
type: Syntax.NullableLiteral
};
}
return {
type: Syntax.NullableType,
expression: parseBasicTypeExpression(),
prefix: true
};
}
if (token === Token.BANG) {
consume(Token.BANG);
return {
type: Syntax.NonNullableType,
expression: parseBasicTypeExpression(),
prefix: true
};
}
expr = parseBasicTypeExpression();
if (token === Token.BANG) {
consume(Token.BANG);
return {
type: Syntax.NonNullableType,
expression: expr,
prefix: false
};
}
if (token === Token.QUESTION) {
consume(Token.QUESTION);
return {
type: Syntax.NullableType,
expression: expr,
prefix: false
};
}
if (token === Token.LBRACK) {
consume(Token.LBRACK);
expect(Token.RBRACK, 'expected an array-style type declaration (' + value + '[])');
return {
type: Syntax.TypeApplication,
expression: {
type: Syntax.NameExpression,
name: 'Array'
},
applications: [expr]
};
}
return expr;
}
// TopLevelTypeExpression :=
// TypeExpression
// | TypeUnionList
//
// This rule is Google Closure Compiler extension, not ES4
// like,
// { number | string }
// If strict to ES4, we should write it as
// { (number|string) }
function parseTop() {
var expr, elements;
expr = parseTypeExpression();
if (token !== Token.PIPE) {
return expr;
}
elements = [ expr ];
consume(Token.PIPE);
while (true) {
elements.push(parseTypeExpression());
if (token !== Token.PIPE) {
break;
}
consume(Token.PIPE);
}
return {
type: Syntax.UnionType,
elements: elements
};
}
function parseTopParamType() {
var expr;
if (token === Token.REST) {
consume(Token.REST);
return {
type: Syntax.RestType,
expression: parseTop()
};
}
expr = parseTop();
if (token === Token.EQUAL) {
consume(Token.EQUAL);
return {
type: Syntax.OptionalType,
expression: expr
};
}
return expr;
}
function parseType(src, opt) {
var expr;
source = src;
length = source.length;
index = 0;
previous = 0;
next();
expr = parseTop();
if (opt && opt.midstream) {
return {
expression: expr,
index: previous
};
}
if (token !== Token.EOF) {
utility.throwError('not reach to EOF');
}
return expr;
}
function parseParamType(src, opt) {
var expr;
source = src;
length = source.length;
index = 0;
previous = 0;
next();
expr = parseTopParamType();
if (opt && opt.midstream) {
return {
expression: expr,
index: previous
};
}
if (token !== Token.EOF) {
utility.throwError('not reach to EOF');
}
return expr;
}
function stringifyImpl(node, compact, topLevel) {
var result, i, iz;
switch (node.type) {
case Syntax.NullableLiteral:
result = '?';
break;
case Syntax.AllLiteral:
result = '*';
break;
case Syntax.NullLiteral:
result = 'null';
break;
case Syntax.UndefinedLiteral:
result = 'undefined';
break;
case Syntax.VoidLiteral:
result = 'void';
break;
case Syntax.UnionType:
if (!topLevel) {
result = '(';
} else {
result = '';
}
for (i = 0, iz = node.elements.length; i < iz; ++i) {
result += stringifyImpl(node.elements[i], compact);
if ((i + 1) !== iz) {
result += '|';
}
}
if (!topLevel) {
result += ')';
}
break;
case Syntax.ArrayType:
result = '[';
for (i = 0, iz = node.elements.length; i < iz; ++i) {
result += stringifyImpl(node.elements[i], compact);
if ((i + 1) !== iz) {
result += compact ? ',' : ', ';
}
}
result += ']';
break;
case Syntax.RecordType:
result = '{';
for (i = 0, iz = node.fields.length; i < iz; ++i) {
result += stringifyImpl(node.fields[i], compact);
if ((i + 1) !== iz) {
result += compact ? ',' : ', ';
}
}
result += '}';
break;
case Syntax.FieldType:
if (node.value) {
result = node.key + (compact ? ':' : ': ') + stringifyImpl(node.value, compact);
} else {
result = node.key;
}
break;
case Syntax.FunctionType:
result = compact ? 'function(' : 'function (';
if (node['this']) {
if (node['new']) {
result += (compact ? 'new:' : 'new: ');
} else {
result += (compact ? 'this:' : 'this: ');
}
result += stringifyImpl(node['this'], compact);
if (node.params.length !== 0) {
result += compact ? ',' : ', ';
}
}
for (i = 0, iz = node.params.length; i < iz; ++i) {
result += stringifyImpl(node.params[i], compact);
if ((i + 1) !== iz) {
result += compact ? ',' : ', ';
}
}
result += ')';
if (node.result) {
result += (compact ? ':' : ': ') + stringifyImpl(node.result, compact);
}
break;
case Syntax.ParameterType:
result = node.name + (compact ? ':' : ': ') + stringifyImpl(node.expression, compact);
break;
case Syntax.RestType:
result = '...';
if (node.expression) {
result += stringifyImpl(node.expression, compact);
}
break;
case Syntax.NonNullableType:
if (node.prefix) {
result = '!' + stringifyImpl(node.expression, compact);
} else {
result = stringifyImpl(node.expression, compact) + '!';
}
break;
case Syntax.OptionalType:
result = stringifyImpl(node.expression, compact) + '=';
break;
case Syntax.NullableType:
if (node.prefix) {
result = '?' + stringifyImpl(node.expression, compact);
} else {
result = stringifyImpl(node.expression, compact) + '?';
}
break;
case Syntax.NameExpression:
result = node.name;
break;
case Syntax.TypeApplication:
result = stringifyImpl(node.expression, compact) + '.<';
for (i = 0, iz = node.applications.length; i < iz; ++i) {
result += stringifyImpl(node.applications[i], compact);
if ((i + 1) !== iz) {
result += compact ? ',' : ', ';
}
}
result += '>';
break;
default:
utility.throwError('Unknown type ' + node.type);
}
return result;
}
function stringify(node, options) {
if (options == null) {
options = {};
}
return stringifyImpl(node, options.compact, options.topLevel);
}
exports.parseType = parseType;
exports.parseParamType = parseParamType;
exports.stringify = stringify;
exports.Syntax = Syntax;
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{"./utility":221,"esutils":225}],221:[function(require,module,exports){
/*
Copyright (C) 2014 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
var VERSION;
VERSION = require('../package.json').version;
exports.VERSION = VERSION;
function DoctrineError(message) {
this.name = 'DoctrineError';
this.message = message;
}
DoctrineError.prototype = (function () {
var Middle = function () { };
Middle.prototype = Error.prototype;
return new Middle();
}());
DoctrineError.prototype.constructor = DoctrineError;
exports.DoctrineError = DoctrineError;
function throwError(message) {
throw new DoctrineError(message);
}
exports.throwError = throwError;
exports.assert = require('assert');
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{"../package.json":226,"assert":24}],222:[function(require,module,exports){
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
function isExpression(node) {
if (node == null) { return false; }
switch (node.type) {
case 'ArrayExpression':
case 'AssignmentExpression':
case 'BinaryExpression':
case 'CallExpression':
case 'ConditionalExpression':
case 'FunctionExpression':
case 'Identifier':
case 'Literal':
case 'LogicalExpression':
case 'MemberExpression':
case 'NewExpression':
case 'ObjectExpression':
case 'SequenceExpression':
case 'ThisExpression':
case 'UnaryExpression':
case 'UpdateExpression':
return true;
}
return false;
}
function isIterationStatement(node) {
if (node == null) { return false; }
switch (node.type) {
case 'DoWhileStatement':
case 'ForInStatement':
case 'ForStatement':
case 'WhileStatement':
return true;
}
return false;
}
function isStatement(node) {
if (node == null) { return false; }
switch (node.type) {
case 'BlockStatement':
case 'BreakStatement':
case 'ContinueStatement':
case 'DebuggerStatement':
case 'DoWhileStatement':
case 'EmptyStatement':
case 'ExpressionStatement':
case 'ForInStatement':
case 'ForStatement':
case 'IfStatement':
case 'LabeledStatement':
case 'ReturnStatement':
case 'SwitchStatement':
case 'ThrowStatement':
case 'TryStatement':
case 'VariableDeclaration':
case 'WhileStatement':
case 'WithStatement':
return true;
}
return false;
}
function isSourceElement(node) {
return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
}
function trailingStatement(node) {
switch (node.type) {
case 'IfStatement':
if (node.alternate != null) {
return node.alternate;
}
return node.consequent;
case 'LabeledStatement':
case 'ForStatement':
case 'ForInStatement':
case 'WhileStatement':
case 'WithStatement':
return node.body;
}
return null;
}
function isProblematicIfStatement(node) {
var current;
if (node.type !== 'IfStatement') {
return false;
}
if (node.alternate == null) {
return false;
}
current = node.consequent;
do {
if (current.type === 'IfStatement') {
if (current.alternate == null) {
return true;
}
}
current = trailingStatement(current);
} while (current);
return false;
}
module.exports = {
isExpression: isExpression,
isStatement: isStatement,
isIterationStatement: isIterationStatement,
isSourceElement: isSourceElement,
isProblematicIfStatement: isProblematicIfStatement,
trailingStatement: trailingStatement
};
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{}],223:[function(require,module,exports){
/*
Copyright (C) 2013-2014 Yusuke Suzuki
Copyright (C) 2014 Ivan Nikulin
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
var Regex, NON_ASCII_WHITESPACES;
// See `tools/generate-identifier-regex.js`.
Regex = {
NonAsciiIdentifierStart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]'),
NonAsciiIdentifierPart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]')
};
function isDecimalDigit(ch) {
return (ch >= 48 && ch <= 57); // 0..9
}
function isHexDigit(ch) {
return isDecimalDigit(ch) || // 0..9
(97 <= ch && ch <= 102) || // a..f
(65 <= ch && ch <= 70); // A..F
}
function isOctalDigit(ch) {
return (ch >= 48 && ch <= 55); // 0..7
}
// 7.2 White Space
NON_ASCII_WHITESPACES = [
0x1680, 0x180E,
0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
0x202F, 0x205F,
0x3000,
0xFEFF
];
function isWhiteSpace(ch) {
return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||
(ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0);
}
// 7.3 Line Terminators
function isLineTerminator(ch) {
return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);
}
// 7.6 Identifier Names and Identifiers
function isIdentifierStart(ch) {
return (ch >= 97 && ch <= 122) || // a..z
(ch >= 65 && ch <= 90) || // A..Z
(ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore)
(ch === 92) || // \ (backslash)
((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));
}
function isIdentifierPart(ch) {
return (ch >= 97 && ch <= 122) || // a..z
(ch >= 65 && ch <= 90) || // A..Z
(ch >= 48 && ch <= 57) || // 0..9
(ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore)
(ch === 92) || // \ (backslash)
((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));
}
module.exports = {
isDecimalDigit: isDecimalDigit,
isHexDigit: isHexDigit,
isOctalDigit: isOctalDigit,
isWhiteSpace: isWhiteSpace,
isLineTerminator: isLineTerminator,
isIdentifierStart: isIdentifierStart,
isIdentifierPart: isIdentifierPart
};
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{}],224:[function(require,module,exports){
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
var code = require('./code');
function isStrictModeReservedWordES6(id) {
switch (id) {
case 'implements':
case 'interface':
case 'package':
case 'private':
case 'protected':
case 'public':
case 'static':
case 'let':
return true;
default:
return false;
}
}
function isKeywordES5(id, strict) {
// yield should not be treated as keyword under non-strict mode.
if (!strict && id === 'yield') {
return false;
}
return isKeywordES6(id, strict);
}
function isKeywordES6(id, strict) {
if (strict && isStrictModeReservedWordES6(id)) {
return true;
}
switch (id.length) {
case 2:
return (id === 'if') || (id === 'in') || (id === 'do');
case 3:
return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
case 4:
return (id === 'this') || (id === 'else') || (id === 'case') ||
(id === 'void') || (id === 'with') || (id === 'enum');
case 5:
return (id === 'while') || (id === 'break') || (id === 'catch') ||
(id === 'throw') || (id === 'const') || (id === 'yield') ||
(id === 'class') || (id === 'super');
case 6:
return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
(id === 'switch') || (id === 'export') || (id === 'import');
case 7:
return (id === 'default') || (id === 'finally') || (id === 'extends');
case 8:
return (id === 'function') || (id === 'continue') || (id === 'debugger');
case 10:
return (id === 'instanceof');
default:
return false;
}
}
function isReservedWordES5(id, strict) {
return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
}
function isReservedWordES6(id, strict) {
return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
}
function isRestrictedWord(id) {
return id === 'eval' || id === 'arguments';
}
function isIdentifierName(id) {
var i, iz, ch;
if (id.length === 0) {
return false;
}
ch = id.charCodeAt(0);
if (!code.isIdentifierStart(ch) || ch === 92) { // \ (backslash)
return false;
}
for (i = 1, iz = id.length; i < iz; ++i) {
ch = id.charCodeAt(i);
if (!code.isIdentifierPart(ch) || ch === 92) { // \ (backslash)
return false;
}
}
return true;
}
function isIdentifierES5(id, strict) {
return isIdentifierName(id) && !isReservedWordES5(id, strict);
}
function isIdentifierES6(id, strict) {
return isIdentifierName(id) && !isReservedWordES6(id, strict);
}
module.exports = {
isKeywordES5: isKeywordES5,
isKeywordES6: isKeywordES6,
isReservedWordES5: isReservedWordES5,
isReservedWordES6: isReservedWordES6,
isRestrictedWord: isRestrictedWord,
isIdentifierName: isIdentifierName,
isIdentifierES5: isIdentifierES5,
isIdentifierES6: isIdentifierES6
};
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{"./code":223}],225:[function(require,module,exports){
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
'use strict';
exports.ast = require('./ast');
exports.code = require('./code');
exports.keyword = require('./keyword');
}());
/* vim: set sw=4 ts=4 et tw=80 : */
},{"./ast":222,"./code":223,"./keyword":224}],226:[function(require,module,exports){
module.exports={
"_args": [
[
"doctrine@^0.7.0",
"/Users/ajo/workspace/hydrolysis"
]
],
"_from": "doctrine@>=0.7.0 <0.8.0",
"_id": "doctrine@0.7.2",
"_inCache": true,
"_installable": true,
"_location": "/doctrine",
"_npmUser": {
"email": "nicholas@nczconsulting.com",
"name": "nzakas"
},
"_npmVersion": "1.4.28",
"_phantomChildren": {},
"_requested": {
"name": "doctrine",
"raw": "doctrine@^0.7.0",
"rawSpec": "^0.7.0",
"scope": null,
"spec": ">=0.7.0 <0.8.0",
"type": "range"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
"_shasum": "7cb860359ba3be90e040b26b729ce4bfa654c523",
"_shrinkwrap": null,
"_spec": "doctrine@^0.7.0",
"_where": "/Users/ajo/workspace/hydrolysis",
"bugs": {
"url": "https://github.com/eslint/doctrine/issues"
},
"dependencies": {
"esutils": "^1.1.6",
"isarray": "0.0.1"
},
"description": "JSDoc parser",
"devDependencies": {
"coveralls": "^2.11.2",
"dateformat": "^1.0.11",
"eslint": "^1.9.0",
"gulp": "^3.8.10",
"gulp-bump": "^0.1.13",
"gulp-eslint": "^0.5.0",
"gulp-filter": "^2.0.2",
"gulp-git": "^1.0.0",
"gulp-istanbul": "^0.6.0",
"gulp-jshint": "^1.9.0",
"gulp-mocha": "^2.0.0",
"gulp-tag-version": "^1.2.1",
"jshint-stylish": "^1.0.0",
"linefix": "^0.1.1",
"mocha": "^2.3.3",
"npm-license": "^0.3.1",
"semver": "^5.0.3",
"shelljs": "^0.5.3",
"shelljs-nodecli": "^0.1.1",
"should": "^5.0.1"
},
"directories": {
"lib": "./lib"
},
"dist": {
"shasum": "7cb860359ba3be90e040b26b729ce4bfa654c523",
"tarball": "http://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz"
},
"engines": {
"node": ">=0.10.0"
},
"files": [
"LICENSE.BSD",
"LICENSE.closure-compiler",
"LICENSE.esprima",
"README.md",
"lib"
],
"gitHead": "d78e387ce941880ae97ca768092ee11029bdb916",
"homepage": "https://github.com/eslint/doctrine",
"licenses": [
{
"type": "BSD",
"url": "http://github.com/eslint/doctrine/raw/master/LICENSE.BSD"
}
],
"main": "lib/doctrine.js",
"maintainers": [
{
"name": "constellation",
"email": "utatane.tea@gmail.com"
},
{
"name": "nzakas",
"email": "nicholas@nczconsulting.com"
}
],
"name": "doctrine",
"optionalDependencies": {},
"readme": "ERROR: No README data found!",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/eslint/doctrine.git"
},
"scripts": {
"coveralls": "cat ./coverage/lcov.info | coveralls && rm -rf ./coverage",
"lint": "gulp lint",
"test": "gulp",
"unit-test": "gulp test"
},
"version": "0.7.2"
}
},{}],227:[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// jshint node: true
'use strict';
var cloneObject = require('clone');
function getAttributeIndex(element, name) {
if (!element.attrs) {
return -1;
}
var n = name.toLowerCase();
for (var i = 0; i < element.attrs.length; i++) {
if (element.attrs[i].name.toLowerCase() === n) {
return i;
}
}
return -1;
}
/**
* @returns {boolean} `true` iff [element] has the attribute [name], `false`
* otherwise.
*/
function hasAttribute(element, name) {
return getAttributeIndex(element, name) !== -1;
}
/**
* @returns {string|null} The string value of attribute `name`, or `null`.
*/
function getAttribute(element, name) {
var i = getAttributeIndex(element, name);
if (i > -1) {
return element.attrs[i].value;
}
return null;
}
function setAttribute(element, name, value) {
var i = getAttributeIndex(element, name);
if (i > -1) {
element.attrs[i].value = value;
} else {
element.attrs.push({name: name, value: value});
}
}
function removeAttribute(element, name) {
var i = getAttributeIndex(element, name);
if (i > -1) {
element.attrs.splice(i, 1);
}
}
function hasTagName(name) {
var n = name.toLowerCase();
return function(node) {
if (!node.tagName) {
return false;
}
return node.tagName.toLowerCase() === n;
};
}
/**
* Returns true if `regex.match(tagName)` finds a match.
*
* This will use the lowercased tagName for comparison.
*
* @param {RegExp} regex
* @return {Boolean}
*/
function hasMatchingTagName(regex) {
return function(node) {
if (!node.tagName) {
return false;
}
return regex.test(node.tagName.toLowerCase());
};
}
function hasClass(name) {
return function(node) {
var attr = getAttribute(node, 'class');
if (!attr) {
return false;
}
return attr.split(' ').indexOf(name) > -1;
};
}
function collapseTextRange(parent, start, end) {
var text = '';
for (var i = start; i <= end; i++) {
text += getTextContent(parent.childNodes[i]);
}
parent.childNodes.splice(start, (end - start) + 1);
if (text) {
var tn = newTextNode(text);
tn.parentNode = parent;
parent.childNodes.splice(start, 0, tn);
}
}
/**
* Normalize the text inside an element
*
* Equivalent to `element.normalize()` in the browser
* See https://developer.mozilla.org/en-US/docs/Web/API/Node/normalize
*/
function normalize(node) {
if (!(isElement(node) || isDocument(node) || isDocumentFragment(node))) {
return;
}
var textRangeStart = -1;
for (var i = node.childNodes.length - 1, n; i >= 0; i--) {
n = node.childNodes[i];
if (isTextNode(n)) {
if (textRangeStart == -1) {
textRangeStart = i;
}
if (i === 0) {
// collapse leading text nodes
collapseTextRange(node, 0, textRangeStart);
}
} else {
// recurse
normalize(n);
// collapse the range after this node
if (textRangeStart > -1) {
collapseTextRange(node, i + 1, textRangeStart);
textRangeStart = -1;
}
}
}
}
/**
* Return the text value of a node or element
*
* Equivalent to `node.textContent` in the browser
*/
function getTextContent(node) {
if (isCommentNode(node)) {
return node.data;
}
if (isTextNode(node)) {
return node.value;
}
var subtree = nodeWalkAll(node, isTextNode);
return subtree.map(getTextContent).join('');
}
/**
* Set the text value of a node or element
*
* Equivalent to `node.textContent = value` in the browser
*/
function setTextContent(node, value) {
if (isCommentNode(node)) {
node.data = value;
} else if (isTextNode(node)) {
node.value = value;
} else {
var tn = newTextNode(value);
tn.parentNode = node;
node.childNodes = [tn];
}
}
/**
* Match the text inside an element, textnode, or comment
*
* Note: nodeWalkAll with hasTextValue may return an textnode and its parent if
* the textnode is the only child in that parent.
*/
function hasTextValue(value) {
return function(node) {
return getTextContent(node) === value;
};
}
/**
* OR an array of predicates
*/
function OR(/* ...rules */) {
var rules = new Array(arguments.length);
for (var i = 0; i < arguments.length; i++) {
rules[i] = arguments[i];
}
return function(node) {
for (var i = 0; i < rules.length; i++) {
if (rules[i](node)) {
return true;
}
}
return false;
};
}
/**
* AND an array of predicates
*/
function AND(/* ...rules */) {
var rules = new Array(arguments.length);
for (var i = 0; i < arguments.length; i++) {
rules[i] = arguments[i];
}
return function(node) {
for (var i = 0; i < rules.length; i++) {
if (!rules[i](node)) {
return false;
}
}
return true;
};
}
/**
* negate an individual predicate, or a group with AND or OR
*/
function NOT(predicateFn) {
return function(node) {
return !predicateFn(node);
};
}
/**
* Returns a predicate that matches any node with a parent matching `predicateFn`.
*/
function parentMatches(predicateFn) {
return function(node) {
var parent = node.parentNode;
while(parent !== undefined) {
if (predicateFn(parent)) {
return true;
}
parent = parent.parentNode;
}
return false;
};
}
function hasAttr(attr) {
return function(node) {
return getAttributeIndex(node, attr) > -1;
};
}
function hasAttrValue(attr, value) {
return function(node) {
return getAttribute(node, attr) === value;
};
}
function isDocument(node) {
return node.nodeName === '#document';
}
function isDocumentFragment(node) {
return node.nodeName === '#document-fragment';
}
function isElement(node) {
return node.nodeName === node.tagName;
}
function isTextNode(node) {
return node.nodeName === '#text';
}
function isCommentNode(node) {
return node.nodeName === '#comment';
}
/**
* Applies `mapfn` to `node` and the tree below `node`, returning a flattened
* list of results.
* @return {Array}
*/
function treeMap(node, mapfn) {
var results = [];
nodeWalk(node, function(node){
results = results.concat(mapfn(node));
return false;
});
return results;
}
/**
* Walk the tree down from `node`, applying the `predicate` function.
* Return the first node that matches the given predicate.
*
* @returns {Node} `null` if no node matches, parse5 node object if a node
* matches
*/
function nodeWalk(node, predicate) {
if (predicate(node)) {
return node;
}
var match = null;
if (node.childNodes) {
for (var i = 0; i < node.childNodes.length; i++) {
match = nodeWalk(node.childNodes[i], predicate);
if (match) {
break;
}
}
}
return match;
}
/**
* Walk the tree down from `node`, applying the `predicate` function.
* All nodes matching the predicate function from `node` to leaves will be
* returned.
*
* @returns {Array[Node]}
*/
function nodeWalkAll(node, predicate, matches) {
if (!matches) {
matches = [];
}
if (predicate(node)) {
matches.push(node);
}
if (node.childNodes) {
for (var i = 0; i < node.childNodes.length; i++) {
nodeWalkAll(node.childNodes[i], predicate, matches);
}
}
return matches;
}
function _reverseNodeWalkAll(node, predicate, matches) {
if (!matches) {
matches = [];
}
if (node.childNodes) {
for (var i = node.childNodes.length - 1; i >= 0; i--) {
nodeWalkAll(node.childNodes[i], predicate, matches);
}
}
if (predicate(node)) {
matches.push(node);
}
return matches;
}
/**
* Equivalent to `nodeWalk`, but only returns nodes that are either
* ancestors or earlier cousins/siblings in the document.
*
* Nodes are searched in reverse document order, starting from the sibling
* prior to `node`.
*/
function nodeWalkPrior(node, predicate) {
// Search our earlier siblings and their descendents.
var parent = node.parentNode;
if (parent) {
var idx = parent.childNodes.indexOf(node);
var siblings = parent.childNodes.slice(0, idx);
for (var i = siblings.length-1; i >= 0; i--) {
var sibling = siblings[i];
if (predicate(sibling)) {
return sibling;
}
var found = nodeWalkPrior(sibling, predicate);
}
if (predicate(parent)) {
return parent;
}
return nodeWalkPrior(parent, predicate);
}
return undefined;
}
/**
* Equivalent to `nodeWalkAll`, but only returns nodes that are either
* ancestors or earlier cousins/siblings in the document.
*
* Nodes are returned in reverse document order, starting from `node`.
*/
function nodeWalkAllPrior(node, predicate, matches) {
if (!matches) {
matches = [];
}
if (predicate(node)) {
matches.push(node);
}
// Search our earlier siblings and their descendents.
var parent = node.parentNode;
if (parent) {
var idx = parent.childNodes.indexOf(node);
var siblings = parent.childNodes.slice(0, idx);
for (var i = siblings.length-1; i >= 0; i--) {
_reverseNodeWalkAll(siblings[i], predicate, matches);
}
nodeWalkAllPrior(parent, predicate, matches);
}
return matches;
}
/**
* Equivalent to `nodeWalk`, but only matches elements
*
* @returns {Element}
*/
function query(node, predicate) {
var elementPredicate = AND(isElement, predicate);
return nodeWalk(node, elementPredicate);
}
/**
* Equivalent to `nodeWalkAll`, but only matches elements
*
* @return {Array[Element]}
*/
function queryAll(node, predicate, matches) {
var elementPredicate = AND(isElement, predicate);
return nodeWalkAll(node, elementPredicate, matches);
}
function newTextNode(value) {
return {
nodeName: '#text',
value: value,
parentNode: null
};
}
function newCommentNode(comment) {
return {
nodeName: '#comment',
data: comment,
parentNode: null
};
}
function newElement(tagName, namespace) {
return {
nodeName: tagName,
tagName: tagName,
childNodes: [],
namespaceURI: namespace || 'http://www.w3.org/1999/xhtml',
attrs: [],
parentNode: null,
};
}
function newDocumentFragment() {
return {
nodeName: '#document-fragment',
childNodes: [],
parentNode: null,
quirksMode: false,
};
}
function cloneNode(node) {
// parent is a backreference, and we don't want to clone the whole tree, so
// make it null before cloning.
var parent = node.parentNode;
node.parentNode = null;
var clone = cloneObject(node);
node.parentNode = parent;
return clone;
}
/**
* Inserts `newNode` into `parent` at `index`, optionally replaceing the
* current node at `index`. If `newNode` is a DocumentFragment, its childNodes
* are inserted and removed from the fragment.
*/
function insertNode(parent, index, newNode, replace) {
var newNodes = [];
var removedNode = replace ? parent.childNodes[index] : null;
if (newNode) {
if (isDocumentFragment(newNode)) {
newNodes = newNode.childNodes;
newNode.childNodes = [];
} else {
newNodes = [newNode];
remove(newNode);
}
}
if (replace) {
removedNode = parent.childNodes[index];
}
Array.prototype.splice.apply(parent.childNodes,
[index, replace ? 1 : 0].concat(newNodes));
newNodes.forEach(function(n) {
n.parentNode = parent;
});
if (removedNode) {
removedNode.parentNode = null;
}
}
function replace(oldNode, newNode) {
var parent = oldNode.parentNode;
var index = parent.childNodes.indexOf(oldNode);
insertNode(parent, index, newNode, true);
}
function remove(node) {
var parent = node.parentNode;
if (parent) {
var idx = parent.childNodes.indexOf(node);
parent.childNodes.splice(idx, 1);
}
node.parentNode = null;
}
function insertBefore(parent, oldNode, newNode) {
var index = parent.childNodes.indexOf(oldNode);
insertNode(parent, index, newNode);
}
function append(parent, newNode) {
insertNode(parent, parent.childNodes.length, newNode);
}
var parse5 = require('parse5');
function parse(text, options) {
var parser = new parse5.Parser(parse5.TreeAdapters.default, options);
return parser.parse(text);
}
function parseFragment(text) {
var parser = new parse5.Parser();
return parser.parseFragment(text);
}
function serialize(ast) {
var serializer = new parse5.Serializer();
return serializer.serialize(ast);
}
module.exports = {
getAttribute: getAttribute,
hasAttribute: hasAttribute,
setAttribute: setAttribute,
removeAttribute: removeAttribute,
getTextContent: getTextContent,
setTextContent: setTextContent,
remove: remove,
replace: replace,
append: append,
cloneNode: cloneNode,
insertBefore: insertBefore,
normalize: normalize,
isDocument: isDocument,
isDocumentFragment: isDocumentFragment,
isElement: isElement,
isTextNode: isTextNode,
isCommentNode: isCommentNode,
query: query,
queryAll: queryAll,
nodeWalk: nodeWalk,
nodeWalkAll: nodeWalkAll,
nodeWalkPrior: nodeWalkPrior,
nodeWalkAllPrior: nodeWalkAllPrior,
treeMap: treeMap,
predicates: {
hasClass: hasClass,
hasAttr: hasAttr,
hasAttrValue: hasAttrValue,
hasMatchingTagName: hasMatchingTagName,
hasTagName: hasTagName,
hasTextValue: hasTextValue,
AND: AND,
OR: OR,
NOT: NOT,
parentMatches: parentMatches,
},
constructors: {
text: newTextNode,
comment: newCommentNode,
element: newElement,
fragment: newDocumentFragment,
},
parse: parse,
parseFragment: parseFragment,
serialize: serialize,
};
},{"clone":31,"parse5":259}],228:[function(require,module,exports){
(function (global){
/*
Copyright (C) 2012-2014 Yusuke Suzuki
Copyright (C) 2015 Ingvar Stepanyan
Copyright (C) 2014 Ivan Nikulin
Copyright (C) 2012-2013 Michael Ficarra
Copyright (C) 2012-2013 Mathias Bynens
Copyright (C) 2013 Irakli Gozalishvili
Copyright (C) 2012 Robert Gust-Bardon
Copyright (C) 2012 John Freeman
Copyright (C) 2011-2012 Ariya Hidayat
Copyright (C) 2012 Joost-Wim Boekesteijn
Copyright (C) 2012 Kris Kowal
Copyright (C) 2012 Arpad Borsos
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*global exports:true, require:true, global:true*/
(function () {
'use strict';
var Syntax,
Precedence,
BinaryPrecedence,
SourceNode,
estraverse,
esutils,
isArray,
base,
indent,
json,
renumber,
hexadecimal,
quotes,
escapeless,
newline,
space,
parentheses,
semicolons,
safeConcatenation,
directive,
extra,
parse,
sourceMap,
sourceCode,
preserveBlankLines,
FORMAT_MINIFY,
FORMAT_DEFAULTS;
estraverse = require('estraverse');
esutils = require('esutils');
Syntax = estraverse.Syntax;
// Generation is done by generateExpression.
function isExpression(node) {
return CodeGenerator.Expression.hasOwnProperty(node.type);
}
// Generation is done by generateStatement.
function isStatement(node) {
return CodeGenerator.Statement.hasOwnProperty(node.type);
}
Precedence = {
Sequence: 0,
Yield: 1,
Await: 1,
Assignment: 1,
Conditional: 2,
ArrowFunction: 2,
LogicalOR: 3,
LogicalAND: 4,
BitwiseOR: 5,
BitwiseXOR: 6,
BitwiseAND: 7,
Equality: 8,
Relational: 9,
BitwiseSHIFT: 10,
Additive: 11,
Multiplicative: 12,
Unary: 13,
Postfix: 14,
Call: 15,
New: 16,
TaggedTemplate: 17,
Member: 18,
Primary: 19
};
BinaryPrecedence = {
'||': Precedence.LogicalOR,
'&&': Precedence.LogicalAND,
'|': Precedence.BitwiseOR,
'^': Precedence.BitwiseXOR,
'&': Precedence.BitwiseAND,
'==': Precedence.Equality,
'!=': Precedence.Equality,
'===': Precedence.Equality,
'!==': Precedence.Equality,
'is': Precedence.Equality,
'isnt': Precedence.Equality,
'<': Precedence.Relational,
'>': Precedence.Relational,
'<=': Precedence.Relational,
'>=': Precedence.Relational,
'in': Precedence.Relational,
'instanceof': Precedence.Relational,
'<<': Precedence.BitwiseSHIFT,
'>>': Precedence.BitwiseSHIFT,
'>>>': Precedence.BitwiseSHIFT,
'+': Precedence.Additive,
'-': Precedence.Additive,
'*': Precedence.Multiplicative,
'%': Precedence.Multiplicative,
'/': Precedence.Multiplicative
};
//Flags
var F_ALLOW_IN = 1,
F_ALLOW_CALL = 1 << 1,
F_ALLOW_UNPARATH_NEW = 1 << 2,
F_FUNC_BODY = 1 << 3,
F_DIRECTIVE_CTX = 1 << 4,
F_SEMICOLON_OPT = 1 << 5;
//Expression flag sets
//NOTE: Flag order:
// F_ALLOW_IN
// F_ALLOW_CALL
// F_ALLOW_UNPARATH_NEW
var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
E_TFF = F_ALLOW_IN,
E_FFT = F_ALLOW_UNPARATH_NEW,
E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;
//Statement flag sets
//NOTE: Flag order:
// F_ALLOW_IN
// F_FUNC_BODY
// F_DIRECTIVE_CTX
// F_SEMICOLON_OPT
var S_TFFF = F_ALLOW_IN,
S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
S_FFFF = 0x00,
S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
S_TTFF = F_ALLOW_IN | F_FUNC_BODY;
function getDefaultOptions() {
// default options
return {
indent: null,
base: null,
parse: null,
comment: false,
format: {
indent: {
style: ' ',
base: 0,
adjustMultilineComment: false
},
newline: '\n',
space: ' ',
json: false,
renumber: false,
hexadecimal: false,
quotes: 'single',
escapeless: false,
compact: false,
parentheses: true,
semicolons: true,
safeConcatenation: false,
preserveBlankLines: false
},
moz: {
comprehensionExpressionStartsWithAssignment: false,
starlessGenerator: false
},
sourceMap: null,
sourceMapRoot: null,
sourceMapWithCode: false,
directive: false,
raw: true,
verbatim: null,
sourceCode: null
};
}
function stringRepeat(str, num) {
var result = '';
for (num |= 0; num > 0; num >>>= 1, str += str) {
if (num & 1) {
result += str;
}
}
return result;
}
isArray = Array.isArray;
if (!isArray) {
isArray = function isArray(array) {
return Object.prototype.toString.call(array) === '[object Array]';
};
}
function hasLineTerminator(str) {
return (/[\r\n]/g).test(str);
}
function endsWithLineTerminator(str) {
var len = str.length;
return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
}
function merge(target, override) {
var key;
for (key in override) {
if (override.hasOwnProperty(key)) {
target[key] = override[key];
}
}
return target;
}
function updateDeeply(target, override) {
var key, val;
function isHashObject(target) {
return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
}
for (key in override) {
if (override.hasOwnProperty(key)) {
val = override[key];
if (isHashObject(val)) {
if (isHashObject(target[key])) {
updateDeeply(target[key], val);
} else {
target[key] = updateDeeply({}, val);
}
} else {
target[key] = val;
}
}
}
return target;
}
function generateNumber(value) {
var result, point, temp, exponent, pos;
if (value !== value) {
throw new Error('Numeric literal whose value is NaN');
}
if (value < 0 || (value === 0 && 1 / value < 0)) {
throw new Error('Numeric literal whose value is negative');
}
if (value === 1 / 0) {
return json ? 'null' : renumber ? '1e400' : '1e+400';
}
result = '' + value;
if (!renumber || result.length < 3) {
return result;
}
point = result.indexOf('.');
if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {
point = 0;
result = result.slice(1);
}
temp = result;
result = result.replace('e+', 'e');
exponent = 0;
if ((pos = temp.indexOf('e')) > 0) {
exponent = +temp.slice(pos + 1);
temp = temp.slice(0, pos);
}
if (point >= 0) {
exponent -= temp.length - point - 1;
temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
}
pos = 0;
while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {
--pos;
}
if (pos !== 0) {
exponent -= pos;
temp = temp.slice(0, pos);
}
if (exponent !== 0) {
temp += 'e' + exponent;
}
if ((temp.length < result.length ||
(hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
+temp === value) {
result = temp;
}
return result;
}
// Generate valid RegExp expression.
// This function is based on https://github.com/Constellation/iv Engine
function escapeRegExpCharacter(ch, previousIsBackslash) {
// not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
if ((ch & ~1) === 0x2028) {
return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
} else if (ch === 10 || ch === 13) { // \n, \r
return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
}
return String.fromCharCode(ch);
}
function generateRegExp(reg) {
var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
result = reg.toString();
if (reg.source) {
// extract flag from toString result
match = result.match(/\/([^/]*)$/);
if (!match) {
return result;
}
flags = match[1];
result = '';
characterInBrack = false;
previousIsBackslash = false;
for (i = 0, iz = reg.source.length; i < iz; ++i) {
ch = reg.source.charCodeAt(i);
if (!previousIsBackslash) {
if (characterInBrack) {
if (ch === 93) { // ]
characterInBrack = false;
}
} else {
if (ch === 47) { // /
result += '\\';
} else if (ch === 91) { // [
characterInBrack = true;
}
}
result += escapeRegExpCharacter(ch, previousIsBackslash);
previousIsBackslash = ch === 92; // \
} else {
// if new RegExp("\\\n') is provided, create /\n/
result += escapeRegExpCharacter(ch, previousIsBackslash);
// prevent like /\\[/]/
previousIsBackslash = false;
}
}
return '/' + result + '/' + flags;
}
return result;
}
function escapeAllowedCharacter(code, next) {
var hex;
if (code === 0x08 /* \b */) {
return '\\b';
}
if (code === 0x0C /* \f */) {
return '\\f';
}
if (code === 0x09 /* \t */) {
return '\\t';
}
hex = code.toString(16).toUpperCase();
if (json || code > 0xFF) {
return '\\u' + '0000'.slice(hex.length) + hex;
} else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
return '\\0';
} else if (code === 0x000B /* \v */) { // '\v'
return '\\x0B';
} else {
return '\\x' + '00'.slice(hex.length) + hex;
}
}
function escapeDisallowedCharacter(code) {
if (code === 0x5C /* \ */) {
return '\\\\';
}
if (code === 0x0A /* \n */) {
return '\\n';
}
if (code === 0x0D /* \r */) {
return '\\r';
}
if (code === 0x2028) {
return '\\u2028';
}
if (code === 0x2029) {
return '\\u2029';
}
throw new Error('Incorrectly classified character');
}
function escapeDirective(str) {
var i, iz, code, quote;
quote = quotes === 'double' ? '"' : '\'';
for (i = 0, iz = str.length; i < iz; ++i) {
code = str.charCodeAt(i);
if (code === 0x27 /* ' */) {
quote = '"';
break;
} else if (code === 0x22 /* " */) {
quote = '\'';
break;
} else if (code === 0x5C /* \ */) {
++i;
}
}
return quote + str + quote;
}
function escapeString(str) {
var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;
for (i = 0, len = str.length; i < len; ++i) {
code = str.charCodeAt(i);
if (code === 0x27 /* ' */) {
++singleQuotes;
} else if (code === 0x22 /* " */) {
++doubleQuotes;
} else if (code === 0x2F /* / */ && json) {
result += '\\';
} else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {
result += escapeDisallowedCharacter(code);
continue;
} else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) {
result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
continue;
}
result += String.fromCharCode(code);
}
single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
quote = single ? '\'' : '"';
if (!(single ? singleQuotes : doubleQuotes)) {
return quote + result + quote;
}
str = result;
result = quote;
for (i = 0, len = str.length; i < len; ++i) {
code = str.charCodeAt(i);
if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {
result += '\\';
}
result += String.fromCharCode(code);
}
return result + quote;
}
/**
* flatten an array to a string, where the array can contain
* either strings or nested arrays
*/
function flattenToString(arr) {
var i, iz, elem, result = '';
for (i = 0, iz = arr.length; i < iz; ++i) {
elem = arr[i];
result += isArray(elem) ? flattenToString(elem) : elem;
}
return result;
}
/**
* convert generated to a SourceNode when source maps are enabled.
*/
function toSourceNodeWhenNeeded(generated, node) {
if (!sourceMap) {
// with no source maps, generated is either an
// array or a string. if an array, flatten it.
// if a string, just return it
if (isArray(generated)) {
return flattenToString(generated);
} else {
return generated;
}
}
if (node == null) {
if (generated instanceof SourceNode) {
return generated;
} else {
node = {};
}
}
if (node.loc == null) {
return new SourceNode(null, null, sourceMap, generated, node.name || null);
}
return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap === true ? node.loc.source || null : sourceMap), generated, node.name || null);
}
function noEmptySpace() {
return (space) ? space : ' ';
}
function join(left, right) {
var leftSource,
rightSource,
leftCharCode,
rightCharCode;
leftSource = toSourceNodeWhenNeeded(left).toString();
if (leftSource.length === 0) {
return [right];
}
rightSource = toSourceNodeWhenNeeded(right).toString();
if (rightSource.length === 0) {
return [left];
}
leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
rightCharCode = rightSource.charCodeAt(0);
if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||
esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`
return [left, noEmptySpace(), right];
} else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
return [left, right];
}
return [left, space, right];
}
function addIndent(stmt) {
return [base, stmt];
}
function withIndent(fn) {
var previousBase;
previousBase = base;
base += indent;
fn(base);
base = previousBase;
}
function calculateSpaces(str) {
var i;
for (i = str.length - 1; i >= 0; --i) {
if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
break;
}
}
return (str.length - 1) - i;
}
function adjustMultilineComment(value, specialBase) {
var array, i, len, line, j, spaces, previousBase, sn;
array = value.split(/\r\n|[\r\n]/);
spaces = Number.MAX_VALUE;
// first line doesn't have indentation
for (i = 1, len = array.length; i < len; ++i) {
line = array[i];
j = 0;
while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
++j;
}
if (spaces > j) {
spaces = j;
}
}
if (typeof specialBase !== 'undefined') {
// pattern like
// {
// var t = 20; /*
// * this is comment
// */
// }
previousBase = base;
if (array[1][spaces] === '*') {
specialBase += ' ';
}
base = specialBase;
} else {
if (spaces & 1) {
// /*
// *
// */
// If spaces are odd number, above pattern is considered.
// We waste 1 space.
--spaces;
}
previousBase = base;
}
for (i = 1, len = array.length; i < len; ++i) {
sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
array[i] = sourceMap ? sn.join('') : sn;
}
base = previousBase;
return array.join('\n');
}
function generateComment(comment, specialBase) {
if (comment.type === 'Line') {
if (endsWithLineTerminator(comment.value)) {
return '//' + comment.value;
} else {
// Always use LineTerminator
var result = '//' + comment.value;
if (!preserveBlankLines) {
result += '\n';
}
return result;
}
}
if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
}
return '/*' + comment.value + '*/';
}
function addComments(stmt, result) {
var i, len, comment, save, tailingToStatement, specialBase, fragment,
extRange, range, prevRange, prefix, infix, suffix, count;
if (stmt.leadingComments && stmt.leadingComments.length > 0) {
save = result;
if (preserveBlankLines) {
comment = stmt.leadingComments[0];
result = [];
extRange = comment.extendedRange;
range = comment.range;
prefix = sourceCode.substring(extRange[0], range[0]);
count = (prefix.match(/\n/g) || []).length;
if (count > 0) {
result.push(stringRepeat('\n', count));
result.push(addIndent(generateComment(comment)));
} else {
result.push(prefix);
result.push(generateComment(comment));
}
prevRange = range;
for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
comment = stmt.leadingComments[i];
range = comment.range;
infix = sourceCode.substring(prevRange[1], range[0]);
count = (infix.match(/\n/g) || []).length;
result.push(stringRepeat('\n', count));
result.push(addIndent(generateComment(comment)));
prevRange = range;
}
suffix = sourceCode.substring(range[1], extRange[1]);
count = (suffix.match(/\n/g) || []).length;
result.push(stringRepeat('\n', count));
} else {
comment = stmt.leadingComments[0];
result = [];
if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
result.push('\n');
}
result.push(generateComment(comment));
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push('\n');
}
for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
comment = stmt.leadingComments[i];
fragment = [generateComment(comment)];
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
fragment.push('\n');
}
result.push(addIndent(fragment));
}
}
result.push(addIndent(save));
}
if (stmt.trailingComments) {
if (preserveBlankLines) {
comment = stmt.trailingComments[0];
extRange = comment.extendedRange;
range = comment.range;
prefix = sourceCode.substring(extRange[0], range[0]);
count = (prefix.match(/\n/g) || []).length;
if (count > 0) {
result.push(stringRepeat('\n', count));
result.push(addIndent(generateComment(comment)));
} else {
result.push(prefix);
result.push(generateComment(comment));
}
} else {
tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
comment = stmt.trailingComments[i];
if (tailingToStatement) {
// We assume target like following script
//
// var t = 20; /**
// * This is comment of t
// */
if (i === 0) {
// first case
result = [result, indent];
} else {
result = [result, specialBase];
}
result.push(generateComment(comment, specialBase));
} else {
result = [result, addIndent(generateComment(comment))];
}
if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result = [result, '\n'];
}
}
}
}
return result;
}
function generateBlankLines(start, end, result) {
var j, newlineCount = 0;
for (j = start; j < end; j++) {
if (sourceCode[j] === '\n') {
newlineCount++;
}
}
for (j = 1; j < newlineCount; j++) {
result.push(newline);
}
}
function parenthesize(text, current, should) {
if (current < should) {
return ['(', text, ')'];
}
return text;
}
function generateVerbatimString(string) {
var i, iz, result;
result = string.split(/\r\n|\n/);
for (i = 1, iz = result.length; i < iz; i++) {
result[i] = newline + base + result[i];
}
return result;
}
function generateVerbatim(expr, precedence) {
var verbatim, result, prec;
verbatim = expr[extra.verbatim];
if (typeof verbatim === 'string') {
result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
} else {
// verbatim is object
result = generateVerbatimString(verbatim.content);
prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
result = parenthesize(result, prec, precedence);
}
return toSourceNodeWhenNeeded(result, expr);
}
function CodeGenerator() {
}
// Helpers.
CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
var result, noLeadingComment, that = this;
noLeadingComment = !extra.comment || !stmt.leadingComments;
if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
return [space, this.generateStatement(stmt, flags)];
}
if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
return ';';
}
withIndent(function () {
result = [
newline,
addIndent(that.generateStatement(stmt, flags))
];
});
return result;
};
CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
return [result, space];
}
if (ends) {
return [result, base];
}
return [result, newline, base];
};
function generateIdentifier(node) {
return toSourceNodeWhenNeeded(node.name, node);
}
function generateAsyncPrefix(node, spaceRequired) {
return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
}
function generateStarSuffix(node) {
var isGenerator = node.generator && !extra.moz.starlessGenerator;
return isGenerator ? '*' + space : '';
}
function generateMethodPrefix(prop) {
var func = prop.value;
if (func.async) {
return generateAsyncPrefix(func, !prop.computed);
} else {
// avoid space before method name
return generateStarSuffix(func) ? '*' : '';
}
}
CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
if (node.type === Syntax.Identifier) {
return generateIdentifier(node);
}
return this.generateExpression(node, precedence, flags);
};
CodeGenerator.prototype.generateFunctionParams = function (node) {
var i, iz, result, hasDefault;
hasDefault = false;
if (node.type === Syntax.ArrowFunctionExpression &&
!node.rest && (!node.defaults || node.defaults.length === 0) &&
node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
// arg => { } case
result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
} else {
result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
result.push('(');
if (node.defaults) {
hasDefault = true;
}
for (i = 0, iz = node.params.length; i < iz; ++i) {
if (hasDefault && node.defaults[i]) {
// Handle default values.
result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
} else {
result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
}
if (i + 1 < iz) {
result.push(',' + space);
}
}
if (node.rest) {
if (node.params.length) {
result.push(',' + space);
}
result.push('...');
result.push(generateIdentifier(node.rest));
}
result.push(')');
}
return result;
};
CodeGenerator.prototype.generateFunctionBody = function (node) {
var result, expr;
result = this.generateFunctionParams(node);
if (node.type === Syntax.ArrowFunctionExpression) {
result.push(space);
result.push('=>');
}
if (node.expression) {
result.push(space);
expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
if (expr.toString().charAt(0) === '{') {
expr = ['(', expr, ')'];
}
result.push(expr);
} else {
result.push(this.maybeBlock(node.body, S_TTFF));
}
return result;
};
CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
var result = ['for' + space + '('], that = this;
withIndent(function () {
if (stmt.left.type === Syntax.VariableDeclaration) {
withIndent(function () {
result.push(stmt.left.kind + noEmptySpace());
result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
});
} else {
result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
}
result = join(result, operator);
result = [join(
result,
that.generateExpression(stmt.right, Precedence.Sequence, E_TTT)
), ')'];
});
result.push(this.maybeBlock(stmt.body, flags));
return result;
};
CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
var result = [];
if (computed) {
result.push('[');
}
result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT));
if (computed) {
result.push(']');
}
return result;
};
CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
if (Precedence.Assignment < precedence) {
flags |= F_ALLOW_IN;
}
return parenthesize(
[
this.generateExpression(left, Precedence.Call, flags),
space + operator + space,
this.generateExpression(right, Precedence.Assignment, flags)
],
Precedence.Assignment,
precedence
);
};
CodeGenerator.prototype.semicolon = function (flags) {
if (!semicolons && flags & F_SEMICOLON_OPT) {
return '';
}
return ';';
};
// Statements.
CodeGenerator.Statement = {
BlockStatement: function (stmt, flags) {
var range, content, result = ['{', newline], that = this;
withIndent(function () {
// handle functions without any code
if (stmt.body.length === 0 && preserveBlankLines) {
range = stmt.range;
if (range[1] - range[0] > 2) {
content = sourceCode.substring(range[0] + 1, range[1] - 1);
if (content[0] === '\n') {
result = ['{'];
}
result.push(content);
}
}
var i, iz, fragment, bodyFlags;
bodyFlags = S_TFFF;
if (flags & F_FUNC_BODY) {
bodyFlags |= F_DIRECTIVE_CTX;
}
for (i = 0, iz = stmt.body.length; i < iz; ++i) {
if (preserveBlankLines) {
// handle spaces before the first line
if (i === 0) {
if (stmt.body[0].leadingComments) {
range = stmt.body[0].leadingComments[0].extendedRange;
content = sourceCode.substring(range[0], range[1]);
if (content[0] === '\n') {
result = ['{'];
}
}
if (!stmt.body[0].leadingComments) {
generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
}
}
// handle spaces between lines
if (i > 0) {
if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
}
}
}
if (i === iz - 1) {
bodyFlags |= F_SEMICOLON_OPT;
}
if (stmt.body[i].leadingComments && preserveBlankLines) {
fragment = that.generateStatement(stmt.body[i], bodyFlags);
} else {
fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
}
result.push(fragment);
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
if (preserveBlankLines && i < iz - 1) {
// don't add a new line if there are leading coments
// in the next statement
if (!stmt.body[i + 1].leadingComments) {
result.push(newline);
}
} else {
result.push(newline);
}
}
if (preserveBlankLines) {
// handle spaces after the last line
if (i === iz - 1) {
if (!stmt.body[i].trailingComments) {
generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
}
}
}
}
});
result.push(addIndent('}'));
return result;
},
BreakStatement: function (stmt, flags) {
if (stmt.label) {
return 'break ' + stmt.label.name + this.semicolon(flags);
}
return 'break' + this.semicolon(flags);
},
ContinueStatement: function (stmt, flags) {
if (stmt.label) {
return 'continue ' + stmt.label.name + this.semicolon(flags);
}
return 'continue' + this.semicolon(flags);
},
ClassBody: function (stmt, flags) {
var result = [ '{', newline], that = this;
withIndent(function (indent) {
var i, iz;
for (i = 0, iz = stmt.body.length; i < iz; ++i) {
result.push(indent);
result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
if (i + 1 < iz) {
result.push(newline);
}
}
});
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(base);
result.push('}');
return result;
},
ClassDeclaration: function (stmt, flags) {
var result, fragment;
result = ['class ' + stmt.id.name];
if (stmt.superClass) {
fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Assignment, E_TTT));
result = join(result, fragment);
}
result.push(space);
result.push(this.generateStatement(stmt.body, S_TFFT));
return result;
},
DirectiveStatement: function (stmt, flags) {
if (extra.raw && stmt.raw) {
return stmt.raw + this.semicolon(flags);
}
return escapeDirective(stmt.directive) + this.semicolon(flags);
},
DoWhileStatement: function (stmt, flags) {
// Because `do 42 while (cond)` is Syntax Error. We need semicolon.
var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
result = this.maybeBlockSuffix(stmt.body, result);
return join(result, [
'while' + space + '(',
this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
')' + this.semicolon(flags)
]);
},
CatchClause: function (stmt, flags) {
var result, that = this;
withIndent(function () {
var guard;
result = [
'catch' + space + '(',
that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
')'
];
if (stmt.guard) {
guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
result.splice(2, 0, ' if ', guard);
}
});
result.push(this.maybeBlock(stmt.body, S_TFFF));
return result;
},
DebuggerStatement: function (stmt, flags) {
return 'debugger' + this.semicolon(flags);
},
EmptyStatement: function (stmt, flags) {
return ';';
},
ExportDefaultDeclaration: function (stmt, flags) {
var result = [ 'export' ], bodyFlags;
bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
// export default HoistableDeclaration[Default]
// export default AssignmentExpression[In] ;
result = join(result, 'default');
if (isStatement(stmt.declaration)) {
result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
} else {
result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
}
return result;
},
ExportNamedDeclaration: function (stmt, flags) {
var result = [ 'export' ], bodyFlags, that = this;
bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
// export VariableStatement
// export Declaration[Default]
if (stmt.declaration) {
return join(result, this.generateStatement(stmt.declaration, bodyFlags));
}
// export ExportClause[NoReference] FromClause ;
// export ExportClause ;
if (stmt.specifiers) {
if (stmt.specifiers.length === 0) {
result = join(result, '{' + space + '}');
} else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
} else {
result = join(result, '{');
withIndent(function (indent) {
var i, iz;
result.push(newline);
for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
result.push(indent);
result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
if (i + 1 < iz) {
result.push(',' + newline);
}
}
});
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(base + '}');
}
if (stmt.source) {
result = join(result, [
'from' + space,
// ModuleSpecifier
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
this.semicolon(flags)
]);
} else {
result.push(this.semicolon(flags));
}
}
return result;
},
ExportAllDeclaration: function (stmt, flags) {
// export * FromClause ;
return [
'export' + space,
'*' + space,
'from' + space,
// ModuleSpecifier
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
this.semicolon(flags)
];
},
ExpressionStatement: function (stmt, flags) {
var result, fragment;
function isClassPrefixed(fragment) {
var code;
if (fragment.slice(0, 5) !== 'class') {
return false;
}
code = fragment.charCodeAt(5);
return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
}
function isFunctionPrefixed(fragment) {
var code;
if (fragment.slice(0, 8) !== 'function') {
return false;
}
code = fragment.charCodeAt(8);
return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
}
function isAsyncPrefixed(fragment) {
var code, i, iz;
if (fragment.slice(0, 5) !== 'async') {
return false;
}
if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
return false;
}
for (i = 6, iz = fragment.length; i < iz; ++i) {
if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
break;
}
}
if (i === iz) {
return false;
}
if (fragment.slice(i, i + 8) !== 'function') {
return false;
}
code = fragment.charCodeAt(i + 8);
return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
}
result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
// 12.4 '{', 'function', 'class' is not allowed in this position.
// wrap expression with parentheses
fragment = toSourceNodeWhenNeeded(result).toString();
if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression
isClassPrefixed(fragment) ||
isFunctionPrefixed(fragment) ||
isAsyncPrefixed(fragment) ||
(directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
result = ['(', result, ')' + this.semicolon(flags)];
} else {
result.push(this.semicolon(flags));
}
return result;
},
ImportDeclaration: function (stmt, flags) {
// ES6: 15.2.1 valid import declarations:
// - import ImportClause FromClause ;
// - import ModuleSpecifier ;
var result, cursor, that = this;
// If no ImportClause is present,
// this should be `import ModuleSpecifier` so skip `from`
// ModuleSpecifier is StringLiteral.
if (stmt.specifiers.length === 0) {
// import ModuleSpecifier ;
return [
'import',
space,
// ModuleSpecifier
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
this.semicolon(flags)
];
}
// import ImportClause FromClause ;
result = [
'import'
];
cursor = 0;
// ImportedBinding
if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
result = join(result, [
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
]);
++cursor;
}
if (stmt.specifiers[cursor]) {
if (cursor !== 0) {
result.push(',');
}
if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
// NameSpaceImport
result = join(result, [
space,
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
]);
} else {
// NamedImports
result.push(space + '{');
if ((stmt.specifiers.length - cursor) === 1) {
// import { ... } from "...";
result.push(space);
result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
result.push(space + '}' + space);
} else {
// import {
// ...,
// ...,
// } from "...";
withIndent(function (indent) {
var i, iz;
result.push(newline);
for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
result.push(indent);
result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
if (i + 1 < iz) {
result.push(',' + newline);
}
}
});
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(base + '}' + space);
}
}
}
result = join(result, [
'from' + space,
// ModuleSpecifier
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
this.semicolon(flags)
]);
return result;
},
VariableDeclarator: function (stmt, flags) {
var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
if (stmt.init) {
return [
this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
space,
'=',
space,
this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
];
}
return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
},
VariableDeclaration: function (stmt, flags) {
// VariableDeclarator is typed as Statement,
// but joined with comma (not LineTerminator).
// So if comment is attached to target node, we should specialize.
var result, i, iz, node, bodyFlags, that = this;
result = [ stmt.kind ];
bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;
function block() {
node = stmt.declarations[0];
if (extra.comment && node.leadingComments) {
result.push('\n');
result.push(addIndent(that.generateStatement(node, bodyFlags)));
} else {
result.push(noEmptySpace());
result.push(that.generateStatement(node, bodyFlags));
}
for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
node = stmt.declarations[i];
if (extra.comment && node.leadingComments) {
result.push(',' + newline);
result.push(addIndent(that.generateStatement(node, bodyFlags)));
} else {
result.push(',' + space);
result.push(that.generateStatement(node, bodyFlags));
}
}
}
if (stmt.declarations.length > 1) {
withIndent(block);
} else {
block();
}
result.push(this.semicolon(flags));
return result;
},
ThrowStatement: function (stmt, flags) {
return [join(
'throw',
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
), this.semicolon(flags)];
},
TryStatement: function (stmt, flags) {
var result, i, iz, guardedHandlers;
result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
result = this.maybeBlockSuffix(stmt.block, result);
if (stmt.handlers) {
// old interface
for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
if (stmt.finalizer || i + 1 !== iz) {
result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
}
}
} else {
guardedHandlers = stmt.guardedHandlers || [];
for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
if (stmt.finalizer || i + 1 !== iz) {
result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
}
}
// new interface
if (stmt.handler) {
if (isArray(stmt.handler)) {
for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
if (stmt.finalizer || i + 1 !== iz) {
result = this.maybeBlockSuffix(stmt.handler[i].body, result);
}
}
} else {
result = join(result, this.generateStatement(stmt.handler, S_TFFF));
if (stmt.finalizer) {
result = this.maybeBlockSuffix(stmt.handler.body, result);
}
}
}
}
if (stmt.finalizer) {
result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
}
return result;
},
SwitchStatement: function (stmt, flags) {
var result, fragment, i, iz, bodyFlags, that = this;
withIndent(function () {
result = [
'switch' + space + '(',
that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
')' + space + '{' + newline
];
});
if (stmt.cases) {
bodyFlags = S_TFFF;
for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
if (i === iz - 1) {
bodyFlags |= F_SEMICOLON_OPT;
}
fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
result.push(fragment);
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
result.push(newline);
}
}
}
result.push(addIndent('}'));
return result;
},
SwitchCase: function (stmt, flags) {
var result, fragment, i, iz, bodyFlags, that = this;
withIndent(function () {
if (stmt.test) {
result = [
join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
':'
];
} else {
result = ['default:'];
}
i = 0;
iz = stmt.consequent.length;
if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
result.push(fragment);
i = 1;
}
if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
bodyFlags = S_TFFF;
for (; i < iz; ++i) {
if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
bodyFlags |= F_SEMICOLON_OPT;
}
fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
result.push(fragment);
if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
result.push(newline);
}
}
});
return result;
},
IfStatement: function (stmt, flags) {
var result, bodyFlags, semicolonOptional, that = this;
withIndent(function () {
result = [
'if' + space + '(',
that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
')'
];
});
semicolonOptional = flags & F_SEMICOLON_OPT;
bodyFlags = S_TFFF;
if (semicolonOptional) {
bodyFlags |= F_SEMICOLON_OPT;
}
if (stmt.alternate) {
result.push(this.maybeBlock(stmt.consequent, S_TFFF));
result = this.maybeBlockSuffix(stmt.consequent, result);
if (stmt.alternate.type === Syntax.IfStatement) {
result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
} else {
result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
}
} else {
result.push(this.maybeBlock(stmt.consequent, bodyFlags));
}
return result;
},
ForStatement: function (stmt, flags) {
var result, that = this;
withIndent(function () {
result = ['for' + space + '('];
if (stmt.init) {
if (stmt.init.type === Syntax.VariableDeclaration) {
result.push(that.generateStatement(stmt.init, S_FFFF));
} else {
// F_ALLOW_IN becomes false.
result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
result.push(';');
}
} else {
result.push(';');
}
if (stmt.test) {
result.push(space);
result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
result.push(';');
} else {
result.push(';');
}
if (stmt.update) {
result.push(space);
result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
result.push(')');
} else {
result.push(')');
}
});
result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
return result;
},
ForInStatement: function (stmt, flags) {
return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
},
ForOfStatement: function (stmt, flags) {
return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
},
LabeledStatement: function (stmt, flags) {
return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
},
Program: function (stmt, flags) {
var result, fragment, i, iz, bodyFlags;
iz = stmt.body.length;
result = [safeConcatenation && iz > 0 ? '\n' : ''];
bodyFlags = S_TFTF;
for (i = 0; i < iz; ++i) {
if (!safeConcatenation && i === iz - 1) {
bodyFlags |= F_SEMICOLON_OPT;
}
if (preserveBlankLines) {
// handle spaces before the first line
if (i === 0) {
if (!stmt.body[0].leadingComments) {
generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
}
}
// handle spaces between lines
if (i > 0) {
if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
}
}
}
fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
result.push(fragment);
if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
if (preserveBlankLines) {
if (!stmt.body[i + 1].leadingComments) {
result.push(newline);
}
} else {
result.push(newline);
}
}
if (preserveBlankLines) {
// handle spaces after the last line
if (i === iz - 1) {
if (!stmt.body[i].trailingComments) {
generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
}
}
}
}
return result;
},
FunctionDeclaration: function (stmt, flags) {
return [
generateAsyncPrefix(stmt, true),
'function',
generateStarSuffix(stmt) || noEmptySpace(),
stmt.id ? generateIdentifier(stmt.id) : '',
this.generateFunctionBody(stmt)
];
},
ReturnStatement: function (stmt, flags) {
if (stmt.argument) {
return [join(
'return',
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
), this.semicolon(flags)];
}
return ['return' + this.semicolon(flags)];
},
WhileStatement: function (stmt, flags) {
var result, that = this;
withIndent(function () {
result = [
'while' + space + '(',
that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
')'
];
});
result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
return result;
},
WithStatement: function (stmt, flags) {
var result, that = this;
withIndent(function () {
result = [
'with' + space + '(',
that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
')'
];
});
result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
return result;
}
};
merge(CodeGenerator.prototype, CodeGenerator.Statement);
// Expressions.
CodeGenerator.Expression = {
SequenceExpression: function (expr, precedence, flags) {
var result, i, iz;
if (Precedence.Sequence < precedence) {
flags |= F_ALLOW_IN;
}
result = [];
for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
if (i + 1 < iz) {
result.push(',' + space);
}
}
return parenthesize(result, Precedence.Sequence, precedence);
},
AssignmentExpression: function (expr, precedence, flags) {
return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
},
ArrowFunctionExpression: function (expr, precedence, flags) {
return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
},
ConditionalExpression: function (expr, precedence, flags) {
if (Precedence.Conditional < precedence) {
flags |= F_ALLOW_IN;
}
return parenthesize(
[
this.generateExpression(expr.test, Precedence.LogicalOR, flags),
space + '?' + space,
this.generateExpression(expr.consequent, Precedence.Assignment, flags),
space + ':' + space,
this.generateExpression(expr.alternate, Precedence.Assignment, flags)
],
Precedence.Conditional,
precedence
);
},
LogicalExpression: function (expr, precedence, flags) {
return this.BinaryExpression(expr, precedence, flags);
},
BinaryExpression: function (expr, precedence, flags) {
var result, currentPrecedence, fragment, leftSource;
currentPrecedence = BinaryPrecedence[expr.operator];
if (currentPrecedence < precedence) {
flags |= F_ALLOW_IN;
}
fragment = this.generateExpression(expr.left, currentPrecedence, flags);
leftSource = fragment.toString();
if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
result = [fragment, noEmptySpace(), expr.operator];
} else {
result = join(fragment, expr.operator);
}
fragment = this.generateExpression(expr.right, currentPrecedence + 1, flags);
if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
// If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
result.push(noEmptySpace());
result.push(fragment);
} else {
result = join(result, fragment);
}
if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
return ['(', result, ')'];
}
return parenthesize(result, currentPrecedence, precedence);
},
CallExpression: function (expr, precedence, flags) {
var result, i, iz;
// F_ALLOW_UNPARATH_NEW becomes false.
result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
result.push('(');
for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
if (i + 1 < iz) {
result.push(',' + space);
}
}
result.push(')');
if (!(flags & F_ALLOW_CALL)) {
return ['(', result, ')'];
}
return parenthesize(result, Precedence.Call, precedence);
},
NewExpression: function (expr, precedence, flags) {
var result, length, i, iz, itemFlags;
length = expr['arguments'].length;
// F_ALLOW_CALL becomes false.
// F_ALLOW_UNPARATH_NEW may become false.
itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;
result = join(
'new',
this.generateExpression(expr.callee, Precedence.New, itemFlags)
);
if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
result.push('(');
for (i = 0, iz = length; i < iz; ++i) {
result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
if (i + 1 < iz) {
result.push(',' + space);
}
}
result.push(')');
}
return parenthesize(result, Precedence.New, precedence);
},
MemberExpression: function (expr, precedence, flags) {
var result, fragment;
// F_ALLOW_UNPARATH_NEW becomes false.
result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
if (expr.computed) {
result.push('[');
result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
result.push(']');
} else {
if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
fragment = toSourceNodeWhenNeeded(result).toString();
// When the following conditions are all true,
// 1. No floating point
// 2. Don't have exponents
// 3. The last character is a decimal digit
// 4. Not hexadecimal OR octal number literal
// we should add a floating point.
if (
fragment.indexOf('.') < 0 &&
!/[eExX]/.test(fragment) &&
esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
!(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'
) {
result.push('.');
}
}
result.push('.');
result.push(generateIdentifier(expr.property));
}
return parenthesize(result, Precedence.Member, precedence);
},
MetaProperty: function (expr, precedence, flags) {
var result;
result = [];
result.push(expr.meta);
result.push('.');
result.push(expr.property);
return parenthesize(result, Precedence.Member, precedence);
},
UnaryExpression: function (expr, precedence, flags) {
var result, fragment, rightCharCode, leftSource, leftCharCode;
fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
if (space === '') {
result = join(expr.operator, fragment);
} else {
result = [expr.operator];
if (expr.operator.length > 2) {
// delete, void, typeof
// get `typeof []`, not `typeof[]`
result = join(result, fragment);
} else {
// Prevent inserting spaces between operator and argument if it is unnecessary
// like, `!cond`
leftSource = toSourceNodeWhenNeeded(result).toString();
leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
rightCharCode = fragment.toString().charCodeAt(0);
if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||
(esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
result.push(noEmptySpace());
result.push(fragment);
} else {
result.push(fragment);
}
}
}
return parenthesize(result, Precedence.Unary, precedence);
},
YieldExpression: function (expr, precedence, flags) {
var result;
if (expr.delegate) {
result = 'yield*';
} else {
result = 'yield';
}
if (expr.argument) {
result = join(
result,
this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
);
}
return parenthesize(result, Precedence.Yield, precedence);
},
AwaitExpression: function (expr, precedence, flags) {
var result = join(
expr.all ? 'await*' : 'await',
this.generateExpression(expr.argument, Precedence.Await, E_TTT)
);
return parenthesize(result, Precedence.Await, precedence);
},
UpdateExpression: function (expr, precedence, flags) {
if (expr.prefix) {
return parenthesize(
[
expr.operator,
this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
],
Precedence.Unary,
precedence
);
}
return parenthesize(
[
this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
expr.operator
],
Precedence.Postfix,
precedence
);
},
FunctionExpression: function (expr, precedence, flags) {
var result = [
generateAsyncPrefix(expr, true),
'function'
];
if (expr.id) {
result.push(generateStarSuffix(expr) || noEmptySpace());
result.push(generateIdentifier(expr.id));
} else {
result.push(generateStarSuffix(expr) || space);
}
result.push(this.generateFunctionBody(expr));
return result;
},
ArrayPattern: function (expr, precedence, flags) {
return this.ArrayExpression(expr, precedence, flags, true);
},
ArrayExpression: function (expr, precedence, flags, isPattern) {
var result, multiline, that = this;
if (!expr.elements.length) {
return '[]';
}
multiline = isPattern ? false : expr.elements.length > 1;
result = ['[', multiline ? newline : ''];
withIndent(function (indent) {
var i, iz;
for (i = 0, iz = expr.elements.length; i < iz; ++i) {
if (!expr.elements[i]) {
if (multiline) {
result.push(indent);
}
if (i + 1 === iz) {
result.push(',');
}
} else {
result.push(multiline ? indent : '');
result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
}
if (i + 1 < iz) {
result.push(',' + (multiline ? newline : space));
}
}
});
if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(multiline ? base : '');
result.push(']');
return result;
},
RestElement: function(expr, precedence, flags) {
return '...' + this.generatePattern(expr.argument);
},
ClassExpression: function (expr, precedence, flags) {
var result, fragment;
result = ['class'];
if (expr.id) {
result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
}
if (expr.superClass) {
fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Assignment, E_TTT));
result = join(result, fragment);
}
result.push(space);
result.push(this.generateStatement(expr.body, S_TFFT));
return result;
},
MethodDefinition: function (expr, precedence, flags) {
var result, fragment;
if (expr['static']) {
result = ['static' + space];
} else {
result = [];
}
if (expr.kind === 'get' || expr.kind === 'set') {
fragment = [
join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
this.generateFunctionBody(expr.value)
];
} else {
fragment = [
generateMethodPrefix(expr),
this.generatePropertyKey(expr.key, expr.computed),
this.generateFunctionBody(expr.value)
];
}
return join(result, fragment);
},
Property: function (expr, precedence, flags) {
if (expr.kind === 'get' || expr.kind === 'set') {
return [
expr.kind, noEmptySpace(),
this.generatePropertyKey(expr.key, expr.computed),
this.generateFunctionBody(expr.value)
];
}
if (expr.shorthand) {
return this.generatePropertyKey(expr.key, expr.computed);
}
if (expr.method) {
return [
generateMethodPrefix(expr),
this.generatePropertyKey(expr.key, expr.computed),
this.generateFunctionBody(expr.value)
];
}
return [
this.generatePropertyKey(expr.key, expr.computed),
':' + space,
this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
];
},
ObjectExpression: function (expr, precedence, flags) {
var multiline, result, fragment, that = this;
if (!expr.properties.length) {
return '{}';
}
multiline = expr.properties.length > 1;
withIndent(function () {
fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
});
if (!multiline) {
// issues 4
// Do not transform from
// dejavu.Class.declare({
// method2: function () {}
// });
// to
// dejavu.Class.declare({method2: function () {
// }});
if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
return [ '{', space, fragment, space, '}' ];
}
}
withIndent(function (indent) {
var i, iz;
result = [ '{', newline, indent, fragment ];
if (multiline) {
result.push(',' + newline);
for (i = 1, iz = expr.properties.length; i < iz; ++i) {
result.push(indent);
result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
if (i + 1 < iz) {
result.push(',' + newline);
}
}
}
});
if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(base);
result.push('}');
return result;
},
AssignmentPattern: function(expr, precedence, flags) {
return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
},
ObjectPattern: function (expr, precedence, flags) {
var result, i, iz, multiline, property, that = this;
if (!expr.properties.length) {
return '{}';
}
multiline = false;
if (expr.properties.length === 1) {
property = expr.properties[0];
if (property.value.type !== Syntax.Identifier) {
multiline = true;
}
} else {
for (i = 0, iz = expr.properties.length; i < iz; ++i) {
property = expr.properties[i];
if (!property.shorthand) {
multiline = true;
break;
}
}
}
result = ['{', multiline ? newline : '' ];
withIndent(function (indent) {
var i, iz;
for (i = 0, iz = expr.properties.length; i < iz; ++i) {
result.push(multiline ? indent : '');
result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
if (i + 1 < iz) {
result.push(',' + (multiline ? newline : space));
}
}
});
if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
result.push(newline);
}
result.push(multiline ? base : '');
result.push('}');
return result;
},
ThisExpression: function (expr, precedence, flags) {
return 'this';
},
Super: function (expr, precedence, flags) {
return 'super';
},
Identifier: function (expr, precedence, flags) {
return generateIdentifier(expr);
},
ImportDefaultSpecifier: function (expr, precedence, flags) {
return generateIdentifier(expr.id || expr.local);
},
ImportNamespaceSpecifier: function (expr, precedence, flags) {
var result = ['*'];
var id = expr.id || expr.local;
if (id) {
result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
}
return result;
},
ImportSpecifier: function (expr, precedence, flags) {
var imported = expr.imported;
var result = [ imported.name ];
var local = expr.local;
if (local && local.name !== imported.name) {
result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
}
return result;
},
ExportSpecifier: function (expr, precedence, flags) {
var local = expr.local;
var result = [ local.name ];
var exported = expr.exported;
if (exported && exported.name !== local.name) {
result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
}
return result;
},
Literal: function (expr, precedence, flags) {
var raw;
if (expr.hasOwnProperty('raw') && parse && extra.raw) {
try {
raw = parse(expr.raw).body[0].expression;
if (raw.type === Syntax.Literal) {
if (raw.value === expr.value) {
return expr.raw;
}
}
} catch (e) {
// not use raw property
}
}
if (expr.value === null) {
return 'null';
}
if (typeof expr.value === 'string') {
return escapeString(expr.value);
}
if (typeof expr.value === 'number') {
return generateNumber(expr.value);
}
if (typeof expr.value === 'boolean') {
return expr.value ? 'true' : 'false';
}
return generateRegExp(expr.value);
},
GeneratorExpression: function (expr, precedence, flags) {
return this.ComprehensionExpression(expr, precedence, flags);
},
ComprehensionExpression: function (expr, precedence, flags) {
// GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
// Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6
var result, i, iz, fragment, that = this;
result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];
if (extra.moz.comprehensionExpressionStartsWithAssignment) {
fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
result.push(fragment);
}
if (expr.blocks) {
withIndent(function () {
for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
result = join(result, fragment);
} else {
result.push(fragment);
}
}
});
}
if (expr.filter) {
result = join(result, 'if' + space);
fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
result = join(result, [ '(', fragment, ')' ]);
}
if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
result = join(result, fragment);
}
result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
return result;
},
ComprehensionBlock: function (expr, precedence, flags) {
var fragment;
if (expr.left.type === Syntax.VariableDeclaration) {
fragment = [
expr.left.kind, noEmptySpace(),
this.generateStatement(expr.left.declarations[0], S_FFFF)
];
} else {
fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
}
fragment = join(fragment, expr.of ? 'of' : 'in');
fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
return [ 'for' + space + '(', fragment, ')' ];
},
SpreadElement: function (expr, precedence, flags) {
return [
'...',
this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
];
},
TaggedTemplateExpression: function (expr, precedence, flags) {
var itemFlags = E_TTF;
if (!(flags & F_ALLOW_CALL)) {
itemFlags = E_TFF;
}
var result = [
this.generateExpression(expr.tag, Precedence.Call, itemFlags),
this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
];
return parenthesize(result, Precedence.TaggedTemplate, precedence);
},
TemplateElement: function (expr, precedence, flags) {
// Don't use "cooked". Since tagged template can use raw template
// representation. So if we do so, it breaks the script semantics.
return expr.value.raw;
},
TemplateLiteral: function (expr, precedence, flags) {
var result, i, iz;
result = [ '`' ];
for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
if (i + 1 < iz) {
result.push('${' + space);
result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
result.push(space + '}');
}
}
result.push('`');
return result;
},
ModuleSpecifier: function (expr, precedence, flags) {
return this.Literal(expr, precedence, flags);
}
};
merge(CodeGenerator.prototype, CodeGenerator.Expression);
CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
var result, type;
type = expr.type || Syntax.Property;
if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
return generateVerbatim(expr, precedence);
}
result = this[type](expr, precedence, flags);
if (extra.comment) {
result = addComments(expr, result);
}
return toSourceNodeWhenNeeded(result, expr);
};
CodeGenerator.prototype.generateStatement = function (stmt, flags) {
var result,
fragment;
result = this[stmt.type](stmt, flags);
// Attach comments
if (extra.comment) {
result = addComments(stmt, result);
}
fragment = toSourceNodeWhenNeeded(result).toString();
if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {
result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
}
return toSourceNodeWhenNeeded(result, stmt);
};
function generateInternal(node) {
var codegen;
codegen = new CodeGenerator();
if (isStatement(node)) {
return codegen.generateStatement(node, S_TFFF);
}
if (isExpression(node)) {
return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
}
throw new Error('Unknown node type: ' + node.type);
}
function generate(node, options) {
var defaultOptions = getDefaultOptions(), result, pair;
if (options != null) {
// Obsolete options
//
// `options.indent`
// `options.base`
//
// Instead of them, we can use `option.format.indent`.
if (typeof options.indent === 'string') {
defaultOptions.format.indent.style = options.indent;
}
if (typeof options.base === 'number') {
defaultOptions.format.indent.base = options.base;
}
options = updateDeeply(defaultOptions, options);
indent = options.format.indent.style;
if (typeof options.base === 'string') {
base = options.base;
} else {
base = stringRepeat(indent, options.format.indent.base);
}
} else {
options = defaultOptions;
indent = options.format.indent.style;
base = stringRepeat(indent, options.format.indent.base);
}
json = options.format.json;
renumber = options.format.renumber;
hexadecimal = json ? false : options.format.hexadecimal;
quotes = json ? 'double' : options.format.quotes;
escapeless = options.format.escapeless;
newline = options.format.newline;
space = options.format.space;
if (options.format.compact) {
newline = space = indent = base = '';
}
parentheses = options.format.parentheses;
semicolons = options.format.semicolons;
safeConcatenation = options.format.safeConcatenation;
directive = options.directive;
parse = json ? null : options.parse;
sourceMap = options.sourceMap;
sourceCode = options.sourceCode;
preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
extra = options;
if (sourceMap) {
if (!exports.browser) {
// We assume environment is node.js
// And prevent from including source-map by browserify
SourceNode = require('source-map').SourceNode;
} else {
SourceNode = global.sourceMap.SourceNode;
}
}
result = generateInternal(node);
if (!sourceMap) {
pair = {code: result.toString(), map: null};
return options.sourceMapWithCode ? pair : pair.code;
}
pair = result.toStringWithSourceMap({
file: options.file,
sourceRoot: options.sourceMapRoot
});
if (options.sourceContent) {
pair.map.setSourceContent(options.sourceMap,
options.sourceContent);
}
if (options.sourceMapWithCode) {
return pair;
}
return pair.map.toString();
}
FORMAT_MINIFY = {
indent: {
style: '',
base: 0
},
renumber: true,
hexadecimal: true,
quotes: 'auto',
escapeless: true,
compact: true,
parentheses: false,
semicolons: false
};
FORMAT_DEFAULTS = getDefaultOptions().format;
exports.version = require('./package.json').version;
exports.generate = generate;
exports.attachComments = estraverse.attachComments;
exports.Precedence = updateDeeply({}, Precedence);
exports.browser = false;
exports.FORMAT_MINIFY = FORMAT_MINIFY;
exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
}());
/* vim: set sw=4 ts=4 et tw=80 : */
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9lc2NvZGVnZW4vZXNjb2RlZ2VuLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNSBJbmd2YXIgU3RlcGFueWFuIDxtZUBycmV2ZXJzZXIuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTQgSXZhbiBOaWt1bGluIDxpZmFhYW5AZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBNaWNoYWVsIEZpY2FycmEgPGVzY29kZWdlbi5jb3B5cmlnaHRAbWljaGFlbC5maWNhcnJhLm1lPlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBNYXRoaWFzIEJ5bmVucyA8bWF0aGlhc0BxaXdpLmJlPlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIFJvYmVydCBHdXN0LUJhcmRvbiA8ZG9uYXRlQHJvYmVydC5ndXN0LWJhcmRvbi5vcmc+XG4gIENvcHlyaWdodCAoQykgMjAxMiBKb2huIEZyZWVtYW4gPGpmcmVlbWFuMDhAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEpvb3N0LVdpbSBCb2VrZXN0ZWlqbiA8am9vc3Qtd2ltQGJvZWtlc3RlaWpuLm5sPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgS3JpcyBLb3dhbCA8a3Jpcy5rb3dhbEBjaXhhci5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcnBhZCBCb3Jzb3MgPGFycGFkLmJvcnNvc0Bnb29nbGVtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vKmdsb2JhbCBleHBvcnRzOnRydWUsIHJlcXVpcmU6dHJ1ZSwgZ2xvYmFsOnRydWUqL1xuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgU3ludGF4LFxuICAgICAgICBQcmVjZWRlbmNlLFxuICAgICAgICBCaW5hcnlQcmVjZWRlbmNlLFxuICAgICAgICBTb3VyY2VOb2RlLFxuICAgICAgICBlc3RyYXZlcnNlLFxuICAgICAgICBlc3V0aWxzLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBiYXNlLFxuICAgICAgICBpbmRlbnQsXG4gICAgICAgIGpzb24sXG4gICAgICAgIHJlbnVtYmVyLFxuICAgICAgICBoZXhhZGVjaW1hbCxcbiAgICAgICAgcXVvdGVzLFxuICAgICAgICBlc2NhcGVsZXNzLFxuICAgICAgICBuZXdsaW5lLFxuICAgICAgICBzcGFjZSxcbiAgICAgICAgcGFyZW50aGVzZXMsXG4gICAgICAgIHNlbWljb2xvbnMsXG4gICAgICAgIHNhZmVDb25jYXRlbmF0aW9uLFxuICAgICAgICBkaXJlY3RpdmUsXG4gICAgICAgIGV4dHJhLFxuICAgICAgICBwYXJzZSxcbiAgICAgICAgc291cmNlTWFwLFxuICAgICAgICBzb3VyY2VDb2RlLFxuICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXMsXG4gICAgICAgIEZPUk1BVF9NSU5JRlksXG4gICAgICAgIEZPUk1BVF9ERUZBVUxUUztcblxuICAgIGVzdHJhdmVyc2UgPSByZXF1aXJlKCdlc3RyYXZlcnNlJyk7XG4gICAgZXN1dGlscyA9IHJlcXVpcmUoJ2VzdXRpbHMnKTtcblxuICAgIFN5bnRheCA9IGVzdHJhdmVyc2UuU3ludGF4O1xuXG4gICAgLy8gR2VuZXJhdGlvbiBpcyBkb25lIGJ5IGdlbmVyYXRlRXhwcmVzc2lvbi5cbiAgICBmdW5jdGlvbiBpc0V4cHJlc3Npb24obm9kZSkge1xuICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvci5FeHByZXNzaW9uLmhhc093blByb3BlcnR5KG5vZGUudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGlvbiBpcyBkb25lIGJ5IGdlbmVyYXRlU3RhdGVtZW50LlxuICAgIGZ1bmN0aW9uIGlzU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvZGVHZW5lcmF0b3IuU3RhdGVtZW50Lmhhc093blByb3BlcnR5KG5vZGUudHlwZSk7XG4gICAgfVxuXG4gICAgUHJlY2VkZW5jZSA9IHtcbiAgICAgICAgU2VxdWVuY2U6IDAsXG4gICAgICAgIFlpZWxkOiAxLFxuICAgICAgICBBd2FpdDogMSxcbiAgICAgICAgQXNzaWdubWVudDogMSxcbiAgICAgICAgQ29uZGl0aW9uYWw6IDIsXG4gICAgICAgIEFycm93RnVuY3Rpb246IDIsXG4gICAgICAgIExvZ2ljYWxPUjogMyxcbiAgICAgICAgTG9naWNhbEFORDogNCxcbiAgICAgICAgQml0d2lzZU9SOiA1LFxuICAgICAgICBCaXR3aXNlWE9SOiA2LFxuICAgICAgICBCaXR3aXNlQU5EOiA3LFxuICAgICAgICBFcXVhbGl0eTogOCxcbiAgICAgICAgUmVsYXRpb25hbDogOSxcbiAgICAgICAgQml0d2lzZVNISUZUOiAxMCxcbiAgICAgICAgQWRkaXRpdmU6IDExLFxuICAgICAgICBNdWx0aXBsaWNhdGl2ZTogMTIsXG4gICAgICAgIFVuYXJ5OiAxMyxcbiAgICAgICAgUG9zdGZpeDogMTQsXG4gICAgICAgIENhbGw6IDE1LFxuICAgICAgICBOZXc6IDE2LFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZTogMTcsXG4gICAgICAgIE1lbWJlcjogMTgsXG4gICAgICAgIFByaW1hcnk6IDE5XG4gICAgfTtcblxuICAgIEJpbmFyeVByZWNlZGVuY2UgPSB7XG4gICAgICAgICd8fCc6IFByZWNlZGVuY2UuTG9naWNhbE9SLFxuICAgICAgICAnJiYnOiBQcmVjZWRlbmNlLkxvZ2ljYWxBTkQsXG4gICAgICAgICd8JzogUHJlY2VkZW5jZS5CaXR3aXNlT1IsXG4gICAgICAgICdeJzogUHJlY2VkZW5jZS5CaXR3aXNlWE9SLFxuICAgICAgICAnJic6IFByZWNlZGVuY2UuQml0d2lzZUFORCxcbiAgICAgICAgJz09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJyE9JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJz09PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICchPT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnaXMnOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnaXNudCc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICc8JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPic6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJzw9JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPj0nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICdpbic6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJ2luc3RhbmNlb2YnOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc8PCc6IFByZWNlZGVuY2UuQml0d2lzZVNISUZULFxuICAgICAgICAnPj4nOiBQcmVjZWRlbmNlLkJpdHdpc2VTSElGVCxcbiAgICAgICAgJz4+Pic6IFByZWNlZGVuY2UuQml0d2lzZVNISUZULFxuICAgICAgICAnKyc6IFByZWNlZGVuY2UuQWRkaXRpdmUsXG4gICAgICAgICctJzogUHJlY2VkZW5jZS5BZGRpdGl2ZSxcbiAgICAgICAgJyonOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlLFxuICAgICAgICAnJSc6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICcvJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZVxuICAgIH07XG5cbiAgICAvL0ZsYWdzXG4gICAgdmFyIEZfQUxMT1dfSU4gPSAxLFxuICAgICAgICBGX0FMTE9XX0NBTEwgPSAxIDw8IDEsXG4gICAgICAgIEZfQUxMT1dfVU5QQVJBVEhfTkVXID0gMSA8PCAyLFxuICAgICAgICBGX0ZVTkNfQk9EWSA9IDEgPDwgMyxcbiAgICAgICAgRl9ESVJFQ1RJVkVfQ1RYID0gMSA8PCA0LFxuICAgICAgICBGX1NFTUlDT0xPTl9PUFQgPSAxIDw8IDU7XG5cbiAgICAvL0V4cHJlc3Npb24gZmxhZyBzZXRzXG4gICAgLy9OT1RFOiBGbGFnIG9yZGVyOlxuICAgIC8vIEZfQUxMT1dfSU5cbiAgICAvLyBGX0FMTE9XX0NBTExcbiAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FV1xuICAgIHZhciBFX0ZUVCA9IEZfQUxMT1dfQ0FMTCB8IEZfQUxMT1dfVU5QQVJBVEhfTkVXLFxuICAgICAgICBFX1RURiA9IEZfQUxMT1dfSU4gfCBGX0FMTE9XX0NBTEwsXG4gICAgICAgIEVfVFRUID0gRl9BTExPV19JTiB8IEZfQUxMT1dfQ0FMTCB8IEZfQUxMT1dfVU5QQVJBVEhfTkVXLFxuICAgICAgICBFX1RGRiA9IEZfQUxMT1dfSU4sXG4gICAgICAgIEVfRkZUID0gRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVEZUID0gRl9BTExPV19JTiB8IEZfQUxMT1dfVU5QQVJBVEhfTkVXO1xuXG4gICAgLy9TdGF0ZW1lbnQgZmxhZyBzZXRzXG4gICAgLy9OT1RFOiBGbGFnIG9yZGVyOlxuICAgIC8vIEZfQUxMT1dfSU5cbiAgICAvLyBGX0ZVTkNfQk9EWVxuICAgIC8vIEZfRElSRUNUSVZFX0NUWFxuICAgIC8vIEZfU0VNSUNPTE9OX09QVFxuICAgIHZhciBTX1RGRkYgPSBGX0FMTE9XX0lOLFxuICAgICAgICBTX1RGRlQgPSBGX0FMTE9XX0lOIHwgRl9TRU1JQ09MT05fT1BULFxuICAgICAgICBTX0ZGRkYgPSAweDAwLFxuICAgICAgICBTX1RGVEYgPSBGX0FMTE9XX0lOIHwgRl9ESVJFQ1RJVkVfQ1RYLFxuICAgICAgICBTX1RURkYgPSBGX0FMTE9XX0lOIHwgRl9GVU5DX0JPRFk7XG5cbiAgICBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgICAgICAgLy8gZGVmYXVsdCBvcHRpb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRlbnQ6IG51bGwsXG4gICAgICAgICAgICBiYXNlOiBudWxsLFxuICAgICAgICAgICAgcGFyc2U6IG51bGwsXG4gICAgICAgICAgICBjb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgIGluZGVudDoge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJyAgICAnLFxuICAgICAgICAgICAgICAgICAgICBiYXNlOiAwLFxuICAgICAgICAgICAgICAgICAgICBhZGp1c3RNdWx0aWxpbmVDb21tZW50OiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3bGluZTogJ1xcbicsXG4gICAgICAgICAgICAgICAgc3BhY2U6ICcgJyxcbiAgICAgICAgICAgICAgICBqc29uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW51bWJlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgaGV4YWRlY2ltYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHF1b3RlczogJ3NpbmdsZScsXG4gICAgICAgICAgICAgICAgZXNjYXBlbGVzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29tcGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcGFyZW50aGVzZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VtaWNvbG9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgcHJlc2VydmVCbGFua0xpbmVzOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vejoge1xuICAgICAgICAgICAgICAgIGNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0YXJsZXNzR2VuZXJhdG9yOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvdXJjZU1hcDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZU1hcFJvb3Q6IG51bGwsXG4gICAgICAgICAgICBzb3VyY2VNYXBXaXRoQ29kZTogZmFsc2UsXG4gICAgICAgICAgICBkaXJlY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgcmF3OiB0cnVlLFxuICAgICAgICAgICAgdmVyYmF0aW06IG51bGwsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nUmVwZWF0KHN0ciwgbnVtKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcblxuICAgICAgICBmb3IgKG51bSB8PSAwOyBudW0gPiAwOyBudW0gPj4+PSAxLCBzdHIgKz0gc3RyKSB7XG4gICAgICAgICAgICBpZiAobnVtICYgMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShhcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnJheSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHJldHVybiAoL1tcXHJcXG5dL2cpLnRlc3Qoc3RyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHN0cikge1xuICAgICAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbiAmJiBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChsZW4gLSAxKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVEZWVwbHkodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5LCB2YWw7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNIYXNoT2JqZWN0KHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIHRhcmdldCBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvdmVycmlkZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNIYXNoT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVlcGx5KHRhcmdldFtrZXldLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB1cGRhdGVEZWVwbHkoe30sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0LCBwb2ludCwgdGVtcCwgZXhwb25lbnQsIHBvcztcblxuICAgICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBOYU4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdW1lcmljIGxpdGVyYWwgd2hvc2UgdmFsdWUgaXMgbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMSAvIDApIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uID8gJ251bGwnIDogcmVudW1iZXIgPyAnMWU0MDAnIDogJzFlKzQwMCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSAnJyArIHZhbHVlO1xuICAgICAgICBpZiAoIXJlbnVtYmVyIHx8IHJlc3VsdC5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnQgPSByZXN1bHQuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoIWpzb24gJiYgcmVzdWx0LmNoYXJDb2RlQXQoMCkgPT09IDB4MzAgIC8qIDAgKi8gJiYgcG9pbnQgPT09IDEpIHtcbiAgICAgICAgICAgIHBvaW50ID0gMDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnZSsnLCAnZScpO1xuICAgICAgICBleHBvbmVudCA9IDA7XG4gICAgICAgIGlmICgocG9zID0gdGVtcC5pbmRleE9mKCdlJykpID4gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgPSArdGVtcC5zbGljZShwb3MgKyAxKTtcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvaW50ID49IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHRlbXAubGVuZ3RoIC0gcG9pbnQgLSAxO1xuICAgICAgICAgICAgdGVtcCA9ICsodGVtcC5zbGljZSgwLCBwb2ludCkgKyB0ZW1wLnNsaWNlKHBvaW50ICsgMSkpICsgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gMDtcbiAgICAgICAgd2hpbGUgKHRlbXAuY2hhckNvZGVBdCh0ZW1wLmxlbmd0aCArIHBvcyAtIDEpID09PSAweDMwICAvKiAwICovKSB7XG4gICAgICAgICAgICAtLXBvcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zICE9PSAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCAtPSBwb3M7XG4gICAgICAgICAgICB0ZW1wID0gdGVtcC5zbGljZSgwLCBwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvbmVudCAhPT0gMCkge1xuICAgICAgICAgICAgdGVtcCArPSAnZScgKyBleHBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRlbXAubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAoaGV4YWRlY2ltYWwgJiYgdmFsdWUgPiAxZTEyICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSAmJiAodGVtcCA9ICcweCcgKyB2YWx1ZS50b1N0cmluZygxNikpLmxlbmd0aCA8IHJlc3VsdC5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICt0ZW1wID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgdmFsaWQgUmVnRXhwIGV4cHJlc3Npb24uXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vQ29uc3RlbGxhdGlvbi9pdiBFbmdpbmVcblxuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAvLyBub3QgaGFuZGxpbmcgJ1xcJyBhbmQgaGFuZGxpbmcgXFx1MjAyOCBvciBcXHUyMDI5IHRvIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlXG4gICAgICAgIGlmICgoY2ggJiB+MSkgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJ3UnIDogJ1xcXFx1JykgKyAoKGNoID09PSAweDIwMjgpID8gJzIwMjgnIDogJzIwMjknKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMTAgfHwgY2ggPT09IDEzKSB7ICAvLyBcXG4sIFxcclxuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJycgOiAnXFxcXCcpICsgKChjaCA9PT0gMTApID8gJ24nIDogJ3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSZWdFeHAocmVnKSB7XG4gICAgICAgIHZhciBtYXRjaCwgcmVzdWx0LCBmbGFncywgaSwgaXosIGNoLCBjaGFyYWN0ZXJJbkJyYWNrLCBwcmV2aW91c0lzQmFja3NsYXNoO1xuXG4gICAgICAgIHJlc3VsdCA9IHJlZy50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChyZWcuc291cmNlKSB7XG4gICAgICAgICAgICAvLyBleHRyYWN0IGZsYWcgZnJvbSB0b1N0cmluZyByZXN1bHRcbiAgICAgICAgICAgIG1hdGNoID0gcmVzdWx0Lm1hdGNoKC9cXC8oW14vXSopJC8pO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsYWdzID0gbWF0Y2hbMV07XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcblxuICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSByZWcuc291cmNlLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHJlZy5zb3VyY2UuY2hhckNvZGVBdChpKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVySW5CcmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA5MykgeyAgLy8gXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gNDcpIHsgIC8vIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gOTEpIHsgIC8vIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGNoID09PSA5MjsgIC8vIFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmV3IFJlZ0V4cChcIlxcXFxcXG4nKSBpcyBwcm92aWRlZCwgY3JlYXRlIC9cXG4vXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGxpa2UgL1xcXFxbL10vXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNCYWNrc2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnLycgKyByZXN1bHQgKyAnLycgKyBmbGFncztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlQWxsb3dlZENoYXJhY3Rlcihjb2RlLCBuZXh0KSB7XG4gICAgICAgIHZhciBoZXg7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDggIC8qIFxcYiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcYic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQyAgLyogXFxmICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxmJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDA5ICAvKiBcXHQgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaGV4ID0gY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGpzb24gfHwgY29kZSA+IDB4RkYpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUnICsgJzAwMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwMCAmJiAhZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KG5leHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwwJztcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwMEIgIC8qIFxcdiAqLykgeyAvLyAnXFx2J1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceDBCJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHgnICsgJzAwJy5zbGljZShoZXgubGVuZ3RoKSArIGhleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gMHg1QyAgLyogXFwgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MEEgIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwRCAgLyogXFxyICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjgpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI5JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0bHkgY2xhc3NpZmllZCBjaGFyYWN0ZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVEaXJlY3RpdmUoc3RyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY29kZSwgcXVvdGU7XG5cbiAgICAgICAgcXVvdGUgPSBxdW90ZXMgPT09ICdkb3VibGUnID8gJ1wiJyA6ICdcXCcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0ci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1wiJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAgLyogXCIgKi8pIHtcbiAgICAgICAgICAgICAgICBxdW90ZSA9ICdcXCcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdW90ZSArIHN0ciArIHF1b3RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnLCBpLCBsZW4sIGNvZGUsIHNpbmdsZVF1b3RlcyA9IDAsIGRvdWJsZVF1b3RlcyA9IDAsIHNpbmdsZSwgcXVvdGU7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgICsrc2luZ2xlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgICsrZG91YmxlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJGICAvKiAvICovICYmIGpzb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKSB8fCBjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVEaXNhbGxvd2VkQ2hhcmFjdGVyKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUoY29kZSkgJiYgKGpzb24gJiYgY29kZSA8IDB4MjAgIC8qIFNQICovIHx8ICFqc29uICYmICFlc2NhcGVsZXNzICYmIChjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgY29kZSA+IDB4N0UgIC8qIH4gKi8pKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIHN0ci5jaGFyQ29kZUF0KGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpbmdsZSA9ICEocXVvdGVzID09PSAnZG91YmxlJyB8fCAocXVvdGVzID09PSAnYXV0bycgJiYgZG91YmxlUXVvdGVzIDwgc2luZ2xlUXVvdGVzKSk7XG4gICAgICAgIHF1b3RlID0gc2luZ2xlID8gJ1xcJycgOiAnXCInO1xuXG4gICAgICAgIGlmICghKHNpbmdsZSA/IHNpbmdsZVF1b3RlcyA6IGRvdWJsZVF1b3RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBxdW90ZSArIHJlc3VsdCArIHF1b3RlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICgoY29kZSA9PT0gMHgyNyAgLyogJyAqLyAmJiBzaW5nbGUpIHx8IChjb2RlID09PSAweDIyICAvKiBcIiAqLyAmJiAhc2luZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgKyBxdW90ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmbGF0dGVuIGFuIGFycmF5IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgYXJyYXkgY2FuIGNvbnRhaW5cbiAgICAgKiBlaXRoZXIgc3RyaW5ncyBvciBuZXN0ZWQgYXJyYXlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlblRvU3RyaW5nKGFycikge1xuICAgICAgICB2YXIgaSwgaXosIGVsZW0sIHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGFyci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBlbGVtID0gYXJyW2ldO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlzQXJyYXkoZWxlbSkgPyBmbGF0dGVuVG9TdHJpbmcoZWxlbSkgOiBlbGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnZW5lcmF0ZWQgdG8gYSBTb3VyY2VOb2RlIHdoZW4gc291cmNlIG1hcHMgYXJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChnZW5lcmF0ZWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIC8vIHdpdGggbm8gc291cmNlIG1hcHMsIGdlbmVyYXRlZCBpcyBlaXRoZXIgYW5cbiAgICAgICAgICAgIC8vIGFycmF5IG9yIGEgc3RyaW5nLiAgaWYgYW4gYXJyYXksIGZsYXR0ZW4gaXQuXG4gICAgICAgICAgICAvLyBpZiBhIHN0cmluZywganVzdCByZXR1cm4gaXRcbiAgICAgICAgICAgIGlmIChpc0FycmF5KGdlbmVyYXRlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblRvU3RyaW5nKGdlbmVyYXRlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubG9jID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShudWxsLCBudWxsLCBzb3VyY2VNYXAsIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShub2RlLmxvYy5zdGFydC5saW5lLCBub2RlLmxvYy5zdGFydC5jb2x1bW4sIChzb3VyY2VNYXAgPT09IHRydWUgPyBub2RlLmxvYy5zb3VyY2UgfHwgbnVsbCA6IHNvdXJjZU1hcCksIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vRW1wdHlTcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIChzcGFjZSkgPyBzcGFjZSA6ICcgJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqb2luKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHZhciBsZWZ0U291cmNlLFxuICAgICAgICAgICAgcmlnaHRTb3VyY2UsXG4gICAgICAgICAgICBsZWZ0Q2hhckNvZGUsXG4gICAgICAgICAgICByaWdodENoYXJDb2RlO1xuXG4gICAgICAgIGxlZnRTb3VyY2UgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGxlZnQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChsZWZ0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtyaWdodF07XG4gICAgICAgIH1cblxuICAgICAgICByaWdodFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmlnaHQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyaWdodFNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbbGVmdF07XG4gICAgICAgIH1cblxuICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgcmlnaHRDaGFyQ29kZSA9IHJpZ2h0U291cmNlLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYgKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUgfHxcbiAgICAgICAgICAgIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSA9PT0gMHgyRiAgLyogLyAqLyAmJiByaWdodENoYXJDb2RlID09PSAweDY5ICAvKiBpICovKSB7IC8vIGluZml4IHdvcmQgb3BlcmF0b3JzIGFsbCBzdGFydCB3aXRoIGBpYFxuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCBub0VtcHR5U3BhY2UoKSwgcmlnaHRdO1xuICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGVmdENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihsZWZ0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShyaWdodENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihyaWdodENoYXJDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCByaWdodF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsZWZ0LCBzcGFjZSwgcmlnaHRdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEluZGVudChzdG10KSB7XG4gICAgICAgIHJldHVybiBbYmFzZSwgc3RtdF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2l0aEluZGVudChmbikge1xuICAgICAgICB2YXIgcHJldmlvdXNCYXNlO1xuICAgICAgICBwcmV2aW91c0Jhc2UgPSBiYXNlO1xuICAgICAgICBiYXNlICs9IGluZGVudDtcbiAgICAgICAgZm4oYmFzZSk7XG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlU3BhY2VzKHN0cikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3Ioc3RyLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzdHIubGVuZ3RoIC0gMSkgLSBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkanVzdE11bHRpbGluZUNvbW1lbnQodmFsdWUsIHNwZWNpYWxCYXNlKSB7XG4gICAgICAgIHZhciBhcnJheSwgaSwgbGVuLCBsaW5lLCBqLCBzcGFjZXMsIHByZXZpb3VzQmFzZSwgc247XG5cbiAgICAgICAgYXJyYXkgPSB2YWx1ZS5zcGxpdCgvXFxyXFxufFtcXHJcXG5dLyk7XG4gICAgICAgIHNwYWNlcyA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgLy8gZmlyc3QgbGluZSBkb2Vzbid0IGhhdmUgaW5kZW50YXRpb25cbiAgICAgICAgZm9yIChpID0gMSwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGxpbmUgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsaW5lLmxlbmd0aCAmJiBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICArK2o7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BhY2VzID4gaikge1xuICAgICAgICAgICAgICAgIHNwYWNlcyA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNwZWNpYWxCYXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gcGF0dGVybiBsaWtlXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgIHZhciB0ID0gMjA7ICAvKlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICogdGhpcyBpcyBjb21tZW50XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgICAgICBpZiAoYXJyYXlbMV1bc3BhY2VzXSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgKz0gJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFzZSA9IHNwZWNpYWxCYXNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNwYWNlcyAmIDEpIHtcbiAgICAgICAgICAgICAgICAvLyAvKlxuICAgICAgICAgICAgICAgIC8vICAqXG4gICAgICAgICAgICAgICAgLy8gICovXG4gICAgICAgICAgICAgICAgLy8gSWYgc3BhY2VzIGFyZSBvZGQgbnVtYmVyLCBhYm92ZSBwYXR0ZXJuIGlzIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgLy8gV2Ugd2FzdGUgMSBzcGFjZS5cbiAgICAgICAgICAgICAgICAtLXNwYWNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgc24gPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGFkZEluZGVudChhcnJheVtpXS5zbGljZShzcGFjZXMpKSk7XG4gICAgICAgICAgICBhcnJheVtpXSA9IHNvdXJjZU1hcCA/IHNuLmpvaW4oJycpIDogc247XG4gICAgICAgIH1cblxuICAgICAgICBiYXNlID0gcHJldmlvdXNCYXNlO1xuXG4gICAgICAgIHJldHVybiBhcnJheS5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgaWYgKGNvbW1lbnQudHlwZSA9PT0gJ0xpbmUnKSB7XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGhMaW5lVGVybWluYXRvcihjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVzZSBMaW5lVGVybWluYXRvclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dHJhLmZvcm1hdC5pbmRlbnQuYWRqdXN0TXVsdGlsaW5lQ29tbWVudCAmJiAvW1xcblxccl0vLnRlc3QoY29tbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGp1c3RNdWx0aWxpbmVDb21tZW50KCcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJywgc3BlY2lhbEJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnLyonICsgY29tbWVudC52YWx1ZSArICcqLyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ29tbWVudHMoc3RtdCwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBpLCBsZW4sIGNvbW1lbnQsIHNhdmUsIHRhaWxpbmdUb1N0YXRlbWVudCwgc3BlY2lhbEJhc2UsIGZyYWdtZW50LFxuICAgICAgICAgICAgZXh0UmFuZ2UsIHJhbmdlLCBwcmV2UmFuZ2UsIHByZWZpeCwgaW5maXgsIHN1ZmZpeCwgY291bnQ7XG5cbiAgICAgICAgaWYgKHN0bXQubGVhZGluZ0NvbW1lbnRzICYmIHN0bXQubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNhdmUgPSByZXN1bHQ7XG5cbiAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaW5maXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhwcmV2UmFuZ2VbMV0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnQgPSAoaW5maXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcblxuICAgICAgICAgICAgICAgICAgICBwcmV2UmFuZ2UgPSByYW5nZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdWZmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVsxXSwgZXh0UmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHN1ZmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RyaW5nUmVwZWF0KCdcXG4nLCBjb3VudCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHNhZmVDb25jYXRlbmF0aW9uICYmIHN0bXQudHlwZSA9PT0gU3ludGF4LlByb2dyYW0gJiYgc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChmcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHNhdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnRyYWlsaW5nQ29tbWVudHMpIHtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgZXh0UmFuZ2UgPSBjb21tZW50LmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBjb21tZW50LnJhbmdlO1xuXG4gICAgICAgICAgICAgICAgcHJlZml4ID0gc291cmNlQ29kZS5zdWJzdHJpbmcoZXh0UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICBjb3VudCA9IChwcmVmaXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFpbGluZ1RvU3RhdGVtZW50ID0gIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHNwZWNpYWxCYXNlID0gc3RyaW5nUmVwZWF0KCcgJywgY2FsY3VsYXRlU3BhY2VzKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoW2Jhc2UsIHJlc3VsdCwgaW5kZW50XSkudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0bXQudHJhaWxpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFpbGluZ1RvU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGFyZ2V0IGxpa2UgZm9sbG93aW5nIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gMjA7ICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnQgb2YgdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgaW5kZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgc3BlY2lhbEJhc2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQsIHNwZWNpYWxCYXNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBhZGRJbmRlbnQoZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGxlbiAtIDEgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCAnXFxuJ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQmxhbmtMaW5lcyhzdGFydCwgZW5kLCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGosIG5ld2xpbmVDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvZGVbal0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgbmV3bGluZUNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgbmV3bGluZUNvdW50OyBqKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyZW50aGVzaXplKHRleHQsIGN1cnJlbnQsIHNob3VsZCkge1xuICAgICAgICBpZiAoY3VycmVudCA8IHNob3VsZCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHRleHQsICcpJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyhzdHJpbmcpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHN0cmluZy5zcGxpdCgvXFxyXFxufFxcbi8pO1xuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpejsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBuZXdsaW5lICsgYmFzZSArIHJlc3VsdFtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVmVyYmF0aW0oZXhwciwgcHJlY2VkZW5jZSkge1xuICAgICAgICB2YXIgdmVyYmF0aW0sIHJlc3VsdCwgcHJlYztcbiAgICAgICAgdmVyYmF0aW0gPSBleHByW2V4dHJhLnZlcmJhdGltXTtcblxuICAgICAgICBpZiAodHlwZW9mIHZlcmJhdGltID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKGdlbmVyYXRlVmVyYmF0aW1TdHJpbmcodmVyYmF0aW0pLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZlcmJhdGltIGlzIG9iamVjdFxuICAgICAgICAgICAgcmVzdWx0ID0gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbS5jb250ZW50KTtcbiAgICAgICAgICAgIHByZWMgPSAodmVyYmF0aW0ucHJlY2VkZW5jZSAhPSBudWxsKSA/IHZlcmJhdGltLnByZWNlZGVuY2UgOiBQcmVjZWRlbmNlLlNlcXVlbmNlO1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKHJlc3VsdCwgcHJlYywgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIGV4cHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvZGVHZW5lcmF0b3IoKSB7XG4gICAgfVxuXG4gICAgLy8gSGVscGVycy5cblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLm1heWJlQmxvY2sgPSBmdW5jdGlvbihzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LCBub0xlYWRpbmdDb21tZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICBub0xlYWRpbmdDb21tZW50ID0gIWV4dHJhLmNvbW1lbnQgfHwgIXN0bXQubGVhZGluZ0NvbW1lbnRzO1xuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5CbG9ja1N0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW3NwYWNlLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQsIGZsYWdzKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguRW1wdHlTdGF0ZW1lbnQgJiYgbm9MZWFkaW5nQ29tbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfVxuXG4gICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIG5ld2xpbmUsXG4gICAgICAgICAgICAgICAgYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9ja1N1ZmZpeCA9IGZ1bmN0aW9uIChzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGVuZHMgPSBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmICghZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHMpICYmICFlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgc3BhY2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgYmFzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHQsIG5ld2xpbmUsIGJhc2VdO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZSkge1xuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChub2RlLm5hbWUsIG5vZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgc3BhY2VSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbm9kZS5hc3luYyA/ICdhc3luYycgKyAoc3BhY2VSZXF1aXJlZCA/IG5vRW1wdHlTcGFjZSgpIDogc3BhY2UpIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVTdGFyU3VmZml4KG5vZGUpIHtcbiAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gbm9kZS5nZW5lcmF0b3IgJiYgIWV4dHJhLm1vei5zdGFybGVzc0dlbmVyYXRvcjtcbiAgICAgICAgcmV0dXJuIGlzR2VuZXJhdG9yID8gJyonICsgc3BhY2UgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU1ldGhvZFByZWZpeChwcm9wKSB7XG4gICAgICAgIHZhciBmdW5jID0gcHJvcC52YWx1ZTtcbiAgICAgICAgaWYgKGZ1bmMuYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUFzeW5jUHJlZml4KGZ1bmMsICFwcm9wLmNvbXB1dGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHNwYWNlIGJlZm9yZSBtZXRob2QgbmFtZVxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlU3RhclN1ZmZpeChmdW5jKSA/ICcqJyA6ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVQYXR0ZXJuID0gZnVuY3Rpb24gKG5vZGUsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdCwgaGFzRGVmYXVsdDtcblxuICAgICAgICBoYXNEZWZhdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgIW5vZGUucmVzdCAmJiAoIW5vZGUuZGVmYXVsdHMgfHwgbm9kZS5kZWZhdWx0cy5sZW5ndGggPT09IDApICYmXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBhcmcgPT4geyB9IGNhc2VcbiAgICAgICAgICAgIHJlc3VsdCA9IFtnZW5lcmF0ZUFzeW5jUHJlZml4KG5vZGUsIHRydWUpLCBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZS5wYXJhbXNbMF0pXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uID8gW2dlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgZmFsc2UpXSA6IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IG5vZGUucGFyYW1zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVmYXVsdCAmJiBub2RlLmRlZmF1bHRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQobm9kZS5wYXJhbXNbaV0sIG5vZGUuZGVmYXVsdHNbaV0sICc9JywgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKG5vZGUucGFyYW1zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnJlc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihub2RlLnJlc3QpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25Cb2R5ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgZXhwcjtcblxuICAgICAgICByZXN1bHQgPSB0aGlzLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnPT4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIGV4cHIgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuICAgICAgICAgICAgaWYgKGV4cHIudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgIGV4cHIgPSBbJygnLCBleHByLCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2sobm9kZS5ib2R5LCBTX1RURkYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKG9wZXJhdG9yLCBzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gWydmb3InICsgc3BhY2UgKyAnKCddLCB0aGF0ID0gdGhpcztcbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sZWZ0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0bXQubGVmdC5raW5kICsgbm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRikpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmxlZnQsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIG9wZXJhdG9yKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtqb2luKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnJpZ2h0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICksICcpJ107XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVByb3BlcnR5S2V5ID0gZnVuY3Rpb24gKGV4cHIsIGNvbXB1dGVkKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdbJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUFzc2lnbm1lbnQgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIG9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICBpZiAoUHJlY2VkZW5jZS5Bc3NpZ25tZW50IDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBmbGFncyksXG4gICAgICAgICAgICAgICAgc3BhY2UgKyBvcGVyYXRvciArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHJpZ2h0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFByZWNlZGVuY2UuQXNzaWdubWVudCxcbiAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuc2VtaWNvbG9uID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIGlmICghc2VtaWNvbG9ucyAmJiBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnOyc7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlbWVudHMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudCA9IHtcblxuICAgICAgICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UsIGNvbnRlbnQsIHJlc3VsdCA9IFsneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGZ1bmN0aW9ucyB3aXRob3V0IGFueSBjb2RlXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keS5sZW5ndGggPT09IDAgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5yYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWzFdIC0gcmFuZ2VbMF0gPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0gKyAxLCByYW5nZVsxXSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyd7J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBpLCBpeiwgZnJhZ21lbnQsIGJvZHlGbGFncztcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9GVU5DX0JPRFkpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfRElSRUNUSVZFX0NUWDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuYm9keS5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50c1swXS5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVswXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSAtIDFdLnRyYWlsaW5nQ29tbWVudHMgICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaSAtIDFdLnJhbmdlWzFdLCBzdG10LmJvZHlbaV0ucmFuZ2VbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzICYmIHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keVtpXSwgYm9keUZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzICYmIGkgPCBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgYSBuZXcgbGluZSBpZiB0aGVyZSBhcmUgbGVhZGluZyBjb21lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG5leHQgc3RhdGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBhZnRlciB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaV0udHJhaWxpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2ldLnJhbmdlWzFdLCBzdG10LnJhbmdlWzFdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoJ30nKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdicmVhayAnICsgc3RtdC5sYWJlbC5uYW1lICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICdicmVhaycgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0JvZHk6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lXSwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBpejtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ib2R5W2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgcmVzdWx0ICA9IFsnY2xhc3MgJyArIHN0bXQuaWQubmFtZV07XG4gICAgICAgICAgICBpZiAoc3RtdC5zdXBlckNsYXNzKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKCdleHRlbmRzJywgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zdXBlckNsYXNzLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5LCBTX1RGRlQpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGlyZWN0aXZlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHRyYS5yYXcgJiYgc3RtdC5yYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RtdC5yYXcgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXNjYXBlRGlyZWN0aXZlKHN0bXQuZGlyZWN0aXZlKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgYGRvIDQyIHdoaWxlIChjb25kKWAgaXMgU3ludGF4IEVycm9yLiBXZSBuZWVkIHNlbWljb2xvbi5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKCdkbycsIHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIFNfVEZGRikpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICd3aGlsZScgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAnKScgKyB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIENhdGNoQ2xhdXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGd1YXJkO1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnY2F0Y2gnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucGFyYW0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGlmIChzdG10Lmd1YXJkKSB7XG4gICAgICAgICAgICAgICAgICAgIGd1YXJkID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ndWFyZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3BsaWNlKDIsIDAsICcgaWYgJywgZ3VhcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgU19URkZGKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIERlYnVnZ2VyU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnZGVidWdnZXInICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEVtcHR5U3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnOyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbICdleHBvcnQnIF0sIGJvZHlGbGFncztcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSA/IFNfVEZGVCA6IFNfVEZGRjtcblxuICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgSG9pc3RhYmxlRGVjbGFyYXRpb25bRGVmYXVsdF1cbiAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IEFzc2lnbm1lbnRFeHByZXNzaW9uW0luXSA7XG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ2RlZmF1bHQnKTtcbiAgICAgICAgICAgIGlmIChpc1N0YXRlbWVudChzdG10LmRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5kZWNsYXJhdGlvbiwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkgKyB0aGlzLnNlbWljb2xvbihmbGFncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbICdleHBvcnQnIF0sIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkgPyBTX1RGRlQgOiBTX1RGRkY7XG5cbiAgICAgICAgICAgIC8vIGV4cG9ydCBWYXJpYWJsZVN0YXRlbWVudFxuICAgICAgICAgICAgLy8gZXhwb3J0IERlY2xhcmF0aW9uW0RlZmF1bHRdXG4gICAgICAgICAgICBpZiAoc3RtdC5kZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmRlY2xhcmF0aW9uLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXhwb3J0IEV4cG9ydENsYXVzZVtOb1JlZmVyZW5jZV0gRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICAvLyBleHBvcnQgRXhwb3J0Q2xhdXNlIDtcbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ3snICsgc3BhY2UgKyAnfScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RtdC5zcGVjaWZpZXJzWzBdLnR5cGUgPT09IFN5bnRheC5FeHBvcnRCYXRjaFNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzWzBdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAneycpO1xuICAgICAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LnNwZWNpZmllcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UgKyAnfScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIGV4cG9ydCAqIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnZXhwb3J0JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICcqJyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICdmcm9tJyArIHNwYWNlLFxuICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQ2xhc3NQcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlO1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZSgwLCA1KSAhPT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGUgPSBmcmFnbWVudC5jaGFyQ29kZUF0KDUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDdCICAvKiAneycgKi8gfHwgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNGdW5jdGlvblByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGU7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKDAsIDgpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoOCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4MjggLyogJygnICovIHx8IGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY29kZSkgfHwgY29kZSA9PT0gMHgyQSAgLyogJyonICovIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0FzeW5jUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZSwgaSwgaXo7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKDAsIDUpICE9PSAnYXN5bmMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGZyYWdtZW50LmNoYXJDb2RlQXQoNSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChpID0gNiwgaXogPSBmcmFnbWVudC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShmcmFnbWVudC5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKGksIGkgKyA4KSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGUgPSBmcmFnbWVudC5jaGFyQ29kZUF0KGkgKyA4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHgyOCAvKiAnKCcgKi8gfHwgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjb2RlKSB8fCBjb2RlID09PSAweDJBICAvKiAnKicgKi8gfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFt0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmV4cHJlc3Npb24sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKV07XG4gICAgICAgICAgICAvLyAxMi40ICd7JywgJ2Z1bmN0aW9uJywgJ2NsYXNzJyBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHBvc2l0aW9uLlxuICAgICAgICAgICAgLy8gd3JhcCBleHByZXNzaW9uIHdpdGggcGFyZW50aGVzZXNcbiAgICAgICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoZnJhZ21lbnQuY2hhckNvZGVBdCgwKSA9PT0gMHg3QiAgLyogJ3snICovIHx8ICAvLyBPYmplY3RFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NQcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvblByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICBpc0FzeW5jUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3RpdmUgJiYgKGZsYWdzICYgRl9ESVJFQ1RJVkVfQ1RYKSAmJiBzdG10LmV4cHJlc3Npb24udHlwZSA9PT0gU3ludGF4LkxpdGVyYWwgJiYgdHlwZW9mIHN0bXQuZXhwcmVzc2lvbi52YWx1ZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWycoJywgcmVzdWx0LCAnKScgKyB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbWljb2xvbihmbGFncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBFUzY6IDE1LjIuMSB2YWxpZCBpbXBvcnQgZGVjbGFyYXRpb25zOlxuICAgICAgICAgICAgLy8gICAgIC0gaW1wb3J0IEltcG9ydENsYXVzZSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIC8vICAgICAtIGltcG9ydCBNb2R1bGVTcGVjaWZpZXIgO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgY3Vyc29yLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgLy8gSWYgbm8gSW1wb3J0Q2xhdXNlIGlzIHByZXNlbnQsXG4gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSBgaW1wb3J0IE1vZHVsZVNwZWNpZmllcmAgc28gc2tpcCBgZnJvbWBcbiAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllciBpcyBTdHJpbmdMaXRlcmFsLlxuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyIDtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAnaW1wb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbXBvcnQgSW1wb3J0Q2xhdXNlIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICdpbXBvcnQnXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY3Vyc29yID0gMDtcblxuICAgICAgICAgICAgLy8gSW1wb3J0ZWRCaW5kaW5nXG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0udHlwZSA9PT0gU3ludGF4LkltcG9ydERlZmF1bHRTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICsrY3Vyc29yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0pIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLnR5cGUgPT09IFN5bnRheC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmFtZVNwYWNlSW1wb3J0XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYW1lZEltcG9ydHNcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAneycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoc3RtdC5zcGVjaWZpZXJzLmxlbmd0aCAtIGN1cnNvcikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCB7IC4uLiB9IGZyb20gXCIuLi5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAnfScgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgLi4uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgLi4uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBmcm9tIFwiLi4uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gY3Vyc29yLCBpeiA9IHN0bXQuc3BlY2lmaWVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiYXNlICsgJ30nICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICdmcm9tJyArIHNwYWNlLFxuICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpdGVtRmxhZ3MgPSAoZmxhZ3MgJiBGX0FMTE9XX0lOKSA/IEVfVFRUIDogRV9GVFQ7XG4gICAgICAgICAgICBpZiAoc3RtdC5pbml0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5pZCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgJz0nLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5pbml0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncylcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKHN0bXQuaWQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlRGVjbGFyYXRvciBpcyB0eXBlZCBhcyBTdGF0ZW1lbnQsXG4gICAgICAgICAgICAvLyBidXQgam9pbmVkIHdpdGggY29tbWEgKG5vdCBMaW5lVGVybWluYXRvcikuXG4gICAgICAgICAgICAvLyBTbyBpZiBjb21tZW50IGlzIGF0dGFjaGVkIHRvIHRhcmdldCBub2RlLCB3ZSBzaG91bGQgc3BlY2lhbGl6ZS5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBub2RlLCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBbIHN0bXQua2luZCBdO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX0FMTE9XX0lOKSA/IFNfVEZGRiA6IFNfRkZGRjtcblxuICAgICAgICAgICAgZnVuY3Rpb24gYmxvY2soKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHN0bXQuZGVjbGFyYXRpb25zWzBdO1xuICAgICAgICAgICAgICAgIGlmIChleHRyYS5jb21tZW50ICYmIG5vZGUubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IHN0bXQuZGVjbGFyYXRpb25zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHN0bXQuZGVjbGFyYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmEuY29tbWVudCAmJiBub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RtdC5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoYmxvY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBibG9jaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbWljb2xvbihmbGFncykpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRocm93U3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbam9pbihcbiAgICAgICAgICAgICAgICAndGhyb3cnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuYXJndW1lbnQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKVxuICAgICAgICAgICAgKSwgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBUcnlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIGd1YXJkZWRIYW5kbGVycztcblxuICAgICAgICAgICAgcmVzdWx0ID0gWyd0cnknLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ibG9jaywgU19URkZGKV07XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5ibG9jaywgcmVzdWx0KTtcblxuICAgICAgICAgICAgaWYgKHN0bXQuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAvLyBvbGQgaW50ZXJmYWNlXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmhhbmRsZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5oYW5kbGVyc1tpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmhhbmRsZXJzW2ldLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGd1YXJkZWRIYW5kbGVycyA9IHN0bXQuZ3VhcmRlZEhhbmRsZXJzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBndWFyZGVkSGFuZGxlcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChndWFyZGVkSGFuZGxlcnNbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIgfHwgaSArIDEgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoZ3VhcmRlZEhhbmRsZXJzW2ldLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBuZXcgaW50ZXJmYWNlXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzdG10LmhhbmRsZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuaGFuZGxlci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5oYW5kbGVyW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIgfHwgaSArIDEgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmhhbmRsZXJbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXIsIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlci5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsnZmluYWxseScsIHRoaXMubWF5YmVCbG9jayhzdG10LmZpbmFsaXplciwgU19URkZGKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnc3dpdGNoJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmRpc2NyaW1pbmFudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKScgKyBzcGFjZSArICd7JyArIG5ld2xpbmVcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc3RtdC5jYXNlcykge1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuY2FzZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5jYXNlc1tpXSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCgnfScpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3dpdGNoQ2FzZTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC50ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJ2Nhc2UnLCB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnOidcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2RlZmF1bHQ6J107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICAgICAgaXogPSBzdG10LmNvbnNlcXVlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChpeiAmJiBzdG10LmNvbnNlcXVlbnRbMF0udHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5tYXliZUJsb2NrKHN0bXQuY29uc2VxdWVudFswXSwgU19URkZGKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSAmJiBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuY29uc2VxdWVudFtpXSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxICE9PSBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSWZTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgYm9keUZsYWdzLCBzZW1pY29sb25PcHRpb25hbCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdpZicgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbWljb2xvbk9wdGlvbmFsID0gZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICBpZiAoc2VtaWNvbG9uT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0bXQuYWx0ZXJuYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuY29uc2VxdWVudCwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuY29uc2VxdWVudCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5hbHRlcm5hdGUudHlwZSA9PT0gU3ludGF4LklmU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbJ2Vsc2UgJywgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmFsdGVybmF0ZSwgYm9keUZsYWdzKV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBqb2luKCdlbHNlJywgdGhpcy5tYXliZUJsb2NrKHN0bXQuYWx0ZXJuYXRlLCBib2R5RmxhZ3MpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50LCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9yU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWydmb3InICsgc3BhY2UgKyAnKCddO1xuICAgICAgICAgICAgICAgIGlmIChzdG10LmluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuaW5pdC50eXBlID09PSBTeW50YXguVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmluaXQsIFNfRkZGRikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRl9BTExPV19JTiBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5pbml0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX0ZUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudGVzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudXBkYXRlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvckluU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50KCdpbicsIHN0bXQsIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKTtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JPZlN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUl0ZXJhdGlvbkZvclN0YXRlbWVudCgnb2YnLCBzdG10LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3N0bXQubGFiZWwubmFtZSArICc6JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBQcm9ncmFtOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzO1xuICAgICAgICAgICAgaXogPSBzdG10LmJvZHkubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0ID0gW3NhZmVDb25jYXRlbmF0aW9uICYmIGl6ID4gMCA/ICdcXG4nIDogJyddO1xuICAgICAgICAgICAgYm9keUZsYWdzID0gU19URlRGO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNhZmVDb25jYXRlbmF0aW9uICYmIGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LnJhbmdlWzBdLCBzdG10LmJvZHlbaV0ucmFuZ2VbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGJldHdlZW4gbGluZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpIC0gMV0udHJhaWxpbmdDb21tZW50cyAmJiAhc3RtdC5ib2R5W2ldLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaSAtIDFdLnJhbmdlWzFdLCBzdG10LmJvZHlbaV0ucmFuZ2VbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGFkZEluZGVudCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keVtpXSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2kgKyAxXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGFmdGVyIHRoZSBsYXN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaV0udHJhaWxpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaV0ucmFuZ2VbMV0sIHN0bXQucmFuZ2VbMV0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFzeW5jUHJlZml4KHN0bXQsIHRydWUpLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVTdGFyU3VmZml4KHN0bXQpIHx8IG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgIHN0bXQuaWQgPyBnZW5lcmF0ZUlkZW50aWZpZXIoc3RtdC5pZCkgOiAnJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KHN0bXQpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIFJldHVyblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5hcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbam9pbihcbiAgICAgICAgICAgICAgICAgICAgJ3JldHVybicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuYXJndW1lbnQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKVxuICAgICAgICAgICAgICAgICksIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gWydyZXR1cm4nICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBXaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3doaWxlJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgV2l0aFN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3dpdGgnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQub2JqZWN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgbWVyZ2UoQ29kZUdlbmVyYXRvci5wcm90b3R5cGUsIENvZGVHZW5lcmF0b3IuU3RhdGVtZW50KTtcblxuICAgIC8vIEV4cHJlc3Npb25zLlxuXG4gICAgQ29kZUdlbmVyYXRvci5FeHByZXNzaW9uID0ge1xuXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpejtcbiAgICAgICAgICAgIGlmIChQcmVjZWRlbmNlLlNlcXVlbmNlIDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfQUxMT1dfSU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5leHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5leHByZXNzaW9uc1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncykpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KGV4cHIubGVmdCwgZXhwci5yaWdodCwgZXhwci5vcGVyYXRvciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUodGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShleHByKSwgUHJlY2VkZW5jZS5BcnJvd0Z1bmN0aW9uLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuQ29uZGl0aW9uYWwgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnRlc3QsIFByZWNlZGVuY2UuTG9naWNhbE9SLCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJz8nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY29uc2VxdWVudCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYWx0ZXJuYXRlLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5Db25kaXRpb25hbCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJpbmFyeUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEJpbmFyeUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgY3VycmVudFByZWNlZGVuY2UsIGZyYWdtZW50LCBsZWZ0U291cmNlO1xuICAgICAgICAgICAgY3VycmVudFByZWNlZGVuY2UgPSBCaW5hcnlQcmVjZWRlbmNlW2V4cHIub3BlcmF0b3JdO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFByZWNlZGVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmxlZnQsIGN1cnJlbnRQcmVjZWRlbmNlLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGxlZnRTb3VyY2UgPSBmcmFnbWVudC50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBpZiAobGVmdFNvdXJjZS5jaGFyQ29kZUF0KGxlZnRTb3VyY2UubGVuZ3RoIC0gMSkgPT09IDB4MkYgLyogLyAqLyAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShleHByLm9wZXJhdG9yLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW2ZyYWdtZW50LCBub0VtcHR5U3BhY2UoKSwgZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZnJhZ21lbnQsIGV4cHIub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucmlnaHQsIGN1cnJlbnRQcmVjZWRlbmNlICsgMSwgZmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJy8nICYmIGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnLycgfHxcbiAgICAgICAgICAgIGV4cHIub3BlcmF0b3Iuc2xpY2UoLTEpID09PSAnPCcgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5zbGljZSgwLCAzKSA9PT0gJyEtLScpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiAnLycgY29uY2F0cyB3aXRoICcvJyBvciBgPGAgY29uY2F0cyB3aXRoIGAhLS1gLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBjb21tZW50IHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IgPT09ICdpbicgJiYgIShmbGFncyAmIEZfQUxMT1dfSU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBjdXJyZW50UHJlY2VkZW5jZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY2FsbGVlLCBQcmVjZWRlbmNlLkNhbGwsIEVfVFRGKV07XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKCcpO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByWydhcmd1bWVudHMnXS5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwclsnYXJndW1lbnRzJ11baV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcblxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX0NBTEwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkNhbGwsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE5ld0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCBpLCBpeiwgaXRlbUZsYWdzO1xuICAgICAgICAgICAgbGVuZ3RoID0gZXhwclsnYXJndW1lbnRzJ10ubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX0NBTEwgYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIG1heSBiZWNvbWUgZmFsc2UuXG4gICAgICAgICAgICBpdGVtRmxhZ3MgPSAoZmxhZ3MgJiBGX0FMTE9XX1VOUEFSQVRIX05FVyAmJiAhcGFyZW50aGVzZXMgJiYgbGVuZ3RoID09PSAwKSA/IEVfVEZUIDogRV9URkY7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgJ25ldycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuTmV3LCBpdGVtRmxhZ3MpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfVU5QQVJBVEhfTkVXKSB8fCBwYXJlbnRoZXNlcyB8fCBsZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwclsnYXJndW1lbnRzJ11baV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5OZXcsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5vYmplY3QsIFByZWNlZGVuY2UuQ2FsbCwgKGZsYWdzICYgRl9BTExPV19DQUxMKSA/IEVfVFRGIDogRV9URkYpXTtcblxuICAgICAgICAgICAgaWYgKGV4cHIuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydHksIFByZWNlZGVuY2UuU2VxdWVuY2UsIGZsYWdzICYgRl9BTExPV19DQUxMID8gRV9UVFQgOiBFX1RGVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChleHByLm9iamVjdC50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2YgZXhwci5vYmplY3QudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhbGwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAxLiBObyBmbG9hdGluZyBwb2ludFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDIuIERvbid0IGhhdmUgZXhwb25lbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vICAgMy4gVGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgZGVjaW1hbCBkaWdpdFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDQuIE5vdCBoZXhhZGVjaW1hbCBPUiBvY3RhbCBudW1iZXIgbGl0ZXJhbFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRkIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5pbmRleE9mKCcuJykgPCAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bZUV4WF0vLnRlc3QoZnJhZ21lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KGZyYWdtZW50LmNoYXJDb2RlQXQoZnJhZ21lbnQubGVuZ3RoIC0gMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShmcmFnbWVudC5sZW5ndGggPj0gMiAmJiBmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSA0OCkgIC8vICcwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihleHByLnByb3BlcnR5KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTWV0YVByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGV4cHIubWV0YSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnLicpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwci5wcm9wZXJ0eSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5NZW1iZXIsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFVuYXJ5RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgcmlnaHRDaGFyQ29kZSwgbGVmdFNvdXJjZSwgbGVmdENoYXJDb2RlO1xuICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVCk7XG5cbiAgICAgICAgICAgIGlmIChzcGFjZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKGV4cHIub3BlcmF0b3IsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW2V4cHIub3BlcmF0b3JdO1xuICAgICAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlLCB2b2lkLCB0eXBlb2ZcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGB0eXBlb2YgW11gLCBub3QgYHR5cGVvZltdYFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgaW5zZXJ0aW5nIHNwYWNlcyBiZXR3ZWVuIG9wZXJhdG9yIGFuZCBhcmd1bWVudCBpZiBpdCBpcyB1bm5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgICAgICAvLyBsaWtlLCBgIWNvbmRgXG4gICAgICAgICAgICAgICAgICAgIGxlZnRTb3VyY2UgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdENoYXJDb2RlID0gbGVmdFNvdXJjZS5jaGFyQ29kZUF0KGxlZnRTb3VyY2UubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2hhckNvZGUgPSBmcmFnbWVudC50b1N0cmluZygpLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCgobGVmdENoYXJDb2RlID09PSAweDJCICAvKiArICovIHx8IGxlZnRDaGFyQ29kZSA9PT0gMHgyRCAgLyogLSAqLykgJiYgbGVmdENoYXJDb2RlID09PSByaWdodENoYXJDb2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShsZWZ0Q2hhckNvZGUpICYmIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KHJpZ2h0Q2hhckNvZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuVW5hcnksIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFlpZWxkRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGV4cHIuZGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAneWllbGQqJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3lpZWxkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLmFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLllpZWxkLCBFX1RUVClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuWWllbGQsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEF3YWl0RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gam9pbihcbiAgICAgICAgICAgICAgICBleHByLmFsbCA/ICdhd2FpdConIDogJ2F3YWl0JyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLkF3YWl0LCBFX1RUVClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5Bd2FpdCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBleHByLm9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5VbmFyeSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuVW5hcnksXG4gICAgICAgICAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuUG9zdGZpeCwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICBleHByLm9wZXJhdG9yXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBQcmVjZWRlbmNlLlBvc3RmaXgsXG4gICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFzeW5jUHJlZml4KGV4cHIsIHRydWUpLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoZXhwci5pZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlU3RhclN1ZmZpeChleHByKSB8fCBub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIuaWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVTdGFyU3VmZml4KGV4cHIpIHx8IHNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwcikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBBcnJheVBhdHRlcm46IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXJyYXlFeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzLCB0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBcnJheUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncywgaXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBtdWx0aWxpbmUsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCFleHByLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW10nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbXVsdGlsaW5lID0gaXNQYXR0ZXJuID8gZmFsc2UgOiBleHByLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgICAgICAgICByZXN1bHQgPSBbJ1snLCBtdWx0aWxpbmUgPyBuZXdsaW5lIDogJyddO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5lbGVtZW50cy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwci5lbGVtZW50c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGluZGVudCA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZWxlbWVudHNbaV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgKG11bHRpbGluZSA/IG5ld2xpbmUgOiBzcGFjZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobXVsdGlsaW5lICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gYmFzZSA6ICcnKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFJlc3RFbGVtZW50OiBmdW5jdGlvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICcuLi4nICsgdGhpcy5nZW5lcmF0ZVBhdHRlcm4oZXhwci5hcmd1bWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgcmVzdWx0ID0gWydjbGFzcyddO1xuICAgICAgICAgICAgaWYgKGV4cHIuaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5pZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLnN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oJ2V4dGVuZHMnLCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnN1cGVyQ2xhc3MsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZVN0YXRlbWVudChleHByLmJvZHksIFNfVEZGVCkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgaWYgKGV4cHJbJ3N0YXRpYyddKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWydzdGF0aWMnICsgc3BhY2VdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgam9pbihleHByLmtpbmQsIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCkpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBleHByLmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICc6JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudmFsdWUsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIG11bHRpbGluZSwgcmVzdWx0LCBmcmFnbWVudCwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICghZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAne30nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzWzBdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZXMgNFxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCB0cmFuc2Zvcm0gZnJvbVxuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe1xuICAgICAgICAgICAgICAgIC8vICAgICAgIG1ldGhvZDI6IGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgICAgICAvLyB0b1xuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe21ldGhvZDI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICB9fSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAneycsIHNwYWNlLCBmcmFnbWVudCwgc3BhY2UsICd9JyBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lLCBpbmRlbnQsIGZyYWdtZW50IF07XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBmdW5jdGlvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KGV4cHIubGVmdCwgZXhwci5yaWdodCwgZXhwci5vcGVyYXRvciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE9iamVjdFBhdHRlcm46IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIG11bHRpbGluZSwgcHJvcGVydHksIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCFleHByLnByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG11bHRpbGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV4cHIucHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGV4cHIucHJvcGVydGllc1swXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkudmFsdWUudHlwZSAhPT0gU3ludGF4LklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBleHByLnByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBbJ3snLCBtdWx0aWxpbmUgPyBuZXdsaW5lIDogJycgXTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG11bHRpbGluZSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGJhc2UgOiAnJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RoaXMnO1xuICAgICAgICB9LFxuXG4gICAgICAgIFN1cGVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnc3VwZXInO1xuICAgICAgICB9LFxuXG4gICAgICAgIElkZW50aWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCB8fCBleHByLmxvY2FsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsnKiddO1xuICAgICAgICAgICAgdmFyIGlkID0gZXhwci5pZCB8fCBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpbXBvcnRlZCA9IGV4cHIuaW1wb3J0ZWQ7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyBpbXBvcnRlZC5uYW1lIF07XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGxvY2FsICYmIGxvY2FsLm5hbWUgIT09IGltcG9ydGVkLm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihsb2NhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGxvY2FsID0gZXhwci5sb2NhbDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGxvY2FsLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBleHBvcnRlZCA9IGV4cHIuZXhwb3J0ZWQ7XG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWQgJiYgZXhwb3J0ZWQubmFtZSAhPT0gbG9jYWwubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGV4cG9ydGVkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIExpdGVyYWw6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJhdztcbiAgICAgICAgICAgIGlmIChleHByLmhhc093blByb3BlcnR5KCdyYXcnKSAmJiBwYXJzZSAmJiBleHRyYS5yYXcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByYXcgPSBwYXJzZShleHByLnJhdykuYm9keVswXS5leHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnR5cGUgPT09IFN5bnRheC5MaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnZhbHVlID09PSBleHByLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIucmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdXNlIHJhdyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU51bWJlcihleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVJlZ0V4cChleHByLnZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbXByZWhlbnNpb25FeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0b3JFeHByZXNzaW9uIHNob3VsZCBiZSBwYXJlbnRoZXNpemVkIHdpdGggKC4uLiksIENvbXByZWhlbnNpb25FeHByZXNzaW9uIHdpdGggWy4uLl1cbiAgICAgICAgICAgIC8vIER1ZSB0byBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODM0NjggcG9zaXRpb24gb2YgZXhwci5ib2R5IGNhbiBkaWZmZXIgaW4gU3BpZGVybW9ua2V5IGFuZCBFUzZcblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJlc3VsdCA9IChleHByLnR5cGUgPT09IFN5bnRheC5HZW5lcmF0b3JFeHByZXNzaW9uKSA/IFsnKCddIDogWydbJ107XG5cbiAgICAgICAgICAgIGlmIChleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuYmxvY2tzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ibG9ja3NbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCB8fCBleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ2lmJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZmlsdGVyLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsgJygnLCBmcmFnbWVudCwgJyknIF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWV4dHJhLm1vei5jb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGV4cHIudHlwZSA9PT0gU3ludGF4LkdlbmVyYXRvckV4cHJlc3Npb24pID8gJyknIDogJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBmcmFnbWVudDtcbiAgICAgICAgICAgIGlmIChleHByLmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5sZWZ0LmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRilcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgZXhwci5vZiA/ICdvZicgOiAnaW4nKTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIFsgJ2ZvcicgKyBzcGFjZSArICcoJywgZnJhZ21lbnQsICcpJyBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnLi4uJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IEVfVFRGO1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX0NBTEwpKSB7XG4gICAgICAgICAgICAgICAgaXRlbUZsYWdzID0gRV9URkY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGFnLCBQcmVjZWRlbmNlLkNhbGwsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5xdWFzaSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX0ZGVClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5UYWdnZWRUZW1wbGF0ZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSBcImNvb2tlZFwiLiBTaW5jZSB0YWdnZWQgdGVtcGxhdGUgY2FuIHVzZSByYXcgdGVtcGxhdGVcbiAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLiBTbyBpZiB3ZSBkbyBzbywgaXQgYnJlYWtzIHRoZSBzY3JpcHQgc2VtYW50aWNzLlxuICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUucmF3O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpejtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsgJ2AnIF07XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIucXVhc2lzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnF1YXNpc1tpXSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCckeycgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnYCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGl0ZXJhbChleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBtZXJnZShDb2RlR2VuZXJhdG9yLnByb3RvdHlwZSwgQ29kZUdlbmVyYXRvci5FeHByZXNzaW9uKTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LCB0eXBlO1xuXG4gICAgICAgIHR5cGUgPSBleHByLnR5cGUgfHwgU3ludGF4LlByb3BlcnR5O1xuXG4gICAgICAgIGlmIChleHRyYS52ZXJiYXRpbSAmJiBleHByLmhhc093blByb3BlcnR5KGV4dHJhLnZlcmJhdGltKSkge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVmVyYmF0aW0oZXhwciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzW3R5cGVdKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcblxuXG4gICAgICAgIGlmIChleHRyYS5jb21tZW50KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGRDb21tZW50cyhleHByLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgZXhwcik7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlU3RhdGVtZW50ID0gZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgICBmcmFnbWVudDtcblxuICAgICAgICByZXN1bHQgPSB0aGlzW3N0bXQudHlwZV0oc3RtdCwgZmxhZ3MpO1xuXG4gICAgICAgIC8vIEF0dGFjaCBjb21tZW50c1xuXG4gICAgICAgIGlmIChleHRyYS5jb21tZW50KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGRDb21tZW50cyhzdG10LCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnJhZ21lbnQgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LlByb2dyYW0gJiYgIXNhZmVDb25jYXRlbmF0aW9uICYmIG5ld2xpbmUgPT09ICcnICYmICBmcmFnbWVudC5jaGFyQXQoZnJhZ21lbnQubGVuZ3RoIC0gMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VNYXAgPyB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkucmVwbGFjZVJpZ2h0KC9cXHMrJC8sICcnKSA6IGZyYWdtZW50LnJlcGxhY2UoL1xccyskLywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0LCBzdG10KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVJbnRlcm5hbChub2RlKSB7XG4gICAgICAgIHZhciBjb2RlZ2VuO1xuXG4gICAgICAgIGNvZGVnZW4gPSBuZXcgQ29kZUdlbmVyYXRvcigpO1xuICAgICAgICBpZiAoaXNTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlZ2VuLmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIFNfVEZGRik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZWdlbi5nZW5lcmF0ZUV4cHJlc3Npb24obm9kZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vZGUgdHlwZTogJyArIG5vZGUudHlwZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGUobm9kZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpLCByZXN1bHQsIHBhaXI7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gT2Jzb2xldGUgb3B0aW9uc1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgYG9wdGlvbnMuaW5kZW50YFxuICAgICAgICAgICAgLy8gICBgb3B0aW9ucy5iYXNlYFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhlbSwgd2UgY2FuIHVzZSBgb3B0aW9uLmZvcm1hdC5pbmRlbnRgLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmluZGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlID0gb3B0aW9ucy5pbmRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYmFzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5mb3JtYXQuaW5kZW50LmJhc2UgPSBvcHRpb25zLmJhc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zID0gdXBkYXRlRGVlcGx5KGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGluZGVudCA9IG9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5iYXNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBvcHRpb25zLmJhc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBzdHJpbmdSZXBlYXQoaW5kZW50LCBvcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgICAgICAgICBpbmRlbnQgPSBvcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGU7XG4gICAgICAgICAgICBiYXNlID0gc3RyaW5nUmVwZWF0KGluZGVudCwgb3B0aW9ucy5mb3JtYXQuaW5kZW50LmJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIGpzb24gPSBvcHRpb25zLmZvcm1hdC5qc29uO1xuICAgICAgICByZW51bWJlciA9IG9wdGlvbnMuZm9ybWF0LnJlbnVtYmVyO1xuICAgICAgICBoZXhhZGVjaW1hbCA9IGpzb24gPyBmYWxzZSA6IG9wdGlvbnMuZm9ybWF0LmhleGFkZWNpbWFsO1xuICAgICAgICBxdW90ZXMgPSBqc29uID8gJ2RvdWJsZScgOiBvcHRpb25zLmZvcm1hdC5xdW90ZXM7XG4gICAgICAgIGVzY2FwZWxlc3MgPSBvcHRpb25zLmZvcm1hdC5lc2NhcGVsZXNzO1xuICAgICAgICBuZXdsaW5lID0gb3B0aW9ucy5mb3JtYXQubmV3bGluZTtcbiAgICAgICAgc3BhY2UgPSBvcHRpb25zLmZvcm1hdC5zcGFjZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0LmNvbXBhY3QpIHtcbiAgICAgICAgICAgIG5ld2xpbmUgPSBzcGFjZSA9IGluZGVudCA9IGJhc2UgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRoZXNlcyA9IG9wdGlvbnMuZm9ybWF0LnBhcmVudGhlc2VzO1xuICAgICAgICBzZW1pY29sb25zID0gb3B0aW9ucy5mb3JtYXQuc2VtaWNvbG9ucztcbiAgICAgICAgc2FmZUNvbmNhdGVuYXRpb24gPSBvcHRpb25zLmZvcm1hdC5zYWZlQ29uY2F0ZW5hdGlvbjtcbiAgICAgICAgZGlyZWN0aXZlID0gb3B0aW9ucy5kaXJlY3RpdmU7XG4gICAgICAgIHBhcnNlID0ganNvbiA/IG51bGwgOiBvcHRpb25zLnBhcnNlO1xuICAgICAgICBzb3VyY2VNYXAgPSBvcHRpb25zLnNvdXJjZU1hcDtcbiAgICAgICAgc291cmNlQ29kZSA9IG9wdGlvbnMuc291cmNlQ29kZTtcbiAgICAgICAgcHJlc2VydmVCbGFua0xpbmVzID0gb3B0aW9ucy5mb3JtYXQucHJlc2VydmVCbGFua0xpbmVzICYmIHNvdXJjZUNvZGUgIT09IG51bGw7XG4gICAgICAgIGV4dHJhID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoc291cmNlTWFwKSB7XG4gICAgICAgICAgICBpZiAoIWV4cG9ydHMuYnJvd3Nlcikge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFzc3VtZSBlbnZpcm9ubWVudCBpcyBub2RlLmpzXG4gICAgICAgICAgICAgICAgLy8gQW5kIHByZXZlbnQgZnJvbSBpbmNsdWRpbmcgc291cmNlLW1hcCBieSBicm93c2VyaWZ5XG4gICAgICAgICAgICAgICAgU291cmNlTm9kZSA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKS5Tb3VyY2VOb2RlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBTb3VyY2VOb2RlID0gZ2xvYmFsLnNvdXJjZU1hcC5Tb3VyY2VOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gZ2VuZXJhdGVJbnRlcm5hbChub2RlKTtcblxuICAgICAgICBpZiAoIXNvdXJjZU1hcCkge1xuICAgICAgICAgICAgcGFpciA9IHtjb2RlOiByZXN1bHQudG9TdHJpbmcoKSwgbWFwOiBudWxsfTtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZU1hcFdpdGhDb2RlID8gcGFpciA6IHBhaXIuY29kZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcGFpciA9IHJlc3VsdC50b1N0cmluZ1dpdGhTb3VyY2VNYXAoe1xuICAgICAgICAgICAgZmlsZTogb3B0aW9ucy5maWxlLFxuICAgICAgICAgICAgc291cmNlUm9vdDogb3B0aW9ucy5zb3VyY2VNYXBSb290XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNvdXJjZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHBhaXIubWFwLnNldFNvdXJjZUNvbnRlbnQob3B0aW9ucy5zb3VyY2VNYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc291cmNlQ29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zb3VyY2VNYXBXaXRoQ29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFpci5tYXAudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBGT1JNQVRfTUlOSUZZID0ge1xuICAgICAgICBpbmRlbnQ6IHtcbiAgICAgICAgICAgIHN0eWxlOiAnJyxcbiAgICAgICAgICAgIGJhc2U6IDBcbiAgICAgICAgfSxcbiAgICAgICAgcmVudW1iZXI6IHRydWUsXG4gICAgICAgIGhleGFkZWNpbWFsOiB0cnVlLFxuICAgICAgICBxdW90ZXM6ICdhdXRvJyxcbiAgICAgICAgZXNjYXBlbGVzczogdHJ1ZSxcbiAgICAgICAgY29tcGFjdDogdHJ1ZSxcbiAgICAgICAgcGFyZW50aGVzZXM6IGZhbHNlLFxuICAgICAgICBzZW1pY29sb25zOiBmYWxzZVxuICAgIH07XG5cbiAgICBGT1JNQVRfREVGQVVMVFMgPSBnZXREZWZhdWx0T3B0aW9ucygpLmZvcm1hdDtcblxuICAgIGV4cG9ydHMudmVyc2lvbiA9IHJlcXVpcmUoJy4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbiAgICBleHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG4gICAgZXhwb3J0cy5hdHRhY2hDb21tZW50cyA9IGVzdHJhdmVyc2UuYXR0YWNoQ29tbWVudHM7XG4gICAgZXhwb3J0cy5QcmVjZWRlbmNlID0gdXBkYXRlRGVlcGx5KHt9LCBQcmVjZWRlbmNlKTtcbiAgICBleHBvcnRzLmJyb3dzZXIgPSBmYWxzZTtcbiAgICBleHBvcnRzLkZPUk1BVF9NSU5JRlkgPSBGT1JNQVRfTUlOSUZZO1xuICAgIGV4cG9ydHMuRk9STUFUX0RFRkFVTFRTID0gRk9STUFUX0RFRkFVTFRTO1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iXX0=
},{"./package.json":242,"estraverse":229,"esutils":255,"source-map":230}],229:[function(require,module,exports){
/*
Copyright (C) 2012-2013 Yusuke Suzuki
Copyright (C) 2012 Ariya Hidayat
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*jslint vars:false, bitwise:true*/
/*jshint indent:4*/
/*global exports:true, define:true*/
(function (root, factory) {
'use strict';
// Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
// and plain browser loading,
if (typeof define === 'function' && define.amd) {
define(['exports'], factory);
} else if (typeof exports !== 'undefined') {
factory(exports);
} else {
factory((root.estraverse = {}));
}
}(this, function clone(exports) {
'use strict';
var Syntax,
isArray,
VisitorOption,
VisitorKeys,
objectCreate,
objectKeys,
BREAK,
SKIP,
REMOVE;
function ignoreJSHintError() { }
isArray = Array.isArray;
if (!isArray) {
isArray = function isArray(array) {
return Object.prototype.toString.call(array) === '[object Array]';
};
}
function deepCopy(obj) {
var ret = {}, key, val;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
val = obj[key];
if (typeof val === 'object' && val !== null) {
ret[key] = deepCopy(val);
} else {
ret[key] = val;
}
}
}
return ret;
}
function shallowCopy(obj) {
var ret = {}, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
ret[key] = obj[key];
}
}
return ret;
}
ignoreJSHintError(shallowCopy);
// based on LLVM libc++ upper_bound / lower_bound
// MIT License
function upperBound(array, func) {
var diff, len, i, current;
len = array.length;
i = 0;
while (len) {
diff = len >>> 1;
current = i + diff;
if (func(array[current])) {
len = diff;
} else {
i = current + 1;
len -= diff + 1;
}
}
return i;
}
function lowerBound(array, func) {
var diff, len, i, current;
len = array.length;
i = 0;
while (len) {
diff = len >>> 1;
current = i + diff;
if (func(array[current])) {
i = current + 1;
len -= diff + 1;
} else {
len = diff;
}
}
return i;
}
ignoreJSHintError(lowerBound);
objectCreate = Object.create || (function () {
function F() { }
return function (o) {
F.prototype = o;
return new F();
};
})();
objectKeys = Object.keys || function (o) {
var keys = [], key;
for (key in o) {
keys.push(key);
}
return keys;
};
function extend(to, from) {
var keys = objectKeys(from), key, i, len;
for (i = 0, len = keys.length; i < len; i += 1) {
key = keys[i];
to[key] = from[key];
}
return to;
}
Syntax = {
AssignmentExpression: 'AssignmentExpression',
ArrayExpression: 'ArrayExpression',
ArrayPattern: 'ArrayPattern',
ArrowFunctionExpression: 'ArrowFunctionExpression',
AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
BlockStatement: 'BlockStatement',
BinaryExpression: 'BinaryExpression',
BreakStatement: 'BreakStatement',
CallExpression: 'CallExpression',
CatchClause: 'CatchClause',
ClassBody: 'ClassBody',
ClassDeclaration: 'ClassDeclaration',
ClassExpression: 'ClassExpression',
ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
ConditionalExpression: 'ConditionalExpression',
ContinueStatement: 'ContinueStatement',
DebuggerStatement: 'DebuggerStatement',
DirectiveStatement: 'DirectiveStatement',
DoWhileStatement: 'DoWhileStatement',
EmptyStatement: 'EmptyStatement',
ExportBatchSpecifier: 'ExportBatchSpecifier',
ExportDeclaration: 'ExportDeclaration',
ExportSpecifier: 'ExportSpecifier',
ExpressionStatement: 'ExpressionStatement',
ForStatement: 'ForStatement',
ForInStatement: 'ForInStatement',
ForOfStatement: 'ForOfStatement',
FunctionDeclaration: 'FunctionDeclaration',
FunctionExpression: 'FunctionExpression',
GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
Identifier: 'Identifier',
IfStatement: 'IfStatement',
ImportDeclaration: 'ImportDeclaration',
ImportDefaultSpecifier: 'ImportDefaultSpecifier',
ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
ImportSpecifier: 'ImportSpecifier',
Literal: 'Literal',
LabeledStatement: 'LabeledStatement',
LogicalExpression: 'LogicalExpression',
MemberExpression: 'MemberExpression',
MethodDefinition: 'MethodDefinition',
ModuleSpecifier: 'ModuleSpecifier',
NewExpression: 'NewExpression',
ObjectExpression: 'ObjectExpression',
ObjectPattern: 'ObjectPattern',
Program: 'Program',
Property: 'Property',
ReturnStatement: 'ReturnStatement',
SequenceExpression: 'SequenceExpression',
SpreadElement: 'SpreadElement',
SwitchStatement: 'SwitchStatement',
SwitchCase: 'SwitchCase',
TaggedTemplateExpression: 'TaggedTemplateExpression',
TemplateElement: 'TemplateElement',
TemplateLiteral: 'TemplateLiteral',
ThisExpression: 'ThisExpression',
ThrowStatement: 'ThrowStatement',
TryStatement: 'TryStatement',
UnaryExpression: 'UnaryExpression',
UpdateExpression: 'UpdateExpression',
VariableDeclaration: 'VariableDeclaration',
VariableDeclarator: 'VariableDeclarator',
WhileStatement: 'WhileStatement',
WithStatement: 'WithStatement',
YieldExpression: 'YieldExpression'
};
VisitorKeys = {
AssignmentExpression: ['left', 'right'],
ArrayExpression: ['elements'],
ArrayPattern: ['elements'],
ArrowFunctionExpression: ['params', 'defaults', 'rest', 'body'],
AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
BlockStatement: ['body'],
BinaryExpression: ['left', 'right'],
BreakStatement: ['label'],
CallExpression: ['callee', 'arguments'],
CatchClause: ['param', 'body'],
ClassBody: ['body'],
ClassDeclaration: ['id', 'body', 'superClass'],
ClassExpression: ['id', 'body', 'superClass'],
ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
ConditionalExpression: ['test', 'consequent', 'alternate'],
ContinueStatement: ['label'],
DebuggerStatement: [],
DirectiveStatement: [],
DoWhileStatement: ['body', 'test'],
EmptyStatement: [],
ExportBatchSpecifier: [],
ExportDeclaration: ['declaration', 'specifiers', 'source'],
ExportSpecifier: ['id', 'name'],
ExpressionStatement: ['expression'],
ForStatement: ['init', 'test', 'update', 'body'],
ForInStatement: ['left', 'right', 'body'],
ForOfStatement: ['left', 'right', 'body'],
FunctionDeclaration: ['id', 'params', 'defaults', 'rest', 'body'],
FunctionExpression: ['id', 'params', 'defaults', 'rest', 'body'],
GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
Identifier: [],
IfStatement: ['test', 'consequent', 'alternate'],
ImportDeclaration: ['specifiers', 'source'],
ImportDefaultSpecifier: ['id'],
ImportNamespaceSpecifier: ['id'],
ImportSpecifier: ['id', 'name'],
Literal: [],
LabeledStatement: ['label', 'body'],
LogicalExpression: ['left', 'right'],
MemberExpression: ['object', 'property'],
MethodDefinition: ['key', 'value'],
ModuleSpecifier: [],
NewExpression: ['callee', 'arguments'],
ObjectExpression: ['properties'],
ObjectPattern: ['properties'],
Program: ['body'],
Property: ['key', 'value'],
ReturnStatement: ['argument'],
SequenceExpression: ['expressions'],
SpreadElement: ['argument'],
SwitchStatement: ['discriminant', 'cases'],
SwitchCase: ['test', 'consequent'],
TaggedTemplateExpression: ['tag', 'quasi'],
TemplateElement: [],
TemplateLiteral: ['quasis', 'expressions'],
ThisExpression: [],
ThrowStatement: ['argument'],
TryStatement: ['block', 'handlers', 'handler', 'guardedHandlers', 'finalizer'],
UnaryExpression: ['argument'],
UpdateExpression: ['argument'],
VariableDeclaration: ['declarations'],
VariableDeclarator: ['id', 'init'],
WhileStatement: ['test', 'body'],
WithStatement: ['object', 'body'],
YieldExpression: ['argument']
};
// unique id
BREAK = {};
SKIP = {};
REMOVE = {};
VisitorOption = {
Break: BREAK,
Skip: SKIP,
Remove: REMOVE
};
function Reference(parent, key) {
this.parent = parent;
this.key = key;
}
Reference.prototype.replace = function replace(node) {
this.parent[this.key] = node;
};
Reference.prototype.remove = function remove() {
if (isArray(this.parent)) {
this.parent.splice(this.key, 1);
return true;
} else {
this.replace(null);
return false;
}
};
function Element(node, path, wrap, ref) {
this.node = node;
this.path = path;
this.wrap = wrap;
this.ref = ref;
}
function Controller() { }
// API:
// return property path array from root to current node
Controller.prototype.path = function path() {
var i, iz, j, jz, result, element;
function addToPath(result, path) {
if (isArray(path)) {
for (j = 0, jz = path.length; j < jz; ++j) {
result.push(path[j]);
}
} else {
result.push(path);
}
}
// root node
if (!this.__current.path) {
return null;
}
// first node is sentinel, second node is root element
result = [];
for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
element = this.__leavelist[i];
addToPath(result, element.path);
}
addToPath(result, this.__current.path);
return result;
};
// API:
// return type of current node
Controller.prototype.type = function () {
var node = this.current();
return node.type || this.__current.wrap;
};
// API:
// return array of parent elements
Controller.prototype.parents = function parents() {
var i, iz, result;
// first node is sentinel
result = [];
for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
result.push(this.__leavelist[i].node);
}
return result;
};
// API:
// return current node
Controller.prototype.current = function current() {
return this.__current.node;
};
Controller.prototype.__execute = function __execute(callback, element) {
var previous, result;
result = undefined;
previous = this.__current;
this.__current = element;
this.__state = null;
if (callback) {
result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
}
this.__current = previous;
return result;
};
// API:
// notify control skip / break
Controller.prototype.notify = function notify(flag) {
this.__state = flag;
};
// API:
// skip child nodes of current node
Controller.prototype.skip = function () {
this.notify(SKIP);
};
// API:
// break traversals
Controller.prototype['break'] = function () {
this.notify(BREAK);
};
// API:
// remove node
Controller.prototype.remove = function () {
this.notify(REMOVE);
};
Controller.prototype.__initialize = function(root, visitor) {
this.visitor = visitor;
this.root = root;
this.__worklist = [];
this.__leavelist = [];
this.__current = null;
this.__state = null;
this.__fallback = visitor.fallback === 'iteration';
this.__keys = VisitorKeys;
if (visitor.keys) {
this.__keys = extend(objectCreate(this.__keys), visitor.keys);
}
};
function isNode(node) {
if (node == null) {
return false;
}
return typeof node === 'object' && typeof node.type === 'string';
}
function isProperty(nodeType, key) {
return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
}
Controller.prototype.traverse = function traverse(root, visitor) {
var worklist,
leavelist,
element,
node,
nodeType,
ret,
key,
current,
current2,
candidates,
candidate,
sentinel;
this.__initialize(root, visitor);
sentinel = {};
// reference
worklist = this.__worklist;
leavelist = this.__leavelist;
// initialize
worklist.push(new Element(root, null, null, null));
leavelist.push(new Element(null, null, null, null));
while (worklist.length) {
element = worklist.pop();
if (element === sentinel) {
element = leavelist.pop();
ret = this.__execute(visitor.leave, element);
if (this.__state === BREAK || ret === BREAK) {
return;
}
continue;
}
if (element.node) {
ret = this.__execute(visitor.enter, element);
if (this.__state === BREAK || ret === BREAK) {
return;
}
worklist.push(sentinel);
leavelist.push(element);
if (this.__state === SKIP || ret === SKIP) {
continue;
}
node = element.node;
nodeType = element.wrap || node.type;
candidates = this.__keys[nodeType];
if (!candidates) {
if (this.__fallback) {
candidates = objectKeys(node);
} else {
throw new Error('Unknown node type ' + nodeType + '.');
}
}
current = candidates.length;
while ((current -= 1) >= 0) {
key = candidates[current];
candidate = node[key];
if (!candidate) {
continue;
}
if (isArray(candidate)) {
current2 = candidate.length;
while ((current2 -= 1) >= 0) {
if (!candidate[current2]) {
continue;
}
if (isProperty(nodeType, candidates[current])) {
element = new Element(candidate[current2], [key, current2], 'Property', null);
} else if (isNode(candidate[current2])) {
element = new Element(candidate[current2], [key, current2], null, null);
} else {
continue;
}
worklist.push(element);
}
} else if (isNode(candidate)) {
worklist.push(new Element(candidate, key, null, null));
}
}
}
}
};
Controller.prototype.replace = function replace(root, visitor) {
function removeElem(element) {
var i,
key,
nextElem,
parent;
if (element.ref.remove()) {
// When the reference is an element of an array.
key = element.ref.key;
parent = element.ref.parent;
// If removed from array, then decrease following items' keys.
i = worklist.length;
while (i--) {
nextElem = worklist[i];
if (nextElem.ref && nextElem.ref.parent === parent) {
if (nextElem.ref.key < key) {
break;
}
--nextElem.ref.key;
}
}
}
}
var worklist,
leavelist,
node,
nodeType,
target,
element,
current,
current2,
candidates,
candidate,
sentinel,
outer,
key;
this.__initialize(root, visitor);
sentinel = {};
// reference
worklist = this.__worklist;
leavelist = this.__leavelist;
// initialize
outer = {
root: root
};
element = new Element(root, null, null, new Reference(outer, 'root'));
worklist.push(element);
leavelist.push(element);
while (worklist.length) {
element = worklist.pop();
if (element === sentinel) {
element = leavelist.pop();
target = this.__execute(visitor.leave, element);
// node may be replaced with null,
// so distinguish between undefined and null in this place
if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
// replace
element.ref.replace(target);
}
if (this.__state === REMOVE || target === REMOVE) {
removeElem(element);
}
if (this.__state === BREAK || target === BREAK) {
return outer.root;
}
continue;
}
target = this.__execute(visitor.enter, element);
// node may be replaced with null,
// so distinguish between undefined and null in this place
if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
// replace
element.ref.replace(target);
element.node = target;
}
if (this.__state === REMOVE || target === REMOVE) {
removeElem(element);
element.node = null;
}
if (this.__state === BREAK || target === BREAK) {
return outer.root;
}
// node may be null
node = element.node;
if (!node) {
continue;
}
worklist.push(sentinel);
leavelist.push(element);
if (this.__state === SKIP || target === SKIP) {
continue;
}
nodeType = element.wrap || node.type;
candidates = this.__keys[nodeType];
if (!candidates) {
if (this.__fallback) {
candidates = objectKeys(node);
} else {
throw new Error('Unknown node type ' + nodeType + '.');
}
}
current = candidates.length;
while ((current -= 1) >= 0) {
key = candidates[current];
candidate = node[key];
if (!candidate) {
continue;
}
if (isArray(candidate)) {
current2 = candidate.length;
while ((current2 -= 1) >= 0) {
if (!candidate[current2]) {
continue;
}
if (isProperty(nodeType, candidates[current])) {
element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
} else if (isNode(candidate[current2])) {
element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
} else {
continue;
}
worklist.push(element);
}
} else if (isNode(candidate)) {
worklist.push(new Element(candidate, key, null, new Reference(node, key)));
}
}
}
return outer.root;
};
function traverse(root, visitor) {
var controller = new Controller();
return controller.traverse(root, visitor);
}
function replace(root, visitor) {
var controller = new Controller();
return controller.replace(root, visitor);
}
function extendCommentRange(comment, tokens) {
var target;
target = upperBound(tokens, function search(token) {
return token.range[0] > comment.range[0];
});
comment.extendedRange = [comment.range[0], comment.range[1]];
if (target !== tokens.length) {
comment.extendedRange[1] = tokens[target].range[0];
}
target -= 1;
if (target >= 0) {
comment.extendedRange[0] = tokens[target].range[1];
}
return comment;
}
function attachComments(tree, providedComments, tokens) {
// At first, we should calculate extended comment ranges.
var comments = [], comment, len, i, cursor;
if (!tree.range) {
throw new Error('attachComments needs range information');
}
// tokens array is empty, we attach comments to tree as 'leadingComments'
if (!tokens.length) {
if (providedComments.length) {
for (i = 0, len = providedComments.length; i < len; i += 1) {
comment = deepCopy(providedComments[i]);
comment.extendedRange = [0, tree.range[0]];
comments.push(comment);
}
tree.leadingComments = comments;
}
return tree;
}
for (i = 0, len = providedComments.length; i < len; i += 1) {
comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
}
// This is based on John Freeman's implementation.
cursor = 0;
traverse(tree, {
enter: function (node) {
var comment;
while (cursor < comments.length) {
comment = comments[cursor];
if (comment.extendedRange[1] > node.range[0]) {
break;
}
if (comment.extendedRange[1] === node.range[0]) {
if (!node.leadingComments) {
node.leadingComments = [];
}
node.leadingComments.push(comment);
comments.splice(cursor, 1);
} else {
cursor += 1;
}
}
// already out of owned node
if (cursor === comments.length) {
return VisitorOption.Break;
}
if (comments[cursor].extendedRange[0] > node.range[1]) {
return VisitorOption.Skip;
}
}
});
cursor = 0;
traverse(tree, {
leave: function (node) {
var comment;
while (cursor < comments.length) {
comment = comments[cursor];
if (node.range[1] < comment.extendedRange[0]) {
break;
}
if (node.range[1] === comment.extendedRange[0]) {
if (!node.trailingComments) {
node.trailingComments = [];
}
node.trailingComments.push(comment);
comments.splice(cursor, 1);
} else {
cursor += 1;
}
}
// already out of owned node
if (cursor === comments.length) {
return VisitorOption.Break;
}
if (comments[cursor].extendedRange[0] > node.range[1]) {
return VisitorOption.Skip;
}
}
});
return tree;
}
exports.version = '1.8.1-dev';
exports.Syntax = Syntax;
exports.traverse = traverse;
exports.replace = replace;
exports.attachComments = attachComments;
exports.VisitorKeys = VisitorKeys;
exports.VisitorOption = VisitorOption;
exports.Controller = Controller;
exports.cloneEnvironment = function () { return clone({}); };
return exports;
}));
/* vim: set sw=4 ts=4 et tw=80 : */
},{}],230:[function(require,module,exports){
/*
* Copyright 2009-2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE.txt or:
* http://opensource.org/licenses/BSD-3-Clause
*/
exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator;
exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer;
exports.SourceNode = require('./source-map/source-node').SourceNode;
},{"./source-map/source-map-consumer":238,"./source-map/source-map-generator":239,"./source-map/source-node":240}],231:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
/**
* A data structure which is a combination of an array and a set. Adding a new
* member is O(1), testing for membership is O(1), and finding the index of an
* element is O(1). Removing elements from the set is not supported. Only
* strings are supported for membership.
*/
function ArraySet() {
this._array = [];
this._set = {};
}
/**
* Static method for creating ArraySet instances from an existing array.
*/
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
var set = new ArraySet();
for (var i = 0, len = aArray.length; i < len; i++) {
set.add(aArray[i], aAllowDuplicates);
}
return set;
};
/**
* Add the given string to this set.
*
* @param String aStr
*/
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
var isDuplicate = this.has(aStr);
var idx = this._array.length;
if (!isDuplicate || aAllowDuplicates) {
this._array.push(aStr);
}
if (!isDuplicate) {
this._set[util.toSetString(aStr)] = idx;
}
};
/**
* Is the given string a member of this set?
*
* @param String aStr
*/
ArraySet.prototype.has = function ArraySet_has(aStr) {
return Object.prototype.hasOwnProperty.call(this._set,
util.toSetString(aStr));
};
/**
* What is the index of the given string in the array?
*
* @param String aStr
*/
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
if (this.has(aStr)) {
return this._set[util.toSetString(aStr)];
}
throw new Error('"' + aStr + '" is not in the set.');
};
/**
* What is the element at the given index?
*
* @param Number aIdx
*/
ArraySet.prototype.at = function ArraySet_at(aIdx) {
if (aIdx >= 0 && aIdx < this._array.length) {
return this._array[aIdx];
}
throw new Error('No element indexed by ' + aIdx);
};
/**
* Returns the array representation of this set (which has the proper indices
* indicated by indexOf). Note that this is a copy of the internal array used
* for storing the members so that no one can mess with internal state.
*/
ArraySet.prototype.toArray = function ArraySet_toArray() {
return this._array.slice();
};
exports.ArraySet = ArraySet;
});
},{"./util":241,"amdefine":23}],232:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*
* Based on the Base 64 VLQ implementation in Closure Compiler:
* https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
*
* Copyright 2011 The Closure Compiler Authors. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64 = require('./base64');
// A single base 64 digit can contain 6 bits of data. For the base 64 variable
// length quantities we use in the source map spec, the first bit is the sign,
// the next four bits are the actual value, and the 6th bit is the
// continuation bit. The continuation bit tells us whether there are more
// digits in this value following this digit.
//
// Continuation
// | Sign
// | |
// V V
// 101011
var VLQ_BASE_SHIFT = 5;
// binary: 100000
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
// binary: 011111
var VLQ_BASE_MASK = VLQ_BASE - 1;
// binary: 100000
var VLQ_CONTINUATION_BIT = VLQ_BASE;
/**
* Converts from a two-complement value to a value where the sign bit is
* placed in the least significant bit. For example, as decimals:
* 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
* 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
*/
function toVLQSigned(aValue) {
return aValue < 0
? ((-aValue) << 1) + 1
: (aValue << 1) + 0;
}
/**
* Converts to a two-complement value from a value where the sign bit is
* placed in the least significant bit. For example, as decimals:
* 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
* 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
*/
function fromVLQSigned(aValue) {
var isNegative = (aValue & 1) === 1;
var shifted = aValue >> 1;
return isNegative
? -shifted
: shifted;
}
/**
* Returns the base 64 VLQ encoded value.
*/
exports.encode = function base64VLQ_encode(aValue) {
var encoded = "";
var digit;
var vlq = toVLQSigned(aValue);
do {
digit = vlq & VLQ_BASE_MASK;
vlq >>>= VLQ_BASE_SHIFT;
if (vlq > 0) {
// There are still more digits in this value, so we must make sure the
// continuation bit is marked.
digit |= VLQ_CONTINUATION_BIT;
}
encoded += base64.encode(digit);
} while (vlq > 0);
return encoded;
};
/**
* Decodes the next base 64 VLQ value from the given string and returns the
* value and the rest of the string via the out parameter.
*/
exports.decode = function base64VLQ_decode(aStr, aOutParam) {
var i = 0;
var strLen = aStr.length;
var result = 0;
var shift = 0;
var continuation, digit;
do {
if (i >= strLen) {
throw new Error("Expected more digits in base 64 VLQ value.");
}
digit = base64.decode(aStr.charAt(i++));
continuation = !!(digit & VLQ_CONTINUATION_BIT);
digit &= VLQ_BASE_MASK;
result = result + (digit << shift);
shift += VLQ_BASE_SHIFT;
} while (continuation);
aOutParam.value = fromVLQSigned(result);
aOutParam.rest = aStr.slice(i);
};
});
},{"./base64":233,"amdefine":23}],233:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var charToIntMap = {};
var intToCharMap = {};
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
.split('')
.forEach(function (ch, index) {
charToIntMap[ch] = index;
intToCharMap[index] = ch;
});
/**
* Encode an integer in the range of 0 to 63 to a single base 64 digit.
*/
exports.encode = function base64_encode(aNumber) {
if (aNumber in intToCharMap) {
return intToCharMap[aNumber];
}
throw new TypeError("Must be between 0 and 63: " + aNumber);
};
/**
* Decode a single base 64 digit to an integer.
*/
exports.decode = function base64_decode(aChar) {
if (aChar in charToIntMap) {
return charToIntMap[aChar];
}
throw new TypeError("Not a valid base 64 digit: " + aChar);
};
});
},{"amdefine":23}],234:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
var binarySearch = require('./binary-search');
var ArraySet = require('./array-set').ArraySet;
var base64VLQ = require('./base64-vlq');
var SourceMapConsumer = require('./source-map-consumer').SourceMapConsumer;
/**
* A BasicSourceMapConsumer instance represents a parsed source map which we can
* query for information about the original file positions by giving it a file
* position in the generated source.
*
* The only parameter is the raw source map (either as a JSON string, or
* already parsed to an object). According to the spec, source maps have the
* following attributes:
*
* - version: Which version of the source map spec this map is following.
* - sources: An array of URLs to the original source files.
* - names: An array of identifiers which can be referrenced by individual mappings.
* - sourceRoot: Optional. The URL root from which all sources are relative.
* - sourcesContent: Optional. An array of contents of the original source files.
* - mappings: A string of base64 VLQs which contain the actual mappings.
* - file: Optional. The generated file this source map is associated with.
*
* Here is an example source map, taken from the source map spec[0]:
*
* {
* version : 3,
* file: "out.js",
* sourceRoot : "",
* sources: ["foo.js", "bar.js"],
* names: ["src", "maps", "are", "fun"],
* mappings: "AA,AB;;ABCDE;"
* }
*
* [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
*/
function BasicSourceMapConsumer(aSourceMap) {
var sourceMap = aSourceMap;
if (typeof aSourceMap === 'string') {
sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
}
var version = util.getArg(sourceMap, 'version');
var sources = util.getArg(sourceMap, 'sources');
// Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
// requires the array) to play nice here.
var names = util.getArg(sourceMap, 'names', []);
var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
var mappings = util.getArg(sourceMap, 'mappings');
var file = util.getArg(sourceMap, 'file', null);
// Once again, Sass deviates from the spec and supplies the version as a
// string rather than a number, so we use loose equality checking here.
if (version != this._version) {
throw new Error('Unsupported version: ' + version);
}
// Some source maps produce relative source paths like "./foo.js" instead of
// "foo.js". Normalize these first so that future comparisons will succeed.
// See bugzil.la/1090768.
sources = sources.map(util.normalize);
// Pass `true` below to allow duplicate names and sources. While source maps
// are intended to be compressed and deduplicated, the TypeScript compiler
// sometimes generates source maps with duplicates in them. See Github issue
// #72 and bugzil.la/889492.
this._names = ArraySet.fromArray(names, true);
this._sources = ArraySet.fromArray(sources, true);
this.sourceRoot = sourceRoot;
this.sourcesContent = sourcesContent;
this._mappings = mappings;
this.file = file;
}
BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
/**
* Create a BasicSourceMapConsumer from a SourceMapGenerator.
*
* @param SourceMapGenerator aSourceMap
* The source map that will be consumed.
* @returns BasicSourceMapConsumer
*/
BasicSourceMapConsumer.fromSourceMap =
function SourceMapConsumer_fromSourceMap(aSourceMap) {
var smc = Object.create(BasicSourceMapConsumer.prototype);
smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
smc.sourceRoot = aSourceMap._sourceRoot;
smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
smc.sourceRoot);
smc.file = aSourceMap._file;
smc.__generatedMappings = aSourceMap._mappings.toArray().slice();
smc.__originalMappings = aSourceMap._mappings.toArray().slice()
.sort(util.compareByOriginalPositions);
return smc;
};
/**
* The version of the source mapping spec that we are consuming.
*/
BasicSourceMapConsumer.prototype._version = 3;
/**
* The list of original sources.
*/
Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
get: function () {
return this._sources.toArray().map(function (s) {
return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;
}, this);
}
});
/**
* Parse the mappings in a string in to a data structure which we can easily
* query (the ordered arrays in the `this.__generatedMappings` and
* `this.__originalMappings` properties).
*/
BasicSourceMapConsumer.prototype._parseMappings =
function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
var generatedLine = 1;
var previousGeneratedColumn = 0;
var previousOriginalLine = 0;
var previousOriginalColumn = 0;
var previousSource = 0;
var previousName = 0;
var str = aStr;
var temp = {};
var mapping;
while (str.length > 0) {
if (str.charAt(0) === ';') {
generatedLine++;
str = str.slice(1);
previousGeneratedColumn = 0;
}
else if (str.charAt(0) === ',') {
str = str.slice(1);
}
else {
mapping = {};
mapping.generatedLine = generatedLine;
// Generated column.
base64VLQ.decode(str, temp);
mapping.generatedColumn = previousGeneratedColumn + temp.value;
previousGeneratedColumn = mapping.generatedColumn;
str = temp.rest;
if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {
// Original source.
base64VLQ.decode(str, temp);
mapping.source = this._sources.at(previousSource + temp.value);
previousSource += temp.value;
str = temp.rest;
if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {
throw new Error('Found a source, but no line and column');
}
// Original line.
base64VLQ.decode(str, temp);
mapping.originalLine = previousOriginalLine + temp.value;
previousOriginalLine = mapping.originalLine;
// Lines are stored 0-based
mapping.originalLine += 1;
str = temp.rest;
if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {
throw new Error('Found a source and line, but no column');
}
// Original column.
base64VLQ.decode(str, temp);
mapping.originalColumn = previousOriginalColumn + temp.value;
previousOriginalColumn = mapping.originalColumn;
str = temp.rest;
if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {
// Original name.
base64VLQ.decode(str, temp);
mapping.name = this._names.at(previousName + temp.value);
previousName += temp.value;
str = temp.rest;
}
}
this.__generatedMappings.push(mapping);
if (typeof mapping.originalLine === 'number') {
this.__originalMappings.push(mapping);
}
}
}
this.__generatedMappings.sort(util.compareByGeneratedPositions);
this.__originalMappings.sort(util.compareByOriginalPositions);
};
/**
* Find the mapping that best matches the hypothetical "needle" mapping that
* we are searching for in the given "haystack" of mappings.
*/
BasicSourceMapConsumer.prototype._findMapping =
function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
aColumnName, aComparator) {
// To return the position we are searching for, we must first find the
// mapping for the given position and then return the opposite position it
// points to. Because the mappings are sorted, we can use binary search to
// find the best mapping.
if (aNeedle[aLineName] <= 0) {
throw new TypeError('Line must be greater than or equal to 1, got '
+ aNeedle[aLineName]);
}
if (aNeedle[aColumnName] < 0) {
throw new TypeError('Column must be greater than or equal to 0, got '
+ aNeedle[aColumnName]);
}
return binarySearch.search(aNeedle, aMappings, aComparator);
};
/**
* Compute the last column for each generated mapping. The last column is
* inclusive.
*/
BasicSourceMapConsumer.prototype.computeColumnSpans =
function SourceMapConsumer_computeColumnSpans() {
for (var index = 0; index < this._generatedMappings.length; ++index) {
var mapping = this._generatedMappings[index];
// Mappings do not contain a field for the last generated columnt. We
// can come up with an optimistic estimate, however, by assuming that
// mappings are contiguous (i.e. given two consecutive mappings, the
// first mapping ends where the second one starts).
if (index + 1 < this._generatedMappings.length) {
var nextMapping = this._generatedMappings[index + 1];
if (mapping.generatedLine === nextMapping.generatedLine) {
mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
continue;
}
}
// The last mapping for each line spans the entire line.
mapping.lastGeneratedColumn = Infinity;
}
};
/**
* Returns the original source, line, and column information for the generated
* source's line and column positions provided. The only argument is an object
* with the following properties:
*
* - line: The line number in the generated source.
* - column: The column number in the generated source.
*
* and an object is returned with the following properties:
*
* - source: The original source file, or null.
* - line: The line number in the original source, or null.
* - column: The column number in the original source, or null.
* - name: The original identifier, or null.
*/
BasicSourceMapConsumer.prototype.originalPositionFor =
function SourceMapConsumer_originalPositionFor(aArgs) {
var needle = {
generatedLine: util.getArg(aArgs, 'line'),
generatedColumn: util.getArg(aArgs, 'column')
};
var index = this._findMapping(needle,
this._generatedMappings,
"generatedLine",
"generatedColumn",
util.compareByGeneratedPositions);
if (index >= 0) {
var mapping = this._generatedMappings[index];
if (mapping.generatedLine === needle.generatedLine) {
var source = util.getArg(mapping, 'source', null);
if (source != null && this.sourceRoot != null) {
source = util.join(this.sourceRoot, source);
}
return {
source: source,
line: util.getArg(mapping, 'originalLine', null),
column: util.getArg(mapping, 'originalColumn', null),
name: util.getArg(mapping, 'name', null)
};
}
}
return {
source: null,
line: null,
column: null,
name: null
};
};
/**
* Returns the original source content. The only argument is the url of the
* original source file. Returns null if no original source content is
* availible.
*/
BasicSourceMapConsumer.prototype.sourceContentFor =
function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
if (!this.sourcesContent) {
return null;
}
if (this.sourceRoot != null) {
aSource = util.relative(this.sourceRoot, aSource);
}
if (this._sources.has(aSource)) {
return this.sourcesContent[this._sources.indexOf(aSource)];
}
var url;
if (this.sourceRoot != null
&& (url = util.urlParse(this.sourceRoot))) {
// XXX: file:// URIs and absolute paths lead to unexpected behavior for
// many users. We can help them out when they expect file:// URIs to
// behave like it would if they were running a local HTTP server. See
// https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
if (url.scheme == "file"
&& this._sources.has(fileUriAbsPath)) {
return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
}
if ((!url.path || url.path == "/")
&& this._sources.has("/" + aSource)) {
return this.sourcesContent[this._sources.indexOf("/" + aSource)];
}
}
// This function is used recursively from
// IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
// don't want to throw if we can't find the source - we just want to
// return null, so we provide a flag to exit gracefully.
if (nullOnMissing) {
return null;
}
else {
throw new Error('"' + aSource + '" is not in the SourceMap.');
}
};
/**
* Returns the generated line and column information for the original source,
* line, and column positions provided. The only argument is an object with
* the following properties:
*
* - source: The filename of the original source.
* - line: The line number in the original source.
* - column: The column number in the original source.
*
* and an object is returned with the following properties:
*
* - line: The line number in the generated source, or null.
* - column: The column number in the generated source, or null.
*/
BasicSourceMapConsumer.prototype.generatedPositionFor =
function SourceMapConsumer_generatedPositionFor(aArgs) {
var needle = {
source: util.getArg(aArgs, 'source'),
originalLine: util.getArg(aArgs, 'line'),
originalColumn: util.getArg(aArgs, 'column')
};
if (this.sourceRoot != null) {
needle.source = util.relative(this.sourceRoot, needle.source);
}
var index = this._findMapping(needle,
this._originalMappings,
"originalLine",
"originalColumn",
util.compareByOriginalPositions);
if (index >= 0) {
var mapping = this._originalMappings[index];
return {
line: util.getArg(mapping, 'generatedLine', null),
column: util.getArg(mapping, 'generatedColumn', null),
lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
};
}
return {
line: null,
column: null,
lastColumn: null
};
};
exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
});
},{"./array-set":231,"./base64-vlq":232,"./binary-search":235,"./source-map-consumer":238,"./util":241,"amdefine":23}],235:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
/**
* Recursive implementation of binary search.
*
* @param aLow Indices here and lower do not contain the needle.
* @param aHigh Indices here and higher do not contain the needle.
* @param aNeedle The element being searched for.
* @param aHaystack The non-empty array being searched.
* @param aCompare Function which takes two elements and returns -1, 0, or 1.
*/
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {
// This function terminates when one of the following is true:
//
// 1. We find the exact element we are looking for.
//
// 2. We did not find the exact element, but we can return the index of
// the next closest element that is less than that element.
//
// 3. We did not find the exact element, and there is no next-closest
// element which is less than the one we are searching for, so we
// return -1.
var mid = Math.floor((aHigh - aLow) / 2) + aLow;
var cmp = aCompare(aNeedle, aHaystack[mid], true);
if (cmp === 0) {
// Found the element we are looking for.
return mid;
}
else if (cmp > 0) {
// aHaystack[mid] is greater than our needle.
if (aHigh - mid > 1) {
// The element is in the upper half.
return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);
}
// We did not find an exact match, return the next closest one
// (termination case 2).
return mid;
}
else {
// aHaystack[mid] is less than our needle.
if (mid - aLow > 1) {
// The element is in the lower half.
return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);
}
// The exact needle element was not found in this haystack. Determine if
// we are in termination case (2) or (3) and return the appropriate thing.
return aLow < 0 ? -1 : aLow;
}
}
/**
* This is an implementation of binary search which will always try and return
* the index of next lowest value checked if there is no exact hit. This is
* because mappings between original and generated line/col pairs are single
* points, and there is an implicit region between each of them, so a miss
* just means that you aren't on the very start of a region.
*
* @param aNeedle The element you are looking for.
* @param aHaystack The array that is being searched.
* @param aCompare A function which takes the needle and an element in the
* array and returns -1, 0, or 1 depending on whether the needle is less
* than, equal to, or greater than the element, respectively.
*/
exports.search = function search(aNeedle, aHaystack, aCompare) {
if (aHaystack.length === 0) {
return -1;
}
return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare)
};
});
},{"amdefine":23}],236:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
var binarySearch = require('./binary-search');
var SourceMapConsumer = require('./source-map-consumer').SourceMapConsumer;
var BasicSourceMapConsumer = require('./basic-source-map-consumer').BasicSourceMapConsumer;
/**
* An IndexedSourceMapConsumer instance represents a parsed source map which
* we can query for information. It differs from BasicSourceMapConsumer in
* that it takes "indexed" source maps (i.e. ones with a "sections" field) as
* input.
*
* The only parameter is a raw source map (either as a JSON string, or already
* parsed to an object). According to the spec for indexed source maps, they
* have the following attributes:
*
* - version: Which version of the source map spec this map is following.
* - file: Optional. The generated file this source map is associated with.
* - sections: A list of section definitions.
*
* Each value under the "sections" field has two fields:
* - offset: The offset into the original specified at which this section
* begins to apply, defined as an object with a "line" and "column"
* field.
* - map: A source map definition. This source map could also be indexed,
* but doesn't have to be.
*
* Instead of the "map" field, it's also possible to have a "url" field
* specifying a URL to retrieve a source map from, but that's currently
* unsupported.
*
* Here's an example source map, taken from the source map spec[0], but
* modified to omit a section which uses the "url" field.
*
* {
* version : 3,
* file: "app.js",
* sections: [{
* offset: {line:100, column:10},
* map: {
* version : 3,
* file: "section.js",
* sources: ["foo.js", "bar.js"],
* names: ["src", "maps", "are", "fun"],
* mappings: "AAAA,E;;ABCDE;"
* }
* }],
* }
*
* [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
*/
function IndexedSourceMapConsumer(aSourceMap) {
var sourceMap = aSourceMap;
if (typeof aSourceMap === 'string') {
sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
}
var version = util.getArg(sourceMap, 'version');
var sections = util.getArg(sourceMap, 'sections');
if (version != this._version) {
throw new Error('Unsupported version: ' + version);
}
var lastOffset = {
line: -1,
column: 0
};
this._sections = sections.map(function (s) {
if (s.url) {
// The url field will require support for asynchronicity.
// See https://github.com/mozilla/source-map/issues/16
throw new Error('Support for url field in sections not implemented.');
}
var offset = util.getArg(s, 'offset');
var offsetLine = util.getArg(offset, 'line');
var offsetColumn = util.getArg(offset, 'column');
if (offsetLine < lastOffset.line ||
(offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
throw new Error('Section offsets must be ordered and non-overlapping.');
}
lastOffset = offset;
return {
generatedOffset: {
// The offset fields are 0-based, but we use 1-based indices when
// encoding/decoding from VLQ.
generatedLine: offsetLine + 1,
generatedColumn: offsetColumn + 1
},
consumer: new SourceMapConsumer(util.getArg(s, 'map'))
}
});
}
IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
/**
* The version of the source mapping spec that we are consuming.
*/
IndexedSourceMapConsumer.prototype._version = 3;
/**
* The list of original sources.
*/
Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
get: function () {
var sources = [];
for (var i = 0; i < this._sections.length; i++) {
for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
sources.push(this._sections[i].consumer.sources[j]);
}
};
return sources;
}
});
/**
* Returns the original source, line, and column information for the generated
* source's line and column positions provided. The only argument is an object
* with the following properties:
*
* - line: The line number in the generated source.
* - column: The column number in the generated source.
*
* and an object is returned with the following properties:
*
* - source: The original source file, or null.
* - line: The line number in the original source, or null.
* - column: The column number in the original source, or null.
* - name: The original identifier, or null.
*/
IndexedSourceMapConsumer.prototype.originalPositionFor =
function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
var needle = {
generatedLine: util.getArg(aArgs, 'line'),
generatedColumn: util.getArg(aArgs, 'column')
};
// Find the section containing the generated position we're trying to map
// to an original position.
var sectionIndex = binarySearch.search(needle, this._sections,
function(needle, section) {
var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
if (cmp) {
return cmp;
}
return (needle.generatedColumn -
section.generatedOffset.generatedColumn);
});
var section = this._sections[sectionIndex];
if (!section) {
return {
source: null,
line: null,
column: null,
name: null
};
}
return section.consumer.originalPositionFor({
line: needle.generatedLine -
(section.generatedOffset.generatedLine - 1),
column: needle.generatedColumn -
(section.generatedOffset.generatedLine === needle.generatedLine
? section.generatedOffset.generatedColumn - 1
: 0)
});
};
/**
* Returns the original source content. The only argument is the url of the
* original source file. Returns null if no original source content is
* available.
*/
IndexedSourceMapConsumer.prototype.sourceContentFor =
function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
for (var i = 0; i < this._sections.length; i++) {
var section = this._sections[i];
var content = section.consumer.sourceContentFor(aSource, true);
if (content) {
return content;
}
}
if (nullOnMissing) {
return null;
}
else {
throw new Error('"' + aSource + '" is not in the SourceMap.');
}
};
/**
* Returns the generated line and column information for the original source,
* line, and column positions provided. The only argument is an object with
* the following properties:
*
* - source: The filename of the original source.
* - line: The line number in the original source.
* - column: The column number in the original source.
*
* and an object is returned with the following properties:
*
* - line: The line number in the generated source, or null.
* - column: The column number in the generated source, or null.
*/
IndexedSourceMapConsumer.prototype.generatedPositionFor =
function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
for (var i = 0; i < this._sections.length; i++) {
var section = this._sections[i];
// Only consider this section if the requested source is in the list of
// sources of the consumer.
if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {
continue;
}
var generatedPosition = section.consumer.generatedPositionFor(aArgs);
if (generatedPosition) {
var ret = {
line: generatedPosition.line +
(section.generatedOffset.generatedLine - 1),
column: generatedPosition.column +
(section.generatedOffset.generatedLine === generatedPosition.line
? section.generatedOffset.generatedColumn - 1
: 0)
};
return ret;
}
}
return {
line: null,
column: null
};
};
/**
* Parse the mappings in a string in to a data structure which we can easily
* query (the ordered arrays in the `this.__generatedMappings` and
* `this.__originalMappings` properties).
*/
IndexedSourceMapConsumer.prototype._parseMappings =
function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
this.__generatedMappings = [];
this.__originalMappings = [];
for (var i = 0; i < this._sections.length; i++) {
var section = this._sections[i];
var sectionMappings = section.consumer._generatedMappings;
for (var j = 0; j < sectionMappings.length; j++) {
var mapping = sectionMappings[i];
var source = mapping.source;
var sourceRoot = section.consumer.sourceRoot;
if (source != null && sourceRoot != null) {
source = util.join(sourceRoot, source);
}
// The mappings coming from the consumer for the section have
// generated positions relative to the start of the section, so we
// need to offset them to be relative to the start of the concatenated
// generated file.
var adjustedMapping = {
source: source,
generatedLine: mapping.generatedLine +
(section.generatedOffset.generatedLine - 1),
generatedColumn: mapping.column +
(section.generatedOffset.generatedLine === mapping.generatedLine)
? section.generatedOffset.generatedColumn - 1
: 0,
originalLine: mapping.originalLine,
originalColumn: mapping.originalColumn,
name: mapping.name
};
this.__generatedMappings.push(adjustedMapping);
if (typeof adjustedMapping.originalLine === 'number') {
this.__originalMappings.push(adjustedMapping);
}
};
};
this.__generatedMappings.sort(util.compareByGeneratedPositions);
this.__originalMappings.sort(util.compareByOriginalPositions);
};
exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
});
},{"./basic-source-map-consumer":234,"./binary-search":235,"./source-map-consumer":238,"./util":241,"amdefine":23}],237:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2014 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
/**
* Determine whether mappingB is after mappingA with respect to generated
* position.
*/
function generatedPositionAfter(mappingA, mappingB) {
// Optimized for most common case
var lineA = mappingA.generatedLine;
var lineB = mappingB.generatedLine;
var columnA = mappingA.generatedColumn;
var columnB = mappingB.generatedColumn;
return lineB > lineA || lineB == lineA && columnB >= columnA ||
util.compareByGeneratedPositions(mappingA, mappingB) <= 0;
}
/**
* A data structure to provide a sorted view of accumulated mappings in a
* performance conscious manner. It trades a neglibable overhead in general
* case for a large speedup in case of mappings being added in order.
*/
function MappingList() {
this._array = [];
this._sorted = true;
// Serves as infimum
this._last = {generatedLine: -1, generatedColumn: 0};
}
/**
* Iterate through internal items. This method takes the same arguments that
* `Array.prototype.forEach` takes.
*
* NOTE: The order of the mappings is NOT guaranteed.
*/
MappingList.prototype.unsortedForEach =
function MappingList_forEach(aCallback, aThisArg) {
this._array.forEach(aCallback, aThisArg);
};
/**
* Add the given source mapping.
*
* @param Object aMapping
*/
MappingList.prototype.add = function MappingList_add(aMapping) {
var mapping;
if (generatedPositionAfter(this._last, aMapping)) {
this._last = aMapping;
this._array.push(aMapping);
} else {
this._sorted = false;
this._array.push(aMapping);
}
};
/**
* Returns the flat, sorted array of mappings. The mappings are sorted by
* generated position.
*
* WARNING: This method returns internal data without copying, for
* performance. The return value must NOT be mutated, and should be treated as
* an immutable borrow. If you want to take ownership, you must make your own
* copy.
*/
MappingList.prototype.toArray = function MappingList_toArray() {
if (!this._sorted) {
this._array.sort(util.compareByGeneratedPositions);
this._sorted = true;
}
return this._array;
};
exports.MappingList = MappingList;
});
},{"./util":241,"amdefine":23}],238:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
function SourceMapConsumer(aSourceMap) {
var sourceMap = aSourceMap;
if (typeof aSourceMap === 'string') {
sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
}
// We do late requires because the subclasses require() this file.
if (sourceMap.sections != null) {
var indexedSourceMapConsumer = require('./indexed-source-map-consumer');
return new indexedSourceMapConsumer.IndexedSourceMapConsumer(sourceMap);
} else {
var basicSourceMapConsumer = require('./basic-source-map-consumer');
return new basicSourceMapConsumer.BasicSourceMapConsumer(sourceMap);
}
}
SourceMapConsumer.fromSourceMap = function(aSourceMap) {
var basicSourceMapConsumer = require('./basic-source-map-consumer');
return basicSourceMapConsumer.BasicSourceMapConsumer
.fromSourceMap(aSourceMap);
}
/**
* The version of the source mapping spec that we are consuming.
*/
SourceMapConsumer.prototype._version = 3;
// `__generatedMappings` and `__originalMappings` are arrays that hold the
// parsed mapping coordinates from the source map's "mappings" attribute. They
// are lazily instantiated, accessed via the `_generatedMappings` and
// `_originalMappings` getters respectively, and we only parse the mappings
// and create these arrays once queried for a source location. We jump through
// these hoops because there can be many thousands of mappings, and parsing
// them is expensive, so we only want to do it if we must.
//
// Each object in the arrays is of the form:
//
// {
// generatedLine: The line number in the generated code,
// generatedColumn: The column number in the generated code,
// source: The path to the original source file that generated this
// chunk of code,
// originalLine: The line number in the original source that
// corresponds to this chunk of generated code,
// originalColumn: The column number in the original source that
// corresponds to this chunk of generated code,
// name: The name of the original symbol which generated this chunk of
// code.
// }
//
// All properties except for `generatedLine` and `generatedColumn` can be
// `null`.
//
// `_generatedMappings` is ordered by the generated positions.
//
// `_originalMappings` is ordered by the original positions.
SourceMapConsumer.prototype.__generatedMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
get: function () {
if (!this.__generatedMappings) {
this.__generatedMappings = [];
this.__originalMappings = [];
this._parseMappings(this._mappings, this.sourceRoot);
}
return this.__generatedMappings;
}
});
SourceMapConsumer.prototype.__originalMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
get: function () {
if (!this.__originalMappings) {
this.__generatedMappings = [];
this.__originalMappings = [];
this._parseMappings(this._mappings, this.sourceRoot);
}
return this.__originalMappings;
}
});
SourceMapConsumer.prototype._nextCharIsMappingSeparator =
function SourceMapConsumer_nextCharIsMappingSeparator(aStr) {
var c = aStr.charAt(0);
return c === ";" || c === ",";
};
/**
* Parse the mappings in a string in to a data structure which we can easily
* query (the ordered arrays in the `this.__generatedMappings` and
* `this.__originalMappings` properties).
*/
SourceMapConsumer.prototype._parseMappings =
function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
throw new Error("Subclasses must implement _parseMappings");
};
SourceMapConsumer.GENERATED_ORDER = 1;
SourceMapConsumer.ORIGINAL_ORDER = 2;
/**
* Iterate over each mapping between an original source/line/column and a
* generated line/column in this source map.
*
* @param Function aCallback
* The function that is called with each mapping.
* @param Object aContext
* Optional. If specified, this object will be the value of `this` every
* time that `aCallback` is called.
* @param aOrder
* Either `SourceMapConsumer.GENERATED_ORDER` or
* `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
* iterate over the mappings sorted by the generated file's line/column
* order or the original's source/line/column order, respectively. Defaults to
* `SourceMapConsumer.GENERATED_ORDER`.
*/
SourceMapConsumer.prototype.eachMapping =
function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
var context = aContext || null;
var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
var mappings;
switch (order) {
case SourceMapConsumer.GENERATED_ORDER:
mappings = this._generatedMappings;
break;
case SourceMapConsumer.ORIGINAL_ORDER:
mappings = this._originalMappings;
break;
default:
throw new Error("Unknown order of iteration.");
}
var sourceRoot = this.sourceRoot;
mappings.map(function (mapping) {
var source = mapping.source;
if (source != null && sourceRoot != null) {
source = util.join(sourceRoot, source);
}
return {
source: source,
generatedLine: mapping.generatedLine,
generatedColumn: mapping.generatedColumn,
originalLine: mapping.originalLine,
originalColumn: mapping.originalColumn,
name: mapping.name
};
}).forEach(aCallback, context);
};
/**
* Returns all generated line and column information for the original source
* and line provided. The only argument is an object with the following
* properties:
*
* - source: The filename of the original source.
* - line: The line number in the original source.
*
* and an array of objects is returned, each with the following properties:
*
* - line: The line number in the generated source, or null.
* - column: The column number in the generated source, or null.
*/
SourceMapConsumer.prototype.allGeneratedPositionsFor =
function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
// When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
// returns the index of the closest mapping less than the needle. By
// setting needle.originalColumn to Infinity, we thus find the last
// mapping for the given line, provided such a mapping exists.
var needle = {
source: util.getArg(aArgs, 'source'),
originalLine: util.getArg(aArgs, 'line'),
originalColumn: Infinity
};
if (this.sourceRoot != null) {
needle.source = util.relative(this.sourceRoot, needle.source);
}
var mappings = [];
var index = this._findMapping(needle,
this._originalMappings,
"originalLine",
"originalColumn",
util.compareByOriginalPositions);
if (index >= 0) {
var mapping = this._originalMappings[index];
while (mapping && mapping.originalLine === needle.originalLine) {
mappings.push({
line: util.getArg(mapping, 'generatedLine', null),
column: util.getArg(mapping, 'generatedColumn', null),
lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
});
mapping = this._originalMappings[--index];
}
}
return mappings.reverse();
};
exports.SourceMapConsumer = SourceMapConsumer;
});
},{"./basic-source-map-consumer":234,"./indexed-source-map-consumer":236,"./util":241,"amdefine":23}],239:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64VLQ = require('./base64-vlq');
var util = require('./util');
var ArraySet = require('./array-set').ArraySet;
var MappingList = require('./mapping-list').MappingList;
/**
* An instance of the SourceMapGenerator represents a source map which is
* being built incrementally. You may pass an object with the following
* properties:
*
* - file: The filename of the generated source.
* - sourceRoot: A root for all relative URLs in this source map.
*/
function SourceMapGenerator(aArgs) {
if (!aArgs) {
aArgs = {};
}
this._file = util.getArg(aArgs, 'file', null);
this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
this._sources = new ArraySet();
this._names = new ArraySet();
this._mappings = new MappingList();
this._sourcesContents = null;
}
SourceMapGenerator.prototype._version = 3;
/**
* Creates a new SourceMapGenerator based on a SourceMapConsumer
*
* @param aSourceMapConsumer The SourceMap.
*/
SourceMapGenerator.fromSourceMap =
function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
var sourceRoot = aSourceMapConsumer.sourceRoot;
var generator = new SourceMapGenerator({
file: aSourceMapConsumer.file,
sourceRoot: sourceRoot
});
aSourceMapConsumer.eachMapping(function (mapping) {
var newMapping = {
generated: {
line: mapping.generatedLine,
column: mapping.generatedColumn
}
};
if (mapping.source != null) {
newMapping.source = mapping.source;
if (sourceRoot != null) {
newMapping.source = util.relative(sourceRoot, newMapping.source);
}
newMapping.original = {
line: mapping.originalLine,
column: mapping.originalColumn
};
if (mapping.name != null) {
newMapping.name = mapping.name;
}
}
generator.addMapping(newMapping);
});
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content != null) {
generator.setSourceContent(sourceFile, content);
}
});
return generator;
};
/**
* Add a single mapping from original source line and column to the generated
* source's line and column for this source map being created. The mapping
* object should have the following properties:
*
* - generated: An object with the generated line and column positions.
* - original: An object with the original line and column positions.
* - source: The original source file (relative to the sourceRoot).
* - name: An optional original token name for this mapping.
*/
SourceMapGenerator.prototype.addMapping =
function SourceMapGenerator_addMapping(aArgs) {
var generated = util.getArg(aArgs, 'generated');
var original = util.getArg(aArgs, 'original', null);
var source = util.getArg(aArgs, 'source', null);
var name = util.getArg(aArgs, 'name', null);
if (!this._skipValidation) {
this._validateMapping(generated, original, source, name);
}
if (source != null && !this._sources.has(source)) {
this._sources.add(source);
}
if (name != null && !this._names.has(name)) {
this._names.add(name);
}
this._mappings.add({
generatedLine: generated.line,
generatedColumn: generated.column,
originalLine: original != null && original.line,
originalColumn: original != null && original.column,
source: source,
name: name
});
};
/**
* Set the source content for a source file.
*/
SourceMapGenerator.prototype.setSourceContent =
function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
var source = aSourceFile;
if (this._sourceRoot != null) {
source = util.relative(this._sourceRoot, source);
}
if (aSourceContent != null) {
// Add the source content to the _sourcesContents map.
// Create a new _sourcesContents map if the property is null.
if (!this._sourcesContents) {
this._sourcesContents = {};
}
this._sourcesContents[util.toSetString(source)] = aSourceContent;
} else if (this._sourcesContents) {
// Remove the source file from the _sourcesContents map.
// If the _sourcesContents map is empty, set the property to null.
delete this._sourcesContents[util.toSetString(source)];
if (Object.keys(this._sourcesContents).length === 0) {
this._sourcesContents = null;
}
}
};
/**
* Applies the mappings of a sub-source-map for a specific source file to the
* source map being generated. Each mapping to the supplied source file is
* rewritten using the supplied source map. Note: The resolution for the
* resulting mappings is the minimium of this map and the supplied map.
*
* @param aSourceMapConsumer The source map to be applied.
* @param aSourceFile Optional. The filename of the source file.
* If omitted, SourceMapConsumer's file property will be used.
* @param aSourceMapPath Optional. The dirname of the path to the source map
* to be applied. If relative, it is relative to the SourceMapConsumer.
* This parameter is needed when the two source maps aren't in the same
* directory, and the source map to be applied contains relative source
* paths. If so, those relative source paths need to be rewritten
* relative to the SourceMapGenerator.
*/
SourceMapGenerator.prototype.applySourceMap =
function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
var sourceFile = aSourceFile;
// If aSourceFile is omitted, we will use the file property of the SourceMap
if (aSourceFile == null) {
if (aSourceMapConsumer.file == null) {
throw new Error(
'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
'or the source map\'s "file" property. Both were omitted.'
);
}
sourceFile = aSourceMapConsumer.file;
}
var sourceRoot = this._sourceRoot;
// Make "sourceFile" relative if an absolute Url is passed.
if (sourceRoot != null) {
sourceFile = util.relative(sourceRoot, sourceFile);
}
// Applying the SourceMap can add and remove items from the sources and
// the names array.
var newSources = new ArraySet();
var newNames = new ArraySet();
// Find mappings for the "sourceFile"
this._mappings.unsortedForEach(function (mapping) {
if (mapping.source === sourceFile && mapping.originalLine != null) {
// Check if it can be mapped by the source map, then update the mapping.
var original = aSourceMapConsumer.originalPositionFor({
line: mapping.originalLine,
column: mapping.originalColumn
});
if (original.source != null) {
// Copy mapping
mapping.source = original.source;
if (aSourceMapPath != null) {
mapping.source = util.join(aSourceMapPath, mapping.source)
}
if (sourceRoot != null) {
mapping.source = util.relative(sourceRoot, mapping.source);
}
mapping.originalLine = original.line;
mapping.originalColumn = original.column;
if (original.name != null) {
mapping.name = original.name;
}
}
}
var source = mapping.source;
if (source != null && !newSources.has(source)) {
newSources.add(source);
}
var name = mapping.name;
if (name != null && !newNames.has(name)) {
newNames.add(name);
}
}, this);
this._sources = newSources;
this._names = newNames;
// Copy sourcesContents of applied map.
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content != null) {
if (aSourceMapPath != null) {
sourceFile = util.join(aSourceMapPath, sourceFile);
}
if (sourceRoot != null) {
sourceFile = util.relative(sourceRoot, sourceFile);
}
this.setSourceContent(sourceFile, content);
}
}, this);
};
/**
* A mapping can have one of the three levels of data:
*
* 1. Just the generated position.
* 2. The Generated position, original position, and original source.
* 3. Generated and original position, original source, as well as a name
* token.
*
* To maintain consistency, we validate that any new mapping being added falls
* in to one of these categories.
*/
SourceMapGenerator.prototype._validateMapping =
function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
aName) {
if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
&& aGenerated.line > 0 && aGenerated.column >= 0
&& !aOriginal && !aSource && !aName) {
// Case 1.
return;
}
else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
&& aOriginal && 'line' in aOriginal && 'column' in aOriginal
&& aGenerated.line > 0 && aGenerated.column >= 0
&& aOriginal.line > 0 && aOriginal.column >= 0
&& aSource) {
// Cases 2 and 3.
return;
}
else {
throw new Error('Invalid mapping: ' + JSON.stringify({
generated: aGenerated,
source: aSource,
original: aOriginal,
name: aName
}));
}
};
/**
* Serialize the accumulated mappings in to the stream of base 64 VLQs
* specified by the source map format.
*/
SourceMapGenerator.prototype._serializeMappings =
function SourceMapGenerator_serializeMappings() {
var previousGeneratedColumn = 0;
var previousGeneratedLine = 1;
var previousOriginalColumn = 0;
var previousOriginalLine = 0;
var previousName = 0;
var previousSource = 0;
var result = '';
var mapping;
var mappings = this._mappings.toArray();
for (var i = 0, len = mappings.length; i < len; i++) {
mapping = mappings[i];
if (mapping.generatedLine !== previousGeneratedLine) {
previousGeneratedColumn = 0;
while (mapping.generatedLine !== previousGeneratedLine) {
result += ';';
previousGeneratedLine++;
}
}
else {
if (i > 0) {
if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) {
continue;
}
result += ',';
}
}
result += base64VLQ.encode(mapping.generatedColumn
- previousGeneratedColumn);
previousGeneratedColumn = mapping.generatedColumn;
if (mapping.source != null) {
result += base64VLQ.encode(this._sources.indexOf(mapping.source)
- previousSource);
previousSource = this._sources.indexOf(mapping.source);
// lines are stored 0-based in SourceMap spec version 3
result += base64VLQ.encode(mapping.originalLine - 1
- previousOriginalLine);
previousOriginalLine = mapping.originalLine - 1;
result += base64VLQ.encode(mapping.originalColumn
- previousOriginalColumn);
previousOriginalColumn = mapping.originalColumn;
if (mapping.name != null) {
result += base64VLQ.encode(this._names.indexOf(mapping.name)
- previousName);
previousName = this._names.indexOf(mapping.name);
}
}
}
return result;
};
SourceMapGenerator.prototype._generateSourcesContent =
function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
return aSources.map(function (source) {
if (!this._sourcesContents) {
return null;
}
if (aSourceRoot != null) {
source = util.relative(aSourceRoot, source);
}
var key = util.toSetString(source);
return Object.prototype.hasOwnProperty.call(this._sourcesContents,
key)
? this._sourcesContents[key]
: null;
}, this);
};
/**
* Externalize the source map.
*/
SourceMapGenerator.prototype.toJSON =
function SourceMapGenerator_toJSON() {
var map = {
version: this._version,
sources: this._sources.toArray(),
names: this._names.toArray(),
mappings: this._serializeMappings()
};
if (this._file != null) {
map.file = this._file;
}
if (this._sourceRoot != null) {
map.sourceRoot = this._sourceRoot;
}
if (this._sourcesContents) {
map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
}
return map;
};
/**
* Render the source map being generated to a string.
*/
SourceMapGenerator.prototype.toString =
function SourceMapGenerator_toString() {
return JSON.stringify(this);
};
exports.SourceMapGenerator = SourceMapGenerator;
});
},{"./array-set":231,"./base64-vlq":232,"./mapping-list":237,"./util":241,"amdefine":23}],240:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
var util = require('./util');
// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
// operating systems these days (capturing the result).
var REGEX_NEWLINE = /(\r?\n)/;
// Newline character code for charCodeAt() comparisons
var NEWLINE_CODE = 10;
// Private symbol for identifying `SourceNode`s when multiple versions of
// the source-map library are loaded. This MUST NOT CHANGE across
// versions!
var isSourceNode = "$$$isSourceNode$$$";
/**
* SourceNodes provide a way to abstract over interpolating/concatenating
* snippets of generated JavaScript source code while maintaining the line and
* column information associated with the original source code.
*
* @param aLine The original line number.
* @param aColumn The original column number.
* @param aSource The original source's filename.
* @param aChunks Optional. An array of strings which are snippets of
* generated JS, or other SourceNodes.
* @param aName The original identifier.
*/
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
this.children = [];
this.sourceContents = {};
this.line = aLine == null ? null : aLine;
this.column = aColumn == null ? null : aColumn;
this.source = aSource == null ? null : aSource;
this.name = aName == null ? null : aName;
this[isSourceNode] = true;
if (aChunks != null) this.add(aChunks);
}
/**
* Creates a SourceNode from generated code and a SourceMapConsumer.
*
* @param aGeneratedCode The generated code
* @param aSourceMapConsumer The SourceMap for the generated code
* @param aRelativePath Optional. The path that relative sources in the
* SourceMapConsumer should be relative to.
*/
SourceNode.fromStringWithSourceMap =
function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
// The SourceNode we want to fill with the generated code
// and the SourceMap
var node = new SourceNode();
// All even indices of this array are one line of the generated code,
// while all odd indices are the newlines between two adjacent lines
// (since `REGEX_NEWLINE` captures its match).
// Processed fragments are removed from this array, by calling `shiftNextLine`.
var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
var shiftNextLine = function() {
var lineContents = remainingLines.shift();
// The last line of a file might not have a newline.
var newLine = remainingLines.shift() || "";
return lineContents + newLine;
};
// We need to remember the position of "remainingLines"
var lastGeneratedLine = 1, lastGeneratedColumn = 0;
// The generate SourceNodes we need a code range.
// To extract it current and last mapping is used.
// Here we store the last mapping.
var lastMapping = null;
aSourceMapConsumer.eachMapping(function (mapping) {
if (lastMapping !== null) {
// We add the code from "lastMapping" to "mapping":
// First check if there is a new line in between.
if (lastGeneratedLine < mapping.generatedLine) {
var code = "";
// Associate first line with "lastMapping"
addMappingWithCode(lastMapping, shiftNextLine());
lastGeneratedLine++;
lastGeneratedColumn = 0;
// The remaining code is added without mapping
} else {
// There is no new line in between.
// Associate the code between "lastGeneratedColumn" and
// "mapping.generatedColumn" with "lastMapping"
var nextLine = remainingLines[0];
var code = nextLine.substr(0, mapping.generatedColumn -
lastGeneratedColumn);
remainingLines[0] = nextLine.substr(mapping.generatedColumn -
lastGeneratedColumn);
lastGeneratedColumn = mapping.generatedColumn;
addMappingWithCode(lastMapping, code);
// No more remaining code, continue
lastMapping = mapping;
return;
}
}
// We add the generated code until the first mapping
// to the SourceNode without any mapping.
// Each line is added as separate string.
while (lastGeneratedLine < mapping.generatedLine) {
node.add(shiftNextLine());
lastGeneratedLine++;
}
if (lastGeneratedColumn < mapping.generatedColumn) {
var nextLine = remainingLines[0];
node.add(nextLine.substr(0, mapping.generatedColumn));
remainingLines[0] = nextLine.substr(mapping.generatedColumn);
lastGeneratedColumn = mapping.generatedColumn;
}
lastMapping = mapping;
}, this);
// We have processed all mappings.
if (remainingLines.length > 0) {
if (lastMapping) {
// Associate the remaining code in the current line with "lastMapping"
addMappingWithCode(lastMapping, shiftNextLine());
}
// and add the remaining lines without any mapping
node.add(remainingLines.join(""));
}
// Copy sourcesContent into SourceNode
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content != null) {
if (aRelativePath != null) {
sourceFile = util.join(aRelativePath, sourceFile);
}
node.setSourceContent(sourceFile, content);
}
});
return node;
function addMappingWithCode(mapping, code) {
if (mapping === null || mapping.source === undefined) {
node.add(code);
} else {
var source = aRelativePath
? util.join(aRelativePath, mapping.source)
: mapping.source;
node.add(new SourceNode(mapping.originalLine,
mapping.originalColumn,
source,
code,
mapping.name));
}
}
};
/**
* Add a chunk of generated JS to this source node.
*
* @param aChunk A string snippet of generated JS code, another instance of
* SourceNode, or an array where each member is one of those things.
*/
SourceNode.prototype.add = function SourceNode_add(aChunk) {
if (Array.isArray(aChunk)) {
aChunk.forEach(function (chunk) {
this.add(chunk);
}, this);
}
else if (aChunk[isSourceNode] || typeof aChunk === "string") {
if (aChunk) {
this.children.push(aChunk);
}
}
else {
throw new TypeError(
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
);
}
return this;
};
/**
* Add a chunk of generated JS to the beginning of this source node.
*
* @param aChunk A string snippet of generated JS code, another instance of
* SourceNode, or an array where each member is one of those things.
*/
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
if (Array.isArray(aChunk)) {
for (var i = aChunk.length-1; i >= 0; i--) {
this.prepend(aChunk[i]);
}
}
else if (aChunk[isSourceNode] || typeof aChunk === "string") {
this.children.unshift(aChunk);
}
else {
throw new TypeError(
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
);
}
return this;
};
/**
* Walk over the tree of JS snippets in this node and its children. The
* walking function is called once for each snippet of JS and is passed that
* snippet and the its original associated source's line/column location.
*
* @param aFn The traversal function.
*/
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
var chunk;
for (var i = 0, len = this.children.length; i < len; i++) {
chunk = this.children[i];
if (chunk[isSourceNode]) {
chunk.walk(aFn);
}
else {
if (chunk !== '') {
aFn(chunk, { source: this.source,
line: this.line,
column: this.column,
name: this.name });
}
}
}
};
/**
* Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
* each of `this.children`.
*
* @param aSep The separator.
*/
SourceNode.prototype.join = function SourceNode_join(aSep) {
var newChildren;
var i;
var len = this.children.length;
if (len > 0) {
newChildren = [];
for (i = 0; i < len-1; i++) {
newChildren.push(this.children[i]);
newChildren.push(aSep);
}
newChildren.push(this.children[i]);
this.children = newChildren;
}
return this;
};
/**
* Call String.prototype.replace on the very right-most source snippet. Useful
* for trimming whitespace from the end of a source node, etc.
*
* @param aPattern The pattern to replace.
* @param aReplacement The thing to replace the pattern with.
*/
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
var lastChild = this.children[this.children.length - 1];
if (lastChild[isSourceNode]) {
lastChild.replaceRight(aPattern, aReplacement);
}
else if (typeof lastChild === 'string') {
this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
}
else {
this.children.push(''.replace(aPattern, aReplacement));
}
return this;
};
/**
* Set the source content for a source file. This will be added to the SourceMapGenerator
* in the sourcesContent field.
*
* @param aSourceFile The filename of the source file
* @param aSourceContent The content of the source file
*/
SourceNode.prototype.setSourceContent =
function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
};
/**
* Walk over the tree of SourceNodes. The walking function is called for each
* source file content and is passed the filename and source content.
*
* @param aFn The traversal function.
*/
SourceNode.prototype.walkSourceContents =
function SourceNode_walkSourceContents(aFn) {
for (var i = 0, len = this.children.length; i < len; i++) {
if (this.children[i][isSourceNode]) {
this.children[i].walkSourceContents(aFn);
}
}
var sources = Object.keys(this.sourceContents);
for (var i = 0, len = sources.length; i < len; i++) {
aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
}
};
/**
* Return the string representation of this source node. Walks over the tree
* and concatenates all the various snippets together to one string.
*/
SourceNode.prototype.toString = function SourceNode_toString() {
var str = "";
this.walk(function (chunk) {
str += chunk;
});
return str;
};
/**
* Returns the string representation of this source node along with a source
* map.
*/
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
var generated = {
code: "",
line: 1,
column: 0
};
var map = new SourceMapGenerator(aArgs);
var sourceMappingActive = false;
var lastOriginalSource = null;
var lastOriginalLine = null;
var lastOriginalColumn = null;
var lastOriginalName = null;
this.walk(function (chunk, original) {
generated.code += chunk;
if (original.source !== null
&& original.line !== null
&& original.column !== null) {
if(lastOriginalSource !== original.source
|| lastOriginalLine !== original.line
|| lastOriginalColumn !== original.column
|| lastOriginalName !== original.name) {
map.addMapping({
source: original.source,
original: {
line: original.line,
column: original.column
},
generated: {
line: generated.line,
column: generated.column
},
name: original.name
});
}
lastOriginalSource = original.source;
lastOriginalLine = original.line;
lastOriginalColumn = original.column;
lastOriginalName = original.name;
sourceMappingActive = true;
} else if (sourceMappingActive) {
map.addMapping({
generated: {
line: generated.line,
column: generated.column
}
});
lastOriginalSource = null;
sourceMappingActive = false;
}
for (var idx = 0, length = chunk.length; idx < length; idx++) {
if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
generated.line++;
generated.column = 0;
// Mappings end at eol
if (idx + 1 === length) {
lastOriginalSource = null;
sourceMappingActive = false;
} else if (sourceMappingActive) {
map.addMapping({
source: original.source,
original: {
line: original.line,
column: original.column
},
generated: {
line: generated.line,
column: generated.column
},
name: original.name
});
}
} else {
generated.column++;
}
}
});
this.walkSourceContents(function (sourceFile, sourceContent) {
map.setSourceContent(sourceFile, sourceContent);
});
return { code: generated.code, map: map };
};
exports.SourceNode = SourceNode;
});
},{"./source-map-generator":239,"./util":241,"amdefine":23}],241:[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
/**
* This is a helper function for getting values from parameter/options
* objects.
*
* @param args The object we are extracting values from
* @param name The name of the property we are getting.
* @param defaultValue An optional value to return if the property is missing
* from the object. If this is not specified and the property is missing, an
* error will be thrown.
*/
function getArg(aArgs, aName, aDefaultValue) {
if (aName in aArgs) {
return aArgs[aName];
} else if (arguments.length === 3) {
return aDefaultValue;
} else {
throw new Error('"' + aName + '" is a required argument.');
}
}
exports.getArg = getArg;
var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/;
var dataUrlRegexp = /^data:.+\,.+$/;
function urlParse(aUrl) {
var match = aUrl.match(urlRegexp);
if (!match) {
return null;
}
return {
scheme: match[1],
auth: match[2],
host: match[3],
port: match[4],
path: match[5]
};
}
exports.urlParse = urlParse;
function urlGenerate(aParsedUrl) {
var url = '';
if (aParsedUrl.scheme) {
url += aParsedUrl.scheme + ':';
}
url += '//';
if (aParsedUrl.auth) {
url += aParsedUrl.auth + '@';
}
if (aParsedUrl.host) {
url += aParsedUrl.host;
}
if (aParsedUrl.port) {
url += ":" + aParsedUrl.port
}
if (aParsedUrl.path) {
url += aParsedUrl.path;
}
return url;
}
exports.urlGenerate = urlGenerate;
/**
* Normalizes a path, or the path portion of a URL:
*
* - Replaces consequtive slashes with one slash.
* - Removes unnecessary '.' parts.
* - Removes unnecessary '/..' parts.
*
* Based on code in the Node.js 'path' core module.
*
* @param aPath The path or url to normalize.
*/
function normalize(aPath) {
var path = aPath;
var url = urlParse(aPath);
if (url) {
if (!url.path) {
return aPath;
}
path = url.path;
}
var isAbsolute = (path.charAt(0) === '/');
var parts = path.split(/\/+/);
for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
part = parts[i];
if (part === '.') {
parts.splice(i, 1);
} else if (part === '..') {
up++;
} else if (up > 0) {
if (part === '') {
// The first part is blank if the path is absolute. Trying to go
// above the root is a no-op. Therefore we can remove all '..' parts
// directly after the root.
parts.splice(i + 1, up);
up = 0;
} else {
parts.splice(i, 2);
up--;
}
}
}
path = parts.join('/');
if (path === '') {
path = isAbsolute ? '/' : '.';
}
if (url) {
url.path = path;
return urlGenerate(url);
}
return path;
}
exports.normalize = normalize;
/**
* Joins two paths/URLs.
*
* @param aRoot The root path or URL.
* @param aPath The path or URL to be joined with the root.
*
* - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
* scheme-relative URL: Then the scheme of aRoot, if any, is prepended
* first.
* - Otherwise aPath is a path. If aRoot is a URL, then its path portion
* is updated with the result and aRoot is returned. Otherwise the result
* is returned.
* - If aPath is absolute, the result is aPath.
* - Otherwise the two paths are joined with a slash.
* - Joining for example 'http://' and 'www.example.com' is also supported.
*/
function join(aRoot, aPath) {
if (aRoot === "") {
aRoot = ".";
}
if (aPath === "") {
aPath = ".";
}
var aPathUrl = urlParse(aPath);
var aRootUrl = urlParse(aRoot);
if (aRootUrl) {
aRoot = aRootUrl.path || '/';
}
// `join(foo, '//www.example.org')`
if (aPathUrl && !aPathUrl.scheme) {
if (aRootUrl) {
aPathUrl.scheme = aRootUrl.scheme;
}
return urlGenerate(aPathUrl);
}
if (aPathUrl || aPath.match(dataUrlRegexp)) {
return aPath;
}
// `join('http://', 'www.example.com')`
if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
aRootUrl.host = aPath;
return urlGenerate(aRootUrl);
}
var joined = aPath.charAt(0) === '/'
? aPath
: normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
if (aRootUrl) {
aRootUrl.path = joined;
return urlGenerate(aRootUrl);
}
return joined;
}
exports.join = join;
/**
* Make a path relative to a URL or another path.
*
* @param aRoot The root path or URL.
* @param aPath The path or URL to be made relative to aRoot.
*/
function relative(aRoot, aPath) {
if (aRoot === "") {
aRoot = ".";
}
aRoot = aRoot.replace(/\/$/, '');
// XXX: It is possible to remove this block, and the tests still pass!
var url = urlParse(aRoot);
if (aPath.charAt(0) == "/" && url && url.path == "/") {
return aPath.slice(1);
}
return aPath.indexOf(aRoot + '/') === 0
? aPath.substr(aRoot.length + 1)
: aPath;
}
exports.relative = relative;
/**
* Because behavior goes wacky when you set `__proto__` on objects, we
* have to prefix all the strings in our set with an arbitrary character.
*
* See https://github.com/mozilla/source-map/pull/31 and
* https://github.com/mozilla/source-map/issues/30
*
* @param String aStr
*/
function toSetString(aStr) {
return '$' + aStr;
}
exports.toSetString = toSetString;
function fromSetString(aStr) {
return aStr.substr(1);
}
exports.fromSetString = fromSetString;
function strcmp(aStr1, aStr2) {
var s1 = aStr1 || "";
var s2 = aStr2 || "";
return (s1 > s2) - (s1 < s2);
}
/**
* Comparator between two mappings where the original positions are compared.
*
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
* mappings with the same original source/line/column, but different generated
* line and column the same. Useful when searching for a mapping with a
* stubbed out mapping.
*/
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
var cmp;
cmp = strcmp(mappingA.source, mappingB.source);
if (cmp) {
return cmp;
}
cmp = mappingA.originalLine - mappingB.originalLine;
if (cmp) {
return cmp;
}
cmp = mappingA.originalColumn - mappingB.originalColumn;
if (cmp || onlyCompareOriginal) {
return cmp;
}
cmp = strcmp(mappingA.name, mappingB.name);
if (cmp) {
return cmp;
}
cmp = mappingA.generatedLine - mappingB.generatedLine;
if (cmp) {
return cmp;
}
return mappingA.generatedColumn - mappingB.generatedColumn;
};
exports.compareByOriginalPositions = compareByOriginalPositions;
/**
* Comparator between two mappings where the generated positions are
* compared.
*
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
* mappings with the same generated line and column, but different
* source/name/original line and column the same. Useful when searching for a
* mapping with a stubbed out mapping.
*/
function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {
var cmp;
cmp = mappingA.generatedLine - mappingB.generatedLine;
if (cmp) {
return cmp;
}
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
if (cmp || onlyCompareGenerated) {
return cmp;
}
cmp = strcmp(mappingA.source, mappingB.source);
if (cmp) {
return cmp;
}
cmp = mappingA.originalLine - mappingB.originalLine;
if (cmp) {
return cmp;
}
cmp = mappingA.originalColumn - mappingB.originalColumn;
if (cmp) {
return cmp;
}
return strcmp(mappingA.name, mappingB.name);
};
exports.compareByGeneratedPositions = compareByGeneratedPositions;
});
},{"amdefine":23}],242:[function(require,module,exports){
module.exports={
"_args": [
[
"escodegen@^1.7.0",
"/Users/ajo/workspace/hydrolysis"
]
],
"_from": "escodegen@>=1.7.0 <2.0.0",
"_id": "escodegen@1.8.0",
"_inCache": true,
"_installable": true,
"_location": "/escodegen",
"_nodeVersion": "4.1.1",
"_npmUser": {
"email": "utatane.tea@gmail.com",
"name": "constellation"
},
"_npmVersion": "2.14.4",
"_phantomChildren": {
"amdefine": "1.0.0"
},
"_requested": {
"name": "escodegen",
"raw": "escodegen@^1.7.0",
"rawSpec": "^1.7.0",
"scope": null,
"spec": ">=1.7.0 <2.0.0",
"type": "range"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.0.tgz",
"_shasum": "b246aae829ce73d59e2c55727359edd1c130a81b",
"_shrinkwrap": null,
"_spec": "escodegen@^1.7.0",
"_where": "/Users/ajo/workspace/hydrolysis",
"bin": {
"escodegen": "./bin/escodegen.js",
"esgenerate": "./bin/esgenerate.js"
},
"bugs": {
"url": "https://github.com/estools/escodegen/issues"
},
"dependencies": {
"esprima": "^2.7.1",
"estraverse": "^1.9.1",
"esutils": "^2.0.2",
"optionator": "^0.8.1",
"source-map": "~0.2.0"
},
"description": "ECMAScript code generator",
"devDependencies": {
"acorn-6to5": "^0.11.1-25",
"bluebird": "^2.3.11",
"bower-registry-client": "^0.2.1",
"chai": "^1.10.0",
"commonjs-everywhere": "^0.9.7",
"gulp": "^3.8.10",
"gulp-eslint": "^0.2.0",
"gulp-mocha": "^2.0.0",
"semver": "^5.1.0"
},
"directories": {},
"dist": {
"shasum": "b246aae829ce73d59e2c55727359edd1c130a81b",
"tarball": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.0.tgz"
},
"engines": {
"node": ">=0.12.0"
},
"files": [
"LICENSE.BSD",
"LICENSE.source-map",
"README.md",
"bin",
"escodegen.js",
"package.json"
],
"gitHead": "0e8280aa061a0dbefb32d277a05015baa7f3e7f2",
"homepage": "http://github.com/estools/escodegen",
"license": "BSD-2-Clause",
"main": "escodegen.js",
"maintainers": [
{
"name": "constellation",
"email": "utatane.tea@gmail.com"
},
{
"name": "michaelficarra",
"email": "npm@michael.ficarra.me"
}
],
"name": "escodegen",
"optionalDependencies": {
"source-map": "~0.2.0"
},
"readme": "ERROR: No README data found!",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/estools/escodegen.git"
},
"scripts": {
"build": "cjsify -a path: tools/entry-point.js > escodegen.browser.js",
"build-min": "cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",
"lint": "gulp lint",
"release": "node tools/release.js",
"test": "gulp travis",
"unit-test": "gulp test"
},
"version": "1.8.0"
}
},{}],243:[function(require,module,exports){
/**
* @fileoverview Main Espree file that converts Acorn into Esprima output.
* Copyright 2015 Nicholas C. Zakas. All rights reserved.
*
* This file contains code from the following MIT-licensed projects:
* 1. Acorn
* 2. Babylon
* 3. Babel-ESLint
*
* This file also contains code from Esprima, which is BSD licensed.
*
* Acorn is Copyright 2012-2015 Acorn Contributors (https://github.com/marijnh/acorn/blob/master/AUTHORS)
* Babylon is Copyright 2014-2015 various contributors (https://github.com/babel/babel/blob/master/packages/babylon/AUTHORS)
* Babel-ESLint is Copyright 2014-2015 Sebastian McKenzie
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Esprima is Copyright (c) jQuery Foundation, Inc. and Contributors, All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* eslint no-undefined:0, no-use-before-define: 0 */
"use strict";
var astNodeTypes = require("./lib/ast-node-types"),
commentAttachment = require("./lib/comment-attachment"),
TokenTranslator = require("./lib/token-translator"),
acornJSX = require("acorn-jsx/inject"),
rawAcorn = require("acorn");
var acorn = acornJSX(rawAcorn);
var lookahead,
extra,
lastToken;
/**
* Resets the extra object to its default.
* @returns {void}
* @private
*/
function resetExtra() {
extra = {
tokens: null,
range: false,
loc: false,
comment: false,
comments: [],
tolerant: false,
errors: [],
strict: false,
ecmaFeatures: {},
ecmaVersion: 5,
isModule: false
};
}
var tt = acorn.tokTypes,
getLineInfo = acorn.getLineInfo;
// custom type for JSX attribute values
tt.jsxAttrValueToken = {};
/**
* Determines if a node is valid given the set of ecmaFeatures.
* @param {ASTNode} node The node to check.
* @returns {boolean} True if the node is allowed, false if not.
* @private
*/
function isValidNode(node) {
var ecma = extra.ecmaFeatures;
switch (node.type) {
case "ExperimentalSpreadProperty":
case "ExperimentalRestProperty":
return ecma.experimentalObjectRestSpread;
case "ImportDeclaration":
case "ExportNamedDeclaration":
case "ExportDefaultDeclaration":
case "ExportAllDeclaration":
return extra.isModule;
default:
return true;
}
}
/**
* Performs last-minute Esprima-specific compatibility checks and fixes.
* @param {ASTNode} result The node to check.
* @returns {ASTNode} The finished node.
* @private
* @this acorn.Parser
*/
function esprimaFinishNode(result) {
// ensure that parsed node was allowed through ecmaFeatures
if (!isValidNode(result)) {
this.unexpected(result.start);
}
// https://github.com/marijnh/acorn/issues/323
if (result.type === "TryStatement") {
delete result.guardedHandlers;
} else if (result.type === "CatchClause") {
delete result.guard;
}
// Acorn doesn't count the opening and closing backticks as part of templates
// so we have to adjust ranges/locations appropriately.
if (result.type === "TemplateElement") {
// additional adjustment needed if ${ is the last token
var terminalDollarBraceL = this.input.slice(result.end, result.end + 2) === "${";
if (result.range) {
result.range[0]--;
result.range[1] += (terminalDollarBraceL ? 2 : 1);
}
if (result.loc) {
result.loc.start.column--;
result.loc.end.column += (terminalDollarBraceL ? 2 : 1);
}
}
// Acorn currently uses expressions instead of declarations in default exports
if (result.type === "ExportDefaultDeclaration") {
if (/^(Class|Function)Expression$/.test(result.declaration.type)) {
result.declaration.type = result.declaration.type.replace("Expression", "Declaration");
}
}
// Acorn uses undefined instead of null, which affects serialization
if (result.type === "Literal" && result.value === undefined) {
result.value = null;
}
if (extra.attachComment) {
commentAttachment.processComment(result);
}
if (result.type.indexOf("Function") > -1 && !result.generator) {
result.generator = false;
}
return result;
}
/**
* Determines if a token is valid given the set of ecmaFeatures.
* @param {acorn.Parser} parser The parser to check.
* @returns {boolean} True if the token is allowed, false if not.
* @private
*/
function isValidToken(parser) {
var ecma = extra.ecmaFeatures;
var type = parser.type;
switch (type) {
case tt.jsxName:
case tt.jsxText:
case tt.jsxTagStart:
case tt.jsxTagEnd:
return ecma.jsx;
// https://github.com/ternjs/acorn/issues/363
case tt.regexp:
if (extra.ecmaVersion < 6 && parser.value.flags && parser.value.flags.indexOf("y") > -1) {
return false;
}
return true;
default:
return true;
}
}
/**
* Injects esprimaFinishNode into the finishNode process.
* @param {Function} finishNode Original finishNode function.
* @returns {ASTNode} The finished node.
* @private
*/
function wrapFinishNode(finishNode) {
return /** @this acorn.Parser */ function(node, type, pos, loc) {
var result = finishNode.call(this, node, type, pos, loc);
return esprimaFinishNode.call(this, result);
};
}
acorn.plugins.espree = function(instance) {
instance.extend("finishNode", wrapFinishNode);
instance.extend("finishNodeAt", wrapFinishNode);
instance.extend("next", function(next) {
return /** @this acorn.Parser */ function() {
if (!isValidToken(this)) {
this.unexpected();
}
return next.call(this);
};
});
// needed for experimental object rest/spread
instance.extend("checkLVal", function(checkLVal) {
return /** @this acorn.Parser */ function(expr, isBinding, checkClashes) {
if (extra.ecmaFeatures.experimentalObjectRestSpread && expr.type === "ObjectPattern") {
for (var i = 0; i < expr.properties.length; i++) {
if (expr.properties[i].type.indexOf("Experimental") === -1) {
this.checkLVal(expr.properties[i].value, isBinding, checkClashes);
}
}
return undefined;
}
return checkLVal.call(this, expr, isBinding, checkClashes);
};
});
instance.extend("parseTopLevel", function(parseTopLevel) {
return /** @this acorn.Parser */ function(node) {
if (extra.ecmaFeatures.impliedStrict && this.options.ecmaVersion >= 5) {
this.strict = true;
}
return parseTopLevel.call(this, node);
};
});
instance.extend("toAssignable", function(toAssignable) {
return /** @this acorn.Parser */ function(node, isBinding) {
if (extra.ecmaFeatures.experimentalObjectRestSpread &&
node.type === "ObjectExpression"
) {
node.type = "ObjectPattern";
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
if (prop.type === "ExperimentalSpreadProperty") {
prop.type = "ExperimentalRestProperty";
} else if (prop.kind !== "init") {
this.raise(prop.key.start, "Object pattern can't contain getter or setter");
} else {
this.toAssignable(prop.value, isBinding);
}
}
return node;
} else {
return toAssignable.call(this, node, isBinding);
}
};
});
/**
* Method to parse an object rest or object spread.
* @returns {ASTNode} The node representing object rest or object spread.
* @this acorn.Parser
*/
instance.parseObjectRest = function() {
var node = this.startNode();
this.next();
node.argument = this.parseIdent();
return this.finishNode(node, "ExperimentalRestProperty");
};
/**
* Method to parse an object with object rest or object spread.
* @param {boolean} isPattern True if the object is a destructuring pattern.
* @param {Object} refShorthandDefaultPos ?
* @returns {ASTNode} The node representing object rest or object spread.
* @this acorn.Parser
*/
instance.parseObj = function(isPattern, refShorthandDefaultPos) {
var node = this.startNode(),
first = true,
propHash = {};
node.properties = [];
this.next();
while (!this.eat(tt.braceR)) {
if (!first) {
this.expect(tt.comma);
if (this.afterTrailingComma(tt.braceR)) {
break;
}
} else {
first = false;
}
var prop = this.startNode(),
isGenerator,
startPos,
startLoc;
if (extra.ecmaFeatures.experimentalObjectRestSpread && this.type === tt.ellipsis) {
if (isPattern) {
prop = this.parseObjectRest();
} else {
prop = this.parseSpread();
prop.type = "ExperimentalSpreadProperty";
}
node.properties.push(prop);
continue;
}
if (this.options.ecmaVersion >= 6) {
prop.method = false;
prop.shorthand = false;
if (isPattern || refShorthandDefaultPos) {
startPos = this.start;
startLoc = this.startLoc;
}
if (!isPattern) {
isGenerator = this.eat(tt.star);
}
}
this.parsePropertyName(prop);
this.parsePropertyValue(prop, isPattern, isGenerator, startPos, startLoc, refShorthandDefaultPos);
this.checkPropClash(prop, propHash);
node.properties.push(this.finishNode(prop, "Property"));
}
return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression");
};
/**
* Overwrites the default raise method to throw Esprima-style errors.
* @param {int} pos The position of the error.
* @param {string} message The error message.
* @throws {SyntaxError} A syntax error.
* @returns {void}
*/
instance.raise = instance.raiseRecoverable = function(pos, message) {
var loc = getLineInfo(this.input, pos);
var err = new SyntaxError(message);
err.index = pos;
err.lineNumber = loc.line;
err.column = loc.column + 1; // acorn uses 0-based columns
throw err;
};
/**
* Overwrites the default unexpected method to throw Esprima-style errors.
* @param {int} pos The position of the error.
* @throws {SyntaxError} A syntax error.
* @returns {void}
*/
instance.unexpected = function(pos) {
var message = "Unexpected token";
if (pos !== null && pos !== undefined) {
this.pos = pos;
if (this.options.locations) {
while (this.pos < this.lineStart) {
this.lineStart = this.input.lastIndexOf("\n", this.lineStart - 2) + 1;
--this.curLine;
}
}
this.nextToken();
}
if (this.end > this.start) {
message += " " + this.input.slice(this.start, this.end);
}
this.raise(this.start, message);
};
/*
* Esprima-FB represents JSX strings as tokens called "JSXText", but Acorn-JSX
* uses regular tt.string without any distinction between this and regular JS
* strings. As such, we intercept an attempt to read a JSX string and set a flag
* on extra so that when tokens are converted, the next token will be switched
* to JSXText via onToken.
*/
instance.extend("jsx_readString", function(jsxReadString) {
return /** @this acorn.Parser */ function(quote) {
var result = jsxReadString.call(this, quote);
if (this.type === tt.string) {
extra.jsxAttrValueToken = true;
}
return result;
};
});
};
//------------------------------------------------------------------------------
// Tokenizer
//------------------------------------------------------------------------------
/**
* Tokenizes the given code.
* @param {string} code The code to tokenize.
* @param {Object} options Options defining how to tokenize.
* @returns {Token[]} An array of tokens.
* @throws {SyntaxError} If the input code is invalid.
* @private
*/
function tokenize(code, options) {
var toString,
tokens,
impliedStrict,
translator = new TokenTranslator(tt, code);
toString = String;
if (typeof code !== "string" && !(code instanceof String)) {
code = toString(code);
}
lookahead = null;
// Options matching.
options = options || {};
var acornOptions = {
ecmaVersion: 5,
plugins: {
espree: true
}
};
resetExtra();
// Of course we collect tokens here.
options.tokens = true;
extra.tokens = [];
extra.range = (typeof options.range === "boolean") && options.range;
acornOptions.ranges = extra.range;
extra.loc = (typeof options.loc === "boolean") && options.loc;
acornOptions.locations = extra.loc;
extra.comment = typeof options.comment === "boolean" && options.comment;
if (extra.comment) {
acornOptions.onComment = function() {
var comment = convertAcornCommentToEsprimaComment.apply(this, arguments);
extra.comments.push(comment);
};
}
extra.tolerant = typeof options.tolerant === "boolean" && options.tolerant;
if (typeof options.ecmaVersion === "number") {
switch (options.ecmaVersion) {
case 3:
case 5:
case 6:
case 7:
acornOptions.ecmaVersion = options.ecmaVersion;
extra.ecmaVersion = options.ecmaVersion;
break;
default:
throw new Error("ecmaVersion must be 3, 5, 6, or 7.");
}
}
// apply parsing flags
if (options.ecmaFeatures && typeof options.ecmaFeatures === "object") {
extra.ecmaFeatures = options.ecmaFeatures;
impliedStrict = extra.ecmaFeatures.impliedStrict;
extra.ecmaFeatures.impliedStrict = typeof impliedStrict === "boolean" && impliedStrict;
}
try {
var tokenizer = acorn.tokenizer(code, acornOptions);
while ((lookahead = tokenizer.getToken()).type !== tt.eof) {
translator.onToken(lookahead, extra);
}
// filterTokenLocation();
tokens = extra.tokens;
if (extra.comment) {
tokens.comments = extra.comments;
}
if (extra.tolerant) {
tokens.errors = extra.errors;
}
} catch (e) {
throw e;
}
return tokens;
}
//------------------------------------------------------------------------------
// Parser
//------------------------------------------------------------------------------
/**
* Converts an Acorn comment to a Esprima comment.
* @param {boolean} block True if it's a block comment, false if not.
* @param {string} text The text of the comment.
* @param {int} start The index at which the comment starts.
* @param {int} end The index at which the comment ends.
* @param {Location} startLoc The location at which the comment starts.
* @param {Location} endLoc The location at which the comment ends.
* @returns {Object} The comment object.
* @private
*/
function convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc) {
var comment = {
type: block ? "Block" : "Line",
value: text
};
if (typeof start === "number") {
comment.start = start;
comment.end = end;
comment.range = [start, end];
}
if (typeof startLoc === "object") {
comment.loc = {
start: startLoc,
end: endLoc
};
}
return comment;
}
/**
* Parses the given code.
* @param {string} code The code to tokenize.
* @param {Object} options Options defining how to tokenize.
* @returns {ASTNode} The "Program" AST node.
* @throws {SyntaxError} If the input code is invalid.
* @private
*/
function parse(code, options) {
var program,
toString = String,
translator,
impliedStrict,
acornOptions = {
ecmaVersion: 5,
plugins: {
espree: true
}
};
lastToken = null;
if (typeof code !== "string" && !(code instanceof String)) {
code = toString(code);
}
resetExtra();
commentAttachment.reset();
if (typeof options !== "undefined") {
extra.range = (typeof options.range === "boolean") && options.range;
extra.loc = (typeof options.loc === "boolean") && options.loc;
extra.attachComment = (typeof options.attachComment === "boolean") && options.attachComment;
if (extra.loc && options.source !== null && options.source !== undefined) {
extra.source = toString(options.source);
}
if (typeof options.tokens === "boolean" && options.tokens) {
extra.tokens = [];
translator = new TokenTranslator(tt, code);
}
if (typeof options.comment === "boolean" && options.comment) {
extra.comment = true;
extra.comments = [];
}
if (typeof options.tolerant === "boolean" && options.tolerant) {
extra.errors = [];
}
if (extra.attachComment) {
extra.range = true;
extra.comments = [];
commentAttachment.reset();
}
if (typeof options.ecmaVersion === "number") {
switch (options.ecmaVersion) {
case 3:
case 5:
case 6:
case 7:
acornOptions.ecmaVersion = options.ecmaVersion;
extra.ecmaVersion = options.ecmaVersion;
break;
default:
throw new Error("ecmaVersion must be 3, 5, 6, or 7.");
}
}
if (options.sourceType === "module") {
extra.isModule = true;
// modules must be in 6 at least
if (acornOptions.ecmaVersion < 6) {
acornOptions.ecmaVersion = 6;
extra.ecmaVersion = 6;
}
acornOptions.sourceType = "module";
}
// apply parsing flags after sourceType to allow overriding
if (options.ecmaFeatures && typeof options.ecmaFeatures === "object") {
extra.ecmaFeatures = options.ecmaFeatures;
impliedStrict = extra.ecmaFeatures.impliedStrict;
extra.ecmaFeatures.impliedStrict = typeof impliedStrict === "boolean" && impliedStrict;
if (options.ecmaFeatures.globalReturn) {
acornOptions.allowReturnOutsideFunction = true;
}
}
acornOptions.onToken = function(token) {
if (extra.tokens) {
translator.onToken(token, extra);
}
if (token.type !== tt.eof) {
lastToken = token;
}
};
if (extra.attachComment || extra.comment) {
acornOptions.onComment = function() {
var comment = convertAcornCommentToEsprimaComment.apply(this, arguments);
extra.comments.push(comment);
if (extra.attachComment) {
commentAttachment.addComment(comment);
}
};
}
if (extra.range) {
acornOptions.ranges = true;
}
if (extra.loc) {
acornOptions.locations = true;
}
if (extra.ecmaFeatures.jsx) {
// Should process jsx plugin before espree plugin.
acornOptions.plugins = {
jsx: true,
espree: true
};
}
}
program = acorn.parse(code, acornOptions);
program.sourceType = extra.isModule ? "module" : "script";
if (extra.comment || extra.attachComment) {
program.comments = extra.comments;
}
if (extra.tokens) {
program.tokens = extra.tokens;
}
/*
* Adjust opening and closing position of program to match Esprima.
* Acorn always starts programs at range 0 whereas Esprima starts at the
* first AST node's start (the only real difference is when there's leading
* whitespace or leading comments). Acorn also counts trailing whitespace
* as part of the program whereas Esprima only counts up to the last token.
*/
if (program.range) {
program.range[0] = program.body.length ? program.body[0].range[0] : program.range[0];
program.range[1] = lastToken ? lastToken.range[1] : program.range[1];
}
if (program.loc) {
program.loc.start = program.body.length ? program.body[0].loc.start : program.loc.start;
program.loc.end = lastToken ? lastToken.loc.end : program.loc.end;
}
return program;
}
//------------------------------------------------------------------------------
// Public
//------------------------------------------------------------------------------
exports.version = require("./package.json").version;
exports.tokenize = tokenize;
exports.parse = parse;
// Deep copy.
/* istanbul ignore next */
exports.Syntax = (function() {
var name, types = {};
if (typeof Object.create === "function") {
types = Object.create(null);
}
for (name in astNodeTypes) {
if (astNodeTypes.hasOwnProperty(name)) {
types[name] = astNodeTypes[name];
}
}
if (typeof Object.freeze === "function") {
Object.freeze(types);
}
return types;
}());
/* istanbul ignore next */
exports.VisitorKeys = (function() {
var visitorKeys = require("./lib/visitor-keys");
var name,
keys = {};
if (typeof Object.create === "function") {
keys = Object.create(null);
}
for (name in visitorKeys) {
if (visitorKeys.hasOwnProperty(name)) {
keys[name] = visitorKeys[name];
}
}
if (typeof Object.freeze === "function") {
Object.freeze(keys);
}
return keys;
}());
},{"./lib/ast-node-types":244,"./lib/comment-attachment":245,"./lib/token-translator":246,"./lib/visitor-keys":247,"./package.json":249,"acorn":248,"acorn-jsx/inject":21}],244:[function(require,module,exports){
/**
* @fileoverview The AST node types produced by the parser.
* @author Nicholas C. Zakas
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
* @copyright 2011-2013 Ariya Hidayat
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
// None!
//------------------------------------------------------------------------------
// Public
//------------------------------------------------------------------------------
module.exports = {
AssignmentExpression: "AssignmentExpression",
AssignmentPattern: "AssignmentPattern",
ArrayExpression: "ArrayExpression",
ArrayPattern: "ArrayPattern",
ArrowFunctionExpression: "ArrowFunctionExpression",
BlockStatement: "BlockStatement",
BinaryExpression: "BinaryExpression",
BreakStatement: "BreakStatement",
CallExpression: "CallExpression",
CatchClause: "CatchClause",
ClassBody: "ClassBody",
ClassDeclaration: "ClassDeclaration",
ClassExpression: "ClassExpression",
ConditionalExpression: "ConditionalExpression",
ContinueStatement: "ContinueStatement",
DoWhileStatement: "DoWhileStatement",
DebuggerStatement: "DebuggerStatement",
EmptyStatement: "EmptyStatement",
ExperimentalRestProperty: "ExperimentalRestProperty",
ExperimentalSpreadProperty: "ExperimentalSpreadProperty",
ExpressionStatement: "ExpressionStatement",
ForStatement: "ForStatement",
ForInStatement: "ForInStatement",
ForOfStatement: "ForOfStatement",
FunctionDeclaration: "FunctionDeclaration",
FunctionExpression: "FunctionExpression",
Identifier: "Identifier",
IfStatement: "IfStatement",
Literal: "Literal",
LabeledStatement: "LabeledStatement",
LogicalExpression: "LogicalExpression",
MemberExpression: "MemberExpression",
MetaProperty: "MetaProperty",
MethodDefinition: "MethodDefinition",
NewExpression: "NewExpression",
ObjectExpression: "ObjectExpression",
ObjectPattern: "ObjectPattern",
Program: "Program",
Property: "Property",
RestElement: "RestElement",
ReturnStatement: "ReturnStatement",
SequenceExpression: "SequenceExpression",
SpreadElement: "SpreadElement",
Super: "Super",
SwitchCase: "SwitchCase",
SwitchStatement: "SwitchStatement",
TaggedTemplateExpression: "TaggedTemplateExpression",
TemplateElement: "TemplateElement",
TemplateLiteral: "TemplateLiteral",
ThisExpression: "ThisExpression",
ThrowStatement: "ThrowStatement",
TryStatement: "TryStatement",
UnaryExpression: "UnaryExpression",
UpdateExpression: "UpdateExpression",
VariableDeclaration: "VariableDeclaration",
VariableDeclarator: "VariableDeclarator",
WhileStatement: "WhileStatement",
WithStatement: "WithStatement",
YieldExpression: "YieldExpression",
JSXIdentifier: "JSXIdentifier",
JSXNamespacedName: "JSXNamespacedName",
JSXMemberExpression: "JSXMemberExpression",
JSXEmptyExpression: "JSXEmptyExpression",
JSXExpressionContainer: "JSXExpressionContainer",
JSXElement: "JSXElement",
JSXClosingElement: "JSXClosingElement",
JSXOpeningElement: "JSXOpeningElement",
JSXAttribute: "JSXAttribute",
JSXSpreadAttribute: "JSXSpreadAttribute",
JSXText: "JSXText",
ExportDefaultDeclaration: "ExportDefaultDeclaration",
ExportNamedDeclaration: "ExportNamedDeclaration",
ExportAllDeclaration: "ExportAllDeclaration",
ExportSpecifier: "ExportSpecifier",
ImportDeclaration: "ImportDeclaration",
ImportSpecifier: "ImportSpecifier",
ImportDefaultSpecifier: "ImportDefaultSpecifier",
ImportNamespaceSpecifier: "ImportNamespaceSpecifier"
};
},{}],245:[function(require,module,exports){
/**
* @fileoverview Attaches comments to the AST.
* @author Nicholas C. Zakas
* @copyright 2015 Nicholas C. Zakas. All rights reserved.
* @copyright 2011-2013 Ariya Hidayat
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
var astNodeTypes = require("./ast-node-types");
//------------------------------------------------------------------------------
// Private
//------------------------------------------------------------------------------
var extra = {
trailingComments: [],
leadingComments: [],
bottomRightStack: []
};
/** Recursively remove leading comments that are incorrectly added when no
* expression exists between comment and the current node
* @param {node} node to recursively check
* @returns {void}
*/
function removeExtraLeadingComments(node) {
var i, j;
if (!node.body) {
return;
}
if (Array.isArray(node.body)) {
// i must start at 0 so that we can check all indices recursively
for (i = 0; i < node.body.length; i++) {
// i must be greater than 0 to perform the check on the previous node
if (i > 0 && node.body[i].leadingComments) {
for (j = 0; j < node.body[i].leadingComments.length; j++) {
if (node.body[i].leadingComments[j].range[1] < node.body[i - 1].range[1]) {
node.body[i].leadingComments.splice(j, 1);
}
}
if (node.body[i].leadingComments.length === 0) {
delete node.body[i].leadingComments;
}
}
removeExtraLeadingComments(node.body[i]);
}
} else {
removeExtraLeadingComments(node.body);
}
}
//------------------------------------------------------------------------------
// Public
//------------------------------------------------------------------------------
module.exports = {
reset: function() {
extra.trailingComments = [];
extra.leadingComments = [];
extra.bottomRightStack = [];
},
addComment: function(comment) {
extra.trailingComments.push(comment);
extra.leadingComments.push(comment);
},
processComment: function(node) {
var lastChild,
trailingComments,
i;
if (node.type === astNodeTypes.Program) {
removeExtraLeadingComments(node);
if (node.body.length > 0) {
return;
}
}
if (extra.trailingComments.length > 0) {
/*
* If the first comment in trailingComments comes after the
* current node, then we're good - all comments in the array will
* come after the node and so it's safe to add then as official
* trailingComments.
*/
if (extra.trailingComments[0].range[0] >= node.range[1]) {
trailingComments = extra.trailingComments;
extra.trailingComments = [];
} else {
/*
* Otherwise, if the first comment doesn't come after the
* current node, that means we have a mix of leading and trailing
* comments in the array and that leadingComments contains the
* same items as trailingComments. Reset trailingComments to
* zero items and we'll handle this by evaluating leadingComments
* later.
*/
extra.trailingComments.length = 0;
}
} else {
if (extra.bottomRightStack.length > 0 &&
extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&
extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {
trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
}
}
// Eating the stack.
while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {
lastChild = extra.bottomRightStack.pop();
}
if (lastChild) {
if (lastChild.leadingComments) {
if (lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {
node.leadingComments = lastChild.leadingComments;
delete lastChild.leadingComments;
} else {
// A leading comment for an anonymous class had been stolen by its first MethodDefinition,
// so this takes back the leading comment.
// See Also: https://github.com/eslint/espree/issues/158
for (i = lastChild.leadingComments.length - 2; i >= 0; --i) {
if (lastChild.leadingComments[i].range[1] <= node.range[0]) {
node.leadingComments = lastChild.leadingComments.splice(0, i + 1);
break;
}
}
}
}
} else if (extra.leadingComments.length > 0) {
if (extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {
node.leadingComments = extra.leadingComments;
extra.leadingComments = [];
} else {
// https://github.com/eslint/espree/issues/2
/*
* In special cases, such as return (without a value) and
* debugger, all comments will end up as leadingComments and
* will otherwise be eliminated. This extra step runs when the
* bottomRightStack is empty and there are comments left
* in leadingComments.
*
* This loop figures out the stopping point between the actual
* leading and trailing comments by finding the location of the
* first comment that comes after the given node.
*/
for (i = 0; i < extra.leadingComments.length; i++) {
if (extra.leadingComments[i].range[1] > node.range[0]) {
break;
}
}
/*
* Split the array based on the location of the first comment
* that comes after the node. Keep in mind that this could
* result in an empty array, and if so, the array must be
* deleted.
*/
node.leadingComments = extra.leadingComments.slice(0, i);
if (node.leadingComments.length === 0) {
delete node.leadingComments;
}
/*
* Similarly, trailing comments are attached later. The variable
* must be reset to null if there are no trailing comments.
*/
trailingComments = extra.leadingComments.slice(i);
if (trailingComments.length === 0) {
trailingComments = null;
}
}
}
if (trailingComments) {
node.trailingComments = trailingComments;
}
extra.bottomRightStack.push(node);
}
};
},{"./ast-node-types":244}],246:[function(require,module,exports){
/**
* @fileoverview Translates tokens between Acorn format and Esprima format.
* @author Nicholas C. Zakas
* @copyright 2015 Nicholas C. Zakas. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* eslint no-underscore-dangle: 0 */
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
// none!
//------------------------------------------------------------------------------
// Private
//------------------------------------------------------------------------------
// Esprima Token Types
var Token = {
Boolean: "Boolean",
EOF: "",
Identifier: "Identifier",
Keyword: "Keyword",
Null: "Null",
Numeric: "Numeric",
Punctuator: "Punctuator",
String: "String",
RegularExpression: "RegularExpression",
Template: "Template",
JSXIdentifier: "JSXIdentifier",
JSXText: "JSXText"
};
/**
* Converts part of a template into an Esprima token.
* @param {AcornToken[]} tokens The Acorn tokens representing the template.
* @param {string} code The source code.
* @returns {EsprimaToken} The Esprima equivalent of the template token.
* @private
*/
function convertTemplatePart(tokens, code) {
var firstToken = tokens[0],
lastTemplateToken = tokens[tokens.length - 1];
var token = {
type: Token.Template,
value: code.slice(firstToken.start, lastTemplateToken.end)
};
if (firstToken.loc) {
token.loc = {
start: firstToken.loc.start,
end: lastTemplateToken.loc.end
};
}
if (firstToken.range) {
token.range = [firstToken.range[0], lastTemplateToken.range[1]];
}
return token;
}
/**
* Contains logic to translate Acorn tokens into Esprima tokens.
* @param {Object} acornTokTypes The Acorn token types.
* @param {string} code The source code Acorn is parsing. This is necessary
* to correct the "value" property of some tokens.
* @constructor
*/
function TokenTranslator(acornTokTypes, code) {
// token types
this._acornTokTypes = acornTokTypes;
// token buffer for templates
this._tokens = [];
// track the last curly brace
this._curlyBrace = null;
// the source code
this._code = code;
}
TokenTranslator.prototype = {
constructor: TokenTranslator,
/**
* Translates a single Esprima token to a single Acorn token. This may be
* inaccurate due to how templates are handled differently in Esprima and
* Acorn, but should be accurate for all other tokens.
* @param {AcornToken} token The Acorn token to translate.
* @param {Object} extra Espree extra object.
* @returns {EsprimaToken} The Esprima version of the token.
*/
translate: function(token, extra) {
var type = token.type,
tt = this._acornTokTypes;
if (type === tt.name) {
token.type = Token.Identifier;
// TODO: See if this is an Acorn bug
if (token.value === "static") {
token.type = Token.Keyword;
}
if (extra.ecmaVersion > 5 && (token.value === "yield" || token.value === "let")) {
token.type = Token.Keyword;
}
} else if (type === tt.semi || type === tt.comma ||
type === tt.parenL || type === tt.parenR ||
type === tt.braceL || type === tt.braceR ||
type === tt.dot || type === tt.bracketL ||
type === tt.colon || type === tt.question ||
type === tt.bracketR || type === tt.ellipsis ||
type === tt.arrow || type === tt.jsxTagStart ||
type === tt.incDec || type === tt.starstar ||
type === tt.jsxTagEnd || (type.binop && !type.keyword) ||
type.isAssign) {
token.type = Token.Punctuator;
token.value = this._code.slice(token.start, token.end);
} else if (type === tt.jsxName) {
token.type = Token.JSXIdentifier;
} else if (type.label === "jsxText" || type === tt.jsxAttrValueToken) {
token.type = Token.JSXText;
} else if (type.keyword) {
if (type.keyword === "true" || type.keyword === "false") {
token.type = Token.Boolean;
} else if (type.keyword === "null") {
token.type = Token.Null;
} else {
token.type = Token.Keyword;
}
} else if (type === tt.num) {
token.type = Token.Numeric;
token.value = this._code.slice(token.start, token.end);
} else if (type === tt.string) {
if (extra.jsxAttrValueToken) {
extra.jsxAttrValueToken = false;
token.type = Token.JSXText;
} else {
token.type = Token.String;
}
token.value = this._code.slice(token.start, token.end);
} else if (type === tt.regexp) {
token.type = Token.RegularExpression;
var value = token.value;
token.regex = {
flags: value.flags,
pattern: value.pattern
};
token.value = "/" + value.pattern + "/" + value.flags;
}
return token;
},
/**
* Function to call during Acorn's onToken handler.
* @param {AcornToken} token The Acorn token.
* @param {Object} extra The Espree extra object.
* @returns {void}
*/
onToken: function(token, extra) {
var that = this,
tt = this._acornTokTypes,
tokens = extra.tokens,
templateTokens = this._tokens;
/**
* Flushes the buffered template tokens and resets the template
* tracking.
* @returns {void}
* @private
*/
function translateTemplateTokens() {
tokens.push(convertTemplatePart(that._tokens, that._code));
that._tokens = [];
}
if (token.type === tt.eof) {
// might be one last curlyBrace
if (this._curlyBrace) {
tokens.push(this.translate(this._curlyBrace, extra));
}
return;
}
if (token.type === tt.backQuote) {
templateTokens.push(token);
// it's the end
if (templateTokens.length > 1) {
translateTemplateTokens();
}
return;
} else if (token.type === tt.dollarBraceL) {
templateTokens.push(token);
translateTemplateTokens();
return;
} else if (token.type === tt.braceR) {
// if there's already a curly, it's not part of the template
if (this._curlyBrace) {
tokens.push(this.translate(this._curlyBrace, extra));
}
// store new curly for later
this._curlyBrace = token;
return;
} else if (token.type === tt.template) {
if (this._curlyBrace) {
templateTokens.push(this._curlyBrace);
this._curlyBrace = null;
}
templateTokens.push(token);
return;
}
if (this._curlyBrace) {
tokens.push(this.translate(this._curlyBrace, extra));
this._curlyBrace = null;
}
tokens.push(this.translate(token, extra));
}
};
//------------------------------------------------------------------------------
// Public
//------------------------------------------------------------------------------
module.exports = TokenTranslator;
},{}],247:[function(require,module,exports){
/**
* @fileoverview The visitor keys for the node types Espree supports
* @author Nicholas C. Zakas
* @copyright 2015 Nicholas C. Zakas. All rights reserved.
* @copyright 2012-2013 Yusuke Suzuki (twitter: @Constellation) and other contributors.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contains code from estraverse-fb.
*
* The MIT license. Copyright (c) 2014 Ingvar Stepanyan
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
// None!
//------------------------------------------------------------------------------
// Public
//------------------------------------------------------------------------------
module.exports = {
// ECMAScript
AssignmentExpression: ["left", "right"],
AssignmentPattern: ["left", "right"],
ArrayExpression: ["elements"],
ArrayPattern: ["elements"],
ArrowFunctionExpression: ["params", "body"],
BlockStatement: ["body"],
BinaryExpression: ["left", "right"],
BreakStatement: ["label"],
CallExpression: ["callee", "arguments"],
CatchClause: ["param", "body"],
ClassBody: ["body"],
ClassDeclaration: ["id", "superClass", "body"],
ClassExpression: ["id", "superClass", "body"],
ConditionalExpression: ["test", "consequent", "alternate"],
ContinueStatement: ["label"],
DebuggerStatement: [],
DirectiveStatement: [],
DoWhileStatement: ["body", "test"],
EmptyStatement: [],
ExportAllDeclaration: ["source"],
ExportDefaultDeclaration: ["declaration"],
ExportNamedDeclaration: ["declaration", "specifiers", "source"],
ExportSpecifier: ["exported", "local"],
ExpressionStatement: ["expression"],
ForStatement: ["init", "test", "update", "body"],
ForInStatement: ["left", "right", "body"],
ForOfStatement: ["left", "right", "body"],
FunctionDeclaration: ["id", "params", "body"],
FunctionExpression: ["id", "params", "body"],
Identifier: [],
IfStatement: ["test", "consequent", "alternate"],
ImportDeclaration: ["specifiers", "source"],
ImportDefaultSpecifier: ["local"],
ImportNamespaceSpecifier: ["local"],
ImportSpecifier: ["imported", "local"],
Literal: [],
LabeledStatement: ["label", "body"],
LogicalExpression: ["left", "right"],
MemberExpression: ["object", "property"],
MetaProperty: ["meta", "property"],
MethodDefinition: ["key", "value"],
ModuleSpecifier: [],
NewExpression: ["callee", "arguments"],
ObjectExpression: ["properties"],
ObjectPattern: ["properties"],
Program: ["body"],
Property: ["key", "value"],
RestElement: [ "argument" ],
ReturnStatement: ["argument"],
SequenceExpression: ["expressions"],
SpreadElement: ["argument"],
Super: [],
SwitchStatement: ["discriminant", "cases"],
SwitchCase: ["test", "consequent"],
TaggedTemplateExpression: ["tag", "quasi"],
TemplateElement: [],
TemplateLiteral: ["quasis", "expressions"],
ThisExpression: [],
ThrowStatement: ["argument"],
TryStatement: ["block", "handler", "finalizer"],
UnaryExpression: ["argument"],
UpdateExpression: ["argument"],
VariableDeclaration: ["declarations"],
VariableDeclarator: ["id", "init"],
WhileStatement: ["test", "body"],
WithStatement: ["object", "body"],
YieldExpression: ["argument"],
// JSX
JSXIdentifier: [],
JSXNamespacedName: ["namespace", "name"],
JSXMemberExpression: ["object", "property"],
JSXEmptyExpression: [],
JSXExpressionContainer: ["expression"],
JSXElement: ["openingElement", "closingElement", "children"],
JSXClosingElement: ["name"],
JSXOpeningElement: ["name", "attributes"],
JSXAttribute: ["name", "value"],
JSXText: null,
JSXSpreadAttribute: ["argument"],
// Experimental features
ExperimentalRestProperty: ["argument"],
ExperimentalSpreadProperty: ["argument"]
};
},{}],248:[function(require,module,exports){
(function (global){
(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.acorn = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 6 && (prop.computed || prop.method || prop.shorthand)) return;
var key = prop.key;var name = undefined;
switch (key.type) {
case "Identifier":
name = key.name;break;
case "Literal":
name = String(key.value);break;
default:
return;
}
var kind = prop.kind;
if (this.options.ecmaVersion >= 6) {
if (name === "__proto__" && kind === "init") {
if (propHash.proto) this.raiseRecoverable(key.start, "Redefinition of __proto__ property");
propHash.proto = true;
}
return;
}
name = "$" + name;
var other = propHash[name];
if (other) {
var isGetSet = kind !== "init";
if ((this.strict || isGetSet) && other[kind] || !(isGetSet ^ other.init)) this.raiseRecoverable(key.start, "Redefinition of property");
} else {
other = propHash[name] = {
init: false,
get: false,
set: false
};
}
other[kind] = true;
};
// ### Expression parsing
// These nest, from the most general expression type at the top to
// 'atomic', nondivisible expression types at the bottom. Most of
// the functions will simply let the function(s) below them parse,
// and, *if* the syntactic construct they handle is present, wrap
// the AST node that the inner parser gave them in another node.
// Parse a full expression. The optional arguments are used to
// forbid the `in` operator (in for loops initalization expressions)
// and provide reference for storing '=' operator inside shorthand
// property assignment in contexts where both object expression
// and object pattern might appear (so it's possible to raise
// delayed syntax error at correct position).
pp.parseExpression = function (noIn, refDestructuringErrors) {
var startPos = this.start,
startLoc = this.startLoc;
var expr = this.parseMaybeAssign(noIn, refDestructuringErrors);
if (this.type === _tokentype.types.comma) {
var node = this.startNodeAt(startPos, startLoc);
node.expressions = [expr];
while (this.eat(_tokentype.types.comma)) node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors));
return this.finishNode(node, "SequenceExpression");
}
return expr;
};
// Parse an assignment expression. This includes applications of
// operators like `+=`.
pp.parseMaybeAssign = function (noIn, refDestructuringErrors, afterLeftParse) {
if (this.inGenerator && this.isContextual("yield")) return this.parseYield();
var validateDestructuring = false;
if (!refDestructuringErrors) {
refDestructuringErrors = { shorthandAssign: 0, trailingComma: 0 };
validateDestructuring = true;
}
var startPos = this.start,
startLoc = this.startLoc;
if (this.type == _tokentype.types.parenL || this.type == _tokentype.types.name) this.potentialArrowAt = this.start;
var left = this.parseMaybeConditional(noIn, refDestructuringErrors);
if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc);
if (this.type.isAssign) {
if (validateDestructuring) this.checkPatternErrors(refDestructuringErrors, true);
var node = this.startNodeAt(startPos, startLoc);
node.operator = this.value;
node.left = this.type === _tokentype.types.eq ? this.toAssignable(left) : left;
refDestructuringErrors.shorthandAssign = 0; // reset because shorthand default was used correctly
this.checkLVal(left);
this.next();
node.right = this.parseMaybeAssign(noIn);
return this.finishNode(node, "AssignmentExpression");
} else {
if (validateDestructuring) this.checkExpressionErrors(refDestructuringErrors, true);
}
return left;
};
// Parse a ternary conditional (`?:`) operator.
pp.parseMaybeConditional = function (noIn, refDestructuringErrors) {
var startPos = this.start,
startLoc = this.startLoc;
var expr = this.parseExprOps(noIn, refDestructuringErrors);
if (this.checkExpressionErrors(refDestructuringErrors)) return expr;
if (this.eat(_tokentype.types.question)) {
var node = this.startNodeAt(startPos, startLoc);
node.test = expr;
node.consequent = this.parseMaybeAssign();
this.expect(_tokentype.types.colon);
node.alternate = this.parseMaybeAssign(noIn);
return this.finishNode(node, "ConditionalExpression");
}
return expr;
};
// Start the precedence parser.
pp.parseExprOps = function (noIn, refDestructuringErrors) {
var startPos = this.start,
startLoc = this.startLoc;
var expr = this.parseMaybeUnary(refDestructuringErrors, false);
if (this.checkExpressionErrors(refDestructuringErrors)) return expr;
return this.parseExprOp(expr, startPos, startLoc, -1, noIn);
};
// Parse binary operators with the operator precedence parsing
// algorithm. `left` is the left-hand side of the operator.
// `minPrec` provides context that allows the function to stop and
// defer further parser to one of its callers when it encounters an
// operator that has a lower precedence than the set it is parsing.
pp.parseExprOp = function (left, leftStartPos, leftStartLoc, minPrec, noIn) {
var prec = this.type.binop;
if (prec != null && (!noIn || this.type !== _tokentype.types._in)) {
if (prec > minPrec) {
var logical = this.type === _tokentype.types.logicalOR || this.type === _tokentype.types.logicalAND;
var op = this.value;
this.next();
var startPos = this.start,
startLoc = this.startLoc;
var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn);
var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical);
return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn);
}
}
return left;
};
pp.buildBinary = function (startPos, startLoc, left, right, op, logical) {
var node = this.startNodeAt(startPos, startLoc);
node.left = left;
node.operator = op;
node.right = right;
return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression");
};
// Parse unary operators, both prefix and postfix.
pp.parseMaybeUnary = function (refDestructuringErrors, sawUnary) {
var startPos = this.start,
startLoc = this.startLoc,
expr = undefined;
if (this.type.prefix) {
var node = this.startNode(),
update = this.type === _tokentype.types.incDec;
node.operator = this.value;
node.prefix = true;
this.next();
node.argument = this.parseMaybeUnary(null, true);
this.checkExpressionErrors(refDestructuringErrors, true);
if (update) this.checkLVal(node.argument);else if (this.strict && node.operator === "delete" && node.argument.type === "Identifier") this.raiseRecoverable(node.start, "Deleting local variable in strict mode");else sawUnary = true;
expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression");
} else {
expr = this.parseExprSubscripts(refDestructuringErrors);
if (this.checkExpressionErrors(refDestructuringErrors)) return expr;
while (this.type.postfix && !this.canInsertSemicolon()) {
var node = this.startNodeAt(startPos, startLoc);
node.operator = this.value;
node.prefix = false;
node.argument = expr;
this.checkLVal(expr);
this.next();
expr = this.finishNode(node, "UpdateExpression");
}
}
if (!sawUnary && this.eat(_tokentype.types.starstar)) return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false);else return expr;
};
// Parse call, dot, and `[]`-subscript expressions.
pp.parseExprSubscripts = function (refDestructuringErrors) {
var startPos = this.start,
startLoc = this.startLoc;
var expr = this.parseExprAtom(refDestructuringErrors);
var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")";
if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) return expr;
return this.parseSubscripts(expr, startPos, startLoc);
};
pp.parseSubscripts = function (base, startPos, startLoc, noCalls) {
for (;;) {
if (this.eat(_tokentype.types.dot)) {
var node = this.startNodeAt(startPos, startLoc);
node.object = base;
node.property = this.parseIdent(true);
node.computed = false;
base = this.finishNode(node, "MemberExpression");
} else if (this.eat(_tokentype.types.bracketL)) {
var node = this.startNodeAt(startPos, startLoc);
node.object = base;
node.property = this.parseExpression();
node.computed = true;
this.expect(_tokentype.types.bracketR);
base = this.finishNode(node, "MemberExpression");
} else if (!noCalls && this.eat(_tokentype.types.parenL)) {
var node = this.startNodeAt(startPos, startLoc);
node.callee = base;
node.arguments = this.parseExprList(_tokentype.types.parenR, false);
base = this.finishNode(node, "CallExpression");
} else if (this.type === _tokentype.types.backQuote) {
var node = this.startNodeAt(startPos, startLoc);
node.tag = base;
node.quasi = this.parseTemplate();
base = this.finishNode(node, "TaggedTemplateExpression");
} else {
return base;
}
}
};
// Parse an atomic expression — either a single token that is an
// expression, an expression started by a keyword like `function` or
// `new`, or an expression wrapped in punctuation like `()`, `[]`,
// or `{}`.
pp.parseExprAtom = function (refDestructuringErrors) {
var node = undefined,
canBeArrow = this.potentialArrowAt == this.start;
switch (this.type) {
case _tokentype.types._super:
if (!this.inFunction) this.raise(this.start, "'super' outside of function or class");
case _tokentype.types._this:
var type = this.type === _tokentype.types._this ? "ThisExpression" : "Super";
node = this.startNode();
this.next();
return this.finishNode(node, type);
case _tokentype.types.name:
var startPos = this.start,
startLoc = this.startLoc;
var id = this.parseIdent(this.type !== _tokentype.types.name);
if (canBeArrow && !this.canInsertSemicolon() && this.eat(_tokentype.types.arrow)) return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id]);
return id;
case _tokentype.types.regexp:
var value = this.value;
node = this.parseLiteral(value.value);
node.regex = { pattern: value.pattern, flags: value.flags };
return node;
case _tokentype.types.num:case _tokentype.types.string:
return this.parseLiteral(this.value);
case _tokentype.types._null:case _tokentype.types._true:case _tokentype.types._false:
node = this.startNode();
node.value = this.type === _tokentype.types._null ? null : this.type === _tokentype.types._true;
node.raw = this.type.keyword;
this.next();
return this.finishNode(node, "Literal");
case _tokentype.types.parenL:
return this.parseParenAndDistinguishExpression(canBeArrow);
case _tokentype.types.bracketL:
node = this.startNode();
this.next();
node.elements = this.parseExprList(_tokentype.types.bracketR, true, true, refDestructuringErrors);
return this.finishNode(node, "ArrayExpression");
case _tokentype.types.braceL:
return this.parseObj(false, refDestructuringErrors);
case _tokentype.types._function:
node = this.startNode();
this.next();
return this.parseFunction(node, false);
case _tokentype.types._class:
return this.parseClass(this.startNode(), false);
case _tokentype.types._new:
return this.parseNew();
case _tokentype.types.backQuote:
return this.parseTemplate();
default:
this.unexpected();
}
};
pp.parseLiteral = function (value) {
var node = this.startNode();
node.value = value;
node.raw = this.input.slice(this.start, this.end);
this.next();
return this.finishNode(node, "Literal");
};
pp.parseParenExpression = function () {
this.expect(_tokentype.types.parenL);
var val = this.parseExpression();
this.expect(_tokentype.types.parenR);
return val;
};
pp.parseParenAndDistinguishExpression = function (canBeArrow) {
var startPos = this.start,
startLoc = this.startLoc,
val = undefined;
if (this.options.ecmaVersion >= 6) {
this.next();
var innerStartPos = this.start,
innerStartLoc = this.startLoc;
var exprList = [],
first = true;
var refDestructuringErrors = { shorthandAssign: 0, trailingComma: 0 },
spreadStart = undefined,
innerParenStart = undefined;
while (this.type !== _tokentype.types.parenR) {
first ? first = false : this.expect(_tokentype.types.comma);
if (this.type === _tokentype.types.ellipsis) {
spreadStart = this.start;
exprList.push(this.parseParenItem(this.parseRest()));
break;
} else {
if (this.type === _tokentype.types.parenL && !innerParenStart) {
innerParenStart = this.start;
}
exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));
}
}
var innerEndPos = this.start,
innerEndLoc = this.startLoc;
this.expect(_tokentype.types.parenR);
if (canBeArrow && !this.canInsertSemicolon() && this.eat(_tokentype.types.arrow)) {
this.checkPatternErrors(refDestructuringErrors, true);
if (innerParenStart) this.unexpected(innerParenStart);
return this.parseParenArrowList(startPos, startLoc, exprList);
}
if (!exprList.length) this.unexpected(this.lastTokStart);
if (spreadStart) this.unexpected(spreadStart);
this.checkExpressionErrors(refDestructuringErrors, true);
if (exprList.length > 1) {
val = this.startNodeAt(innerStartPos, innerStartLoc);
val.expressions = exprList;
this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc);
} else {
val = exprList[0];
}
} else {
val = this.parseParenExpression();
}
if (this.options.preserveParens) {
var par = this.startNodeAt(startPos, startLoc);
par.expression = val;
return this.finishNode(par, "ParenthesizedExpression");
} else {
return val;
}
};
pp.parseParenItem = function (item) {
return item;
};
pp.parseParenArrowList = function (startPos, startLoc, exprList) {
return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList);
};
// New's precedence is slightly tricky. It must allow its argument to
// be a `[]` or dot subscript expression, but not a call — at least,
// not without wrapping it in parentheses. Thus, it uses the noCalls
// argument to parseSubscripts to prevent it from consuming the
// argument list.
var empty = [];
pp.parseNew = function () {
var node = this.startNode();
var meta = this.parseIdent(true);
if (this.options.ecmaVersion >= 6 && this.eat(_tokentype.types.dot)) {
node.meta = meta;
node.property = this.parseIdent(true);
if (node.property.name !== "target") this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target");
if (!this.inFunction) this.raiseRecoverable(node.start, "new.target can only be used in functions");
return this.finishNode(node, "MetaProperty");
}
var startPos = this.start,
startLoc = this.startLoc;
node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true);
if (this.eat(_tokentype.types.parenL)) node.arguments = this.parseExprList(_tokentype.types.parenR, false);else node.arguments = empty;
return this.finishNode(node, "NewExpression");
};
// Parse template expression.
pp.parseTemplateElement = function () {
var elem = this.startNode();
elem.value = {
raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, '\n'),
cooked: this.value
};
this.next();
elem.tail = this.type === _tokentype.types.backQuote;
return this.finishNode(elem, "TemplateElement");
};
pp.parseTemplate = function () {
var node = this.startNode();
this.next();
node.expressions = [];
var curElt = this.parseTemplateElement();
node.quasis = [curElt];
while (!curElt.tail) {
this.expect(_tokentype.types.dollarBraceL);
node.expressions.push(this.parseExpression());
this.expect(_tokentype.types.braceR);
node.quasis.push(curElt = this.parseTemplateElement());
}
this.next();
return this.finishNode(node, "TemplateLiteral");
};
// Parse an object literal or binding pattern.
pp.parseObj = function (isPattern, refDestructuringErrors) {
var node = this.startNode(),
first = true,
propHash = {};
node.properties = [];
this.next();
while (!this.eat(_tokentype.types.braceR)) {
if (!first) {
this.expect(_tokentype.types.comma);
if (this.afterTrailingComma(_tokentype.types.braceR)) break;
} else first = false;
var prop = this.startNode(),
isGenerator = undefined,
startPos = undefined,
startLoc = undefined;
if (this.options.ecmaVersion >= 6) {
prop.method = false;
prop.shorthand = false;
if (isPattern || refDestructuringErrors) {
startPos = this.start;
startLoc = this.startLoc;
}
if (!isPattern) isGenerator = this.eat(_tokentype.types.star);
}
this.parsePropertyName(prop);
this.parsePropertyValue(prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors);
this.checkPropClash(prop, propHash);
node.properties.push(this.finishNode(prop, "Property"));
}
return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression");
};
pp.parsePropertyValue = function (prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) {
if (this.eat(_tokentype.types.colon)) {
prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);
prop.kind = "init";
} else if (this.options.ecmaVersion >= 6 && this.type === _tokentype.types.parenL) {
if (isPattern) this.unexpected();
prop.kind = "init";
prop.method = true;
prop.value = this.parseMethod(isGenerator);
} else if (this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && this.type != _tokentype.types.comma && this.type != _tokentype.types.braceR) {
if (isGenerator || isPattern) this.unexpected();
prop.kind = prop.key.name;
this.parsePropertyName(prop);
prop.value = this.parseMethod(false);
var paramCount = prop.kind === "get" ? 0 : 1;
if (prop.value.params.length !== paramCount) {
var start = prop.value.start;
if (prop.kind === "get") this.raiseRecoverable(start, "getter should have no params");else this.raiseRecoverable(start, "setter should have exactly one param");
}
if (prop.kind === "set" && prop.value.params[0].type === "RestElement") this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params");
} else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") {
prop.kind = "init";
if (isPattern) {
if (this.keywords.test(prop.key.name) || (this.strict ? this.reservedWordsStrictBind : this.reservedWords).test(prop.key.name) || this.inGenerator && prop.key.name == "yield") this.raiseRecoverable(prop.key.start, "Binding " + prop.key.name);
prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key);
} else if (this.type === _tokentype.types.eq && refDestructuringErrors) {
if (!refDestructuringErrors.shorthandAssign) refDestructuringErrors.shorthandAssign = this.start;
prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key);
} else {
prop.value = prop.key;
}
prop.shorthand = true;
} else this.unexpected();
};
pp.parsePropertyName = function (prop) {
if (this.options.ecmaVersion >= 6) {
if (this.eat(_tokentype.types.bracketL)) {
prop.computed = true;
prop.key = this.parseMaybeAssign();
this.expect(_tokentype.types.bracketR);
return prop.key;
} else {
prop.computed = false;
}
}
return prop.key = this.type === _tokentype.types.num || this.type === _tokentype.types.string ? this.parseExprAtom() : this.parseIdent(true);
};
// Initialize empty function node.
pp.initFunction = function (node) {
node.id = null;
if (this.options.ecmaVersion >= 6) {
node.generator = false;
node.expression = false;
}
};
// Parse object or class method.
pp.parseMethod = function (isGenerator) {
var node = this.startNode(),
oldInGen = this.inGenerator;
this.inGenerator = isGenerator;
this.initFunction(node);
this.expect(_tokentype.types.parenL);
node.params = this.parseBindingList(_tokentype.types.parenR, false, false);
if (this.options.ecmaVersion >= 6) node.generator = isGenerator;
this.parseFunctionBody(node, false);
this.inGenerator = oldInGen;
return this.finishNode(node, "FunctionExpression");
};
// Parse arrow function expression with given parameters.
pp.parseArrowExpression = function (node, params) {
var oldInGen = this.inGenerator;
this.inGenerator = false;
this.initFunction(node);
node.params = this.toAssignableList(params, true);
this.parseFunctionBody(node, true);
this.inGenerator = oldInGen;
return this.finishNode(node, "ArrowFunctionExpression");
};
// Parse function body and check parameters.
pp.parseFunctionBody = function (node, isArrowFunction) {
var isExpression = isArrowFunction && this.type !== _tokentype.types.braceL;
if (isExpression) {
node.body = this.parseMaybeAssign();
node.expression = true;
} else {
// Start a new scope with regard to labels and the `inFunction`
// flag (restore them to their old value afterwards).
var oldInFunc = this.inFunction,
oldLabels = this.labels;
this.inFunction = true;this.labels = [];
node.body = this.parseBlock(true);
node.expression = false;
this.inFunction = oldInFunc;this.labels = oldLabels;
}
// If this is a strict mode function, verify that argument names
// are not repeated, and it does not try to bind the words `eval`
// or `arguments`.
if (this.strict || !isExpression && node.body.body.length && this.isUseStrict(node.body.body[0])) {
var oldStrict = this.strict;
this.strict = true;
if (node.id) this.checkLVal(node.id, true);
this.checkParams(node);
this.strict = oldStrict;
} else if (isArrowFunction) {
this.checkParams(node);
}
};
// Checks function params for various disallowed patterns such as using "eval"
// or "arguments" and duplicate parameters.
pp.checkParams = function (node) {
var nameHash = {};
for (var i = 0; i < node.params.length; i++) {
this.checkLVal(node.params[i], true, nameHash);
}
};
// Parses a comma-separated list of expressions, and returns them as
// an array. `close` is the token type that ends the list, and
// `allowEmpty` can be turned on to allow subsequent commas with
// nothing in between them to be parsed as `null` (which is needed
// for array literals).
pp.parseExprList = function (close, allowTrailingComma, allowEmpty, refDestructuringErrors) {
var elts = [],
first = true;
while (!this.eat(close)) {
if (!first) {
this.expect(_tokentype.types.comma);
if (allowTrailingComma && this.afterTrailingComma(close)) break;
} else first = false;
var elt = undefined;
if (allowEmpty && this.type === _tokentype.types.comma) elt = null;else if (this.type === _tokentype.types.ellipsis) {
elt = this.parseSpread(refDestructuringErrors);
if (this.type === _tokentype.types.comma && refDestructuringErrors && !refDestructuringErrors.trailingComma) {
refDestructuringErrors.trailingComma = this.lastTokStart;
}
} else elt = this.parseMaybeAssign(false, refDestructuringErrors);
elts.push(elt);
}
return elts;
};
// Parse the next token as an identifier. If `liberal` is true (used
// when parsing properties), it will also convert keywords into
// identifiers.
pp.parseIdent = function (liberal) {
var node = this.startNode();
if (liberal && this.options.allowReserved == "never") liberal = false;
if (this.type === _tokentype.types.name) {
if (!liberal && (this.strict ? this.reservedWordsStrict : this.reservedWords).test(this.value) && (this.options.ecmaVersion >= 6 || this.input.slice(this.start, this.end).indexOf("\\") == -1)) this.raiseRecoverable(this.start, "The keyword '" + this.value + "' is reserved");
if (!liberal && this.inGenerator && this.value === "yield") this.raiseRecoverable(this.start, "Can not use 'yield' as identifier inside a generator");
node.name = this.value;
} else if (liberal && this.type.keyword) {
node.name = this.type.keyword;
} else {
this.unexpected();
}
this.next();
return this.finishNode(node, "Identifier");
};
// Parses yield expression inside generator.
pp.parseYield = function () {
var node = this.startNode();
this.next();
if (this.type == _tokentype.types.semi || this.canInsertSemicolon() || this.type != _tokentype.types.star && !this.type.startsExpr) {
node.delegate = false;
node.argument = null;
} else {
node.delegate = this.eat(_tokentype.types.star);
node.argument = this.parseMaybeAssign();
}
return this.finishNode(node, "YieldExpression");
};
},{"./state":10,"./tokentype":14}],2:[function(_dereq_,module,exports){
// Reserved word lists for various dialects of the language
"use strict";
exports.__esModule = true;
exports.isIdentifierStart = isIdentifierStart;
exports.isIdentifierChar = isIdentifierChar;
var reservedWords = {
3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
5: "class enum extends super const export import",
6: "enum",
7: "enum",
strict: "implements interface let package private protected public static yield",
strictBind: "eval arguments"
};
exports.reservedWords = reservedWords;
// And the keywords
var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
var keywords = {
5: ecma5AndLessKeywords,
6: ecma5AndLessKeywords + " const class extends export import super"
};
exports.keywords = keywords;
// ## Character categories
// Big ugly regular expressions that match characters in the
// whitespace, identifier, and identifier-start categories. These
// are only applied when a character is found to actually have a
// code point above 128.
// Generated by `bin/generate-identifier-regex.js`.
var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢴऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿕ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞭꞰ-ꞷꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭥꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
var nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣣ-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఃా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ູົຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷼-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-꣄꣐-꣙꣠-꣱꤀-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_";
var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
// These are a run-length and offset encoded representation of the
// >0xffff code points that are a valid part of identifiers. The
// offset starts at 0x10000, and each pair of numbers represents an
// offset to the next range, and then a size of the range. They were
// generated by bin/generate-identifier-regex.js
var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 17, 26, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 99, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 26, 45, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 785, 52, 76, 44, 33, 24, 27, 35, 42, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 287, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 86, 25, 391, 63, 32, 0, 449, 56, 1288, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 881, 68, 12, 0, 67, 12, 16481, 1, 3071, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 4149, 196, 1340, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42710, 42, 4148, 12, 221, 3, 5761, 10591, 541];
var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 1306, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 52, 0, 13, 2, 49, 13, 10, 2, 4, 9, 83, 11, 168, 11, 6, 9, 7, 3, 57, 0, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 316, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 423, 9, 20855, 9, 135, 4, 60, 6, 26, 9, 1016, 45, 17, 3, 19723, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 3617, 6, 792618, 239];
// This has a complexity linear to the value of the code. The
// assumption is that looking up astral identifier characters is
// rare.
function isInAstralSet(code, set) {
var pos = 0x10000;
for (var i = 0; i < set.length; i += 2) {
pos += set[i];
if (pos > code) return false;
pos += set[i + 1];
if (pos >= code) return true;
}
}
// Test whether a given character code starts an identifier.
function isIdentifierStart(code, astral) {
if (code < 65) return code === 36;
if (code < 91) return true;
if (code < 97) return code === 95;
if (code < 123) return true;
if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
if (astral === false) return false;
return isInAstralSet(code, astralIdentifierStartCodes);
}
// Test whether a given character is part of an identifier.
function isIdentifierChar(code, astral) {
if (code < 48) return code === 36;
if (code < 58) return true;
if (code < 65) return false;
if (code < 91) return true;
if (code < 97) return code === 95;
if (code < 123) return true;
if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
if (astral === false) return false;
return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
}
},{}],3:[function(_dereq_,module,exports){
// Acorn is a tiny, fast JavaScript parser written in JavaScript.
//
// Acorn was written by Marijn Haverbeke, Ingvar Stepanyan, and
// various contributors and released under an MIT license.
//
// Git repositories for Acorn are available at
//
// http://marijnhaverbeke.nl/git/acorn
// https://github.com/ternjs/acorn.git
//
// Please use the [github bug tracker][ghbt] to report issues.
//
// [ghbt]: https://github.com/ternjs/acorn/issues
//
// This file defines the main parser interface. The library also comes
// with a [error-tolerant parser][dammit] and an
// [abstract syntax tree walker][walk], defined in other files.
//
// [dammit]: acorn_loose.js
// [walk]: util/walk.js
"use strict";
exports.__esModule = true;
exports.parse = parse;
exports.parseExpressionAt = parseExpressionAt;
exports.tokenizer = tokenizer;
var _state = _dereq_("./state");
_dereq_("./parseutil");
_dereq_("./statement");
_dereq_("./lval");
_dereq_("./expression");
_dereq_("./location");
exports.Parser = _state.Parser;
exports.plugins = _state.plugins;
var _options = _dereq_("./options");
exports.defaultOptions = _options.defaultOptions;
var _locutil = _dereq_("./locutil");
exports.Position = _locutil.Position;
exports.SourceLocation = _locutil.SourceLocation;
exports.getLineInfo = _locutil.getLineInfo;
var _node = _dereq_("./node");
exports.Node = _node.Node;
var _tokentype = _dereq_("./tokentype");
exports.TokenType = _tokentype.TokenType;
exports.tokTypes = _tokentype.types;
var _tokencontext = _dereq_("./tokencontext");
exports.TokContext = _tokencontext.TokContext;
exports.tokContexts = _tokencontext.types;
var _identifier = _dereq_("./identifier");
exports.isIdentifierChar = _identifier.isIdentifierChar;
exports.isIdentifierStart = _identifier.isIdentifierStart;
var _tokenize = _dereq_("./tokenize");
exports.Token = _tokenize.Token;
var _whitespace = _dereq_("./whitespace");
exports.isNewLine = _whitespace.isNewLine;
exports.lineBreak = _whitespace.lineBreak;
exports.lineBreakG = _whitespace.lineBreakG;
var version = "3.1.0";
exports.version = version;
// The main exported interface (under `self.acorn` when in the
// browser) is a `parse` function that takes a code string and
// returns an abstract syntax tree as specified by [Mozilla parser
// API][api].
//
// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
function parse(input, options) {
return new _state.Parser(options, input).parse();
}
// This function tries to parse a single expression at a given
// offset in a string. Useful for parsing mixed-language formats
// that embed JavaScript expressions.
function parseExpressionAt(input, pos, options) {
var p = new _state.Parser(options, input, pos);
p.nextToken();
return p.parseExpression();
}
// Acorn is organized as a tokenizer and a recursive-descent parser.
// The `tokenizer` export provides an interface to the tokenizer.
function tokenizer(input, options) {
return new _state.Parser(options, input);
}
},{"./expression":1,"./identifier":2,"./location":4,"./locutil":5,"./lval":6,"./node":7,"./options":8,"./parseutil":9,"./state":10,"./statement":11,"./tokencontext":12,"./tokenize":13,"./tokentype":14,"./whitespace":16}],4:[function(_dereq_,module,exports){
"use strict";
var _state = _dereq_("./state");
var _locutil = _dereq_("./locutil");
var pp = _state.Parser.prototype;
// This function is used to raise exceptions on parse errors. It
// takes an offset integer (into the current `input`) to indicate
// the location of the error, attaches the position to the end
// of the error message, and then raises a `SyntaxError` with that
// message.
pp.raise = function (pos, message) {
var loc = _locutil.getLineInfo(this.input, pos);
message += " (" + loc.line + ":" + loc.column + ")";
var err = new SyntaxError(message);
err.pos = pos;err.loc = loc;err.raisedAt = this.pos;
throw err;
};
pp.raiseRecoverable = pp.raise;
pp.curPosition = function () {
if (this.options.locations) {
return new _locutil.Position(this.curLine, this.pos - this.lineStart);
}
};
},{"./locutil":5,"./state":10}],5:[function(_dereq_,module,exports){
"use strict";
exports.__esModule = true;
exports.getLineInfo = getLineInfo;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _whitespace = _dereq_("./whitespace");
// These are used when `options.locations` is on, for the
// `startLoc` and `endLoc` properties.
var Position = (function () {
function Position(line, col) {
_classCallCheck(this, Position);
this.line = line;
this.column = col;
}
Position.prototype.offset = function offset(n) {
return new Position(this.line, this.column + n);
};
return Position;
})();
exports.Position = Position;
var SourceLocation = function SourceLocation(p, start, end) {
_classCallCheck(this, SourceLocation);
this.start = start;
this.end = end;
if (p.sourceFile !== null) this.source = p.sourceFile;
}
// The `getLineInfo` function is mostly useful when the
// `locations` option is off (for performance reasons) and you
// want to find the line/column position for a given character
// offset. `input` should be the code string that the offset refers
// into.
;
exports.SourceLocation = SourceLocation;
function getLineInfo(input, offset) {
for (var line = 1, cur = 0;;) {
_whitespace.lineBreakG.lastIndex = cur;
var match = _whitespace.lineBreakG.exec(input);
if (match && match.index < offset) {
++line;
cur = match.index + match[0].length;
} else {
return new Position(line, offset - cur);
}
}
}
},{"./whitespace":16}],6:[function(_dereq_,module,exports){
"use strict";
var _tokentype = _dereq_("./tokentype");
var _state = _dereq_("./state");
var _util = _dereq_("./util");
var pp = _state.Parser.prototype;
// Convert existing expression atom to assignable pattern
// if possible.
pp.toAssignable = function (node, isBinding) {
if (this.options.ecmaVersion >= 6 && node) {
switch (node.type) {
case "Identifier":
case "ObjectPattern":
case "ArrayPattern":
break;
case "ObjectExpression":
node.type = "ObjectPattern";
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
if (prop.kind !== "init") this.raise(prop.key.start, "Object pattern can't contain getter or setter");
this.toAssignable(prop.value, isBinding);
}
break;
case "ArrayExpression":
node.type = "ArrayPattern";
this.toAssignableList(node.elements, isBinding);
break;
case "AssignmentExpression":
if (node.operator === "=") {
node.type = "AssignmentPattern";
delete node.operator;
// falls through to AssignmentPattern
} else {
this.raise(node.left.end, "Only '=' operator can be used for specifying default value.");
break;
}
case "AssignmentPattern":
if (node.right.type === "YieldExpression") this.raise(node.right.start, "Yield expression cannot be a default value");
break;
case "ParenthesizedExpression":
node.expression = this.toAssignable(node.expression, isBinding);
break;
case "MemberExpression":
if (!isBinding) break;
default:
this.raise(node.start, "Assigning to rvalue");
}
}
return node;
};
// Convert list of expression atoms to binding list.
pp.toAssignableList = function (exprList, isBinding) {
var end = exprList.length;
if (end) {
var last = exprList[end - 1];
if (last && last.type == "RestElement") {
--end;
} else if (last && last.type == "SpreadElement") {
last.type = "RestElement";
var arg = last.argument;
this.toAssignable(arg, isBinding);
if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern") this.unexpected(arg.start);
--end;
}
if (isBinding && last.type === "RestElement" && last.argument.type !== "Identifier") this.unexpected(last.argument.start);
}
for (var i = 0; i < end; i++) {
var elt = exprList[i];
if (elt) this.toAssignable(elt, isBinding);
}
return exprList;
};
// Parses spread element.
pp.parseSpread = function (refDestructuringErrors) {
var node = this.startNode();
this.next();
node.argument = this.parseMaybeAssign(refDestructuringErrors);
return this.finishNode(node, "SpreadElement");
};
pp.parseRest = function (allowNonIdent) {
var node = this.startNode();
this.next();
// RestElement inside of a function parameter must be an identifier
if (allowNonIdent) node.argument = this.type === _tokentype.types.name ? this.parseIdent() : this.unexpected();else node.argument = this.type === _tokentype.types.name || this.type === _tokentype.types.bracketL ? this.parseBindingAtom() : this.unexpected();
return this.finishNode(node, "RestElement");
};
// Parses lvalue (assignable) atom.
pp.parseBindingAtom = function () {
if (this.options.ecmaVersion < 6) return this.parseIdent();
switch (this.type) {
case _tokentype.types.name:
return this.parseIdent();
case _tokentype.types.bracketL:
var node = this.startNode();
this.next();
node.elements = this.parseBindingList(_tokentype.types.bracketR, true, true);
return this.finishNode(node, "ArrayPattern");
case _tokentype.types.braceL:
return this.parseObj(true);
default:
this.unexpected();
}
};
pp.parseBindingList = function (close, allowEmpty, allowTrailingComma, allowNonIdent) {
var elts = [],
first = true;
while (!this.eat(close)) {
if (first) first = false;else this.expect(_tokentype.types.comma);
if (allowEmpty && this.type === _tokentype.types.comma) {
elts.push(null);
} else if (allowTrailingComma && this.afterTrailingComma(close)) {
break;
} else if (this.type === _tokentype.types.ellipsis) {
var rest = this.parseRest(allowNonIdent);
this.parseBindingListItem(rest);
elts.push(rest);
if (this.type === _tokentype.types.comma) this.raise(this.start, "Comma is not permitted after the rest element");
this.expect(close);
break;
} else {
var elem = this.parseMaybeDefault(this.start, this.startLoc);
this.parseBindingListItem(elem);
elts.push(elem);
}
}
return elts;
};
pp.parseBindingListItem = function (param) {
return param;
};
// Parses assignment pattern around given atom if possible.
pp.parseMaybeDefault = function (startPos, startLoc, left) {
left = left || this.parseBindingAtom();
if (this.options.ecmaVersion < 6 || !this.eat(_tokentype.types.eq)) return left;
var node = this.startNodeAt(startPos, startLoc);
node.left = left;
node.right = this.parseMaybeAssign();
return this.finishNode(node, "AssignmentPattern");
};
// Verify that a node is an lval — something that can be assigned
// to.
pp.checkLVal = function (expr, isBinding, checkClashes) {
switch (expr.type) {
case "Identifier":
if (this.strict && this.reservedWordsStrictBind.test(expr.name)) this.raiseRecoverable(expr.start, (isBinding ? "Binding " : "Assigning to ") + expr.name + " in strict mode");
if (checkClashes) {
if (_util.has(checkClashes, expr.name)) this.raiseRecoverable(expr.start, "Argument name clash");
checkClashes[expr.name] = true;
}
break;
case "MemberExpression":
if (isBinding) this.raiseRecoverable(expr.start, (isBinding ? "Binding" : "Assigning to") + " member expression");
break;
case "ObjectPattern":
for (var i = 0; i < expr.properties.length; i++) {
this.checkLVal(expr.properties[i].value, isBinding, checkClashes);
}break;
case "ArrayPattern":
for (var i = 0; i < expr.elements.length; i++) {
var elem = expr.elements[i];
if (elem) this.checkLVal(elem, isBinding, checkClashes);
}
break;
case "AssignmentPattern":
this.checkLVal(expr.left, isBinding, checkClashes);
break;
case "RestElement":
this.checkLVal(expr.argument, isBinding, checkClashes);
break;
case "ParenthesizedExpression":
this.checkLVal(expr.expression, isBinding, checkClashes);
break;
default:
this.raise(expr.start, (isBinding ? "Binding" : "Assigning to") + " rvalue");
}
};
},{"./state":10,"./tokentype":14,"./util":15}],7:[function(_dereq_,module,exports){
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _state = _dereq_("./state");
var _locutil = _dereq_("./locutil");
var Node = function Node(parser, pos, loc) {
_classCallCheck(this, Node);
this.type = "";
this.start = pos;
this.end = 0;
if (parser.options.locations) this.loc = new _locutil.SourceLocation(parser, loc);
if (parser.options.directSourceFile) this.sourceFile = parser.options.directSourceFile;
if (parser.options.ranges) this.range = [pos, 0];
}
// Start an AST node, attaching a start offset.
;
exports.Node = Node;
var pp = _state.Parser.prototype;
pp.startNode = function () {
return new Node(this, this.start, this.startLoc);
};
pp.startNodeAt = function (pos, loc) {
return new Node(this, pos, loc);
};
// Finish an AST node, adding `type` and `end` properties.
function finishNodeAt(node, type, pos, loc) {
node.type = type;
node.end = pos;
if (this.options.locations) node.loc.end = loc;
if (this.options.ranges) node.range[1] = pos;
return node;
}
pp.finishNode = function (node, type) {
return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc);
};
// Finish node at given position
pp.finishNodeAt = function (node, type, pos, loc) {
return finishNodeAt.call(this, node, type, pos, loc);
};
},{"./locutil":5,"./state":10}],8:[function(_dereq_,module,exports){
"use strict";
exports.__esModule = true;
exports.getOptions = getOptions;
var _util = _dereq_("./util");
var _locutil = _dereq_("./locutil");
// A second optional argument can be given to further configure
// the parser process. These options are recognized:
var defaultOptions = {
// `ecmaVersion` indicates the ECMAScript version to parse. Must
// be either 3, or 5, or 6. This influences support for strict
// mode, the set of reserved words, support for getters and
// setters and other features. The default is 6.
ecmaVersion: 6,
// Source type ("script" or "module") for different semantics
sourceType: "script",
// `onInsertedSemicolon` can be a callback that will be called
// when a semicolon is automatically inserted. It will be passed
// th position of the comma as an offset, and if `locations` is
// enabled, it is given the location as a `{line, column}` object
// as second argument.
onInsertedSemicolon: null,
// `onTrailingComma` is similar to `onInsertedSemicolon`, but for
// trailing commas.
onTrailingComma: null,
// By default, reserved words are only enforced if ecmaVersion >= 5.
// Set `allowReserved` to a boolean value to explicitly turn this on
// an off. When this option has the value "never", reserved words
// and keywords can also not be used as property names.
allowReserved: null,
// When enabled, a return at the top level is not considered an
// error.
allowReturnOutsideFunction: false,
// When enabled, import/export statements are not constrained to
// appearing at the top of the program.
allowImportExportEverywhere: false,
// When enabled, hashbang directive in the beginning of file
// is allowed and treated as a line comment.
allowHashBang: false,
// When `locations` is on, `loc` properties holding objects with
// `start` and `end` properties in `{line, column}` form (with
// line being 1-based and column 0-based) will be attached to the
// nodes.
locations: false,
// A function can be passed as `onToken` option, which will
// cause Acorn to call that function with object in the same
// format as tokens returned from `tokenizer().getToken()`. Note
// that you are not allowed to call the parser from the
// callback—that will corrupt its internal state.
onToken: null,
// A function can be passed as `onComment` option, which will
// cause Acorn to call that function with `(block, text, start,
// end)` parameters whenever a comment is skipped. `block` is a
// boolean indicating whether this is a block (`/* */`) comment,
// `text` is the content of the comment, and `start` and `end` are
// character offsets that denote the start and end of the comment.
// When the `locations` option is on, two more parameters are
// passed, the full `{line, column}` locations of the start and
// end of the comments. Note that you are not allowed to call the
// parser from the callback—that will corrupt its internal state.
onComment: null,
// Nodes have their start and end characters offsets recorded in
// `start` and `end` properties (directly on the node, rather than
// the `loc` object, which holds line/column data. To also add a
// [semi-standardized][range] `range` property holding a `[start,
// end]` array with the same numbers, set the `ranges` option to
// `true`.
//
// [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678
ranges: false,
// It is possible to parse multiple files into a single AST by
// passing the tree produced by parsing the first file as
// `program` option in subsequent parses. This will add the
// toplevel forms of the parsed file to the `Program` (top) node
// of an existing parse tree.
program: null,
// When `locations` is on, you can pass this to record the source
// file in every node's `loc` object.
sourceFile: null,
// This value, if given, is stored in every node, whether
// `locations` is on or off.
directSourceFile: null,
// When enabled, parenthesized expressions are represented by
// (non-standard) ParenthesizedExpression nodes
preserveParens: false,
plugins: {}
};
exports.defaultOptions = defaultOptions;
// Interpret and default an options object
function getOptions(opts) {
var options = {};
for (var opt in defaultOptions) {
options[opt] = opts && _util.has(opts, opt) ? opts[opt] : defaultOptions[opt];
}if (options.allowReserved == null) options.allowReserved = options.ecmaVersion < 5;
if (_util.isArray(options.onToken)) {
(function () {
var tokens = options.onToken;
options.onToken = function (token) {
return tokens.push(token);
};
})();
}
if (_util.isArray(options.onComment)) options.onComment = pushComment(options, options.onComment);
return options;
}
function pushComment(options, array) {
return function (block, text, start, end, startLoc, endLoc) {
var comment = {
type: block ? 'Block' : 'Line',
value: text,
start: start,
end: end
};
if (options.locations) comment.loc = new _locutil.SourceLocation(this, startLoc, endLoc);
if (options.ranges) comment.range = [start, end];
array.push(comment);
};
}
},{"./locutil":5,"./util":15}],9:[function(_dereq_,module,exports){
"use strict";
var _tokentype = _dereq_("./tokentype");
var _state = _dereq_("./state");
var _whitespace = _dereq_("./whitespace");
var pp = _state.Parser.prototype;
// ## Parser utilities
// Test whether a statement node is the string literal `"use strict"`.
pp.isUseStrict = function (stmt) {
return this.options.ecmaVersion >= 5 && stmt.type === "ExpressionStatement" && stmt.expression.type === "Literal" && stmt.expression.raw.slice(1, -1) === "use strict";
};
// Predicate that tests whether the next token is of the given
// type, and if yes, consumes it as a side effect.
pp.eat = function (type) {
if (this.type === type) {
this.next();
return true;
} else {
return false;
}
};
// Tests whether parsed token is a contextual keyword.
pp.isContextual = function (name) {
return this.type === _tokentype.types.name && this.value === name;
};
// Consumes contextual keyword if possible.
pp.eatContextual = function (name) {
return this.value === name && this.eat(_tokentype.types.name);
};
// Asserts that following token is given contextual keyword.
pp.expectContextual = function (name) {
if (!this.eatContextual(name)) this.unexpected();
};
// Test whether a semicolon can be inserted at the current position.
pp.canInsertSemicolon = function () {
return this.type === _tokentype.types.eof || this.type === _tokentype.types.braceR || _whitespace.lineBreak.test(this.input.slice(this.lastTokEnd, this.start));
};
pp.insertSemicolon = function () {
if (this.canInsertSemicolon()) {
if (this.options.onInsertedSemicolon) this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc);
return true;
}
};
// Consume a semicolon, or, failing that, see if we are allowed to
// pretend that there is a semicolon at this position.
pp.semicolon = function () {
if (!this.eat(_tokentype.types.semi) && !this.insertSemicolon()) this.unexpected();
};
pp.afterTrailingComma = function (tokType) {
if (this.type == tokType) {
if (this.options.onTrailingComma) this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc);
this.next();
return true;
}
};
// Expect a token of a given type. If found, consume it, otherwise,
// raise an unexpected token error.
pp.expect = function (type) {
this.eat(type) || this.unexpected();
};
// Raise an unexpected token error.
pp.unexpected = function (pos) {
this.raise(pos != null ? pos : this.start, "Unexpected token");
};
pp.checkPatternErrors = function (refDestructuringErrors, andThrow) {
var pos = refDestructuringErrors && refDestructuringErrors.trailingComma;
if (!andThrow) return !!pos;
if (pos) this.raise(pos, "Comma is not permitted after the rest element");
};
pp.checkExpressionErrors = function (refDestructuringErrors, andThrow) {
var pos = refDestructuringErrors && refDestructuringErrors.shorthandAssign;
if (!andThrow) return !!pos;
if (pos) this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns");
};
},{"./state":10,"./tokentype":14,"./whitespace":16}],10:[function(_dereq_,module,exports){
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _identifier = _dereq_("./identifier");
var _tokentype = _dereq_("./tokentype");
var _whitespace = _dereq_("./whitespace");
var _options = _dereq_("./options");
// Registered plugins
var plugins = {};
exports.plugins = plugins;
function keywordRegexp(words) {
return new RegExp("^(" + words.replace(/ /g, "|") + ")$");
}
var Parser = (function () {
function Parser(options, input, startPos) {
_classCallCheck(this, Parser);
this.options = options = _options.getOptions(options);
this.sourceFile = options.sourceFile;
this.keywords = keywordRegexp(_identifier.keywords[options.ecmaVersion >= 6 ? 6 : 5]);
var reserved = options.allowReserved ? "" : _identifier.reservedWords[options.ecmaVersion] + (options.sourceType == "module" ? " await" : "");
this.reservedWords = keywordRegexp(reserved);
var reservedStrict = (reserved ? reserved + " " : "") + _identifier.reservedWords.strict;
this.reservedWordsStrict = keywordRegexp(reservedStrict);
this.reservedWordsStrictBind = keywordRegexp(reservedStrict + " " + _identifier.reservedWords.strictBind);
this.input = String(input);
// Used to signal to callers of `readWord1` whether the word
// contained any escape sequences. This is needed because words with
// escape sequences must not be interpreted as keywords.
this.containsEsc = false;
// Load plugins
this.loadPlugins(options.plugins);
// Set up token state
// The current position of the tokenizer in the input.
if (startPos) {
this.pos = startPos;
this.lineStart = Math.max(0, this.input.lastIndexOf("\n", startPos));
this.curLine = this.input.slice(0, this.lineStart).split(_whitespace.lineBreak).length;
} else {
this.pos = this.lineStart = 0;
this.curLine = 1;
}
// Properties of the current token:
// Its type
this.type = _tokentype.types.eof;
// For tokens that include more information than their type, the value
this.value = null;
// Its start and end offset
this.start = this.end = this.pos;
// And, if locations are used, the {line, column} object
// corresponding to those offsets
this.startLoc = this.endLoc = this.curPosition();
// Position information for the previous token
this.lastTokEndLoc = this.lastTokStartLoc = null;
this.lastTokStart = this.lastTokEnd = this.pos;
// The context stack is used to superficially track syntactic
// context to predict whether a regular expression is allowed in a
// given position.
this.context = this.initialContext();
this.exprAllowed = true;
// Figure out if it's a module code.
this.strict = this.inModule = options.sourceType === "module";
// Used to signify the start of a potential arrow function
this.potentialArrowAt = -1;
// Flags to track whether we are in a function, a generator.
this.inFunction = this.inGenerator = false;
// Labels in scope.
this.labels = [];
// If enabled, skip leading hashbang line.
if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === '#!') this.skipLineComment(2);
}
// DEPRECATED Kept for backwards compatibility until 3.0 in case a plugin uses them
Parser.prototype.isKeyword = function isKeyword(word) {
return this.keywords.test(word);
};
Parser.prototype.isReservedWord = function isReservedWord(word) {
return this.reservedWords.test(word);
};
Parser.prototype.extend = function extend(name, f) {
this[name] = f(this[name]);
};
Parser.prototype.loadPlugins = function loadPlugins(pluginConfigs) {
for (var _name in pluginConfigs) {
var plugin = plugins[_name];
if (!plugin) throw new Error("Plugin '" + _name + "' not found");
plugin(this, pluginConfigs[_name]);
}
};
Parser.prototype.parse = function parse() {
var node = this.options.program || this.startNode();
this.nextToken();
return this.parseTopLevel(node);
};
return Parser;
})();
exports.Parser = Parser;
},{"./identifier":2,"./options":8,"./tokentype":14,"./whitespace":16}],11:[function(_dereq_,module,exports){
"use strict";
var _tokentype = _dereq_("./tokentype");
var _state = _dereq_("./state");
var _whitespace = _dereq_("./whitespace");
var _identifier = _dereq_("./identifier");
var pp = _state.Parser.prototype;
// ### Statement parsing
// Parse a program. Initializes the parser, reads any number of
// statements, and wraps them in a Program node. Optionally takes a
// `program` argument. If present, the statements will be appended
// to its body instead of creating a new node.
pp.parseTopLevel = function (node) {
var first = true;
if (!node.body) node.body = [];
while (this.type !== _tokentype.types.eof) {
var stmt = this.parseStatement(true, true);
node.body.push(stmt);
if (first) {
if (this.isUseStrict(stmt)) this.setStrict(true);
first = false;
}
}
this.next();
if (this.options.ecmaVersion >= 6) {
node.sourceType = this.options.sourceType;
}
return this.finishNode(node, "Program");
};
var loopLabel = { kind: "loop" },
switchLabel = { kind: "switch" };
pp.isLet = function () {
if (this.type !== _tokentype.types.name || this.options.ecmaVersion < 6 || this.value != "let") return false;
_whitespace.skipWhiteSpace.lastIndex = this.pos;
var skip = _whitespace.skipWhiteSpace.exec(this.input);
var next = this.pos + skip[0].length,
nextCh = this.input.charCodeAt(next);
if (nextCh === 91 || nextCh == 123) return true; // '{' and '['
if (_identifier.isIdentifierStart(nextCh, true)) {
for (var pos = next + 1; _identifier.isIdentifierChar(this.input.charCodeAt(pos, true)); ++pos) {}
var ident = this.input.slice(next, pos);
if (!this.isKeyword(ident)) return true;
}
return false;
};
// Parse a single statement.
//
// If expecting a statement and finding a slash operator, parse a
// regular expression literal. This is to handle cases like
// `if (foo) /blah/.exec(foo)`, where looking at the previous token
// does not help.
pp.parseStatement = function (declaration, topLevel) {
var starttype = this.type,
node = this.startNode(),
kind = undefined;
if (this.isLet()) {
starttype = _tokentype.types._var;
kind = "let";
}
// Most types of statements are recognized by the keyword they
// start with. Many are trivial to parse, some require a bit of
// complexity.
switch (starttype) {
case _tokentype.types._break:case _tokentype.types._continue:
return this.parseBreakContinueStatement(node, starttype.keyword);
case _tokentype.types._debugger:
return this.parseDebuggerStatement(node);
case _tokentype.types._do:
return this.parseDoStatement(node);
case _tokentype.types._for:
return this.parseForStatement(node);
case _tokentype.types._function:
if (!declaration && this.options.ecmaVersion >= 6) this.unexpected();
return this.parseFunctionStatement(node);
case _tokentype.types._class:
if (!declaration) this.unexpected();
return this.parseClass(node, true);
case _tokentype.types._if:
return this.parseIfStatement(node);
case _tokentype.types._return:
return this.parseReturnStatement(node);
case _tokentype.types._switch:
return this.parseSwitchStatement(node);
case _tokentype.types._throw:
return this.parseThrowStatement(node);
case _tokentype.types._try:
return this.parseTryStatement(node);
case _tokentype.types._const:case _tokentype.types._var:
kind = kind || this.value;
if (!declaration && kind != "var") this.unexpected();
return this.parseVarStatement(node, kind);
case _tokentype.types._while:
return this.parseWhileStatement(node);
case _tokentype.types._with:
return this.parseWithStatement(node);
case _tokentype.types.braceL:
return this.parseBlock();
case _tokentype.types.semi:
return this.parseEmptyStatement(node);
case _tokentype.types._export:
case _tokentype.types._import:
if (!this.options.allowImportExportEverywhere) {
if (!topLevel) this.raise(this.start, "'import' and 'export' may only appear at the top level");
if (!this.inModule) this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'");
}
return starttype === _tokentype.types._import ? this.parseImport(node) : this.parseExport(node);
// If the statement does not start with a statement keyword or a
// brace, it's an ExpressionStatement or LabeledStatement. We
// simply start parsing an expression, and afterwards, if the
// next token is a colon and the expression was a simple
// Identifier node, we switch to interpreting it as a label.
default:
var maybeName = this.value,
expr = this.parseExpression();
if (starttype === _tokentype.types.name && expr.type === "Identifier" && this.eat(_tokentype.types.colon)) return this.parseLabeledStatement(node, maybeName, expr);else return this.parseExpressionStatement(node, expr);
}
};
pp.parseBreakContinueStatement = function (node, keyword) {
var isBreak = keyword == "break";
this.next();
if (this.eat(_tokentype.types.semi) || this.insertSemicolon()) node.label = null;else if (this.type !== _tokentype.types.name) this.unexpected();else {
node.label = this.parseIdent();
this.semicolon();
}
// Verify that there is an actual destination to break or
// continue to.
for (var i = 0; i < this.labels.length; ++i) {
var lab = this.labels[i];
if (node.label == null || lab.name === node.label.name) {
if (lab.kind != null && (isBreak || lab.kind === "loop")) break;
if (node.label && isBreak) break;
}
}
if (i === this.labels.length) this.raise(node.start, "Unsyntactic " + keyword);
return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement");
};
pp.parseDebuggerStatement = function (node) {
this.next();
this.semicolon();
return this.finishNode(node, "DebuggerStatement");
};
pp.parseDoStatement = function (node) {
this.next();
this.labels.push(loopLabel);
node.body = this.parseStatement(false);
this.labels.pop();
this.expect(_tokentype.types._while);
node.test = this.parseParenExpression();
if (this.options.ecmaVersion >= 6) this.eat(_tokentype.types.semi);else this.semicolon();
return this.finishNode(node, "DoWhileStatement");
};
// Disambiguating between a `for` and a `for`/`in` or `for`/`of`
// loop is non-trivial. Basically, we have to parse the init `var`
// statement or expression, disallowing the `in` operator (see
// the second parameter to `parseExpression`), and then check
// whether the next token is `in` or `of`. When there is no init
// part (semicolon immediately after the opening parenthesis), it
// is a regular `for` loop.
pp.parseForStatement = function (node) {
this.next();
this.labels.push(loopLabel);
this.expect(_tokentype.types.parenL);
if (this.type === _tokentype.types.semi) return this.parseFor(node, null);
var isLet = this.isLet();
if (this.type === _tokentype.types._var || this.type === _tokentype.types._const || isLet) {
var _init = this.startNode(),
kind = isLet ? "let" : this.value;
this.next();
this.parseVar(_init, true, kind);
this.finishNode(_init, "VariableDeclaration");
if ((this.type === _tokentype.types._in || this.options.ecmaVersion >= 6 && this.isContextual("of")) && _init.declarations.length === 1 && !(kind !== "var" && _init.declarations[0].init)) return this.parseForIn(node, _init);
return this.parseFor(node, _init);
}
var refDestructuringErrors = { shorthandAssign: 0, trailingComma: 0 };
var init = this.parseExpression(true, refDestructuringErrors);
if (this.type === _tokentype.types._in || this.options.ecmaVersion >= 6 && this.isContextual("of")) {
this.checkPatternErrors(refDestructuringErrors, true);
this.toAssignable(init);
this.checkLVal(init);
return this.parseForIn(node, init);
} else {
this.checkExpressionErrors(refDestructuringErrors, true);
}
return this.parseFor(node, init);
};
pp.parseFunctionStatement = function (node) {
this.next();
return this.parseFunction(node, true);
};
pp.parseIfStatement = function (node) {
this.next();
node.test = this.parseParenExpression();
node.consequent = this.parseStatement(false);
node.alternate = this.eat(_tokentype.types._else) ? this.parseStatement(false) : null;
return this.finishNode(node, "IfStatement");
};
pp.parseReturnStatement = function (node) {
if (!this.inFunction && !this.options.allowReturnOutsideFunction) this.raise(this.start, "'return' outside of function");
this.next();
// In `return` (and `break`/`continue`), the keywords with
// optional arguments, we eagerly look for a semicolon or the
// possibility to insert one.
if (this.eat(_tokentype.types.semi) || this.insertSemicolon()) node.argument = null;else {
node.argument = this.parseExpression();this.semicolon();
}
return this.finishNode(node, "ReturnStatement");
};
pp.parseSwitchStatement = function (node) {
this.next();
node.discriminant = this.parseParenExpression();
node.cases = [];
this.expect(_tokentype.types.braceL);
this.labels.push(switchLabel);
// Statements under must be grouped (by label) in SwitchCase
// nodes. `cur` is used to keep the node that we are currently
// adding statements to.
for (var cur, sawDefault = false; this.type != _tokentype.types.braceR;) {
if (this.type === _tokentype.types._case || this.type === _tokentype.types._default) {
var isCase = this.type === _tokentype.types._case;
if (cur) this.finishNode(cur, "SwitchCase");
node.cases.push(cur = this.startNode());
cur.consequent = [];
this.next();
if (isCase) {
cur.test = this.parseExpression();
} else {
if (sawDefault) this.raiseRecoverable(this.lastTokStart, "Multiple default clauses");
sawDefault = true;
cur.test = null;
}
this.expect(_tokentype.types.colon);
} else {
if (!cur) this.unexpected();
cur.consequent.push(this.parseStatement(true));
}
}
if (cur) this.finishNode(cur, "SwitchCase");
this.next(); // Closing brace
this.labels.pop();
return this.finishNode(node, "SwitchStatement");
};
pp.parseThrowStatement = function (node) {
this.next();
if (_whitespace.lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) this.raise(this.lastTokEnd, "Illegal newline after throw");
node.argument = this.parseExpression();
this.semicolon();
return this.finishNode(node, "ThrowStatement");
};
// Reused empty array added for node fields that are always empty.
var empty = [];
pp.parseTryStatement = function (node) {
this.next();
node.block = this.parseBlock();
node.handler = null;
if (this.type === _tokentype.types._catch) {
var clause = this.startNode();
this.next();
this.expect(_tokentype.types.parenL);
clause.param = this.parseBindingAtom();
this.checkLVal(clause.param, true);
this.expect(_tokentype.types.parenR);
clause.body = this.parseBlock();
node.handler = this.finishNode(clause, "CatchClause");
}
node.finalizer = this.eat(_tokentype.types._finally) ? this.parseBlock() : null;
if (!node.handler && !node.finalizer) this.raise(node.start, "Missing catch or finally clause");
return this.finishNode(node, "TryStatement");
};
pp.parseVarStatement = function (node, kind) {
this.next();
this.parseVar(node, false, kind);
this.semicolon();
return this.finishNode(node, "VariableDeclaration");
};
pp.parseWhileStatement = function (node) {
this.next();
node.test = this.parseParenExpression();
this.labels.push(loopLabel);
node.body = this.parseStatement(false);
this.labels.pop();
return this.finishNode(node, "WhileStatement");
};
pp.parseWithStatement = function (node) {
if (this.strict) this.raise(this.start, "'with' in strict mode");
this.next();
node.object = this.parseParenExpression();
node.body = this.parseStatement(false);
return this.finishNode(node, "WithStatement");
};
pp.parseEmptyStatement = function (node) {
this.next();
return this.finishNode(node, "EmptyStatement");
};
pp.parseLabeledStatement = function (node, maybeName, expr) {
for (var i = 0; i < this.labels.length; ++i) {
if (this.labels[i].name === maybeName) this.raise(expr.start, "Label '" + maybeName + "' is already declared");
}var kind = this.type.isLoop ? "loop" : this.type === _tokentype.types._switch ? "switch" : null;
for (var i = this.labels.length - 1; i >= 0; i--) {
var label = this.labels[i];
if (label.statementStart == node.start) {
label.statementStart = this.start;
label.kind = kind;
} else break;
}
this.labels.push({ name: maybeName, kind: kind, statementStart: this.start });
node.body = this.parseStatement(true);
this.labels.pop();
node.label = expr;
return this.finishNode(node, "LabeledStatement");
};
pp.parseExpressionStatement = function (node, expr) {
node.expression = expr;
this.semicolon();
return this.finishNode(node, "ExpressionStatement");
};
// Parse a semicolon-enclosed block of statements, handling `"use
// strict"` declarations when `allowStrict` is true (used for
// function bodies).
pp.parseBlock = function (allowStrict) {
var node = this.startNode(),
first = true,
oldStrict = undefined;
node.body = [];
this.expect(_tokentype.types.braceL);
while (!this.eat(_tokentype.types.braceR)) {
var stmt = this.parseStatement(true);
node.body.push(stmt);
if (first && allowStrict && this.isUseStrict(stmt)) {
oldStrict = this.strict;
this.setStrict(this.strict = true);
}
first = false;
}
if (oldStrict === false) this.setStrict(false);
return this.finishNode(node, "BlockStatement");
};
// Parse a regular `for` loop. The disambiguation code in
// `parseStatement` will already have parsed the init statement or
// expression.
pp.parseFor = function (node, init) {
node.init = init;
this.expect(_tokentype.types.semi);
node.test = this.type === _tokentype.types.semi ? null : this.parseExpression();
this.expect(_tokentype.types.semi);
node.update = this.type === _tokentype.types.parenR ? null : this.parseExpression();
this.expect(_tokentype.types.parenR);
node.body = this.parseStatement(false);
this.labels.pop();
return this.finishNode(node, "ForStatement");
};
// Parse a `for`/`in` and `for`/`of` loop, which are almost
// same from parser's perspective.
pp.parseForIn = function (node, init) {
var type = this.type === _tokentype.types._in ? "ForInStatement" : "ForOfStatement";
this.next();
node.left = init;
node.right = this.parseExpression();
this.expect(_tokentype.types.parenR);
node.body = this.parseStatement(false);
this.labels.pop();
return this.finishNode(node, type);
};
// Parse a list of variable declarations.
pp.parseVar = function (node, isFor, kind) {
node.declarations = [];
node.kind = kind;
for (;;) {
var decl = this.startNode();
this.parseVarId(decl);
if (this.eat(_tokentype.types.eq)) {
decl.init = this.parseMaybeAssign(isFor);
} else if (kind === "const" && !(this.type === _tokentype.types._in || this.options.ecmaVersion >= 6 && this.isContextual("of"))) {
this.unexpected();
} else if (decl.id.type != "Identifier" && !(isFor && (this.type === _tokentype.types._in || this.isContextual("of")))) {
this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value");
} else {
decl.init = null;
}
node.declarations.push(this.finishNode(decl, "VariableDeclarator"));
if (!this.eat(_tokentype.types.comma)) break;
}
return node;
};
pp.parseVarId = function (decl) {
decl.id = this.parseBindingAtom();
this.checkLVal(decl.id, true);
};
// Parse a function declaration or literal (depending on the
// `isStatement` parameter).
pp.parseFunction = function (node, isStatement, allowExpressionBody) {
this.initFunction(node);
if (this.options.ecmaVersion >= 6) node.generator = this.eat(_tokentype.types.star);
var oldInGen = this.inGenerator;
this.inGenerator = node.generator;
if (isStatement || this.type === _tokentype.types.name) node.id = this.parseIdent();
this.parseFunctionParams(node);
this.parseFunctionBody(node, allowExpressionBody);
this.inGenerator = oldInGen;
return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression");
};
pp.parseFunctionParams = function (node) {
this.expect(_tokentype.types.parenL);
node.params = this.parseBindingList(_tokentype.types.parenR, false, false, true);
};
// Parse a class declaration or literal (depending on the
// `isStatement` parameter).
pp.parseClass = function (node, isStatement) {
this.next();
this.parseClassId(node, isStatement);
this.parseClassSuper(node);
var classBody = this.startNode();
var hadConstructor = false;
classBody.body = [];
this.expect(_tokentype.types.braceL);
while (!this.eat(_tokentype.types.braceR)) {
if (this.eat(_tokentype.types.semi)) continue;
var method = this.startNode();
var isGenerator = this.eat(_tokentype.types.star);
var isMaybeStatic = this.type === _tokentype.types.name && this.value === "static";
this.parsePropertyName(method);
method["static"] = isMaybeStatic && this.type !== _tokentype.types.parenL;
if (method["static"]) {
if (isGenerator) this.unexpected();
isGenerator = this.eat(_tokentype.types.star);
this.parsePropertyName(method);
}
method.kind = "method";
var isGetSet = false;
if (!method.computed) {
var key = method.key;
if (!isGenerator && key.type === "Identifier" && this.type !== _tokentype.types.parenL && (key.name === "get" || key.name === "set")) {
isGetSet = true;
method.kind = key.name;
key = this.parsePropertyName(method);
}
if (!method["static"] && (key.type === "Identifier" && key.name === "constructor" || key.type === "Literal" && key.value === "constructor")) {
if (hadConstructor) this.raise(key.start, "Duplicate constructor in the same class");
if (isGetSet) this.raise(key.start, "Constructor can't have get/set modifier");
if (isGenerator) this.raise(key.start, "Constructor can't be a generator");
method.kind = "constructor";
hadConstructor = true;
}
}
this.parseClassMethod(classBody, method, isGenerator);
if (isGetSet) {
var paramCount = method.kind === "get" ? 0 : 1;
if (method.value.params.length !== paramCount) {
var start = method.value.start;
if (method.kind === "get") this.raiseRecoverable(start, "getter should have no params");else this.raiseRecoverable(start, "setter should have exactly one param");
}
if (method.kind === "set" && method.value.params[0].type === "RestElement") this.raise(method.value.params[0].start, "Setter cannot use rest params");
}
}
node.body = this.finishNode(classBody, "ClassBody");
return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression");
};
pp.parseClassMethod = function (classBody, method, isGenerator) {
method.value = this.parseMethod(isGenerator);
classBody.body.push(this.finishNode(method, "MethodDefinition"));
};
pp.parseClassId = function (node, isStatement) {
node.id = this.type === _tokentype.types.name ? this.parseIdent() : isStatement ? this.unexpected() : null;
};
pp.parseClassSuper = function (node) {
node.superClass = this.eat(_tokentype.types._extends) ? this.parseExprSubscripts() : null;
};
// Parses module export declaration.
pp.parseExport = function (node) {
this.next();
// export * from '...'
if (this.eat(_tokentype.types.star)) {
this.expectContextual("from");
node.source = this.type === _tokentype.types.string ? this.parseExprAtom() : this.unexpected();
this.semicolon();
return this.finishNode(node, "ExportAllDeclaration");
}
if (this.eat(_tokentype.types._default)) {
// export default ...
var parens = this.type == _tokentype.types.parenL;
var expr = this.parseMaybeAssign();
var needsSemi = true;
if (!parens && (expr.type == "FunctionExpression" || expr.type == "ClassExpression")) {
needsSemi = false;
if (expr.id) {
expr.type = expr.type == "FunctionExpression" ? "FunctionDeclaration" : "ClassDeclaration";
}
}
node.declaration = expr;
if (needsSemi) this.semicolon();
return this.finishNode(node, "ExportDefaultDeclaration");
}
// export var|const|let|function|class ...
if (this.shouldParseExportStatement()) {
node.declaration = this.parseStatement(true);
node.specifiers = [];
node.source = null;
} else {
// export { x, y as z } [from '...']
node.declaration = null;
node.specifiers = this.parseExportSpecifiers();
if (this.eatContextual("from")) {
node.source = this.type === _tokentype.types.string ? this.parseExprAtom() : this.unexpected();
} else {
// check for keywords used as local names
for (var i = 0; i < node.specifiers.length; i++) {
if (this.keywords.test(node.specifiers[i].local.name) || this.reservedWords.test(node.specifiers[i].local.name)) {
this.unexpected(node.specifiers[i].local.start);
}
}
node.source = null;
}
this.semicolon();
}
return this.finishNode(node, "ExportNamedDeclaration");
};
pp.shouldParseExportStatement = function () {
return this.type.keyword || this.isLet();
};
// Parses a comma-separated list of module exports.
pp.parseExportSpecifiers = function () {
var nodes = [],
first = true;
// export { x, y as z } [from '...']
this.expect(_tokentype.types.braceL);
while (!this.eat(_tokentype.types.braceR)) {
if (!first) {
this.expect(_tokentype.types.comma);
if (this.afterTrailingComma(_tokentype.types.braceR)) break;
} else first = false;
var node = this.startNode();
node.local = this.parseIdent(this.type === _tokentype.types._default);
node.exported = this.eatContextual("as") ? this.parseIdent(true) : node.local;
nodes.push(this.finishNode(node, "ExportSpecifier"));
}
return nodes;
};
// Parses import declaration.
pp.parseImport = function (node) {
this.next();
// import '...'
if (this.type === _tokentype.types.string) {
node.specifiers = empty;
node.source = this.parseExprAtom();
} else {
node.specifiers = this.parseImportSpecifiers();
this.expectContextual("from");
node.source = this.type === _tokentype.types.string ? this.parseExprAtom() : this.unexpected();
}
this.semicolon();
return this.finishNode(node, "ImportDeclaration");
};
// Parses a comma-separated list of module imports.
pp.parseImportSpecifiers = function () {
var nodes = [],
first = true;
if (this.type === _tokentype.types.name) {
// import defaultObj, { x, y as z } from '...'
var node = this.startNode();
node.local = this.parseIdent();
this.checkLVal(node.local, true);
nodes.push(this.finishNode(node, "ImportDefaultSpecifier"));
if (!this.eat(_tokentype.types.comma)) return nodes;
}
if (this.type === _tokentype.types.star) {
var node = this.startNode();
this.next();
this.expectContextual("as");
node.local = this.parseIdent();
this.checkLVal(node.local, true);
nodes.push(this.finishNode(node, "ImportNamespaceSpecifier"));
return nodes;
}
this.expect(_tokentype.types.braceL);
while (!this.eat(_tokentype.types.braceR)) {
if (!first) {
this.expect(_tokentype.types.comma);
if (this.afterTrailingComma(_tokentype.types.braceR)) break;
} else first = false;
var node = this.startNode();
node.imported = this.parseIdent(true);
if (this.eatContextual("as")) {
node.local = this.parseIdent();
} else {
node.local = node.imported;
if (this.isKeyword(node.local.name)) this.unexpected(node.local.start);
if (this.reservedWordsStrict.test(node.local.name)) this.raise(node.local.start, "The keyword '" + node.local.name + "' is reserved");
}
this.checkLVal(node.local, true);
nodes.push(this.finishNode(node, "ImportSpecifier"));
}
return nodes;
};
},{"./identifier":2,"./state":10,"./tokentype":14,"./whitespace":16}],12:[function(_dereq_,module,exports){
// The algorithm used to determine whether a regexp can appear at a
// given point in the program is loosely based on sweet.js' approach.
// See https://github.com/mozilla/sweet.js/wiki/design
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _state = _dereq_("./state");
var _tokentype = _dereq_("./tokentype");
var _whitespace = _dereq_("./whitespace");
var TokContext = function TokContext(token, isExpr, preserveSpace, override) {
_classCallCheck(this, TokContext);
this.token = token;
this.isExpr = !!isExpr;
this.preserveSpace = !!preserveSpace;
this.override = override;
};
exports.TokContext = TokContext;
var types = {
b_stat: new TokContext("{", false),
b_expr: new TokContext("{", true),
b_tmpl: new TokContext("${", true),
p_stat: new TokContext("(", false),
p_expr: new TokContext("(", true),
q_tmpl: new TokContext("`", true, true, function (p) {
return p.readTmplToken();
}),
f_expr: new TokContext("function", true)
};
exports.types = types;
var pp = _state.Parser.prototype;
pp.initialContext = function () {
return [types.b_stat];
};
pp.braceIsBlock = function (prevType) {
if (prevType === _tokentype.types.colon) {
var _parent = this.curContext();
if (_parent === types.b_stat || _parent === types.b_expr) return !_parent.isExpr;
}
if (prevType === _tokentype.types._return) return _whitespace.lineBreak.test(this.input.slice(this.lastTokEnd, this.start));
if (prevType === _tokentype.types._else || prevType === _tokentype.types.semi || prevType === _tokentype.types.eof || prevType === _tokentype.types.parenR) return true;
if (prevType == _tokentype.types.braceL) return this.curContext() === types.b_stat;
return !this.exprAllowed;
};
pp.updateContext = function (prevType) {
var update = undefined,
type = this.type;
if (type.keyword && prevType == _tokentype.types.dot) this.exprAllowed = false;else if (update = type.updateContext) update.call(this, prevType);else this.exprAllowed = type.beforeExpr;
};
// Token-specific context update code
_tokentype.types.parenR.updateContext = _tokentype.types.braceR.updateContext = function () {
if (this.context.length == 1) {
this.exprAllowed = true;
return;
}
var out = this.context.pop();
if (out === types.b_stat && this.curContext() === types.f_expr) {
this.context.pop();
this.exprAllowed = false;
} else if (out === types.b_tmpl) {
this.exprAllowed = true;
} else {
this.exprAllowed = !out.isExpr;
}
};
_tokentype.types.braceL.updateContext = function (prevType) {
this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);
this.exprAllowed = true;
};
_tokentype.types.dollarBraceL.updateContext = function () {
this.context.push(types.b_tmpl);
this.exprAllowed = true;
};
_tokentype.types.parenL.updateContext = function (prevType) {
var statementParens = prevType === _tokentype.types._if || prevType === _tokentype.types._for || prevType === _tokentype.types._with || prevType === _tokentype.types._while;
this.context.push(statementParens ? types.p_stat : types.p_expr);
this.exprAllowed = true;
};
_tokentype.types.incDec.updateContext = function () {
// tokExprAllowed stays unchanged
};
_tokentype.types._function.updateContext = function (prevType) {
if (prevType.beforeExpr && prevType !== _tokentype.types.semi && prevType !== _tokentype.types._else && (prevType !== _tokentype.types.colon || this.curContext() !== types.b_stat)) this.context.push(types.f_expr);
this.exprAllowed = false;
};
_tokentype.types.backQuote.updateContext = function () {
if (this.curContext() === types.q_tmpl) this.context.pop();else this.context.push(types.q_tmpl);
this.exprAllowed = false;
};
},{"./state":10,"./tokentype":14,"./whitespace":16}],13:[function(_dereq_,module,exports){
"use strict";
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _identifier = _dereq_("./identifier");
var _tokentype = _dereq_("./tokentype");
var _state = _dereq_("./state");
var _locutil = _dereq_("./locutil");
var _whitespace = _dereq_("./whitespace");
// Object type used to represent tokens. Note that normally, tokens
// simply exist as properties on the parser object. This is only
// used for the onToken callback and the external tokenizer.
var Token = function Token(p) {
_classCallCheck(this, Token);
this.type = p.type;
this.value = p.value;
this.start = p.start;
this.end = p.end;
if (p.options.locations) this.loc = new _locutil.SourceLocation(p, p.startLoc, p.endLoc);
if (p.options.ranges) this.range = [p.start, p.end];
}
// ## Tokenizer
;
exports.Token = Token;
var pp = _state.Parser.prototype;
// Are we running under Rhino?
var isRhino = typeof Packages == "object" && Object.prototype.toString.call(Packages) == "[object JavaPackage]";
// Move to the next token
pp.next = function () {
if (this.options.onToken) this.options.onToken(new Token(this));
this.lastTokEnd = this.end;
this.lastTokStart = this.start;
this.lastTokEndLoc = this.endLoc;
this.lastTokStartLoc = this.startLoc;
this.nextToken();
};
pp.getToken = function () {
this.next();
return new Token(this);
};
// If we're in an ES6 environment, make parsers iterable
if (typeof Symbol !== "undefined") pp[Symbol.iterator] = function () {
var self = this;
return { next: function next() {
var token = self.getToken();
return {
done: token.type === _tokentype.types.eof,
value: token
};
} };
};
// Toggle strict mode. Re-reads the next number or string to please
// pedantic tests (`"use strict"; 010;` should fail).
pp.setStrict = function (strict) {
this.strict = strict;
if (this.type !== _tokentype.types.num && this.type !== _tokentype.types.string) return;
this.pos = this.start;
if (this.options.locations) {
while (this.pos < this.lineStart) {
this.lineStart = this.input.lastIndexOf("\n", this.lineStart - 2) + 1;
--this.curLine;
}
}
this.nextToken();
};
pp.curContext = function () {
return this.context[this.context.length - 1];
};
// Read a single token, updating the parser object's token-related
// properties.
pp.nextToken = function () {
var curContext = this.curContext();
if (!curContext || !curContext.preserveSpace) this.skipSpace();
this.start = this.pos;
if (this.options.locations) this.startLoc = this.curPosition();
if (this.pos >= this.input.length) return this.finishToken(_tokentype.types.eof);
if (curContext.override) return curContext.override(this);else this.readToken(this.fullCharCodeAtPos());
};
pp.readToken = function (code) {
// Identifier or keyword. '\uXXXX' sequences are allowed in
// identifiers, so '\' also dispatches to that.
if (_identifier.isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) return this.readWord();
return this.getTokenFromCode(code);
};
pp.fullCharCodeAtPos = function () {
var code = this.input.charCodeAt(this.pos);
if (code <= 0xd7ff || code >= 0xe000) return code;
var next = this.input.charCodeAt(this.pos + 1);
return (code << 10) + next - 0x35fdc00;
};
pp.skipBlockComment = function () {
var startLoc = this.options.onComment && this.curPosition();
var start = this.pos,
end = this.input.indexOf("*/", this.pos += 2);
if (end === -1) this.raise(this.pos - 2, "Unterminated comment");
this.pos = end + 2;
if (this.options.locations) {
_whitespace.lineBreakG.lastIndex = start;
var match = undefined;
while ((match = _whitespace.lineBreakG.exec(this.input)) && match.index < this.pos) {
++this.curLine;
this.lineStart = match.index + match[0].length;
}
}
if (this.options.onComment) this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, startLoc, this.curPosition());
};
pp.skipLineComment = function (startSkip) {
var start = this.pos;
var startLoc = this.options.onComment && this.curPosition();
var ch = this.input.charCodeAt(this.pos += startSkip);
while (this.pos < this.input.length && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) {
++this.pos;
ch = this.input.charCodeAt(this.pos);
}
if (this.options.onComment) this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, startLoc, this.curPosition());
};
// Called at the start of the parse and after every token. Skips
// whitespace and comments, and.
pp.skipSpace = function () {
loop: while (this.pos < this.input.length) {
var ch = this.input.charCodeAt(this.pos);
switch (ch) {
case 32:case 160:
// ' '
++this.pos;
break;
case 13:
if (this.input.charCodeAt(this.pos + 1) === 10) {
++this.pos;
}
case 10:case 8232:case 8233:
++this.pos;
if (this.options.locations) {
++this.curLine;
this.lineStart = this.pos;
}
break;
case 47:
// '/'
switch (this.input.charCodeAt(this.pos + 1)) {
case 42:
// '*'
this.skipBlockComment();
break;
case 47:
this.skipLineComment(2);
break;
default:
break loop;
}
break;
default:
if (ch > 8 && ch < 14 || ch >= 5760 && _whitespace.nonASCIIwhitespace.test(String.fromCharCode(ch))) {
++this.pos;
} else {
break loop;
}
}
}
};
// Called at the end of every token. Sets `end`, `val`, and
// maintains `context` and `exprAllowed`, and skips the space after
// the token, so that the next one's `start` will point at the
// right position.
pp.finishToken = function (type, val) {
this.end = this.pos;
if (this.options.locations) this.endLoc = this.curPosition();
var prevType = this.type;
this.type = type;
this.value = val;
this.updateContext(prevType);
};
// ### Token reading
// This is the function that is called to fetch the next token. It
// is somewhat obscure, because it works in character codes rather
// than characters, and because operator parsing has been inlined
// into it.
//
// All in the name of speed.
//
pp.readToken_dot = function () {
var next = this.input.charCodeAt(this.pos + 1);
if (next >= 48 && next <= 57) return this.readNumber(true);
var next2 = this.input.charCodeAt(this.pos + 2);
if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) {
// 46 = dot '.'
this.pos += 3;
return this.finishToken(_tokentype.types.ellipsis);
} else {
++this.pos;
return this.finishToken(_tokentype.types.dot);
}
};
pp.readToken_slash = function () {
// '/'
var next = this.input.charCodeAt(this.pos + 1);
if (this.exprAllowed) {
++this.pos;return this.readRegexp();
}
if (next === 61) return this.finishOp(_tokentype.types.assign, 2);
return this.finishOp(_tokentype.types.slash, 1);
};
pp.readToken_mult_modulo_exp = function (code) {
// '%*'
var next = this.input.charCodeAt(this.pos + 1);
var size = 1;
var tokentype = code === 42 ? _tokentype.types.star : _tokentype.types.modulo;
// exponentiation operator ** and **=
if (this.options.ecmaVersion >= 7 && next === 42) {
++size;
tokentype = _tokentype.types.starstar;
next = this.input.charCodeAt(this.pos + 2);
}
if (next === 61) return this.finishOp(_tokentype.types.assign, size + 1);
return this.finishOp(tokentype, size);
};
pp.readToken_pipe_amp = function (code) {
// '|&'
var next = this.input.charCodeAt(this.pos + 1);
if (next === code) return this.finishOp(code === 124 ? _tokentype.types.logicalOR : _tokentype.types.logicalAND, 2);
if (next === 61) return this.finishOp(_tokentype.types.assign, 2);
return this.finishOp(code === 124 ? _tokentype.types.bitwiseOR : _tokentype.types.bitwiseAND, 1);
};
pp.readToken_caret = function () {
// '^'
var next = this.input.charCodeAt(this.pos + 1);
if (next === 61) return this.finishOp(_tokentype.types.assign, 2);
return this.finishOp(_tokentype.types.bitwiseXOR, 1);
};
pp.readToken_plus_min = function (code) {
// '+-'
var next = this.input.charCodeAt(this.pos + 1);
if (next === code) {
if (next == 45 && this.input.charCodeAt(this.pos + 2) == 62 && _whitespace.lineBreak.test(this.input.slice(this.lastTokEnd, this.pos))) {
// A `-->` line comment
this.skipLineComment(3);
this.skipSpace();
return this.nextToken();
}
return this.finishOp(_tokentype.types.incDec, 2);
}
if (next === 61) return this.finishOp(_tokentype.types.assign, 2);
return this.finishOp(_tokentype.types.plusMin, 1);
};
pp.readToken_lt_gt = function (code) {
// '<>'
var next = this.input.charCodeAt(this.pos + 1);
var size = 1;
if (next === code) {
size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;
if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(_tokentype.types.assign, size + 1);
return this.finishOp(_tokentype.types.bitShift, size);
}
if (next == 33 && code == 60 && this.input.charCodeAt(this.pos + 2) == 45 && this.input.charCodeAt(this.pos + 3) == 45) {
if (this.inModule) this.unexpected();
// `';
};
Serializer.prototype._serializeDocumentTypeNode = function (node) {
var name = this.treeAdapter.getDocumentTypeNodeName(node),
publicId = this.treeAdapter.getDocumentTypeNodePublicId(node),
systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node);
this.html += '<' + Doctype.serializeContent(name, publicId, systemId) + '>';
};
},{"../common/doctype":260,"../common/html":262,"../common/utils":264,"../tree_adapters/default":274}],268:[function(require,module,exports){
'use strict';
var Tokenizer = require('../tokenization/tokenizer'),
TokenizerProxy = require('./tokenizer_proxy'),
Utils = require('../common/utils');
//Default options
var DEFAULT_OPTIONS = {
decodeHtmlEntities: true,
locationInfo: false
};
//Skipping handler
function skip() {
//NOTE: do nothing =)
}
//SimpleApiParser
var SimpleApiParser = module.exports = function (handlers, options) {
this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
this.handlers = {
doctype: this._wrapHandler(handlers.doctype),
startTag: this._wrapHandler(handlers.startTag),
endTag: this._wrapHandler(handlers.endTag),
text: this._wrapHandler(handlers.text),
comment: this._wrapHandler(handlers.comment)
};
};
SimpleApiParser.prototype._wrapHandler = function (handler) {
var parser = this;
handler = handler || skip;
if (this.options.locationInfo) {
return function () {
var args = Array.prototype.slice.call(arguments);
args.push(parser.currentTokenLocation);
handler.apply(handler, args);
};
}
return handler;
};
//API
SimpleApiParser.prototype.parse = function (html) {
var token = null;
this._reset(html);
do {
token = this.tokenizerProxy.getNextToken();
if (token.type === Tokenizer.CHARACTER_TOKEN ||
token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN ||
token.type === Tokenizer.NULL_CHARACTER_TOKEN) {
if (this.options.locationInfo) {
if (this.pendingText === null)
this.currentTokenLocation = token.location;
else
this.currentTokenLocation.end = token.location.end;
}
this.pendingText = (this.pendingText || '') + token.chars;
}
else {
this._emitPendingText();
this._handleToken(token);
}
} while (token.type !== Tokenizer.EOF_TOKEN);
};
//Internals
SimpleApiParser.prototype._handleToken = function (token) {
if (this.options.locationInfo)
this.currentTokenLocation = token.location;
if (token.type === Tokenizer.START_TAG_TOKEN)
this.handlers.startTag(token.tagName, token.attrs, token.selfClosing);
else if (token.type === Tokenizer.END_TAG_TOKEN)
this.handlers.endTag(token.tagName);
else if (token.type === Tokenizer.COMMENT_TOKEN)
this.handlers.comment(token.data);
else if (token.type === Tokenizer.DOCTYPE_TOKEN)
this.handlers.doctype(token.name, token.publicId, token.systemId);
};
SimpleApiParser.prototype._reset = function (html) {
this.tokenizerProxy = new TokenizerProxy(html, this.options);
this.pendingText = null;
this.currentTokenLocation = null;
};
SimpleApiParser.prototype._emitPendingText = function () {
if (this.pendingText !== null) {
this.handlers.text(this.pendingText);
this.pendingText = null;
}
};
},{"../common/utils":264,"../tokenization/tokenizer":273,"./tokenizer_proxy":269}],269:[function(require,module,exports){
'use strict';
var Tokenizer = require('../tokenization/tokenizer'),
ForeignContent = require('../common/foreign_content'),
UNICODE = require('../common/unicode'),
HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES;
//Tokenizer proxy
//NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
var TokenizerProxy = module.exports = function (html, options) {
this.tokenizer = new Tokenizer(html, options);
this.namespaceStack = [];
this.namespaceStackTop = -1;
this.currentNamespace = null;
this.inForeignContent = false;
};
//API
TokenizerProxy.prototype.getNextToken = function () {
var token = this.tokenizer.getNextToken();
if (token.type === Tokenizer.START_TAG_TOKEN)
this._handleStartTagToken(token);
else if (token.type === Tokenizer.END_TAG_TOKEN)
this._handleEndTagToken(token);
else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) {
token.type = Tokenizer.CHARACTER_TOKEN;
token.chars = UNICODE.REPLACEMENT_CHARACTER;
}
return token;
};
//Namespace stack mutations
TokenizerProxy.prototype._enterNamespace = function (namespace) {
this.namespaceStackTop++;
this.namespaceStack.push(namespace);
this.inForeignContent = namespace !== NS.HTML;
this.currentNamespace = namespace;
this.tokenizer.allowCDATA = this.inForeignContent;
};
TokenizerProxy.prototype._leaveCurrentNamespace = function () {
this.namespaceStackTop--;
this.namespaceStack.pop();
this.currentNamespace = this.namespaceStack[this.namespaceStackTop];
this.inForeignContent = this.currentNamespace !== NS.HTML;
this.tokenizer.allowCDATA = this.inForeignContent;
};
//Token handlers
TokenizerProxy.prototype._ensureTokenizerMode = function (tn) {
if (tn === $.TEXTAREA || tn === $.TITLE)
this.tokenizer.state = Tokenizer.MODE.RCDATA;
else if (tn === $.PLAINTEXT)
this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
else if (tn === $.SCRIPT)
this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP ||
tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) {
this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
}
};
TokenizerProxy.prototype._handleStartTagToken = function (token) {
var tn = token.tagName;
if (tn === $.SVG)
this._enterNamespace(NS.SVG);
else if (tn === $.MATH)
this._enterNamespace(NS.MATHML);
else {
if (this.inForeignContent) {
if (ForeignContent.causesExit(token))
this._leaveCurrentNamespace();
else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) ||
ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) {
this._enterNamespace(NS.HTML);
}
}
else
this._ensureTokenizerMode(tn);
}
};
TokenizerProxy.prototype._handleEndTagToken = function (token) {
var tn = token.tagName;
if (!this.inForeignContent) {
var previousNs = this.namespaceStack[this.namespaceStackTop - 1];
//NOTE: check for exit from integration point
if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) ||
ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) {
this._leaveCurrentNamespace();
}
else if (tn === $.SCRIPT)
this.tokenizer.state = Tokenizer.MODE.DATA;
}
else if ((tn === $.SVG && this.currentNamespace === NS.SVG) ||
(tn === $.MATH && this.currentNamespace === NS.MATHML))
this._leaveCurrentNamespace();
};
},{"../common/foreign_content":261,"../common/html":262,"../common/unicode":263,"../tokenization/tokenizer":273}],270:[function(require,module,exports){
'use strict';
exports.assign = function (tokenizer) {
//NOTE: obtain Tokenizer proto this way to avoid module circular references
var tokenizerProto = Object.getPrototypeOf(tokenizer);
tokenizer.tokenStartLoc = -1;
//NOTE: add location info builder method
tokenizer._attachLocationInfo = function (token) {
token.location = {
start: this.tokenStartLoc,
end: -1
};
};
//NOTE: patch token creation methods and attach location objects
tokenizer._createStartTagToken = function (tagNameFirstCh) {
tokenizerProto._createStartTagToken.call(this, tagNameFirstCh);
this._attachLocationInfo(this.currentToken);
};
tokenizer._createEndTagToken = function (tagNameFirstCh) {
tokenizerProto._createEndTagToken.call(this, tagNameFirstCh);
this._attachLocationInfo(this.currentToken);
};
tokenizer._createCommentToken = function () {
tokenizerProto._createCommentToken.call(this);
this._attachLocationInfo(this.currentToken);
};
tokenizer._createDoctypeToken = function (doctypeNameFirstCh) {
tokenizerProto._createDoctypeToken.call(this, doctypeNameFirstCh);
this._attachLocationInfo(this.currentToken);
};
tokenizer._createCharacterToken = function (type, ch) {
tokenizerProto._createCharacterToken.call(this, type, ch);
this._attachLocationInfo(this.currentCharacterToken);
};
//NOTE: patch token emission methods to determine end location
tokenizer._emitCurrentToken = function () {
//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.end = this.currentToken.location.start;
this.currentToken.location.end = this.preprocessor.pos + 1;
tokenizerProto._emitCurrentToken.call(this);
};
tokenizer._emitCurrentCharacterToken = function () {
//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
if (this.currentCharacterToken && this.currentCharacterToken.location.end === -1) {
//NOTE: 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.
this.currentCharacterToken.location.end = this.preprocessor.pos;
}
tokenizerProto._emitCurrentCharacterToken.call(this);
};
//NOTE: patch initial states for each mode to obtain token start position
Object.keys(tokenizerProto.MODE)
.map(function (modeName) {
return tokenizerProto.MODE[modeName];
})
.forEach(function (state) {
tokenizer[state] = function (cp) {
this.tokenStartLoc = this.preprocessor.pos;
tokenizerProto[state].call(this, cp);
};
});
};
},{}],271:[function(require,module,exports){
'use strict';
//NOTE: this file contains auto generated trie structure that is used for named entity references consumption
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and
//http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references)
module.exports = {65:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[198]}},c:[198]}}}}}}},77:{l:{80:{l:{59:{c:[38]}},c:[38]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[193]}},c:[193]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[258]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[194]}},c:[194]}}}}},121:{l:{59:{c:[1040]}}}}},102:{l:{114:{l:{59:{c:[120068]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[192]}},c:[192]}}}}}}}}},108:{l:{112:{l:{104:{l:{97:{l:{59:{c:[913]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[256]}}}}}}}}},110:{l:{100:{l:{59:{c:[10835]}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[260]}}}}}}},112:{l:{102:{l:{59:{c:[120120]}}}}}}},112:{l:{112:{l:{108:{l:{121:{l:{70:{l:{117:{l:{110:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8289]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[197]}},c:[197]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119964]}}}}},115:{l:{105:{l:{103:{l:{110:{l:{59:{c:[8788]}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[195]}},c:[195]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[196]}},c:[196]}}}}}}},66:{l:{97:{l:{99:{l:{107:{l:{115:{l:{108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8726]}}}}}}}}}}}}}}},114:{l:{118:{l:{59:{c:[10983]}}},119:{l:{101:{l:{100:{l:{59:{c:[8966]}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1041]}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{101:{l:{59:{c:[8757]}}}}}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{108:{l:{108:{l:{105:{l:{115:{l:{59:{c:[8492]}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[914]}}}}}}},102:{l:{114:{l:{59:{c:[120069]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120121]}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8492]}}}}}}},117:{l:{109:{l:{112:{l:{101:{l:{113:{l:{59:{c:[8782]}}}}}}}}}}}}},67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1063]}}}}}}},79:{l:{80:{l:{89:{l:{59:{c:[169]}},c:[169]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[262]}}}}}}}}},112:{l:{59:{c:[8914]},105:{l:{116:{l:{97:{l:{108:{l:{68:{l:{105:{l:{102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8517]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},121:{l:{108:{l:{101:{l:{121:{l:{115:{l:{59:{c:[8493]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[268]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[199]}},c:[199]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[264]}}}}}}},111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8752]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[266]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{108:{l:{97:{l:{59:{c:[184]}}}}}}}}}}},110:{l:{116:{l:{101:{l:{114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8493]}}}}},104:{l:{105:{l:{59:{c:[935]}}}}},105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8857]}}}}}}},77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8855]}}}}}}}}}}}}}}}}}}}}},108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8754]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8221]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8217]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8759]},101:{l:{59:{c:[10868]}}}}}}}}},110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8801]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8751]}}}}}}},116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8750]}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8450]}}},114:{l:{111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8720]}}}}}}}}}}}}}}},117:{l:{110:{l:{116:{l:{101:{l:{114:{l:{67:{l:{108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8755]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10799]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119966]}}}}}}},117:{l:{112:{l:{59:{c:[8915]},67:{l:{97:{l:{112:{l:{59:{c:[8781]}}}}}}}}}}}}},68:{l:{68:{l:{59:{c:[8517]},111:{l:{116:{l:{114:{l:{97:{l:{104:{l:{100:{l:{59:{c:[10513]}}}}}}}}}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1026]}}}}}}},83:{l:{99:{l:{121:{l:{59:{c:[1029]}}}}}}},90:{l:{99:{l:{121:{l:{59:{c:[1039]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8609]}}}}},115:{l:{104:{l:{118:{l:{59:{c:[10980]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[270]}}}}}}}}},121:{l:{59:{c:[1044]}}}}},101:{l:{108:{l:{59:{c:[8711]},116:{l:{97:{l:{59:{c:[916]}}}}}}}}},102:{l:{114:{l:{59:{c:[120071]}}}}},105:{l:{97:{l:{99:{l:{114:{l:{105:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[180]}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[729]}}},117:{l:{98:{l:{108:{l:{101:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[733]}}}}}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{111:{l:{110:{l:{100:{l:{59:{c:[8900]}}}}}}}}}}},102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8518]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120123]}}}}},116:{l:{59:{c:[168]},68:{l:{111:{l:{116:{l:{59:{c:[8412]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8784]}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8751]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[168]}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[10980]}}}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8872]}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]},66:{l:{97:{l:{114:{l:{59:{c:[10515]}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8693]}}}}}}}}}}}}}}}}}}}}}}}}},66:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[785]}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10576]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10590]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8637]},66:{l:{97:{l:{114:{l:{59:{c:[10582]}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10591]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8641]},66:{l:{97:{l:{114:{l:{59:{c:[10583]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8868]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8615]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119967]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[272]}}}}}}}}}}}}},69:{l:{78:{l:{71:{l:{59:{c:[330]}}}}},84:{l:{72:{l:{59:{c:[208]}},c:[208]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[201]}},c:[201]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[282]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[202]}},c:[202]}}}}},121:{l:{59:{c:[1069]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[278]}}}}}}},102:{l:{114:{l:{59:{c:[120072]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[200]}},c:[200]}}}}}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8712]}}}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[274]}}}}}}},112:{l:{116:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9723]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9643]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[280]}}}}}}},112:{l:{102:{l:{59:{c:[120124]}}}}}}},112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[917]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10869]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770]}}}}}}}}}}}}}}},105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8496]}}}}},105:{l:{109:{l:{59:{c:[10867]}}}}}}},116:{l:{97:{l:{59:{c:[919]}}}}},117:{l:{109:{l:{108:{l:{59:{c:[203]}},c:[203]}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8707]}}}}}}}}},112:{l:{111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{69:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{99:{l:{121:{l:{59:{c:[1060]}}}}},102:{l:{114:{l:{59:{c:[120073]}}}}},105:{l:{108:{l:{108:{l:{101:{l:{100:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9724]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120125]}}}}},114:{l:{65:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}}}},117:{l:{114:{l:{105:{l:{101:{l:{114:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8497]}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8497]}}}}}}}}},71:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1027]}}}}}}},84:{l:{59:{c:[62]}},c:[62]},97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[915]},100:{l:{59:{c:[988]}}}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[286]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[290]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[284]}}}}}}},121:{l:{59:{c:[1043]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[288]}}}}}}},102:{l:{114:{l:{59:{c:[120074]}}}}},103:{l:{59:{c:[8921]}}},111:{l:{112:{l:{102:{l:{59:{c:[120126]}}}}}}},114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8805]},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8819]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119970]}}}}}}},116:{l:{59:{c:[8811]}}}}},72:{l:{65:{l:{82:{l:{68:{l:{99:{l:{121:{l:{59:{c:[1066]}}}}}}}}}}},97:{l:{99:{l:{101:{l:{107:{l:{59:{c:[711]}}}}}}},116:{l:{59:{c:[94]}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[292]}}}}}}}}},102:{l:{114:{l:{59:{c:[8460]}}}}},105:{l:{108:{l:{98:{l:{101:{l:{114:{l:{116:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8459]}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8461]}}}}},114:{l:{105:{l:{122:{l:{111:{l:{110:{l:{116:{l:{97:{l:{108:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[9472]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8459]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[294]}}}}}}}}}}},117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783]}}}}}}}}}}}}}}}}}}},73:{l:{69:{l:{99:{l:{121:{l:{59:{c:[1045]}}}}}}},74:{l:{108:{l:{105:{l:{103:{l:{59:{c:[306]}}}}}}}}},79:{l:{99:{l:{121:{l:{59:{c:[1025]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[205]}},c:[205]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[206]}},c:[206]}}}}},121:{l:{59:{c:[1048]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[304]}}}}}}},102:{l:{114:{l:{59:{c:[8465]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[204]}},c:[204]}}}}}}}}},109:{l:{59:{c:[8465]},97:{l:{99:{l:{114:{l:{59:{c:[298]}}}}},103:{l:{105:{l:{110:{l:{97:{l:{114:{l:{121:{l:{73:{l:{59:{c:[8520]}}}}}}}}}}}}}}}}},112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[8658]}}}}}}}}}}}}},110:{l:{116:{l:{59:{c:[8748]},101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8747]}}}}}}}}},114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8898]}}}}}}}}}}}}}}}}}}}}},118:{l:{105:{l:{115:{l:{105:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[8291]}}}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8290]}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[302]}}}}}}},112:{l:{102:{l:{59:{c:[120128]}}}}},116:{l:{97:{l:{59:{c:[921]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8464]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[296]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1030]}}}}}}},109:{l:{108:{l:{59:{c:[207]}},c:[207]}}}}}}},74:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[308]}}}}}}},121:{l:{59:{c:[1049]}}}}},102:{l:{114:{l:{59:{c:[120077]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120129]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119973]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1032]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1028]}}}}}}}}}}},75:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1061]}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1036]}}}}}}},97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[922]}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[310]}}}}}}}}},121:{l:{59:{c:[1050]}}}}},102:{l:{114:{l:{59:{c:[120078]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120130]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119974]}}}}}}}}},76:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1033]}}}}}}},84:{l:{59:{c:[60]}},c:[60]},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[313]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[923]}}}}}}}}},110:{l:{103:{l:{59:{c:[10218]}}}}},112:{l:{108:{l:{97:{l:{99:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8466]}}}}}}}}}}}}}}}}},114:{l:{114:{l:{59:{c:[8606]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[317]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[315]}}}}}}}}},121:{l:{59:{c:[1051]}}}}},101:{l:{102:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10216]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},66:{l:{97:{l:{114:{l:{59:{c:[8676]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8646]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8968]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10214]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10593]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8643]},66:{l:{97:{l:{114:{l:{59:{c:[10585]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10574]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8867]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8612]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10586]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8882]},66:{l:{97:{l:{114:{l:{59:{c:[10703]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8884]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10577]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10592]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8639]},66:{l:{97:{l:{114:{l:{59:{c:[10584]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8636]},66:{l:{97:{l:{114:{l:{59:{c:[10578]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8922]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8806]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8822]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8818]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120079]}}}}},108:{l:{59:{c:[8920]},101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8666]}}}}}}}}}}}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[319]}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120131]}}}}},119:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8466]}}}}},104:{l:{59:{c:[8624]}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[321]}}}}}}}}}}},116:{l:{59:{c:[8810]}}}}},77:{l:{97:{l:{112:{l:{59:{c:[10501]}}}}},99:{l:{121:{l:{59:{c:[1052]}}}}},101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287]}}}}}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{110:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8499]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120080]}}}}},105:{l:{110:{l:{117:{l:{115:{l:{80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120132]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8499]}}}}}}},117:{l:{59:{c:[924]}}}}},78:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1034]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[323]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[327]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[325]}}}}}}}}},121:{l:{59:{c:[1053]}}}}},101:{l:{103:{l:{97:{l:{116:{l:{105:{l:{118:{l:{101:{l:{77:{l:{101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{104:{l:{105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[10]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120081]}}}}},111:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{59:{c:[8288]}}}}}}}}}}},110:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{105:{l:{110:{l:{103:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[160]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8469]}}}}},116:{l:{59:{c:[10988]},67:{l:{111:{l:{110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8802]}}}}}}}}}}}}}}}}},117:{l:{112:{l:{67:{l:{97:{l:{112:{l:{59:{c:[8813]}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8713]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8800]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770,824]}}}}}}}}}}}}}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8708]}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8815]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8817]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807,824]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811,824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8825]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8821]}}}}}}}}}}}}}}}}}}}}}}}}},72:{l:{117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782,824]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783,824]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8938]},66:{l:{97:{l:{114:{l:{59:{c:[10703,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8940]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{59:{c:[8814]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8816]}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810,824]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8820]}}}}}}}}}}}}}}}}}}},78:{l:{101:{l:{115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{114:{l:{101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8832]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8928]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{101:{l:{118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8716]}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8939]},66:{l:{97:{l:{114:{l:{59:{c:[10704,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8930]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8931]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8840]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8833]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8929]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831,824]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8841]}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8769]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8772]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8775]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8777]}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8740]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119977]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[209]}},c:[209]}}}}}}}}},117:{l:{59:{c:[925]}}}}},79:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[338]}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[211]}},c:[211]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[212]}},c:[212]}}}}},121:{l:{59:{c:[1054]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[336]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120082]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[210]}},c:[210]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[332]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[937]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[927]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120134]}}}}}}},112:{l:{101:{l:{110:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8220]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8216]}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{59:{c:[10836]}}},115:{l:{99:{l:{114:{l:{59:{c:[119978]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[216]}},c:[216]}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[213]}},c:[213]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[10807]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[214]}},c:[214]}}}}},118:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8254]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9182]}}},107:{l:{101:{l:{116:{l:{59:{c:[9140]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9180]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8706]}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1055]}}}}},102:{l:{114:{l:{59:{c:[120083]}}}}},104:{l:{105:{l:{59:{c:[934]}}}}},105:{l:{59:{c:[928]}}},108:{l:{117:{l:{115:{l:{77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[177]}}}}}}}}}}}}}}}}},111:{l:{105:{l:{110:{l:{99:{l:{97:{l:{114:{l:{101:{l:{112:{l:{108:{l:{97:{l:{110:{l:{101:{l:{59:{c:[8460]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8473]}}}}}}},114:{l:{59:{c:[10939]},101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8826]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8828]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8830]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8243]}}}}}}},111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8719]}}}}}}}}},112:{l:{111:{l:{114:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8759]},97:{l:{108:{l:{59:{c:[8733]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119979]}}}}},105:{l:{59:{c:[936]}}}}}}},81:{l:{85:{l:{79:{l:{84:{l:{59:{c:[34]}},c:[34]}}}}},102:{l:{114:{l:{59:{c:[120084]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8474]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119980]}}}}}}}}},82:{l:{66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10512]}}}}}}}}},69:{l:{71:{l:{59:{c:[174]}},c:[174]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[340]}}}}}}}}},110:{l:{103:{l:{59:{c:[10219]}}}}},114:{l:{114:{l:{59:{c:[8608]},116:{l:{108:{l:{59:{c:[10518]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[344]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[342]}}}}}}}}},121:{l:{59:{c:[1056]}}}}},101:{l:{59:{c:[8476]},118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10607]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8476]}}}}},104:{l:{111:{l:{59:{c:[929]}}}}},105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10217]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},66:{l:{97:{l:{114:{l:{59:{c:[8677]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8644]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8969]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10215]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10589]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8642]},66:{l:{97:{l:{114:{l:{59:{c:[10581]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8866]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8614]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10587]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8883]},66:{l:{97:{l:{114:{l:{59:{c:[10704]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10575]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10588]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8638]},66:{l:{97:{l:{114:{l:{59:{c:[10580]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8640]},66:{l:{97:{l:{114:{l:{59:{c:[10579]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8477]}}}}},117:{l:{110:{l:{100:{l:{73:{l:{109:{l:{112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[10608]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8667]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8475]}}}}},104:{l:{59:{c:[8625]}}}}},117:{l:{108:{l:{101:{l:{68:{l:{101:{l:{108:{l:{97:{l:{121:{l:{101:{l:{100:{l:{59:{c:[10740]}}}}}}}}}}}}}}}}}}}}}}},83:{l:{72:{l:{67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1065]}}}}}}}}},99:{l:{121:{l:{59:{c:[1064]}}}}}}},79:{l:{70:{l:{84:{l:{99:{l:{121:{l:{59:{c:[1068]}}}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[346]}}}}}}}}}}},99:{l:{59:{c:[10940]},97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[352]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[350]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[348]}}}}}}},121:{l:{59:{c:[1057]}}}}},102:{l:{114:{l:{59:{c:[120086]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[931]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{67:{l:{105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{59:{c:[8728]}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120138]}}}}}}},113:{l:{114:{l:{116:{l:{59:{c:[8730]}}}}},117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9633]},73:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8851]}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8849]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{110:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8852]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119982]}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[8902]}}}}}}},117:{l:{98:{l:{59:{c:[8912]},115:{l:{101:{l:{116:{l:{59:{c:[8912]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8838]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8827]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8829]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831]}}}}}}}}}}}}}}}}}}}}},104:{l:{84:{l:{104:{l:{97:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},109:{l:{59:{c:[8721]}}},112:{l:{59:{c:[8913]},101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8839]}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8913]}}}}}}}}}}}}},84:{l:{72:{l:{79:{l:{82:{l:{78:{l:{59:{c:[222]}},c:[222]}}}}}}},82:{l:{65:{l:{68:{l:{69:{l:{59:{c:[8482]}}}}}}}}},83:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1035]}}}}}}},99:{l:{121:{l:{59:{c:[1062]}}}}}}},97:{l:{98:{l:{59:{c:[9]}}},117:{l:{59:{c:[932]}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[356]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[354]}}}}}}}}},121:{l:{59:{c:[1058]}}}}},102:{l:{114:{l:{59:{c:[120087]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[920]}}}}}}},105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287,8202]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8201]}}}}}}}}}}}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8764]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8771]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8773]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8776]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120139]}}}}}}},114:{l:{105:{l:{112:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119983]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[358]}}}}}}}}}}}}},85:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[218]}},c:[218]}}}}}}},114:{l:{114:{l:{59:{c:[8607]},111:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10569]}}}}}}}}}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1038]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[364]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[219]}},c:[219]}}}}},121:{l:{59:{c:[1059]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[368]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120088]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[217]}},c:[217]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[362]}}}}}}}}},110:{l:{100:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[95]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9183]}}},107:{l:{101:{l:{116:{l:{59:{c:[9141]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9181]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{111:{l:{110:{l:{59:{c:[8899]},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[370]}}}}}}},112:{l:{102:{l:{59:{c:[120140]}}}}}}},112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]},66:{l:{97:{l:{114:{l:{59:{c:[10514]}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8645]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10606]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8869]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8613]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{105:{l:{59:{c:[978]},108:{l:{111:{l:{110:{l:{59:{c:[933]}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[366]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119984]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[360]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[220]}},c:[220]}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8875]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[10987]}}}}}}},99:{l:{121:{l:{59:{c:[1042]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8873]},108:{l:{59:{c:[10982]}}}}}}}}}}},101:{l:{101:{l:{59:{c:[8897]}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8214]}}}}}}},116:{l:{59:{c:[8214]},105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8739]}}}}}}},76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[124]}}}}}}}}},83:{l:{101:{l:{112:{l:{97:{l:{114:{l:{97:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10072]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8768]}}}}}}}}}}}}}}}}}}}}},121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8202]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120089]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120141]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119985]}}}}}}},118:{l:{100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8874]}}}}}}}}}}}}},87:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[372]}}}}}}}}},101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}},102:{l:{114:{l:{59:{c:[120090]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120142]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119986]}}}}}}}}},88:{l:{102:{l:{114:{l:{59:{c:[120091]}}}}},105:{l:{59:{c:[926]}}},111:{l:{112:{l:{102:{l:{59:{c:[120143]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119987]}}}}}}}}},89:{l:{65:{l:{99:{l:{121:{l:{59:{c:[1071]}}}}}}},73:{l:{99:{l:{121:{l:{59:{c:[1031]}}}}}}},85:{l:{99:{l:{121:{l:{59:{c:[1070]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[221]}},c:[221]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[374]}}}}}}},121:{l:{59:{c:[1067]}}}}},102:{l:{114:{l:{59:{c:[120092]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120144]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119988]}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[376]}}}}}}}}},90:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1046]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[377]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[381]}}}}}}}}},121:{l:{59:{c:[1047]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[379]}}}}}}},101:{l:{114:{l:{111:{l:{87:{l:{105:{l:{100:{l:{116:{l:{104:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[918]}}}}}}},102:{l:{114:{l:{59:{c:[8488]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8484]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119989]}}}}}}}}},97:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[225]}},c:[225]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[259]}}}}}}}}}}},99:{l:{59:{c:[8766]},69:{l:{59:{c:[8766,819]}}},100:{l:{59:{c:[8767]}}},105:{l:{114:{l:{99:{l:{59:{c:[226]}},c:[226]}}}}},117:{l:{116:{l:{101:{l:{59:{c:[180]}},c:[180]}}}}},121:{l:{59:{c:[1072]}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[230]}},c:[230]}}}}}}},102:{l:{59:{c:[8289]},114:{l:{59:{c:[120094]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[224]}},c:[224]}}}}}}}}},108:{l:{101:{l:{102:{l:{115:{l:{121:{l:{109:{l:{59:{c:[8501]}}}}}}}}},112:{l:{104:{l:{59:{c:[8501]}}}}}}},112:{l:{104:{l:{97:{l:{59:{c:[945]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[257]}}}}},108:{l:{103:{l:{59:{c:[10815]}}}}}}},112:{l:{59:{c:[38]}},c:[38]}}},110:{l:{100:{l:{59:{c:[8743]},97:{l:{110:{l:{100:{l:{59:{c:[10837]}}}}}}},100:{l:{59:{c:[10844]}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10840]}}}}}}}}}}},118:{l:{59:{c:[10842]}}}}},103:{l:{59:{c:[8736]},101:{l:{59:{c:[10660]}}},108:{l:{101:{l:{59:{c:[8736]}}}}},109:{l:{115:{l:{100:{l:{59:{c:[8737]},97:{l:{97:{l:{59:{c:[10664]}}},98:{l:{59:{c:[10665]}}},99:{l:{59:{c:[10666]}}},100:{l:{59:{c:[10667]}}},101:{l:{59:{c:[10668]}}},102:{l:{59:{c:[10669]}}},103:{l:{59:{c:[10670]}}},104:{l:{59:{c:[10671]}}}}}}}}}}},114:{l:{116:{l:{59:{c:[8735]},118:{l:{98:{l:{59:{c:[8894]},100:{l:{59:{c:[10653]}}}}}}}}}}},115:{l:{112:{l:{104:{l:{59:{c:[8738]}}}}},116:{l:{59:{c:[197]}}}}},122:{l:{97:{l:{114:{l:{114:{l:{59:{c:[9084]}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[261]}}}}}}},112:{l:{102:{l:{59:{c:[120146]}}}}}}},112:{l:{59:{c:[8776]},69:{l:{59:{c:[10864]}}},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10863]}}}}}}}}},101:{l:{59:{c:[8778]}}},105:{l:{100:{l:{59:{c:[8779]}}}}},111:{l:{115:{l:{59:{c:[39]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8778]}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[229]}},c:[229]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119990]}}}}},116:{l:{59:{c:[42]}}},121:{l:{109:{l:{112:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8781]}}}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[227]}},c:[227]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[228]}},c:[228]}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8755]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10769]}}}}}}}}}}},98:{l:{78:{l:{111:{l:{116:{l:{59:{c:[10989]}}}}}}},97:{l:{99:{l:{107:{l:{99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}}}},101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1014]}}}}}}}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8765]},101:{l:{113:{l:{59:{c:[8909]}}}}}}}}}}}}}}},114:{l:{118:{l:{101:{l:{101:{l:{59:{c:[8893]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8965]},103:{l:{101:{l:{59:{c:[8965]}}}}}}}}}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9141]},116:{l:{98:{l:{114:{l:{107:{l:{59:{c:[9142]}}}}}}}}}}}}}}},99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}},121:{l:{59:{c:[1073]}}}}},100:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8222]}}}}}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{59:{c:[8757]},101:{l:{59:{c:[8757]}}}}}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10672]}}}}}}}}}}},112:{l:{115:{l:{105:{l:{59:{c:[1014]}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{59:{c:[8492]}}}}}}}}},116:{l:{97:{l:{59:{c:[946]}}},104:{l:{59:{c:[8502]}}},119:{l:{101:{l:{101:{l:{110:{l:{59:{c:[8812]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120095]}}}}},105:{l:{103:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10754]}}}}}}}}}}}}},115:{l:{113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9733]}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9661]}}}}}}}}},117:{l:{112:{l:{59:{c:[9651]}}}}}}}}}}}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}}}},107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10509]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{107:{l:{108:{l:{111:{l:{122:{l:{101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[10731]}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9652]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9662]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9666]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9656]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{107:{l:{59:{c:[9251]}}}}}}},107:{l:{49:{l:{50:{l:{59:{c:[9618]}}},52:{l:{59:{c:[9617]}}}}},51:{l:{52:{l:{59:{c:[9619]}}}}}}},111:{l:{99:{l:{107:{l:{59:{c:[9608]}}}}}}}}},110:{l:{101:{l:{59:{c:[61,8421]},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8801,8421]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[8976]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120147]}}}}},116:{l:{59:{c:[8869]},116:{l:{111:{l:{109:{l:{59:{c:[8869]}}}}}}}}},119:{l:{116:{l:{105:{l:{101:{l:{59:{c:[8904]}}}}}}}}},120:{l:{68:{l:{76:{l:{59:{c:[9559]}}},82:{l:{59:{c:[9556]}}},108:{l:{59:{c:[9558]}}},114:{l:{59:{c:[9555]}}}}},72:{l:{59:{c:[9552]},68:{l:{59:{c:[9574]}}},85:{l:{59:{c:[9577]}}},100:{l:{59:{c:[9572]}}},117:{l:{59:{c:[9575]}}}}},85:{l:{76:{l:{59:{c:[9565]}}},82:{l:{59:{c:[9562]}}},108:{l:{59:{c:[9564]}}},114:{l:{59:{c:[9561]}}}}},86:{l:{59:{c:[9553]},72:{l:{59:{c:[9580]}}},76:{l:{59:{c:[9571]}}},82:{l:{59:{c:[9568]}}},104:{l:{59:{c:[9579]}}},108:{l:{59:{c:[9570]}}},114:{l:{59:{c:[9567]}}}}},98:{l:{111:{l:{120:{l:{59:{c:[10697]}}}}}}},100:{l:{76:{l:{59:{c:[9557]}}},82:{l:{59:{c:[9554]}}},108:{l:{59:{c:[9488]}}},114:{l:{59:{c:[9484]}}}}},104:{l:{59:{c:[9472]},68:{l:{59:{c:[9573]}}},85:{l:{59:{c:[9576]}}},100:{l:{59:{c:[9516]}}},117:{l:{59:{c:[9524]}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8863]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8862]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8864]}}}}}}}}}}},117:{l:{76:{l:{59:{c:[9563]}}},82:{l:{59:{c:[9560]}}},108:{l:{59:{c:[9496]}}},114:{l:{59:{c:[9492]}}}}},118:{l:{59:{c:[9474]},72:{l:{59:{c:[9578]}}},76:{l:{59:{c:[9569]}}},82:{l:{59:{c:[9566]}}},104:{l:{59:{c:[9532]}}},108:{l:{59:{c:[9508]}}},114:{l:{59:{c:[9500]}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[166]}},c:[166]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119991]}}}}},101:{l:{109:{l:{105:{l:{59:{c:[8271]}}}}}}},105:{l:{109:{l:{59:{c:[8765]},101:{l:{59:{c:[8909]}}}}}}},111:{l:{108:{l:{59:{c:[92]},98:{l:{59:{c:[10693]}}},104:{l:{115:{l:{117:{l:{98:{l:{59:{c:[10184]}}}}}}}}}}}}}}},117:{l:{108:{l:{108:{l:{59:{c:[8226]},101:{l:{116:{l:{59:{c:[8226]}}}}}}}}},109:{l:{112:{l:{59:{c:[8782]},69:{l:{59:{c:[10926]}}},101:{l:{59:{c:[8783]},113:{l:{59:{c:[8783]}}}}}}}}}}}}},99:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[263]}}}}}}}}},112:{l:{59:{c:[8745]},97:{l:{110:{l:{100:{l:{59:{c:[10820]}}}}}}},98:{l:{114:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10825]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10827]}}}}},117:{l:{112:{l:{59:{c:[10823]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10816]}}}}}}},115:{l:{59:{c:[8745,65024]}}}}},114:{l:{101:{l:{116:{l:{59:{c:[8257]}}}}},111:{l:{110:{l:{59:{c:[711]}}}}}}}}},99:{l:{97:{l:{112:{l:{115:{l:{59:{c:[10829]}}}}},114:{l:{111:{l:{110:{l:{59:{c:[269]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[231]}},c:[231]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[265]}}}}}}},117:{l:{112:{l:{115:{l:{59:{c:[10828]},115:{l:{109:{l:{59:{c:[10832]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[267]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[184]}},c:[184]}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10674]}}}}}}}}}}},110:{l:{116:{l:{59:{c:[162]},101:{l:{114:{l:{100:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}},c:[162]}}}}},102:{l:{114:{l:{59:{c:[120096]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1095]}}}}},101:{l:{99:{l:{107:{l:{59:{c:[10003]},109:{l:{97:{l:{114:{l:{107:{l:{59:{c:[10003]}}}}}}}}}}}}}}},105:{l:{59:{c:[967]}}}}},105:{l:{114:{l:{59:{c:[9675]},69:{l:{59:{c:[10691]}}},99:{l:{59:{c:[710]},101:{l:{113:{l:{59:{c:[8791]}}}}},108:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8634]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8635]}}}}}}}}}}}}}}}}}}}}},100:{l:{82:{l:{59:{c:[174]}}},83:{l:{59:{c:[9416]}}},97:{l:{115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8858]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}}}}}}}}}}}},101:{l:{59:{c:[8791]}}},102:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10768]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[10991]}}}}}}},115:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10690]}}}}}}}}}}}}},108:{l:{117:{l:{98:{l:{115:{l:{59:{c:[9827]},117:{l:{105:{l:{116:{l:{59:{c:[9827]}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[58]},101:{l:{59:{c:[8788]},113:{l:{59:{c:[8788]}}}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[44]},116:{l:{59:{c:[64]}}}}}}},112:{l:{59:{c:[8705]},102:{l:{110:{l:{59:{c:[8728]}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8705]}}}}}}}}},120:{l:{101:{l:{115:{l:{59:{c:[8450]}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[8773]},100:{l:{111:{l:{116:{l:{59:{c:[10861]}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}}}},112:{l:{102:{l:{59:{c:[120148]}}},114:{l:{111:{l:{100:{l:{59:{c:[8720]}}}}}}},121:{l:{59:{c:[169]},115:{l:{114:{l:{59:{c:[8471]}}}}}},c:[169]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8629]}}}}}}},111:{l:{115:{l:{115:{l:{59:{c:[10007]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119992]}}}}},117:{l:{98:{l:{59:{c:[10959]},101:{l:{59:{c:[10961]}}}}},112:{l:{59:{c:[10960]},101:{l:{59:{c:[10962]}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8943]}}}}}}}}},117:{l:{100:{l:{97:{l:{114:{l:{114:{l:{108:{l:{59:{c:[10552]}}},114:{l:{59:{c:[10549]}}}}}}}}}}},101:{l:{112:{l:{114:{l:{59:{c:[8926]}}}}},115:{l:{99:{l:{59:{c:[8927]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8630]},112:{l:{59:{c:[10557]}}}}}}}}}}},112:{l:{59:{c:[8746]},98:{l:{114:{l:{99:{l:{97:{l:{112:{l:{59:{c:[10824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10822]}}}}},117:{l:{112:{l:{59:{c:[10826]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8845]}}}}}}},111:{l:{114:{l:{59:{c:[10821]}}}}},115:{l:{59:{c:[8746,65024]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8631]},109:{l:{59:{c:[10556]}}}}}}}}},108:{l:{121:{l:{101:{l:{113:{l:{112:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8926]}}}}}}}}},115:{l:{117:{l:{99:{l:{99:{l:{59:{c:[8927]}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8911]}}}}}}}}}}}}}}},114:{l:{101:{l:{110:{l:{59:{c:[164]}},c:[164]}}}}},118:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8630]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8631]}}}}}}}}}}}}}}}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8911]}}}}}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8754]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8753]}}}}}}}}},121:{l:{108:{l:{99:{l:{116:{l:{121:{l:{59:{c:[9005]}}}}}}}}}}}}},100:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8659]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10597]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8224]}}}}}}}}},108:{l:{101:{l:{116:{l:{104:{l:{59:{c:[8504]}}}}}}}}},114:{l:{114:{l:{59:{c:[8595]}}}}},115:{l:{104:{l:{59:{c:[8208]},118:{l:{59:{c:[8867]}}}}}}}}},98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10511]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{59:{c:[733]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[271]}}}}}}}}},121:{l:{59:{c:[1076]}}}}},100:{l:{59:{c:[8518]},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8650]}}}}}}},111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[10871]}}}}}}}}}}}}},101:{l:{103:{l:{59:{c:[176]}},c:[176]},108:{l:{116:{l:{97:{l:{59:{c:[948]}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10673]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10623]}}}}}}}}},114:{l:{59:{c:[120097]}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8643]}}},114:{l:{59:{c:[8642]}}}}}}}}},105:{l:{97:{l:{109:{l:{59:{c:[8900]},111:{l:{110:{l:{100:{l:{59:{c:[8900]},115:{l:{117:{l:{105:{l:{116:{l:{59:{c:[9830]}}}}}}}}}}}}}}},115:{l:{59:{c:[9830]}}}}}}},101:{l:{59:{c:[168]}}},103:{l:{97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[989]}}}}}}}}}}},115:{l:{105:{l:{110:{l:{59:{c:[8946]}}}}}}},118:{l:{59:{c:[247]},105:{l:{100:{l:{101:{l:{59:{c:[247]},111:{l:{110:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8903]}}}}}}}}}}}}}}}},c:[247]}}}}},111:{l:{110:{l:{120:{l:{59:{c:[8903]}}}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1106]}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8990]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8973]}}}}}}}}}}},111:{l:{108:{l:{108:{l:{97:{l:{114:{l:{59:{c:[36]}}}}}}}}},112:{l:{102:{l:{59:{c:[120149]}}}}},116:{l:{59:{c:[729]},101:{l:{113:{l:{59:{c:[8784]},100:{l:{111:{l:{116:{l:{59:{c:[8785]}}}}}}}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8760]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8724]}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8865]}}}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{98:{l:{97:{l:{114:{l:{119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8966]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8650]}}}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8643]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10512]}}}}}}}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8991]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8972]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119993]}}},121:{l:{59:{c:[1109]}}}}},111:{l:{108:{l:{59:{c:[10742]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[273]}}}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8945]}}}}}}},114:{l:{105:{l:{59:{c:[9663]},102:{l:{59:{c:[9662]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8693]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10607]}}}}}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10662]}}}}}}}}}}}}},122:{l:{99:{l:{121:{l:{59:{c:[1119]}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10239]}}}}}}}}}}}}}}}}},101:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[10871]}}}}}}},111:{l:{116:{l:{59:{c:[8785]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[233]}},c:[233]}}}}}}},115:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10862]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[283]}}}}}}}}},105:{l:{114:{l:{59:{c:[8790]},99:{l:{59:{c:[234]}},c:[234]}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}},121:{l:{59:{c:[1101]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[279]}}}}}}},101:{l:{59:{c:[8519]}}},102:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8786]}}}}}}},114:{l:{59:{c:[120098]}}}}},103:{l:{59:{c:[10906]},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[232]}},c:[232]}}}}}}},115:{l:{59:{c:[10902]},100:{l:{111:{l:{116:{l:{59:{c:[10904]}}}}}}}}}}},108:{l:{59:{c:[10905]},105:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{59:{c:[9191]}}}}}}}}}}}}},108:{l:{59:{c:[8467]}}},115:{l:{59:{c:[10901]},100:{l:{111:{l:{116:{l:{59:{c:[10903]}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[275]}}}}}}},112:{l:{116:{l:{121:{l:{59:{c:[8709]},115:{l:{101:{l:{116:{l:{59:{c:[8709]}}}}}}},118:{l:{59:{c:[8709]}}}}}}}}},115:{l:{112:{l:{49:{l:{51:{l:{59:{c:[8196]}}},52:{l:{59:{c:[8197]}}}}},59:{c:[8195]}}}}}}},110:{l:{103:{l:{59:{c:[331]}}},115:{l:{112:{l:{59:{c:[8194]}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[281]}}}}}}},112:{l:{102:{l:{59:{c:[120150]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8917]},115:{l:{108:{l:{59:{c:[10723]}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[10865]}}}}}}},115:{l:{105:{l:{59:{c:[949]},108:{l:{111:{l:{110:{l:{59:{c:[949]}}}}}}},118:{l:{59:{c:[1013]}}}}}}}}},113:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8790]}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8770]}}}}},108:{l:{97:{l:{110:{l:{116:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10902]}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10901]}}}}}}}}}}}}}}}}}}},117:{l:{97:{l:{108:{l:{115:{l:{59:{c:[61]}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[8799]}}}}}}},105:{l:{118:{l:{59:{c:[8801]},68:{l:{68:{l:{59:{c:[10872]}}}}}}}}}}},118:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10725]}}}}}}}}}}}}}}},114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8787]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10609]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8495]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784]}}}}}}},105:{l:{109:{l:{59:{c:[8770]}}}}}}},116:{l:{97:{l:{59:{c:[951]}}},104:{l:{59:{c:[240]}},c:[240]}}},117:{l:{109:{l:{108:{l:{59:{c:[235]}},c:[235]}}},114:{l:{111:{l:{59:{c:[8364]}}}}}}},120:{l:{99:{l:{108:{l:{59:{c:[33]}}}}},105:{l:{115:{l:{116:{l:{59:{c:[8707]}}}}}}},112:{l:{101:{l:{99:{l:{116:{l:{97:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8496]}}}}}}}}}}}}}}}}},111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{101:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{97:{l:{108:{l:{108:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8786]}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1092]}}}}},101:{l:{109:{l:{97:{l:{108:{l:{101:{l:{59:{c:[9792]}}}}}}}}}}},102:{l:{105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64259]}}}}}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64256]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64260]}}}}}}}}},114:{l:{59:{c:[120099]}}}}},105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64257]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[102,106]}}}}}}}}},108:{l:{97:{l:{116:{l:{59:{c:[9837]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64258]}}}}}}},116:{l:{110:{l:{115:{l:{59:{c:[9649]}}}}}}}}},110:{l:{111:{l:{102:{l:{59:{c:[402]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120151]}}}}},114:{l:{97:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}},107:{l:{59:{c:[8916]},118:{l:{59:{c:[10969]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10765]}}}}}}}}}}}}}}},114:{l:{97:{l:{99:{l:{49:{l:{50:{l:{59:{c:[189]}},c:[189]},51:{l:{59:{c:[8531]}}},52:{l:{59:{c:[188]}},c:[188]},53:{l:{59:{c:[8533]}}},54:{l:{59:{c:[8537]}}},56:{l:{59:{c:[8539]}}}}},50:{l:{51:{l:{59:{c:[8532]}}},53:{l:{59:{c:[8534]}}}}},51:{l:{52:{l:{59:{c:[190]}},c:[190]},53:{l:{59:{c:[8535]}}},56:{l:{59:{c:[8540]}}}}},52:{l:{53:{l:{59:{c:[8536]}}}}},53:{l:{54:{l:{59:{c:[8538]}}},56:{l:{59:{c:[8541]}}}}},55:{l:{56:{l:{59:{c:[8542]}}}}}}},115:{l:{108:{l:{59:{c:[8260]}}}}}}},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119995]}}}}}}}}},103:{l:{69:{l:{59:{c:[8807]},108:{l:{59:{c:[10892]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[501]}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[947]},100:{l:{59:{c:[989]}}}}}}}}},112:{l:{59:{c:[10886]}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[287]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[285]}}}}}}},121:{l:{59:{c:[1075]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[289]}}}}}}},101:{l:{59:{c:[8805]},108:{l:{59:{c:[8923]}}},113:{l:{59:{c:[8805]},113:{l:{59:{c:[8807]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878]}}}}}}}}}}}}},115:{l:{59:{c:[10878]},99:{l:{99:{l:{59:{c:[10921]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10880]},111:{l:{59:{c:[10882]},108:{l:{59:{c:[10884]}}}}}}}}}}},108:{l:{59:{c:[8923,65024]},101:{l:{115:{l:{59:{c:[10900]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120100]}}}}},103:{l:{59:{c:[8811]},103:{l:{59:{c:[8921]}}}}},105:{l:{109:{l:{101:{l:{108:{l:{59:{c:[8503]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1107]}}}}}}},108:{l:{59:{c:[8823]},69:{l:{59:{c:[10898]}}},97:{l:{59:{c:[10917]}}},106:{l:{59:{c:[10916]}}}}},110:{l:{69:{l:{59:{c:[8809]}}},97:{l:{112:{l:{59:{c:[10890]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10890]}}}}}}}}}}}}},101:{l:{59:{c:[10888]},113:{l:{59:{c:[10888]},113:{l:{59:{c:[8809]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8935]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120152]}}}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8458]}}}}},105:{l:{109:{l:{59:{c:[8819]},101:{l:{59:{c:[10894]}}},108:{l:{59:{c:[10896]}}}}}}}}},116:{l:{59:{c:[62]},99:{l:{99:{l:{59:{c:[10919]}}},105:{l:{114:{l:{59:{c:[10874]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},108:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10645]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10876]}}}}}}}}}}},114:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10886]}}}}}}}}}}},114:{l:{114:{l:{59:{c:[10616]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},101:{l:{113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}},113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10892]}}}}}}}}}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8819]}}}}}}}}}},c:[62]},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8809,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8809,65024]}}}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8660]}}}}}}},97:{l:{105:{l:{114:{l:{115:{l:{112:{l:{59:{c:[8202]}}}}}}}}},108:{l:{102:{l:{59:{c:[189]}}}}},109:{l:{105:{l:{108:{l:{116:{l:{59:{c:[8459]}}}}}}}}},114:{l:{100:{l:{99:{l:{121:{l:{59:{c:[1098]}}}}}}},114:{l:{59:{c:[8596]},99:{l:{105:{l:{114:{l:{59:{c:[10568]}}}}}}},119:{l:{59:{c:[8621]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[8463]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[293]}}}}}}}}},101:{l:{97:{l:{114:{l:{116:{l:{115:{l:{59:{c:[9829]},117:{l:{105:{l:{116:{l:{59:{c:[9829]}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8230]}}}}}}}}},114:{l:{99:{l:{111:{l:{110:{l:{59:{c:[8889]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120101]}}}}},107:{l:{115:{l:{101:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10533]}}}}}}}}}}},119:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10534]}}}}}}}}}}}}}}},111:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8703]}}}}}}},109:{l:{116:{l:{104:{l:{116:{l:{59:{c:[8763]}}}}}}}}},111:{l:{107:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8617]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8618]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120153]}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8213]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119997]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8463]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[295]}}}}}}}}}}},121:{l:{98:{l:{117:{l:{108:{l:{108:{l:{59:{c:[8259]}}}}}}}}},112:{l:{104:{l:{101:{l:{110:{l:{59:{c:[8208]}}}}}}}}}}}}},105:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[237]}},c:[237]}}}}}}}}},99:{l:{59:{c:[8291]},105:{l:{114:{l:{99:{l:{59:{c:[238]}},c:[238]}}}}},121:{l:{59:{c:[1080]}}}}},101:{l:{99:{l:{121:{l:{59:{c:[1077]}}}}},120:{l:{99:{l:{108:{l:{59:{c:[161]}},c:[161]}}}}}}},102:{l:{102:{l:{59:{c:[8660]}}},114:{l:{59:{c:[120102]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[236]}},c:[236]}}}}}}}}},105:{l:{59:{c:[8520]},105:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10716]}}}}}}}}},111:{l:{116:{l:{97:{l:{59:{c:[8489]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[307]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[299]}}}}},103:{l:{101:{l:{59:{c:[8465]}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8464]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8465]}}}}}}}}}}},116:{l:{104:{l:{59:{c:[305]}}}}}}},111:{l:{102:{l:{59:{c:[8887]}}}}},112:{l:{101:{l:{100:{l:{59:{c:[437]}}}}}}}}},110:{l:{59:{c:[8712]},99:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8453]}}}}}}}}},102:{l:{105:{l:{110:{l:{59:{c:[8734]},116:{l:{105:{l:{101:{l:{59:{c:[10717]}}}}}}}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[305]}}}}}}}}},116:{l:{59:{c:[8747]},99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}},101:{l:{103:{l:{101:{l:{114:{l:{115:{l:{59:{c:[8484]}}}}}}}}},114:{l:{99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}}}}}},108:{l:{97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10775]}}}}}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}}}}}},111:{l:{99:{l:{121:{l:{59:{c:[1105]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[303]}}}}}}},112:{l:{102:{l:{59:{c:[120154]}}}}},116:{l:{97:{l:{59:{c:[953]}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[191]}},c:[191]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119998]}}}}},105:{l:{110:{l:{59:{c:[8712]},69:{l:{59:{c:[8953]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949]}}}}}}},115:{l:{59:{c:[8948]},118:{l:{59:{c:[8947]}}}}},118:{l:{59:{c:[8712]}}}}}}}}},116:{l:{59:{c:[8290]},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[297]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1110]}}}}}}},109:{l:{108:{l:{59:{c:[239]}},c:[239]}}}}}}},106:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[309]}}}}}}},121:{l:{59:{c:[1081]}}}}},102:{l:{114:{l:{59:{c:[120103]}}}}},109:{l:{97:{l:{116:{l:{104:{l:{59:{c:[567]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120155]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119999]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1112]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1108]}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[954]},118:{l:{59:{c:[1008]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[311]}}}}}}}}},121:{l:{59:{c:[1082]}}}}},102:{l:{114:{l:{59:{c:[120104]}}}}},103:{l:{114:{l:{101:{l:{101:{l:{110:{l:{59:{c:[312]}}}}}}}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1093]}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1116]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120156]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120000]}}}}}}}}},108:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8666]}}}}}}},114:{l:{114:{l:{59:{c:[8656]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10523]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10510]}}}}}}}}},69:{l:{59:{c:[8806]},103:{l:{59:{c:[10891]}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10594]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[314]}}}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10676]}}}}}}}}}}}}},103:{l:{114:{l:{97:{l:{110:{l:{59:{c:[8466]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[955]}}}}}}}}},110:{l:{103:{l:{59:{c:[10216]},100:{l:{59:{c:[10641]}}},108:{l:{101:{l:{59:{c:[10216]}}}}}}}}},112:{l:{59:{c:[10885]}}},113:{l:{117:{l:{111:{l:{59:{c:[171]}},c:[171]}}}}},114:{l:{114:{l:{59:{c:[8592]},98:{l:{59:{c:[8676]},102:{l:{115:{l:{59:{c:[10527]}}}}}}},102:{l:{115:{l:{59:{c:[10525]}}}}},104:{l:{107:{l:{59:{c:[8617]}}}}},108:{l:{112:{l:{59:{c:[8619]}}}}},112:{l:{108:{l:{59:{c:[10553]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10611]}}}}}}},116:{l:{108:{l:{59:{c:[8610]}}}}}}}}},116:{l:{59:{c:[10923]},97:{l:{105:{l:{108:{l:{59:{c:[10521]}}}}}}},101:{l:{59:{c:[10925]},115:{l:{59:{c:[10925,65024]}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10508]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10098]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[123]}}},107:{l:{59:{c:[91]}}}}}}},107:{l:{101:{l:{59:{c:[10635]}}},115:{l:{108:{l:{100:{l:{59:{c:[10639]}}},117:{l:{59:{c:[10637]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[318]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[316]}}}}}}},105:{l:{108:{l:{59:{c:[8968]}}}}}}},117:{l:{98:{l:{59:{c:[123]}}}}},121:{l:{59:{c:[1083]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10550]}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8220]},114:{l:{59:{c:[8222]}}}}}}}}},114:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10599]}}}}}}}}},117:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10571]}}}}}}}}}}}}},115:{l:{104:{l:{59:{c:[8626]}}}}}}},101:{l:{59:{c:[8804]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8610]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8637]}}}}}}}}},117:{l:{112:{l:{59:{c:[8636]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8647]}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]},115:{l:{59:{c:[8646]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8621]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8907]}}}}}}}}}}}}}}}}}}}}}}}}},103:{l:{59:{c:[8922]}}},113:{l:{59:{c:[8804]},113:{l:{59:{c:[8806]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877]}}}}}}}}}}}}},115:{l:{59:{c:[10877]},99:{l:{99:{l:{59:{c:[10920]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10879]},111:{l:{59:{c:[10881]},114:{l:{59:{c:[10883]}}}}}}}}}}},103:{l:{59:{c:[8922,65024]},101:{l:{115:{l:{59:{c:[10899]}}}}}}},115:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10885]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},101:{l:{113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[8922]}}}}}}},113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10891]}}}}}}}}}}}}},103:{l:{116:{l:{114:{l:{59:{c:[8822]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8818]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10620]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}},114:{l:{59:{c:[120105]}}}}},103:{l:{59:{c:[8822]},69:{l:{59:{c:[10897]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8637]}}},117:{l:{59:{c:[8636]},108:{l:{59:{c:[10602]}}}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9604]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1113]}}}}}}},108:{l:{59:{c:[8810]},97:{l:{114:{l:{114:{l:{59:{c:[8647]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8990]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[10603]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9722]}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[320]}}}}}}}}},111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9136]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9136]}}}}}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808]}}},97:{l:{112:{l:{59:{c:[10889]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10889]}}}}}}}}}}}}},101:{l:{59:{c:[10887]},113:{l:{59:{c:[10887]},113:{l:{59:{c:[8808]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8934]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10220]}}}}},114:{l:{114:{l:{59:{c:[8701]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10214]}}}}}}},110:{l:{103:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{115:{l:{116:{l:{111:{l:{59:{c:[10236]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8619]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8620]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10629]}}}}},102:{l:{59:{c:[120157]}}},108:{l:{117:{l:{115:{l:{59:{c:[10797]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10804]}}}}}}}}}}},119:{l:{97:{l:{115:{l:{116:{l:{59:{c:[8727]}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[95]}}}}}}}}},122:{l:{59:{c:[9674]},101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[9674]}}}}}}}}},102:{l:{59:{c:[10731]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[40]},108:{l:{116:{l:{59:{c:[10643]}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8646]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8991]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8651]},100:{l:{59:{c:[10605]}}}}}}}}},109:{l:{59:{c:[8206]}}},116:{l:{114:{l:{105:{l:{59:{c:[8895]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8249]}}}}}}}}},99:{l:{114:{l:{59:{c:[120001]}}}}},104:{l:{59:{c:[8624]}}},105:{l:{109:{l:{59:{c:[8818]},101:{l:{59:{c:[10893]}}},103:{l:{59:{c:[10895]}}}}}}},113:{l:{98:{l:{59:{c:[91]}}},117:{l:{111:{l:{59:{c:[8216]},114:{l:{59:{c:[8218]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[322]}}}}}}}}}}},116:{l:{59:{c:[60]},99:{l:{99:{l:{59:{c:[10918]}}},105:{l:{114:{l:{59:{c:[10873]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8907]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8905]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10614]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10875]}}}}}}}}}}},114:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10646]}}}}}}},105:{l:{59:{c:[9667]},101:{l:{59:{c:[8884]}}},102:{l:{59:{c:[9666]}}}}}}}},c:[60]},117:{l:{114:{l:{100:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10570]}}}}}}}}}}},117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10598]}}}}}}}}}}}}},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8808,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808,65024]}}}}}}}}},109:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8762]}}}}}}}}},97:{l:{99:{l:{114:{l:{59:{c:[175]}},c:[175]}}},108:{l:{101:{l:{59:{c:[9794]}}},116:{l:{59:{c:[10016]},101:{l:{115:{l:{101:{l:{59:{c:[10016]}}}}}}}}}}},112:{l:{59:{c:[8614]},115:{l:{116:{l:{111:{l:{59:{c:[8614]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8615]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8612]}}}}}}}}},117:{l:{112:{l:{59:{c:[8613]}}}}}}}}}}}}},114:{l:{107:{l:{101:{l:{114:{l:{59:{c:[9646]}}}}}}}}}}},99:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[10793]}}}}}}}}},121:{l:{59:{c:[1084]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8212]}}}}}}}}},101:{l:{97:{l:{115:{l:{117:{l:{114:{l:{101:{l:{100:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8737]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120106]}}}}},104:{l:{111:{l:{59:{c:[8487]}}}}},105:{l:{99:{l:{114:{l:{111:{l:{59:{c:[181]}},c:[181]}}}}},100:{l:{59:{c:[8739]},97:{l:{115:{l:{116:{l:{59:{c:[42]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10992]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[183]}},c:[183]}}}}}}},110:{l:{117:{l:{115:{l:{59:{c:[8722]},98:{l:{59:{c:[8863]}}},100:{l:{59:{c:[8760]},117:{l:{59:{c:[10794]}}}}}}}}}}}}},108:{l:{99:{l:{112:{l:{59:{c:[10971]}}}}},100:{l:{114:{l:{59:{c:[8230]}}}}}}},110:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}},111:{l:{100:{l:{101:{l:{108:{l:{115:{l:{59:{c:[8871]}}}}}}}}},112:{l:{102:{l:{59:{c:[120158]}}}}}}},112:{l:{59:{c:[8723]}}},115:{l:{99:{l:{114:{l:{59:{c:[120002]}}}}},116:{l:{112:{l:{111:{l:{115:{l:{59:{c:[8766]}}}}}}}}}}},117:{l:{59:{c:[956]},108:{l:{116:{l:{105:{l:{109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}},110:{l:{71:{l:{103:{l:{59:{c:[8921,824]}}},116:{l:{59:{c:[8811,8402]},118:{l:{59:{c:[8811,824]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8653]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8654]}}}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{59:{c:[8920,824]}}},116:{l:{59:{c:[8810,8402]},118:{l:{59:{c:[8810,824]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8655]}}}}}}}}}}}}}}}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8879]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8878]}}}}}}}}}}},97:{l:{98:{l:{108:{l:{97:{l:{59:{c:[8711]}}}}}}},99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[324]}}}}}}}}},110:{l:{103:{l:{59:{c:[8736,8402]}}}}},112:{l:{59:{c:[8777]},69:{l:{59:{c:[10864,824]}}},105:{l:{100:{l:{59:{c:[8779,824]}}}}},111:{l:{115:{l:{59:{c:[329]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8777]}}}}}}}}}}},116:{l:{117:{l:{114:{l:{59:{c:[9838]},97:{l:{108:{l:{59:{c:[9838]},115:{l:{59:{c:[8469]}}}}}}}}}}}}}}},98:{l:{115:{l:{112:{l:{59:{c:[160]}},c:[160]}}},117:{l:{109:{l:{112:{l:{59:{c:[8782,824]},101:{l:{59:{c:[8783,824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10819]}}},114:{l:{111:{l:{110:{l:{59:{c:[328]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[326]}}}}}}}}},111:{l:{110:{l:{103:{l:{59:{c:[8775]},100:{l:{111:{l:{116:{l:{59:{c:[10861,824]}}}}}}}}}}}}},117:{l:{112:{l:{59:{c:[10818]}}}}},121:{l:{59:{c:[1085]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8211]}}}}}}}}},101:{l:{59:{c:[8800]},65:{l:{114:{l:{114:{l:{59:{c:[8663]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10532]}}}}},114:{l:{59:{c:[8599]},111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784,824]}}}}}}},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8802]}}}}}}}}},115:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10536]}}}}}}},105:{l:{109:{l:{59:{c:[8770,824]}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{59:{c:[8708]},115:{l:{59:{c:[8708]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120107]}}}}},103:{l:{69:{l:{59:{c:[8807,824]}}},101:{l:{59:{c:[8817]},113:{l:{59:{c:[8817]},113:{l:{59:{c:[8807,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878,824]}}}}}}}}}}}}},115:{l:{59:{c:[10878,824]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8821]}}}}}}},116:{l:{59:{c:[8815]},114:{l:{59:{c:[8815]}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8654]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8622]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10994]}}}}}}}}},105:{l:{59:{c:[8715]},115:{l:{59:{c:[8956]},100:{l:{59:{c:[8954]}}}}},118:{l:{59:{c:[8715]}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1114]}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8653]}}}}}}},69:{l:{59:{c:[8806,824]}}},97:{l:{114:{l:{114:{l:{59:{c:[8602]}}}}}}},100:{l:{114:{l:{59:{c:[8229]}}}}},101:{l:{59:{c:[8816]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8602]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8622]}}}}}}}}}}}}}}}}}}}}}}}}},113:{l:{59:{c:[8816]},113:{l:{59:{c:[8806,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877,824]}}}}}}}}}}}}},115:{l:{59:{c:[10877,824]},115:{l:{59:{c:[8814]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8820]}}}}}}},116:{l:{59:{c:[8814]},114:{l:{105:{l:{59:{c:[8938]},101:{l:{59:{c:[8940]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120159]}}}}},116:{l:{59:{c:[172]},105:{l:{110:{l:{59:{c:[8713]},69:{l:{59:{c:[8953,824]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949,824]}}}}}}},118:{l:{97:{l:{59:{c:[8713]}}},98:{l:{59:{c:[8951]}}},99:{l:{59:{c:[8950]}}}}}}}}},110:{l:{105:{l:{59:{c:[8716]},118:{l:{97:{l:{59:{c:[8716]}}},98:{l:{59:{c:[8958]}}},99:{l:{59:{c:[8957]}}}}}}}}}},c:[172]}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]},97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}},115:{l:{108:{l:{59:{c:[11005,8421]}}}}},116:{l:{59:{c:[8706,824]}}}}}}},111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10772]}}}}}}}}}}},114:{l:{59:{c:[8832]},99:{l:{117:{l:{101:{l:{59:{c:[8928]}}}}}}},101:{l:{59:{c:[10927,824]},99:{l:{59:{c:[8832]},101:{l:{113:{l:{59:{c:[10927,824]}}}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8655]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8603]},99:{l:{59:{c:[10547,824]}}},119:{l:{59:{c:[8605,824]}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8603]}}}}}}}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[8939]},101:{l:{59:{c:[8941]}}}}}}}}}}},115:{l:{99:{l:{59:{c:[8833]},99:{l:{117:{l:{101:{l:{59:{c:[8929]}}}}}}},101:{l:{59:{c:[10928,824]}}},114:{l:{59:{c:[120003]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[8769]},101:{l:{59:{c:[8772]},113:{l:{59:{c:[8772]}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}},113:{l:{115:{l:{117:{l:{98:{l:{101:{l:{59:{c:[8930]}}}}},112:{l:{101:{l:{59:{c:[8931]}}}}}}}}}}},117:{l:{98:{l:{59:{c:[8836]},69:{l:{59:{c:[10949,824]}}},101:{l:{59:{c:[8840]}}},115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},101:{l:{113:{l:{59:{c:[8840]},113:{l:{59:{c:[10949,824]}}}}}}}}}}}}}}},99:{l:{99:{l:{59:{c:[8833]},101:{l:{113:{l:{59:{c:[10928,824]}}}}}}}}},112:{l:{59:{c:[8837]},69:{l:{59:{c:[10950,824]}}},101:{l:{59:{c:[8841]}}},115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},101:{l:{113:{l:{59:{c:[8841]},113:{l:{59:{c:[10950,824]}}}}}}}}}}}}}}}}}}},116:{l:{103:{l:{108:{l:{59:{c:[8825]}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[241]}},c:[241]}}}}}}},108:{l:{103:{l:{59:{c:[8824]}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8938]},101:{l:{113:{l:{59:{c:[8940]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8939]},101:{l:{113:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{59:{c:[957]},109:{l:{59:{c:[35]},101:{l:{114:{l:{111:{l:{59:{c:[8470]}}}}}}},115:{l:{112:{l:{59:{c:[8199]}}}}}}}}},118:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8877]}}}}}}}}},72:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10500]}}}}}}}}},97:{l:{112:{l:{59:{c:[8781,8402]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8876]}}}}}}}}},103:{l:{101:{l:{59:{c:[8805,8402]}}},116:{l:{59:{c:[62,8402]}}}}},105:{l:{110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10718]}}}}}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10498]}}}}}}},101:{l:{59:{c:[8804,8402]}}},116:{l:{59:{c:[60,8402]},114:{l:{105:{l:{101:{l:{59:{c:[8884,8402]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10499]}}}}}}},116:{l:{114:{l:{105:{l:{101:{l:{59:{c:[8885,8402]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764,8402]}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8662]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10531]}}}}},114:{l:{59:{c:[8598]},111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}},110:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10535]}}}}}}}}}}}}},111:{l:{83:{l:{59:{c:[9416]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[243]}},c:[243]}}}}}}},115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[8858]},99:{l:{59:{c:[244]}},c:[244]}}}}},121:{l:{59:{c:[1086]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[337]}}}}}}}}},105:{l:{118:{l:{59:{c:[10808]}}}}},111:{l:{116:{l:{59:{c:[8857]}}}}},115:{l:{111:{l:{108:{l:{100:{l:{59:{c:[10684]}}}}}}}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[339]}}}}}}}}},102:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10687]}}}}}}},114:{l:{59:{c:[120108]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[731]}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[242]}},c:[242]}}}}}}},116:{l:{59:{c:[10689]}}}}},104:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10677]}}}}}}},109:{l:{59:{c:[937]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8634]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10686]}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10683]}}}}}}}}}}},105:{l:{110:{l:{101:{l:{59:{c:[8254]}}}}}}},116:{l:{59:{c:[10688]}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[333]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[969]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[959]}}}}}}}}},100:{l:{59:{c:[10678]}}},110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120160]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10679]}}}}},101:{l:{114:{l:{112:{l:{59:{c:[10681]}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},114:{l:{59:{c:[8744]},97:{l:{114:{l:{114:{l:{59:{c:[8635]}}}}}}},100:{l:{59:{c:[10845]},101:{l:{114:{l:{59:{c:[8500]},111:{l:{102:{l:{59:{c:[8500]}}}}}}}}},102:{l:{59:{c:[170]}},c:[170]},109:{l:{59:{c:[186]}},c:[186]}}},105:{l:{103:{l:{111:{l:{102:{l:{59:{c:[8886]}}}}}}}}},111:{l:{114:{l:{59:{c:[10838]}}}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10839]}}}}}}}}}}},118:{l:{59:{c:[10843]}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8500]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[248]}},c:[248]}}}}}}},111:{l:{108:{l:{59:{c:[8856]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[245]}},c:[245]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[8855]},97:{l:{115:{l:{59:{c:[10806]}}}}}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[246]}},c:[246]}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[9021]}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8741]},97:{l:{59:{c:[182]},108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}},c:[182]},115:{l:{105:{l:{109:{l:{59:{c:[10995]}}}}},108:{l:{59:{c:[11005]}}}}},116:{l:{59:{c:[8706]}}}}}}},99:{l:{121:{l:{59:{c:[1087]}}}}},101:{l:{114:{l:{99:{l:{110:{l:{116:{l:{59:{c:[37]}}}}}}},105:{l:{111:{l:{100:{l:{59:{c:[46]}}}}}}},109:{l:{105:{l:{108:{l:{59:{c:[8240]}}}}}}},112:{l:{59:{c:[8869]}}},116:{l:{101:{l:{110:{l:{107:{l:{59:{c:[8241]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120109]}}}}},104:{l:{105:{l:{59:{c:[966]},118:{l:{59:{c:[981]}}}}},109:{l:{109:{l:{97:{l:{116:{l:{59:{c:[8499]}}}}}}}}},111:{l:{110:{l:{101:{l:{59:{c:[9742]}}}}}}}}},105:{l:{59:{c:[960]},116:{l:{99:{l:{104:{l:{102:{l:{111:{l:{114:{l:{107:{l:{59:{c:[8916]}}}}}}}}}}}}}}},118:{l:{59:{c:[982]}}}}},108:{l:{97:{l:{110:{l:{99:{l:{107:{l:{59:{c:[8463]},104:{l:{59:{c:[8462]}}}}}}},107:{l:{118:{l:{59:{c:[8463]}}}}}}}}},117:{l:{115:{l:{59:{c:[43]},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10787]}}}}}}}}},98:{l:{59:{c:[8862]}}},99:{l:{105:{l:{114:{l:{59:{c:[10786]}}}}}}},100:{l:{111:{l:{59:{c:[8724]}}},117:{l:{59:{c:[10789]}}}}},101:{l:{59:{c:[10866]}}},109:{l:{110:{l:{59:{c:[177]}},c:[177]}}},115:{l:{105:{l:{109:{l:{59:{c:[10790]}}}}}}},116:{l:{119:{l:{111:{l:{59:{c:[10791]}}}}}}}}}}}}},109:{l:{59:{c:[177]}}},111:{l:{105:{l:{110:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10773]}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120161]}}}}},117:{l:{110:{l:{100:{l:{59:{c:[163]}},c:[163]}}}}}}},114:{l:{59:{c:[8826]},69:{l:{59:{c:[10931]}}},97:{l:{112:{l:{59:{c:[10935]}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8828]}}}}}}},101:{l:{59:{c:[10927]},99:{l:{59:{c:[8826]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10935]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8828]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10927]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10937]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10933]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8242]},115:{l:{59:{c:[8473]}}}}}}}}},110:{l:{69:{l:{59:{c:[10933]}}},97:{l:{112:{l:{59:{c:[10937]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},111:{l:{100:{l:{59:{c:[8719]}}},102:{l:{97:{l:{108:{l:{97:{l:{114:{l:{59:{c:[9006]}}}}}}}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8978]}}}}}}}}},115:{l:{117:{l:{114:{l:{102:{l:{59:{c:[8979]}}}}}}}}}}},112:{l:{59:{c:[8733]},116:{l:{111:{l:{59:{c:[8733]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}},117:{l:{114:{l:{101:{l:{108:{l:{59:{c:[8880]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120005]}}}}},105:{l:{59:{c:[968]}}}}},117:{l:{110:{l:{99:{l:{115:{l:{112:{l:{59:{c:[8200]}}}}}}}}}}}}},113:{l:{102:{l:{114:{l:{59:{c:[120110]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120162]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8279]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120006]}}}}}}},117:{l:{97:{l:{116:{l:{101:{l:{114:{l:{110:{l:{105:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8461]}}}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10774]}}}}}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[63]},101:{l:{113:{l:{59:{c:[8799]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[34]}},c:[34]}}}}}}},114:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8667]}}}}}}},114:{l:{114:{l:{59:{c:[8658]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10524]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10511]}}}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10596]}}}}}}},97:{l:{99:{l:{101:{l:{59:{c:[8765,817]}}},117:{l:{116:{l:{101:{l:{59:{c:[341]}}}}}}}}},100:{l:{105:{l:{99:{l:{59:{c:[8730]}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10675]}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[10217]},100:{l:{59:{c:[10642]}}},101:{l:{59:{c:[10661]}}},108:{l:{101:{l:{59:{c:[10217]}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[187]}},c:[187]}}}}},114:{l:{114:{l:{59:{c:[8594]},97:{l:{112:{l:{59:{c:[10613]}}}}},98:{l:{59:{c:[8677]},102:{l:{115:{l:{59:{c:[10528]}}}}}}},99:{l:{59:{c:[10547]}}},102:{l:{115:{l:{59:{c:[10526]}}}}},104:{l:{107:{l:{59:{c:[8618]}}}}},108:{l:{112:{l:{59:{c:[8620]}}}}},112:{l:{108:{l:{59:{c:[10565]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10612]}}}}}}},116:{l:{108:{l:{59:{c:[8611]}}}}},119:{l:{59:{c:[8605]}}}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10522]}}}}}}},105:{l:{111:{l:{59:{c:[8758]},110:{l:{97:{l:{108:{l:{115:{l:{59:{c:[8474]}}}}}}}}}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10509]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10099]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[125]}}},107:{l:{59:{c:[93]}}}}}}},107:{l:{101:{l:{59:{c:[10636]}}},115:{l:{108:{l:{100:{l:{59:{c:[10638]}}},117:{l:{59:{c:[10640]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[345]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[343]}}}}}}},105:{l:{108:{l:{59:{c:[8969]}}}}}}},117:{l:{98:{l:{59:{c:[125]}}}}},121:{l:{59:{c:[1088]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10551]}}}}},108:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10601]}}}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8221]},114:{l:{59:{c:[8221]}}}}}}}}},115:{l:{104:{l:{59:{c:[8627]}}}}}}},101:{l:{97:{l:{108:{l:{59:{c:[8476]},105:{l:{110:{l:{101:{l:{59:{c:[8475]}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8476]}}}}}}}}},115:{l:{59:{c:[8477]}}}}}}},99:{l:{116:{l:{59:{c:[9645]}}}}},103:{l:{59:{c:[174]}},c:[174]}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10621]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}},114:{l:{59:{c:[120111]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8641]}}},117:{l:{59:{c:[8640]},108:{l:{59:{c:[10604]}}}}}}}}},111:{l:{59:{c:[961]},118:{l:{59:{c:[1009]}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8611]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8641]}}}}}}}}},117:{l:{112:{l:{59:{c:[8640]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8644]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8649]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8605]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8908]}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[730]}}}}},115:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8787]}}}}}}}}}}}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8644]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8652]}}}}}}},109:{l:{59:{c:[8207]}}}}},109:{l:{111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9137]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9137]}}}}}}}}}}}}}}}}}}},110:{l:{109:{l:{105:{l:{100:{l:{59:{c:[10990]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10221]}}}}},114:{l:{114:{l:{59:{c:[8702]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10215]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10630]}}}}},102:{l:{59:{c:[120163]}}},108:{l:{117:{l:{115:{l:{59:{c:[10798]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10805]}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[41]},103:{l:{116:{l:{59:{c:[10644]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10770]}}}}}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8649]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8250]}}}}}}}}},99:{l:{114:{l:{59:{c:[120007]}}}}},104:{l:{59:{c:[8625]}}},113:{l:{98:{l:{59:{c:[93]}}},117:{l:{111:{l:{59:{c:[8217]},114:{l:{59:{c:[8217]}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8908]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8906]}}}}}}}}},114:{l:{105:{l:{59:{c:[9657]},101:{l:{59:{c:[8885]}}},102:{l:{59:{c:[9656]}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[10702]}}}}}}}}}}}}}}},117:{l:{108:{l:{117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10600]}}}}}}}}}}}}},120:{l:{59:{c:[8478]}}}}},115:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[347]}}}}}}}}}}},98:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8218]}}}}}}}}},99:{l:{59:{c:[8827]},69:{l:{59:{c:[10932]}}},97:{l:{112:{l:{59:{c:[10936]}}},114:{l:{111:{l:{110:{l:{59:{c:[353]}}}}}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8829]}}}}}}},101:{l:{59:{c:[10928]},100:{l:{105:{l:{108:{l:{59:{c:[351]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[349]}}}}}}},110:{l:{69:{l:{59:{c:[10934]}}},97:{l:{112:{l:{59:{c:[10938]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10771]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}},121:{l:{59:{c:[1089]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8901]},98:{l:{59:{c:[8865]}}},101:{l:{59:{c:[10854]}}}}}}}}},101:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8664]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10533]}}}}},114:{l:{59:{c:[8600]},111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}},99:{l:{116:{l:{59:{c:[167]}},c:[167]}}},109:{l:{105:{l:{59:{c:[59]}}}}},115:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10537]}}}}}}}}},116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}},110:{l:{59:{c:[8726]}}}}}}},120:{l:{116:{l:{59:{c:[10038]}}}}}}},102:{l:{114:{l:{59:{c:[120112]},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{59:{c:[9839]}}}}}}},99:{l:{104:{l:{99:{l:{121:{l:{59:{c:[1097]}}}}}}},121:{l:{59:{c:[1096]}}}}},111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8739]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}},121:{l:{59:{c:[173]}},c:[173]}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[963]},102:{l:{59:{c:[962]}}},118:{l:{59:{c:[962]}}}}}}}}},109:{l:{59:{c:[8764]},100:{l:{111:{l:{116:{l:{59:{c:[10858]}}}}}}},101:{l:{59:{c:[8771]},113:{l:{59:{c:[8771]}}}}},103:{l:{59:{c:[10910]},69:{l:{59:{c:[10912]}}}}},108:{l:{59:{c:[10909]},69:{l:{59:{c:[10911]}}}}},110:{l:{101:{l:{59:{c:[8774]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10788]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10610]}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8592]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{115:{l:{101:{l:{116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}}}}}}}}}}}}}},115:{l:{104:{l:{112:{l:{59:{c:[10803]}}}}}}}}},101:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10724]}}}}}}}}}}}}},105:{l:{100:{l:{59:{c:[8739]}}},108:{l:{101:{l:{59:{c:[8995]}}}}}}},116:{l:{59:{c:[10922]},101:{l:{59:{c:[10924]},115:{l:{59:{c:[10924,65024]}}}}}}}}},111:{l:{102:{l:{116:{l:{99:{l:{121:{l:{59:{c:[1100]}}}}}}}}},108:{l:{59:{c:[47]},98:{l:{59:{c:[10692]},97:{l:{114:{l:{59:{c:[9023]}}}}}}}}},112:{l:{102:{l:{59:{c:[120164]}}}}}}},112:{l:{97:{l:{100:{l:{101:{l:{115:{l:{59:{c:[9824]},117:{l:{105:{l:{116:{l:{59:{c:[9824]}}}}}}}}}}}}},114:{l:{59:{c:[8741]}}}}}}},113:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8851]},115:{l:{59:{c:[8851,65024]}}}}}}},117:{l:{112:{l:{59:{c:[8852]},115:{l:{59:{c:[8852,65024]}}}}}}}}},115:{l:{117:{l:{98:{l:{59:{c:[8847]},101:{l:{59:{c:[8849]}}},115:{l:{101:{l:{116:{l:{59:{c:[8847]},101:{l:{113:{l:{59:{c:[8849]}}}}}}}}}}}}},112:{l:{59:{c:[8848]},101:{l:{59:{c:[8850]}}},115:{l:{101:{l:{116:{l:{59:{c:[8848]},101:{l:{113:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}},117:{l:{59:{c:[9633]},97:{l:{114:{l:{101:{l:{59:{c:[9633]}}},102:{l:{59:{c:[9642]}}}}}}},102:{l:{59:{c:[9642]}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8594]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120008]}}}}},101:{l:{116:{l:{109:{l:{110:{l:{59:{c:[8726]}}}}}}}}},109:{l:{105:{l:{108:{l:{101:{l:{59:{c:[8995]}}}}}}}}},116:{l:{97:{l:{114:{l:{102:{l:{59:{c:[8902]}}}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9734]},102:{l:{59:{c:[9733]}}}}}}},114:{l:{97:{l:{105:{l:{103:{l:{104:{l:{116:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}}}}}}}}}}}}}},110:{l:{115:{l:{59:{c:[175]}}}}}}}}},117:{l:{98:{l:{59:{c:[8834]},69:{l:{59:{c:[10949]}}},100:{l:{111:{l:{116:{l:{59:{c:[10941]}}}}}}},101:{l:{59:{c:[8838]},100:{l:{111:{l:{116:{l:{59:{c:[10947]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10945]}}}}}}}}},110:{l:{69:{l:{59:{c:[10955]}}},101:{l:{59:{c:[8842]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10943]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10617]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8834]},101:{l:{113:{l:{59:{c:[8838]},113:{l:{59:{c:[10949]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8842]},113:{l:{59:{c:[10955]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10951]}}}}},117:{l:{98:{l:{59:{c:[10965]}}},112:{l:{59:{c:[10963]}}}}}}}}},99:{l:{99:{l:{59:{c:[8827]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10936]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8829]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10928]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10938]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10934]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}}}}}},109:{l:{59:{c:[8721]}}},110:{l:{103:{l:{59:{c:[9834]}}}}},112:{l:{49:{l:{59:{c:[185]}},c:[185]},50:{l:{59:{c:[178]}},c:[178]},51:{l:{59:{c:[179]}},c:[179]},59:{c:[8835]},69:{l:{59:{c:[10950]}}},100:{l:{111:{l:{116:{l:{59:{c:[10942]}}}}},115:{l:{117:{l:{98:{l:{59:{c:[10968]}}}}}}}}},101:{l:{59:{c:[8839]},100:{l:{111:{l:{116:{l:{59:{c:[10948]}}}}}}}}},104:{l:{115:{l:{111:{l:{108:{l:{59:{c:[10185]}}}}},117:{l:{98:{l:{59:{c:[10967]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10619]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10946]}}}}}}}}},110:{l:{69:{l:{59:{c:[10956]}}},101:{l:{59:{c:[8843]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10944]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8835]},101:{l:{113:{l:{59:{c:[8839]},113:{l:{59:{c:[10950]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8843]},113:{l:{59:{c:[10956]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10952]}}}}},117:{l:{98:{l:{59:{c:[10964]}}},112:{l:{59:{c:[10966]}}}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8665]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10534]}}}}},114:{l:{59:{c:[8601]},111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}},110:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10538]}}}}}}}}}}},122:{l:{108:{l:{105:{l:{103:{l:{59:{c:[223]}},c:[223]}}}}}}}}},116:{l:{97:{l:{114:{l:{103:{l:{101:{l:{116:{l:{59:{c:[8982]}}}}}}}}},117:{l:{59:{c:[964]}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9140]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[357]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[355]}}}}}}}}},121:{l:{59:{c:[1090]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}},101:{l:{108:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8981]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120113]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{52:{l:{59:{c:[8756]}}},102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[952]},115:{l:{121:{l:{109:{l:{59:{c:[977]}}}}}}},118:{l:{59:{c:[977]}}}}}}}}},105:{l:{99:{l:{107:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}}}},110:{l:{115:{l:{112:{l:{59:{c:[8201]}}}}}}}}},107:{l:{97:{l:{112:{l:{59:{c:[8776]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}},111:{l:{114:{l:{110:{l:{59:{c:[254]}},c:[254]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}},109:{l:{101:{l:{115:{l:{59:{c:[215]},98:{l:{59:{c:[8864]},97:{l:{114:{l:{59:{c:[10801]}}}}}}},100:{l:{59:{c:[10800]}}}},c:[215]}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},111:{l:{101:{l:{97:{l:{59:{c:[10536]}}}}},112:{l:{59:{c:[8868]},98:{l:{111:{l:{116:{l:{59:{c:[9014]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10993]}}}}}}},102:{l:{59:{c:[120165]},111:{l:{114:{l:{107:{l:{59:{c:[10970]}}}}}}}}}}},115:{l:{97:{l:{59:{c:[10537]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8244]}}}}}}}}}}},114:{l:{97:{l:{100:{l:{101:{l:{59:{c:[8482]}}}}}}},105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9653]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9663]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9667]},101:{l:{113:{l:{59:{c:[8884]}}}}}}}}}}}}},113:{l:{59:{c:[8796]}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9657]},101:{l:{113:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[9708]}}}}}}},101:{l:{59:{c:[8796]}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[10810]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10809]}}}}}}}}},115:{l:{98:{l:{59:{c:[10701]}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10811]}}}}}}}}}}},112:{l:{101:{l:{122:{l:{105:{l:{117:{l:{109:{l:{59:{c:[9186]}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120009]}}},121:{l:{59:{c:[1094]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1115]}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[359]}}}}}}}}}}},119:{l:{105:{l:{120:{l:{116:{l:{59:{c:[8812]}}}}}}},111:{l:{104:{l:{101:{l:{97:{l:{100:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8606]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8608]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8657]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10595]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[250]}},c:[250]}}}}}}},114:{l:{114:{l:{59:{c:[8593]}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1118]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[365]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[251]}},c:[251]}}}}},121:{l:{59:{c:[1091]}}}}},100:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8645]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[369]}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10606]}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10622]}}}}}}}}},114:{l:{59:{c:[120114]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[249]}},c:[249]}}}}}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8639]}}},114:{l:{59:{c:[8638]}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9600]}}}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8988]},101:{l:{114:{l:{59:{c:[8988]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8975]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9720]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[363]}}}}}}},108:{l:{59:{c:[168]}},c:[168]}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[371]}}}}}}},112:{l:{102:{l:{59:{c:[120166]}}}}}}},112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8639]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8638]}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}},115:{l:{105:{l:{59:{c:[965]},104:{l:{59:{c:[978]}}},108:{l:{111:{l:{110:{l:{59:{c:[965]}}}}}}}}}}},117:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8648]}}}}}}}}}}}}}}}}}}},114:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8989]},101:{l:{114:{l:{59:{c:[8989]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8974]}}}}}}}}},105:{l:{110:{l:{103:{l:{59:{c:[367]}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9721]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120010]}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8944]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[361]}}}}}}}}},114:{l:{105:{l:{59:{c:[9653]},102:{l:{59:{c:[9652]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8648]}}}}}}},109:{l:{108:{l:{59:{c:[252]}},c:[252]}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10663]}}}}}}}}}}}}}}},118:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8661]}}}}}}},66:{l:{97:{l:{114:{l:{59:{c:[10984]},118:{l:{59:{c:[10985]}}}}}}}}},68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8872]}}}}}}}}},97:{l:{110:{l:{103:{l:{114:{l:{116:{l:{59:{c:[10652]}}}}}}}}},114:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[1008]}}}}}}}}}}},110:{l:{111:{l:{116:{l:{104:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8709]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}},105:{l:{59:{c:[982]}}},114:{l:{111:{l:{112:{l:{116:{l:{111:{l:{59:{c:[8733]}}}}}}}}}}}}},114:{l:{59:{c:[8597]},104:{l:{111:{l:{59:{c:[1009]}}}}}}},115:{l:{105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[962]}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8842,65024]},113:{l:{59:{c:[10955,65024]}}}}}}}}}}}}}}}}},112:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8843,65024]},113:{l:{59:{c:[10956,65024]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{101:{l:{116:{l:{97:{l:{59:{c:[977]}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8882]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8883]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1074]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8866]}}}}}}}}},101:{l:{101:{l:{59:{c:[8744]},98:{l:{97:{l:{114:{l:{59:{c:[8891]}}}}}}},101:{l:{113:{l:{59:{c:[8794]}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8942]}}}}}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[124]}}}}}}},116:{l:{59:{c:[124]}}}}}}},102:{l:{114:{l:{59:{c:[120115]}}}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8882]}}}}}}}}},110:{l:{115:{l:{117:{l:{98:{l:{59:{c:[8834,8402]}}},112:{l:{59:{c:[8835,8402]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120167]}}}}}}},112:{l:{114:{l:{111:{l:{112:{l:{59:{c:[8733]}}}}}}}}},114:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8883]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120011]}}}}},117:{l:{98:{l:{110:{l:{69:{l:{59:{c:[10955,65024]}}},101:{l:{59:{c:[8842,65024]}}}}}}},112:{l:{110:{l:{69:{l:{59:{c:[10956,65024]}}},101:{l:{59:{c:[8843,65024]}}}}}}}}}}},122:{l:{105:{l:{103:{l:{122:{l:{97:{l:{103:{l:{59:{c:[10650]}}}}}}}}}}}}}}},119:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[373]}}}}}}}}},101:{l:{100:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10847]}}}}}}},103:{l:{101:{l:{59:{c:[8743]},113:{l:{59:{c:[8793]}}}}}}}}},105:{l:{101:{l:{114:{l:{112:{l:{59:{c:[8472]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120116]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120168]}}}}}}},112:{l:{59:{c:[8472]}}},114:{l:{59:{c:[8768]},101:{l:{97:{l:{116:{l:{104:{l:{59:{c:[8768]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120012]}}}}}}}}},120:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},100:{l:{116:{l:{114:{l:{105:{l:{59:{c:[9661]}}}}}}}}},102:{l:{114:{l:{59:{c:[120117]}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10234]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10231]}}}}}}}}},105:{l:{59:{c:[958]}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10232]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10229]}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[10236]}}}}}}},110:{l:{105:{l:{115:{l:{59:{c:[8955]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{102:{l:{59:{c:[120169]}}},108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10754]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10233]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10230]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120013]}}}}},113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9651]}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}},121:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[253]}},c:[253]}}}}},121:{l:{59:{c:[1103]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[375]}}}}}}},121:{l:{59:{c:[1099]}}}}},101:{l:{110:{l:{59:{c:[165]}},c:[165]}}},102:{l:{114:{l:{59:{c:[120118]}}}}},105:{l:{99:{l:{121:{l:{59:{c:[1111]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120170]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120014]}}}}}}},117:{l:{99:{l:{121:{l:{59:{c:[1102]}}}}},109:{l:{108:{l:{59:{c:[255]}},c:[255]}}}}}}},122:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[378]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[382]}}}}}}}}},121:{l:{59:{c:[1079]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[380]}}}}}}},101:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8488]}}}}}}}}},116:{l:{97:{l:{59:{c:[950]}}}}}}},102:{l:{114:{l:{59:{c:[120119]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1078]}}}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8669]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120171]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120015]}}}}}}},119:{l:{106:{l:{59:{c:[8205]}}},110:{l:{106:{l:{59:{c:[8204]}}}}}}}}}};
},{}],272:[function(require,module,exports){
'use strict';
var UNICODE = require('../common/unicode');
//Aliases
var $ = UNICODE.CODE_POINTS;
//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 isReservedCodePoint(cp) {
return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
}
function isSurrogatePair(cp1, cp2) {
return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF;
}
function getSurrogatePairCodePoint(cp1, cp2) {
return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2;
}
//Preprocessor
//NOTE: HTML input preprocessing
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream)
var Preprocessor = module.exports = function (html) {
this.write(html);
//NOTE: one leading U+FEFF BYTE ORDER MARK character must be ignored if any are present in the input stream.
this.pos = this.html.charCodeAt(0) === $.BOM ? 0 : -1;
this.gapStack = [];
this.lastGapPos = -1;
this.skipNextNewLine = false;
};
Preprocessor.prototype.write = function (html) {
if (this.html) {
this.html = this.html.substring(0, this.pos + 1) +
html +
this.html.substring(this.pos + 1, this.html.length);
}
else
this.html = html;
this.lastCharPos = this.html.length - 1;
};
Preprocessor.prototype.advanceAndPeekCodePoint = function () {
this.pos++;
if (this.pos > this.lastCharPos)
return $.EOF;
var 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.advanceAndPeekCodePoint();
}
//NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters
if (cp === $.CARRIAGE_RETURN) {
this.skipNextNewLine = true;
return $.LINE_FEED;
}
this.skipNextNewLine = false;
//OPTIMIZATION: first perform check if the code point in the allowed range that covers most common
//HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points.
return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp;
};
Preprocessor.prototype._processHighRangeCodePoint = function (cp) {
//NOTE: try to peek a surrogate pair
if (this.pos !== this.lastCharPos) {
var nextCp = this.html.charCodeAt(this.pos + 1);
if (isSurrogatePair(cp, nextCp)) {
//NOTE: we have a surrogate pair. Peek pair character and recalculate code point.
this.pos++;
cp = getSurrogatePairCodePoint(cp, nextCp);
//NOTE: add gap that should be avoided during retreat
this._addGap();
}
}
if (isReservedCodePoint(cp))
cp = $.REPLACEMENT_CHARACTER;
return cp;
};
Preprocessor.prototype._addGap = function () {
this.gapStack.push(this.lastGapPos);
this.lastGapPos = this.pos;
};
Preprocessor.prototype.retreat = function () {
if (this.pos === this.lastGapPos) {
this.lastGapPos = this.gapStack.pop();
this.pos--;
}
this.pos--;
};
},{"../common/unicode":263}],273:[function(require,module,exports){
'use strict';
var Preprocessor = require('./preprocessor'),
LocationInfoMixin = require('./location_info_mixin'),
UNICODE = require('../common/unicode'),
NAMED_ENTITY_TRIE = require('./named_entity_trie');
//Aliases
var $ = UNICODE.CODE_POINTS,
$$ = UNICODE.CODE_POINT_SEQUENCES;
//Replacement code points for numeric entities
var NUMERIC_ENTITY_REPLACEMENTS = {
0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E,
0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039,
0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019,
0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122,
0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178
};
//States
var DATA_STATE = 'DATA_STATE',
CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE',
RCDATA_STATE = 'RCDATA_STATE',
CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE',
RAWTEXT_STATE = 'RAWTEXT_STATE',
SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE',
PLAINTEXT_STATE = 'PLAINTEXT_STATE',
TAG_OPEN_STATE = 'TAG_OPEN_STATE',
END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE',
TAG_NAME_STATE = 'TAG_NAME_STATE',
RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE',
RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE',
RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE',
RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE',
RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE',
RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE',
SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE',
SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE',
SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE',
SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE',
SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE',
SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE',
SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE',
SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE',
SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE',
SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE',
BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE',
ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE',
AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE',
BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE',
ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE',
ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE',
ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE',
CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE',
AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE',
SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE',
BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE',
MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE',
COMMENT_START_STATE = 'COMMENT_START_STATE',
COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE',
COMMENT_STATE = 'COMMENT_STATE',
COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE',
COMMENT_END_STATE = 'COMMENT_END_STATE',
COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
DOCTYPE_STATE = 'DOCTYPE_STATE',
BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE',
DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE',
BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE',
BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE',
CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
//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;
}
function isAsciiUpper(cp) {
return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
}
function isAsciiLower(cp) {
return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
}
function isAsciiAlphaNumeric(cp) {
return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp);
}
function isDigit(cp, isHex) {
return isAsciiDigit(cp) || (isHex && ((cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F) ||
(cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F)));
}
function isReservedCodePoint(cp) {
return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
}
function toAsciiLowerCodePoint(cp) {
return cp + 0x0020;
}
//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 toAsciiLowerChar(cp) {
return String.fromCharCode(toAsciiLowerCodePoint(cp));
}
//Tokenizer
var Tokenizer = module.exports = function (html, options) {
this.disableEntitiesDecoding = false;
this.preprocessor = new Preprocessor(html);
this.tokenQueue = [];
this.allowCDATA = false;
this.state = DATA_STATE;
this.returnState = '';
this.consumptionPos = 0;
this.tempBuff = [];
this.additionalAllowedCp = void 0;
this.lastStartTagName = '';
this.currentCharacterToken = null;
this.currentToken = null;
this.currentAttr = null;
if (options) {
this.disableEntitiesDecoding = !options.decodeHtmlEntities;
if (options.locationInfo)
LocationInfoMixin.assign(this);
}
};
//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 initial states for different modes
Tokenizer.MODE = Tokenizer.prototype.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 (var i = token.attrs.length - 1; i >= 0; i--) {
if (token.attrs[i].name === attrName)
return token.attrs[i].value;
}
return null;
};
//Get token
Tokenizer.prototype.getNextToken = function () {
while (!this.tokenQueue.length)
this[this.state](this._consume());
return this.tokenQueue.shift();
};
//Consumption
Tokenizer.prototype._consume = function () {
this.consumptionPos++;
return this.preprocessor.advanceAndPeekCodePoint();
};
Tokenizer.prototype._unconsume = function () {
this.consumptionPos--;
this.preprocessor.retreat();
};
Tokenizer.prototype._unconsumeSeveral = function (count) {
while (count--)
this._unconsume();
};
Tokenizer.prototype._reconsumeInState = function (state) {
this.state = state;
this._unconsume();
};
Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) {
var rollbackPos = this.consumptionPos,
isMatch = true,
patternLength = pattern.length,
patternPos = 0,
cp = startCp,
patternCp = void 0;
for (; patternPos < patternLength; patternPos++) {
if (patternPos > 0)
cp = this._consume();
if (cp === $.EOF) {
isMatch = false;
break;
}
patternCp = pattern[patternPos];
if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
isMatch = false;
break;
}
}
if (!isMatch)
this._unconsumeSeveral(this.consumptionPos - rollbackPos);
return isMatch;
};
//Lookahead
Tokenizer.prototype._lookahead = function () {
var cp = this.preprocessor.advanceAndPeekCodePoint();
this.preprocessor.retreat();
return cp;
};
//Temp buffer
Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
if (this.tempBuff.length !== $$.SCRIPT_STRING.length)
return false;
for (var i = 0; i < this.tempBuff.length; i++) {
if (this.tempBuff[i] !== $$.SCRIPT_STRING[i])
return false;
}
return true;
};
//Token creation
Tokenizer.prototype.buildStartTagToken = function (tagName) {
return {
type: Tokenizer.START_TAG_TOKEN,
tagName: tagName,
selfClosing: false,
attrs: []
};
};
Tokenizer.prototype.buildEndTagToken = function (tagName) {
return {
type: Tokenizer.END_TAG_TOKEN,
tagName: tagName,
ignored: false,
attrs: []
};
};
Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) {
this.currentToken = this.buildStartTagToken(tagNameFirstCh);
};
Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) {
this.currentToken = this.buildEndTagToken(tagNameFirstCh);
};
Tokenizer.prototype._createCommentToken = function () {
this.currentToken = {
type: Tokenizer.COMMENT_TOKEN,
data: ''
};
};
Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) {
this.currentToken = {
type: Tokenizer.DOCTYPE_TOKEN,
name: doctypeNameFirstCh || '',
forceQuirks: false,
publicId: null,
systemId: null
};
};
Tokenizer.prototype._createCharacterToken = function (type, ch) {
this.currentCharacterToken = {
type: type,
chars: ch
};
};
//Tag attributes
Tokenizer.prototype._createAttr = function (attrNameFirstCh) {
this.currentAttr = {
name: attrNameFirstCh,
value: ''
};
};
Tokenizer.prototype._isDuplicateAttr = function () {
return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null;
};
Tokenizer.prototype._leaveAttrName = function (toState) {
this.state = toState;
if (!this._isDuplicateAttr())
this.currentToken.attrs.push(this.currentAttr);
};
//Appropriate end tag token
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token)
Tokenizer.prototype._isAppropriateEndTagToken = function () {
return this.lastStartTagName === this.currentToken.tagName;
};
//Token emission
Tokenizer.prototype._emitCurrentToken = function () {
this._emitCurrentCharacterToken();
//NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
if (this.currentToken.type === Tokenizer.START_TAG_TOKEN)
this.lastStartTagName = this.currentToken.tagName;
this.tokenQueue.push(this.currentToken);
this.currentToken = null;
};
Tokenizer.prototype._emitCurrentCharacterToken = function () {
if (this.currentCharacterToken) {
this.tokenQueue.push(this.currentCharacterToken);
this.currentCharacterToken = null;
}
};
Tokenizer.prototype._emitEOFToken = function () {
this._emitCurrentCharacterToken();
this.tokenQueue.push({type: Tokenizer.EOF_TOKEN});
};
//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
//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@@#$%^')
Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) {
if (this.currentCharacterToken && this.currentCharacterToken.type !== type)
this._emitCurrentCharacterToken();
if (this.currentCharacterToken)
this.currentCharacterToken.chars += ch;
else
this._createCharacterToken(type, ch);
};
Tokenizer.prototype._emitCodePoint = function (cp) {
var type = Tokenizer.CHARACTER_TOKEN;
if (isWhitespace(cp))
type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
else if (cp === $.NULL)
type = Tokenizer.NULL_CHARACTER_TOKEN;
this._appendCharToCurrentCharacterToken(type, toChar(cp));
};
Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) {
for (var i = 0; i < codePoints.length; i++)
this._emitCodePoint(codePoints[i]);
};
//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.
Tokenizer.prototype._emitChar = function (ch) {
this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
};
//Character reference tokenization
Tokenizer.prototype._consumeNumericEntity = function (isHex) {
var digits = '',
nextCp = void 0;
do {
digits += toChar(this._consume());
nextCp = this._lookahead();
} while (nextCp !== $.EOF && isDigit(nextCp, isHex));
if (this._lookahead() === $.SEMICOLON)
this._consume();
var referencedCp = parseInt(digits, isHex ? 16 : 10),
replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp];
if (replacement)
return replacement;
if (isReservedCodePoint(referencedCp))
return $.REPLACEMENT_CHARACTER;
return referencedCp;
};
Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) {
var referencedCodePoints = null,
entityCodePointsCount = 0,
cp = startCp,
leaf = NAMED_ENTITY_TRIE[cp],
consumedCount = 1,
semicolonTerminated = false;
for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) {
if (leaf.c) {
//NOTE: we have at least one named reference match. But we don't stop lookup at this point,
//because longer matches still can be found (e.g. '¬' and '∉') except the case
//then found match is terminated by semicolon.
referencedCodePoints = leaf.c;
entityCodePointsCount = consumedCount;
if (cp === $.SEMICOLON) {
semicolonTerminated = true;
break;
}
}
}
if (referencedCodePoints) {
if (!semicolonTerminated) {
//NOTE: unconsume excess (e.g. 'it' in '¬it')
this._unconsumeSeveral(consumedCount - entityCodePointsCount);
//NOTE: If the character reference is being consumed as part of an attribute and the next character
//is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical
//reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be
//unconsumed, and nothing is returned.
//However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a
//parse error, because some legacy user agents will misinterpret the markup in those cases.
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references)
if (inAttr) {
var nextCp = this._lookahead();
if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) {
this._unconsumeSeveral(entityCodePointsCount);
return null;
}
}
}
return referencedCodePoints;
}
this._unconsumeSeveral(consumedCount);
return null;
};
Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) {
if (this.disableEntitiesDecoding || isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN ||
startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) {
//NOTE: not a character reference. No characters are consumed, and nothing is returned.
this._unconsume();
return null;
}
else if (startCp === $.NUMBER_SIGN) {
//NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal
var isHex = false,
nextCp = this._lookahead();
if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) {
this._consume();
isHex = true;
}
nextCp = this._lookahead();
//NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it
if (nextCp !== $.EOF && isDigit(nextCp, isHex))
return [this._consumeNumericEntity(isHex)];
else {
//NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign
//and the 'x'-character if appropriate.
this._unconsumeSeveral(isHex ? 2 : 1);
return null;
}
}
else
return this._consumeNamedEntity(startCp, inAttr);
};
//State machine
var _ = Tokenizer.prototype;
//12.2.4.1 Data state
//------------------------------------------------------------------
_[DATA_STATE] = function dataState(cp) {
if (cp === $.AMPERSAND)
this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
else if (cp === $.LESS_THAN_SIGN)
this.state = TAG_OPEN_STATE;
else if (cp === $.NULL)
this._emitCodePoint(cp);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.2 Character reference in data state
//------------------------------------------------------------------
_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) {
this.state = DATA_STATE;
this.additionalAllowedCp = void 0;
var referencedCodePoints = this._consumeCharacterReference(cp, false);
if (referencedCodePoints)
this._emitSeveralCodePoints(referencedCodePoints);
else
this._emitChar('&');
};
//12.2.4.3 RCDATA state
//------------------------------------------------------------------
_[RCDATA_STATE] = function rcdataState(cp) {
if (cp === $.AMPERSAND)
this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
else if (cp === $.LESS_THAN_SIGN)
this.state = RCDATA_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.4 Character reference in RCDATA state
//------------------------------------------------------------------
_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) {
this.state = RCDATA_STATE;
this.additionalAllowedCp = void 0;
var referencedCodePoints = this._consumeCharacterReference(cp, false);
if (referencedCodePoints)
this._emitSeveralCodePoints(referencedCodePoints);
else
this._emitChar('&');
};
//12.2.4.5 RAWTEXT state
//------------------------------------------------------------------
_[RAWTEXT_STATE] = function rawtextState(cp) {
if (cp === $.LESS_THAN_SIGN)
this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.6 Script data state
//------------------------------------------------------------------
_[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.7 PLAINTEXT state
//------------------------------------------------------------------
_[PLAINTEXT_STATE] = function plaintextState(cp) {
if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.8 Tag open state
//------------------------------------------------------------------
_[TAG_OPEN_STATE] = function tagOpenState(cp) {
if (cp === $.EXCLAMATION_MARK)
this.state = MARKUP_DECLARATION_OPEN_STATE;
else if (cp === $.SOLIDUS)
this.state = END_TAG_OPEN_STATE;
else if (isAsciiUpper(cp)) {
this._createStartTagToken(toAsciiLowerChar(cp));
this.state = TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createStartTagToken(toChar(cp));
this.state = TAG_NAME_STATE;
}
else if (cp === $.QUESTION_MARK) {
//NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
this[BOGUS_COMMENT_STATE](cp);
}
else {
this._emitChar('<');
this._reconsumeInState(DATA_STATE);
}
};
//12.2.4.9 End tag open state
//------------------------------------------------------------------
_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
if (isAsciiUpper(cp)) {
this._createEndTagToken(toAsciiLowerChar(cp));
this.state = TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createEndTagToken(toChar(cp));
this.state = TAG_NAME_STATE;
}
else if (cp === $.GREATER_THAN_SIGN)
this.state = DATA_STATE;
else if (cp === $.EOF) {
this._reconsumeInState(DATA_STATE);
this._emitChar('<');
this._emitChar('/');
}
else {
//NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
this[BOGUS_COMMENT_STATE](cp);
}
};
//12.2.4.10 Tag name state
//------------------------------------------------------------------
_[TAG_NAME_STATE] = function tagNameState(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.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentToken.tagName += toChar(cp);
};
//12.2.4.11 RCDATA less-than sign state
//------------------------------------------------------------------
_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = RCDATA_END_TAG_OPEN_STATE;
}
else {
this._emitChar('<');
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.12 RCDATA end tag open state
//------------------------------------------------------------------
_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
if (isAsciiUpper(cp)) {
this._createEndTagToken(toAsciiLowerChar(cp));
this.tempBuff.push(cp);
this.state = RCDATA_END_TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createEndTagToken(toChar(cp));
this.tempBuff.push(cp);
this.state = RCDATA_END_TAG_NAME_STATE;
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.13 RCDATA end tag name state
//------------------------------------------------------------------
_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(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._isAppropriateEndTagToken()) {
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;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.14 RAWTEXT less-than sign state
//------------------------------------------------------------------
_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = RAWTEXT_END_TAG_OPEN_STATE;
}
else {
this._emitChar('<');
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.15 RAWTEXT end tag open state
//------------------------------------------------------------------
_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
if (isAsciiUpper(cp)) {
this._createEndTagToken(toAsciiLowerChar(cp));
this.tempBuff.push(cp);
this.state = RAWTEXT_END_TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createEndTagToken(toChar(cp));
this.tempBuff.push(cp);
this.state = RAWTEXT_END_TAG_NAME_STATE;
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.16 RAWTEXT end tag name state
//------------------------------------------------------------------
_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(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._isAppropriateEndTagToken()) {
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;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.17 Script data less-than sign state
//------------------------------------------------------------------
_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(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._emitChar('<');
this._emitChar('!');
}
else {
this._emitChar('<');
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.18 Script data end tag open state
//------------------------------------------------------------------
_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
if (isAsciiUpper(cp)) {
this._createEndTagToken(toAsciiLowerChar(cp));
this.tempBuff.push(cp);
this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createEndTagToken(toChar(cp));
this.tempBuff.push(cp);
this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.19 Script data end tag name state
//------------------------------------------------------------------
_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(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._isAppropriateEndTagToken()) {
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;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.20 Script data escape start state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;
this._emitChar('-');
}
else
this._reconsumeInState(SCRIPT_DATA_STATE);
};
//12.2.4.21 Script data escape start dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
this._emitChar('-');
}
else
this._reconsumeInState(SCRIPT_DATA_STATE);
};
//12.2.4.22 Script data escaped state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this._emitCodePoint(cp);
};
//12.2.4.23 Script data escaped dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.24 Script data escaped dash dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) {
if (cp === $.HYPHEN_MINUS)
this._emitChar('-');
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._emitChar('>');
}
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.25 Script data escaped less-than sign state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
}
else if (isAsciiUpper(cp)) {
this.tempBuff = [];
this.tempBuff.push(toAsciiLowerCodePoint(cp));
this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
this._emitChar('<');
this._emitCodePoint(cp);
}
else if (isAsciiLower(cp)) {
this.tempBuff = [];
this.tempBuff.push(cp);
this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
this._emitChar('<');
this._emitCodePoint(cp);
}
else {
this._emitChar('<');
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
}
};
//12.2.4.26 Script data escaped end tag open state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
if (isAsciiUpper(cp)) {
this._createEndTagToken(toAsciiLowerChar(cp));
this.tempBuff.push(cp);
this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
}
else if (isAsciiLower(cp)) {
this._createEndTagToken(toChar(cp));
this.tempBuff.push(cp);
this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
}
};
//12.2.4.27 Script data escaped end tag name state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(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._isAppropriateEndTagToken()) {
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;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
}
};
//12.2.4.28 Script data double escape start state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(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));
this._emitCodePoint(cp);
}
else if (isAsciiLower(cp)) {
this.tempBuff.push(cp);
this._emitCodePoint(cp);
}
else
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
};
//12.2.4.29 Script data double escaped state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
this._emitChar('<');
}
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this._emitCodePoint(cp);
};
//12.2.4.30 Script data double escaped dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
this._emitChar('<');
}
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.31 Script data double escaped dash dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) {
if (cp === $.HYPHEN_MINUS)
this._emitChar('-');
else if (cp === $.LESS_THAN_SIGN) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
this._emitChar('<');
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = SCRIPT_DATA_STATE;
this._emitChar('>');
}
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.32 Script data double escaped less-than sign state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;
this._emitChar('/');
}
else
this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
};
//12.2.4.33 Script data double escape end state
//------------------------------------------------------------------
_[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(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);
this._emitCodePoint(cp);
}
else
this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
};
//12.2.4.34 Before attribute name state
//------------------------------------------------------------------
_[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
if (isWhitespace(cp))
return;
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._createAttr(toAsciiLowerChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.NULL) {
this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) {
this._createAttr(toChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this._createAttr(toChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
};
//12.2.4.35 Attribute name state
//------------------------------------------------------------------
_[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
if (isWhitespace(cp))
this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
else if (cp === $.SOLIDUS)
this._leaveAttrName(SELF_CLOSING_START_TAG_STATE);
else if (cp === $.EQUALS_SIGN)
this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
else if (cp === $.GREATER_THAN_SIGN) {
this._leaveAttrName(DATA_STATE);
this._emitCurrentToken();
}
else if (isAsciiUpper(cp))
this.currentAttr.name += toAsciiLowerChar(cp);
else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN)
this.currentAttr.name += toChar(cp);
else if (cp === $.NULL)
this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentAttr.name += toChar(cp);
};
//12.2.4.36 After attribute name state
//------------------------------------------------------------------
_[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(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 (isAsciiUpper(cp)) {
this._createAttr(toAsciiLowerChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.NULL) {
this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {
this._createAttr(toChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this._createAttr(toChar(cp));
this.state = ATTRIBUTE_NAME_STATE;
}
};
//12.2.4.37 Before attribute value state
//------------------------------------------------------------------
_[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) {
if (isWhitespace(cp))
return;
if (cp === $.QUOTATION_MARK)
this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
else if (cp === $.AMPERSAND)
this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
else if (cp === $.APOSTROPHE)
this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
else if (cp === $.NULL) {
this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
this.currentAttr.value += toChar(cp);
this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.currentAttr.value += toChar(cp);
this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
}
};
//12.2.4.38 Attribute value (double-quoted) state
//------------------------------------------------------------------
_[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) {
if (cp === $.QUOTATION_MARK)
this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
else if (cp === $.AMPERSAND) {
this.additionalAllowedCp = $.QUOTATION_MARK;
this.returnState = this.state;
this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
}
else if (cp === $.NULL)
this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentAttr.value += toChar(cp);
};
//12.2.4.39 Attribute value (single-quoted) state
//------------------------------------------------------------------
_[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) {
if (cp === $.APOSTROPHE)
this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
else if (cp === $.AMPERSAND) {
this.additionalAllowedCp = $.APOSTROPHE;
this.returnState = this.state;
this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
}
else if (cp === $.NULL)
this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentAttr.value += toChar(cp);
};
//12.2.4.40 Attribute value (unquoted) state
//------------------------------------------------------------------
_[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) {
if (isWhitespace(cp))
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
else if (cp === $.AMPERSAND) {
this.additionalAllowedCp = $.GREATER_THAN_SIGN;
this.returnState = this.state;
this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.NULL)
this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN ||
cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
this.currentAttr.value += toChar(cp);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentAttr.value += toChar(cp);
};
//12.2.4.41 Character reference in attribute value state
//------------------------------------------------------------------
_[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) {
var referencedCodePoints = this._consumeCharacterReference(cp, true);
if (referencedCodePoints) {
for (var i = 0; i < referencedCodePoints.length; i++)
this.currentAttr.value += toChar(referencedCodePoints[i]);
} else
this.currentAttr.value += '&';
this.state = this.returnState;
};
//12.2.4.42 After attribute value (quoted) state
//------------------------------------------------------------------
_[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(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 (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
};
//12.2.4.43 Self-closing start tag state
//------------------------------------------------------------------
_[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) {
if (cp === $.GREATER_THAN_SIGN) {
this.currentToken.selfClosing = true;
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
};
//12.2.4.44 Bogus comment state
//------------------------------------------------------------------
_[BOGUS_COMMENT_STATE] = function bogusCommentState(cp) {
this._createCommentToken();
while (true) {
if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
break;
}
else if (cp === $.EOF) {
this._reconsumeInState(DATA_STATE);
break;
}
else {
this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp);
cp = this._consume();
}
}
this._emitCurrentToken();
};
//12.2.4.45 Markup declaration open state
//------------------------------------------------------------------
_[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) {
if (this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true)) {
this._createCommentToken();
this.state = COMMENT_START_STATE;
}
else if (this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false))
this.state = DOCTYPE_STATE;
else if (this.allowCDATA && this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true))
this.state = CDATA_SECTION_STATE;
else {
//NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
this[BOGUS_COMMENT_STATE](cp);
}
};
//12.2.4.46 Comment start state
//------------------------------------------------------------------
_[COMMENT_START_STATE] = function commentStartState(cp) {
if (cp === $.HYPHEN_MINUS)
this.state = COMMENT_START_DASH_STATE;
else if (cp === $.NULL) {
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
this.state = COMMENT_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.data += toChar(cp);
this.state = COMMENT_STATE;
}
};
//12.2.4.47 Comment start dash state
//------------------------------------------------------------------
_[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) {
if (cp === $.HYPHEN_MINUS)
this.state = COMMENT_END_STATE;
else if (cp === $.NULL) {
this.currentToken.data += '-';
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
this.state = COMMENT_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.data += '-';
this.currentToken.data += toChar(cp);
this.state = COMMENT_STATE;
}
};
//12.2.4.48 Comment state
//------------------------------------------------------------------
_[COMMENT_STATE] = function commentState(cp) {
if (cp === $.HYPHEN_MINUS)
this.state = COMMENT_END_DASH_STATE;
else if (cp === $.NULL)
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.data += toChar(cp);
};
//12.2.4.49 Comment end dash state
//------------------------------------------------------------------
_[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) {
if (cp === $.HYPHEN_MINUS)
this.state = COMMENT_END_STATE;
else if (cp === $.NULL) {
this.currentToken.data += '-';
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
this.state = COMMENT_STATE;
}
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.data += '-';
this.currentToken.data += toChar(cp);
this.state = COMMENT_STATE;
}
};
//12.2.4.50 Comment end state
//------------------------------------------------------------------
_[COMMENT_END_STATE] = function commentEndState(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 === $.NULL) {
this.currentToken.data += '--';
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
this.state = COMMENT_STATE;
}
else if (cp === $.EOF) {
this._reconsumeInState(DATA_STATE);
this._emitCurrentToken();
}
else {
this.currentToken.data += '--';
this.currentToken.data += toChar(cp);
this.state = COMMENT_STATE;
}
};
//12.2.4.51 Comment end bang state
//------------------------------------------------------------------
_[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.currentToken.data += '--!';
this.state = COMMENT_END_DASH_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.NULL) {
this.currentToken.data += '--!';
this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
this.state = COMMENT_STATE;
}
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.data += '--!';
this.currentToken.data += toChar(cp);
this.state = COMMENT_STATE;
}
};
//12.2.4.52 DOCTYPE state
//------------------------------------------------------------------
_[DOCTYPE_STATE] = function doctypeState(cp) {
if (isWhitespace(cp))
this.state = BEFORE_DOCTYPE_NAME_STATE;
else if (cp === $.EOF) {
this._createDoctypeToken();
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
};
//12.2.4.53 Before DOCTYPE name state
//------------------------------------------------------------------
_[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) {
if (isWhitespace(cp))
return;
if (isAsciiUpper(cp)) {
this._createDoctypeToken(toAsciiLowerChar(cp));
this.state = DOCTYPE_NAME_STATE;
}
else if (cp === $.GREATER_THAN_SIGN) {
this._createDoctypeToken();
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this._createDoctypeToken();
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else if (cp === $.NULL) {
this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER);
this.state = DOCTYPE_NAME_STATE;
}
else {
this._createDoctypeToken(toChar(cp));
this.state = DOCTYPE_NAME_STATE;
}
};
//12.2.4.54 DOCTYPE name state
//------------------------------------------------------------------
_[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
if (isWhitespace(cp))
this.state = AFTER_DOCTYPE_NAME_STATE;
else if (cp === $.GREATER_THAN_SIGN) {
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (isAsciiUpper(cp))
this.currentToken.name += toAsciiLowerChar(cp);
else if (cp === $.NULL)
this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.name += toChar(cp);
};
//12.2.4.55 After DOCTYPE name state
//------------------------------------------------------------------
_[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
if (isWhitespace(cp))
return;
if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else if (this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false))
this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;
else if (this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false))
this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.56 After DOCTYPE public keyword state
//------------------------------------------------------------------
_[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) {
if (isWhitespace(cp))
this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
else 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.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.57 Before DOCTYPE public identifier state
//------------------------------------------------------------------
_[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(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.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.58 DOCTYPE public identifier (double-quoted) state
//------------------------------------------------------------------
_[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) {
if (cp === $.QUOTATION_MARK)
this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
else if (cp === $.NULL)
this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.GREATER_THAN_SIGN) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.publicId += toChar(cp);
};
//12.2.4.59 DOCTYPE public identifier (single-quoted) state
//------------------------------------------------------------------
_[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) {
if (cp === $.APOSTROPHE)
this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
else if (cp === $.NULL)
this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.GREATER_THAN_SIGN) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.publicId += toChar(cp);
};
//12.2.4.60 After DOCTYPE public identifier state
//------------------------------------------------------------------
_[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) {
if (isWhitespace(cp))
this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
else 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.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.61 Between DOCTYPE public and system identifiers state
//------------------------------------------------------------------
_[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(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.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.62 After DOCTYPE system keyword state
//------------------------------------------------------------------
_[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) {
if (isWhitespace(cp))
this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_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 === $.GREATER_THAN_SIGN) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.63 Before DOCTYPE system identifier state
//------------------------------------------------------------------
_[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(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.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else {
this.currentToken.forceQuirks = true;
this.state = BOGUS_DOCTYPE_STATE;
}
};
//12.2.4.64 DOCTYPE system identifier (double-quoted) state
//------------------------------------------------------------------
_[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) {
if (cp === $.QUOTATION_MARK)
this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
else if (cp === $.GREATER_THAN_SIGN) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.NULL)
this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.systemId += toChar(cp);
};
//12.2.4.65 DOCTYPE system identifier (single-quoted) state
//------------------------------------------------------------------
_[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) {
if (cp === $.APOSTROPHE)
this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
else if (cp === $.GREATER_THAN_SIGN) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.NULL)
this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.currentToken.systemId += toChar(cp);
};
//12.2.4.66 After DOCTYPE system identifier state
//------------------------------------------------------------------
_[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) {
if (isWhitespace(cp))
return;
if (cp === $.GREATER_THAN_SIGN) {
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this.currentToken.forceQuirks = true;
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
else
this.state = BOGUS_DOCTYPE_STATE;
};
//12.2.4.67 Bogus DOCTYPE state
//------------------------------------------------------------------
_[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) {
if (cp === $.GREATER_THAN_SIGN) {
this._emitCurrentToken();
this.state = DATA_STATE;
}
else if (cp === $.EOF) {
this._emitCurrentToken();
this._reconsumeInState(DATA_STATE);
}
};
//12.2.4.68 CDATA section state
//------------------------------------------------------------------
_[CDATA_SECTION_STATE] = function cdataSectionState(cp) {
while (true) {
if (cp === $.EOF) {
this._reconsumeInState(DATA_STATE);
break;
}
else if (this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true)) {
this.state = DATA_STATE;
break;
}
else {
this._emitCodePoint(cp);
cp = this._consume();
}
}
};
},{"../common/unicode":263,"./location_info_mixin":270,"./named_entity_trie":271,"./preprocessor":272}],274:[function(require,module,exports){
'use strict';
//Node construction
exports.createDocument = function () {
return {
nodeName: '#document',
quirksMode: false,
childNodes: []
};
};
exports.createDocumentFragment = function () {
return {
nodeName: '#document-fragment',
quirksMode: false,
childNodes: []
};
};
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
};
};
var createTextNode = function (value) {
return {
nodeName: '#text',
value: value,
parentNode: null
}
};
//Tree mutation
exports.setDocumentType = function (document, name, publicId, systemId) {
var doctypeNode = null;
for (var i = 0; i < document.childNodes.length; i++) {
if (document.childNodes[i].nodeName === '#documentType') {
doctypeNode = document.childNodes[i];
break;
}
}
if (doctypeNode) {
doctypeNode.name = name;
doctypeNode.publicId = publicId;
doctypeNode.systemId = systemId;
}
else {
appendChild(document, {
nodeName: '#documentType',
name: name,
publicId: publicId,
systemId: systemId
});
}
};
exports.setQuirksMode = function (document) {
document.quirksMode = true;
};
exports.isQuirksMode = function (document) {
return document.quirksMode;
};
var appendChild = exports.appendChild = function (parentNode, newNode) {
parentNode.childNodes.push(newNode);
newNode.parentNode = parentNode;
};
var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
parentNode.childNodes.splice(insertionIdx, 0, newNode);
newNode.parentNode = parentNode;
};
exports.detachNode = function (node) {
if (node.parentNode) {
var idx = node.parentNode.childNodes.indexOf(node);
node.parentNode.childNodes.splice(idx, 1);
node.parentNode = null;
}
};
exports.insertText = function (parentNode, text) {
if (parentNode.childNodes.length) {
var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
if (prevNode.nodeName === '#text') {
prevNode.value += text;
return;
}
}
appendChild(parentNode, createTextNode(text));
};
exports.insertTextBefore = function (parentNode, text, referenceNode) {
var 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 (recipientNode, attrs) {
var recipientAttrsMap = [];
for (var i = 0; i < recipientNode.attrs.length; i++)
recipientAttrsMap.push(recipientNode.attrs[i].name);
for (var j = 0; j < attrs.length; j++) {
if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
recipientNode.attrs.push(attrs[j]);
}
};
//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 (node) {
return node.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;
};
},{}],275:[function(require,module,exports){
'use strict';
var Doctype = require('../common/doctype');
//Conversion tables for DOM Level1 structure emulation
var nodeTypes = {
element: 1,
text: 3,
cdata: 4,
comment: 8
};
var nodePropertyShorthands = {
tagName: 'name',
childNodes: 'children',
parentNode: 'parent',
previousSibling: 'prev',
nextSibling: 'next',
nodeValue: 'data'
};
//Node
var Node = function (props) {
for (var key in props) {
if (props.hasOwnProperty(key))
this[key] = props[key];
}
};
Node.prototype = {
get firstChild() {
var children = this.children;
return children && children[0] || null;
},
get lastChild() {
var children = this.children;
return children && children[children.length - 1] || null;
},
get nodeType() {
return nodeTypes[this.type] || nodeTypes.element;
}
};
Object.keys(nodePropertyShorthands).forEach(function (key) {
var shorthand = nodePropertyShorthands[key];
Object.defineProperty(Node.prototype, key, {
get: function () {
return this[shorthand] || null;
},
set: function (val) {
this[shorthand] = val;
return val;
}
});
});
//Node construction
exports.createDocument =
exports.createDocumentFragment = function () {
return new Node({
type: 'root',
name: 'root',
parent: null,
prev: null,
next: null,
children: []
});
};
exports.createElement = function (tagName, namespaceURI, attrs) {
var attribs = {},
attribsNamespace = {},
attribsPrefix = {};
for (var i = 0; i < attrs.length; i++) {
var attrName = attrs[i].name;
attribs[attrName] = attrs[i].value;
attribsNamespace[attrName] = attrs[i].namespace;
attribsPrefix[attrName] = attrs[i].prefix;
}
return new Node({
type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
name: tagName,
namespace: namespaceURI,
attribs: attribs,
'x-attribsNamespace': attribsNamespace,
'x-attribsPrefix': attribsPrefix,
children: [],
parent: null,
prev: null,
next: null
});
};
exports.createCommentNode = function (data) {
return new Node({
type: 'comment',
data: data,
parent: null,
prev: null,
next: null
});
};
var createTextNode = function (value) {
return new Node({
type: 'text',
data: value,
parent: null,
prev: null,
next: null
});
};
//Tree mutation
exports.setDocumentType = function (document, name, publicId, systemId) {
var data = Doctype.serializeContent(name, publicId, systemId),
doctypeNode = null;
for (var i = 0; i < document.children.length; i++) {
if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') {
doctypeNode = document.children[i];
break;
}
}
if (doctypeNode) {
doctypeNode.data = data;
doctypeNode['x-name'] = name;
doctypeNode['x-publicId'] = publicId;
doctypeNode['x-systemId'] = systemId;
}
else {
appendChild(document, new Node({
type: 'directive',
name: '!doctype',
data: data,
'x-name': name,
'x-publicId': publicId,
'x-systemId': systemId
}));
}
};
exports.setQuirksMode = function (document) {
document.quirksMode = true;
};
exports.isQuirksMode = function (document) {
return document.quirksMode;
};
var appendChild = exports.appendChild = function (parentNode, newNode) {
var prev = parentNode.children[parentNode.children.length - 1];
if (prev) {
prev.next = newNode;
newNode.prev = prev;
}
parentNode.children.push(newNode);
newNode.parent = parentNode;
};
var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
var insertionIdx = parentNode.children.indexOf(referenceNode),
prev = referenceNode.prev;
if (prev) {
prev.next = newNode;
newNode.prev = prev;
}
referenceNode.prev = newNode;
newNode.next = referenceNode;
parentNode.children.splice(insertionIdx, 0, newNode);
newNode.parent = parentNode;
};
exports.detachNode = function (node) {
if (node.parent) {
var idx = node.parent.children.indexOf(node),
prev = node.prev,
next = node.next;
node.prev = null;
node.next = null;
if (prev)
prev.next = next;
if (next)
next.prev = prev;
node.parent.children.splice(idx, 1);
node.parent = null;
}
};
exports.insertText = function (parentNode, text) {
var lastChild = parentNode.children[parentNode.children.length - 1];
if (lastChild && lastChild.type === 'text')
lastChild.data += text;
else
appendChild(parentNode, createTextNode(text));
};
exports.insertTextBefore = function (parentNode, text, referenceNode) {
var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
if (prevNode && prevNode.type === 'text')
prevNode.data += text;
else
insertBefore(parentNode, createTextNode(text), referenceNode);
};
exports.adoptAttributes = function (recipientNode, attrs) {
for (var i = 0; i < attrs.length; i++) {
var attrName = attrs[i].name;
if (typeof recipientNode.attribs[attrName] === 'undefined') {
recipientNode.attribs[attrName] = attrs[i].value;
recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace;
recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix;
}
}
};
//Tree traversing
exports.getFirstChild = function (node) {
return node.children[0];
};
exports.getChildNodes = function (node) {
return node.children;
};
exports.getParentNode = function (node) {
return node.parent;
};
exports.getAttrList = function (node) {
var attrList = [];
for (var name in node.attribs) {
if (node.attribs.hasOwnProperty(name)) {
attrList.push({
name: name,
value: node.attribs[name],
namespace: node['x-attribsNamespace'][name],
prefix: node['x-attribsPrefix'][name]
});
}
}
return attrList;
};
//Node data
exports.getTagName = function (element) {
return element.name;
};
exports.getNamespaceURI = function (element) {
return element.namespace;
};
exports.getTextNodeContent = function (textNode) {
return textNode.data;
};
exports.getCommentNodeContent = function (commentNode) {
return commentNode.data;
};
exports.getDocumentTypeNodeName = function (doctypeNode) {
return doctypeNode['x-name'];
};
exports.getDocumentTypeNodePublicId = function (doctypeNode) {
return doctypeNode['x-publicId'];
};
exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
return doctypeNode['x-systemId'];
};
//Node types
exports.isTextNode = function (node) {
return node.type === 'text';
};
exports.isCommentNode = function (node) {
return node.type === 'comment';
};
exports.isDocumentTypeNode = function (node) {
return node.type === 'directive' && node.name === '!doctype';
};
exports.isElementNode = function (node) {
return !!node.attribs;
};
},{"../common/doctype":260}],276:[function(require,module,exports){
'use strict';
//Const
var NOAH_ARK_CAPACITY = 3;
//List of formatting elements
var FormattingElementList = module.exports = function (treeAdapter) {
this.length = 0;
this.entries = [];
this.treeAdapter = treeAdapter;
this.bookmark = null;
};
//Entry types
FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
//Noah Ark's condition
//OPTIMIZATION: at first we try to find possible candidates for exclusion using
//lightweight heuristics without thorough attributes check.
FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) {
var candidates = [];
if (this.length >= NOAH_ARK_CAPACITY) {
var neAttrsLength = this.treeAdapter.getAttrList(newElement).length,
neTagName = this.treeAdapter.getTagName(newElement),
neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.MARKER_ENTRY)
break;
var element = entry.element,
elementAttrs = this.treeAdapter.getAttrList(element);
if (this.treeAdapter.getTagName(element) === neTagName &&
this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
elementAttrs.length === neAttrsLength) {
candidates.push({idx: i, attrs: elementAttrs});
}
}
}
return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
};
FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) {
var candidates = this._getNoahArkConditionCandidates(newElement),
cLength = candidates.length;
if (cLength) {
var neAttrs = this.treeAdapter.getAttrList(newElement),
neAttrsLength = neAttrs.length,
neAttrsMap = {};
//NOTE: build attrs map for the new element so we can perform fast lookups
for (var i = 0; i < neAttrsLength; i++) {
var neAttr = neAttrs[i];
neAttrsMap[neAttr.name] = neAttr.value;
}
for (var i = 0; i < neAttrsLength; i++) {
for (var j = 0; j < cLength; j++) {
var cAttr = candidates[j].attrs[i];
if (neAttrsMap[cAttr.name] !== cAttr.value) {
candidates.splice(j, 1);
cLength--;
}
if (candidates.length < NOAH_ARK_CAPACITY)
return;
}
}
//NOTE: remove bottommost candidates until Noah's Ark condition will not be met
for (var i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
this.entries.splice(candidates[i].idx, 1);
this.length--;
}
}
};
//Mutations
FormattingElementList.prototype.insertMarker = function () {
this.entries.push({type: FormattingElementList.MARKER_ENTRY});
this.length++;
};
FormattingElementList.prototype.pushElement = function (element, token) {
this._ensureNoahArkCondition(element);
this.entries.push({
type: FormattingElementList.ELEMENT_ENTRY,
element: element,
token: token
});
this.length++;
};
FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) {
var 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
});
this.length++;
};
FormattingElementList.prototype.removeEntry = function (entry) {
for (var i = this.length - 1; i >= 0; i--) {
if (this.entries[i] === entry) {
this.entries.splice(i, 1);
this.length--;
break;
}
}
};
FormattingElementList.prototype.clearToLastMarker = function () {
while (this.length) {
var entry = this.entries.pop();
this.length--;
if (entry.type === FormattingElementList.MARKER_ENTRY)
break;
}
};
//Search
FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) {
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.MARKER_ENTRY)
return null;
if (this.treeAdapter.getTagName(entry.element) === tagName)
return entry;
}
return null;
};
FormattingElementList.prototype.getElementEntry = function (element) {
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element == element)
return entry;
}
return null;
};
},{}],277:[function(require,module,exports){
'use strict';
var OpenElementStack = require('./open_element_stack'),
Tokenizer = require('../tokenization/tokenizer'),
HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES;
function setEndLocation(element, closingToken, treeAdapter) {
var loc = element.__location;
if (!loc)
return;
if (!loc.startTag) {
loc.startTag = {
start: loc.start,
end: loc.end
};
}
if (closingToken.location) {
var tn = treeAdapter.getTagName(element),
// NOTE: For cases like
- First 'p' closes without a closing tag and
// for cases like
- 'p' closes without a closing tag
isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN &&
tn === closingToken.tagName;
if (isClosingEndTag) {
loc.endTag = {
start: closingToken.location.start,
end: closingToken.location.end
};
}
loc.end = closingToken.location.end;
}
}
//NOTE: patch open elements stack, so we can assign end location for the elements
function patchOpenElementsStack(stack, parser) {
var treeAdapter = parser.treeAdapter;
stack.pop = function () {
setEndLocation(this.current, parser.currentToken, treeAdapter);
OpenElementStack.prototype.pop.call(this);
};
stack.popAllUpToHtmlElement = function () {
for (var i = this.stackTop; i > 0; i--)
setEndLocation(this.items[i], parser.currentToken, treeAdapter);
OpenElementStack.prototype.popAllUpToHtmlElement.call(this);
};
stack.remove = function (element) {
setEndLocation(element, parser.currentToken, treeAdapter);
OpenElementStack.prototype.remove.call(this, element);
};
}
exports.assign = function (parser) {
//NOTE: obtain Parser proto this way to avoid module circular references
var parserProto = Object.getPrototypeOf(parser),
treeAdapter = parser.treeAdapter;
//NOTE: patch _reset method
parser._reset = function (html, document, fragmentContext) {
parserProto._reset.call(this, html, document, fragmentContext);
this.attachableElementLocation = null;
this.lastFosterParentingLocation = null;
this.currentToken = null;
patchOpenElementsStack(this.openElements, parser);
};
parser._processTokenInForeignContent = function (token) {
this.currentToken = token;
parserProto._processTokenInForeignContent.call(this, token);
};
parser._processToken = function (token) {
this.currentToken = token;
parserProto._processToken.call(this, token);
//NOTE: and are never popped from the stack, so we need to updated
//their end location explicitly.
if (token.type === Tokenizer.END_TAG_TOKEN &&
(token.tagName === $.HTML ||
(token.tagName === $.BODY && this.openElements.hasInScope($.BODY)))) {
for (var i = this.openElements.stackTop; i >= 0; i--) {
var element = this.openElements.items[i];
if (this.treeAdapter.getTagName(element) === token.tagName) {
setEndLocation(element, token, treeAdapter);
break;
}
}
}
};
//Doctype
parser._setDocumentType = function (token) {
parserProto._setDocumentType.call(this, token);
var documentChildren = this.treeAdapter.getChildNodes(this.document),
cnLength = documentChildren.length;
for (var i = 0; i < cnLength; i++) {
var node = documentChildren[i];
if (this.treeAdapter.isDocumentTypeNode(node)) {
node.__location = token.location;
break;
}
}
};
//Elements
parser._attachElementToTree = function (element) {
//NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
//So we will use token location stored in this methods for the element.
element.__location = this.attachableElementLocation || null;
this.attachableElementLocation = null;
parserProto._attachElementToTree.call(this, element);
};
parser._appendElement = function (token, namespaceURI) {
this.attachableElementLocation = token.location;
parserProto._appendElement.call(this, token, namespaceURI);
};
parser._insertElement = function (token, namespaceURI) {
this.attachableElementLocation = token.location;
parserProto._insertElement.call(this, token, namespaceURI);
};
parser._insertTemplate = function (token) {
this.attachableElementLocation = token.location;
parserProto._insertTemplate.call(this, token);
var tmplContent = this.treeAdapter.getChildNodes(this.openElements.current)[0];
tmplContent.__location = null;
};
parser._insertFakeRootElement = function () {
parserProto._insertFakeRootElement.call(this);
this.openElements.current.__location = null;
};
//Comments
parser._appendCommentNode = function (token, parent) {
parserProto._appendCommentNode.call(this, token, parent);
var children = this.treeAdapter.getChildNodes(parent),
commentNode = children[children.length - 1];
commentNode.__location = token.location;
};
//Text
parser._findFosterParentingLocation = function () {
//NOTE: store last foster parenting location, so we will be able to find inserted text
//in case of foster parenting
this.lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this);
return this.lastFosterParentingLocation;
};
parser._insertCharacters = function (token) {
parserProto._insertCharacters.call(this, token);
var hasFosterParent = this._shouldFosterParentOnInsertion(),
parentingLocation = this.lastFosterParentingLocation,
parent = (hasFosterParent && parentingLocation.parent) ||
this.openElements.currentTmplContent ||
this.openElements.current,
siblings = this.treeAdapter.getChildNodes(parent),
textNodeIdx = hasFosterParent && parentingLocation.beforeElement ?
siblings.indexOf(parentingLocation.beforeElement) - 1 :
siblings.length - 1,
textNode = siblings[textNodeIdx];
//NOTE: if we have location assigned by another token, then just update end position
if (textNode.__location)
textNode.__location.end = token.location.end;
else
textNode.__location = token.location;
};
};
},{"../common/html":262,"../tokenization/tokenizer":273,"./open_element_stack":278}],278:[function(require,module,exports){
'use strict';
var HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES;
//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 === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
case 6:
return tn === $.OPTION;
case 8:
return tn === $.OPTGROUP;
}
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;
}
//Stack of open elements
var OpenElementStack = module.exports = function (document, treeAdapter) {
this.stackTop = -1;
this.items = [];
this.current = document;
this.currentTagName = null;
this.currentTmplContent = null;
this.tmplCount = 0;
this.treeAdapter = treeAdapter;
};
//Index of element
OpenElementStack.prototype._indexOf = function (element) {
var idx = -1;
for (var i = this.stackTop; i >= 0; i--) {
if (this.items[i] === element) {
idx = i;
break;
}
}
return idx;
};
//Update current element
OpenElementStack.prototype._isInTemplate = function () {
if (this.currentTagName !== $.TEMPLATE)
return false;
return this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
};
OpenElementStack.prototype._updateCurrentElement = function () {
this.current = this.items[this.stackTop];
this.currentTagName = this.current && this.treeAdapter.getTagName(this.current);
this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getChildNodes(this.current)[0] : null;
};
//Mutations
OpenElementStack.prototype.push = function (element) {
this.items[++this.stackTop] = element;
this._updateCurrentElement();
if (this._isInTemplate())
this.tmplCount++;
};
OpenElementStack.prototype.pop = function () {
this.stackTop--;
if (this.tmplCount > 0 && this._isInTemplate())
this.tmplCount--;
this._updateCurrentElement();
};
OpenElementStack.prototype.replace = function (oldElement, newElement) {
var idx = this._indexOf(oldElement);
this.items[idx] = newElement;
if (idx === this.stackTop)
this._updateCurrentElement();
};
OpenElementStack.prototype.insertAfter = function (referenceElement, newElement) {
var insertionIdx = this._indexOf(referenceElement) + 1;
this.items.splice(insertionIdx, 0, newElement);
if (insertionIdx == ++this.stackTop)
this._updateCurrentElement();
};
OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) {
while (this.stackTop > -1) {
var tn = this.currentTagName;
this.pop();
if (tn === tagName)
break;
}
};
OpenElementStack.prototype.popUntilTemplatePopped = function () {
while (this.stackTop > -1) {
var tn = this.currentTagName,
ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
if (tn === $.TEMPLATE && ns === NS.HTML)
break;
}
};
OpenElementStack.prototype.popUntilElementPopped = function (element) {
while (this.stackTop > -1) {
var poppedElement = this.current;
this.pop();
if (poppedElement === element)
break;
}
};
OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () {
while (this.stackTop > -1) {
var tn = this.currentTagName;
this.pop();
if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
break;
}
};
OpenElementStack.prototype.popAllUpToHtmlElement = function () {
//NOTE: here we assume that root element is always first in the open element stack, so
//we perform this fast stack clean up.
this.stackTop = 0;
this._updateCurrentElement();
};
OpenElementStack.prototype.clearBackToTableContext = function () {
while (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
this.pop();
};
OpenElementStack.prototype.clearBackToTableBodyContext = function () {
while (this.currentTagName !== $.TBODY && this.currentTagName !== $.TFOOT &&
this.currentTagName !== $.THEAD && this.currentTagName !== $.TEMPLATE &&
this.currentTagName !== $.HTML) {
this.pop();
}
};
OpenElementStack.prototype.clearBackToTableRowContext = function () {
while (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
this.pop();
};
OpenElementStack.prototype.remove = function (element) {
for (var i = this.stackTop; i >= 0; i--) {
if (this.items[i] === element) {
this.items.splice(i, 1);
this.stackTop--;
this._updateCurrentElement();
break;
}
}
};
//Search
OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () {
//Properly nested element (should be second element in stack).
var element = this.items[1];
return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null;
};
OpenElementStack.prototype.contains = function (element) {
return this._indexOf(element) > -1;
};
OpenElementStack.prototype.getCommonAncestor = function (element) {
var elementIdx = this._indexOf(element);
return --elementIdx >= 0 ? this.items[elementIdx] : null;
};
OpenElementStack.prototype.isRootHtmlElementCurrent = function () {
return this.stackTop === 0 && this.currentTagName === $.HTML;
};
//Element in scope
OpenElementStack.prototype.hasInScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === tagName)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasNumberedHeaderInScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
return true;
if (isScopingElement(tn, this.treeAdapter.getNamespaceURI(this.items[i])))
return false;
}
return true;
};
OpenElementStack.prototype.hasInListItemScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === tagName)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasInButtonScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === tagName)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasInTableScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === tagName)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if ((tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) && ns === NS.HTML)
return false;
}
return true;
};
OpenElementStack.prototype.hasTableBodyContextInTableScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if ((tn === $.TABLE || tn === $.HTML) && ns === NS.HTML)
return false;
}
return true;
};
OpenElementStack.prototype.hasInSelectScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]);
if (tn === tagName)
return true;
var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (tn !== $.OPTION && tn !== $.OPTGROUP && ns === NS.HTML)
return false;
}
return true;
};
//Implied end tags
OpenElementStack.prototype.generateImpliedEndTags = function () {
while (isImpliedEndTagRequired(this.currentTagName))
this.pop();
};
OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclusionTagName) {
while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName)
this.pop();
};
},{"../common/html":262}],279:[function(require,module,exports){
'use strict';
var Tokenizer = require('../tokenization/tokenizer'),
OpenElementStack = require('./open_element_stack'),
FormattingElementList = require('./formatting_element_list'),
LocationInfoMixin = require('./location_info_mixin'),
DefaultTreeAdapter = require('../tree_adapters/default'),
Doctype = require('../common/doctype'),
ForeignContent = require('../common/foreign_content'),
Utils = require('../common/utils'),
UNICODE = require('../common/unicode'),
HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES,
ATTRS = HTML.ATTRS;
//Default options
var DEFAULT_OPTIONS = {
decodeHtmlEntities: true,
locationInfo: false
};
//Misc constants
var SEARCHABLE_INDEX_DEFAULT_PROMPT = 'This is a searchable index. Enter search keywords: ',
SEARCHABLE_INDEX_INPUT_NAME = 'isindex',
HIDDEN_INPUT_TYPE = 'hidden';
//Adoption agency loops iteration count
var AA_OUTER_LOOP_ITER = 8,
AA_INNER_LOOP_ITER = 3;
//Insertion modes
var INITIAL_MODE = 'INITIAL_MODE',
BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',
BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',
IN_HEAD_MODE = 'IN_HEAD_MODE',
AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',
IN_BODY_MODE = 'IN_BODY_MODE',
TEXT_MODE = 'TEXT_MODE',
IN_TABLE_MODE = 'IN_TABLE_MODE',
IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',
IN_CAPTION_MODE = 'IN_CAPTION_MODE',
IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',
IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',
IN_ROW_MODE = 'IN_ROW_MODE',
IN_CELL_MODE = 'IN_CELL_MODE',
IN_SELECT_MODE = 'IN_SELECT_MODE',
IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',
IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',
AFTER_BODY_MODE = 'AFTER_BODY_MODE',
IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',
AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',
AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',
AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
//Insertion mode reset map
var INSERTION_MODE_RESET_MAP = {};
INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;
INSERTION_MODE_RESET_MAP[$.TBODY] =
INSERTION_MODE_RESET_MAP[$.THEAD] =
INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;
INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;
INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;
INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;
INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;
INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE;
//Template insertion mode switch map
var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {};
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE;
//Token handlers map for insertion modes
var _ = {};
_[INITIAL_MODE] = {};
_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] =
_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;
_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;
_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] =
_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] =
_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;
_[BEFORE_HTML_MODE] = {};
_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] =
_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;
_[BEFORE_HEAD_MODE] = {};
_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;
_[IN_HEAD_MODE] = {};
_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;
_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;
_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;
_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;
_[AFTER_HEAD_MODE] = {};
_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;
_[IN_BODY_MODE] = {};
_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;
_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;
_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[TEXT_MODE] = {};
_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] =
_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;
_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;
_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;
_[IN_TABLE_MODE] = {};
_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;
_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;
_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TABLE_TEXT_MODE] = {};
_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;
_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;
_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;
_[IN_CAPTION_MODE] = {};
_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;
_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;
_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_COLUMN_GROUP_MODE] = {};
_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TABLE_BODY_MODE] = {};
_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;
_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;
_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_ROW_MODE] = {};
_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;
_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;
_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_CELL_MODE] = {};
_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;
_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;
_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_SELECT_MODE] = {};
_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;
_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;
_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_SELECT_IN_TABLE_MODE] = {};
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TEMPLATE_MODE] = {};
_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;
_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;
_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;
_[AFTER_BODY_MODE] = {};
_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;
_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;
_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;
_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;
_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[IN_FRAMESET_MODE] = {};
_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;
_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;
_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_FRAMESET_MODE] = {};
_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;
_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;
_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_AFTER_BODY_MODE] = {};
_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_AFTER_FRAMESET_MODE] = {};
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
//Searchable index building utils ( tag)
function getSearchableIndexFormAttrs(isindexStartTagToken) {
var indexAction = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.ACTION),
attrs = [];
if (indexAction !== null) {
attrs.push({
name: ATTRS.ACTION,
value: indexAction
});
}
return attrs;
}
function getSearchableIndexLabelText(isindexStartTagToken) {
var indexPrompt = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.PROMPT);
return indexPrompt === null ? SEARCHABLE_INDEX_DEFAULT_PROMPT : indexPrompt;
}
function getSearchableIndexInputAttrs(isindexStartTagToken) {
var isindexAttrs = isindexStartTagToken.attrs,
inputAttrs = [];
for (var i = 0; i < isindexAttrs.length; i++) {
var name = isindexAttrs[i].name;
if (name !== ATTRS.NAME && name !== ATTRS.ACTION && name !== ATTRS.PROMPT)
inputAttrs.push(isindexAttrs[i]);
}
inputAttrs.push({
name: ATTRS.NAME,
value: SEARCHABLE_INDEX_INPUT_NAME
});
return inputAttrs;
}
//Parser
var Parser = module.exports = function (treeAdapter, options) {
this.treeAdapter = treeAdapter || DefaultTreeAdapter;
this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
this.scriptHandler = null;
if (this.options.locationInfo)
LocationInfoMixin.assign(this);
};
//API
Parser.prototype.parse = function (html) {
var document = this.treeAdapter.createDocument();
this._reset(html, document, null);
this._runParsingLoop();
return document;
};
Parser.prototype.parseFragment = function (html, fragmentContext) {
//NOTE: use 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`.
var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
this._reset(html, documentMock, fragmentContext);
if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE)
this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
this._initTokenizerForFragmentParsing();
this._insertFakeRootElement();
this._resetInsertionMode();
this._findFormInFragmentContext();
this._runParsingLoop();
var rootElement = this.treeAdapter.getFirstChild(documentMock),
fragment = this.treeAdapter.createDocumentFragment();
this._adoptNodes(rootElement, fragment);
return fragment;
};
//Reset state
Parser.prototype._reset = function (html, document, fragmentContext) {
this.tokenizer = new Tokenizer(html, this.options);
this.stopped = false;
this.insertionMode = INITIAL_MODE;
this.originalInsertionMode = '';
this.document = document;
this.fragmentContext = fragmentContext;
this.headElement = null;
this.formElement = null;
this.openElements = new OpenElementStack(this.document, this.treeAdapter);
this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
this.tmplInsertionModeStack = [];
this.tmplInsertionModeStackTop = -1;
this.currentTmplInsertionMode = null;
this.pendingCharacterTokens = [];
this.hasNonWhitespacePendingCharacterToken = false;
this.framesetOk = true;
this.skipNextNewLine = false;
this.fosterParentingEnabled = false;
};
//Parsing loop
Parser.prototype._iterateParsingLoop = function () {
this._setupTokenizerCDATAMode();
var token = this.tokenizer.getNextToken();
if (this.skipNextNewLine) {
this.skipNextNewLine = false;
if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
if (token.chars.length === 1)
return;
token.chars = token.chars.substr(1);
}
}
if (this._shouldProcessTokenInForeignContent(token))
this._processTokenInForeignContent(token);
else
this._processToken(token);
};
Parser.prototype._runParsingLoop = function () {
while (!this.stopped)
this._iterateParsingLoop();
};
//Text parsing
Parser.prototype._setupTokenizerCDATAMode = function () {
var current = this._getAdjustedCurrentElement();
this.tokenizer.allowCDATA = current && current !== this.document &&
this.treeAdapter.getNamespaceURI(current) !== NS.HTML &&
(!this._isHtmlIntegrationPoint(current)) &&
(!this._isMathMLTextIntegrationPoint(current));
};
Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {
this._insertElement(currentToken, NS.HTML);
this.tokenizer.state = nextTokenizerState;
this.originalInsertionMode = this.insertionMode;
this.insertionMode = TEXT_MODE;
};
//Fragment parsing
Parser.prototype._getAdjustedCurrentElement = function () {
return this.openElements.stackTop === 0 && this.fragmentContext ?
this.fragmentContext :
this.openElements.current;
};
Parser.prototype._findFormInFragmentContext = function () {
var node = this.fragmentContext;
do {
if (this.treeAdapter.getTagName(node) === $.FORM) {
this.formElement = node;
break;
}
node = this.treeAdapter.getParentNode(node);
} while (node);
};
Parser.prototype._initTokenizerForFragmentParsing = function () {
var 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;
};
//Tree mutation
Parser.prototype._setDocumentType = function (token) {
this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);
};
Parser.prototype._attachElementToTree = function (element) {
if (this._shouldFosterParentOnInsertion())
this._fosterParentElement(element);
else {
var parent = this.openElements.currentTmplContent || this.openElements.current;
this.treeAdapter.appendChild(parent, element);
}
};
Parser.prototype._appendElement = function (token, namespaceURI) {
var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
this._attachElementToTree(element);
};
Parser.prototype._insertElement = function (token, namespaceURI) {
var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
this._attachElementToTree(element);
this.openElements.push(element);
};
Parser.prototype._insertTemplate = function (token) {
var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),
content = this.treeAdapter.createDocumentFragment();
this.treeAdapter.appendChild(tmpl, content);
this._attachElementToTree(tmpl);
this.openElements.push(tmpl);
};
Parser.prototype._insertFakeRootElement = function () {
var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
this.treeAdapter.appendChild(this.openElements.current, element);
this.openElements.push(element);
};
Parser.prototype._appendCommentNode = function (token, parent) {
var commentNode = this.treeAdapter.createCommentNode(token.data);
this.treeAdapter.appendChild(parent, commentNode);
};
Parser.prototype._insertCharacters = function (token) {
if (this._shouldFosterParentOnInsertion())
this._fosterParentText(token.chars);
else {
var parent = this.openElements.currentTmplContent || this.openElements.current;
this.treeAdapter.insertText(parent, token.chars);
}
};
Parser.prototype._adoptNodes = function (donor, recipient) {
while (true) {
var child = this.treeAdapter.getFirstChild(donor);
if (!child)
break;
this.treeAdapter.detachNode(child);
this.treeAdapter.appendChild(recipient, child);
}
};
//Token processing
Parser.prototype._shouldProcessTokenInForeignContent = function (token) {
var current = this._getAdjustedCurrentElement();
if (!current || current === this.document)
return false;
var ns = this.treeAdapter.getNamespaceURI(current);
if (ns === NS.HTML)
return false;
if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML &&
token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) {
return false;
}
var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN ||
token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,
isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN &&
token.tagName !== $.MGLYPH &&
token.tagName !== $.MALIGNMARK;
if ((isMathMLTextStartTag || isCharacterToken) && this._isMathMLTextIntegrationPoint(current))
return false;
if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isHtmlIntegrationPoint(current))
return false;
return token.type !== Tokenizer.EOF_TOKEN;
};
Parser.prototype._processToken = function (token) {
_[this.insertionMode][token.type](this, token);
};
Parser.prototype._processTokenInBodyMode = function (token) {
_[IN_BODY_MODE][token.type](this, token);
};
Parser.prototype._processTokenInForeignContent = function (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);
};
Parser.prototype._processFakeStartTagWithAttrs = function (tagName, attrs) {
var fakeToken = this.tokenizer.buildStartTagToken(tagName);
fakeToken.attrs = attrs;
this._processToken(fakeToken);
};
Parser.prototype._processFakeStartTag = function (tagName) {
var fakeToken = this.tokenizer.buildStartTagToken(tagName);
this._processToken(fakeToken);
return fakeToken;
};
Parser.prototype._processFakeEndTag = function (tagName) {
var fakeToken = this.tokenizer.buildEndTagToken(tagName);
this._processToken(fakeToken);
return fakeToken;
};
//Integration points
Parser.prototype._isMathMLTextIntegrationPoint = function (element) {
var tn = this.treeAdapter.getTagName(element),
ns = this.treeAdapter.getNamespaceURI(element);
return ForeignContent.isMathMLTextIntegrationPoint(tn, ns);
};
Parser.prototype._isHtmlIntegrationPoint = function (element) {
var tn = this.treeAdapter.getTagName(element),
ns = this.treeAdapter.getNamespaceURI(element),
attrs = this.treeAdapter.getAttrList(element);
return ForeignContent.isHtmlIntegrationPoint(tn, ns, attrs);
};
//Active formatting elements reconstruction
Parser.prototype._reconstructActiveFormattingElements = function () {
var listLength = this.activeFormattingElements.length;
if (listLength) {
var unopenIdx = listLength,
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 (var i = unopenIdx; i < listLength; i++) {
entry = this.activeFormattingElements.entries[i];
this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
entry.element = this.openElements.current;
}
}
};
//Close elements
Parser.prototype._closeTableCell = function () {
if (this.openElements.hasInTableScope($.TD))
this._processFakeEndTag($.TD);
else
this._processFakeEndTag($.TH);
};
Parser.prototype._closePElement = function () {
this.openElements.generateImpliedEndTagsWithExclusion($.P);
this.openElements.popUntilTagNamePopped($.P);
};
//Insertion modes
Parser.prototype._resetInsertionMode = function () {
for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {
var element = this.openElements.items[i];
if (i === 0) {
last = true;
if (this.fragmentContext)
element = this.fragmentContext;
}
var tn = this.treeAdapter.getTagName(element),
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;
}
}
};
Parser.prototype._resetInsertionModeForSelect = function (selectIdx) {
if (selectIdx > 0) {
for (var i = selectIdx - 1; i > 0; i--) {
var ancestor = this.openElements.items[i],
tn = this.treeAdapter.getTagName(ancestor);
if (tn === $.TEMPLATE)
break;
else if (tn === $.TABLE) {
this.insertionMode = IN_SELECT_IN_TABLE_MODE;
return;
}
}
}
this.insertionMode = IN_SELECT_MODE;
};
Parser.prototype._pushTmplInsertionMode = function (mode) {
this.tmplInsertionModeStack.push(mode);
this.tmplInsertionModeStackTop++;
this.currentTmplInsertionMode = mode;
};
Parser.prototype._popTmplInsertionMode = function () {
this.tmplInsertionModeStack.pop();
this.tmplInsertionModeStackTop--;
this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
};
//Foster parenting
Parser.prototype._isElementCausesFosterParenting = function (element) {
var tn = this.treeAdapter.getTagName(element);
return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn == $.THEAD || tn === $.TR;
};
Parser.prototype._shouldFosterParentOnInsertion = function () {
return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
};
Parser.prototype._findFosterParentingLocation = function () {
var location = {
parent: null,
beforeElement: null
};
for (var i = this.openElements.stackTop; i >= 0; i--) {
var openElement = this.openElements.items[i],
tn = this.treeAdapter.getTagName(openElement),
ns = this.treeAdapter.getNamespaceURI(openElement);
if (tn === $.TEMPLATE && ns === NS.HTML) {
location.parent = this.treeAdapter.getChildNodes(openElement)[0];
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];
break;
}
}
if (!location.parent)
location.parent = this.openElements.items[0];
return location;
};
Parser.prototype._fosterParentElement = function (element) {
var location = this._findFosterParentingLocation();
if (location.beforeElement)
this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
else
this.treeAdapter.appendChild(location.parent, element);
};
Parser.prototype._fosterParentText = function (chars) {
var location = this._findFosterParentingLocation();
if (location.beforeElement)
this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
else
this.treeAdapter.insertText(location.parent, chars);
};
//Special elements
Parser.prototype._isSpecialElement = function (element) {
var tn = this.treeAdapter.getTagName(element),
ns = this.treeAdapter.getNamespaceURI(element);
return HTML.SPECIAL_ELEMENTS[ns][tn];
};
//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) {
var 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))
formattingElementEntry = null;
}
else
genericEndTagInBody(p, token);
return formattingElementEntry;
}
//Steps 9 and 10 of the algorithm
function aaObtainFurthestBlock(p, formattingElementEntry) {
var furthestBlock = null;
for (var i = p.openElements.stackTop; i >= 0; i--) {
var element = p.openElements.items[i];
if (element === formattingElementEntry.element)
break;
if (p._isSpecialElement(element))
furthestBlock = element;
}
if (!furthestBlock) {
p.openElements.popUntilElementPopped(formattingElementEntry.element);
p.activeFormattingElements.removeEntry(formattingElementEntry);
}
return furthestBlock;
}
//Step 13 of the algorithm
function aaInnerLoop(p, furthestBlock, formattingElement) {
var element = null,
lastElement = furthestBlock,
nextElement = p.openElements.getCommonAncestor(furthestBlock);
for (var i = 0; i < AA_INNER_LOOP_ITER; i++) {
element = nextElement;
//NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
nextElement = p.openElements.getCommonAncestor(element);
var elementEntry = p.activeFormattingElements.getElementEntry(element);
if (!elementEntry) {
p.openElements.remove(element);
continue;
}
if (element === formattingElement)
break;
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) {
var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),
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))
p._fosterParentElement(lastElement);
else {
var tn = p.treeAdapter.getTagName(commonAncestor),
ns = p.treeAdapter.getNamespaceURI(commonAncestor);
if (tn === $.TEMPLATE && ns === NS.HTML)
commonAncestor = p.treeAdapter.getChildNodes(commonAncestor)[0];
p.treeAdapter.appendChild(commonAncestor, lastElement);
}
}
//Steps 15-19 of the algorithm
function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),
token = formattingElementEntry.token,
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.removeEntry(formattingElementEntry);
p.openElements.remove(formattingElementEntry.element);
p.openElements.insertAfter(furthestBlock, newElement);
}
//Algorithm entry point
function callAdoptionAgency(p, token) {
for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {
var formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
if (!formattingElementEntry)
break;
var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
if (!furthestBlock)
break;
p.activeFormattingElements.bookmark = formattingElementEntry;
var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),
commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
p.treeAdapter.detachNode(lastElement);
aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
}
}
//Generic token handlers
//------------------------------------------------------------------
function ignoreToken(p, token) {
//NOTE: do nothing =)
}
function appendComment(p, token) {
p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current)
}
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, token) {
p.stopped = true;
}
//12.2.5.4.1 The "initial" insertion mode
//------------------------------------------------------------------
function doctypeInInitialMode(p, token) {
p._setDocumentType(token);
if (token.forceQuirks || Doctype.isQuirks(token.name, token.publicId, token.systemId))
p.treeAdapter.setQuirksMode(p.document);
p.insertionMode = BEFORE_HTML_MODE;
}
function tokenInInitialMode(p, token) {
p.treeAdapter.setQuirksMode(p.document);
p.insertionMode = BEFORE_HTML_MODE;
p._processToken(token);
}
//12.2.5.4.2 The "before html" insertion mode
//------------------------------------------------------------------
function startTagBeforeHtml(p, token) {
if (token.tagName === $.HTML) {
p._insertElement(token, NS.HTML);
p.insertionMode = BEFORE_HEAD_MODE;
}
else
tokenBeforeHtml(p, token);
}
function endTagBeforeHtml(p, token) {
var tn = token.tagName;
if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR)
tokenBeforeHtml(p, token);
}
function tokenBeforeHtml(p, token) {
p._insertFakeRootElement();
p.insertionMode = BEFORE_HEAD_MODE;
p._processToken(token);
}
//12.2.5.4.3 The "before head" insertion mode
//------------------------------------------------------------------
function startTagBeforeHead(p, token) {
var 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);
}
function endTagBeforeHead(p, token) {
var tn = token.tagName;
if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR)
tokenBeforeHead(p, token);
}
function tokenBeforeHead(p, token) {
p._processFakeStartTag($.HEAD);
p._processToken(token);
}
//12.2.5.4.4 The "in head" insertion mode
//------------------------------------------------------------------
function startTagInHead(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND ||
tn === $.COMMAND || tn === $.LINK || tn === $.META) {
p._appendElement(token, NS.HTML);
}
else if (tn === $.TITLE)
p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
//NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse
// as a rawtext.
else if (tn === $.NOSCRIPT || 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)
tokenInHead(p, token);
}
function endTagInHead(p, token) {
var 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 && p.openElements.tmplCount > 0) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTemplatePopped();
p.activeFormattingElements.clearToLastMarker();
p._popTmplInsertionMode();
p._resetInsertionMode();
}
}
function tokenInHead(p, token) {
p._processFakeEndTag($.HEAD);
p._processToken(token);
}
//12.2.5.4.6 The "after head" insertion mode
//------------------------------------------------------------------
function startTagAfterHead(p, token) {
var 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.openElements.push(p.headElement);
startTagInHead(p, token);
p.openElements.remove(p.headElement);
}
else if (tn !== $.HEAD)
tokenAfterHead(p, token);
}
function endTagAfterHead(p, token) {
var tn = token.tagName;
if (tn === $.BODY || tn === $.HTML || tn === $.BR)
tokenAfterHead(p, token);
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
}
function tokenAfterHead(p, token) {
p._processFakeStartTag($.BODY);
p.framesetOk = true;
p._processToken(token);
}
//12.2.5.4.7 The "in body" insertion mode
//------------------------------------------------------------------
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) {
var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
if (bodyElement && p.openElements.tmplCount === 0) {
p.framesetOk = false;
p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
}
}
function framesetStartTagInBody(p, token) {
var 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;
}
}
function addressStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
}
function numberedHeaderStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
var tn = p.openElements.currentTagName;
if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
p.openElements.pop();
p._insertElement(token, NS.HTML);
}
function preStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, 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) {
var inTemplate = p.openElements.tmplCount > 0;
if (!p.formElement || inTemplate) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
if (!inTemplate)
p.formElement = p.openElements.current;
}
}
function listItemStartTagInBody(p, token) {
p.framesetOk = false;
for (var i = p.openElements.stackTop; i >= 0; i--) {
var element = p.openElements.items[i],
tn = p.treeAdapter.getTagName(element);
if ((token.tagName === $.LI && tn === $.LI) ||
((token.tagName === $.DD || token.tagName === $.DT) && (tn === $.DD || tn == $.DT))) {
p._processFakeEndTag(tn);
break;
}
if (tn !== $.ADDRESS && tn !== $.DIV && tn !== $.P && p._isSpecialElement(element))
break;
}
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
}
function plaintextStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
}
function buttonStartTagInBody(p, token) {
if (p.openElements.hasInScope($.BUTTON)) {
p._processFakeEndTag($.BUTTON);
buttonStartTagInBody(p, token);
}
else {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.framesetOk = false;
}
}
function aStartTagInBody(p, token) {
var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
if (activeElementEntry) {
p._processFakeEndTag($.A);
p.openElements.remove(activeElementEntry.element);
p.activeFormattingElements.removeEntry(activeElementEntry);
}
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function bStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function nobrStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
if (p.openElements.hasInScope($.NOBR)) {
p._processFakeEndTag($.NOBR);
p._reconstructActiveFormattingElements();
}
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function appletStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.insertMarker();
p.framesetOk = false;
}
function tableStartTagInBody(p, token) {
if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
p.framesetOk = false;
p.insertionMode = IN_TABLE_MODE;
}
function areaStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._appendElement(token, NS.HTML);
p.framesetOk = false;
}
function inputStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._appendElement(token, NS.HTML);
var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE)
p.framesetOk = false;
}
function paramStartTagInBody(p, token) {
p._appendElement(token, NS.HTML);
}
function hrStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._appendElement(token, NS.HTML);
p.framesetOk = false;
}
function imageStartTagInBody(p, token) {
token.tagName = $.IMG;
areaStartTagInBody(p, token);
}
function isindexStartTagInBody(p, token) {
if (!p.formElement || p.openElements.tmplCount > 0) {
p._processFakeStartTagWithAttrs($.FORM, getSearchableIndexFormAttrs(token));
p._processFakeStartTag($.HR);
p._processFakeStartTag($.LABEL);
p.treeAdapter.insertText(p.openElements.current, getSearchableIndexLabelText(token));
p._processFakeStartTagWithAttrs($.INPUT, getSearchableIndexInputAttrs(token));
p._processFakeEndTag($.LABEL);
p._processFakeStartTag($.HR);
p._processFakeEndTag($.FORM);
}
}
function textareaStartTagInBody(p, token) {
p._insertElement(token, 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.originalInsertionMode = p.insertionMode;
p.framesetOk = false;
p.insertionMode = TEXT_MODE;
}
function xmpStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._reconstructActiveFormattingElements();
p.framesetOk = false;
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
function iframeStartTagInBody(p, token) {
p.framesetOk = false;
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
// as a rawtext.
function noembedStartTagInBody(p, token) {
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
function selectStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, 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;
}
function optgroupStartTagInBody(p, token) {
if (p.openElements.currentTagName === $.OPTION)
p._processFakeEndTag($.OPTION);
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
}
function rpStartTagInBody(p, token) {
if (p.openElements.hasInScope($.RUBY))
p.openElements.generateImpliedEndTags();
p._insertElement(token, NS.HTML);
}
function menuitemStartTagInBody(p, token) {
p._appendElement(token, 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);
}
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);
}
function genericStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, 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) {
var 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);
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 === $.RP || tn === $.RT)
rpStartTagInBody(p, token);
else if (tn !== $.TH && tn !== $.TD && tn !== $.TR)
genericStartTagInBody(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 !== $.COL)
genericStartTagInBody(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 !== $.HEAD)
genericStartTagInBody(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);
break;
case 6:
if (tn === $.SCRIPT)
startTagInHead(p, token);
else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
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);
break;
case 7:
if (tn === $.BGSOUND || tn === $.COMMAND)
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 === $.ISINDEX)
isindexStartTagInBody(p, token);
else if (tn === $.NOEMBED)
noembedStartTagInBody(p, token);
else if (tn !== $.CAPTION)
genericStartTagInBody(p, token);
break;
case 8:
if (tn === $.BASEFONT || tn === $.MENUITEM)
menuitemStartTagInBody(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)
noembedStartTagInBody(p, token);
else if (tn === $.OPTGROUP)
optgroupStartTagInBody(p, token);
else if (tn !== $.COLGROUP)
genericStartTagInBody(p, token);
break;
case 9:
if (tn === $.PLAINTEXT)
plaintextStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
case 10:
if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
addressStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
default:
genericStartTagInBody(p, token);
}
}
function bodyEndTagInBody(p, token) {
if (p.openElements.hasInScope($.BODY))
p.insertionMode = AFTER_BODY_MODE;
else
token.ignored = true;
}
function htmlEndTagInBody(p, token) {
var fakeToken = p._processFakeEndTag($.BODY);
if (!fakeToken.ignored)
p._processToken(token);
}
function addressEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
}
}
function formEndTagInBody(p, token) {
var inTemplate = p.openElements.tmplCount > 0,
formElement = p.formElement;
if (!inTemplate)
p.formElement = null;
if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
p.openElements.generateImpliedEndTags();
if (inTemplate)
p.openElements.popUntilTagNamePopped($.FORM);
else
p.openElements.remove(formElement);
}
}
function pEndTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P)) {
p.openElements.generateImpliedEndTagsWithExclusion($.P);
p.openElements.popUntilTagNamePopped($.P);
}
else {
p._processFakeStartTag($.P);
p._processToken(token);
}
}
function liEndTagInBody(p, token) {
if (p.openElements.hasInListItemScope($.LI)) {
p.openElements.generateImpliedEndTagsWithExclusion($.LI);
p.openElements.popUntilTagNamePopped($.LI);
}
}
function ddEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTagsWithExclusion(tn);
p.openElements.popUntilTagNamePopped(tn);
}
}
function numberedHeaderEndTagInBody(p, token) {
if (p.openElements.hasNumberedHeaderInScope()) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilNumberedHeaderPopped();
}
}
function appletEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
p.activeFormattingElements.clearToLastMarker();
}
}
function brEndTagInBody(p, token) {
p._processFakeStartTag($.BR);
}
function genericEndTagInBody(p, token) {
var tn = token.tagName;
for (var i = p.openElements.stackTop; i > 0; i--) {
var element = p.openElements.items[i];
if (p.treeAdapter.getTagName(element) === tn) {
p.openElements.generateImpliedEndTagsWithExclusion(tn);
p.openElements.popUntilElementPopped(element);
break;
}
if (p._isSpecialElement(element))
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) {
var 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);
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);
break;
case 3:
if (tn === $.BIG)
callAdoptionAgency(p, token);
else if (tn === $.DIR || tn === $.DIV || tn === $.NAV)
addressEndTagInBody(p, token);
else
genericEndTagInBody(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);
break;
case 5:
if (tn === $.ASIDE)
addressEndTagInBody(p, token);
else if (tn === $.SMALL)
callAdoptionAgency(p, token);
else
genericEndTagInBody(p, token);
break;
case 6:
if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
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);
break;
case 7:
if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY)
addressEndTagInBody(p, token);
else if (tn === $.MARQUEE)
appletEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
case 8:
if (tn === $.FIELDSET)
addressEndTagInBody(p, token);
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
else
genericEndTagInBody(p, token);
break;
case 10:
if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
addressEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
default :
genericEndTagInBody(p, token);
}
}
function eofInBody(p, token) {
if (p.tmplInsertionModeStackTop > -1)
eofInTemplate(p, token);
else
p.stopped = true;
}
//12.2.5.4.8 The "text" insertion mode
//------------------------------------------------------------------
function endTagInText(p, token) {
if (!p.fragmentContext && p.scriptHandler && token.tagName === $.SCRIPT)
p.scriptHandler(p.document, p.openElements.current);
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
}
function eofInText(p, token) {
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
p._processToken(token);
}
//12.2.5.4.9 The "in table" insertion mode
//------------------------------------------------------------------
function characterInTable(p, token) {
var curTn = p.openElements.currentTagName;
if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
p.pendingCharacterTokens = [];
p.hasNonWhitespacePendingCharacterToken = false;
p.originalInsertionMode = p.insertionMode;
p.insertionMode = IN_TABLE_TEXT_MODE;
p._processToken(token);
}
else
tokenInTable(p, token);
}
function captionStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p.activeFormattingElements.insertMarker();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_CAPTION_MODE;
}
function colgroupStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_COLUMN_GROUP_MODE;
}
function colStartTagInTable(p, token) {
p._processFakeStartTag($.COLGROUP);
p._processToken(token);
}
function tbodyStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_TABLE_BODY_MODE;
}
function tdStartTagInTable(p, token) {
p._processFakeStartTag($.TBODY);
p._processToken(token);
}
function tableStartTagInTable(p, token) {
var fakeToken = p._processFakeEndTag($.TABLE);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(token);
}
function inputStartTagInTable(p, token) {
var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE)
p._appendElement(token, NS.HTML);
else
tokenInTable(p, token);
}
function formStartTagInTable(p, token) {
if (!p.formElement && p.openElements.tmplCount === 0) {
p._insertElement(token, NS.HTML);
p.formElement = p.openElements.current;
p.openElements.pop();
}
}
function startTagInTable(p, token) {
var tn = token.tagName;
switch (tn.length) {
case 2:
if (tn === $.TD || tn === $.TH || tn === $.TR)
tdStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 3:
if (tn === $.COL)
colStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 4:
if (tn === $.FORM)
formStartTagInTable(p, token);
else
tokenInTable(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);
break;
case 6:
if (tn === $.SCRIPT)
startTagInHead(p, token);
else
tokenInTable(p, token);
break;
case 7:
if (tn === $.CAPTION)
captionStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 8:
if (tn === $.COLGROUP)
colgroupStartTagInTable(p, token);
else if (tn === $.TEMPLATE)
startTagInHead(p, token);
else
tokenInTable(p, token);
break;
default:
tokenInTable(p, token);
}
}
function endTagInTable(p, token) {
var tn = token.tagName;
if (tn === $.TABLE) {
if (p.openElements.hasInTableScope($.TABLE)) {
p.openElements.popUntilTagNamePopped($.TABLE);
p._resetInsertionMode();
}
else
token.ignored = true;
}
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) {
var savedFosterParentingState = p.fosterParentingEnabled;
p.fosterParentingEnabled = true;
p._processTokenInBodyMode(token);
p.fosterParentingEnabled = savedFosterParentingState;
}
//12.2.5.4.10 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) {
if (p.hasNonWhitespacePendingCharacterToken) {
for (var i = 0; i < p.pendingCharacterTokens.length; i++)
tokenInTable(p, p.pendingCharacterTokens[i]);
}
else {
for (var i = 0; i < p.pendingCharacterTokens.length; i++)
p._insertCharacters(p.pendingCharacterTokens[i]);
}
p.insertionMode = p.originalInsertionMode;
p._processToken(token);
}
//12.2.5.4.11 The "in caption" insertion mode
//------------------------------------------------------------------
function startTagInCaption(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
var fakeToken = p._processFakeEndTag($.CAPTION);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(token);
}
else
startTagInBody(p, token);
}
function endTagInCaption(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION) {
if (p.openElements.hasInTableScope($.CAPTION)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped($.CAPTION);
p.activeFormattingElements.clearToLastMarker();
p.insertionMode = IN_TABLE_MODE;
}
else
token.ignored = true;
}
else if (tn === $.TABLE) {
var fakeToken = p._processFakeEndTag($.CAPTION);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(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);
}
}
//12.2.5.4.12 The "in column group" insertion mode
//------------------------------------------------------------------
function startTagInColumnGroup(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.COL)
p._appendElement(token, NS.HTML);
else if (tn === $.TEMPLATE)
startTagInHead(p, token);
else
tokenInColumnGroup(p, token);
}
function endTagInColumnGroup(p, token) {
var tn = token.tagName;
if (tn === $.COLGROUP) {
if (p.openElements.currentTagName !== $.COLGROUP)
token.ignored = true;
else {
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
}
}
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
else if (tn !== $.COL)
tokenInColumnGroup(p, token);
}
function tokenInColumnGroup(p, token) {
var fakeToken = p._processFakeEndTag($.COLGROUP);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(token);
}
//12.2.5.4.13 The "in table body" insertion mode
//------------------------------------------------------------------
function startTagInTableBody(p, token) {
var 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._processFakeStartTag($.TR);
p._processToken(token);
}
else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP ||
tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
if (p.openElements.hasTableBodyContextInTableScope()) {
p.openElements.clearBackToTableBodyContext();
p._processFakeEndTag(p.openElements.currentTagName);
p._processToken(token);
}
}
else
startTagInTable(p, token);
}
function endTagInTableBody(p, token) {
var 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;
}
}
else if (tn === $.TABLE) {
if (p.openElements.hasTableBodyContextInTableScope()) {
p.openElements.clearBackToTableBodyContext();
p._processFakeEndTag(p.openElements.currentTagName);
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) {
endTagInTable(p, token);
}
}
//12.2.5.4.14 The "in row" insertion mode
//------------------------------------------------------------------
function startTagInRow(p, token) {
var 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) {
var fakeToken = p._processFakeEndTag($.TR);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(token);
}
else
startTagInTable(p, token);
}
function endTagInRow(p, token) {
var tn = token.tagName;
if (tn === $.TR) {
if (p.openElements.hasInTableScope($.TR)) {
p.openElements.clearBackToTableRowContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_BODY_MODE;
}
else
token.ignored = true;
}
else if (tn === $.TABLE) {
var fakeToken = p._processFakeEndTag($.TR);
//NOTE: The fake end tag token here can only be ignored in the fragment case.
if (!fakeToken.ignored)
p._processToken(token);
}
else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
if (p.openElements.hasInTableScope(tn)) {
p._processFakeEndTag($.TR);
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
tn !== $.HTML && tn !== $.TD && tn !== $.TH) {
endTagInTable(p, token);
}
}
//12.2.5.4.15 The "in cell" insertion mode
//------------------------------------------------------------------
function startTagInCell(p, token) {
var 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)) {
p._closeTableCell();
p._processToken(token);
}
}
else
startTagInBody(p, token);
}
function endTagInCell(p, token) {
var 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;
}
}
else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
if (p.openElements.hasInTableScope(tn)) {
p._closeTableCell();
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML)
endTagInBody(p, token);
}
//12.2.5.4.16 The "in select" insertion mode
//------------------------------------------------------------------
function startTagInSelect(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.OPTION) {
if (p.openElements.currentTagName === $.OPTION)
p._processFakeEndTag($.OPTION);
p._insertElement(token, NS.HTML);
}
else if (tn === $.OPTGROUP) {
if (p.openElements.currentTagName === $.OPTION)
p._processFakeEndTag($.OPTION);
if (p.openElements.currentTagName === $.OPTGROUP)
p._processFakeEndTag($.OPTGROUP);
p._insertElement(token, NS.HTML);
}
else if (tn === $.SELECT)
p._processFakeEndTag($.SELECT);
else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA) {
if (p.openElements.hasInSelectScope($.SELECT)) {
p._processFakeEndTag($.SELECT);
p._processToken(token);
}
}
else if (tn === $.SCRIPT || tn === $.TEMPLATE)
startTagInHead(p, token);
}
function endTagInSelect(p, token) {
var tn = token.tagName;
if (tn === $.OPTGROUP) {
var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1],
prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP)
p._processFakeEndTag($.OPTION);
if (p.openElements.currentTagName === $.OPTGROUP)
p.openElements.pop();
}
else if (tn === $.OPTION) {
if (p.openElements.currentTagName === $.OPTION)
p.openElements.pop();
}
else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
p.openElements.popUntilTagNamePopped($.SELECT);
p._resetInsertionMode();
}
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
}
//12.2.5.4.17 The "in select in table" insertion mode
//------------------------------------------------------------------
function startTagInSelectInTable(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
p._processFakeEndTag($.SELECT);
p._processToken(token);
}
else
startTagInSelect(p, token);
}
function endTagInSelectInTable(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
if (p.openElements.hasInTableScope(tn)) {
p._processFakeEndTag($.SELECT);
p._processToken(token);
}
}
else
endTagInSelect(p, token);
}
//12.2.5.4.18 The "in template" insertion mode
//------------------------------------------------------------------
function startTagInTemplate(p, token) {
var 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 {
var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
p._popTmplInsertionMode();
p._pushTmplInsertionMode(newInsertionMode);
p.insertionMode = newInsertionMode;
p._processToken(token);
}
}
function endTagInTemplate(p, token) {
if (token.tagName === $.TEMPLATE)
endTagInHead(p, token);
}
function eofInTemplate(p, token) {
if (p.openElements.tmplCount > 0) {
p.openElements.popUntilTemplatePopped();
p.activeFormattingElements.clearToLastMarker();
p._popTmplInsertionMode();
p._resetInsertionMode();
p._processToken(token);
}
else
p.stopped = true;
}
//12.2.5.4.19 The "after body" insertion mode
//------------------------------------------------------------------
function startTagAfterBody(p, token) {
if (token.tagName === $.HTML)
startTagInBody(p, token);
else
tokenAfterBody(p, token);
}
function endTagAfterBody(p, token) {
if (token.tagName === $.HTML) {
if (!p.fragmentContext)
p.insertionMode = AFTER_AFTER_BODY_MODE;
}
else
tokenAfterBody(p, token);
}
function tokenAfterBody(p, token) {
p.insertionMode = IN_BODY_MODE;
p._processToken(token);
}
//12.2.5.4.20 The "in frameset" insertion mode
//------------------------------------------------------------------
function startTagInFrameset(p, token) {
var 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);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
function endTagInFrameset(p, token) {
if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
p.openElements.pop();
if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET)
p.insertionMode = AFTER_FRAMESET_MODE;
}
}
//12.2.5.4.21 The "after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterFrameset(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
function endTagAfterFrameset(p, token) {
if (token.tagName === $.HTML)
p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
}
//12.2.5.4.22 The "after after body" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterBody(p, token) {
if (token.tagName === $.HTML)
startTagInBody(p, token);
else
tokenAfterAfterBody(p, token);
}
function tokenAfterAfterBody(p, token) {
p.insertionMode = IN_BODY_MODE;
p._processToken(token);
}
//12.2.5.4.23 The "after after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterFrameset(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
//12.2.5.5 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 startTagInForeignContent(p, token) {
if (ForeignContent.causesExit(token) && !p.fragmentContext) {
while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML &&
(!p._isMathMLTextIntegrationPoint(p.openElements.current)) &&
(!p._isHtmlIntegrationPoint(p.openElements.current))) {
p.openElements.pop();
}
p._processToken(token);
}
else {
var current = p._getAdjustedCurrentElement(),
currentNs = p.treeAdapter.getNamespaceURI(current);
if (currentNs === NS.MATHML)
ForeignContent.adjustTokenMathMLAttrs(token);
else if (currentNs === NS.SVG) {
ForeignContent.adjustTokenSVGTagName(token);
ForeignContent.adjustTokenSVGAttrs(token);
}
ForeignContent.adjustTokenXMLAttrs(token);
if (token.selfClosing)
p._appendElement(token, currentNs);
else
p._insertElement(token, currentNs);
}
}
function endTagInForeignContent(p, token) {
for (var i = p.openElements.stackTop; i > 0; i--) {
var element = p.openElements.items[i];
if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
p._processToken(token);
break;
}
if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
p.openElements.popUntilElementPopped(element);
break;
}
}
}
},{"../common/doctype":260,"../common/foreign_content":261,"../common/html":262,"../common/unicode":263,"../common/utils":264,"../tokenization/tokenizer":273,"../tree_adapters/default":274,"./formatting_element_list":276,"./location_info_mixin":277,"./open_element_stack":278}],280:[function(require,module,exports){
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
} else if (last === '..') {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
return splitPathRe.exec(filename).slice(1);
};
// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : process.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};
// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === '/';
// Normalize the path
path = normalizeArray(filter(path.split('/'), function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
};
// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === '/';
};
// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== 'string') {
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};
// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
};
exports.sep = '/';
exports.delimiter = ':';
exports.dirname = function(path) {
var result = splitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
};
exports.basename = function(path, ext) {
var f = splitPath(path)[2];
// TODO: make this comparison case-insensitive on windows?
if (ext && f.substr(-1 * ext.length) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
};
exports.extname = function(path) {
return splitPath(path)[3];
};
function filter (xs, f) {
if (xs.filter) return xs.filter(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
if (f(xs[i], i, xs)) res.push(xs[i]);
}
return res;
}
// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
? function (str, start, len) { return str.substr(start, len) }
: function (str, start, len) {
if (start < 0) start = str.length + start;
return str.substr(start, len);
}
;
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iXX0=
},{"_process":281}],281:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
var queue = [];
var draining = false;
function drainQueue() {
if (draining) {
return;
}
draining = true;
var currentQueue;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
var i = -1;
while (++i < len) {
currentQueue[i]();
}
len = queue.length;
}
draining = false;
}
process.nextTick = function (fun) {
queue.push(fun);
if (!draining) {
setTimeout(drainQueue, 0);
}
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
},{}],282:[function(require,module,exports){
(function (global){
/*! http://mths.be/punycode v1.2.4 by @mathias */
;(function(root) {
/** Detect free variables */
var freeExports = typeof exports == 'object' && exports;
var freeModule = typeof module == 'object' && module &&
module.exports == freeExports && module;
var freeGlobal = typeof global == 'object' && global;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
root = freeGlobal;
}
/**
* The `punycode` object.
* @name punycode
* @type Object
*/
var punycode,
/** Highest positive signed 32-bit float value */
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
/** Bootstring parameters */
base = 36,
tMin = 1,
tMax = 26,
skew = 38,
damp = 700,
initialBias = 72,
initialN = 128, // 0x80
delimiter = '-', // '\x2D'
/** Regular expressions */
regexPunycode = /^xn--/,
regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
regexSeparators = /\x2E|\u3002|\uFF0E|\uFF61/g, // RFC 3490 separators
/** Error messages */
errors = {
'overflow': 'Overflow: input needs wider integers to process',
'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
'invalid-input': 'Invalid input'
},
/** Convenience shortcuts */
baseMinusTMin = base - tMin,
floor = Math.floor,
stringFromCharCode = String.fromCharCode,
/** Temporary variable */
key;
/*--------------------------------------------------------------------------*/
/**
* A generic error utility function.
* @private
* @param {String} type The error type.
* @returns {Error} Throws a `RangeError` with the applicable error message.
*/
function error(type) {
throw RangeError(errors[type]);
}
/**
* A generic `Array#map` utility function.
* @private
* @param {Array} array The array to iterate over.
* @param {Function} callback The function that gets called for every array
* item.
* @returns {Array} A new array of values returned by the callback function.
*/
function map(array, fn) {
var length = array.length;
while (length--) {
array[length] = fn(array[length]);
}
return array;
}
/**
* A simple `Array#map`-like wrapper to work with domain name strings.
* @private
* @param {String} domain The domain name.
* @param {Function} callback The function that gets called for every
* character.
* @returns {Array} A new string of characters returned by the callback
* function.
*/
function mapDomain(string, fn) {
return map(string.split(regexSeparators), fn).join('.');
}
/**
* Creates an array containing the numeric code points of each Unicode
* character in the string. While JavaScript uses UCS-2 internally,
* this function will convert a pair of surrogate halves (each of which
* UCS-2 exposes as separate characters) into a single code point,
* matching UTF-16.
* @see `punycode.ucs2.encode`
* @see
* @memberOf punycode.ucs2
* @name decode
* @param {String} string The Unicode input string (UCS-2).
* @returns {Array} The new array of code points.
*/
function ucs2decode(string) {
var output = [],
counter = 0,
length = string.length,
value,
extra;
while (counter < length) {
value = string.charCodeAt(counter++);
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
// high surrogate, and there is a next character
extra = string.charCodeAt(counter++);
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
} else {
// unmatched surrogate; only append this code unit, in case the next
// code unit is the high surrogate of a surrogate pair
output.push(value);
counter--;
}
} else {
output.push(value);
}
}
return output;
}
/**
* Creates a string based on an array of numeric code points.
* @see `punycode.ucs2.decode`
* @memberOf punycode.ucs2
* @name encode
* @param {Array} codePoints The array of numeric code points.
* @returns {String} The new Unicode string (UCS-2).
*/
function ucs2encode(array) {
return map(array, function(value) {
var output = '';
if (value > 0xFFFF) {
value -= 0x10000;
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
value = 0xDC00 | value & 0x3FF;
}
output += stringFromCharCode(value);
return output;
}).join('');
}
/**
* Converts a basic code point into a digit/integer.
* @see `digitToBasic()`
* @private
* @param {Number} codePoint The basic numeric code point value.
* @returns {Number} The numeric value of a basic code point (for use in
* representing integers) in the range `0` to `base - 1`, or `base` if
* the code point does not represent a value.
*/
function basicToDigit(codePoint) {
if (codePoint - 48 < 10) {
return codePoint - 22;
}
if (codePoint - 65 < 26) {
return codePoint - 65;
}
if (codePoint - 97 < 26) {
return codePoint - 97;
}
return base;
}
/**
* Converts a digit/integer into a basic code point.
* @see `basicToDigit()`
* @private
* @param {Number} digit The numeric value of a basic code point.
* @returns {Number} The basic code point whose value (when used for
* representing integers) is `digit`, which needs to be in the range
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
* used; else, the lowercase form is used. The behavior is undefined
* if `flag` is non-zero and `digit` has no uppercase form.
*/
function digitToBasic(digit, flag) {
// 0..25 map to ASCII a..z or A..Z
// 26..35 map to ASCII 0..9
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
}
/**
* Bias adaptation function as per section 3.4 of RFC 3492.
* http://tools.ietf.org/html/rfc3492#section-3.4
* @private
*/
function adapt(delta, numPoints, firstTime) {
var k = 0;
delta = firstTime ? floor(delta / damp) : delta >> 1;
delta += floor(delta / numPoints);
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
delta = floor(delta / baseMinusTMin);
}
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
}
/**
* Converts a Punycode string of ASCII-only symbols to a string of Unicode
* symbols.
* @memberOf punycode
* @param {String} input The Punycode string of ASCII-only symbols.
* @returns {String} The resulting string of Unicode symbols.
*/
function decode(input) {
// Don't use UCS-2
var output = [],
inputLength = input.length,
out,
i = 0,
n = initialN,
bias = initialBias,
basic,
j,
index,
oldi,
w,
k,
digit,
t,
/** Cached calculation results */
baseMinusT;
// Handle the basic code points: let `basic` be the number of input code
// points before the last delimiter, or `0` if there is none, then copy
// the first basic code points to the output.
basic = input.lastIndexOf(delimiter);
if (basic < 0) {
basic = 0;
}
for (j = 0; j < basic; ++j) {
// if it's not a basic code point
if (input.charCodeAt(j) >= 0x80) {
error('not-basic');
}
output.push(input.charCodeAt(j));
}
// Main decoding loop: start just after the last delimiter if any basic code
// points were copied; start at the beginning otherwise.
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
// `index` is the index of the next character to be consumed.
// Decode a generalized variable-length integer into `delta`,
// which gets added to `i`. The overflow checking is easier
// if we increase `i` as we go, then subtract off its starting
// value at the end to obtain `delta`.
for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
if (index >= inputLength) {
error('invalid-input');
}
digit = basicToDigit(input.charCodeAt(index++));
if (digit >= base || digit > floor((maxInt - i) / w)) {
error('overflow');
}
i += digit * w;
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
if (digit < t) {
break;
}
baseMinusT = base - t;
if (w > floor(maxInt / baseMinusT)) {
error('overflow');
}
w *= baseMinusT;
}
out = output.length + 1;
bias = adapt(i - oldi, out, oldi == 0);
// `i` was supposed to wrap around from `out` to `0`,
// incrementing `n` each time, so we'll fix that now:
if (floor(i / out) > maxInt - n) {
error('overflow');
}
n += floor(i / out);
i %= out;
// Insert `n` at position `i` of the output
output.splice(i++, 0, n);
}
return ucs2encode(output);
}
/**
* Converts a string of Unicode symbols to a Punycode string of ASCII-only
* symbols.
* @memberOf punycode
* @param {String} input The string of Unicode symbols.
* @returns {String} The resulting Punycode string of ASCII-only symbols.
*/
function encode(input) {
var n,
delta,
handledCPCount,
basicLength,
bias,
j,
m,
q,
k,
t,
currentValue,
output = [],
/** `inputLength` will hold the number of code points in `input`. */
inputLength,
/** Cached calculation results */
handledCPCountPlusOne,
baseMinusT,
qMinusT;
// Convert the input in UCS-2 to Unicode
input = ucs2decode(input);
// Cache the length
inputLength = input.length;
// Initialize the state
n = initialN;
delta = 0;
bias = initialBias;
// Handle the basic code points
for (j = 0; j < inputLength; ++j) {
currentValue = input[j];
if (currentValue < 0x80) {
output.push(stringFromCharCode(currentValue));
}
}
handledCPCount = basicLength = output.length;
// `handledCPCount` is the number of code points that have been handled;
// `basicLength` is the number of basic code points.
// Finish the basic string - if it is not empty - with a delimiter
if (basicLength) {
output.push(delimiter);
}
// Main encoding loop:
while (handledCPCount < inputLength) {
// All non-basic code points < n have been handled already. Find the next
// larger one:
for (m = maxInt, j = 0; j < inputLength; ++j) {
currentValue = input[j];
if (currentValue >= n && currentValue < m) {
m = currentValue;
}
}
// Increase `delta` enough to advance the decoder's state to ,
// but guard against overflow
handledCPCountPlusOne = handledCPCount + 1;
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
error('overflow');
}
delta += (m - n) * handledCPCountPlusOne;
n = m;
for (j = 0; j < inputLength; ++j) {
currentValue = input[j];
if (currentValue < n && ++delta > maxInt) {
error('overflow');
}
if (currentValue == n) {
// Represent delta as a generalized variable-length integer
for (q = delta, k = base; /* no condition */; k += base) {
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
if (q < t) {
break;
}
qMinusT = q - t;
baseMinusT = base - t;
output.push(
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
);
q = floor(qMinusT / baseMinusT);
}
output.push(stringFromCharCode(digitToBasic(q, 0)));
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
delta = 0;
++handledCPCount;
}
}
++delta;
++n;
}
return output.join('');
}
/**
* Converts a Punycode string representing a domain name to Unicode. Only the
* Punycoded parts of the domain name will be converted, i.e. it doesn't
* matter if you call it on a string that has already been converted to
* Unicode.
* @memberOf punycode
* @param {String} domain The Punycode domain name to convert to Unicode.
* @returns {String} The Unicode representation of the given Punycode
* string.
*/
function toUnicode(domain) {
return mapDomain(domain, function(string) {
return regexPunycode.test(string)
? decode(string.slice(4).toLowerCase())
: string;
});
}
/**
* Converts a Unicode string representing a domain name to Punycode. Only the
* non-ASCII parts of the domain name will be converted, i.e. it doesn't
* matter if you call it with a domain that's already in ASCII.
* @memberOf punycode
* @param {String} domain The domain name to convert, as a Unicode string.
* @returns {String} The Punycode representation of the given domain name.
*/
function toASCII(domain) {
return mapDomain(domain, function(string) {
return regexNonASCII.test(string)
? 'xn--' + encode(string)
: string;
});
}
/*--------------------------------------------------------------------------*/
/** Define the public API */
punycode = {
/**
* A string representing the current Punycode.js version number.
* @memberOf punycode
* @type String
*/
'version': '1.2.4',
/**
* An object of methods to convert from JavaScript's internal character
* representation (UCS-2) to Unicode code points, and back.
* @see
* @memberOf punycode
* @type Object
*/
'ucs2': {
'decode': ucs2decode,
'encode': ucs2encode
},
'decode': decode,
'encode': encode,
'toASCII': toASCII,
'toUnicode': toUnicode
};
/** Expose `punycode` */
// Some AMD build optimizers, like r.js, check for specific condition patterns
// like the following:
if (
typeof define == 'function' &&
typeof define.amd == 'object' &&
define.amd
) {
define('punycode', function() {
return punycode;
});
} else if (freeExports && !freeExports.nodeType) {
if (freeModule) { // in Node.js or RingoJS v0.8.0+
freeModule.exports = punycode;
} else { // in Narwhal or RingoJS v0.7.0-
for (key in punycode) {
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
}
}
} else { // in Rhino or a web browser
root.punycode = punycode;
}
}(this));
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qISBodHRwOi8vbXRocy5iZS9wdW55Y29kZSB2MS4yLjQgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgKi9cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzICYmIG1vZHVsZTtcblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGBwdW55Y29kZWAgb2JqZWN0LlxuXHQgKiBAbmFtZSBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdHZhciBwdW55Y29kZSxcblxuXHQvKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5cdG1heEludCA9IDIxNDc0ODM2NDcsIC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuXHQvKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5cdGJhc2UgPSAzNixcblx0dE1pbiA9IDEsXG5cdHRNYXggPSAyNixcblx0c2tldyA9IDM4LFxuXHRkYW1wID0gNzAwLFxuXHRpbml0aWFsQmlhcyA9IDcyLFxuXHRpbml0aWFsTiA9IDEyOCwgLy8gMHg4MFxuXHRkZWxpbWl0ZXIgPSAnLScsIC8vICdcXHgyRCdcblxuXHQvKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuXHRyZWdleFB1bnljb2RlID0gL154bi0tLyxcblx0cmVnZXhOb25BU0NJSSA9IC9bXiAtfl0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvXFx4MkV8XFx1MzAwMnxcXHVGRjBFfFxcdUZGNjEvZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcblx0ICogaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRhcnJheVtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiBhcnJheTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3MuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcblx0ICogY2hhcmFjdGVyLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuXHQgKiBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG5cdFx0cmV0dXJuIG1hcChzdHJpbmcuc3BsaXQocmVnZXhTZXBhcmF0b3JzKSwgZm4pLmpvaW4oJy4nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG5cdCAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcblx0ICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG5cdCAqIG1hdGNoaW5nIFVURi0xNi5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG5cdCAqIEBzZWUgPGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyB0byBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5XG5cdCAqIHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSB0byBVbmljb2RlLiBPbmx5IHRoZVxuXHQgKiBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLCBpLmUuIGl0IGRvZXNuJ3Rcblx0ICogbWF0dGVyIGlmIHlvdSBjYWxsIGl0IG9uIGEgc3RyaW5nIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjb252ZXJ0ZWQgdG9cblx0ICogVW5pY29kZS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIFB1bnljb2RlIGRvbWFpbiBuYW1lIHRvIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShkb21haW4pIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGRvbWFpbiwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhQdW55Y29kZS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgdG8gUHVueWNvZGUuIE9ubHkgdGhlXG5cdCAqIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS4gaXQgZG9lc24ndFxuXHQgKiBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpbiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIHRvIGNvbnZlcnQsIGFzIGEgVW5pY29kZSBzdHJpbmcuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGRvbWFpbikge1xuXHRcdHJldHVybiBtYXBEb21haW4oZG9tYWluLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuXHRwdW55Y29kZSA9IHtcblx0XHQvKipcblx0XHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0ICovXG5cdFx0J3ZlcnNpb24nOiAnMS4yLjQnLFxuXHRcdC8qKlxuXHRcdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdFx0ICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cblx0XHQgKiBAc2VlIDxodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmICFmcmVlRXhwb3J0cy5ub2RlVHlwZSkge1xuXHRcdGlmIChmcmVlTW9kdWxlKSB7IC8vIGluIE5vZGUuanMgb3IgUmluZ29KUyB2MC44LjArXG5cdFx0XHRmcmVlTW9kdWxlLmV4cG9ydHMgPSBwdW55Y29kZTtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHsgLy8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QucHVueWNvZGUgPSBwdW55Y29kZTtcblx0fVxuXG59KHRoaXMpKTtcbiJdfQ==
},{}],283:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';
// If obj.hasOwnProperty has been overridden, then calling
// obj.hasOwnProperty(prop) will break.
// See: https://github.com/joyent/node/issues/1707
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
module.exports = function(qs, sep, eq, options) {
sep = sep || '&';
eq = eq || '=';
var obj = {};
if (typeof qs !== 'string' || qs.length === 0) {
return obj;
}
var regexp = /\+/g;
qs = qs.split(sep);
var maxKeys = 1000;
if (options && typeof options.maxKeys === 'number') {
maxKeys = options.maxKeys;
}
var len = qs.length;
// maxKeys <= 0 means that we should not limit keys count
if (maxKeys > 0 && len > maxKeys) {
len = maxKeys;
}
for (var i = 0; i < len; ++i) {
var x = qs[i].replace(regexp, '%20'),
idx = x.indexOf(eq),
kstr, vstr, k, v;
if (idx >= 0) {
kstr = x.substr(0, idx);
vstr = x.substr(idx + 1);
} else {
kstr = x;
vstr = '';
}
k = decodeURIComponent(kstr);
v = decodeURIComponent(vstr);
if (!hasOwnProperty(obj, k)) {
obj[k] = v;
} else if (isArray(obj[k])) {
obj[k].push(v);
} else {
obj[k] = [obj[k], v];
}
}
return obj;
};
var isArray = Array.isArray || function (xs) {
return Object.prototype.toString.call(xs) === '[object Array]';
};
},{}],284:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';
var stringifyPrimitive = function(v) {
switch (typeof v) {
case 'string':
return v;
case 'boolean':
return v ? 'true' : 'false';
case 'number':
return isFinite(v) ? v : '';
default:
return '';
}
};
module.exports = function(obj, sep, eq, name) {
sep = sep || '&';
eq = eq || '=';
if (obj === null) {
obj = undefined;
}
if (typeof obj === 'object') {
return map(objectKeys(obj), function(k) {
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
if (isArray(obj[k])) {
return map(obj[k], function(v) {
return ks + encodeURIComponent(stringifyPrimitive(v));
}).join(sep);
} else {
return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
}
}).join(sep);
}
if (!name) return '';
return encodeURIComponent(stringifyPrimitive(name)) + eq +
encodeURIComponent(stringifyPrimitive(obj));
};
var isArray = Array.isArray || function (xs) {
return Object.prototype.toString.call(xs) === '[object Array]';
};
function map (xs, f) {
if (xs.map) return xs.map(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
res.push(f(xs[i], i));
}
return res;
}
var objectKeys = Object.keys || function (obj) {
var res = [];
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
}
return res;
};
},{}],285:[function(require,module,exports){
'use strict';
exports.decode = exports.parse = require('./decode');
exports.encode = exports.stringify = require('./encode');
},{"./decode":283,"./encode":284}],286:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
var punycode = require('punycode');
exports.parse = urlParse;
exports.resolve = urlResolve;
exports.resolveObject = urlResolveObject;
exports.format = urlFormat;
exports.Url = Url;
function Url() {
this.protocol = null;
this.slashes = null;
this.auth = null;
this.host = null;
this.port = null;
this.hostname = null;
this.hash = null;
this.search = null;
this.query = null;
this.pathname = null;
this.path = null;
this.href = null;
}
// Reference: RFC 3986, RFC 1808, RFC 2396
// define these here so at least they only have to be
// compiled once on the first module load.
var protocolPattern = /^([a-z0-9.+-]+:)/i,
portPattern = /:[0-9]*$/,
// RFC 2396: characters reserved for delimiting URLs.
// We actually just auto-escape these.
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
// RFC 2396: characters not allowed for various reasons.
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
// Allowed by RFCs, but cause of XSS attacks. Always escape these.
autoEscape = ['\''].concat(unwise),
// Characters that are never ever allowed in a hostname.
// Note that any invalid chars are also handled, but these
// are the ones that are *expected* to be seen, so we fast-path
// them.
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
hostEndingChars = ['/', '?', '#'],
hostnameMaxLen = 255,
hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/,
hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/,
// protocols that can allow "unsafe" and "unwise" chars.
unsafeProtocol = {
'javascript': true,
'javascript:': true
},
// protocols that never have a hostname.
hostlessProtocol = {
'javascript': true,
'javascript:': true
},
// protocols that always contain a // bit.
slashedProtocol = {
'http': true,
'https': true,
'ftp': true,
'gopher': true,
'file': true,
'http:': true,
'https:': true,
'ftp:': true,
'gopher:': true,
'file:': true
},
querystring = require('querystring');
function urlParse(url, parseQueryString, slashesDenoteHost) {
if (url && isObject(url) && url instanceof Url) return url;
var u = new Url;
u.parse(url, parseQueryString, slashesDenoteHost);
return u;
}
Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
if (!isString(url)) {
throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
}
var rest = url;
// trim before proceeding.
// This is to support parse stuff like " http://foo.com \n"
rest = rest.trim();
var proto = protocolPattern.exec(rest);
if (proto) {
proto = proto[0];
var lowerProto = proto.toLowerCase();
this.protocol = lowerProto;
rest = rest.substr(proto.length);
}
// figure out if it's got a host
// user@server is *always* interpreted as a hostname, and url
// resolution will treat //foo/bar as host=foo,path=bar because that's
// how the browser resolves relative URLs.
if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
var slashes = rest.substr(0, 2) === '//';
if (slashes && !(proto && hostlessProtocol[proto])) {
rest = rest.substr(2);
this.slashes = true;
}
}
if (!hostlessProtocol[proto] &&
(slashes || (proto && !slashedProtocol[proto]))) {
// there's a hostname.
// the first instance of /, ?, ;, or # ends the host.
//
// If there is an @ in the hostname, then non-host chars *are* allowed
// to the left of the last @ sign, unless some host-ending character
// comes *before* the @-sign.
// URLs are obnoxious.
//
// ex:
// http://a@b@c/ => user:a@b host:c
// http://a@b?@c => user:a host:c path:/?@c
// v0.12 TODO(isaacs): This is not quite how Chrome does things.
// Review our test case against browsers more comprehensively.
// find the first instance of any hostEndingChars
var hostEnd = -1;
for (var i = 0; i < hostEndingChars.length; i++) {
var hec = rest.indexOf(hostEndingChars[i]);
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
hostEnd = hec;
}
// at this point, either we have an explicit point where the
// auth portion cannot go past, or the last @ char is the decider.
var auth, atSign;
if (hostEnd === -1) {
// atSign can be anywhere.
atSign = rest.lastIndexOf('@');
} else {
// atSign must be in auth portion.
// http://a@b/c@d => host:b auth:a path:/c@d
atSign = rest.lastIndexOf('@', hostEnd);
}
// Now we have a portion which is definitely the auth.
// Pull that off.
if (atSign !== -1) {
auth = rest.slice(0, atSign);
rest = rest.slice(atSign + 1);
this.auth = decodeURIComponent(auth);
}
// the host is the remaining to the left of the first non-host char
hostEnd = -1;
for (var i = 0; i < nonHostChars.length; i++) {
var hec = rest.indexOf(nonHostChars[i]);
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
hostEnd = hec;
}
// if we still have not hit it, then the entire thing is a host.
if (hostEnd === -1)
hostEnd = rest.length;
this.host = rest.slice(0, hostEnd);
rest = rest.slice(hostEnd);
// pull out port.
this.parseHost();
// we've indicated that there is a hostname,
// so even if it's empty, it has to be present.
this.hostname = this.hostname || '';
// if hostname begins with [ and ends with ]
// assume that it's an IPv6 address.
var ipv6Hostname = this.hostname[0] === '[' &&
this.hostname[this.hostname.length - 1] === ']';
// validate a little.
if (!ipv6Hostname) {
var hostparts = this.hostname.split(/\./);
for (var i = 0, l = hostparts.length; i < l; i++) {
var part = hostparts[i];
if (!part) continue;
if (!part.match(hostnamePartPattern)) {
var newpart = '';
for (var j = 0, k = part.length; j < k; j++) {
if (part.charCodeAt(j) > 127) {
// we replace non-ASCII char with a temporary placeholder
// we need this to make sure size of hostname is not
// broken by replacing non-ASCII by nothing
newpart += 'x';
} else {
newpart += part[j];
}
}
// we test again with ASCII char only
if (!newpart.match(hostnamePartPattern)) {
var validParts = hostparts.slice(0, i);
var notHost = hostparts.slice(i + 1);
var bit = part.match(hostnamePartStart);
if (bit) {
validParts.push(bit[1]);
notHost.unshift(bit[2]);
}
if (notHost.length) {
rest = '/' + notHost.join('.') + rest;
}
this.hostname = validParts.join('.');
break;
}
}
}
}
if (this.hostname.length > hostnameMaxLen) {
this.hostname = '';
} else {
// hostnames are always lower case.
this.hostname = this.hostname.toLowerCase();
}
if (!ipv6Hostname) {
// IDNA Support: Returns a puny coded representation of "domain".
// It only converts the part of the domain name that
// has non ASCII characters. I.e. it dosent matter if
// you call it with a domain that already is in ASCII.
var domainArray = this.hostname.split('.');
var newOut = [];
for (var i = 0; i < domainArray.length; ++i) {
var s = domainArray[i];
newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
'xn--' + punycode.encode(s) : s);
}
this.hostname = newOut.join('.');
}
var p = this.port ? ':' + this.port : '';
var h = this.hostname || '';
this.host = h + p;
this.href += this.host;
// strip [ and ] from the hostname
// the host field still retains them, though
if (ipv6Hostname) {
this.hostname = this.hostname.substr(1, this.hostname.length - 2);
if (rest[0] !== '/') {
rest = '/' + rest;
}
}
}
// now rest is set to the post-host stuff.
// chop off any delim chars.
if (!unsafeProtocol[lowerProto]) {
// First, make 100% sure that any "autoEscape" chars get
// escaped, even if encodeURIComponent doesn't think they
// need to be.
for (var i = 0, l = autoEscape.length; i < l; i++) {
var ae = autoEscape[i];
var esc = encodeURIComponent(ae);
if (esc === ae) {
esc = escape(ae);
}
rest = rest.split(ae).join(esc);
}
}
// chop off from the tail first.
var hash = rest.indexOf('#');
if (hash !== -1) {
// got a fragment string.
this.hash = rest.substr(hash);
rest = rest.slice(0, hash);
}
var qm = rest.indexOf('?');
if (qm !== -1) {
this.search = rest.substr(qm);
this.query = rest.substr(qm + 1);
if (parseQueryString) {
this.query = querystring.parse(this.query);
}
rest = rest.slice(0, qm);
} else if (parseQueryString) {
// no query string, but parseQueryString still requested
this.search = '';
this.query = {};
}
if (rest) this.pathname = rest;
if (slashedProtocol[lowerProto] &&
this.hostname && !this.pathname) {
this.pathname = '/';
}
//to support http.request
if (this.pathname || this.search) {
var p = this.pathname || '';
var s = this.search || '';
this.path = p + s;
}
// finally, reconstruct the href based on what has been validated.
this.href = this.format();
return this;
};
// format a parsed object into a url string
function urlFormat(obj) {
// ensure it's an object, and not a string url.
// If it's an obj, this is a no-op.
// this way, you can call url_format() on strings
// to clean up potentially wonky urls.
if (isString(obj)) obj = urlParse(obj);
if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
return obj.format();
}
Url.prototype.format = function() {
var auth = this.auth || '';
if (auth) {
auth = encodeURIComponent(auth);
auth = auth.replace(/%3A/i, ':');
auth += '@';
}
var protocol = this.protocol || '',
pathname = this.pathname || '',
hash = this.hash || '',
host = false,
query = '';
if (this.host) {
host = auth + this.host;
} else if (this.hostname) {
host = auth + (this.hostname.indexOf(':') === -1 ?
this.hostname :
'[' + this.hostname + ']');
if (this.port) {
host += ':' + this.port;
}
}
if (this.query &&
isObject(this.query) &&
Object.keys(this.query).length) {
query = querystring.stringify(this.query);
}
var search = this.search || (query && ('?' + query)) || '';
if (protocol && protocol.substr(-1) !== ':') protocol += ':';
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
// unless they had them to begin with.
if (this.slashes ||
(!protocol || slashedProtocol[protocol]) && host !== false) {
host = '//' + (host || '');
if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
} else if (!host) {
host = '';
}
if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
if (search && search.charAt(0) !== '?') search = '?' + search;
pathname = pathname.replace(/[?#]/g, function(match) {
return encodeURIComponent(match);
});
search = search.replace('#', '%23');
return protocol + host + pathname + search + hash;
};
function urlResolve(source, relative) {
return urlParse(source, false, true).resolve(relative);
}
Url.prototype.resolve = function(relative) {
return this.resolveObject(urlParse(relative, false, true)).format();
};
function urlResolveObject(source, relative) {
if (!source) return relative;
return urlParse(source, false, true).resolveObject(relative);
}
Url.prototype.resolveObject = function(relative) {
if (isString(relative)) {
var rel = new Url();
rel.parse(relative, false, true);
relative = rel;
}
var result = new Url();
Object.keys(this).forEach(function(k) {
result[k] = this[k];
}, this);
// hash is always overridden, no matter what.
// even href="" will remove it.
result.hash = relative.hash;
// if the relative url is empty, then there's nothing left to do here.
if (relative.href === '') {
result.href = result.format();
return result;
}
// hrefs like //foo/bar always cut to the protocol.
if (relative.slashes && !relative.protocol) {
// take everything except the protocol from relative
Object.keys(relative).forEach(function(k) {
if (k !== 'protocol')
result[k] = relative[k];
});
//urlParse appends trailing / to urls like http://www.example.com
if (slashedProtocol[result.protocol] &&
result.hostname && !result.pathname) {
result.path = result.pathname = '/';
}
result.href = result.format();
return result;
}
if (relative.protocol && relative.protocol !== result.protocol) {
// if it's a known url protocol, then changing
// the protocol does weird things
// first, if it's not file:, then we MUST have a host,
// and if there was a path
// to begin with, then we MUST have a path.
// if it is file:, then the host is dropped,
// because that's known to be hostless.
// anything else is assumed to be absolute.
if (!slashedProtocol[relative.protocol]) {
Object.keys(relative).forEach(function(k) {
result[k] = relative[k];
});
result.href = result.format();
return result;
}
result.protocol = relative.protocol;
if (!relative.host && !hostlessProtocol[relative.protocol]) {
var relPath = (relative.pathname || '').split('/');
while (relPath.length && !(relative.host = relPath.shift()));
if (!relative.host) relative.host = '';
if (!relative.hostname) relative.hostname = '';
if (relPath[0] !== '') relPath.unshift('');
if (relPath.length < 2) relPath.unshift('');
result.pathname = relPath.join('/');
} else {
result.pathname = relative.pathname;
}
result.search = relative.search;
result.query = relative.query;
result.host = relative.host || '';
result.auth = relative.auth;
result.hostname = relative.hostname || relative.host;
result.port = relative.port;
// to support http.request
if (result.pathname || result.search) {
var p = result.pathname || '';
var s = result.search || '';
result.path = p + s;
}
result.slashes = result.slashes || relative.slashes;
result.href = result.format();
return result;
}
var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
isRelAbs = (
relative.host ||
relative.pathname && relative.pathname.charAt(0) === '/'
),
mustEndAbs = (isRelAbs || isSourceAbs ||
(result.host && relative.pathname)),
removeAllDots = mustEndAbs,
srcPath = result.pathname && result.pathname.split('/') || [],
relPath = relative.pathname && relative.pathname.split('/') || [],
psychotic = result.protocol && !slashedProtocol[result.protocol];
// if the url is a non-slashed url, then relative
// links like ../.. should be able
// to crawl up to the hostname, as well. This is strange.
// result.protocol has already been set by now.
// Later on, put the first path part into the host field.
if (psychotic) {
result.hostname = '';
result.port = null;
if (result.host) {
if (srcPath[0] === '') srcPath[0] = result.host;
else srcPath.unshift(result.host);
}
result.host = '';
if (relative.protocol) {
relative.hostname = null;
relative.port = null;
if (relative.host) {
if (relPath[0] === '') relPath[0] = relative.host;
else relPath.unshift(relative.host);
}
relative.host = null;
}
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
}
if (isRelAbs) {
// it's absolute.
result.host = (relative.host || relative.host === '') ?
relative.host : result.host;
result.hostname = (relative.hostname || relative.hostname === '') ?
relative.hostname : result.hostname;
result.search = relative.search;
result.query = relative.query;
srcPath = relPath;
// fall through to the dot-handling below.
} else if (relPath.length) {
// it's relative
// throw away the existing file, and take the new path instead.
if (!srcPath) srcPath = [];
srcPath.pop();
srcPath = srcPath.concat(relPath);
result.search = relative.search;
result.query = relative.query;
} else if (!isNullOrUndefined(relative.search)) {
// just pull out the search.
// like href='?foo'.
// Put this after the other two cases because it simplifies the booleans
if (psychotic) {
result.hostname = result.host = srcPath.shift();
//occationaly the auth can get stuck only in host
//this especialy happens in cases like
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
var authInHost = result.host && result.host.indexOf('@') > 0 ?
result.host.split('@') : false;
if (authInHost) {
result.auth = authInHost.shift();
result.host = result.hostname = authInHost.shift();
}
}
result.search = relative.search;
result.query = relative.query;
//to support http.request
if (!isNull(result.pathname) || !isNull(result.search)) {
result.path = (result.pathname ? result.pathname : '') +
(result.search ? result.search : '');
}
result.href = result.format();
return result;
}
if (!srcPath.length) {
// no path at all. easy.
// we've already handled the other stuff above.
result.pathname = null;
//to support http.request
if (result.search) {
result.path = '/' + result.search;
} else {
result.path = null;
}
result.href = result.format();
return result;
}
// if a url ENDs in . or .., then it must get a trailing slash.
// however, if it ends in anything else non-slashy,
// then it must NOT get a trailing slash.
var last = srcPath.slice(-1)[0];
var hasTrailingSlash = (
(result.host || relative.host) && (last === '.' || last === '..') ||
last === '');
// strip single dots, resolve double dots to parent dir
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = srcPath.length; i >= 0; i--) {
last = srcPath[i];
if (last == '.') {
srcPath.splice(i, 1);
} else if (last === '..') {
srcPath.splice(i, 1);
up++;
} else if (up) {
srcPath.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (!mustEndAbs && !removeAllDots) {
for (; up--; up) {
srcPath.unshift('..');
}
}
if (mustEndAbs && srcPath[0] !== '' &&
(!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
srcPath.unshift('');
}
if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
srcPath.push('');
}
var isAbsolute = srcPath[0] === '' ||
(srcPath[0] && srcPath[0].charAt(0) === '/');
// put the host back
if (psychotic) {
result.hostname = result.host = isAbsolute ? '' :
srcPath.length ? srcPath.shift() : '';
//occationaly the auth can get stuck only in host
//this especialy happens in cases like
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
var authInHost = result.host && result.host.indexOf('@') > 0 ?
result.host.split('@') : false;
if (authInHost) {
result.auth = authInHost.shift();
result.host = result.hostname = authInHost.shift();
}
}
mustEndAbs = mustEndAbs || (result.host && srcPath.length);
if (mustEndAbs && !isAbsolute) {
srcPath.unshift('');
}
if (!srcPath.length) {
result.pathname = null;
result.path = null;
} else {
result.pathname = srcPath.join('/');
}
//to support request.http
if (!isNull(result.pathname) || !isNull(result.search)) {
result.path = (result.pathname ? result.pathname : '') +
(result.search ? result.search : '');
}
result.auth = relative.auth || result.auth;
result.slashes = result.slashes || relative.slashes;
result.href = result.format();
return result;
};
Url.prototype.parseHost = function() {
var host = this.host;
var port = portPattern.exec(host);
if (port) {
port = port[0];
if (port !== ':') {
this.port = port.substr(1);
}
host = host.substr(0, host.length - port.length);
}
if (host) this.hostname = host;
};
function isString(arg) {
return typeof arg === "string";
}
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
function isNull(arg) {
return arg === null;
}
function isNullOrUndefined(arg) {
return arg == null;
}
},{"punycode":282,"querystring":285}],287:[function(require,module,exports){
module.exports = function isBuffer(arg) {
return arg && typeof arg === 'object'
&& typeof arg.copy === 'function'
&& typeof arg.fill === 'function'
&& typeof arg.readUInt8 === 'function';
}
},{}],288:[function(require,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
if (!isString(f)) {
var objects = [];
for (var i = 0; i < arguments.length; i++) {
objects.push(inspect(arguments[i]));
}
return objects.join(' ');
}
var i = 1;
var args = arguments;
var len = args.length;
var str = String(f).replace(formatRegExp, function(x) {
if (x === '%%') return '%';
if (i >= len) return x;
switch (x) {
case '%s': return String(args[i++]);
case '%d': return Number(args[i++]);
case '%j':
try {
return JSON.stringify(args[i++]);
} catch (_) {
return '[Circular]';
}
default:
return x;
}
});
for (var x = args[i]; i < len; x = args[++i]) {
if (isNull(x) || !isObject(x)) {
str += ' ' + x;
} else {
str += ' ' + inspect(x);
}
}
return str;
};
// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
exports.deprecate = function(fn, msg) {
// Allow for deprecating things in the process of starting up.
if (isUndefined(global.process)) {
return function() {
return exports.deprecate(fn, msg).apply(this, arguments);
};
}
if (process.noDeprecation === true) {
return fn;
}
var warned = false;
function deprecated() {
if (!warned) {
if (process.throwDeprecation) {
throw new Error(msg);
} else if (process.traceDeprecation) {
console.trace(msg);
} else {
console.error(msg);
}
warned = true;
}
return fn.apply(this, arguments);
}
return deprecated;
};
var debugs = {};
var debugEnviron;
exports.debuglog = function(set) {
if (isUndefined(debugEnviron))
debugEnviron = process.env.NODE_DEBUG || '';
set = set.toUpperCase();
if (!debugs[set]) {
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
var pid = process.pid;
debugs[set] = function() {
var msg = exports.format.apply(exports, arguments);
console.error('%s %d: %s', set, pid, msg);
};
} else {
debugs[set] = function() {};
}
}
return debugs[set];
};
/**
* Echos the value of a value. Trys to print the value out
* in the best way possible given the different types.
*
* @param {Object} obj The object to print out.
* @param {Object} opts Optional options object that alters the output.
*/
/* legacy: obj, showHidden, depth, colors*/
function inspect(obj, opts) {
// default options
var ctx = {
seen: [],
stylize: stylizeNoColor
};
// legacy...
if (arguments.length >= 3) ctx.depth = arguments[2];
if (arguments.length >= 4) ctx.colors = arguments[3];
if (isBoolean(opts)) {
// legacy...
ctx.showHidden = opts;
} else if (opts) {
// got an "options" object
exports._extend(ctx, opts);
}
// set default options
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
if (isUndefined(ctx.depth)) ctx.depth = 2;
if (isUndefined(ctx.colors)) ctx.colors = false;
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
if (ctx.colors) ctx.stylize = stylizeWithColor;
return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
'bold' : [1, 22],
'italic' : [3, 23],
'underline' : [4, 24],
'inverse' : [7, 27],
'white' : [37, 39],
'grey' : [90, 39],
'black' : [30, 39],
'blue' : [34, 39],
'cyan' : [36, 39],
'green' : [32, 39],
'magenta' : [35, 39],
'red' : [31, 39],
'yellow' : [33, 39]
};
// Don't use 'blue' not visible on cmd.exe
inspect.styles = {
'special': 'cyan',
'number': 'yellow',
'boolean': 'yellow',
'undefined': 'grey',
'null': 'bold',
'string': 'green',
'date': 'magenta',
// "name": intentionally not styling
'regexp': 'red'
};
function stylizeWithColor(str, styleType) {
var style = inspect.styles[styleType];
if (style) {
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
'\u001b[' + inspect.colors[style][1] + 'm';
} else {
return str;
}
}
function stylizeNoColor(str, styleType) {
return str;
}
function arrayToHash(array) {
var hash = {};
array.forEach(function(val, idx) {
hash[val] = true;
});
return hash;
}
function formatValue(ctx, value, recurseTimes) {
// Provide a hook for user-specified inspect functions.
// Check that value is an object with an inspect function on it
if (ctx.customInspect &&
value &&
isFunction(value.inspect) &&
// Filter out the util module, it's inspect function is special
value.inspect !== exports.inspect &&
// Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
var ret = value.inspect(recurseTimes, ctx);
if (!isString(ret)) {
ret = formatValue(ctx, ret, recurseTimes);
}
return ret;
}
// Primitive types cannot have properties
var primitive = formatPrimitive(ctx, value);
if (primitive) {
return primitive;
}
// Look up the keys of the object.
var keys = Object.keys(value);
var visibleKeys = arrayToHash(keys);
if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value);
}
// IE doesn't make error fields non-enumerable
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
if (isError(value)
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
return formatError(value);
}
// Some type of object without properties can be shortcutted.
if (keys.length === 0) {
if (isFunction(value)) {
var name = value.name ? ': ' + value.name : '';
return ctx.stylize('[Function' + name + ']', 'special');
}
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
}
if (isDate(value)) {
return ctx.stylize(Date.prototype.toString.call(value), 'date');
}
if (isError(value)) {
return formatError(value);
}
}
var base = '', array = false, braces = ['{', '}'];
// Make Array say that they are Array
if (isArray(value)) {
array = true;
braces = ['[', ']'];
}
// Make functions say that they are functions
if (isFunction(value)) {
var n = value.name ? ': ' + value.name : '';
base = ' [Function' + n + ']';
}
// Make RegExps say that they are RegExps
if (isRegExp(value)) {
base = ' ' + RegExp.prototype.toString.call(value);
}
// Make dates with properties first say the date
if (isDate(value)) {
base = ' ' + Date.prototype.toUTCString.call(value);
}
// Make error with message first say the error
if (isError(value)) {
base = ' ' + formatError(value);
}
if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}
if (recurseTimes < 0) {
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
} else {
return ctx.stylize('[Object]', 'special');
}
}
ctx.seen.push(value);
var output;
if (array) {
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
} else {
output = keys.map(function(key) {
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
});
}
ctx.seen.pop();
return reduceToSingleString(output, base, braces);
}
function formatPrimitive(ctx, value) {
if (isUndefined(value))
return ctx.stylize('undefined', 'undefined');
if (isString(value)) {
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
.replace(/'/g, "\\'")
.replace(/\\"/g, '"') + '\'';
return ctx.stylize(simple, 'string');
}
if (isNumber(value))
return ctx.stylize('' + value, 'number');
if (isBoolean(value))
return ctx.stylize('' + value, 'boolean');
// For some reason typeof null is "object", so special case here.
if (isNull(value))
return ctx.stylize('null', 'null');
}
function formatError(value) {
return '[' + Error.prototype.toString.call(value) + ']';
}
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
if (hasOwnProperty(value, String(i))) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
String(i), true));
} else {
output.push('');
}
}
keys.forEach(function(key) {
if (!key.match(/^\d+$/)) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
key, true));
}
});
return output;
}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
var name, str, desc;
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
if (desc.get) {
if (desc.set) {
str = ctx.stylize('[Getter/Setter]', 'special');
} else {
str = ctx.stylize('[Getter]', 'special');
}
} else {
if (desc.set) {
str = ctx.stylize('[Setter]', 'special');
}
}
if (!hasOwnProperty(visibleKeys, key)) {
name = '[' + key + ']';
}
if (!str) {
if (ctx.seen.indexOf(desc.value) < 0) {
if (isNull(recurseTimes)) {
str = formatValue(ctx, desc.value, null);
} else {
str = formatValue(ctx, desc.value, recurseTimes - 1);
}
if (str.indexOf('\n') > -1) {
if (array) {
str = str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n').substr(2);
} else {
str = '\n' + str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n');
}
}
} else {
str = ctx.stylize('[Circular]', 'special');
}
}
if (isUndefined(name)) {
if (array && key.match(/^\d+$/)) {
return str;
}
name = JSON.stringify('' + key);
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
name = name.substr(1, name.length - 2);
name = ctx.stylize(name, 'name');
} else {
name = name.replace(/'/g, "\\'")
.replace(/\\"/g, '"')
.replace(/(^"|"$)/g, "'");
name = ctx.stylize(name, 'string');
}
}
return name + ': ' + str;
}
function reduceToSingleString(output, base, braces) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf('\n') >= 0) numLinesEst++;
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
}, 0);
if (length > 60) {
return braces[0] +
(base === '' ? '' : base + '\n ') +
' ' +
output.join(',\n ') +
' ' +
braces[1];
}
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}
// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
function isBoolean(arg) {
return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === 'number';
}
exports.isNumber = isNumber;
function isString(arg) {
return typeof arg === 'string';
}
exports.isString = isString;
function isSymbol(arg) {
return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;
function isRegExp(re) {
return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;
function isDate(d) {
return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;
function isError(e) {
return isObject(e) &&
(objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;
function isFunction(arg) {
return typeof arg === 'function';
}
exports.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null ||
typeof arg === 'boolean' ||
typeof arg === 'number' ||
typeof arg === 'string' ||
typeof arg === 'symbol' || // ES6 symbol
typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;
exports.isBuffer = require('./support/isBuffer');
function objectToString(o) {
return Object.prototype.toString.call(o);
}
function pad(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10);
}
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
'Oct', 'Nov', 'Dec'];
// 26 Feb 16:19:34
function timestamp() {
var d = new Date();
var time = [pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return [d.getDate(), months[d.getMonth()], time].join(' ');
}
// log is just a thin wrapper to console.log that prepends a timestamp
exports.log = function() {
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};
/**
* Inherit the prototype methods from one constructor into another.
*
* The Function.prototype.inherits from lang.js rewritten as a standalone
* function (not on Function.prototype). NOTE: If this file is to be loaded
* during bootstrapping this function needs to be rewritten using some native
* functions as prototype setup using normal JavaScript does not work as
* expected during bootstrapping (see mirror.js in r114903).
*
* @param {function} ctor Constructor function which needs to inherit the
* prototype.
* @param {function} superCtor Constructor function to inherit prototype from.
*/
exports.inherits = require('inherits');
exports._extend = function(origin, add) {
// Don't do anything if add isn't an object
if (!add || !isObject(add)) return origin;
var keys = Object.keys(add);
var i = keys.length;
while (i--) {
origin[keys[i]] = add[keys[i]];
}
return origin;
};
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiJdfQ==
},{"./support/isBuffer":287,"_process":281,"inherits":257}],"hydrolysis":[function(require,module,exports){
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
require("babel-polyfill");
/**
* Static analysis for Polymer.
* @namespace hydrolysis
*/
exports.Analyzer = require('./lib/analyzer').Analyzer;
exports.FSResolver = require('./lib/loader/fs-resolver').FSResolver;
exports.Loader = require('./lib/loader/file-loader').FileLoader;
exports.NoopResolver = require('./lib/loader/noop-resolver').NoopResolver;
exports.RedirectResolver =
require('./lib/loader/redirect-resolver').RedirectResolver;
exports.XHRResolver = require('./lib/loader/xhr-resolver').XHRResolver;
exports.StringResolver = require('./lib/loader/string-resolver').StringResolver;
exports._jsParse = require('./lib/ast-utils/js-parse').jsParse;
exports._importParse = require('./lib/ast-utils/import-parse').importParse;
exports.docs = require('./lib/ast-utils/docs');
exports.jsdoc = require('./lib/ast-utils/jsdoc');
},{"./lib/analyzer":1,"./lib/ast-utils/docs":6,"./lib/ast-utils/import-parse":10,"./lib/ast-utils/js-parse":11,"./lib/ast-utils/jsdoc":12,"./lib/loader/file-loader":14,"./lib/loader/fs-resolver":15,"./lib/loader/noop-resolver":16,"./lib/loader/redirect-resolver":17,"./lib/loader/string-resolver":19,"./lib/loader/xhr-resolver":20,"babel-polyfill":25}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYW5hbHl6ZXIuanMiLCJsaWIvYXN0LXV0aWxzL2FuYWx5emUtcHJvcGVydGllcy5qcyIsImxpYi9hc3QtdXRpbHMvYXN0LXZhbHVlLmpzIiwibGliL2FzdC11dGlscy9iZWhhdmlvci1maW5kZXIuanMiLCJsaWIvYXN0LXV0aWxzL2RlY2xhcmF0aW9uLXByb3BlcnR5LWhhbmRsZXJzLmpzIiwibGliL2FzdC11dGlscy9kb2NzLmpzIiwibGliL2FzdC11dGlscy9lbGVtZW50LWZpbmRlci5qcyIsImxpYi9hc3QtdXRpbHMvZXN1dGlsLmpzIiwibGliL2FzdC11dGlscy9mZWF0dXJlLWZpbmRlci5qcyIsImxpYi9hc3QtdXRpbHMvaW1wb3J0LXBhcnNlLmpzIiwibGliL2FzdC11dGlscy9qcy1wYXJzZS5qcyIsImxpYi9hc3QtdXRpbHMvanNkb2MuanMiLCJsaWIvbG9hZGVyL2Vycm9yLXN3YWxsb3dpbmctZnMtcmVzb2x2ZXIuanMiLCJsaWIvbG9hZGVyL2ZpbGUtbG9hZGVyLmpzIiwibGliL2xvYWRlci9mcy1yZXNvbHZlci5qcyIsImxpYi9sb2FkZXIvbm9vcC1yZXNvbHZlci5qcyIsImxpYi9sb2FkZXIvcmVkaXJlY3QtcmVzb2x2ZXIuanMiLCJsaWIvbG9hZGVyL3Jlc29sdmVyLmpzIiwibGliL2xvYWRlci9zdHJpbmctcmVzb2x2ZXIuanMiLCJsaWIvbG9hZGVyL3hoci1yZXNvbHZlci5qcyIsIm5vZGVfbW9kdWxlcy9hY29ybi1qc3gvaW5qZWN0LmpzIiwibm9kZV9tb2R1bGVzL2Fjb3JuLWpzeC94aHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9hbWRlZmluZS9hbWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9saWIvX2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2xvbmUvY2xvbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmFycmF5LWNvcHktd2l0aGluLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmFycmF5LWZpbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuYXJyYXktbWV0aG9kcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmNvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuY29sbGVjdGlvbi13ZWFrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmNvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmVudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5leHBvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZmFpbHMtaXMtcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmZpeC1yZS13a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZmxhZ3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmdldC1uYW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmhpZGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pbnZva2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmlzLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmlzLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmlzLXJlZ2V4cC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXRlci1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLml0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5rZXlvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLm1hdGgtZXhwbTEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQubWF0aC1sb2cxcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5tYXRoLXNpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQubWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLm9iamVjdC1hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQub2JqZWN0LXNhcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3QtdG8tYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQub3duLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQucGFydGlhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5wYXRoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnByb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQucmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnJlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnJlcGxhY2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNhbWUtdmFsdWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnN0cmljdC1uZXcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnN0cmluZy1jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnN0cmluZy1wYWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLXJlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctdHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC50YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQudG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC50by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQudG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC51aWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQud2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2JydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNvc2guanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxMC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRhbmguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRydW5jLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnNldC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmF3LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLXNldC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZ2V4cC5lc2NhcGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtbGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtcmlnaHQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2pzLmFycmF5LnN0YXRpY3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9zaGltLmpzIiwibm9kZV9tb2R1bGVzL2RvY3RyaW5lL2xpYi9kb2N0cmluZS5qcyIsIm5vZGVfbW9kdWxlcy9kb2N0cmluZS9saWIvdHlwZWQuanMiLCJub2RlX21vZHVsZXMvZG9jdHJpbmUvbGliL3V0aWxpdHkuanMiLCJub2RlX21vZHVsZXMvZG9jdHJpbmUvbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2FzdC5qcyIsIm5vZGVfbW9kdWxlcy9kb2N0cmluZS9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9kb2N0cmluZS9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIva2V5d29yZC5qcyIsIm5vZGVfbW9kdWxlcy9kb2N0cmluZS9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvZG9jdHJpbmUvcGFja2FnZS5qc29uIiwibm9kZV9tb2R1bGVzL2RvbTUvZG9tNS5qcyIsIm5vZGVfbW9kdWxlcy9lc2NvZGVnZW4vZXNjb2RlZ2VuLmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvZXN0cmF2ZXJzZS9lc3RyYXZlcnNlLmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9lc2NvZGVnZW4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvYXJyYXktc2V0LmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iYXNlNjQtdmxxLmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iYXNlNjQuanMiLCJub2RlX21vZHVsZXMvZXNjb2RlZ2VuL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2Jhc2ljLXNvdXJjZS1tYXAtY29uc3VtZXIuanMiLCJub2RlX21vZHVsZXMvZXNjb2RlZ2VuL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2JpbmFyeS1zZWFyY2guanMiLCJub2RlX21vZHVsZXMvZXNjb2RlZ2VuL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2luZGV4ZWQtc291cmNlLW1hcC1jb25zdW1lci5qcyIsIm5vZGVfbW9kdWxlcy9lc2NvZGVnZW4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvbWFwcGluZy1saXN0LmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwibm9kZV9tb2R1bGVzL2VzY29kZWdlbi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9lc2NvZGVnZW4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW5vZGUuanMiLCJub2RlX21vZHVsZXMvZXNjb2RlZ2VuL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL3V0aWwuanMiLCJub2RlX21vZHVsZXMvZXNjb2RlZ2VuL3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9lc3ByZWUvZXNwcmVlLmpzIiwibm9kZV9tb2R1bGVzL2VzcHJlZS9saWIvYXN0LW5vZGUtdHlwZXMuanMiLCJub2RlX21vZHVsZXMvZXNwcmVlL2xpYi9jb21tZW50LWF0dGFjaG1lbnQuanMiLCJub2RlX21vZHVsZXMvZXNwcmVlL2xpYi90b2tlbi10cmFuc2xhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2VzcHJlZS9saWIvdmlzaXRvci1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2VzcHJlZS9ub2RlX21vZHVsZXMvYWNvcm4vZGlzdC9hY29ybi5qcyIsIm5vZGVfbW9kdWxlcy9lc3ByZWUvcGFja2FnZS5qc29uIiwibm9kZV9tb2R1bGVzL2VzdHJhdmVyc2UvZXN0cmF2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9lc3RyYXZlcnNlL3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9lc3V0aWxzL2xpYi9jb2RlLmpzIiwibm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2tleXdvcmQuanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvY29tbW9uL2RvY3R5cGUuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9jb21tb24vZm9yZWlnbl9jb250ZW50LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvY29tbW9uL2h0bWwuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9jb21tb24vdW5pY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2NvbW1vbi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2pzZG9tL2pzZG9tX3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2pzZG9tL3BhcnNpbmdfdW5pdC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3NlcmlhbGl6YXRpb24vc2VyaWFsaXplci5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3NpbXBsZV9hcGkvc2ltcGxlX2FwaV9wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9zaW1wbGVfYXBpL3Rva2VuaXplcl9wcm94eS5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3Rva2VuaXphdGlvbi9sb2NhdGlvbl9pbmZvX21peGluLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdG9rZW5pemF0aW9uL25hbWVkX2VudGl0eV90cmllLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdG9rZW5pemF0aW9uL3ByZXByb2Nlc3Nvci5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3Rva2VuaXphdGlvbi90b2tlbml6ZXIuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi90cmVlX2FkYXB0ZXJzL2RlZmF1bHQuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi90cmVlX2FkYXB0ZXJzL2h0bWxwYXJzZXIyLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdHJlZV9jb25zdHJ1Y3Rpb24vZm9ybWF0dGluZ19lbGVtZW50X2xpc3QuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi90cmVlX2NvbnN0cnVjdGlvbi9sb2NhdGlvbl9pbmZvX21peGluLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdHJlZV9jb25zdHJ1Y3Rpb24vb3Blbl9lbGVtZW50X3N0YWNrLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdHJlZV9jb25zdHJ1Y3Rpb24vcGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91cmwvdXJsLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwiaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2phQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9nREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTs7QUNGQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN3VDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFpRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzcwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNseUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDejBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3d0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzd0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX19hd2FpdGVyID0gdW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci50aHJvdyh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMpKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBkb201ID0gcmVxdWlyZSgnZG9tNScpO1xudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpO1xudmFyIGRvY3MgPSByZXF1aXJlKCcuL2FzdC11dGlscy9kb2NzJyk7XG52YXIgZmlsZV9sb2FkZXJfMSA9IHJlcXVpcmUoJy4vbG9hZGVyL2ZpbGUtbG9hZGVyJyk7XG52YXIgaW1wb3J0X3BhcnNlXzEgPSByZXF1aXJlKCcuL2FzdC11dGlscy9pbXBvcnQtcGFyc2UnKTtcbnZhciBqc19wYXJzZV8xID0gcmVxdWlyZSgnLi9hc3QtdXRpbHMvanMtcGFyc2UnKTtcbnZhciBub29wX3Jlc29sdmVyXzEgPSByZXF1aXJlKCcuL2xvYWRlci9ub29wLXJlc29sdmVyJyk7XG52YXIgc3RyaW5nX3Jlc29sdmVyXzEgPSByZXF1aXJlKCcuL2xvYWRlci9zdHJpbmctcmVzb2x2ZXInKTtcbnZhciBmc19yZXNvbHZlcl8xID0gcmVxdWlyZSgnLi9sb2FkZXIvZnMtcmVzb2x2ZXInKTtcbnZhciB4aHJfcmVzb2x2ZXJfMSA9IHJlcXVpcmUoJy4vbG9hZGVyL3hoci1yZXNvbHZlcicpO1xudmFyIGVycm9yX3N3YWxsb3dpbmdfZnNfcmVzb2x2ZXJfMSA9IHJlcXVpcmUoJy4vbG9hZGVyL2Vycm9yLXN3YWxsb3dpbmctZnMtcmVzb2x2ZXInKTtcbmZ1bmN0aW9uIHJlZHVjZU1ldGFkYXRhKG0xLCBtMikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRzOiBtMS5lbGVtZW50cy5jb25jYXQobTIuZWxlbWVudHMpLFxuICAgICAgICBmZWF0dXJlczogbTEuZmVhdHVyZXMuY29uY2F0KG0yLmZlYXR1cmVzKSxcbiAgICAgICAgYmVoYXZpb3JzOiBtMS5iZWhhdmlvcnMuY29uY2F0KG0yLmJlaGF2aW9ycylcbiAgICB9O1xufVxudmFyIEVNUFRZX01FVEFEQVRBID0geyBlbGVtZW50czogW10sIGZlYXR1cmVzOiBbXSwgYmVoYXZpb3JzOiBbXSB9O1xuLyoqXG4gKiBBIGRhdGFiYXNlIG9mIFBvbHltZXIgbWV0YWRhdGEgZGVmaW5lZCBpbiBIVE1MXG4gKi9cblxudmFyIEFuYWx5emVyID0gZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59IGF0dGFjaEFTVCAgSWYgdHJ1ZSwgYXR0YWNoIGEgcGFyc2U1IGNvbXBsaWFudCBBU1RcbiAgICAgKiBAcGFyYW0gIHtGaWxlTG9hZGVyPX0gbG9hZGVyIEFuIG9wdGlvbmFsIGBGaWxlTG9hZGVyYCB1c2VkIHRvIGxvYWQgZXh0ZXJuYWxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlc1xuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gQW5hbHl6ZXIoYXR0YWNoQVNULCBsb2FkZXIpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuYWx5emVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIGFsbCBlbGVtZW50cyB0aGUgYEFuYWx5emVyYCBoYXMgbWV0YWRhdGEgZm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSB2aWV3IGludG8gYGVsZW1lbnRzYCwga2V5ZWQgYnkgdGFnIG5hbWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsZW1lbnRzQnlUYWdOYW1lID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgQVBJIGZlYXR1cmVzIGFkZGVkIHRvIGBQb2x5bWVyLkJhc2VgIGVuY291bnRlcmVkIGJ5IHRoZVxuICAgICAgICAgKiBhbmFseXplci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiZWhhdmlvcnMgY29sbGVjdGVkIGJ5IHRoZSBhbmFseXNpcyBwYXNzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iZWhhdmlvcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiZWhhdmlvcnMgY29sbGVjdGVkIGJ5IHRoZSBhbmFseXNpcyBwYXNzIGJ5IG5hbWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJlaGF2aW9yc0J5TmFtZSA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAsIGtleWVkIGJ5IGFic29sdXRlIHBhdGgsIG9mIERvY3VtZW50IG1ldGFkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5odG1sID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIG1hcCwga2V5ZWQgYnkgcGF0aCwgb2YgSFRNTCBkb2N1bWVudCBBU1RzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wYXJzZWREb2N1bWVudHMgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbWFwLCBrZXllZCBieSBwYXRoLCBvZiBKUyBzY3JpcHQgQVNUcy5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIHBhdGggaXMgYW4gSFRNTCBmaWxlIHdpdGggbXVsdGlwbGUgc2NyaXB0cyxcbiAgICAgICAgICogdGhlIGVudHJ5IHdpbGwgYmUgYW4gYXJyYXkgb2Ygc2NyaXB0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyc2VkU2NyaXB0cyA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAsIGtleWVkIGJ5IHBhdGgsIG9mIGRvY3VtZW50IGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jb250ZW50ID0ge307XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhBbmFseXplciwgW3tcbiAgICAgICAga2V5OiAnbG9hZCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKGhyZWYpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5yZXF1ZXN0KGhyZWYpLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb250ZW50W2hyZWZdID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3BhcnNlSFRNTChjb250ZW50LCBocmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHByb2Nlc3NpbmcgZG9jdW1lbnQgYXQgXCIgKyBocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19wYXJzZUhUTUwnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGFuIGBBbmFseXplZERvY3VtZW50YCByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkIGRvY3VtZW50XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSAge3N0cmluZ30gaHRtbEltcG9ydCBSYXcgdGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50XG4gICAgICAgICAqIEBwYXJhbSAge3N0cmluZ30gaHJlZiAgICAgICBUaGUgZG9jdW1lbnQncyBVUkwuXG4gICAgICAgICAqIEByZXR1cm4ge0FuYWx5emVkRG9jdW1lbnR9ICAgICAgIEFuICBgQW5hbHl6ZWREb2N1bWVudGBcbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFyc2VIVE1MKGh0bWxJbXBvcnQsIGhyZWYpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICBpZiAoaHJlZiBpbiB0aGlzLmh0bWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odG1sW2hyZWZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlcHNMb2FkZWQgPSBbXTtcbiAgICAgICAgICAgIHZhciBkZXBIcmVmcyA9IFtdO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTG9hZGVkID0gUHJvbWlzZS5yZXNvbHZlKEVNUFRZX01FVEFEQVRBKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IGltcG9ydF9wYXJzZV8xLmltcG9ydFBhcnNlKGh0bWxJbXBvcnQsIGhyZWYpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyEnKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaHRtbExvYWRlZCA9IFByb21pc2UucmVzb2x2ZShwYXJzZWQpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YUxvYWRlZCA9IHRoaXMuX3Byb2Nlc3NTY3JpcHRzKHBhcnNlZC5zY3JpcHQsIGhyZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbW1lbnRUZXh0ID0gcGFyc2VkLmNvbW1lbnQubWFwKGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbTUuZ2V0VGV4dENvbnRlbnQoY29tbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBwc2V1ZG9FbGVtZW50cyA9IGRvY3MucGFyc2VQc2V1ZG9FbGVtZW50cyhjb21tZW50VGV4dCk7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBwc2V1ZG9FbGVtZW50c1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRlbnRIcmVmID0gaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzQnlUYWdOYW1lW2VsZW1lbnQuaXNdID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRhZGF0YUxvYWRlZCA9IG1ldGFkYXRhTG9hZGVkLnRoZW4oZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBwc2V1ZG9FbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcnM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW21ldGFkYXRhLCBtZXRhZGF0YUVudHJ5XS5yZWR1Y2UocmVkdWNlTWV0YWRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXBzTG9hZGVkLnB1c2gobWV0YWRhdGFMb2FkZWQpO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBocmVmO1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuYmFzZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJPbmx5IG9uZSBiYXNlIHRhZyBwZXIgZG9jdW1lbnQhXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIk11bHRpcGxlIGJhc2UgdGFncyBpbiBcIiArIGhyZWY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZWQuYmFzZS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZUhyZWYgPSBkb201LmdldEF0dHJpYnV0ZShwYXJzZWQuYmFzZVswXSwgXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUhyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VIcmVmID0gYmFzZUhyZWYgKyBcIi9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmkgPSB1cmwucmVzb2x2ZShiYXNlVXJpLCBiYXNlSHJlZik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMiA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBwYXJzZWQuaW1wb3J0W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGluayA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmt1cmwgPSBkb201LmdldEF0dHJpYnV0ZShsaW5rLCAnaHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmt1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRVcmwgPSB1cmwucmVzb2x2ZShiYXNlVXJpLCBsaW5rdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBIcmVmcy5wdXNoKHJlc29sdmVkVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzTG9hZGVkLnB1c2godGhpcy5fZGVwZW5kZW5jaWVzTG9hZGVkRm9yKHJlc29sdmVkVXJsLCBocmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IHBhcnNlZC5zdHlsZVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IChfc3RlcDMgPSBfaXRlcmF0b3IzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlRWxlbWVudCA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHltZXJFeHRlcm5hbFN0eWxlKHN0eWxlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVIcmVmID0gZG9tNS5nZXRBdHRyaWJ1dGUoc3R5bGVFbGVtZW50LCAnaHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSHJlZiA9IHVybC5yZXNvbHZlKGJhc2VVcmksIHN0eWxlSHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHNMb2FkZWQucHVzaCh0aGlzLmxvYWRlci5yZXF1ZXN0KHN0eWxlSHJlZikudGhlbihmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9jb250ZW50W3N0eWxlSHJlZl0gPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMyA9IGVycjtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyAmJiBfaXRlcmF0b3IzLnJldHVybikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjMucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlcHNTdHJMb2FkZWQgPSBQcm9taXNlLmFsbChkZXBzTG9hZGVkKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwSHJlZnM7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZERvY3VtZW50c1tocmVmXSA9IHBhcnNlZC5hc3Q7XG4gICAgICAgICAgICB0aGlzLmh0bWxbaHJlZl0gPSB7XG4gICAgICAgICAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgICAgICAgICBodG1sTG9hZGVkOiBodG1sTG9hZGVkLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhTG9hZGVkOiBtZXRhZGF0YUxvYWRlZCxcbiAgICAgICAgICAgICAgICBkZXBIcmVmczogZGVwSHJlZnMsXG4gICAgICAgICAgICAgICAgZGVwc0xvYWRlZDogZGVwc1N0ckxvYWRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0bWxbaHJlZl07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19wcm9jZXNzU2NyaXB0cycsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc1NjcmlwdHMoc2NyaXB0cywgaHJlZikge1xuICAgICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHZhciBzY3JpcHRQcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgc2NyaXB0cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRQcm9taXNlcy5wdXNoKF90aGlzMy5fcHJvY2Vzc1NjcmlwdChzY3JpcHQsIGhyZWYpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHNjcmlwdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChtZXRhZGF0YUxpc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGFqbykgcmVtb3ZlIHRoaXMgY2FzdC5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IG1ldGFkYXRhTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC5yZWR1Y2UocmVkdWNlTWV0YWRhdGEsIEVNUFRZX01FVEFEQVRBKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdfcHJvY2Vzc1NjcmlwdCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc1NjcmlwdChzY3JpcHQsIGhyZWYpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAgICAgICB2YXIgc3JjID0gZG9tNS5nZXRBdHRyaWJ1dGUoc2NyaXB0LCAnc3JjJyk7XG4gICAgICAgICAgICB2YXIgcGFyc2VkSnM7XG4gICAgICAgICAgICBpZiAoIXNyYykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZEpzID0ganNfcGFyc2VfMS5qc1BhcnNlKHNjcmlwdC5jaGlsZE5vZGVzLmxlbmd0aCA/IHNjcmlwdC5jaGlsZE5vZGVzWzBdLnZhbHVlIDogJycpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGxpbmUgbnVtYmVyIGZvciB0aGUgZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHQuX19vd25lckRvY3VtZW50ICYmIHNjcmlwdC5fX293bmVyRG9jdW1lbnQgPT0gaHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNjcmlwdC5fX2xvY2F0aW9uRGV0YWlsLmxpbmUgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gc2NyaXB0Ll9fbG9jYXRpb25EZXRhaWwuY29sdW1uIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGVyci5saW5lTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBjb2wgKz0gZXJyLmNvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIkVycm9yIHBhcnNpbmcgc2NyaXB0IGluIFwiICsgaHJlZiArIFwiIGF0IFwiICsgbGluZSArIFwiOlwiICsgY29sO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFwiXFxuXCIgKyBlcnIuc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaXhlZEVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgZml4ZWRFcnIubG9jYXRpb24gPSB7IGxpbmU6IGxpbmUsIGNvbHVtbjogY29sIH07XG4gICAgICAgICAgICAgICAgICAgIGZpeGVkRXJyLm93bmVyRG9jdW1lbnQgPSBzY3JpcHQuX19vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZml4ZWRFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSnMuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSnMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JpcHRFbGVtZW50ID0gc2NyaXB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250ZW50SHJlZiA9IGhyZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzIGluIF90aGlzNC5lbGVtZW50c0J5VGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSWdub3JpbmcgZHVwbGljYXRlIGVsZW1lbnQgZGVmaW5pdGlvbjogJyArIGVsZW1lbnQuaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuZWxlbWVudHNCeVRhZ05hbWVbZWxlbWVudC5pc10gPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZEpzLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZEpzLmZlYXR1cmVzLmZvckVhY2goZnVuY3Rpb24gKGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuY29udGVudEhyZWYgPSBocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5zY3JpcHRFbGVtZW50ID0gc2NyaXB0O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXMuY29uY2F0KHBhcnNlZEpzLmZlYXR1cmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZEpzLmJlaGF2aW9ycykge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRKcy5iZWhhdmlvcnMuZm9yRWFjaChmdW5jdGlvbiAoYmVoYXZpb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLmNvbnRlbnRIcmVmID0gaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5iZWhhdmlvcnNCeU5hbWVbYmVoYXZpb3IuaXNdID0gYmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuYmVoYXZpb3JzQnlOYW1lW2JlaGF2aW9yLnN5bWJvbF0gPSBiZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmVoYXZpb3JzID0gdGhpcy5iZWhhdmlvcnMuY29uY2F0KHBhcnNlZEpzLmJlaGF2aW9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGhpcy5wYXJzZWRTY3JpcHRzLCBocmVmKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFNjcmlwdHNbaHJlZl0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdC5fX293bmVyRG9jdW1lbnQgJiYgc2NyaXB0Ll9fb3duZXJEb2N1bWVudCA9PSBocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQgPSBzY3JpcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkU2NyaXB0c1tocmVmXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYXN0OiBwYXJzZWRKcy5wYXJzZWRTY3JpcHQsXG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQ6IHNjcmlwdEVsZW1lbnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhcnNlZEpzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxvYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNyYyA9IHVybC5yZXNvbHZlKGhyZWYsIHNyYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLnJlcXVlc3QocmVzb2x2ZWRTcmMpLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXM0Ll9jb250ZW50W3Jlc29sdmVkU3JjXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRUZXh0ID0gZG9tNS5jb25zdHJ1Y3RvcnMudGV4dChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZG9tNS5hcHBlbmQoc2NyaXB0LCBzY3JpcHRUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgZG9tNS5yZW1vdmVBdHRyaWJ1dGUoc2NyaXB0LCAnc3JjJyk7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5fX2h5ZHJvbHlzaXNJbmxpbmVkID0gc3JjO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9wcm9jZXNzU2NyaXB0KHNjcmlwdCwgcmVzb2x2ZWRTcmMpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEVNUFRZX01FVEFEQVRBKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2RlcGVuZGVuY2llc0xvYWRlZEZvcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVwZW5kZW5jaWVzTG9hZGVkRm9yKGhyZWYsIHJvb3QpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICAgICAgICB2YXIgZm91bmQgPSB7fTtcbiAgICAgICAgICAgIGlmIChyb290ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFtyb290XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RGVwZW5kZW5jaWVzKGhyZWYsIGZvdW5kKS50aGVuKGZ1bmN0aW9uIChkZXBzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlcFByb21pc2VzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcEhyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5sb2FkKGRlcEhyZWYpLnRoZW4oZnVuY3Rpb24gKGh0bWxNb25vbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbE1vbm9tZXIubWV0YWRhdGFMb2FkZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChkZXBQcm9taXNlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldERlcGVuZGVuY2llcycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHRoZSBodG1sIGRlcGVuZGVuY2llcyBmb3IgdGhlIGRvY3VtZW50IGF0IGBocmVmYC5cbiAgICAgICAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICBocmVmICAgICAgVGhlIGhyZWYgdG8gZ2V0IGRlcGVuZGVuY2llcyBmb3IuXG4gICAgICAgICAqIEBwYXJhbSAge09iamVjdC48c3RyaW5nLGJvb2xlYW4+PX0gZm91bmQgICAgIEFuIG9iamVjdCBrZXllZCBieSBVUkwgb2YgdGhlXG4gICAgICAgICAqICAgICBhbHJlYWR5IHJlc29sdmVkIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICogQHBhcmFtICB7Ym9vbGVhbj19ICAgICAgICAgICAgICAgIHRyYW5zaXRpdmUgV2hldGhlciB0byBsb2FkIHRyYW5zaXRpdmVcbiAgICAgICAgICogICAgIGRlcGVuZGVuY2llcy4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICAgICAgICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59ICBBIGxpc3Qgb2YgYWxsIHRoZSBodG1sIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0RGVwZW5kZW5jaWVzKGhyZWYsIGZvdW5kLCB0cmFuc2l0aXZlKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgICAgICAgaWYgKGZvdW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvdW5kW2hyZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2l0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkZXBzID0gW107XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGhyZWYpLnRoZW4oZnVuY3Rpb24gKGh0bWxNb25vbWVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zaXRpdmVEZXBzID0gW107XG4gICAgICAgICAgICAgICAgaHRtbE1vbm9tZXIuZGVwSHJlZnMuZm9yRWFjaChmdW5jdGlvbiAoZGVwSHJlZikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRbZGVwSHJlZl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwSHJlZik7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kW2RlcEhyZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zaXRpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpdmVEZXBzLnB1c2goX3RoaXM2Ll9nZXREZXBlbmRlbmNpZXMoZGVwSHJlZiwgZm91bmQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0cmFuc2l0aXZlRGVwcyk7XG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh0cmFuc2l0aXZlRGVwcykge1xuICAgICAgICAgICAgICAgIHZhciBhbGxkZXBzID0gdHJhbnNpdGl2ZURlcHMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgICAgICAgICAgICB9LCBbXSkuY29uY2F0KGRlcHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhbGxkZXBzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2VsZW1lbnRzRm9yRm9sZGVyJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYGhyZWZgLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBwYXRoIHRvIHNlYXJjaC5cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbGVtZW50c0ZvckZvbGRlcihocmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc0RvY3VtZW50Rm9sZGVyKGVsZW1lbnQsIGhyZWYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2JlaGF2aW9yc0ZvckZvbGRlcicsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGJlaGF2aW9ycyBkZWZpbmVkIGluIHRoZSBmb2xkZXIgY29udGFpbmluZyBgaHJlZmAuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIHBhdGggdG8gc2VhcmNoLlxuICAgICAgICAgKiBAcmV0dXJuIHtBcnJheS48QmVoYXZpb3JEZXNjcmlwdG9yPn1cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBiZWhhdmlvcnNGb3JGb2xkZXIoaHJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3JzLmZpbHRlcihmdW5jdGlvbiAoYmVoYXZpb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc0RvY3VtZW50Rm9sZGVyKGJlaGF2aW9yLCBocmVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdtZXRhZGF0YVRyZWUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgUE9KTyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW1wb3J0XG4gICAgICAgICAqIHRyZWUsIGluIGEgZm9ybWF0IHRoYXQgbWFpbnRhaW5zIHRoZSBvcmRlcmluZyBvZiB0aGUgSFRNTCBpbXBvcnRzIHNwZWMuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIHRoZSBpbXBvcnQgdG8gZ2V0IG1ldGFkYXRhIGZvci5cbiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBtZXRhZGF0YVRyZWUoaHJlZikge1xuICAgICAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQoaHJlZikudGhlbihmdW5jdGlvbiAobW9ub21lcikge1xuICAgICAgICAgICAgICAgIHZhciBsb2FkZWRIcmVmcyA9IHt9O1xuICAgICAgICAgICAgICAgIGxvYWRlZEhyZWZzW2hyZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9tZXRhZGF0YVRyZWUobW9ub21lciwgbG9hZGVkSHJlZnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19tZXRhZGF0YVRyZWUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX21ldGFkYXRhVHJlZShodG1sTW9ub21lciwgbG9hZGVkSHJlZnMpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhLCBocmVmcywgZGVwTWV0YWRhdGEsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240LCBfZGlkSXRlcmF0b3JFcnJvcjQsIF9pdGVyYXRvckVycm9yNCwgX2l0ZXJhdG9yNCwgX3N0ZXA0LCBocmVmLCBtZXRhZGF0YVByb21pc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRIcmVmcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRIcmVmcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbE1vbm9tZXIubWV0YWRhdGFMb2FkZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBtZXRhZGF0YS5lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBtZXRhZGF0YS5mZWF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBodG1sTW9ub21lci5ocmVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbE1vbm9tZXIuZGVwc0xvYWRlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZnMgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNZXRhZGF0YSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yNCA9IGhyZWZzW1N5bWJvbC5pdGVyYXRvcl0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IChfc3RlcDQgPSBfaXRlcmF0b3I0Lm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb21pc2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZEhyZWZzW2hyZWZdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZEhyZWZzW2hyZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9taXNlID0gdGhpcy5fbWV0YWRhdGFUcmVlKHRoaXMuaHRtbFtocmVmXSwgbG9hZGVkSHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb21pc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1ldGFkYXRhLnB1c2gobWV0YWRhdGFQcm9taXNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbJ2NhdGNoJ10oMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjQgPSBfY29udGV4dC50MDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM2O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgJiYgX2l0ZXJhdG9yNC5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjQucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzODtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDM4KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgncmV0dXJuJywgUHJvbWlzZS5hbGwoZGVwTWV0YWRhdGEpLnRoZW4oZnVuY3Rpb24gKGltcG9ydE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGFqbyk6IHJlbW92ZSB0aGlzIHdoZW4gdHNjIHN0b3BzIGhhdmluZyBpc3N1ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5pbXBvcnRzID0gaW1wb3J0TWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbE1vbm9tZXIuaHRtbExvYWRlZC50aGVuKGZ1bmN0aW9uIChwYXJzZWRIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuaHRtbCA9IHBhcnNlZEh0bWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaERvbU1vZHVsZShwYXJzZWRIdG1sLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzEyLCAzMSwgMzUsIDQzXSwgWzM2LCwgMzgsIDQyXV0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdfaW5saW5lU3R5bGVzJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbmxpbmVTdHlsZXMoYXN0LCBocmVmKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGNzc0xpbmtzID0gZG9tNS5xdWVyeUFsbChhc3QsIHBvbHltZXJFeHRlcm5hbFN0eWxlKTtcbiAgICAgICAgICAgIGNzc0xpbmtzLmZvckVhY2goZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlua0hyZWYgPSBkb201LmdldEF0dHJpYnV0ZShsaW5rLCAnaHJlZicpO1xuICAgICAgICAgICAgICAgIHZhciB1cmkgPSB1cmwucmVzb2x2ZShocmVmLCBsaW5rSHJlZik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBfdGhpczguX2NvbnRlbnRbdXJpXTtcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBkb201LmNvbnN0cnVjdG9ycy5lbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIGRvbTUuc2V0VGV4dENvbnRlbnQoc3R5bGUsICdcXG4nICsgY29udGVudCArICdcXG4nKTtcbiAgICAgICAgICAgICAgICBkb201LnJlcGxhY2UobGluaywgc3R5bGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY3NzTGlua3MubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2lubGluZVNjcmlwdHMnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2lubGluZVNjcmlwdHMoYXN0LCBocmVmKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSBkb201LnF1ZXJ5QWxsKGFzdCwgZXh0ZXJuYWxTY3JpcHQpO1xuICAgICAgICAgICAgc2NyaXB0cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JpcHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0SHJlZiA9IGRvbTUuZ2V0QXR0cmlidXRlKHNjcmlwdCwgJ3NyYycpO1xuICAgICAgICAgICAgICAgIHZhciB1cmkgPSB1cmwucmVzb2x2ZShocmVmLCBzY3JpcHRIcmVmKTtcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IF90aGlzOS5fY29udGVudFt1cmldO1xuICAgICAgICAgICAgICAgIHZhciBpbmxpbmVkID0gZG9tNS5jb25zdHJ1Y3RvcnMuZWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgZG9tNS5zZXRUZXh0Q29udGVudChpbmxpbmVkLCAnXFxuJyArIGNvbnRlbnQgKyAnXFxuJyk7XG4gICAgICAgICAgICAgICAgZG9tNS5yZXBsYWNlKHNjcmlwdCwgaW5saW5lZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzY3JpcHRzLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19pbmxpbmVJbXBvcnRzJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbmxpbmVJbXBvcnRzKGFzdCwgaHJlZiwgbG9hZGVkKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHZhciBpbXBvcnRzID0gZG9tNS5xdWVyeUFsbChhc3QsIGlzSHRtbEltcG9ydE5vZGUpO1xuICAgICAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGZ1bmN0aW9uIChodG1sSW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGltcG9ydEhyZWYgPSBkb201LmdldEF0dHJpYnV0ZShodG1sSW1wb3J0LCAnaHJlZicpO1xuICAgICAgICAgICAgICAgIHZhciB1cmkgPSB1cmwucmVzb2x2ZShocmVmLCBpbXBvcnRIcmVmKTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVkW3VyaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tNS5yZW1vdmUoaHRtbEltcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBfdGhpczEwLmdldExvYWRlZEFzdCh1cmksIGxvYWRlZCk7XG4gICAgICAgICAgICAgICAgZG9tNS5yZXBsYWNlKGh0bWxJbXBvcnQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0cy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdnZXRMb2FkZWRBc3QnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gYSBmb3JtIG9mIHRoZSBBU1Qgd2l0aCBhbGwgbGlua3MgcmVwbGFjZWRcbiAgICAgICAgICogd2l0aCB0aGUgZG9jdW1lbnQgdGhleSBsaW5rIHRvLiAuY3NzIGFuZCAuc2NyaXB0IGZpbGVzIGJlY29tZSAmbHQ7c3R5bGUmZ3Q7IGFuZFxuICAgICAgICAgKiAmbHQ7c2NyaXB0Jmd0OywgcmVzcGVjdGl2ZWx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgZWxlbWVudHMgaW4gdGhlIGxvYWRlZCBkb2N1bWVudCBhcmUgdW5tb2RpZmllZCBmcm9tIHRoZWlyIG9yaWdpbmFsXG4gICAgICAgICAqIGRvY3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgVGhlIGRvY3VtZW50IHRvIGxvYWQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0LjxzdHJpbmcsYm9vbGVhbj49fSBsb2FkZWQgQW4gb2JqZWN0IGtleWVkIGJ5IGFscmVhZHkgbG9hZGVkIGRvY3VtZW50cy5cbiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZS48RG9jdW1lbnRBU1Q+fVxuICAgICAgICAgKi9cbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvYWRlZEFzdChocmVmLCBsb2FkZWQpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2FkZWRbaHJlZl0gPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHBhcnNlZERvY3VtZW50ID0gdGhpcy5wYXJzZWREb2N1bWVudHNbaHJlZl07XG4gICAgICAgICAgICB2YXIgYW5hbHl6ZWREb2N1bWVudCA9IHRoaXMuaHRtbFtocmVmXTtcbiAgICAgICAgICAgIHZhciBhc3RDb3B5ID0gZG9tNS5wYXJzZShkb201LnNlcmlhbGl6ZShwYXJzZWREb2N1bWVudCkpO1xuICAgICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgaW5saW5lIHNvbWV0aGluZywgcmVzZXQgaW5saW5lZCB0byB0cnVlIHRvIGtub3cgdGhhdCBhbm9hdGhlclxuICAgICAgICAgICAgLy8gaW5saW5pbmcgcGFzcyBpcyBuZWVkZWQ7XG4gICAgICAgICAgICB0aGlzLl9pbmxpbmVTdHlsZXMoYXN0Q29weSwgaHJlZik7XG4gICAgICAgICAgICB0aGlzLl9pbmxpbmVTY3JpcHRzKGFzdENvcHksIGhyZWYpO1xuICAgICAgICAgICAgdGhpcy5faW5saW5lSW1wb3J0cyhhc3RDb3B5LCBocmVmLCBsb2FkZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGFzdENvcHk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ25vZGVXYWxrRG9jdW1lbnRzJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbHMgYGRvbTUubm9kZVdhbGtBbGxgIG9uIGVhY2ggZG9jdW1lbnQgdGhhdCBgQW5heXpsZXJgIGhhcyBsYW9kZWQuXG4gICAgICAgICAqL1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZVdhbGtEb2N1bWVudHMocHJlZGljYXRlKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaHJlZiBpbiB0aGlzLnBhcnNlZERvY3VtZW50cykge1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlcyA9IGRvbTUubm9kZVdhbGtBbGwodGhpcy5wYXJzZWREb2N1bWVudHNbaHJlZl0sIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KG5ld05vZGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdub2RlV2Fsa0FsbERvY3VtZW50cycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGxzIGBkb201Lm5vZGVXYWxrQWxsYCBvbiBlYWNoIGRvY3VtZW50IHRoYXQgYEFuYXl6bGVyYCBoYXMgbGFvZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUT0RPOiBtYWtlIG5vZGVXYWxrQWxsICYgbm9kZVdhbGtBbGxEb2N1bWVudHMgZGlzdGljdCwgb3IgZGVsZXRlIG9uZS5cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlV2Fsa0FsbERvY3VtZW50cyhwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBocmVmIGluIHRoaXMucGFyc2VkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGVzID0gZG9tNS5ub2RlV2Fsa0FsbCh0aGlzLnBhcnNlZERvY3VtZW50c1tocmVmXSwgcHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQobmV3Tm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2Fubm90YXRlJyxcblxuICAgICAgICAvKiogQW5ub3RhdGVzIGFsbCBsb2FkZWQgbWV0YWRhdGEgd2l0aCBpdHMgZG9jdW1lbnRhdGlvbi4gKi9cbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFubm90YXRlKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVFbCA9IGRvY3MuZmVhdHVyZUVsZW1lbnQodGhpcy5mZWF0dXJlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy51bnNoaWZ0KGZlYXR1cmVFbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50c0J5VGFnTmFtZVtmZWF0dXJlRWwuaXNdID0gZmVhdHVyZUVsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJlaGF2aW9yc0J5TmFtZSA9IHRoaXMuYmVoYXZpb3JzQnlOYW1lO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRIZWxwZXIgPSBmdW5jdGlvbiBlbGVtZW50SGVscGVyKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBkb2NzLmFubm90YXRlRWxlbWVudChkZXNjcmlwdG9yLCBiZWhhdmlvcnNCeU5hbWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaChlbGVtZW50SGVscGVyKTtcbiAgICAgICAgICAgIHRoaXMuYmVoYXZpb3JzLmZvckVhY2goZWxlbWVudEhlbHBlcik7IC8vIFNhbWUgc2hhcGUuXG4gICAgICAgICAgICB0aGlzLmJlaGF2aW9ycy5mb3JFYWNoKGZ1bmN0aW9uIChiZWhhdmlvcikge1xuICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvci5pcyAhPT0gYmVoYXZpb3Iuc3ltYm9sICYmIGJlaGF2aW9yLnN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpczExLmJlaGF2aW9yc0J5TmFtZVtiZWhhdmlvci5zeW1ib2xdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjbGVhbicsXG5cbiAgICAgICAgLyoqIFJlbW92ZXMgcmVkdW5kYW50IHByb3BlcnRpZXMgZnJvbSB0aGUgY29sbGVjdGVkIGRlc2NyaXB0b3JzLiAqL1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW4oKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goZG9jcy5jbGVhbkVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEFuYWx5emVyO1xufSgpO1xuLyoqXG4gKiBTaG9ydGhhbmQgZm9yIHRyYW5zaXRpdmVseSBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nIGFsbCBpbXBvcnRzIGJlZ2lubmluZyBhdFxuICogYGhyZWZgLlxuICpcbiAqIEluIG9yZGVyIHRvIHByb3Blcmx5IGZpbHRlciBwYXRocywgYGhyZWZgIF9tdXN0XyBiZSBhbiBhYnNvbHV0ZSBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgVGhlIHJvb3QgaW1wb3J0IHRvIGJlZ2luIGxvYWRpbmcgZnJvbS5cbiAqIEBwYXJhbSB7TG9hZE9wdGlvbnM9fSBvcHRpb25zIEFueSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBsb2FkLlxuICogQHJldHVybiB7UHJvbWlzZTxBbmFseXplcj59IEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSBvbmNlIGBocmVmYCBhbmQgaXRzXG4gKiAgICAgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBsb2FkZWQgYW5kIGFuYWx5emVkLlxuICovXG5cblxuQW5hbHl6ZXIuYW5hbHl6ZSA9IGZ1bmN0aW9uIGFuYWx5emUoaHJlZiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIgfHwgX2RlZmF1bHRGaWx0ZXIoaHJlZik7XG4gICAgdmFyIGxvYWRlciA9IG5ldyBmaWxlX2xvYWRlcl8xLkZpbGVMb2FkZXIoKTtcbiAgICB2YXIgcmVzb2x2ZXIgPSBvcHRpb25zLnJlc29sdmVyO1xuICAgIGlmIChyZXNvbHZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzb2x2ZXIgPSAnZnMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZXIgPSAneGhyJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgcHJpbWFyeVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvbHZlciA9PT0gJ2ZzJykge1xuICAgICAgICBwcmltYXJ5UmVzb2x2ZXIgPSBuZXcgZnNfcmVzb2x2ZXJfMS5GU1Jlc29sdmVyKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb2x2ZXIgPT09ICd4aHInKSB7XG4gICAgICAgIHByaW1hcnlSZXNvbHZlciA9IG5ldyB4aHJfcmVzb2x2ZXJfMS5YSFJSZXNvbHZlcihvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlc29sdmVyID09PSAncGVybWlzc2l2ZScpIHtcbiAgICAgICAgcHJpbWFyeVJlc29sdmVyID0gbmV3IGVycm9yX3N3YWxsb3dpbmdfZnNfcmVzb2x2ZXJfMS5FcnJvclN3YWxsb3dpbmdGU1Jlc29sdmVyKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc29sdmVyIG11c3QgYmUgb25lIG9mICdmcycsICd4aHInLCBvciAncGVybWlzc2l2ZSdcIik7XG4gICAgfVxuICAgIGxvYWRlci5hZGRSZXNvbHZlcihwcmltYXJ5UmVzb2x2ZXIpO1xuICAgIGlmIChvcHRpb25zLmNvbnRlbnQpIHtcbiAgICAgICAgbG9hZGVyLmFkZFJlc29sdmVyKG5ldyBzdHJpbmdfcmVzb2x2ZXJfMS5TdHJpbmdSZXNvbHZlcih7IHVybDogaHJlZiwgY29udGVudDogb3B0aW9ucy5jb250ZW50IH0pKTtcbiAgICB9XG4gICAgbG9hZGVyLmFkZFJlc29sdmVyKG5ldyBub29wX3Jlc29sdmVyXzEuTm9vcFJlc29sdmVyKHsgdGVzdDogb3B0aW9ucy5maWx0ZXIgfSkpO1xuICAgIHZhciBhbmFseXplciA9IG5ldyBBbmFseXplcihmYWxzZSwgbG9hZGVyKTtcbiAgICByZXR1cm4gYW5hbHl6ZXIubWV0YWRhdGFUcmVlKGhyZWYpLnRoZW4oZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLm5vQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGFuYWx5emVyLmFubm90YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2xlYW4pIHtcbiAgICAgICAgICAgIGFuYWx5emVyLmNsZWFuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbmFseXplcik7XG4gICAgfSk7XG59O1xuZXhwb3J0cy5BbmFseXplciA9IEFuYWx5emVyO1xuO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGhyZWZcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKHN0cmluZyk6IGJvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIF9kZWZhdWx0RmlsdGVyKGhyZWYpIHtcbiAgICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IGAvYCBvciBgXFxgLlxuICAgIHZhciBiYXNlID0gaHJlZi5tYXRjaCgvXiguKj8pW15cXC9cXFxcXSokLylbMV07XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHVyaS5pbmRleE9mKGJhc2UpICE9PSAwO1xuICAgIH07XG59XG5mdW5jdGlvbiBtYXRjaGVzRG9jdW1lbnRGb2xkZXIoZGVzY3JpcHRvciwgaHJlZikge1xuICAgIGlmICghZGVzY3JpcHRvci5jb250ZW50SHJlZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBkZXNjcmlwdG9yRG9jID0gdXJsLnBhcnNlKGRlc2NyaXB0b3IuY29udGVudEhyZWYpO1xuICAgIGlmICghZGVzY3JpcHRvckRvYyB8fCAhZGVzY3JpcHRvckRvYy5wYXRobmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzZWFyY2hEb2MgPSB1cmwucGFyc2UoaHJlZik7XG4gICAgaWYgKCFzZWFyY2hEb2MgfHwgIXNlYXJjaERvYy5wYXRobmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzZWFyY2hQYXRoID0gc2VhcmNoRG9jLnBhdGhuYW1lO1xuICAgIHZhciBsYXN0U2xhc2ggPSBzZWFyY2hQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBpZiAobGFzdFNsYXNoID4gMCkge1xuICAgICAgICBzZWFyY2hQYXRoID0gc2VhcmNoUGF0aC5zbGljZSgwLCBsYXN0U2xhc2gpO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvckRvYy5wYXRobmFtZS5pbmRleE9mKHNlYXJjaFBhdGgpID09PSAwO1xufVxuLy8gVE9ETyhham8pOiBSZWZhY3RvciBvdXQgb2YgdnVsY2FuaXplIGludG8gZG9tNS5cbnZhciBwb2x5bWVyRXh0ZXJuYWxTdHlsZSA9IGRvbTUucHJlZGljYXRlcy5BTkQoZG9tNS5wcmVkaWNhdGVzLmhhc1RhZ05hbWUoJ2xpbmsnKSwgZG9tNS5wcmVkaWNhdGVzLmhhc0F0dHJWYWx1ZSgncmVsJywgJ2ltcG9ydCcpLCBkb201LnByZWRpY2F0ZXMuaGFzQXR0clZhbHVlKCd0eXBlJywgJ2NzcycpKTtcbnZhciBleHRlcm5hbFNjcmlwdCA9IGRvbTUucHJlZGljYXRlcy5BTkQoZG9tNS5wcmVkaWNhdGVzLmhhc1RhZ05hbWUoJ3NjcmlwdCcpLCBkb201LnByZWRpY2F0ZXMuaGFzQXR0cignc3JjJykpO1xudmFyIGlzSHRtbEltcG9ydE5vZGUgPSBkb201LnByZWRpY2F0ZXMuQU5EKGRvbTUucHJlZGljYXRlcy5oYXNUYWdOYW1lKCdsaW5rJyksIGRvbTUucHJlZGljYXRlcy5oYXNBdHRyVmFsdWUoJ3JlbCcsICdpbXBvcnQnKSwgZG9tNS5wcmVkaWNhdGVzLk5PVChkb201LnByZWRpY2F0ZXMuaGFzQXR0clZhbHVlKCd0eXBlJywgJ2NzcycpKSk7XG5mdW5jdGlvbiBhdHRhY2hEb21Nb2R1bGUocGFyc2VkSW1wb3J0LCBlbGVtZW50KSB7XG4gICAgdmFyIGRvbU1vZHVsZXMgPSBwYXJzZWRJbXBvcnRbJ2RvbS1tb2R1bGUnXTtcbiAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlO1xuICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjUgPSBmYWxzZTtcbiAgICB2YXIgX2l0ZXJhdG9yRXJyb3I1ID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IGRvbU1vZHVsZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDU7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSAoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBkb21Nb2R1bGUgPSBfc3RlcDUudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChkb201LmdldEF0dHJpYnV0ZShkb21Nb2R1bGUsICdpZCcpID09PSBlbGVtZW50LmlzKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kb21Nb2R1bGUgPSBkb21Nb2R1bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yNSA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yNSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSAmJiBfaXRlcmF0b3I1LnJldHVybikge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjUucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I1KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I1O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXN1dGlsID0gcmVxdWlyZSgnLi9lc3V0aWwnKTtcbnZhciBhc3RWYWx1ZSA9IHJlcXVpcmUoJy4vYXN0LXZhbHVlJyk7XG5mdW5jdGlvbiBhbmFseXplUHJvcGVydGllcyhub2RlKSB7XG4gICAgdmFyIGFuYWx5emVkUHJvcHMgPSBbXTtcbiAgICBpZiAobm9kZS50eXBlICE9ICdPYmplY3RFeHByZXNzaW9uJykge1xuICAgICAgICByZXR1cm4gYW5hbHl6ZWRQcm9wcztcbiAgICB9XG4gICAgdmFyIG9iRXggPSBub2RlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JFeC5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IG9iRXgucHJvcGVydGllc1tpXTtcbiAgICAgICAgdmFyIHByb3AgPSBlc3V0aWwudG9Qcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHkpO1xuICAgICAgICBwcm9wLnB1Ymxpc2hlZCA9IHRydWU7XG4gICAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS50eXBlID09ICdPYmplY3RFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBQYXJzZSB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgYSBwcm9wZXJ0eSBvYmplY3QgYmxvY2suIGUuZy5cbiAgICAgICAgICAgICAqIHByb3BlcnR5OiB7XG4gICAgICAgICAgICAgKiAgIGtleToge1xuICAgICAgICAgICAgICogICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgICAqICAgICBub3RpZnk6IHRydWUsXG4gICAgICAgICAgICAgKiAgICAgdmFsdWU6IC0xLFxuICAgICAgICAgICAgICogICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICogICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZVxuICAgICAgICAgICAgICogICB9XG4gICAgICAgICAgICAgKiB9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBwcm9wRGVzY0V4cHIgPSBwcm9wZXJ0eS52YWx1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcERlc2NFeHByLnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlBcmcgPSBwcm9wRGVzY0V4cHIucHJvcGVydGllc1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlLZXkgPSBlc3V0aWwub2JqZWN0S2V5VG9TdHJpbmcocHJvcGVydHlBcmcua2V5KTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AudHlwZSA9IGVzdXRpbC5vYmplY3RLZXlUb1N0cmluZyhwcm9wZXJ0eUFyZy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHR5cGUgaW4gcHJvcGVydHkgb2JqZWN0LicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogcHJvcGVydHlBcmcubG9jLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdGlmeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5ub3RpZnkgPSBhc3RWYWx1ZS5leHByZXNzaW9uVG9WYWx1ZShwcm9wZXJ0eUFyZy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Aubm90aWZ5ID09PSB1bmRlZmluZWQpIHByb3Aubm90aWZ5ID0gYXN0VmFsdWUuQ0FOVF9DT05WRVJUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29ic2VydmVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLm9ic2VydmVyID0gYXN0VmFsdWUuZXhwcmVzc2lvblRvVmFsdWUocHJvcGVydHlBcmcudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Aub2JzZXJ2ZXJOb2RlID0gcHJvcGVydHlBcmcudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Aub2JzZXJ2ZXIgPT09IHVuZGVmaW5lZCkgcHJvcC5vYnNlcnZlciA9IGFzdFZhbHVlLkNBTlRfQ09OVkVSVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyZWFkT25seSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5yZWFkT25seSA9IGFzdFZhbHVlLmV4cHJlc3Npb25Ub1ZhbHVlKHByb3BlcnR5QXJnLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5yZWFkT25seSA9PT0gdW5kZWZpbmVkKSBwcm9wLnJlYWRPbmx5ID0gYXN0VmFsdWUuQ0FOVF9DT05WRVJUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZmxlY3RUb0F0dHJpYnV0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5yZWZsZWN0VG9BdHRyaWJ1dGUgPSBhc3RWYWx1ZS5leHByZXNzaW9uVG9WYWx1ZShwcm9wZXJ0eUFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AucmVmbGVjdFRvQXR0cmlidXRlID09PSB1bmRlZmluZWQpIHByb3AucmVmbGVjdFRvQXR0cmlidXRlID0gYXN0VmFsdWUuQ0FOVF9DT05WRVJUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmRlZmF1bHQgPSBhc3RWYWx1ZS5leHByZXNzaW9uVG9WYWx1ZShwcm9wZXJ0eUFyZy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSBwcm9wLmRlZmF1bHQgPSBhc3RWYWx1ZS5DQU5UX0NPTlZFUlQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByb3AudHlwZSkge1xuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gZGV0ZXJtaW5lIG5hbWUgZm9yIHByb3BlcnR5IGtleS4nLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBub2RlLmxvYy5zdGFydFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBhbmFseXplZFByb3BzLnB1c2gocHJvcCk7XG4gICAgfVxuICAgIHJldHVybiBhbmFseXplZFByb3BzO1xufVxuZXhwb3J0cy5hbmFseXplUHJvcGVydGllcyA9IGFuYWx5emVQcm9wZXJ0aWVzO1xuOyIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuLy8gdXNlZnVsIHRvb2wgdG8gdmlzdWFsaXplIEFTVDogaHR0cDovL2VzcHJpbWEub3JnL2RlbW8vcGFyc2UuaHRtbFxuLyoqXG4gKiBjb252ZXJ0cyBsaXRlcmFsOiB7XCJ0eXBlXCI6IFwiTGl0ZXJhbFwiLCBcInZhbHVlXCI6IDUsICBcInJhd1wiOiBcIjVcIiB9XG4gKiB0byBzdHJpbmdcbiAqL1xuXG5mdW5jdGlvbiBsaXRlcmFsVG9WYWx1ZShsaXRlcmFsKSB7XG4gICAgcmV0dXJuIGxpdGVyYWwudmFsdWU7XG59XG4vKipcbiAqIGNvbnZlcnRzIHVuYXJ5IHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmFyeVRvVmFsdWUodW5hcnkpIHtcbiAgICB2YXIgYXJnVmFsdWUgPSBleHByZXNzaW9uVG9WYWx1ZSh1bmFyeS5hcmd1bWVudCk7XG4gICAgaWYgKGFyZ1ZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICByZXR1cm4gdW5hcnkub3BlcmF0b3IgKyBhcmdWYWx1ZTtcbn1cbi8qKlxuICogY29udmVydHMgaWRlbnRpZmllciB0byBpdHMgdmFsdWVcbiAqIGlkZW50aWZpZXIgeyBcInR5cGVcIjogXCJJZGVudGlmaWVyXCIsIFwibmFtZVwiOiBcIk51bWJlciB9XG4gKi9cbmZ1bmN0aW9uIGlkZW50aWZpZXJUb1ZhbHVlKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllci5uYW1lO1xufVxuLyoqXG4gKiBGdW5jdGlvbiBpcyBhIGJsb2NrIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gZnVuY3Rpb25EZWNsYXJhdGlvblRvVmFsdWUoZm4pIHtcbiAgICBpZiAoZm4uYm9keS50eXBlID09IFwiQmxvY2tTdGF0ZW1lbnRcIikgcmV0dXJuIGJsb2NrU3RhdGVtZW50VG9WYWx1ZShmbi5ib2R5KTtcbn1cbmZ1bmN0aW9uIGZ1bmN0aW9uRXhwcmVzc2lvblRvVmFsdWUoZm4pIHtcbiAgICBpZiAoZm4uYm9keS50eXBlID09IFwiQmxvY2tTdGF0ZW1lbnRcIikgcmV0dXJuIGJsb2NrU3RhdGVtZW50VG9WYWx1ZShmbi5ib2R5KTtcbn1cbi8qKlxuICogQmxvY2sgc3RhdGVtZW50OiBmaW5kIGxhc3QgcmV0dXJuIHN0YXRlbWVudCwgYW5kIHJldHVybiBpdHMgdmFsdWVcbiAqL1xuZnVuY3Rpb24gYmxvY2tTdGF0ZW1lbnRUb1ZhbHVlKGJsb2NrKSB7XG4gICAgZm9yICh2YXIgaSA9IGJsb2NrLmJvZHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGJsb2NrLmJvZHlbaV0udHlwZSA9PT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikgcmV0dXJuIHJldHVyblN0YXRlbWVudFRvVmFsdWUoYmxvY2suYm9keVtpXSk7XG4gICAgfVxufVxuLyoqXG4gKiBFdmFsdWF0ZXMgcmV0dXJuJ3MgYXJndW1lbnRcbiAqL1xuZnVuY3Rpb24gcmV0dXJuU3RhdGVtZW50VG9WYWx1ZShyZXQpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvblRvVmFsdWUocmV0LmFyZ3VtZW50KTtcbn1cbi8qKlxuICogRW5jbG9zZSBjb250YWluaW5nIHZhbHVlcyBpbiBbXVxuICovXG5mdW5jdGlvbiBhcnJheUV4cHJlc3Npb25Ub1ZhbHVlKGFycnkpIHtcbiAgICB2YXIgdmFsdWUgPSAnWyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJ5LmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2ID0gZXhwcmVzc2lvblRvVmFsdWUoYXJyeS5lbGVtZW50c1tpXSk7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoaSAhPT0gMCkgdmFsdWUgKz0gJywgJztcbiAgICAgICAgdmFsdWUgKz0gdjtcbiAgICB9XG4gICAgdmFsdWUgKz0gJ10nO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKlxuICogTWFrZSBpdCBsb29rIGxpa2UgYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIG9iamVjdEV4cHJlc3Npb25Ub1ZhbHVlKG9iaikge1xuICAgIHZhciB2YWx1ZSA9ICd7JztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBrID0gZXhwcmVzc2lvblRvVmFsdWUob2JqLnByb3BlcnRpZXNbaV0ua2V5KTtcbiAgICAgICAgdmFyIHYgPSBleHByZXNzaW9uVG9WYWx1ZShvYmoucHJvcGVydGllc1tpXS52YWx1ZSk7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoaSAhPT0gMCkgdmFsdWUgKz0gJywgJztcbiAgICAgICAgdmFsdWUgKz0gJ1wiJyArIGsgKyAnXCI6ICcgKyB2O1xuICAgIH1cbiAgICB2YWx1ZSArPSAnfSc7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBCaW5hcnlFeHByZXNzaW9ucyBhcmUgb2YgdGhlIGZvcm0gXCJsaXRlcmFsXCIgKyBcImxpdGVyYWxcIlxuICovXG5mdW5jdGlvbiBiaW5hcnlFeHByZXNzaW9uVG9WYWx1ZShtZW1iZXIpIHtcbiAgICBpZiAobWVtYmVyLm9wZXJhdG9yID09IFwiK1wiKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2FzdCB0byBgYW55YCBoZXJlIGJlY2F1c2UsIHdoaWxlIGl0J3MgdXN1YWxseSBub3QgdGhlIHJpZ2h0XG4gICAgICAgIC8vIHRoaW5nIHRvIGRvIHRvIHVzZSAnKycgb24gdHdvIHZhbHVlcyBvZiBhIG1peCBvZiB0eXBlcyBiZWNhdXNlIGl0J3NcbiAgICAgICAgLy8gdW5wcmVkaWN0YWJsZSwgdGhhdCBpcyB3aGF0IHRoZSBvcmlnaW5hbCBjb2RlIHdlJ3JlIGV2YWx1YXRpbmcgZG9lcy5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25Ub1ZhbHVlKG1lbWJlci5sZWZ0KSArIGV4cHJlc3Npb25Ub1ZhbHVlKG1lbWJlci5yaWdodCk7XG4gICAgfVxuICAgIHJldHVybjtcbn1cbi8qKlxuICogTWVtYmVyRXhwcmVzc2lvbiByZWZlcmVuY2VzIGEgdmFyaWFibGUgd2l0aCBuYW1lXG4gKi9cbmZ1bmN0aW9uIG1lbWJlckV4cHJlc3Npb25Ub1ZhbHVlKG1lbWJlcikge1xuICAgIHJldHVybiBleHByZXNzaW9uVG9WYWx1ZShtZW1iZXIub2JqZWN0KSArIFwiLlwiICsgZXhwcmVzc2lvblRvVmFsdWUobWVtYmVyLnByb3BlcnR5KTtcbn1cbi8qKlxuICogVHJpZXMgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uLiBSZXR1cm5zIHVuZGVmaW5lZCBvbiBmYWlsdXJlLlxuICovXG5mdW5jdGlvbiBleHByZXNzaW9uVG9WYWx1ZSh2YWx1ZUV4cHJlc3Npb24pIHtcbiAgICBzd2l0Y2ggKHZhbHVlRXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxUb1ZhbHVlKHZhbHVlRXhwcmVzc2lvbik7XG4gICAgICAgIGNhc2UgJ1VuYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gdW5hcnlUb1ZhbHVlKHZhbHVlRXhwcmVzc2lvbik7XG4gICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJUb1ZhbHVlKHZhbHVlRXhwcmVzc2lvbik7XG4gICAgICAgIGNhc2UgJ0Z1bmN0aW9uRGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uRGVjbGFyYXRpb25Ub1ZhbHVlKHZhbHVlRXhwcmVzc2lvbik7XG4gICAgICAgIGNhc2UgJ0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25FeHByZXNzaW9uVG9WYWx1ZSh2YWx1ZUV4cHJlc3Npb24pO1xuICAgICAgICBjYXNlICdBcnJheUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIGFycmF5RXhwcmVzc2lvblRvVmFsdWUodmFsdWVFeHByZXNzaW9uKTtcbiAgICAgICAgY2FzZSAnT2JqZWN0RXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0RXhwcmVzc2lvblRvVmFsdWUodmFsdWVFeHByZXNzaW9uKTtcbiAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gaWRlbnRpZmllclRvVmFsdWUodmFsdWVFeHByZXNzaW9uKTtcbiAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gbWVtYmVyRXhwcmVzc2lvblRvVmFsdWUodmFsdWVFeHByZXNzaW9uKTtcbiAgICAgICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvblRvVmFsdWUodmFsdWVFeHByZXNzaW9uKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59XG5leHBvcnRzLmV4cHJlc3Npb25Ub1ZhbHVlID0gZXhwcmVzc2lvblRvVmFsdWU7XG5leHBvcnRzLkNBTlRfQ09OVkVSVCA9ICdVTktOT1dOJzsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGRvY3MgPSByZXF1aXJlKCcuL2RvY3MnKTtcbnZhciBlc3V0aWwgPSByZXF1aXJlKCcuL2VzdXRpbCcpO1xudmFyIGpzZG9jID0gcmVxdWlyZSgnLi9qc2RvYycpO1xudmFyIGFzdFZhbHVlID0gcmVxdWlyZSgnLi9hc3QtdmFsdWUnKTtcbnZhciBkZWNsYXJhdGlvbl9wcm9wZXJ0eV9oYW5kbGVyc18xID0gcmVxdWlyZSgnLi9kZWNsYXJhdGlvbi1wcm9wZXJ0eS1oYW5kbGVycycpO1xuZnVuY3Rpb24gZGVkdXBlKGFycmF5LCBrZXlGdW5jKSB7XG4gICAgdmFyIGJ1Y2tldCA9IHt9O1xuICAgIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlGdW5jKGVsKTtcbiAgICAgICAgaWYgKGtleSBpbiBidWNrZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidWNrZXRba2V5XSA9IGVsO1xuICAgIH0pO1xuICAgIHZhciByZXR1cm5lZCA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGJ1Y2tldCkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm5lZC5wdXNoKGJ1Y2tldFtrXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldHVybmVkO1xufVxuLy8gVE9ETyhyaWN0aWMpOiB0dXJuIHRoaXMgaW50byBhIGNsYXNzLlxuZnVuY3Rpb24gYmVoYXZpb3JGaW5kZXIoKSB7XG4gICAgLyoqIFRoZSBiZWhhdmlvcnMgd2UndmUgZm91bmQuICovXG4gICAgdmFyIGJlaGF2aW9ycyA9IFtdO1xuICAgIHZhciBjdXJyZW50QmVoYXZpb3IgPSBudWxsO1xuICAgIHZhciBwcm9wZXJ0eUhhbmRsZXJzID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBtZXJnZXMgYmVoYXZpb3Igd2l0aCBwcmVleGlzdGluZyBiZWhhdmlvciB3aXRoIHRoZSBzYW1lIG5hbWUuXG4gICAgICogaGVyZSB0byBzdXBwb3J0IG11bHRpcGxlIEBwb2x5bWVyQmVoYXZpb3IgdGFncyByZWZlcnJpbmdcbiAgICAgKiB0byBzYW1lIGJlaGF2aW9yLiBTZWUgaXJvbi1tdWx0aS1zZWxlY3RhYmxlIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lcmdlQmVoYXZpb3IobmV3QmVoYXZpb3IpIHtcbiAgICAgICAgdmFyIGlzQmVoYXZpb3JJbXBsID0gZnVuY3Rpb24gaXNCZWhhdmlvckltcGwoYikge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBCZWhhdmlvckltcGxcbiAgICAgICAgICAgIHJldHVybiBiLmluZGV4T2YobmV3QmVoYXZpb3IuaXMpID09PSAtMTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZXdCZWhhdmlvci5pcyAhPT0gYmVoYXZpb3JzW2ldLmlzKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIG1lcmdlIGRlc2MsIGxvbmdlc3QgZGVzYyB3aW5zXG4gICAgICAgICAgICBpZiAobmV3QmVoYXZpb3IuZGVzYykge1xuICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvcnNbaV0uZGVzYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3QmVoYXZpb3IuZGVzYy5sZW5ndGggPiBiZWhhdmlvcnNbaV0uZGVzYy5sZW5ndGgpIGJlaGF2aW9yc1tpXS5kZXNjID0gbmV3QmVoYXZpb3IuZGVzYztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcnNbaV0uZGVzYyA9IG5ld0JlaGF2aW9yLmRlc2M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbWVyZ2UgZGVtb3NcbiAgICAgICAgICAgIGJlaGF2aW9yc1tpXS5kZW1vcyA9IChiZWhhdmlvcnNbaV0uZGVtb3MgfHwgW10pLmNvbmNhdChuZXdCZWhhdmlvci5kZW1vcyB8fCBbXSk7XG4gICAgICAgICAgICAvLyBtZXJnZSBldmVudHMsXG4gICAgICAgICAgICBiZWhhdmlvcnNbaV0uZXZlbnRzID0gKGJlaGF2aW9yc1tpXS5ldmVudHMgfHwgW10pLmNvbmNhdChuZXdCZWhhdmlvci5ldmVudHMgfHwgW10pO1xuICAgICAgICAgICAgYmVoYXZpb3JzW2ldLmV2ZW50cyA9IGRlZHVwZShiZWhhdmlvcnNbaV0uZXZlbnRzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG1lcmdlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGJlaGF2aW9yc1tpXS5wcm9wZXJ0aWVzID0gKGJlaGF2aW9yc1tpXS5wcm9wZXJ0aWVzIHx8IFtdKS5jb25jYXQobmV3QmVoYXZpb3IucHJvcGVydGllcyB8fCBbXSk7XG4gICAgICAgICAgICAvLyBtZXJnZSBvYnNlcnZlcnNcbiAgICAgICAgICAgIGJlaGF2aW9yc1tpXS5vYnNlcnZlcnMgPSAoYmVoYXZpb3JzW2ldLm9ic2VydmVycyB8fCBbXSkuY29uY2F0KG5ld0JlaGF2aW9yLm9ic2VydmVycyB8fCBbXSk7XG4gICAgICAgICAgICAvLyBtZXJnZSBiZWhhdmlvcnNcbiAgICAgICAgICAgIGJlaGF2aW9yc1tpXS5iZWhhdmlvcnMgPSAoYmVoYXZpb3JzW2ldLmJlaGF2aW9ycyB8fCBbXSkuY29uY2F0KG5ld0JlaGF2aW9yLmJlaGF2aW9ycyB8fCBbXSkuZmlsdGVyKGlzQmVoYXZpb3JJbXBsKTtcbiAgICAgICAgICAgIHJldHVybiBiZWhhdmlvcnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0JlaGF2aW9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBnZXRzIHRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIGJlaGF2aW9yIGZyb20gYSBub2RlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlaGF2aW9yRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdFeHByZXNzaW9uU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNhc3QgdG8gYGFueWAgaGVyZSBiZWNhdXNlIEV4cHJlc3Npb25TdGF0ZW1lbnQgaXMgc3VwZXJcbiAgICAgICAgICAgICAgICAvLyBzdXBlciBnZW5lcmFsLiB0aGlzIGNvZGUgaXMgc3VzcGljaW91cy5cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5leHByZXNzaW9uLnJpZ2h0O1xuICAgICAgICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvbic6XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwID8gbi5kZWNsYXJhdGlvbnNbMF0uaW5pdCA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogY2hlY2tzIHdoZXRoZXIgYW4gZXhwcmVzc2lvbiBpcyBhIHNpbXBsZSBhcnJheSBjb250YWluaW5nIG9ubHkgbWVtYmVyXG4gICAgICogZXhwcmVzc2lvbnMgb3IgaWRlbnRpZmllcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTaW1wbGVCZWhhdmlvckFycmF5KGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uIHx8IGV4cHJlc3Npb24udHlwZSAhPT0gJ0FycmF5RXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGFycmF5RXhwciA9IGV4cHJlc3Npb247XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlFeHByLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlFeHByLmVsZW1lbnRzW2ldLnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJyAmJiBhcnJheUV4cHIuZWxlbWVudHNbaV0udHlwZSAhPT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgdGVtcGxhdGl6ZXIgPSBcIlBvbHltZXIuVGVtcGxhdGl6ZXJcIjtcbiAgICBmdW5jdGlvbiBfcGFyc2VDaGFpbmVkQmVoYXZpb3JzKG5vZGUpIHtcbiAgICAgICAgLy8gaWYgY3VycmVudCBiZWhhdmlvciBpcyBwYXJ0IG9mIGFuIGFycmF5LCBpdCBnZXRzIGV4dGVuZGVkIGJ5IG90aGVyIGJlaGF2aW9yc1xuICAgICAgICAvLyBpbnNpZGUgdGhlIGFycmF5LiBFeDpcbiAgICAgICAgLy8gUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3IgPSBbIHsuLi4ufSwgUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yXVxuICAgICAgICAvLyBXZSBhZGQgdGhlc2UgdG8gYmVoYXZpb3JzIGFycmF5XG4gICAgICAgIHZhciBleHByZXNzaW9uID0gYmVoYXZpb3JFeHByZXNzaW9uKG5vZGUpO1xuICAgICAgICB2YXIgY2hhaW5lZCA9IFtdO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLnR5cGUgPT09ICdBcnJheUV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICB2YXIgYXJyRXhwciA9IGV4cHJlc3Npb247XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyckV4cHIuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyRXhwci5lbGVtZW50c1tpXS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgfHwgYXJyRXhwci5lbGVtZW50c1tpXS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhaW5lZC5wdXNoKGFzdFZhbHVlLmV4cHJlc3Npb25Ub1ZhbHVlKGFyckV4cHIuZWxlbWVudHNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhaW5lZC5sZW5ndGggPiAwKSBjdXJyZW50QmVoYXZpb3IuYmVoYXZpb3JzID0gY2hhaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBfaW5pdEJlaGF2aW9yKG5vZGUsIGdldE5hbWUpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSBlc3V0aWwuZ2V0QXR0YWNoZWRDb21tZW50KG5vZGUpO1xuICAgICAgICB2YXIgc3ltYm9sID0gZ2V0TmFtZSgpO1xuICAgICAgICAvLyBRdWlja2x5IGZpbHRlciBkb3duIHRvIHBvdGVudGlhbCBjYW5kaWRhdGVzLlxuICAgICAgICBpZiAoIWNvbW1lbnQgfHwgY29tbWVudC5pbmRleE9mKCdAcG9seW1lckJlaGF2aW9yJykgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sICE9PSB0ZW1wbGF0aXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QmVoYXZpb3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnYmVoYXZpb3InLFxuICAgICAgICAgICAgZGVzYzogY29tbWVudCxcbiAgICAgICAgICAgIGV2ZW50czogZXN1dGlsLmdldEV2ZW50Q29tbWVudHMobm9kZSkubWFwKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRlc2M6IGV2ZW50IH07XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUhhbmRsZXJzID0gZGVjbGFyYXRpb25fcHJvcGVydHlfaGFuZGxlcnNfMS5kZWNsYXJhdGlvblByb3BlcnR5SGFuZGxlcnMoY3VycmVudEJlaGF2aW9yKTtcbiAgICAgICAgZG9jcy5hbm5vdGF0ZUJlaGF2aW9yKGN1cnJlbnRCZWhhdmlvcik7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGFjdHVhbGx5IHBhcnNlZCBhIGJlaGF2aW9yIHRhZyFcbiAgICAgICAgaWYgKCFqc2RvYy5oYXNUYWcoY3VycmVudEJlaGF2aW9yLmpzZG9jLCAncG9seW1lckJlaGF2aW9yJykgJiYgc3ltYm9sICE9PSB0ZW1wbGF0aXplcikge1xuICAgICAgICAgICAgY3VycmVudEJlaGF2aW9yID0gbnVsbDtcbiAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0ganNkb2MuZ2V0VGFnKGN1cnJlbnRCZWhhdmlvci5qc2RvYywgJ3BvbHltZXJCZWhhdmlvcicsICduYW1lJyk7XG4gICAgICAgIGN1cnJlbnRCZWhhdmlvci5zeW1ib2wgPSBzeW1ib2w7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRCZWhhdmlvci5zeW1ib2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBkZXRlcm1pbmUgbmFtZSBmb3IgQHBvbHltZXJCZWhhdmlvcjonLCBjb21tZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QmVoYXZpb3IuaXMgPSBuYW1lO1xuICAgICAgICBfcGFyc2VDaGFpbmVkQmVoYXZpb3JzKG5vZGUpO1xuICAgICAgICBjdXJyZW50QmVoYXZpb3IgPSBtZXJnZUJlaGF2aW9yKGN1cnJlbnRCZWhhdmlvcik7XG4gICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBkZWNsYXJhdGlvbl9wcm9wZXJ0eV9oYW5kbGVyc18xLmRlY2xhcmF0aW9uUHJvcGVydHlIYW5kbGVycyhjdXJyZW50QmVoYXZpb3IpO1xuICAgICAgICAvLyBTb21lIGJlaGF2aW9ycyBhcmUganVzdCBsaXN0cyBvZiBvdGhlciBiZWhhdmlvcnMuIElmIHRoaXMgaXMgb25lIHRoZW5cbiAgICAgICAgLy8gYWRkIGl0IHRvIGJlaGF2aW9ycyByaWdodCBhd2F5LlxuICAgICAgICBpZiAoaXNTaW1wbGVCZWhhdmlvckFycmF5KGJlaGF2aW9yRXhwcmVzc2lvbihub2RlKSkpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oYWpvKTogQWRkIGEgdGVzdCB0byBjb25maXJtIHRoZSBwcmVzZW5jZSBvZiBgcHJvcGVydGllc2BcbiAgICAgICAgICAgIGlmICghY3VycmVudEJlaGF2aW9yLm9ic2VydmVycykgY3VycmVudEJlaGF2aW9yLm9ic2VydmVycyA9IFtdO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50QmVoYXZpb3IucHJvcGVydGllcykgY3VycmVudEJlaGF2aW9yLnByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgICAgIGlmIChiZWhhdmlvcnMuaW5kZXhPZihjdXJyZW50QmVoYXZpb3IpID09PSAtMSkgYmVoYXZpb3JzLnB1c2goY3VycmVudEJlaGF2aW9yKTtcbiAgICAgICAgICAgIGN1cnJlbnRCZWhhdmlvciA9IG51bGw7XG4gICAgICAgICAgICBwcm9wZXJ0eUhhbmRsZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgdmlzaXRvcnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rIGZvciBvYmplY3QgZGVjbGFyYXRpb25zIHdpdGggQGJlaGF2aW9yIGluIHRoZSBkb2NzLlxuICAgICAgICAgKi9cbiAgICAgICAgZW50ZXJWYXJpYWJsZURlY2xhcmF0aW9uOiBmdW5jdGlvbiBlbnRlclZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoICE9PSAxKSByZXR1cm47IC8vIEFtYmlndW91cy5cbiAgICAgICAgICAgIF9pbml0QmVoYXZpb3Iobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlc3V0aWwub2JqZWN0S2V5VG9TdHJpbmcobm9kZS5kZWNsYXJhdGlvbnNbMF0uaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rIGZvciBvYmplY3QgYXNzaWdubWVudHMgd2l0aCBAcG9seW1lckJlaGF2aW9yIGluIHRoZSBkb2NzLlxuICAgICAgICAgKi9cbiAgICAgICAgZW50ZXJBc3NpZ25tZW50RXhwcmVzc2lvbjogZnVuY3Rpb24gZW50ZXJBc3NpZ25tZW50RXhwcmVzc2lvbihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIF9pbml0QmVoYXZpb3IocGFyZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzdXRpbC5vYmplY3RLZXlUb1N0cmluZyhub2RlLmxlZnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXZSBhc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGV4cHJlc3Npb24gYWZ0ZXIgc3VjaCBhbiBhc3NpZ25tZW50IGlzIHRoZVxuICAgICAgICAgKiBiZWhhdmlvcidzIGRlY2xhcmF0aW9uLiBTZWVtcyB0byBiZSBhIGRlY2VudCBhc3N1bXB0aW9uIGZvciBub3cuXG4gICAgICAgICAqL1xuICAgICAgICBlbnRlck9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIGVudGVyT2JqZWN0RXhwcmVzc2lvbihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudEJlaGF2aW9yIHx8IGN1cnJlbnRCZWhhdmlvci5wcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgICAgICAgICBjdXJyZW50QmVoYXZpb3IucHJvcGVydGllcyA9IGN1cnJlbnRCZWhhdmlvci5wcm9wZXJ0aWVzIHx8IFtdO1xuICAgICAgICAgICAgY3VycmVudEJlaGF2aW9yLm9ic2VydmVycyA9IGN1cnJlbnRCZWhhdmlvci5vYnNlcnZlcnMgfHwgW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gbm9kZS5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gZXN1dGlsLm9iamVjdEtleVRvU3RyaW5nKHByb3Aua2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0NhbnQgZGV0ZXJtaW5lIG5hbWUgZm9yIHByb3BlcnR5IGtleS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IG5vZGUubG9jLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIHByb3BlcnR5SGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlIYW5kbGVyc1tuYW1lXShwcm9wLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmVoYXZpb3IucHJvcGVydGllcy5wdXNoKGVzdXRpbC50b1Byb3BlcnR5RGVzY3JpcHRvcihwcm9wKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmVoYXZpb3JzLnB1c2goY3VycmVudEJlaGF2aW9yKTtcbiAgICAgICAgICAgIGN1cnJlbnRCZWhhdmlvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB7IHZpc2l0b3JzOiB2aXNpdG9ycywgYmVoYXZpb3JzOiBiZWhhdmlvcnMgfTtcbn1cbmV4cG9ydHMuYmVoYXZpb3JGaW5kZXIgPSBiZWhhdmlvckZpbmRlcjtcbjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGFzdFZhbHVlID0gcmVxdWlyZSgnLi9hc3QtdmFsdWUnKTtcbnZhciBhbmFseXplX3Byb3BlcnRpZXNfMSA9IHJlcXVpcmUoJy4vYW5hbHl6ZS1wcm9wZXJ0aWVzJyk7XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRoYXQgd2lsbCBhbm5vdGF0ZSBgZGVjbGFyYXRpb25gIHdpdGhcbiAqIHRoZSBwb2x5bWVyLXNwZWNpZmljbWVhbmluZyBvZiB0aGUgdmFsdWUgbm9kZXMgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnREZXNjcmlwdG9yfSBkZWNsYXJhdGlvbiBUaGUgZGVzY3JpcHRvciB0byBhbm5vdGF0ZS5cbiAqIEByZXR1cm4ge29iamVjdC48c3RyaW5nLGZ1bmN0aW9uPn0gICAgICBBbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvblByb3BlcnR5SGFuZGxlcnMoZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpczogZnVuY3Rpb24gaXMobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5pcyA9IG5vZGUudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogZnVuY3Rpb24gcHJvcGVydGllcyhub2RlKSB7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBhbmFseXplX3Byb3BlcnRpZXNfMS5hbmFseXplUHJvcGVydGllcyhub2RlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5wcm9wZXJ0aWVzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBiZWhhdmlvcnM6IGZ1bmN0aW9uIGJlaGF2aW9ycyhub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlICE9ICdBcnJheUV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyck5vZGUgPSBub2RlO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyTm9kZS5lbGVtZW50c1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGFzdFZhbHVlLmV4cHJlc3Npb25Ub1ZhbHVlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ID0gYXN0VmFsdWUuQ0FOVF9DT05WRVJUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmJlaGF2aW9ycy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ic2VydmVyczogZnVuY3Rpb24gb2JzZXJ2ZXJzKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgIT0gJ0FycmF5RXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXJyTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMiA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gYXJyTm9kZS5lbGVtZW50c1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IChfc3RlcDIgPSBfaXRlcmF0b3IyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGFzdFZhbHVlLmV4cHJlc3Npb25Ub1ZhbHVlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB2ID0gYXN0VmFsdWUuQ0FOVF9DT05WRVJUO1xuICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5vYnNlcnZlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0Tm9kZTogZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IHZcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5kZWNsYXJhdGlvblByb3BlcnR5SGFuZGxlcnMgPSBkZWNsYXJhdGlvblByb3BlcnR5SGFuZGxlcnM7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBqc2RvYyA9IHJlcXVpcmUoJy4vanNkb2MnKTtcbnZhciBkb201ID0gcmVxdWlyZSgnZG9tNScpO1xuLyoqIFByb3BlcnRpZXMgb24gZWxlbWVudCBwcm90b3R5cGVzIHRoYXQgYXJlIHB1cmVseSBjb25maWd1cmF0aW9uLiAqL1xudmFyIEVMRU1FTlRfQ09ORklHVVJBVElPTiA9IFsnYXR0YWNoZWQnLCAnYXR0cmlidXRlQ2hhbmdlZCcsICdiZWZvcmVSZWdpc3RlcicsICdjb25maWd1cmUnLCAnY29uc3RydWN0b3InLCAnY3JlYXRlZCcsICdkZXRhY2hlZCcsICdlbmFibGVDdXN0b21TdHlsZVByb3BlcnRpZXMnLCAnZXh0ZW5kcycsICdob3N0QXR0cmlidXRlcycsICdpcycsICdsaXN0ZW5lcnMnLCAnbWl4aW5zJywgJ3Byb3BlcnRpZXMnLCAncmVhZHknLCAncmVnaXN0ZXJlZCddO1xuLyoqIFRhZ3MgdW5kZXJzdG9vZCBieSB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzLCB0byBiZSByZW1vdmVkIGR1cmluZyBgY2xlYW5gLiAqL1xudmFyIEhBTkRMRURfVEFHUyA9IFsncGFyYW0nLCAncmV0dXJuJywgJ3R5cGUnXTtcbi8qKlxuICogQW5ub3RhdGVzIEh5ZHJvbHlzaXMgZGVzY3JpcHRvcnMsIHByb2Nlc3NpbmcgYW55IGBkZXNjYCBwcm9wZXJ0aWVzIGFzIEpTRG9jLlxuICpcbiAqIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBhIG1vcmUgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzLCBzdWNoIGFzXG4gKiBgYW5ub3RhdGVFbGVtZW50YC5cbiAqXG4gKiBQcm9jZXNzZWQgSlNEb2MgdmFsdWVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdmlhIHRoZSBganNkb2NgIHByb3BlcnR5IG9uIGFcbiAqIGRlc2NyaXB0b3Igbm9kZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBub2RlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBkZXNjcmlwdG9yIHRoYXQgd2FzIGdpdmVuLlxuICovXG5mdW5jdGlvbiBhbm5vdGF0ZShkZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuanNkb2MpIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5kZXNjID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXNjcmlwdG9yLmpzZG9jID0ganNkb2MucGFyc2VKc2RvYyhkZXNjcmlwdG9yLmRlc2MpO1xuICAgICAgICAvLyBXZSB3YW50IHRvIHByZXNlbnQgdGhlIG5vcm1hbGl6ZWQgZm9ybSBvZiBhIGRlc2NyaXB0b3IuXG4gICAgICAgIGRlc2NyaXB0b3IuanNkb2Mub3JpZyA9IGRlc2NyaXB0b3IuZGVzYztcbiAgICAgICAgZGVzY3JpcHRvci5kZXNjID0gZGVzY3JpcHRvci5qc2RvYy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG59XG5leHBvcnRzLmFubm90YXRlID0gYW5ub3RhdGU7XG4vKipcbiAqIEFubm90YXRlcyBAZXZlbnQsIEBoZXJvLCAmIEBkZW1vIHRhZ3NcbiAqL1xuZnVuY3Rpb24gYW5ub3RhdGVFbGVtZW50SGVhZGVyKGRlc2NyaXB0b3IpIHtcbiAgICBpZiAoZGVzY3JpcHRvci5ldmVudHMpIHtcbiAgICAgICAgZGVzY3JpcHRvci5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIF9hbm5vdGF0ZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlc2NyaXB0b3IuZXZlbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVzY3JpcHRvci5kZW1vcyA9IFtdO1xuICAgIGlmIChkZXNjcmlwdG9yLmpzZG9jICYmIGRlc2NyaXB0b3IuanNkb2MudGFncykge1xuICAgICAgICBkZXNjcmlwdG9yLmpzZG9jLnRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZy50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdoZXJvJzpcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5oZXJvID0gdGFnLm5hbWUgfHwgJ2hlcm8ucG5nJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVtbyc6XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZGVtb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiB0YWcuZGVzY3JpcHRpb24gfHwgJ2RlbW8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogdGFnLm5hbWUgfHwgJ2RlbW8vaW5kZXguaHRtbCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLmFubm90YXRlRWxlbWVudEhlYWRlciA9IGFubm90YXRlRWxlbWVudEhlYWRlcjtcbmZ1bmN0aW9uIGNvcHlQcm9wZXJ0aWVzKGZyb20sIHRvLCBiZWhhdmlvcnNCeU5hbWUpIHtcbiAgICBpZiAoZnJvbS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZyb20ucHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChmcm9tUHJvcCkge1xuICAgICAgICAgICAgZm9yICh2YXIgdG9Qcm9wLCBpID0gMDsgaSA8IHRvLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0b1Byb3AgPSB0by5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tUHJvcC5uYW1lID09PSB0b1Byb3AubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5ld1Byb3AgPSB7IF9fZnJvbUJlaGF2aW9yOiBmcm9tLmlzIH07XG4gICAgICAgICAgICBpZiAoZnJvbVByb3AuX19mcm9tQmVoYXZpb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmcm9tUHJvcCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlGaWVsZCkge1xuICAgICAgICAgICAgICAgIG5ld1Byb3BbcHJvcGVydHlGaWVsZF0gPSBmcm9tUHJvcFtwcm9wZXJ0eUZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG8ucHJvcGVydGllcy5wdXNoKG5ld1Byb3ApO1xuICAgICAgICB9KTtcbiAgICAgICAgZnJvbS5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbUV2ZW50KSB7XG4gICAgICAgICAgICBmb3IgKHZhciB0b0V2ZW50LCBpID0gMDsgaSA8IHRvLmV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRvRXZlbnQgPSB0by5ldmVudHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGZyb21FdmVudC5uYW1lID09PSB0b0V2ZW50Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9tRXZlbnQuX19mcm9tQmVoYXZpb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbmV3RXZlbnQgPSB7IF9fZnJvbUJlaGF2aW9yOiBmcm9tLmlzIH07XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmcm9tRXZlbnQpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50RmllbGQpIHtcbiAgICAgICAgICAgICAgICBuZXdFdmVudFtldmVudEZpZWxkXSA9IGZyb21FdmVudFtldmVudEZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG8uZXZlbnRzLnB1c2gobmV3RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFmcm9tLmJlaGF2aW9ycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSBmcm9tLmJlaGF2aW9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAvLyBUT0RPOiB3aGF0J3MgdXAgd2l0aCBiZWhhdmlvcnMgc29tZXRpbWVzIGJlaW5nIGEgbGl0ZXJhbCwgYW5kIHNvbWV0aW1lc1xuICAgICAgICAvLyBiZWluZyBhIGRlc2NyaXB0b3Igb2JqZWN0P1xuICAgICAgICB2YXIgbG9jYWxCZWhhdmlvciA9IGZyb20uYmVoYXZpb3JzW2ldO1xuICAgICAgICB2YXIgZGVmaW5lZEJlaGF2aW9yID0gYmVoYXZpb3JzQnlOYW1lW2xvY2FsQmVoYXZpb3JdIHx8IGJlaGF2aW9yc0J5TmFtZVtsb2NhbEJlaGF2aW9yLnN5bWJvbF07XG4gICAgICAgIGlmICghZGVmaW5lZEJlaGF2aW9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJCZWhhdmlvciBcIiArIGxvY2FsQmVoYXZpb3IgKyBcIiBub3QgZm91bmQgd2hlbiBtaXhpbmcgXCIgKyBcInByb3BlcnRpZXMgaW50byBcIiArIHRvLmlzICsgXCIhXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvcHlQcm9wZXJ0aWVzKGRlZmluZWRCZWhhdmlvciwgdG8sIGJlaGF2aW9yc0J5TmFtZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWl4aW5CZWhhdmlvcnMoZGVzY3JpcHRvciwgYmVoYXZpb3JzQnlOYW1lKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuYmVoYXZpb3JzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBkZXNjcmlwdG9yLmJlaGF2aW9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGJlaGF2aW9yID0gZGVzY3JpcHRvci5iZWhhdmlvcnNbaV07XG4gICAgICAgICAgICBpZiAoIWJlaGF2aW9yc0J5TmFtZVtiZWhhdmlvcl0pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJCZWhhdmlvciBcIiArIGJlaGF2aW9yICsgXCIgbm90IGZvdW5kIHdoZW4gbWl4aW5nIFwiICsgXCJwcm9wZXJ0aWVzIGludG8gXCIgKyBkZXNjcmlwdG9yLmlzICsgXCIhXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlZmluZWRCZWhhdmlvciA9IGJlaGF2aW9yc0J5TmFtZVtiZWhhdmlvcl07XG4gICAgICAgICAgICBjb3B5UHJvcGVydGllcyhkZWZpbmVkQmVoYXZpb3IsIGRlc2NyaXB0b3IsIGJlaGF2aW9yc0J5TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEFubm90YXRlcyBkb2N1bWVudGF0aW9uIGZvdW5kIHdpdGhpbiBhIEh5ZHJvbHlzaXMgZWxlbWVudCBkZXNjcmlwdG9yLiBBbHNvXG4gKiBzdXBwb3J0cyBiZWhhdmlvcnMuXG4gKlxuICogSWYgdGhlIGVsZW1lbnQgd2FzIHByb2Nlc3NlZCB2aWEgYGh5ZHJvbGl6ZWAsIHRoZSBlbGVtZW50J3MgZG9jdW1lbnRhdGlvblxuICogd2lsbCBhbHNvIGJlIGV4dHJhY3RlZCB2aWEgaXRzIDxkb20tbW9kdWxlPi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzY3JpcHRvciBUaGUgZWxlbWVudCBkZXNjcmlwdG9yLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZGVzY3JpcHRvciB0aGF0IHdhcyBnaXZlbi5cbiAqL1xuZnVuY3Rpb24gYW5ub3RhdGVFbGVtZW50KGRlc2NyaXB0b3IsIGJlaGF2aW9yc0J5TmFtZSkge1xuICAgIGlmICghZGVzY3JpcHRvci5kZXNjICYmIGRlc2NyaXB0b3IudHlwZSA9PT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgIGRlc2NyaXB0b3IuZGVzYyA9IF9maW5kRWxlbWVudERvY3MoZGVzY3JpcHRvci5pcywgZGVzY3JpcHRvci5kb21Nb2R1bGUsIGRlc2NyaXB0b3Iuc2NyaXB0RWxlbWVudCk7XG4gICAgfVxuICAgIGFubm90YXRlKGRlc2NyaXB0b3IpO1xuICAgIC8vIFRoZSBgPGRvbS1tb2R1bGU+YCBpcyB0b28gbG93IGxldmVsIGZvciBtb3N0IG5lZWRzLCBhbmQgaXQgaXMgX25vdF9cbiAgICAvLyBzZXJpYWxpemFibGUuIFNvIHdlIGRyb3AgaXQgbm93IHRoYXQgd2UndmUgZXh0cmFjdGVkIGFsbCB0aGUgdXNlZnVsIGJpdHNcbiAgICAvLyBmcm9tIGl0LlxuICAgIC8vIFRPRE86IERvbid0IHdvcnJ5IGFib3V0IHNlcmlhbGl6YWJpbGl0eSBoZXJlLCBwcm92aWRlIGFuIEFQSSB0byBnZXQgSlNPTi5cbiAgICBkZWxldGUgZGVzY3JpcHRvci5kb21Nb2R1bGU7XG4gICAgbWl4aW5CZWhhdmlvcnMoZGVzY3JpcHRvciwgYmVoYXZpb3JzQnlOYW1lKTtcbiAgICAvLyBEZXNjcmlwdG9ycyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGBkZXNjYCBwcm9wZXJ0aWVzIHBhcnNlZCBhcyBKU0RvYy5cbiAgICBkZXNjcmlwdG9yLnByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgICAgLy8gRmVhdHVyZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWFsLCBjb25maWd1cmF0aW9uIGlzIHJlYWxseSBqdXN0IGEgbWF0dGVyIG9mXG4gICAgICAgIC8vIGluaGVyaXRhbmNlLi4uXG4gICAgICAgIGFubm90YXRlUHJvcGVydHkocHJvcGVydHksIGRlc2NyaXB0b3IuYWJzdHJhY3QpO1xuICAgIH0pO1xuICAgIC8vIEl0IG1heSBzZWVtIGxpa2Ugb3ZlcmtpbGwgdG8gYWx3YXlzIHNvcnQsIGJ1dCB3ZSBoYXZlIGFuIGFzc3VtcHRpb24gdGhhdFxuICAgIC8vIHRoZXNlIHByb3BlcnRpZXMgYXJlIHR5cGljYWxseSBiZWluZyBjb25zdW1lZCBieSB1c2VyLXZpc2libGUgdG9vbGluZy5cbiAgICAvLyBBcyBzdWNoLCBpdCdzIGdvb2QgdG8gaGF2ZSBjb25zaXN0ZW50IG91dHB1dC9vcmRlcmluZyB0byBhaWQgdGhlIHVzZXIuXG4gICAgZGVzY3JpcHRvci5wcm9wZXJ0aWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgbGFzdC5cbiAgICAgICAgaWYgKGEucHJpdmF0ZSAmJiAhYi5wcml2YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmICghYS5wcml2YXRlICYmIGIucHJpdmF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBhbm5vdGF0ZUVsZW1lbnRIZWFkZXIoZGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG59XG5leHBvcnRzLmFubm90YXRlRWxlbWVudCA9IGFubm90YXRlRWxlbWVudDtcbi8qKlxuICogQW5ub3RhdGVzIGJlaGF2aW9yIGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzY3JpcHRvciBiZWhhdmlvciBkZXNjcmlwdG9yXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlc2NyaXB0b3IgcGFzc2VkIGluIGFzIHBhcmFtXG4gKi9cbmZ1bmN0aW9uIGFubm90YXRlQmVoYXZpb3IoZGVzY3JpcHRvcikge1xuICAgIGFubm90YXRlKGRlc2NyaXB0b3IpO1xuICAgIGFubm90YXRlRWxlbWVudEhlYWRlcihkZXNjcmlwdG9yKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbmV4cG9ydHMuYW5ub3RhdGVCZWhhdmlvciA9IGFubm90YXRlQmVoYXZpb3I7XG4vKipcbiAqIEFubm90YXRlcyBldmVudCBkb2N1bWVudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIF9hbm5vdGF0ZUV2ZW50KGRlc2NyaXB0b3IpIHtcbiAgICBhbm5vdGF0ZShkZXNjcmlwdG9yKTtcbiAgICAvLyBwcm9jZXNzIEBldmVudFxuICAgIHZhciBldmVudFRhZyA9IGpzZG9jLmdldFRhZyhkZXNjcmlwdG9yLmpzZG9jLCAnZXZlbnQnKTtcbiAgICBkZXNjcmlwdG9yLm5hbWUgPSBldmVudFRhZyA/IGV2ZW50VGFnLmRlc2NyaXB0aW9uIDogXCJOL0FcIjtcbiAgICAvLyBwcm9jZXNzIEBwYXJhbXNcbiAgICBkZXNjcmlwdG9yLnBhcmFtcyA9IChkZXNjcmlwdG9yLmpzZG9jLnRhZ3MgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcudGFnID09PSAncGFyYW0nO1xuICAgIH0pLm1hcChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0YWcudHlwZSB8fCBcIk4vQVwiLFxuICAgICAgICAgICAgZGVzYzogdGFnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbmFtZTogdGFnLm5hbWUgfHwgXCJOL0FcIlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHByb2Nlc3MgQHBhcmFtc1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xufVxuLyoqXG4gKiBBbm5vdGF0ZXMgZG9jdW1lbnRhdGlvbiBmb3VuZCBhYm91dCBhIEh5ZHJvbHlzaXMgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzY3JpcHRvciBUaGUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQ29uZmlndXJhdGlvbiBJZiB0cnVlLCBgY29uZmlndXJhdGlvbmAgaXMgbm90IHNldC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGRlc2NyaXB0aW9yIHRoYXQgd2FzIGdpdmVuLlxuICovXG5mdW5jdGlvbiBhbm5vdGF0ZVByb3BlcnR5KGRlc2NyaXB0b3IsIGlnbm9yZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBhbm5vdGF0ZShkZXNjcmlwdG9yKTtcbiAgICBpZiAoZGVzY3JpcHRvci5uYW1lWzBdID09PSAnXycgfHwganNkb2MuaGFzVGFnKGRlc2NyaXB0b3IuanNkb2MsICdwcml2YXRlJykpIHtcbiAgICAgICAgZGVzY3JpcHRvci5wcml2YXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVDb25maWd1cmF0aW9uICYmIEVMRU1FTlRfQ09ORklHVVJBVElPTi5pbmRleE9mKGRlc2NyaXB0b3IubmFtZSkgIT09IC0xKSB7XG4gICAgICAgIGRlc2NyaXB0b3IucHJpdmF0ZSA9IHRydWU7XG4gICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIC8vIEB0eXBlIEpTRG9jIHdpbnNcbiAgICBkZXNjcmlwdG9yLnR5cGUgPSBqc2RvYy5nZXRUYWcoZGVzY3JpcHRvci5qc2RvYywgJ3R5cGUnLCAndHlwZScpIHx8IGRlc2NyaXB0b3IudHlwZTtcbiAgICBpZiAoZGVzY3JpcHRvci50eXBlLm1hdGNoKC9eZnVuY3Rpb24vaSkpIHtcbiAgICAgICAgX2Fubm90YXRlRnVuY3Rpb25Qcm9wZXJ0eShkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgLy8gQGRlZmF1bHQgSlNEb2Mgd2luc1xuICAgIHZhciBkZWZhdWx0VGFnID0ganNkb2MuZ2V0VGFnKGRlc2NyaXB0b3IuanNkb2MsICdkZWZhdWx0Jyk7XG4gICAgaWYgKGRlZmF1bHRUYWcgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG5ld0RlZmF1bHQgPSAoZGVmYXVsdFRhZy5uYW1lIHx8ICcnKSArIChkZWZhdWx0VGFnLmRlc2NyaXB0aW9uIHx8ICcnKTtcbiAgICAgICAgaWYgKG5ld0RlZmF1bHQgIT09ICcnKSB7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLmRlZmF1bHQgPSBuZXdEZWZhdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xufVxuZnVuY3Rpb24gX2Fubm90YXRlRnVuY3Rpb25Qcm9wZXJ0eShkZXNjcmlwdG9yKSB7XG4gICAgZGVzY3JpcHRvci5mdW5jdGlvbiA9IHRydWU7XG4gICAgdmFyIHJldHVyblRhZyA9IGpzZG9jLmdldFRhZyhkZXNjcmlwdG9yLmpzZG9jLCAncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblRhZykge1xuICAgICAgICBkZXNjcmlwdG9yLnJldHVybiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHJldHVyblRhZy50eXBlLFxuICAgICAgICAgICAgZGVzYzogcmV0dXJuVGFnLmRlc2NyaXB0aW9uXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBwYXJhbXNCeU5hbWUgPSB7fTtcbiAgICAoZGVzY3JpcHRvci5wYXJhbXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtc0J5TmFtZVtwYXJhbS5uYW1lXSA9IHBhcmFtO1xuICAgIH0pO1xuICAgIChkZXNjcmlwdG9yLmpzZG9jICYmIGRlc2NyaXB0b3IuanNkb2MudGFncyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIGlmICh0YWcudGFnICE9PSAncGFyYW0nKSByZXR1cm47XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc0J5TmFtZVt0YWcubmFtZV07XG4gICAgICAgIGlmICghcGFyYW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbS50eXBlID0gdGFnLnR5cGUgfHwgcGFyYW0udHlwZTtcbiAgICAgICAgcGFyYW0uZGVzYyA9IHRhZy5kZXNjcmlwdGlvbjtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydHMgcmF3IGZlYXR1cmVzIGludG8gYW4gYWJzdHJhY3QgYFBvbHltZXIuQmFzZWAgZWxlbWVudC5cbiAqXG4gKiBOb3RlIHRoYXQgZG9jcyBvbiB0aGlzIGVsZW1lbnQgX2FyZSBub3QgcHJvY2Vzc2VkXy4gWW91IG11c3QgY2FsbFxuICogYGFubm90YXRlRWxlbWVudGAgb24gaXQgeW91cnNlbGYgaWYgeW91IHdpc2ggdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PEZlYXR1cmVEZXNjcmlwdG9yPn0gZmVhdHVyZXNcbiAqIEByZXR1cm4ge0VsZW1lbnREZXNjcmlwdG9yfVxuICovXG5mdW5jdGlvbiBmZWF0dXJlRWxlbWVudChmZWF0dXJlcykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gZmVhdHVyZXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGZlYXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5jb25jYXQoZmVhdHVyZS5wcm9wZXJ0aWVzKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgICBpczogJ1BvbHltZXIuQmFzZScsXG4gICAgICAgIGFic3RyYWN0OiB0cnVlLFxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuICAgICAgICBkZXNjOiAnYFBvbHltZXIuQmFzZWAgYWN0cyBhcyBhIGJhc2UgcHJvdG90eXBlIGZvciBhbGwgUG9seW1lciAnICsgJ2VsZW1lbnRzLiBJdCBpcyBjb21wb3NlZCB2aWEgdmFyaW91cyBjYWxscyB0byAnICsgJ2BQb2x5bWVyLkJhc2UuX2FkZEZlYXR1cmUoKWAuXFxuJyArICdcXG4nICsgJ1RoZSBwcm9wZXJ0aWVzIHJlZmxlY3RlZCBoZXJlIGFyZSB0aGUgY29tYmluZWQgdmlldyBvZiBhbGwgJyArICdmZWF0dXJlcyBmb3VuZCBpbiB0aGlzIGxpYnJhcnkuIFRoZXJlIG1heSBiZSBtb3JlIHByb3BlcnRpZXMgJyArICdhZGRlZCB2aWEgb3RoZXIgbGlicmFyaWVzLCBhcyB3ZWxsLidcbiAgICB9O1xufVxuZXhwb3J0cy5mZWF0dXJlRWxlbWVudCA9IGZlYXR1cmVFbGVtZW50O1xuLyoqXG4gKiBDbGVhbnMgcmVkdW5kYW50IHByb3BlcnRpZXMgZnJvbSBhIGRlc2NyaXB0b3IsIGFzc3VtaW5nIHRoYXQgeW91IGhhdmUgYWxyZWFkeVxuICogY2FsbGVkIGBhbm5vdGF0ZWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlc2NyaXB0b3JcbiAqL1xuZnVuY3Rpb24gY2xlYW4oZGVzY3JpcHRvcikge1xuICAgIGlmICghZGVzY3JpcHRvci5qc2RvYykgcmV0dXJuO1xuICAgIC8vIFRoZSBkb2N0ZXh0IHdhcyB3cml0dGVuIHRvIGBkZXNjcmlwdG9yLmRlc2NgXG4gICAgZGVsZXRlIGRlc2NyaXB0b3IuanNkb2MuZGVzY3JpcHRpb247XG4gICAgZGVsZXRlIGRlc2NyaXB0b3IuanNkb2Mub3JpZztcbiAgICB2YXIgY2xlYW5UYWdzID0gW107XG4gICAgKGRlc2NyaXB0b3IuanNkb2MudGFncyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIC8vIERyb3AgYW55IHRhZ3Mgd2UndmUgY29uc3VtZWQuXG4gICAgICAgIGlmIChIQU5ETEVEX1RBR1MuaW5kZXhPZih0YWcudGFnKSAhPT0gLTEpIHJldHVybjtcbiAgICAgICAgY2xlYW5UYWdzLnB1c2godGFnKTtcbiAgICB9KTtcbiAgICBpZiAoY2xlYW5UYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBObyB0YWdzPyBubyBkb2NzIGxlZnQhXG4gICAgICAgIGRlbGV0ZSBkZXNjcmlwdG9yLmpzZG9jO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0b3IuanNkb2MudGFncyA9IGNsZWFuVGFncztcbiAgICB9XG59XG5leHBvcnRzLmNsZWFuID0gY2xlYW47XG4vKipcbiAqIENsZWFucyByZWR1bmRhbnQgcHJvcGVydGllcyBmcm9tIGFuIGVsZW1lbnQsIGFzc3VtaW5nIHRoYXQgeW91IGhhdmUgYWxyZWFkeVxuICogY2FsbGVkIGBhbm5vdGF0ZUVsZW1lbnRgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudERlc2NyaXB0b3J8QmVoYXZpb3JEZXNjcmlwdG9yfSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNsZWFuRWxlbWVudChlbGVtZW50KSB7XG4gICAgY2xlYW4oZWxlbWVudCk7XG4gICAgZWxlbWVudC5wcm9wZXJ0aWVzLmZvckVhY2goY2xlYW5Qcm9wZXJ0eSk7XG59XG5leHBvcnRzLmNsZWFuRWxlbWVudCA9IGNsZWFuRWxlbWVudDtcbi8qKlxuICogQ2xlYW5zIHJlZHVuZGFudCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSwgYXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5XG4gKiBjYWxsZWQgYGFubm90YXRlUHJvcGVydHlgLlxuICpcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBjbGVhblByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgY2xlYW4ocHJvcGVydHkpO1xufVxuLyoqXG4gKiBQYXJzZSBlbGVtZW50cyBkZWZpbmVkIG9ubHkgaW4gY29tbWVudHMuXG4gKiBAcGFyYW0gIHtjb21tZW50c30gQXJyYXk8c3RyaW5nPiBBIGxpc3Qgb2YgY29tbWVudHMgdG8gcGFyc2UuXG4gKiBAcmV0dXJuIHtFbGVtZW50RGVzY3JpcHRvcn0gICAgICBBIGxpc3Qgb2YgcHNldWRvLWVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBwYXJzZVBzZXVkb0VsZW1lbnRzKGNvbW1lbnRzKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgY29tbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tbWVudCkge1xuICAgICAgICB2YXIgcGFyc2VkSnNkb2MgPSBqc2RvYy5wYXJzZUpzZG9jKGNvbW1lbnQpO1xuICAgICAgICB2YXIgcHNldWRvVGFnID0ganNkb2MuZ2V0VGFnKHBhcnNlZEpzZG9jLCAncHNldWRvRWxlbWVudCcsICduYW1lJyk7XG4gICAgICAgIGlmIChwc2V1ZG9UYWcpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIGlzOiBwc2V1ZG9UYWcsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgICAgICAgICAgIGpzZG9jOiB7IGRlc2NyaXB0aW9uOiBwYXJzZWRKc2RvYy5kZXNjcmlwdGlvbiwgdGFnczogcGFyc2VkSnNkb2MudGFncyB9LFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgICAgICAgIGRlc2M6IHBhcnNlZEpzZG9jLmRlc2NyaXB0aW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYW5ub3RhdGVFbGVtZW50SGVhZGVyKGVsZW1lbnQpO1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50cztcbn1cbmV4cG9ydHMucGFyc2VQc2V1ZG9FbGVtZW50cyA9IHBhcnNlUHNldWRvRWxlbWVudHM7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbGVtZW50SWRcbiAqIEBwYXJhbSB7RG9jdW1lbnRBU1R9IGRvbU1vZHVsZVxuICogQHBhcmFtIHtEb2N1bWVudEFTVH0gc2NyaXB0RWxlbWVudCBUaGUgc2NyaXB0IHRoYXQgdGhlIGVsZW1lbnQgd2FzXG4gKiAgICAgZGVmaW5lZCBpbi5cbiAqL1xuZnVuY3Rpb24gX2ZpbmRFbGVtZW50RG9jcyhlbGVtZW50SWQsIGRvbU1vZHVsZSwgc2NyaXB0RWxlbWVudCkge1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBjb25jYXRlbmF0ZSBkb2NzIGZyb20gYWxsIHNvdXJjZXMgaWYgd2UgZmluZCB0aGVtLlxuICAgIC8vIGVsZW1lbnQgY2FuIGJlIGRlZmluZWQgaW46XG4gICAgLy8gaHRtbCBjb21tZW50IHJpZ2h0IGJlZm9yZSBkb20tbW9kdWxlXG4gICAgLy8gaHRtbCBjb21tbmV0IHJpZ2h0IGJlZm9yZSBzY3JpcHQgZGVmaW5pbmcgdGhlIG1vZHVsZSxcbiAgICAvLyBpZiBkb20tbW9kdWxlIGlzIGVtcHR5XG4gICAgdmFyIGZvdW5kID0gW107XG4gICAgLy8gRG8gd2UgaGF2ZSBhIEhUTUwgY29tbWVudCBvbiB0aGUgYDxkb20tbW9kdWxlPmAgb3IgYDxzY3JpcHQ+YD9cbiAgICAvL1xuICAgIC8vIENvbmZ1c2luZ2x5LCB3aXRoIG91ciBjdXJyZW50IHN0eWxlLCB0aGUgY29tbWVudCB3aWxsIGJlIGF0dGFjaGVkIHRvXG4gICAgLy8gYDxoZWFkPmAsIHJhdGhlciB0aGFuIGJlaW5nIGEgc2libGluZyB0byB0aGUgYDxkb20tbW9kdWxlPmBcbiAgICB2YXIgc2VhcmNoUm9vdCA9IGRvbU1vZHVsZSB8fCBzY3JpcHRFbGVtZW50O1xuICAgIHZhciBwYXJlbnRzID0gZG9tNS5ub2RlV2Fsa0FsbFByaW9yKHNlYXJjaFJvb3QsIGRvbTUuaXNDb21tZW50Tm9kZSk7XG4gICAgdmFyIGNvbW1lbnQgPSBwYXJlbnRzLmxlbmd0aCA+IDAgPyBwYXJlbnRzWzBdIDogbnVsbDtcbiAgICBpZiAoY29tbWVudCAmJiBjb21tZW50LmRhdGEpIHtcbiAgICAgICAgZm91bmQucHVzaChjb21tZW50LmRhdGEpO1xuICAgIH1cbiAgICBpZiAoZm91bmQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZm91bmQuZmlsdGVyKGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgIC8vIHNraXAgQGxpY2Vuc2UgY29tbWVudHNcbiAgICAgICAgaWYgKGNvbW1lbnQgJiYgY29tbWVudC5pbmRleE9mKCdAbGljZW5zZScpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KS5tYXAoanNkb2MudW5pbmRlbnQpLmpvaW4oJ1xcbicpO1xufVxuZnVuY3Rpb24gX2ZpbmRMYXN0Q2hpbGROYW1lZChuYW1lLCBwYXJlbnQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcbiAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZSA9PT0gbmFtZSkgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIFRPRE8obmV2aXIpOiBwYXJzZTUtdXRpbHMhXG5mdW5jdGlvbiBfZ2V0Tm9kZUF0dHJpYnV0ZShub2RlLCBuYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhdHRyID0gbm9kZS5hdHRyc1tpXTtcbiAgICAgICAgaWYgKGF0dHIubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlc3RyYXZlcnNlID0gcmVxdWlyZSgnZXN0cmF2ZXJzZScpO1xudmFyIGVzdXRpbCA9IHJlcXVpcmUoJy4vZXN1dGlsJyk7XG52YXIgZGVjbGFyYXRpb25fcHJvcGVydHlfaGFuZGxlcnNfMSA9IHJlcXVpcmUoJy4vZGVjbGFyYXRpb24tcHJvcGVydHktaGFuZGxlcnMnKTtcbnZhciBkb2NzID0gcmVxdWlyZSgnLi9kb2NzJyk7XG5mdW5jdGlvbiBlbGVtZW50RmluZGVyKCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGVsZW1lbnRzIGV4cG9ydGVkIGJ5IGVhY2ggdHJhdmVyc2VkIHNjcmlwdC5cbiAgICAgKi9cbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCBiZWluZyBidWlsdCBkdXJpbmcgYSB0cmF2ZXJzYWw7XG4gICAgICovXG4gICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBwcm9wZXJ0eUhhbmRsZXJzID0gbnVsbDtcbiAgICB2YXIgdmlzaXRvcnMgPSB7XG4gICAgICAgIGNsYXNzRGV0ZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBlbnRlckNsYXNzRGVjbGFyYXRpb246IGZ1bmN0aW9uIGVudGVyQ2xhc3NEZWNsYXJhdGlvbihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgICAgICAgICAgICBkZXNjOiBlc3V0aWwuZ2V0QXR0YWNoZWRDb21tZW50KG5vZGUpLFxuICAgICAgICAgICAgICAgIGV2ZW50czogZXN1dGlsLmdldEV2ZW50Q29tbWVudHMobm9kZSkubWFwKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZXNjOiBldmVudCB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yczogW10sXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXJzOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBkZWNsYXJhdGlvbl9wcm9wZXJ0eV9oYW5kbGVyc18xLmRlY2xhcmF0aW9uUHJvcGVydHlIYW5kbGVycyhlbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgbGVhdmVDbGFzc0RlY2xhcmF0aW9uOiBmdW5jdGlvbiBsZWF2ZUNsYXNzRGVjbGFyYXRpb24obm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb2NzLmFubm90YXRlKHByb3BlcnR5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbGFzc0RldGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudGVyQXNzaWdubWVudEV4cHJlc3Npb246IGZ1bmN0aW9uIGVudGVyQXNzaWdubWVudEV4cHJlc3Npb24obm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbGVmdCA9IG5vZGUubGVmdDtcbiAgICAgICAgICAgIGlmIChsZWZ0ICYmIGxlZnQub2JqZWN0ICYmIGxlZnQub2JqZWN0LnR5cGUgIT09ICdUaGlzRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcHJvcCA9IGxlZnQucHJvcGVydHk7XG4gICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBwcm9wZXJ0eUhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnNbbmFtZV0obm9kZS5yaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnRlck1ldGhvZERlZmluaXRpb246IGZ1bmN0aW9uIGVudGVyTWV0aG9kRGVmaW5pdGlvbihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwcm9wID0ge1xuICAgICAgICAgICAgICAgIGtleTogbm9kZS5rZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG4gICAgICAgICAgICAgICAga2luZDogbm9kZS5raW5kLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsZWFkaW5nQ29tbWVudHM6IG5vZGUubGVhZGluZ0NvbW1lbnRzLFxuICAgICAgICAgICAgICAgIHNob3J0aGFuZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdQcm9wZXJ0eSdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgcHJvcERlc2MgPSBkb2NzLmFubm90YXRlKGVzdXRpbC50b1Byb3BlcnR5RGVzY3JpcHRvcihwcm9wKSk7XG4gICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wLmtpbmQgPT09ICdnZXQnICYmIChwcm9wRGVzYy5uYW1lID09PSAnYmVoYXZpb3JzJyB8fCBwcm9wRGVzYy5uYW1lID09PSAnb2JzZXJ2ZXJzJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmV0dXJuU3RhdGVtZW50ID0gbm9kZS52YWx1ZS5ib2R5LmJvZHlbMF07XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3VtZW50ID0gcmV0dXJuU3RhdGVtZW50LmFyZ3VtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwcm9wRGVzYy5uYW1lID09PSAnYmVoYXZpb3JzJykge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmJlaGF2aW9ycy5wdXNoKGVsZW1lbnRPYmplY3QubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnRPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub2JzZXJ2ZXJzLnB1c2goeyBqYXZhc2NyaXB0Tm9kZTogZWxlbWVudE9iamVjdCwgZXhwcmVzc2lvbjogZWxlbWVudE9iamVjdC5yYXcgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLnB1c2gocHJvcERlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnRlckNhbGxFeHByZXNzaW9uOiBmdW5jdGlvbiBlbnRlckNhbGxFeHByZXNzaW9uKG5vZGUsIHBhcmVudCkge1xuICAgICAgICAgICAgLy8gV2hlbiBkZWFsaW5nIHdpdGggYSBjbGFzcywgZW50ZXJDYWxsRXhwcmVzc2lvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHBhcnNpbmcgYWN0dWFsbHkgc3RhcnRzXG4gICAgICAgICAgICBpZiAodGhpcy5jbGFzc0RldGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzdHJhdmVyc2UuVmlzaXRvck9wdGlvbi5Ta2lwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhbGxlZSA9IG5vZGUuY2FsbGVlO1xuICAgICAgICAgICAgaWYgKGNhbGxlZS50eXBlID09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICAgIHZhciBpZGVudCA9IGNhbGxlZTtcbiAgICAgICAgICAgICAgICBpZiAoaWRlbnQubmFtZSA9PSAnUG9seW1lcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGVzdXRpbC5nZXRBdHRhY2hlZENvbW1lbnQocGFyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXN1dGlsLmdldEV2ZW50Q29tbWVudHMocGFyZW50KS5tYXAoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVzYzogZXZlbnQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBkZWNsYXJhdGlvbl9wcm9wZXJ0eV9oYW5kbGVyc18xLmRlY2xhcmF0aW9uUHJvcGVydHlIYW5kbGVycyhlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxlYXZlQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIGxlYXZlQ2FsbEV4cHJlc3Npb24obm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgY2FsbGVlID0gbm9kZS5jYWxsZWU7XG4gICAgICAgICAgICB2YXIgYXJncyA9IG5vZGUuYXJndW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNhbGxlZS50eXBlID09ICdJZGVudGlmaWVyJyAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLnR5cGUgPT09ICdPYmplY3RFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgICAgIHZhciBpZGVudCA9IGNhbGxlZTtcbiAgICAgICAgICAgICAgICBpZiAoaWRlbnQubmFtZSA9PSAnUG9seW1lcicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnRlck9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIGVudGVyT2JqZWN0RXhwcmVzc2lvbihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gZGVhbGluZyB3aXRoIGEgY2xhc3MsIHRoZXJlIGlzIG5vIHNpbmdsZSBvYmplY3QgdGhhdCB3ZSBjYW4gcGFyc2UgdG8gcmV0cmlldmUgYWxsIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzRGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXN0cmF2ZXJzZS5WaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudCAmJiAhZWxlbWVudC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgZWxlbWVudC5iZWhhdmlvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm9ic2VydmVycyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBnZXR0ZXJzID0ge307XG4gICAgICAgICAgICAgICAgdmFyIHNldHRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICB2YXIgZGVmaW5lZFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IG5vZGUucHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBlc3V0aWwub2JqZWN0S2V5VG9TdHJpbmcocHJvcC5rZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2FudCBkZXRlcm1pbmUgbmFtZSBmb3IgcHJvcGVydHkga2V5LicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IG5vZGUubG9jLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIHByb3BlcnR5SGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SGFuZGxlcnNbbmFtZV0ocHJvcC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGVzdXRpbC50b1Byb3BlcnR5RGVzY3JpcHRvcihwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJzW2Rlc2NyaXB0b3IubmFtZV0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3Iuc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzW2Rlc2NyaXB0b3IubmFtZV0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLnB1c2goZXN1dGlsLnRvUHJvcGVydHlEZXNjcmlwdG9yKHByb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhnZXR0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChnZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldCA9IGdldHRlcnNbZ2V0dGVyXTtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZFByb3BlcnRpZXNbZ2V0Lm5hbWVdID0gZ2V0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHNldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHNldHRlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2V0ID0gc2V0dGVyc1tzZXR0ZXJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShzZXQubmFtZSBpbiBkZWZpbmVkUHJvcGVydGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRQcm9wZXJ0aWVzW3NldC5uYW1lXSA9IHNldDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRQcm9wZXJ0aWVzW3NldC5uYW1lXS5zZXR0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmaW5lZFByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSBkZWZpbmVkUHJvcGVydGllc1twXTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzdHJhdmVyc2UuVmlzaXRvck9wdGlvbi5Ta2lwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4geyB2aXNpdG9yczogdmlzaXRvcnMsIGVsZW1lbnRzOiBlbGVtZW50cyB9O1xufVxuZXhwb3J0cy5lbGVtZW50RmluZGVyID0gZWxlbWVudEZpbmRlcjtcbjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBlc3RyYXZlcnNlID0gcmVxdWlyZShcImVzdHJhdmVyc2VcIik7XG52YXIgZXNjb2RlZ2VuID0gcmVxdWlyZSgnZXNjb2RlZ2VuJyk7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhbiBFc3ByZWUgbm9kZSBtYXRjaGVzIGEgcGFydGljdWxhciBvYmplY3QgcGF0aC5cbiAqXG4gKiBlLmcuIHlvdSBoYXZlIGEgTWVtYmVyRXhwcmVzc2lvbiBub2RlLCBhbmQgd2FudCB0byBzZWUgd2hldGhlciBpdCByZXByZXNlbnRzXG4gKiBgRm9vLkJhci5CYXpgOlxuICpcbiAqICAgICBtYXRjaGVzQ2FsbEV4cHJlc3Npb24obm9kZSwgWydGb28nLCAnQmFyJywgJ0JheiddKVxuICpcbiAqIEBwYXJhbSB7RVNUcmVlLk5vZGV9IGV4cHJlc3Npb24gVGhlIEVzcHJlZSBub2RlIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBhdGggVGhlIHBhdGggdG8gbG9vayBmb3IuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uLCBwYXRoKSB7XG4gICAgaWYgKCFleHByZXNzaW9uLnByb3BlcnR5IHx8ICFleHByZXNzaW9uLm9iamVjdCkgcmV0dXJuO1xuICAgIGNvbnNvbGUuYXNzZXJ0KHBhdGgubGVuZ3RoID49IDIpO1xuICAgIGlmIChleHByZXNzaW9uLnByb3BlcnR5LnR5cGUgIT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcm9wZXJ0eSA9IGV4cHJlc3Npb24ucHJvcGVydHk7XG4gICAgLy8gVW5yYXZlbCBiYWNrd2FyZHMsIG1ha2Ugc3VyZSBwcm9wZXJ0aWVzIG1hdGNoIGVhY2ggc3RlcCBvZiB0aGUgd2F5LlxuICAgIGlmIChwcm9wZXJ0eS5uYW1lICE9PSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0pIHJldHVybiBmYWxzZTtcbiAgICAvLyBXZSd2ZSBnb3Qgb3Vyc2VsdmVzIGEgZmluYWwgbWVtYmVyIGV4cHJlc3Npb24uXG4gICAgaWYgKHBhdGgubGVuZ3RoID09IDIgJiYgZXhwcmVzc2lvbi5vYmplY3QudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uLm9iamVjdC5uYW1lID09PSBwYXRoWzBdO1xuICAgIH1cbiAgICAvLyBOZXN0ZWQgZXhwcmVzc2lvbnMuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMiAmJiBleHByZXNzaW9uLm9iamVjdC50eXBlID09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc0NhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24ub2JqZWN0LCBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLm1hdGNoZXNDYWxsRXhwcmVzc2lvbiA9IG1hdGNoZXNDYWxsRXhwcmVzc2lvbjtcbi8qKlxuICogQHBhcmFtIHtOb2RlfSBrZXkgVGhlIG5vZGUgcmVwcmVzZW50aW5nIGFuIG9iamVjdCBrZXkgb3IgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhhdCBrZXkuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdEtleVRvU3RyaW5nKGtleSkge1xuICAgIGlmIChrZXkudHlwZSA9PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIGtleS5uYW1lO1xuICAgIH1cbiAgICBpZiAoa2V5LnR5cGUgPT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgIHJldHVybiBrZXkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKGtleS50eXBlID09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICB2YXIgbUV4ID0ga2V5O1xuICAgICAgICByZXR1cm4gb2JqZWN0S2V5VG9TdHJpbmcobUV4Lm9iamVjdCkgKyAnLicgKyBvYmplY3RLZXlUb1N0cmluZyhtRXgucHJvcGVydHkpO1xuICAgIH1cbn1cbmV4cG9ydHMub2JqZWN0S2V5VG9TdHJpbmcgPSBvYmplY3RLZXlUb1N0cmluZztcbnZhciBDTE9TVVJFX0NPTlNUUlVDVE9SX01BUCA9IHtcbiAgICAnQm9vbGVhbic6ICdib29sZWFuJyxcbiAgICAnTnVtYmVyJzogJ251bWJlcicsXG4gICAgJ1N0cmluZyc6ICdzdHJpbmcnXG59O1xuLyoqXG4gKiBBU1QgZXhwcmVzc2lvbiAtPiBDbG9zdXJlIHR5cGUuXG4gKlxuICogQWNjZXB0cyBsaXRlcmFsIHZhbHVlcywgYW5kIG5hdGl2ZSBjb25zdHJ1Y3RvcnMuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIEFuIEVzcHJlZSBleHByZXNzaW9uIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0eXBlIG9mIHRoYXQgZXhwcmVzc2lvbiwgaW4gQ2xvc3VyZSB0ZXJtcy5cbiAqL1xuZnVuY3Rpb24gY2xvc3VyZVR5cGUobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUubWF0Y2goL0V4cHJlc3Npb24kLykpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUudHlwZS5zdWJzdHIoMCwgbm9kZS50eXBlLmxlbmd0aCAtIDEwKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgIHJldHVybiBfdHlwZW9mKG5vZGUudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgdmFyIGlkZW50ID0gbm9kZTtcbiAgICAgICAgcmV0dXJuIENMT1NVUkVfQ09OU1RSVUNUT1JfTUFQW2lkZW50Lm5hbWVdIHx8IGlkZW50Lm5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgbWVzc2FnZTogJ1Vua25vd24gQ2xvc3VyZSB0eXBlIGZvciBub2RlOiAnICsgbm9kZS50eXBlLFxuICAgICAgICAgICAgbG9jYXRpb246IG5vZGUubG9jLnN0YXJ0XG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5jbG9zdXJlVHlwZSA9IGNsb3N1cmVUeXBlO1xuZnVuY3Rpb24gZ2V0QXR0YWNoZWRDb21tZW50KG5vZGUpIHtcbiAgICB2YXIgY29tbWVudHMgPSBnZXRMZWFkaW5nQ29tbWVudHMobm9kZSkgfHwgZ2V0TGVhZGluZ0NvbW1lbnRzKG5vZGVbJ2tleSddKTtcbiAgICBpZiAoIWNvbW1lbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xufVxuZXhwb3J0cy5nZXRBdHRhY2hlZENvbW1lbnQgPSBnZXRBdHRhY2hlZENvbW1lbnQ7XG4vKipcbiAqIFJldHVybnMgYWxsIGNvbW1lbnRzIGZyb20gYSB0cmVlIGRlZmluZWQgd2l0aCBAZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q29tbWVudHMobm9kZSkge1xuICAgIHZhciBldmVudENvbW1lbnRzID0gW107XG4gICAgZXN0cmF2ZXJzZS50cmF2ZXJzZShub2RlLCB7XG4gICAgICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihub2RlKSB7XG4gICAgICAgICAgICB2YXIgY29tbWVudHMgPSAobm9kZS5sZWFkaW5nQ29tbWVudHMgfHwgW10pLmNvbmNhdChub2RlLnRyYWlsaW5nQ29tbWVudHMgfHwgW10pLm1hcChmdW5jdGlvbiAoY29tbWVudEFTVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21tZW50QVNULnZhbHVlO1xuICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQuaW5kZXhPZihcIkBldmVudFwiKSAhPSAtMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnRDb21tZW50cyA9IGV2ZW50Q29tbWVudHMuY29uY2F0KGNvbW1lbnRzKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5czoge1xuICAgICAgICAgICAgU3VwZXI6IFtdXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBkZWR1cFxuICAgIHJldHVybiBldmVudENvbW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoZWwsIGluZGV4LCBhcnJheSkge1xuICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihlbCkgPT09IGluZGV4O1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRFdmVudENvbW1lbnRzID0gZ2V0RXZlbnRDb21tZW50cztcbmZ1bmN0aW9uIGdldExlYWRpbmdDb21tZW50cyhub2RlKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNvbW1lbnRzID0gbm9kZS5sZWFkaW5nQ29tbWVudHM7XG4gICAgaWYgKCFjb21tZW50cyB8fCBjb21tZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICByZXR1cm4gY29tbWVudHMubWFwKGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgIHJldHVybiBjb21tZW50LnZhbHVlO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGVzdHJlZSBQcm9wZXJ0eSBBU1Qgbm9kZSBpbnRvIGl0cyBIeWRyb2x5c2lzIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiB0b1Byb3BlcnR5RGVzY3JpcHRvcihub2RlKSB7XG4gICAgdmFyIHR5cGUgPSBjbG9zdXJlVHlwZShub2RlLnZhbHVlKTtcbiAgICBpZiAodHlwZSA9PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gXCJnZXRcIiB8fCBub2RlLmtpbmQgPT09IFwic2V0XCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnJztcbiAgICAgICAgICAgIG5vZGVbbm9kZS5raW5kICsgXCJ0ZXJcIl0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG9iamVjdEtleVRvU3RyaW5nKG5vZGUua2V5KSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgZGVzYzogZ2V0QXR0YWNoZWRDb21tZW50KG5vZGUpLFxuICAgICAgICBqYXZhc2NyaXB0Tm9kZTogbm9kZVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09ICdGdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgcmVzdWx0LnBhcmFtcyA9ICh2YWx1ZS5wYXJhbXMgfHwgW10pLm1hcChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICAgIC8vIFdpdGggRVM2IHdlIGNhbiBoYXZlIGEgdmFyaWV0eSBvZiBwYXJhbSBwYXR0ZXJucy4gQmVzdCB0byBsZWF2ZSB0aGVcbiAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdG8gZXNjb2RlZ2VuLlxuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogZXNjb2RlZ2VuLmdlbmVyYXRlKHBhcmFtKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMudG9Qcm9wZXJ0eURlc2NyaXB0b3IgPSB0b1Byb3BlcnR5RGVzY3JpcHRvcjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGVzdXRpbCA9IHJlcXVpcmUoJy4vZXN1dGlsJyk7XG52YXIgbnVtRmVhdHVyZXMgPSAwO1xuZnVuY3Rpb24gZmVhdHVyZUZpbmRlcigpIHtcbiAgICAvKiogVGhlIGZlYXR1cmVzIHdlJ3ZlIGZvdW5kLiAqL1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIF9leHRyYWN0RGVzYyhmZWF0dXJlLCBub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgZmVhdHVyZS5kZXNjID0gZXN1dGlsLmdldEF0dGFjaGVkQ29tbWVudChwYXJlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfZXh0cmFjdFByb3BlcnRpZXMoZmVhdHVyZSwgbm9kZSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBmZWF0dXJlTm9kZSA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoZmVhdHVyZU5vZGUudHlwZSAhPT0gJ09iamVjdEV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0V4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIFBvbHltZXIuQmFzZS5fYWRkRmVhdHVyZSB0byBiZSBhbiBvYmplY3QuJywgJ0dvdCcsIGZlYXR1cmVOb2RlLnR5cGUsICdpbnN0ZWFkLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmpFeHByID0gZmVhdHVyZU5vZGU7XG4gICAgICAgIGlmICghb2JqRXhwci5wcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IG9iakV4cHIucHJvcGVydGllcy5tYXAoZXN1dGlsLnRvUHJvcGVydHlEZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgdmFyIHZpc2l0b3JzID0ge1xuICAgICAgICBlbnRlckNhbGxFeHByZXNzaW9uOiBmdW5jdGlvbiBlbnRlckNhbGxFeHByZXNzaW9uKG5vZGUsIHBhcmVudCkge1xuICAgICAgICAgICAgdmFyIGlzQWRkRmVhdHVyZUNhbGwgPSBlc3V0aWwubWF0Y2hlc0NhbGxFeHByZXNzaW9uKG5vZGUuY2FsbGVlLCBbJ1BvbHltZXInLCAnQmFzZScsICdfYWRkRmVhdHVyZSddKTtcbiAgICAgICAgICAgIGlmICghaXNBZGRGZWF0dXJlQ2FsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IUZlYXR1cmVEZXNjcmlwdG9yfSAqL1xuICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSB7fTtcbiAgICAgICAgICAgIF9leHRyYWN0RGVzYyhmZWF0dXJlLCBub2RlLCBwYXJlbnQpO1xuICAgICAgICAgICAgX2V4dHJhY3RQcm9wZXJ0aWVzKGZlYXR1cmUsIG5vZGUsIHBhcmVudCk7XG4gICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4geyB2aXNpdG9yczogdmlzaXRvcnMsIGZlYXR1cmVzOiBmZWF0dXJlcyB9O1xufVxuZXhwb3J0cy5mZWF0dXJlRmluZGVyID0gZmVhdHVyZUZpbmRlcjtcbjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGRvbTUgPSByZXF1aXJlKCdkb201Jyk7XG52YXIgcCA9IGRvbTUucHJlZGljYXRlcztcbnZhciBpc0h0bWxJbXBvcnROb2RlID0gcC5BTkQocC5oYXNUYWdOYW1lKCdsaW5rJyksIHAuaGFzQXR0clZhbHVlKCdyZWwnLCAnaW1wb3J0JyksIHAuTk9UKHAuaGFzQXR0clZhbHVlKCd0eXBlJywgJ2NzcycpKSk7XG52YXIgaXNTdHlsZU5vZGUgPSBwLk9SKFxuLy8gaW5saW5lIHN0eWxlXG5wLmhhc1RhZ05hbWUoJ3N0eWxlJyksXG4vLyBleHRlcm5hbCBzdHlsZXNoZWV0XG5wLkFORChwLmhhc1RhZ05hbWUoJ2xpbmsnKSwgcC5oYXNBdHRyVmFsdWUoJ3JlbCcsICdzdHlsZXNoZWV0JykpLFxuLy8gcG9seW1lciBzcGVjaWZpYyBleHRlcm5hbCBzdHlsZXNoZWV0XG5wLkFORChwLmhhc1RhZ05hbWUoJ2xpbmsnKSwgcC5oYXNBdHRyVmFsdWUoJ3JlbCcsICdpbXBvcnQnKSwgcC5oYXNBdHRyVmFsdWUoJ3R5cGUnLCAnY3NzJykpKTtcbnZhciBpc0pTU2NyaXB0Tm9kZSA9IHAuQU5EKHAuaGFzVGFnTmFtZSgnc2NyaXB0JyksIHAuT1IocC5OT1QocC5oYXNBdHRyKCd0eXBlJykpLCBwLmhhc0F0dHJWYWx1ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKSwgcC5oYXNBdHRyVmFsdWUoJ3R5cGUnLCAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcpKSk7XG5mdW5jdGlvbiBhZGROb2RlKG5vZGUsIHJlZ2lzdHJ5KSB7XG4gICAgaWYgKGlzSHRtbEltcG9ydE5vZGUobm9kZSkpIHtcbiAgICAgICAgcmVnaXN0cnkuaW1wb3J0LnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1N0eWxlTm9kZShub2RlKSkge1xuICAgICAgICByZWdpc3RyeS5zdHlsZS5wdXNoKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNKU1NjcmlwdE5vZGUobm9kZSkpIHtcbiAgICAgICAgcmVnaXN0cnkuc2NyaXB0LnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT09ICdiYXNlJykge1xuICAgICAgICByZWdpc3RyeS5iYXNlLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgcmVnaXN0cnkudGVtcGxhdGUucHVzaChub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ2RvbS1tb2R1bGUnKSB7XG4gICAgICAgIHJlZ2lzdHJ5Wydkb20tbW9kdWxlJ10ucHVzaChub2RlKTtcbiAgICB9IGVsc2UgaWYgKGRvbTUuaXNDb21tZW50Tm9kZShub2RlKSkge1xuICAgICAgICByZWdpc3RyeS5jb21tZW50LnB1c2gobm9kZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TGluZUFuZENvbHVtbihzdHJpbmcsIGNoYXJOdW1iZXIpIHtcbiAgICBpZiAoY2hhck51bWJlciA+IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gVE9ETyhham8pOiBDYWNoaW5nIHRoZSBsaW5lIGxlbmd0aHMgb2YgZWFjaCBkb2N1bWVudCBjb3VsZCBiZSBtdWNoIGZhc3Rlci5cbiAgICB2YXIgc2xpY2VkID0gc3RyaW5nLnNsaWNlKDAsIGNoYXJOdW1iZXIgKyAxKTtcbiAgICB2YXIgc3BsaXQgPSBzbGljZWQuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBsaW5lID0gc3BsaXQubGVuZ3RoO1xuICAgIHZhciBjb2x1bW4gPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXS5sZW5ndGg7XG4gICAgcmV0dXJuIHsgbGluZTogbGluZSwgY29sdW1uOiBjb2x1bW4gfTtcbn1cbi8qKlxuKiBQYXJzZSBodG1sIGludG8gQVNUcy5cbipcbiogaHRtbFN0cmluZyBpcyBhIHV0ZjgsIGh0bWw1IGRvY3VtZW50IGNvbnRhaW5pbmcgcG9seW1lciBlbGVtZW50c1xuKiBvciBtb2R1bGUgZGVmaW5pdG9ucy5cbipcbiogaHJlZiBpcyB0aGUgcGF0aCBvZiB0aGUgZG9jdW1lbnQuXG4qL1xuZnVuY3Rpb24gaW1wb3J0UGFyc2UoaHRtbFN0cmluZywgaHJlZikge1xuICAgIHZhciBkb2M7XG4gICAgdHJ5IHtcbiAgICAgICAgZG9jID0gZG9tNS5wYXJzZShodG1sU3RyaW5nLCB7IGxvY2F0aW9uSW5mbzogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEFkZCBsaW5lL2NvbHVtbiBpbmZvcm1hdGlvblxuICAgIGRvbTUudHJlZU1hcChkb2MsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLl9fbG9jYXRpb24gJiYgbm9kZS5fX2xvY2F0aW9uLnN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgIG5vZGUuX19sb2NhdGlvbkRldGFpbCA9IGdldExpbmVBbmRDb2x1bW4oaHRtbFN0cmluZywgbm9kZS5fX2xvY2F0aW9uLnN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChocmVmKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5fX293bmVyRG9jdW1lbnQgPSBocmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICBiYXNlOiBbXSxcbiAgICAgICAgdGVtcGxhdGU6IFtdLFxuICAgICAgICBzY3JpcHQ6IFtdLFxuICAgICAgICBzdHlsZTogW10sXG4gICAgICAgIGltcG9ydDogW10sXG4gICAgICAgICdkb20tbW9kdWxlJzogW10sXG4gICAgICAgIGNvbW1lbnQ6IFtdLFxuICAgICAgICBhc3Q6IGRvYyB9O1xuICAgIHZhciBxdWV1ZSA9IFtdLmNvbmNhdChkb2MuY2hpbGROb2Rlcyk7XG4gICAgdmFyIG5leHROb2RlO1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5leHROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5leHROb2RlKSB7XG4gICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLmNvbmNhdChuZXh0Tm9kZS5jaGlsZE5vZGVzKTtcbiAgICAgICAgICAgIGFkZE5vZGUobmV4dE5vZGUsIHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xufVxuZXhwb3J0cy5pbXBvcnRQYXJzZSA9IGltcG9ydFBhcnNlO1xuOyIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuLyoqXG4qIEZpbmRzIGFuZCBhbm5vdGF0ZXMgdGhlIFBvbHltZXIoKSBhbmQgbW9kdWxhdGUoKSBjYWxscyBpbiBqYXZhc2NyaXB0LlxuKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJlZSA9IHJlcXVpcmUoJ2VzcHJlZScpO1xudmFyIGVzdHJhdmVyc2UgPSByZXF1aXJlKCdlc3RyYXZlcnNlJyk7XG52YXIgYmVoYXZpb3JfZmluZGVyXzEgPSByZXF1aXJlKCcuL2JlaGF2aW9yLWZpbmRlcicpO1xudmFyIGVsZW1lbnRfZmluZGVyXzEgPSByZXF1aXJlKCcuL2VsZW1lbnQtZmluZGVyJyk7XG52YXIgZmVhdHVyZV9maW5kZXJfMSA9IHJlcXVpcmUoJy4vZmVhdHVyZS1maW5kZXInKTtcbmZ1bmN0aW9uIHRyYXZlcnNlKHZpc2l0b3JSZWdpc3RyaWVzKSB7XG4gICAgZnVuY3Rpb24gYXBwbHlWaXNpdG9ycyhuYW1lLCBub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSB2aXNpdG9yUmVnaXN0cmllc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnaXN0cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5WYWwgPSByZWdpc3RyeVtuYW1lXShub2RlLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseVZpc2l0b3JzKCdlbnRlcicgKyBub2RlLnR5cGUsIG5vZGUsIHBhcmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIGxlYXZlOiBmdW5jdGlvbiBsZWF2ZShub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseVZpc2l0b3JzKCdsZWF2ZScgKyBub2RlLnR5cGUsIG5vZGUsIHBhcmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhbGxiYWNrOiAnaXRlcmF0aW9uJ1xuICAgIH07XG59XG5mdW5jdGlvbiBqc1BhcnNlKGpzU3RyaW5nKSB7XG4gICAgdmFyIHNjcmlwdCA9IGVzcHJlZS5wYXJzZShqc1N0cmluZywge1xuICAgICAgICBhdHRhY2hDb21tZW50OiB0cnVlLFxuICAgICAgICBjb21tZW50OiB0cnVlLFxuICAgICAgICBsb2M6IHRydWUsXG4gICAgICAgIGVjbWFWZXJzaW9uOiA2XG4gICAgfSk7XG4gICAgdmFyIGZlYXR1cmVJbmZvID0gZmVhdHVyZV9maW5kZXJfMS5mZWF0dXJlRmluZGVyKCk7XG4gICAgdmFyIGJlaGF2aW9ySW5mbyA9IGJlaGF2aW9yX2ZpbmRlcl8xLmJlaGF2aW9yRmluZGVyKCk7XG4gICAgdmFyIGVsZW1lbnRJbmZvID0gZWxlbWVudF9maW5kZXJfMS5lbGVtZW50RmluZGVyKCk7XG4gICAgdmFyIHZpc2l0b3JzID0gW2ZlYXR1cmVJbmZvLCBiZWhhdmlvckluZm8sIGVsZW1lbnRJbmZvXS5tYXAoZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgcmV0dXJuIGluZm8udmlzaXRvcnM7XG4gICAgfSk7XG4gICAgZXN0cmF2ZXJzZS50cmF2ZXJzZShzY3JpcHQsIHRyYXZlcnNlKHZpc2l0b3JzKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVoYXZpb3JzOiBiZWhhdmlvckluZm8uYmVoYXZpb3JzLFxuICAgICAgICBlbGVtZW50czogZWxlbWVudEluZm8uZWxlbWVudHMsXG4gICAgICAgIGZlYXR1cmVzOiBmZWF0dXJlSW5mby5mZWF0dXJlcyxcbiAgICAgICAgcGFyc2VkU2NyaXB0OiBzY3JpcHRcbiAgICB9O1xufVxuZXhwb3J0cy5qc1BhcnNlID0ganNQYXJzZTtcbjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGRvY3RyaW5lID0gcmVxdWlyZSgnZG9jdHJpbmUnKTtcbi8qKlxuICogZG9jdHJpbmUgY29uZmlndXJhdGlvbixcbiAqIENVUlJFTlRMWSBVTlVTRUQgQkVDQVVTRSBQUklWQVRFXG4gKi9cbi8vIGZ1bmN0aW9uIGNvbmZpZ3VyZURvY3RyaW5lKCkge1xuLy8gICAvLyBAaGVybyBbcGF0aC90by9pbWFnZV1cbi8vICAgZG9jdHJpbmUuUnVsZXNbJ2hlcm8nXSA9IFsncGFyc2VOYW1lUGF0aE9wdGlvbmFsJywgJ2Vuc3VyZUVuZCddO1xuLy8gICAvLyAvLyBAZGVtbyBbcGF0aC90by9kZW1vXSBbRGVtbyB0aXRsZV1cbi8vICAgZG9jdHJpbmUuUnVsZXNbJ2RlbW8nXSA9IFsncGFyc2VOYW1lUGF0aE9wdGlvbmFsJywgJ3BhcnNlRGVzY3JpcHRpb24nLCAnZW5zdXJlRW5kJ107XG4vLyAgIC8vIC8vIEBwb2x5bWVyQmVoYXZpb3IgW1BvbHltZXIuQmVoYXZpb3JOYW1lXVxuLy8gICBkb2N0cmluZS5SdWxlc1sncG9seW1lckJlaGF2aW9yJ10gPSBbJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXTtcbi8vIH1cbi8vIGNvbmZpZ3VyZURvY3RyaW5lKCk7XG4vLyBAZGVtbyBbcGF0aF0gW3RpdGxlXVxuZnVuY3Rpb24gcGFyc2VEZW1vKHRhZykge1xuICAgIHZhciBtYXRjaCA9ICh0YWcuZGVzY3JpcHRpb24gfHwgXCJcIikubWF0Y2goL15cXHMqKFxcUyopXFxzKiguKikkLyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiAnZGVtbycsXG4gICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgIG5hbWU6IG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICBkZXNjcmlwdGlvbjogbWF0Y2ggPyBtYXRjaFsyXSA6IG51bGxcbiAgICB9O1xufVxuLy8gQGhlcm8gW3BhdGhdXG5mdW5jdGlvbiBwYXJzZUhlcm8odGFnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiB0YWcudGl0bGUsXG4gICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgIG5hbWU6IHRhZy5kZXNjcmlwdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGxcbiAgICB9O1xufVxuLy8gQHBvbHltZXJCZWhhdmlvciBbbmFtZV1cbmZ1bmN0aW9uIHBhcnNlUG9seW1lckJlaGF2aW9yKHRhZykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogdGFnLnRpdGxlLFxuICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICBuYW1lOiB0YWcuZGVzY3JpcHRpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsXG4gICAgfTtcbn1cbi8vIEBwc2V1ZG9FbGVtZW50IG5hbWVcbmZ1bmN0aW9uIHBhcnNlUHNldWRvRWxlbWVudCh0YWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWc6IHRhZy50aXRsZSxcbiAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgbmFtZTogdGFnLmRlc2NyaXB0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogbnVsbFxuICAgIH07XG59XG52YXIgQ1VTVE9NX1RBR1MgPSB7XG4gICAgZGVtbzogcGFyc2VEZW1vLFxuICAgIGhlcm86IHBhcnNlSGVybyxcbiAgICBwb2x5bWVyQmVoYXZpb3I6IHBhcnNlUG9seW1lckJlaGF2aW9yLFxuICAgIHBzZXVkb0VsZW1lbnQ6IHBhcnNlUHNldWRvRWxlbWVudFxufTtcbi8qKlxuICogQ29udmVydCBkb2N0cmluZSB0YWdzIHRvIG91ciB0YWcgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIF90YWdzVG9IeWRyb1RhZ3ModGFncykge1xuICAgIGlmICghdGFncykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRhZ3MubWFwKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgaWYgKHRhZy50aXRsZSBpbiBDVVNUT01fVEFHUykge1xuICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9UQUdTW3RhZy50aXRsZV0odGFnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFnOiB0YWcudGl0bGUsXG4gICAgICAgICAgICAgICAgdHlwZTogdGFnLnR5cGUgPyBkb2N0cmluZS50eXBlLnN0cmluZ2lmeSh0YWcudHlwZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIG5hbWU6IHRhZy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogcmVtb3ZlcyBsZWFkaW5nICosIGFuZCBhbnkgc3BhY2UgYmVmb3JlIGl0XG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVMZWFkaW5nQXN0ZXJpc2tzKGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAvLyByZW1vdmUgbGVhZGluZyAnXFxzKicgZnJvbSBlYWNoIGxpbmVcbiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXltcXHNdKlxcKlxccz8oLiopJC8pO1xuICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IGxpbmU7XG4gICAgfSkuam9pbignXFxuJyk7XG59XG4vKipcbiAqIEdpdmVuIGEgSlNEb2Mgc3RyaW5nIChtaW51cyBvcGVuaW5nL2Nsb3NpbmcgY29tbWVudCBkZWxpbWl0ZXJzKSwgZXh0cmFjdCBpdHNcbiAqIGRlc2NyaXB0aW9uIGFuZCB0YWdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkb2NzXG4gKiBAcmV0dXJuIHs/QW5ub3RhdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc2RvYyhkb2NzKSB7XG4gICAgZG9jcyA9IF9yZW1vdmVMZWFkaW5nQXN0ZXJpc2tzKGRvY3MpO1xuICAgIHZhciBkID0gZG9jdHJpbmUucGFyc2UoZG9jcywge1xuICAgICAgICB1bndyYXA6IGZhbHNlLFxuICAgICAgICBsaW5lTnVtYmVyOiB0cnVlLFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZXNjcmlwdGlvbjogZC5kZXNjcmlwdGlvbixcbiAgICAgICAgdGFnczogX3RhZ3NUb0h5ZHJvVGFncyhkLnRhZ3MpXG4gICAgfTtcbn1cbmV4cG9ydHMucGFyc2VKc2RvYyA9IHBhcnNlSnNkb2M7XG4vLyBVdGlsaXR5XG5mdW5jdGlvbiBoYXNUYWcoanNkb2MsIHRhZ05hbWUpIHtcbiAgICBpZiAoIWpzZG9jIHx8ICFqc2RvYy50YWdzKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGpzZG9jLnRhZ3Muc29tZShmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcudGFnID09PSB0YWdOYW1lO1xuICAgIH0pO1xufVxuZXhwb3J0cy5oYXNUYWcgPSBoYXNUYWc7XG5mdW5jdGlvbiBnZXRUYWcoanNkb2MsIHRhZ05hbWUsIGtleSkge1xuICAgIGlmICghanNkb2MgfHwgIWpzZG9jLnRhZ3MpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNkb2MudGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdGFnID0ganNkb2MudGFnc1tpXTtcbiAgICAgICAgaWYgKHRhZy50YWcgPT09IHRhZ05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgPyB0YWdba2V5XSA6IHRhZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydHMuZ2V0VGFnID0gZ2V0VGFnO1xuZnVuY3Rpb24gdW5pbmRlbnQodGV4dCkge1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5yZXBsYWNlKC9cXHQvZywgJyAgJykuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBpbmRlbnQgPSBsaW5lcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGxpbmUpIHtcbiAgICAgICAgaWYgKC9eXFxzKiQvLnRlc3QobGluZSkpIHJldHVybiBwcmV2OyAvLyBDb21wbGV0ZWx5IGlnbm9yZSBibGFuayBsaW5lcy5cbiAgICAgICAgdmFyIGxpbmVJbmRlbnQgPSBsaW5lLm1hdGNoKC9eKFxccyopLylbMF0ubGVuZ3RoO1xuICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgcmV0dXJuIGxpbmVJbmRlbnQ7XG4gICAgICAgIHJldHVybiBsaW5lSW5kZW50IDwgcHJldiA/IGxpbmVJbmRlbnQgOiBwcmV2O1xuICAgIH0sIG51bGwpO1xuICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgcmV0dXJuIGwuc3Vic3RyKGluZGVudCk7XG4gICAgfSkuam9pbignXFxuJyk7XG59XG5leHBvcnRzLnVuaW5kZW50ID0gdW5pbmRlbnQ7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIGZzX3Jlc29sdmVyXzEgPSByZXF1aXJlKCcuL2ZzLXJlc29sdmVyJyk7XG5cbnZhciBFcnJvclN3YWxsb3dpbmdGU1Jlc29sdmVyID0gZnVuY3Rpb24gKF9mc19yZXNvbHZlcl8xJEZTUmVzbykge1xuICAgIF9pbmhlcml0cyhFcnJvclN3YWxsb3dpbmdGU1Jlc29sdmVyLCBfZnNfcmVzb2x2ZXJfMSRGU1Jlc28pO1xuXG4gICAgZnVuY3Rpb24gRXJyb3JTd2FsbG93aW5nRlNSZXNvbHZlcihjb25maWcpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVycm9yU3dhbGxvd2luZ0ZTUmVzb2x2ZXIpO1xuXG4gICAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRXJyb3JTd2FsbG93aW5nRlNSZXNvbHZlcikuY2FsbCh0aGlzLCBjb25maWcpKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoRXJyb3JTd2FsbG93aW5nRlNSZXNvbHZlciwgW3tcbiAgICAgICAga2V5OiAnYWNjZXB0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFjY2VwdCh1cmksIGRlZmVycmVkKSB7XG4gICAgICAgICAgICB2YXIgcmVqZWN0ID0gZGVmZXJyZWQucmVqZWN0O1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXCJcIik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZzX3Jlc29sdmVyXzEuRlNSZXNvbHZlci5wcm90b3R5cGUuYWNjZXB0LmNhbGwodGhpcywgdXJpLCBkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gRXJyb3JTd2FsbG93aW5nRlNSZXNvbHZlcjtcbn0oZnNfcmVzb2x2ZXJfMS5GU1Jlc29sdmVyKTtcblxuZXhwb3J0cy5FcnJvclN3YWxsb3dpbmdGU1Jlc29sdmVyID0gRXJyb3JTd2FsbG93aW5nRlNSZXNvbHZlcjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIHJlc29sdmVyXzEgPSByZXF1aXJlKCcuL3Jlc29sdmVyJyk7XG4vKipcbiAqIEEgRmlsZUxvYWRlciBsZXRzIHlvdSByZXNvbHZlIFVSTHMgd2l0aCBhIHNldCBvZiBwb3RlbnRpYWwgcmVzb2x2ZXJzLlxuICovXG5cbnZhciBGaWxlTG9hZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpbGVMb2FkZXIoKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWxlTG9hZGVyKTtcblxuICAgICAgICB0aGlzLnJlc29sdmVycyA9IFtdO1xuICAgICAgICAvLyBtYXAgdXJsIC0+IERlZmVycmVkXG4gICAgICAgIHRoaXMucmVxdWVzdHMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGFuIGluc3RhbmNlIG9mIGEgUmVzb2x2ZXIgY2xhc3MgdG8gdGhlIGxpc3Qgb2YgdXJsIHJlc29sdmVyc1xuICAgICAqXG4gICAgICogT3JkZXJpbmcgb2YgcmVzb2x2ZXJzIGlzIG1vc3QgdG8gbGVhc3QgcmVjZW50bHkgYWRkZWRcbiAgICAgKiBUaGUgZmlyc3QgcmVzb2x2ZXIgdG8gXCJhY2NlcHRcIiB0aGUgdXJsIHdpbnMuXG4gICAgICogQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIGFkZC5cbiAgICAgKi9cblxuXG4gICAgX2NyZWF0ZUNsYXNzKEZpbGVMb2FkZXIsIFt7XG4gICAgICAgIGtleTogJ2FkZFJlc29sdmVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJlc29sdmVyKHJlc29sdmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVycy5wdXNoKHJlc29sdmVyKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVxdWVzdCcsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiBhIHByb21pc2UgZm9yIGFuIGFic29sdXRlIHVybFxuICAgICAgICAgKlxuICAgICAgICAgKiBVcmwgcmVxdWVzdHMgYXJlIGRlZHVwbGljYXRlZCBieSB0aGUgbG9hZGVyLCByZXR1cm5pbmcgdGhlIHNhbWUgUHJvbWlzZSBmb3JcbiAgICAgICAgICogaWRlbnRpY2FsIHVybHNcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAgICAgICAgVGhlIGFic29sdXRlIHVybCB0byByZXF1ZXN0LlxuICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlLjxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudHMgb2YgdGhlIFVSTC5cbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1ZXN0KHVyaSkge1xuICAgICAgICAgICAgdmFyIHByb21pc2U7XG4gICAgICAgICAgICBpZiAoISh1cmkgaW4gdGhpcy5yZXF1ZXN0cykpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IG5ldyByZXNvbHZlcl8xLkRlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0c1t1cmldID0gZGVmZXJyZWQ7XG4gICAgICAgICAgICAgICAgLy8gbG9vcCBiYWNrd2FyZHMgdGhyb3VnaCByZXNvbHZlcnMgdW50aWwgb25lIFwiYWNjZXB0c1wiIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucmVzb2x2ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5yZXNvbHZlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFjY2VwdCh1cmksIGRlZmVycmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcignbm8gcmVzb2x2ZXIgZm91bmQgZm9yICcgKyB1cmkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb21pc2UgPSB0aGlzLnJlcXVlc3RzW3VyaV0ucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEZpbGVMb2FkZXI7XG59KCk7XG5cbmV4cG9ydHMuRmlsZUxvYWRlciA9IEZpbGVMb2FkZXI7XG47IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKTtcbmZ1bmN0aW9uIGdldEZpbGUoZmlsZVBhdGgsIGRlZmVycmVkLCBzZWNvbmRQYXRoKSB7XG4gICAgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcsIGZ1bmN0aW9uIChlcnIsIGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgaWYgKHNlY29uZFBhdGgpIHtcbiAgICAgICAgICAgICAgICBnZXRGaWxlKHNlY29uZFBhdGgsIGRlZmVycmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFUlJPUiBmaW5kaW5nIFwiICsgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb250ZW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHBhdGhhYCBpcyBhIHNpYmxpbmcgb3IgYXVudCBvZiBgcGF0aGJgLlxuICovXG5mdW5jdGlvbiBpc1NpYmxpbmdPckF1bnQocGF0aGEsIHBhdGhiKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhdGguZGlybmFtZShwYXRoYSk7XG4gICAgaWYgKHBhdGhiLmluZGV4T2YocGF0aGEpID09PSAtMSAmJiBwYXRoYi5pbmRleE9mKHBhcmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hhbmdlIGBsb2NhbFBhdGhgIGZyb20gYSBzaWJsaW5nIG9mIGBiYXNlUGF0aGAgdG8gYmUgYSBjaGlsZCBvZlxuICogYGJhc2VQYXRoYCBqb2luZWQgd2l0aCBgcmVkaXJlY3RgLlxuICovXG5mdW5jdGlvbiByZWRpcmVjdFNpYmxpbmcoYmFzZVBhdGgsIGxvY2FsUGF0aCwgcmVkaXJlY3QpIHtcbiAgICB2YXIgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGJhc2VQYXRoKTtcbiAgICB2YXIgcmVkaXJlY3RlZCA9IHBhdGguam9pbihiYXNlUGF0aCwgcmVkaXJlY3QsIGxvY2FsUGF0aC5zbGljZShwYXJlbnQubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHJlZGlyZWN0ZWQ7XG59XG4vKipcbiAqIFJlc29sdmVzIHJlcXVlc3RzIHZpYSB0aGUgZmlsZSBzeXN0ZW0uXG4gKi9cblxudmFyIEZTUmVzb2x2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRlNSZXNvbHZlcihjb25maWcpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZTUmVzb2x2ZXIpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhGU1Jlc29sdmVyLCBbe1xuICAgICAgICBrZXk6ICdhY2NlcHQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KHVyaSwgZGVmZXJyZWQpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSB1cmwucGFyc2UodXJpKTtcbiAgICAgICAgICAgIHZhciBob3N0ID0gdGhpcy5jb25maWcuaG9zdDtcbiAgICAgICAgICAgIHZhciBiYXNlID0gdGhpcy5jb25maWcuYmFzZVBhdGggJiYgZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuY29uZmlnLmJhc2VQYXRoKTtcbiAgICAgICAgICAgIHZhciByb290ID0gdGhpcy5jb25maWcucm9vdCAmJiBwYXRoLm5vcm1hbGl6ZSh0aGlzLmNvbmZpZy5yb290KTtcbiAgICAgICAgICAgIHZhciByZWRpcmVjdCA9IHRoaXMuY29uZmlnLnJlZGlyZWN0O1xuICAgICAgICAgICAgdmFyIGxvY2FsO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQuaG9zdG5hbWUgfHwgcGFyc2VkLmhvc3RuYW1lID09PSBob3N0KSB7XG4gICAgICAgICAgICAgICAgbG9jYWwgPSBwYXJzZWQucGF0aG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgICAgICAvLyB1bi1lc2NhcGUgSFRNTCBlc2NhcGVzXG4gICAgICAgICAgICAgICAgbG9jYWwgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYWwpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsID0gcGF0aC5yZWxhdGl2ZShiYXNlLCBsb2NhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsID0gcGF0aC5qb2luKHJvb3QsIGxvY2FsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJhY2t1cDtcbiAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3QgJiYgaXNTaWJsaW5nT3JBdW50KHJvb3QsIGxvY2FsKSkge1xuICAgICAgICAgICAgICAgICAgICBiYWNrdXAgPSByZWRpcmVjdFNpYmxpbmcocm9vdCwgbG9jYWwsIHJlZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2V0RmlsZShsb2NhbCwgZGVmZXJyZWQsIGJhY2t1cCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gRlNSZXNvbHZlcjtcbn0oKTtcblxuZXhwb3J0cy5GU1Jlc29sdmVyID0gRlNSZXNvbHZlcjtcbjsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHRvIGVtcHR5IHN0cmluZyBhbnkgdXJpIHRoYXQgbWF0Y2hlcyBjb25maWcuXG4gKi9cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIE5vb3BSZXNvbHZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wUmVzb2x2ZXIoY29uZmlnKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb29wUmVzb2x2ZXIpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgdXJpICAgICAgVGhlIGFic29sdXRlIFVSSSBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIHshRGVmZXJyZWR9IGRlZmVycmVkIFRoZSBkZWZlcnJlZCBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkIGlmXG4gICAgICogICAgIHRoaXMgcmVzb2x2ZXIgd2lsbCBoYW5kbGUgdGhlIFVSSS5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBVUkkgaXMgaGFuZGxlZCBieSB0aGlzIHJlc29sdmVyLlxuICAgICAqL1xuXG5cbiAgICBfY3JlYXRlQ2xhc3MoTm9vcFJlc29sdmVyLCBbe1xuICAgICAgICBrZXk6ICdhY2NlcHQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KHVyaSwgZGVmZXJyZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmICh1cmkuc2VhcmNoKGNvbmZpZykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcudGVzdCh1cmkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCcnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5vb3BSZXNvbHZlcjtcbn0oKTtcblxuZXhwb3J0cy5Ob29wUmVzb2x2ZXIgPSBOb29wUmVzb2x2ZXI7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgdXJsID0gcmVxdWlyZSgndXJsJyk7XG52YXIgZnNfcmVzb2x2ZXJfMSA9IHJlcXVpcmUoJy4vZnMtcmVzb2x2ZXInKTtcbi8qKlxuICogQSBzaW5nbGUgcmVkaXJlY3QgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAgICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLnByb3RvY29sICAgICBUaGUgcHJvdG9jb2wgdGhpcyByZWRpcmVjdCBtYXRjaGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5ob3N0bmFtZSAgICAgVGhlIGhvc3QgbmFtZSB0aGlzIHJlZGlyZWN0IG1hdGNoZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLnBhdGggICAgICAgICBUaGUgcGFydCBvZiB0aGUgcGF0aCB0byBtYXRjaCBhbmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2Ugd2l0aCAncmVkaXJlY3RQYXRoJ1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5yZWRpcmVjdFBhdGggVGhlIGxvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0aGF0IHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSBcInByb3RvY29sOi8vaG9zbmFtZS9wYXRoL1wiXG4gKi9cblxudmFyIFByb3RvY29sUmVkaXJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJvdG9jb2xSZWRpcmVjdChjb25maWcpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3RvY29sUmVkaXJlY3QpO1xuXG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBjb25maWcucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPSBjb25maWcuaG9zdG5hbWU7XG4gICAgICAgIHRoaXMucGF0aCA9IGNvbmZpZy5wYXRoO1xuICAgICAgICB0aGlzLnJlZGlyZWN0UGF0aCA9IGNvbmZpZy5yZWRpcmVjdFBhdGg7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFByb3RvY29sUmVkaXJlY3QsIFt7XG4gICAgICAgIGtleTogJ3JlZGlyZWN0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlZGlyZWN0KHVyaSkge1xuICAgICAgICAgICAgdmFyIHBhcnNlZCA9IHVybC5wYXJzZSh1cmkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvdG9jb2wgIT09IHBhcnNlZC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lICE9PSBwYXJzZWQuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnBhdGhuYW1lLmluZGV4T2YodGhpcy5wYXRoKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnJlZGlyZWN0UGF0aCwgcGFyc2VkLnBhdGhuYW1lLnNsaWNlKHRoaXMucGF0aC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBQcm90b2NvbFJlZGlyZWN0O1xufSgpO1xuXG47XG4vKipcbiAqIFJlc29sdmVzIHByb3RvY29sOi8vaG9zdG5hbWUvcGF0aCB0byB0aGUgbG9jYWwgZmlsZXN5c3RlbS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQG1lbWJlcm9mIGh5ZHJvbHlzaXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcucm9vdCBGaWxlc3lzdGVtIHJvb3QgdG8gc2VhcmNoLiBEZWZhdWx0cyB0byB0aGVcbiAqICAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICogQHBhcmFtIHtBcnJheS48UHJvdG9jb2xSZWRpcmVjdD59IHJlZGlyZWN0cyBBIGxpc3Qgb2YgcHJvdG9jb2wgcmVkaXJlY3RzXG4gKiAgICAgZm9yIHRoZSByZXNvbHZlci4gVGhleSBhcmUgY2hlY2tlZCBmb3IgbWF0Y2hpbmcgZmlyc3QtdG8tbGFzdC5cbiAqL1xuXG52YXIgUmVkaXJlY3RSZXNvbHZlciA9IGZ1bmN0aW9uIChfZnNfcmVzb2x2ZXJfMSRGU1Jlc28pIHtcbiAgICBfaW5oZXJpdHMoUmVkaXJlY3RSZXNvbHZlciwgX2ZzX3Jlc29sdmVyXzEkRlNSZXNvKTtcblxuICAgIGZ1bmN0aW9uIFJlZGlyZWN0UmVzb2x2ZXIoY29uZmlnKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWRpcmVjdFJlc29sdmVyKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoUmVkaXJlY3RSZXNvbHZlcikuY2FsbCh0aGlzLCBjb25maWcpKTtcblxuICAgICAgICBfdGhpcy5yZWRpcmVjdHMgPSBjb25maWcucmVkaXJlY3RzIHx8IFtdO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFJlZGlyZWN0UmVzb2x2ZXIsIFt7XG4gICAgICAgIGtleTogJ2FjY2VwdCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhY2NlcHQodXJpLCBkZWZlcnJlZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlZGlyZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciByZWRpcmVjdGVkID0gdGhpcy5yZWRpcmVjdHNbaV0ucmVkaXJlY3QodXJpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnNfcmVzb2x2ZXJfMS5GU1Jlc29sdmVyLnByb3RvdHlwZS5hY2NlcHQuY2FsbCh0aGlzLCByZWRpcmVjdGVkLCBkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFJlZGlyZWN0UmVzb2x2ZXI7XG59KGZzX3Jlc29sdmVyXzEuRlNSZXNvbHZlcik7XG5cblJlZGlyZWN0UmVzb2x2ZXIuUHJvdG9jb2xSZWRpcmVjdCA9IFByb3RvY29sUmVkaXJlY3Q7XG5leHBvcnRzLlJlZGlyZWN0UmVzb2x2ZXIgPSBSZWRpcmVjdFJlc29sdmVyOyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxucmVxdWlyZShcImJhYmVsLXBvbHlmaWxsXCIpO1xuXG52YXIgRGVmZXJyZWQgPSBmdW5jdGlvbiBEZWZlcnJlZCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVmZXJyZWQpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgc2VsZi5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG59O1xuXG5leHBvcnRzLkRlZmVycmVkID0gRGVmZXJyZWQ7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG4vKipcbiAqIEEgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyB0byBgY29uZmlnLmNvbnRlbnRgIGFueSB1cmkgbWF0Y2hpbmcgY29uZmlnLlxuICovXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBTdHJpbmdSZXNvbHZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJpbmdSZXNvbHZlcihjb25maWcpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0cmluZ1Jlc29sdmVyKTtcblxuICAgICAgICB0aGlzLnVybCA9IGNvbmZpZy51cmw7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbmZpZy5jb250ZW50O1xuICAgICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgcHJvdmlkZSBhIHVybCBhbmQgY29udGVudCB0byB0aGUgc3RyaW5nIHJlc29sdmVyLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgdXJpICAgICAgVGhlIGFic29sdXRlIFVSSSBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIHshRGVmZXJyZWR9IGRlZmVycmVkIFRoZSBkZWZlcnJlZCBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkIGlmXG4gICAgICogICAgIHRoaXMgcmVzb2x2ZXIgaGFuZGxlcyB0aGUgVVJJLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFVSSSBpcyBoYW5kbGVkIGJ5IHRoaXMgcmVzb2x2ZXIuXG4gICAgICovXG5cblxuICAgIF9jcmVhdGVDbGFzcyhTdHJpbmdSZXNvbHZlciwgW3tcbiAgICAgICAga2V5OiBcImFjY2VwdFwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KHVyaSwgZGVmZXJyZWQpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLnVybDtcbiAgICAgICAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVybC50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKHVybCkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodGhpcy5jb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFN0cmluZ1Jlc29sdmVyO1xufSgpO1xuXG5leHBvcnRzLlN0cmluZ1Jlc29sdmVyID0gU3RyaW5nUmVzb2x2ZXI7XG47IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIGdldEZpbGUodXJsLCBkZWZlcnJlZCwgY29uZmlnKSB7XG4gICAgLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0OmZhbHNlICovXG4gICAgdmFyIHggPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXR1cyA9IHguc3RhdHVzIHx8IDA7XG4gICAgICAgIGlmIChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4LnJlc3BvbnNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgneGhyIHN0YXR1czogJyArIHN0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHgub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChlKTtcbiAgICB9O1xuICAgIHgub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgeC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cbiAgICB4LnNlbmQoKTtcbn1cbi8qKlxuICogQ29uc3RydWN0IGEgcmVzb2x2ZXIgdGhhdCByZXF1ZXN0cyByZXNvdXJjZXMgb3ZlciBYSFIuXG4gKi9cblxudmFyIFhIUlJlc29sdmVyID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFhIUlJlc29sdmVyKGNvbmZpZykge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWEhSUmVzb2x2ZXIpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhYSFJSZXNvbHZlciwgW3tcbiAgICAgICAga2V5OiAnYWNjZXB0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFjY2VwdCh1cmksIGRlZmVycmVkKSB7XG4gICAgICAgICAgICBnZXRGaWxlKHVyaSwgZGVmZXJyZWQsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFhIUlJlc29sdmVyO1xufSgpO1xuXG5leHBvcnRzLlhIUlJlc29sdmVyID0gWEhSUmVzb2x2ZXI7XG47IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWEhUTUxFbnRpdGllcyA9IHJlcXVpcmUoJy4veGh0bWwnKTtcblxudmFyIGhleE51bWJlciA9IC9eW1xcZGEtZkEtRl0rJC87XG52YXIgZGVjaW1hbE51bWJlciA9IC9eXFxkKyQvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFjb3JuKSB7XG4gIHZhciB0dCA9IGFjb3JuLnRva1R5cGVzO1xuICB2YXIgdGMgPSBhY29ybi50b2tDb250ZXh0cztcblxuICB0Yy5qX29UYWcgPSBuZXcgYWNvcm4uVG9rQ29udGV4dCgnPHRhZycsIGZhbHNlKTtcbiAgdGMual9jVGFnID0gbmV3IGFjb3JuLlRva0NvbnRleHQoJzwvdGFnJywgZmFsc2UpO1xuICB0Yy5qX2V4cHIgPSBuZXcgYWNvcm4uVG9rQ29udGV4dCgnPHRhZz4uLi48L3RhZz4nLCB0cnVlLCB0cnVlKTtcblxuICB0dC5qc3hOYW1lID0gbmV3IGFjb3JuLlRva2VuVHlwZSgnanN4TmFtZScpO1xuICB0dC5qc3hUZXh0ID0gbmV3IGFjb3JuLlRva2VuVHlwZSgnanN4VGV4dCcsIHtiZWZvcmVFeHByOiB0cnVlfSk7XG4gIHR0LmpzeFRhZ1N0YXJ0ID0gbmV3IGFjb3JuLlRva2VuVHlwZSgnanN4VGFnU3RhcnQnKTtcbiAgdHQuanN4VGFnRW5kID0gbmV3IGFjb3JuLlRva2VuVHlwZSgnanN4VGFnRW5kJyk7XG5cbiAgdHQuanN4VGFnU3RhcnQudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGV4dC5wdXNoKHRjLmpfZXhwcik7IC8vIHRyZWF0IGFzIGJlZ2lubmluZyBvZiBKU1ggZXhwcmVzc2lvblxuICAgIHRoaXMuY29udGV4dC5wdXNoKHRjLmpfb1RhZyk7IC8vIHN0YXJ0IG9wZW5pbmcgdGFnIGNvbnRleHRcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7XG4gIH07XG4gIHR0LmpzeFRhZ0VuZC51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB2YXIgb3V0ID0gdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgIGlmIChvdXQgPT09IHRjLmpfb1RhZyAmJiBwcmV2VHlwZSA9PT0gdHQuc2xhc2ggfHwgb3V0ID09PSB0Yy5qX2NUYWcpIHtcbiAgICAgIHRoaXMuY29udGV4dC5wb3AoKTtcbiAgICAgIHRoaXMuZXhwckFsbG93ZWQgPSB0aGlzLmN1ckNvbnRleHQoKSA9PT0gdGMual9leHByO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBwID0gYWNvcm4uUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyBSZWFkcyBpbmxpbmUgSlNYIGNvbnRlbnRzIHRva2VuLlxuXG4gIHBwLmpzeF9yZWFkVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gJycsIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpXG4gICAgICAgIHRoaXMucmFpc2UodGhpcy5zdGFydCwgJ1VudGVybWluYXRlZCBKU1ggY29udGVudHMnKTtcbiAgICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG5cbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgIGNhc2UgNjA6IC8vICc8J1xuICAgICAgY2FzZSAxMjM6IC8vICd7J1xuICAgICAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMuc3RhcnQpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IDYwICYmIHRoaXMuZXhwckFsbG93ZWQpIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0dC5qc3hUYWdTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuRnJvbUNvZGUoY2gpO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGV4dCwgb3V0KTtcblxuICAgICAgY2FzZSAzODogLy8gJyYnXG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgb3V0ICs9IHRoaXMuanN4X3JlYWRFbnRpdHkoKTtcbiAgICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGFjb3JuLmlzTmV3TGluZShjaCkpIHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICAgICAgb3V0ICs9IHRoaXMuanN4X3JlYWROZXdMaW5lKHRydWUpO1xuICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHBwLmpzeF9yZWFkTmV3TGluZSA9IGZ1bmN0aW9uKG5vcm1hbGl6ZUNSTEYpIHtcbiAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgIHZhciBvdXQ7XG4gICAgKyt0aGlzLnBvcztcbiAgICBpZiAoY2ggPT09IDEzICYmIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgb3V0ID0gbm9ybWFsaXplQ1JMRiA/ICdcXG4nIDogJ1xcclxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgcHAuanN4X3JlYWRTdHJpbmcgPSBmdW5jdGlvbihxdW90ZSkge1xuICAgIHZhciBvdXQgPSAnJywgY2h1bmtTdGFydCA9ICsrdGhpcy5wb3M7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKVxuICAgICAgICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsICdVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50Jyk7XG4gICAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgICAgaWYgKGNoID09PSBxdW90ZSkgYnJlYWs7XG4gICAgICBpZiAoY2ggPT09IDM4KSB7IC8vICcmJ1xuICAgICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICAgIG91dCArPSB0aGlzLmpzeF9yZWFkRW50aXR5KCk7XG4gICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH0gZWxzZSBpZiAoYWNvcm4uaXNOZXdMaW5lKGNoKSkge1xuICAgICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICAgIG91dCArPSB0aGlzLmpzeF9yZWFkTmV3TGluZShmYWxzZSk7XG4gICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKyspO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR0LnN0cmluZywgb3V0KTtcbiAgfTtcblxuICBwcC5qc3hfcmVhZEVudGl0eSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHIgPSAnJywgY291bnQgPSAwLCBlbnRpdHk7XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dFt0aGlzLnBvc107XG4gICAgaWYgKGNoICE9PSAnJicpXG4gICAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCAnRW50aXR5IG11c3Qgc3RhcnQgd2l0aCBhbiBhbXBlcnNhbmQnKTtcbiAgICB2YXIgc3RhcnRQb3MgPSArK3RoaXMucG9zO1xuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoICYmIGNvdW50KysgPCAxMCkge1xuICAgICAgY2ggPSB0aGlzLmlucHV0W3RoaXMucG9zKytdO1xuICAgICAgaWYgKGNoID09PSAnOycpIHtcbiAgICAgICAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgICAgICAgaWYgKHN0clsxXSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDIpO1xuICAgICAgICAgICAgaWYgKGhleE51bWJlci50ZXN0KHN0cikpXG4gICAgICAgICAgICAgIGVudGl0eSA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoc3RyLCAxNikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDEpO1xuICAgICAgICAgICAgaWYgKGRlY2ltYWxOdW1iZXIudGVzdChzdHIpKVxuICAgICAgICAgICAgICBlbnRpdHkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHN0ciwgMTApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50aXR5ID0gWEhUTUxFbnRpdGllc1tzdHJdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RyICs9IGNoO1xuICAgIH1cbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcztcbiAgICAgIHJldHVybiAnJic7XG4gICAgfVxuICAgIHJldHVybiBlbnRpdHk7XG4gIH07XG5cblxuICAvLyBSZWFkIGEgSlNYIGlkZW50aWZpZXIgKHZhbGlkIHRhZyBvciBhdHRyaWJ1dGUgbmFtZSkuXG4gIC8vXG4gIC8vIE9wdGltaXplZCB2ZXJzaW9uIHNpbmNlIEpTWCBpZGVudGlmaWVycyBjYW4ndCBjb250YWluXG4gIC8vIGVzY2FwZSBjaGFyYWN0ZXJzIGFuZCBzbyBjYW4gYmUgcmVhZCBhcyBzaW5nbGUgc2xpY2UuXG4gIC8vIEFsc28gYXNzdW1lcyB0aGF0IGZpcnN0IGNoYXJhY3RlciB3YXMgYWxyZWFkeSBjaGVja2VkXG4gIC8vIGJ5IGlzSWRlbnRpZmllclN0YXJ0IGluIHJlYWRUb2tlbi5cblxuICBwcC5qc3hfcmVhZFdvcmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2gsIHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgZG8ge1xuICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7XG4gICAgfSB3aGlsZSAoYWNvcm4uaXNJZGVudGlmaWVyQ2hhcihjaCkgfHwgY2ggPT09IDQ1KTsgLy8gJy0nXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHQuanN4TmFtZSwgdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpKTtcbiAgfTtcblxuICAvLyBUcmFuc2Zvcm1zIEpTWCBlbGVtZW50IG5hbWUgdG8gc3RyaW5nLlxuXG4gIGZ1bmN0aW9uIGdldFF1YWxpZmllZEpTWE5hbWUob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC50eXBlID09PSAnSlNYSWRlbnRpZmllcicpXG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWU7XG5cbiAgICBpZiAob2JqZWN0LnR5cGUgPT09ICdKU1hOYW1lc3BhY2VkTmFtZScpXG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWVzcGFjZS5uYW1lICsgJzonICsgb2JqZWN0Lm5hbWUubmFtZTtcblxuICAgIGlmIChvYmplY3QudHlwZSA9PT0gJ0pTWE1lbWJlckV4cHJlc3Npb24nKVxuICAgICAgcmV0dXJuIGdldFF1YWxpZmllZEpTWE5hbWUob2JqZWN0Lm9iamVjdCkgKyAnLicgK1xuICAgICAgZ2V0UXVhbGlmaWVkSlNYTmFtZShvYmplY3QucHJvcGVydHkpO1xuICB9XG5cbiAgLy8gUGFyc2UgbmV4dCB0b2tlbiBhcyBKU1ggaWRlbnRpZmllclxuXG4gIHBwLmpzeF9wYXJzZUlkZW50aWZpZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHQuanN4TmFtZSlcbiAgICAgIG5vZGUubmFtZSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodGhpcy50eXBlLmtleXdvcmQpXG4gICAgICBub2RlLm5hbWUgPSB0aGlzLnR5cGUua2V5d29yZDtcbiAgICBlbHNlXG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsICdKU1hJZGVudGlmaWVyJyk7XG4gIH07XG5cbiAgLy8gUGFyc2UgbmFtZXNwYWNlZCBpZGVudGlmaWVyLlxuXG4gIHBwLmpzeF9wYXJzZU5hbWVzcGFjZWROYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBuYW1lID0gdGhpcy5qc3hfcGFyc2VJZGVudGlmaWVyKCk7XG4gICAgaWYgKCF0aGlzLmVhdCh0dC5jb2xvbikpIHJldHVybiBuYW1lO1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUubmFtZXNwYWNlID0gbmFtZTtcbiAgICBub2RlLm5hbWUgPSB0aGlzLmpzeF9wYXJzZUlkZW50aWZpZXIoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsICdKU1hOYW1lc3BhY2VkTmFtZScpO1xuICB9O1xuXG4gIC8vIFBhcnNlcyBlbGVtZW50IG5hbWUgaW4gYW55IGZvcm0gLSBuYW1lc3BhY2VkLCBtZW1iZXJcbiAgLy8gb3Igc2luZ2xlIGlkZW50aWZpZXIuXG5cbiAgcHAuanN4X3BhcnNlRWxlbWVudE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgdmFyIG5vZGUgPSB0aGlzLmpzeF9wYXJzZU5hbWVzcGFjZWROYW1lKCk7XG4gICAgd2hpbGUgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgIHZhciBuZXdOb2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbmV3Tm9kZS5vYmplY3QgPSBub2RlO1xuICAgICAgbmV3Tm9kZS5wcm9wZXJ0eSA9IHRoaXMuanN4X3BhcnNlSWRlbnRpZmllcigpO1xuICAgICAgbm9kZSA9IHRoaXMuZmluaXNoTm9kZShuZXdOb2RlLCAnSlNYTWVtYmVyRXhwcmVzc2lvbicpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcblxuICAvLyBQYXJzZXMgYW55IHR5cGUgb2YgSlNYIGF0dHJpYnV0ZSB2YWx1ZS5cblxuICBwcC5qc3hfcGFyc2VBdHRyaWJ1dGVWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSB0dC5icmFjZUw6XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuanN4X3BhcnNlRXhwcmVzc2lvbkNvbnRhaW5lcigpO1xuICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi50eXBlID09PSAnSlNYRW1wdHlFeHByZXNzaW9uJylcbiAgICAgICAgdGhpcy5yYWlzZShub2RlLnN0YXJ0LCAnSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb24nKTtcbiAgICAgIHJldHVybiBub2RlO1xuXG4gICAgY2FzZSB0dC5qc3hUYWdTdGFydDpcbiAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRXhwckF0b20oKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsICdKU1ggdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBhbiBleHByZXNzaW9uIG9yIGEgcXVvdGVkIEpTWCB0ZXh0Jyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEpTWEVtcHR5RXhwcmVzc2lvbiBpcyB1bmlxdWUgdHlwZSBzaW5jZSBpdCBkb2Vzbid0IGFjdHVhbGx5IHBhcnNlIGFueXRoaW5nLFxuICAvLyBhbmQgc28gaXQgc2hvdWxkIHN0YXJ0IGF0IHRoZSBlbmQgb2YgbGFzdCByZWFkIHRva2VuIChsZWZ0IGJyYWNlKSBhbmQgZmluaXNoXG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgb25lIChyaWdodCBicmFjZSkuXG5cbiAgcHAuanN4X3BhcnNlRW1wdHlFeHByZXNzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQobm9kZSwgJ0pTWEVtcHR5RXhwcmVzc2lvbicsIHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpO1xuICB9O1xuXG4gIC8vIFBhcnNlcyBKU1ggZXhwcmVzc2lvbiBlbmNsb3NlZCBpbnRvIGN1cmx5IGJyYWNrZXRzLlxuXG5cbiAgcHAuanN4X3BhcnNlRXhwcmVzc2lvbkNvbnRhaW5lciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnR5cGUgPT09IHR0LmJyYWNlUlxuICAgICAgPyB0aGlzLmpzeF9wYXJzZUVtcHR5RXhwcmVzc2lvbigpXG4gICAgICA6IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsICdKU1hFeHByZXNzaW9uQ29udGFpbmVyJyk7XG4gIH07XG5cbiAgLy8gUGFyc2VzIGZvbGxvd2luZyBKU1ggYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpci5cblxuICBwcC5qc3hfcGFyc2VBdHRyaWJ1dGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgaWYgKHRoaXMuZWF0KHR0LmJyYWNlTCkpIHtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmVsbGlwc2lzKTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsICdKU1hTcHJlYWRBdHRyaWJ1dGUnKTtcbiAgICB9XG4gICAgbm9kZS5uYW1lID0gdGhpcy5qc3hfcGFyc2VOYW1lc3BhY2VkTmFtZSgpO1xuICAgIG5vZGUudmFsdWUgPSB0aGlzLmVhdCh0dC5lcSkgPyB0aGlzLmpzeF9wYXJzZUF0dHJpYnV0ZVZhbHVlKCkgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgJ0pTWEF0dHJpYnV0ZScpO1xuICB9O1xuXG4gIC8vIFBhcnNlcyBKU1ggb3BlbmluZyB0YWcgc3RhcnRpbmcgYWZ0ZXIgJzwnLlxuXG4gIHBwLmpzeF9wYXJzZU9wZW5pbmdFbGVtZW50QXQgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICBub2RlLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICBub2RlLm5hbWUgPSB0aGlzLmpzeF9wYXJzZUVsZW1lbnROYW1lKCk7XG4gICAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHQuc2xhc2ggJiYgdGhpcy50eXBlICE9PSB0dC5qc3hUYWdFbmQpXG4gICAgICBub2RlLmF0dHJpYnV0ZXMucHVzaCh0aGlzLmpzeF9wYXJzZUF0dHJpYnV0ZSgpKTtcbiAgICBub2RlLnNlbGZDbG9zaW5nID0gdGhpcy5lYXQodHQuc2xhc2gpO1xuICAgIHRoaXMuZXhwZWN0KHR0LmpzeFRhZ0VuZCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCAnSlNYT3BlbmluZ0VsZW1lbnQnKTtcbiAgfTtcblxuICAvLyBQYXJzZXMgSlNYIGNsb3NpbmcgdGFnIHN0YXJ0aW5nIGFmdGVyICc8LycuXG5cbiAgcHAuanN4X3BhcnNlQ2xvc2luZ0VsZW1lbnRBdCA9IGZ1bmN0aW9uKHN0YXJ0UG9zLCBzdGFydExvYykge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUubmFtZSA9IHRoaXMuanN4X3BhcnNlRWxlbWVudE5hbWUoKTtcbiAgICB0aGlzLmV4cGVjdCh0dC5qc3hUYWdFbmQpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgJ0pTWENsb3NpbmdFbGVtZW50Jyk7XG4gIH07XG5cbiAgLy8gUGFyc2VzIGVudGlyZSBKU1ggZWxlbWVudCwgaW5jbHVkaW5nIGl0J3Mgb3BlbmluZyB0YWdcbiAgLy8gKHN0YXJ0aW5nIGFmdGVyICc8JyksIGF0dHJpYnV0ZXMsIGNvbnRlbnRzIGFuZCBjbG9zaW5nIHRhZy5cblxuICBwcC5qc3hfcGFyc2VFbGVtZW50QXQgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgb3BlbmluZ0VsZW1lbnQgPSB0aGlzLmpzeF9wYXJzZU9wZW5pbmdFbGVtZW50QXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICB2YXIgY2xvc2luZ0VsZW1lbnQgPSBudWxsO1xuXG4gICAgaWYgKCFvcGVuaW5nRWxlbWVudC5zZWxmQ2xvc2luZykge1xuICAgICAgY29udGVudHM6IGZvciAoOzspIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgY2FzZSB0dC5qc3hUYWdTdGFydDpcbiAgICAgICAgICBzdGFydFBvcyA9IHRoaXMuc3RhcnQ7IHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5lYXQodHQuc2xhc2gpKSB7XG4gICAgICAgICAgICBjbG9zaW5nRWxlbWVudCA9IHRoaXMuanN4X3BhcnNlQ2xvc2luZ0VsZW1lbnRBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgICAgICAgYnJlYWsgY29udGVudHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5qc3hfcGFyc2VFbGVtZW50QXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB0dC5qc3hUZXh0OlxuICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZUV4cHJBdG9tKCkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5qc3hfcGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKCkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZXRRdWFsaWZpZWRKU1hOYW1lKGNsb3NpbmdFbGVtZW50Lm5hbWUpICE9PSBnZXRRdWFsaWZpZWRKU1hOYW1lKG9wZW5pbmdFbGVtZW50Lm5hbWUpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgY2xvc2luZ0VsZW1lbnQuc3RhcnQsXG4gICAgICAgICAgJ0V4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8JyArIGdldFF1YWxpZmllZEpTWE5hbWUob3BlbmluZ0VsZW1lbnQubmFtZSkgKyAnPicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUub3BlbmluZ0VsZW1lbnQgPSBvcGVuaW5nRWxlbWVudDtcbiAgICBub2RlLmNsb3NpbmdFbGVtZW50ID0gY2xvc2luZ0VsZW1lbnQ7XG4gICAgbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR0LnJlbGF0aW9uYWwgJiYgdGhpcy52YWx1ZSA9PT0gXCI8XCIpIHtcbiAgICAgIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJBZGphY2VudCBKU1ggZWxlbWVudHMgbXVzdCBiZSB3cmFwcGVkIGluIGFuIGVuY2xvc2luZyB0YWdcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgJ0pTWEVsZW1lbnQnKTtcbiAgfTtcblxuICAvLyBQYXJzZXMgZW50aXJlIEpTWCBlbGVtZW50IGZyb20gY3VycmVudCBwb3NpdGlvbi5cblxuICBwcC5qc3hfcGFyc2VFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmpzeF9wYXJzZUVsZW1lbnRBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICB9O1xuXG4gIGFjb3JuLnBsdWdpbnMuanN4ID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICBpbnN0YW5jZS5leHRlbmQoJ3BhcnNlRXhwckF0b20nLCBmdW5jdGlvbihpbm5lcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJlZlNob3J0SGFuZERlZmF1bHRQb3MpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHQuanN4VGV4dClcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwodGhpcy52YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gdHQuanN4VGFnU3RhcnQpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuanN4X3BhcnNlRWxlbWVudCgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIGlubmVyLmNhbGwodGhpcywgcmVmU2hvcnRIYW5kRGVmYXVsdFBvcyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgaW5zdGFuY2UuZXh0ZW5kKCdyZWFkVG9rZW4nLCBmdW5jdGlvbihpbm5lcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQoKTtcblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gdGMual9leHByKSByZXR1cm4gdGhpcy5qc3hfcmVhZFRva2VuKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHRjLmpfb1RhZyB8fCBjb250ZXh0ID09PSB0Yy5qX2NUYWcpIHtcbiAgICAgICAgICBpZiAoYWNvcm4uaXNJZGVudGlmaWVyU3RhcnQoY29kZSkpIHJldHVybiB0aGlzLmpzeF9yZWFkV29yZCgpO1xuXG4gICAgICAgICAgaWYgKGNvZGUgPT0gNjIpIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0dC5qc3hUYWdFbmQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoY29kZSA9PT0gMzQgfHwgY29kZSA9PT0gMzkpICYmIGNvbnRleHQgPT0gdGMual9vVGFnKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuanN4X3JlYWRTdHJpbmcoY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gNjAgJiYgdGhpcy5leHByQWxsb3dlZCkge1xuICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGFnU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbm5lci5jYWxsKHRoaXMsIGNvZGUpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGluc3RhbmNlLmV4dGVuZCgndXBkYXRlQ29udGV4dCcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSB0dC5icmFjZUwpIHtcbiAgICAgICAgICB2YXIgY3VyQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuICAgICAgICAgIGlmIChjdXJDb250ZXh0ID09IHRjLmpfb1RhZykgdGhpcy5jb250ZXh0LnB1c2godGMuYl9leHByKTtcbiAgICAgICAgICBlbHNlIGlmIChjdXJDb250ZXh0ID09IHRjLmpfZXhwcikgdGhpcy5jb250ZXh0LnB1c2godGMuYl90bXBsKTtcbiAgICAgICAgICBlbHNlIGlubmVyLmNhbGwodGhpcywgcHJldlR5cGUpO1xuICAgICAgICAgIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gdHQuc2xhc2ggJiYgcHJldlR5cGUgPT09IHR0LmpzeFRhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0Lmxlbmd0aCAtPSAyOyAvLyBkbyBub3QgY29uc2lkZXIgSlNYIGV4cHIgLT4gSlNYIG9wZW4gdGFnIC0+IC4uLiBhbnltb3JlXG4gICAgICAgICAgdGhpcy5jb250ZXh0LnB1c2godGMual9jVGFnKTsgLy8gcmVjb25zaWRlciBhcyBjbG9zaW5nIHRhZyBjb250ZXh0XG4gICAgICAgICAgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBpbm5lci5jYWxsKHRoaXMsIHByZXZUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gYWNvcm47XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHF1b3Q6ICdcXHUwMDIyJyxcbiAgYW1wOiAnJicsXG4gIGFwb3M6ICdcXHUwMDI3JyxcbiAgbHQ6ICc8JyxcbiAgZ3Q6ICc+JyxcbiAgbmJzcDogJ1xcdTAwQTAnLFxuICBpZXhjbDogJ1xcdTAwQTEnLFxuICBjZW50OiAnXFx1MDBBMicsXG4gIHBvdW5kOiAnXFx1MDBBMycsXG4gIGN1cnJlbjogJ1xcdTAwQTQnLFxuICB5ZW46ICdcXHUwMEE1JyxcbiAgYnJ2YmFyOiAnXFx1MDBBNicsXG4gIHNlY3Q6ICdcXHUwMEE3JyxcbiAgdW1sOiAnXFx1MDBBOCcsXG4gIGNvcHk6ICdcXHUwMEE5JyxcbiAgb3JkZjogJ1xcdTAwQUEnLFxuICBsYXF1bzogJ1xcdTAwQUInLFxuICBub3Q6ICdcXHUwMEFDJyxcbiAgc2h5OiAnXFx1MDBBRCcsXG4gIHJlZzogJ1xcdTAwQUUnLFxuICBtYWNyOiAnXFx1MDBBRicsXG4gIGRlZzogJ1xcdTAwQjAnLFxuICBwbHVzbW46ICdcXHUwMEIxJyxcbiAgc3VwMjogJ1xcdTAwQjInLFxuICBzdXAzOiAnXFx1MDBCMycsXG4gIGFjdXRlOiAnXFx1MDBCNCcsXG4gIG1pY3JvOiAnXFx1MDBCNScsXG4gIHBhcmE6ICdcXHUwMEI2JyxcbiAgbWlkZG90OiAnXFx1MDBCNycsXG4gIGNlZGlsOiAnXFx1MDBCOCcsXG4gIHN1cDE6ICdcXHUwMEI5JyxcbiAgb3JkbTogJ1xcdTAwQkEnLFxuICByYXF1bzogJ1xcdTAwQkInLFxuICBmcmFjMTQ6ICdcXHUwMEJDJyxcbiAgZnJhYzEyOiAnXFx1MDBCRCcsXG4gIGZyYWMzNDogJ1xcdTAwQkUnLFxuICBpcXVlc3Q6ICdcXHUwMEJGJyxcbiAgQWdyYXZlOiAnXFx1MDBDMCcsXG4gIEFhY3V0ZTogJ1xcdTAwQzEnLFxuICBBY2lyYzogJ1xcdTAwQzInLFxuICBBdGlsZGU6ICdcXHUwMEMzJyxcbiAgQXVtbDogJ1xcdTAwQzQnLFxuICBBcmluZzogJ1xcdTAwQzUnLFxuICBBRWxpZzogJ1xcdTAwQzYnLFxuICBDY2VkaWw6ICdcXHUwMEM3JyxcbiAgRWdyYXZlOiAnXFx1MDBDOCcsXG4gIEVhY3V0ZTogJ1xcdTAwQzknLFxuICBFY2lyYzogJ1xcdTAwQ0EnLFxuICBFdW1sOiAnXFx1MDBDQicsXG4gIElncmF2ZTogJ1xcdTAwQ0MnLFxuICBJYWN1dGU6ICdcXHUwMENEJyxcbiAgSWNpcmM6ICdcXHUwMENFJyxcbiAgSXVtbDogJ1xcdTAwQ0YnLFxuICBFVEg6ICdcXHUwMEQwJyxcbiAgTnRpbGRlOiAnXFx1MDBEMScsXG4gIE9ncmF2ZTogJ1xcdTAwRDInLFxuICBPYWN1dGU6ICdcXHUwMEQzJyxcbiAgT2NpcmM6ICdcXHUwMEQ0JyxcbiAgT3RpbGRlOiAnXFx1MDBENScsXG4gIE91bWw6ICdcXHUwMEQ2JyxcbiAgdGltZXM6ICdcXHUwMEQ3JyxcbiAgT3NsYXNoOiAnXFx1MDBEOCcsXG4gIFVncmF2ZTogJ1xcdTAwRDknLFxuICBVYWN1dGU6ICdcXHUwMERBJyxcbiAgVWNpcmM6ICdcXHUwMERCJyxcbiAgVXVtbDogJ1xcdTAwREMnLFxuICBZYWN1dGU6ICdcXHUwMEREJyxcbiAgVEhPUk46ICdcXHUwMERFJyxcbiAgc3psaWc6ICdcXHUwMERGJyxcbiAgYWdyYXZlOiAnXFx1MDBFMCcsXG4gIGFhY3V0ZTogJ1xcdTAwRTEnLFxuICBhY2lyYzogJ1xcdTAwRTInLFxuICBhdGlsZGU6ICdcXHUwMEUzJyxcbiAgYXVtbDogJ1xcdTAwRTQnLFxuICBhcmluZzogJ1xcdTAwRTUnLFxuICBhZWxpZzogJ1xcdTAwRTYnLFxuICBjY2VkaWw6ICdcXHUwMEU3JyxcbiAgZWdyYXZlOiAnXFx1MDBFOCcsXG4gIGVhY3V0ZTogJ1xcdTAwRTknLFxuICBlY2lyYzogJ1xcdTAwRUEnLFxuICBldW1sOiAnXFx1MDBFQicsXG4gIGlncmF2ZTogJ1xcdTAwRUMnLFxuICBpYWN1dGU6ICdcXHUwMEVEJyxcbiAgaWNpcmM6ICdcXHUwMEVFJyxcbiAgaXVtbDogJ1xcdTAwRUYnLFxuICBldGg6ICdcXHUwMEYwJyxcbiAgbnRpbGRlOiAnXFx1MDBGMScsXG4gIG9ncmF2ZTogJ1xcdTAwRjInLFxuICBvYWN1dGU6ICdcXHUwMEYzJyxcbiAgb2NpcmM6ICdcXHUwMEY0JyxcbiAgb3RpbGRlOiAnXFx1MDBGNScsXG4gIG91bWw6ICdcXHUwMEY2JyxcbiAgZGl2aWRlOiAnXFx1MDBGNycsXG4gIG9zbGFzaDogJ1xcdTAwRjgnLFxuICB1Z3JhdmU6ICdcXHUwMEY5JyxcbiAgdWFjdXRlOiAnXFx1MDBGQScsXG4gIHVjaXJjOiAnXFx1MDBGQicsXG4gIHV1bWw6ICdcXHUwMEZDJyxcbiAgeWFjdXRlOiAnXFx1MDBGRCcsXG4gIHRob3JuOiAnXFx1MDBGRScsXG4gIHl1bWw6ICdcXHUwMEZGJyxcbiAgT0VsaWc6ICdcXHUwMTUyJyxcbiAgb2VsaWc6ICdcXHUwMTUzJyxcbiAgU2Nhcm9uOiAnXFx1MDE2MCcsXG4gIHNjYXJvbjogJ1xcdTAxNjEnLFxuICBZdW1sOiAnXFx1MDE3OCcsXG4gIGZub2Y6ICdcXHUwMTkyJyxcbiAgY2lyYzogJ1xcdTAyQzYnLFxuICB0aWxkZTogJ1xcdTAyREMnLFxuICBBbHBoYTogJ1xcdTAzOTEnLFxuICBCZXRhOiAnXFx1MDM5MicsXG4gIEdhbW1hOiAnXFx1MDM5MycsXG4gIERlbHRhOiAnXFx1MDM5NCcsXG4gIEVwc2lsb246ICdcXHUwMzk1JyxcbiAgWmV0YTogJ1xcdTAzOTYnLFxuICBFdGE6ICdcXHUwMzk3JyxcbiAgVGhldGE6ICdcXHUwMzk4JyxcbiAgSW90YTogJ1xcdTAzOTknLFxuICBLYXBwYTogJ1xcdTAzOUEnLFxuICBMYW1iZGE6ICdcXHUwMzlCJyxcbiAgTXU6ICdcXHUwMzlDJyxcbiAgTnU6ICdcXHUwMzlEJyxcbiAgWGk6ICdcXHUwMzlFJyxcbiAgT21pY3JvbjogJ1xcdTAzOUYnLFxuICBQaTogJ1xcdTAzQTAnLFxuICBSaG86ICdcXHUwM0ExJyxcbiAgU2lnbWE6ICdcXHUwM0EzJyxcbiAgVGF1OiAnXFx1MDNBNCcsXG4gIFVwc2lsb246ICdcXHUwM0E1JyxcbiAgUGhpOiAnXFx1MDNBNicsXG4gIENoaTogJ1xcdTAzQTcnLFxuICBQc2k6ICdcXHUwM0E4JyxcbiAgT21lZ2E6ICdcXHUwM0E5JyxcbiAgYWxwaGE6ICdcXHUwM0IxJyxcbiAgYmV0YTogJ1xcdTAzQjInLFxuICBnYW1tYTogJ1xcdTAzQjMnLFxuICBkZWx0YTogJ1xcdTAzQjQnLFxuICBlcHNpbG9uOiAnXFx1MDNCNScsXG4gIHpldGE6ICdcXHUwM0I2JyxcbiAgZXRhOiAnXFx1MDNCNycsXG4gIHRoZXRhOiAnXFx1MDNCOCcsXG4gIGlvdGE6ICdcXHUwM0I5JyxcbiAga2FwcGE6ICdcXHUwM0JBJyxcbiAgbGFtYmRhOiAnXFx1MDNCQicsXG4gIG11OiAnXFx1MDNCQycsXG4gIG51OiAnXFx1MDNCRCcsXG4gIHhpOiAnXFx1MDNCRScsXG4gIG9taWNyb246ICdcXHUwM0JGJyxcbiAgcGk6ICdcXHUwM0MwJyxcbiAgcmhvOiAnXFx1MDNDMScsXG4gIHNpZ21hZjogJ1xcdTAzQzInLFxuICBzaWdtYTogJ1xcdTAzQzMnLFxuICB0YXU6ICdcXHUwM0M0JyxcbiAgdXBzaWxvbjogJ1xcdTAzQzUnLFxuICBwaGk6ICdcXHUwM0M2JyxcbiAgY2hpOiAnXFx1MDNDNycsXG4gIHBzaTogJ1xcdTAzQzgnLFxuICBvbWVnYTogJ1xcdTAzQzknLFxuICB0aGV0YXN5bTogJ1xcdTAzRDEnLFxuICB1cHNpaDogJ1xcdTAzRDInLFxuICBwaXY6ICdcXHUwM0Q2JyxcbiAgZW5zcDogJ1xcdTIwMDInLFxuICBlbXNwOiAnXFx1MjAwMycsXG4gIHRoaW5zcDogJ1xcdTIwMDknLFxuICB6d25qOiAnXFx1MjAwQycsXG4gIHp3ajogJ1xcdTIwMEQnLFxuICBscm06ICdcXHUyMDBFJyxcbiAgcmxtOiAnXFx1MjAwRicsXG4gIG5kYXNoOiAnXFx1MjAxMycsXG4gIG1kYXNoOiAnXFx1MjAxNCcsXG4gIGxzcXVvOiAnXFx1MjAxOCcsXG4gIHJzcXVvOiAnXFx1MjAxOScsXG4gIHNicXVvOiAnXFx1MjAxQScsXG4gIGxkcXVvOiAnXFx1MjAxQycsXG4gIHJkcXVvOiAnXFx1MjAxRCcsXG4gIGJkcXVvOiAnXFx1MjAxRScsXG4gIGRhZ2dlcjogJ1xcdTIwMjAnLFxuICBEYWdnZXI6ICdcXHUyMDIxJyxcbiAgYnVsbDogJ1xcdTIwMjInLFxuICBoZWxsaXA6ICdcXHUyMDI2JyxcbiAgcGVybWlsOiAnXFx1MjAzMCcsXG4gIHByaW1lOiAnXFx1MjAzMicsXG4gIFByaW1lOiAnXFx1MjAzMycsXG4gIGxzYXF1bzogJ1xcdTIwMzknLFxuICByc2FxdW86ICdcXHUyMDNBJyxcbiAgb2xpbmU6ICdcXHUyMDNFJyxcbiAgZnJhc2w6ICdcXHUyMDQ0JyxcbiAgZXVybzogJ1xcdTIwQUMnLFxuICBpbWFnZTogJ1xcdTIxMTEnLFxuICB3ZWllcnA6ICdcXHUyMTE4JyxcbiAgcmVhbDogJ1xcdTIxMUMnLFxuICB0cmFkZTogJ1xcdTIxMjInLFxuICBhbGVmc3ltOiAnXFx1MjEzNScsXG4gIGxhcnI6ICdcXHUyMTkwJyxcbiAgdWFycjogJ1xcdTIxOTEnLFxuICByYXJyOiAnXFx1MjE5MicsXG4gIGRhcnI6ICdcXHUyMTkzJyxcbiAgaGFycjogJ1xcdTIxOTQnLFxuICBjcmFycjogJ1xcdTIxQjUnLFxuICBsQXJyOiAnXFx1MjFEMCcsXG4gIHVBcnI6ICdcXHUyMUQxJyxcbiAgckFycjogJ1xcdTIxRDInLFxuICBkQXJyOiAnXFx1MjFEMycsXG4gIGhBcnI6ICdcXHUyMUQ0JyxcbiAgZm9yYWxsOiAnXFx1MjIwMCcsXG4gIHBhcnQ6ICdcXHUyMjAyJyxcbiAgZXhpc3Q6ICdcXHUyMjAzJyxcbiAgZW1wdHk6ICdcXHUyMjA1JyxcbiAgbmFibGE6ICdcXHUyMjA3JyxcbiAgaXNpbjogJ1xcdTIyMDgnLFxuICBub3RpbjogJ1xcdTIyMDknLFxuICBuaTogJ1xcdTIyMEInLFxuICBwcm9kOiAnXFx1MjIwRicsXG4gIHN1bTogJ1xcdTIyMTEnLFxuICBtaW51czogJ1xcdTIyMTInLFxuICBsb3dhc3Q6ICdcXHUyMjE3JyxcbiAgcmFkaWM6ICdcXHUyMjFBJyxcbiAgcHJvcDogJ1xcdTIyMUQnLFxuICBpbmZpbjogJ1xcdTIyMUUnLFxuICBhbmc6ICdcXHUyMjIwJyxcbiAgYW5kOiAnXFx1MjIyNycsXG4gIG9yOiAnXFx1MjIyOCcsXG4gIGNhcDogJ1xcdTIyMjknLFxuICBjdXA6ICdcXHUyMjJBJyxcbiAgJ2ludCc6ICdcXHUyMjJCJyxcbiAgdGhlcmU0OiAnXFx1MjIzNCcsXG4gIHNpbTogJ1xcdTIyM0MnLFxuICBjb25nOiAnXFx1MjI0NScsXG4gIGFzeW1wOiAnXFx1MjI0OCcsXG4gIG5lOiAnXFx1MjI2MCcsXG4gIGVxdWl2OiAnXFx1MjI2MScsXG4gIGxlOiAnXFx1MjI2NCcsXG4gIGdlOiAnXFx1MjI2NScsXG4gIHN1YjogJ1xcdTIyODInLFxuICBzdXA6ICdcXHUyMjgzJyxcbiAgbnN1YjogJ1xcdTIyODQnLFxuICBzdWJlOiAnXFx1MjI4NicsXG4gIHN1cGU6ICdcXHUyMjg3JyxcbiAgb3BsdXM6ICdcXHUyMjk1JyxcbiAgb3RpbWVzOiAnXFx1MjI5NycsXG4gIHBlcnA6ICdcXHUyMkE1JyxcbiAgc2RvdDogJ1xcdTIyQzUnLFxuICBsY2VpbDogJ1xcdTIzMDgnLFxuICByY2VpbDogJ1xcdTIzMDknLFxuICBsZmxvb3I6ICdcXHUyMzBBJyxcbiAgcmZsb29yOiAnXFx1MjMwQicsXG4gIGxhbmc6ICdcXHUyMzI5JyxcbiAgcmFuZzogJ1xcdTIzMkEnLFxuICBsb3o6ICdcXHUyNUNBJyxcbiAgc3BhZGVzOiAnXFx1MjY2MCcsXG4gIGNsdWJzOiAnXFx1MjY2MycsXG4gIGhlYXJ0czogJ1xcdTI2NjUnLFxuICBkaWFtczogJ1xcdTI2NjYnXG59O1xuIiwiKGZ1bmN0aW9uIChwcm9jZXNzLF9fZmlsZW5hbWUpe1xuLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00XG4gKiBAbGljZW5zZSBhbWRlZmluZSAxLjAuMCBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSwgVGhlIERvam8gRm91bmRhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS5cbiAqIHNlZTogaHR0cDovL2dpdGh1Yi5jb20vanJidXJrZS9hbWRlZmluZSBmb3IgZGV0YWlsc1xuICovXG5cbi8qanNsaW50IG5vZGU6IHRydWUgKi9cbi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWZpbmUgZm9yIG5vZGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBcIm1vZHVsZVwiIG9iamVjdCB0aGF0IGlzIGRlZmluZWQgYnkgTm9kZSBmb3IgdGhlXG4gKiBjdXJyZW50IG1vZHVsZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXF1aXJlRm5dLiBOb2RlJ3MgcmVxdWlyZSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlLlxuICogSXQgb25seSBuZWVkcyB0byBiZSBwYXNzZWQgaW4gTm9kZSB2ZXJzaW9ucyBiZWZvcmUgMC41LCB3aGVuIG1vZHVsZS5yZXF1aXJlXG4gKiBkaWQgbm90IGV4aXN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIGRlZmluZSBmdW5jdGlvbiB0aGF0IGlzIHVzYWJsZSBmb3IgdGhlIGN1cnJlbnQgbm9kZVxuICogbW9kdWxlLlxuICovXG5mdW5jdGlvbiBhbWRlZmluZShtb2R1bGUsIHJlcXVpcmVGbikge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgZGVmaW5lQ2FjaGUgPSB7fSxcbiAgICAgICAgbG9hZGVyQ2FjaGUgPSB7fSxcbiAgICAgICAgYWxyZWFkeUNhbGxlZCA9IGZhbHNlLFxuICAgICAgICBwYXRoID0gcmVxdWlyZSgncGF0aCcpLFxuICAgICAgICBtYWtlUmVxdWlyZSwgc3RyaW5nUmVxdWlyZTtcblxuICAgIC8qKlxuICAgICAqIFRyaW1zIHRoZSAuIGFuZCAuLiBmcm9tIGFuIGFycmF5IG9mIHBhdGggc2VnbWVudHMuXG4gICAgICogSXQgd2lsbCBrZWVwIGEgbGVhZGluZyBwYXRoIHNlZ21lbnQgaWYgYSAuLiB3aWxsIGJlY29tZVxuICAgICAqIHRoZSBmaXJzdCBwYXRoIHNlZ21lbnQsIHRvIGhlbHAgd2l0aCBtb2R1bGUgbmFtZSBsb29rdXBzLFxuICAgICAqIHdoaWNoIGFjdCBsaWtlIHBhdGhzLCBidXQgY2FuIGJlIHJlbWFwcGVkLiBCdXQgdGhlIGVuZCByZXN1bHQsXG4gICAgICogYWxsIHBhdGhzIHRoYXQgdXNlIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGxvb2sgbm9ybWFsaXplZC5cbiAgICAgKiBOT1RFOiB0aGlzIG1ldGhvZCBNT0RJRklFUyB0aGUgaW5wdXQgYXJyYXkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJ5IHRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1Eb3RzKGFyeSkge1xuICAgICAgICB2YXIgaSwgcGFydDtcbiAgICAgICAgZm9yIChpID0gMDsgYXJ5W2ldOyBpKz0gMSkge1xuICAgICAgICAgICAgcGFydCA9IGFyeVtpXTtcbiAgICAgICAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBhcnkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIChhcnlbMl0gPT09ICcuLicgfHwgYXJ5WzBdID09PSAnLi4nKSkge1xuICAgICAgICAgICAgICAgICAgICAvL0VuZCBvZiB0aGUgbGluZS4gS2VlcCBhdCBsZWFzdCBvbmUgbm9uLWRvdFxuICAgICAgICAgICAgICAgICAgICAvL3BhdGggc2VnbWVudCBhdCB0aGUgZnJvbnQgc28gaXQgY2FuIGJlIG1hcHBlZFxuICAgICAgICAgICAgICAgICAgICAvL2NvcnJlY3RseSB0byBkaXNrLiBPdGhlcndpc2UsIHRoZXJlIGlzIGxpa2VseVxuICAgICAgICAgICAgICAgICAgICAvL25vIHBhdGggbWFwcGluZyBmb3IgYSBwYXRoIHN0YXJ0aW5nIHdpdGggJy4uJy5cbiAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNhbiBzdGlsbCBmYWlsLCBidXQgY2F0Y2hlcyB0aGUgbW9zdCByZWFzb25hYmxlXG4gICAgICAgICAgICAgICAgICAgIC8vdXNlcyBvZiAuLlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKG5hbWUsIGJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBiYXNlUGFydHM7XG5cbiAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLlxuICAgICAgICBpZiAobmFtZSAmJiBuYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAvL0lmIGhhdmUgYSBiYXNlIG5hbWUsIHRyeSB0byBub3JtYWxpemUgYWdhaW5zdCBpdCxcbiAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCBhc3N1bWUgaXQgaXMgYSB0b3AtbGV2ZWwgcmVxdWlyZSB0aGF0IHdpbGxcbiAgICAgICAgICAgIC8vYmUgcmVsYXRpdmUgdG8gYmFzZVVybCBpbiB0aGUgZW5kLlxuICAgICAgICAgICAgaWYgKGJhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZU5hbWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlUGFydHMuc2xpY2UoMCwgYmFzZVBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5jb25jYXQobmFtZS5zcGxpdCgnLycpKTtcbiAgICAgICAgICAgICAgICB0cmltRG90cyhiYXNlUGFydHMpO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBiYXNlUGFydHMuam9pbignLycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBub3JtYWxpemUoKSBmdW5jdGlvbiBwYXNzZWQgdG8gYSBsb2FkZXIgcGx1Z2luJ3NcbiAgICAgKiBub3JtYWxpemUgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1ha2VOb3JtYWxpemUocmVsTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUobmFtZSwgcmVsTmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUxvYWQoaWQpIHtcbiAgICAgICAgZnVuY3Rpb24gbG9hZCh2YWx1ZSkge1xuICAgICAgICAgICAgbG9hZGVyQ2FjaGVbaWRdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkLmZyb21UZXh0ID0gZnVuY3Rpb24gKGlkLCB0ZXh0KSB7XG4gICAgICAgICAgICAvL1RoaXMgb25lIGlzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSB0ZXh0IGNhbi9wcm9iYWJseSB1c2VzXG4gICAgICAgICAgICAvL2RlZmluZSwgYW5kIGFueSByZWxhdGl2ZSBwYXRocyBhbmQgcmVxdWlyZXMgc2hvdWxkIGJlIHJlbGF0aXZlXG4gICAgICAgICAgICAvL3RvIHRoYXQgaWQgd2FzIGl0IHdvdWxkIGJlIGZvdW5kIG9uIGRpc2suIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmVcbiAgICAgICAgICAgIC8vYm9vdHN0cmFwcGluZyBhIG1vZHVsZS9yZXF1aXJlIGZhaXJseSBkZWVwbHkgZnJvbSBub2RlIGNvcmUuXG4gICAgICAgICAgICAvL05vdCBzdXJlIGhvdyBiZXN0IHRvIGdvIGFib3V0IHRoYXQgeWV0LlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWRlZmluZSBkb2VzIG5vdCBpbXBsZW1lbnQgbG9hZC5mcm9tVGV4dCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBsb2FkO1xuICAgIH1cblxuICAgIG1ha2VSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpIHtcbiAgICAgICAgZnVuY3Rpb24gYW1kUmVxdWlyZShkZXBzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMsIHNpbmdsZSBtb2R1bGUgcmVxdWlyZSgnJylcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGRlcHMsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9BcnJheSBvZiBkZXBlbmRlbmNpZXMgd2l0aCBhIGNhbGxiYWNrLlxuXG4gICAgICAgICAgICAgICAgLy9Db252ZXJ0IHRoZSBkZXBlbmRlbmNpZXMgdG8gbW9kdWxlcy5cbiAgICAgICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBkZXBOYW1lLCByZWxJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIG5leHQgdGljayB0byBjYWxsIGJhY2sgdGhlIHJlcXVpcmUgY2FsbC5cbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYW1kUmVxdWlyZS50b1VybCA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoLmluZGV4T2YoJy4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZmlsZVBhdGgsIHBhdGguZGlybmFtZShtb2R1bGUuZmlsZW5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhbWRSZXF1aXJlO1xuICAgIH07XG5cbiAgICAvL0Zhdm9yIGV4cGxpY2l0IHZhbHVlLCBwYXNzZWQgaW4gaWYgdGhlIG1vZHVsZSB3YW50cyB0byBzdXBwb3J0IE5vZGUgMC40LlxuICAgIHJlcXVpcmVGbiA9IHJlcXVpcmVGbiB8fCBmdW5jdGlvbiByZXEoKSB7XG4gICAgICAgIHJldHVybiBtb2R1bGUucmVxdWlyZS5hcHBseShtb2R1bGUsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJ1bkZhY3RvcnkoaWQsIGRlcHMsIGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHIsIGUsIG0sIHJlc3VsdDtcblxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGUgPSBsb2FkZXJDYWNoZVtpZF0gPSB7fTtcbiAgICAgICAgICAgIG0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHVyaTogX19maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgciA9IG1ha2VSZXF1aXJlKHJlcXVpcmVGbiwgZSwgbSwgaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9Pbmx5IHN1cHBvcnQgb25lIGRlZmluZSBjYWxsIHBlciBmaWxlXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW1kZWZpbmUgd2l0aCBubyBtb2R1bGUgSUQgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgZmlsZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvL1VzZSB0aGUgcmVhbCB2YXJpYWJsZXMgZnJvbSBub2RlXG4gICAgICAgICAgICAvL1VzZSBtb2R1bGUuZXhwb3J0cyBmb3IgZXhwb3J0cywgc2luY2VcbiAgICAgICAgICAgIC8vdGhlIGV4cG9ydHMgaW4gaGVyZSBpcyBhbWRlZmluZSBleHBvcnRzLlxuICAgICAgICAgICAgZSA9IG1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgbSA9IG1vZHVsZTtcbiAgICAgICAgICAgIHIgPSBtYWtlUmVxdWlyZShyZXF1aXJlRm4sIGUsIG0sIG1vZHVsZS5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0lmIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMsIHRoZXkgYXJlIHN0cmluZ3MsIHNvIG5lZWRcbiAgICAgICAgLy90byBjb252ZXJ0IHRoZW0gdG8gZGVwZW5kZW5jeSB2YWx1ZXMuXG4gICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcihkZXBOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DYWxsIHRoZSBmYWN0b3J5IHdpdGggdGhlIHJpZ2h0IGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5LmFwcGx5KG0uZXhwb3J0cywgZGVwcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtLmV4cG9ydHMgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBsb2FkZXJDYWNoZVtpZF0gPSBtLmV4cG9ydHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJpbmdSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgaWQsIHJlbElkKSB7XG4gICAgICAgIC8vU3BsaXQgdGhlIElEIGJ5IGEgISBzbyB0aGF0XG4gICAgICAgIHZhciBpbmRleCA9IGlkLmluZGV4T2YoJyEnKSxcbiAgICAgICAgICAgIG9yaWdpbmFsSWQgPSBpZCxcbiAgICAgICAgICAgIHByZWZpeCwgcGx1Z2luO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG5cbiAgICAgICAgICAgIC8vU3RyYWlnaHQgbW9kdWxlIGxvb2t1cC4gSWYgaXQgaXMgb25lIG9mIHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgIC8vZGVhbCB3aXRoIGl0LCBvdGhlcndpc2UsIGRlbGVnYXRlIHRvIG5vZGUuXG4gICAgICAgICAgICBpZiAoaWQgPT09ICdyZXF1aXJlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkZXJDYWNoZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICBydW5GYWN0b3J5LmFwcGx5KG51bGwsIGRlZmluZUNhY2hlW2lkXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYoc3lzdGVtUmVxdWlyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3lzdGVtUmVxdWlyZShvcmlnaW5hbElkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1vZHVsZSB3aXRoIElEOiAnICsgaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVGhlcmUgaXMgYSBwbHVnaW4gaW4gcGxheS5cbiAgICAgICAgICAgIHByZWZpeCA9IGlkLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZyhpbmRleCArIDEsIGlkLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHBsdWdpbiA9IHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBwcmVmaXgsIHJlbElkKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBpZCA9IHBsdWdpbi5ub3JtYWxpemUoaWQsIG1ha2VOb3JtYWxpemUocmVsSWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIG5vcm1hbGx5LlxuICAgICAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2FkZXJDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4ubG9hZChpZCwgbWFrZVJlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCksIG1ha2VMb2FkKGlkKSwge30pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL0NyZWF0ZSBhIGRlZmluZSBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGUgbW9kdWxlIGFza2luZyBmb3IgYW1kZWZpbmUuXG4gICAgZnVuY3Rpb24gZGVmaW5lKGlkLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gaWQ7XG4gICAgICAgICAgICBpZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gaWQ7XG4gICAgICAgICAgICBpZCA9IGRlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVwcyAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ107XG4gICAgICAgIH1cblxuICAgICAgICAvL1NldCB1cCBwcm9wZXJ0aWVzIGZvciB0aGlzIG1vZHVsZS4gSWYgYW4gSUQsIHRoZW4gdXNlXG4gICAgICAgIC8vaW50ZXJuYWwgY2FjaGUuIElmIG5vIElELCB0aGVuIHVzZSB0aGUgZXh0ZXJuYWwgdmFyaWFibGVzXG4gICAgICAgIC8vZm9yIHRoaXMgbm9kZSBtb2R1bGUuXG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgLy9QdXQgdGhlIG1vZHVsZSBpbiBkZWVwIGZyZWV6ZSB1bnRpbCB0aGVyZSBpcyBhXG4gICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCBmb3IgaXQuXG4gICAgICAgICAgICBkZWZpbmVDYWNoZVtpZF0gPSBbaWQsIGRlcHMsIGZhY3RvcnldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuRmFjdG9yeShpZCwgZGVwcywgZmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL2RlZmluZS5yZXF1aXJlLCB3aGljaCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgdmFsdWVzIGluIHRoZVxuICAgIC8vY2FjaGUuIFVzZWZ1bCBmb3IgQU1EIG1vZHVsZXMgdGhhdCBhbGwgaGF2ZSBJRHMgaW4gdGhlIGZpbGUsXG4gICAgLy9idXQgbmVlZCB0byBmaW5hbGx5IGV4cG9ydCBhIHZhbHVlIHRvIG5vZGUgYmFzZWQgb24gb25lIG9mIHRob3NlXG4gICAgLy9JRHMuXG4gICAgZGVmaW5lLnJlcXVpcmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGxvYWRlckNhY2hlW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIHJ1bkZhY3RvcnkuYXBwbHkobnVsbCwgZGVmaW5lQ2FjaGVbaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVmaW5lLmFtZCA9IHt9O1xuXG4gICAgcmV0dXJuIGRlZmluZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhbWRlZmluZTtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksXCIvbm9kZV9tb2R1bGVzL2FtZGVmaW5lL2FtZGVmaW5lLmpzXCIpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5aGJXUmxabWx1WlM5aGJXUmxabWx1WlM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xSUhacGJUb2daWFE2ZEhNOU5EcHpkejAwT25OMGN6MDBYRzRnS2lCQWJHbGpaVzV6WlNCaGJXUmxabWx1WlNBeExqQXVNQ0JEYjNCNWNtbG5hSFFnS0dNcElESXdNVEV0TWpBeE5Td2dWR2hsSUVSdmFtOGdSbTkxYm1SaGRHbHZiaUJCYkd3Z1VtbG5hSFJ6SUZKbGMyVnlkbVZrTGx4dUlDb2dRWFpoYVd4aFlteGxJSFpwWVNCMGFHVWdUVWxVSUc5eUlHNWxkeUJDVTBRZ2JHbGpaVzV6WlM1Y2JpQXFJSE5sWlRvZ2FIUjBjRG92TDJkcGRHaDFZaTVqYjIwdmFuSmlkWEpyWlM5aGJXUmxabWx1WlNCbWIzSWdaR1YwWVdsc2MxeHVJQ292WEc1Y2JpOHFhbk5zYVc1MElHNXZaR1U2SUhSeWRXVWdLaTljYmk4cVoyeHZZbUZzSUcxdlpIVnNaU3dnY0hKdlkyVnpjeUFxTDF4dUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCa1pXWnBibVVnWm05eUlHNXZaR1V1WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JXOWtkV3hsSUhSb1pTQmNJbTF2WkhWc1pWd2lJRzlpYW1WamRDQjBhR0YwSUdseklHUmxabWx1WldRZ1lua2dUbTlrWlNCbWIzSWdkR2hsWEc0Z0tpQmpkWEp5Wlc1MElHMXZaSFZzWlM1Y2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRnR5WlhGMWFYSmxSbTVkTGlCT2IyUmxKM01nY21WeGRXbHlaU0JtZFc1amRHbHZiaUJtYjNJZ2RHaGxJR04xY25KbGJuUWdiVzlrZFd4bExseHVJQ29nU1hRZ2IyNXNlU0J1WldWa2N5QjBieUJpWlNCd1lYTnpaV1FnYVc0Z1RtOWtaU0IyWlhKemFXOXVjeUJpWldadmNtVWdNQzQxTENCM2FHVnVJRzF2WkhWc1pTNXlaWEYxYVhKbFhHNGdLaUJrYVdRZ2JtOTBJR1Y0YVhOMExseHVJQ29nUUhKbGRIVnlibk1nZTBaMWJtTjBhVzl1ZlNCaElHUmxabWx1WlNCbWRXNWpkR2x2YmlCMGFHRjBJR2x6SUhWellXSnNaU0JtYjNJZ2RHaGxJR04xY25KbGJuUWdibTlrWlZ4dUlDb2diVzlrZFd4bExseHVJQ292WEc1bWRXNWpkR2x2YmlCaGJXUmxabWx1WlNodGIyUjFiR1VzSUhKbGNYVnBjbVZHYmlrZ2UxeHVJQ0FnSUNkMWMyVWdjM1J5YVdOMEp6dGNiaUFnSUNCMllYSWdaR1ZtYVc1bFEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdiRzloWkdWeVEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdZV3h5WldGa2VVTmhiR3hsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCd1lYUm9JRDBnY21WeGRXbHlaU2duY0dGMGFDY3BMRnh1SUNBZ0lDQWdJQ0J0WVd0bFVtVnhkV2x5WlN3Z2MzUnlhVzVuVW1WeGRXbHlaVHRjYmx4dUlDQWdJQzhxS2x4dUlDQWdJQ0FxSUZSeWFXMXpJSFJvWlNBdUlHRnVaQ0F1TGlCbWNtOXRJR0Z1SUdGeWNtRjVJRzltSUhCaGRHZ2djMlZuYldWdWRITXVYRzRnSUNBZ0lDb2dTWFFnZDJsc2JDQnJaV1Z3SUdFZ2JHVmhaR2x1WnlCd1lYUm9JSE5sWjIxbGJuUWdhV1lnWVNBdUxpQjNhV3hzSUdKbFkyOXRaVnh1SUNBZ0lDQXFJSFJvWlNCbWFYSnpkQ0J3WVhSb0lITmxaMjFsYm5Rc0lIUnZJR2hsYkhBZ2QybDBhQ0J0YjJSMWJHVWdibUZ0WlNCc2IyOXJkWEJ6TEZ4dUlDQWdJQ0FxSUhkb2FXTm9JR0ZqZENCc2FXdGxJSEJoZEdoekxDQmlkWFFnWTJGdUlHSmxJSEpsYldGd2NHVmtMaUJDZFhRZ2RHaGxJR1Z1WkNCeVpYTjFiSFFzWEc0Z0lDQWdJQ29nWVd4c0lIQmhkR2h6SUhSb1lYUWdkWE5sSUhSb2FYTWdablZ1WTNScGIyNGdjMmh2ZFd4a0lHeHZiMnNnYm05eWJXRnNhWHBsWkM1Y2JpQWdJQ0FnS2lCT1QxUkZPaUIwYUdseklHMWxkR2h2WkNCTlQwUkpSa2xGVXlCMGFHVWdhVzV3ZFhRZ1lYSnlZWGt1WEc0Z0lDQWdJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEo1SUhSb1pTQmhjbkpoZVNCdlppQndZWFJvSUhObFoyMWxiblJ6TGx4dUlDQWdJQ0FxTDF4dUlDQWdJR1oxYm1OMGFXOXVJSFJ5YVcxRWIzUnpLR0Z5ZVNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVN3Z2NHRnlkRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTURzZ1lYSjVXMmxkT3lCcEt6MGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjR0Z5ZENBOUlHRnllVnRwWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod1lYSjBJRDA5UFNBbkxpY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoY25rdWMzQnNhV05sS0drc0lERXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2tnTFQwZ01UdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2NHRnlkQ0E5UFQwZ0p5NHVKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJRDA5UFNBeElDWW1JQ2hoY25sYk1sMGdQVDA5SUNjdUxpY2dmSHdnWVhKNVd6QmRJRDA5UFNBbkxpNG5LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMFZ1WkNCdlppQjBhR1VnYkdsdVpTNGdTMlZsY0NCaGRDQnNaV0Z6ZENCdmJtVWdibTl1TFdSdmRGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDNCaGRHZ2djMlZuYldWdWRDQmhkQ0IwYUdVZ1puSnZiblFnYzI4Z2FYUWdZMkZ1SUdKbElHMWhjSEJsWkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMk52Y25KbFkzUnNlU0IwYnlCa2FYTnJMaUJQZEdobGNuZHBjMlVzSUhSb1pYSmxJR2x6SUd4cGEyVnNlVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwyNXZJSEJoZEdnZ2JXRndjR2x1WnlCbWIzSWdZU0J3WVhSb0lITjBZWEowYVc1bklIZHBkR2dnSnk0dUp5NWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5VWFHbHpJR05oYmlCemRHbHNiQ0JtWVdsc0xDQmlkWFFnWTJGMFkyaGxjeUIwYUdVZ2JXOXpkQ0J5WldGemIyNWhZbXhsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZkWE5sY3lCdlppQXVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0drZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnllUzV6Y0d4cFkyVW9hU0F0SURFc0lESXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcElDMDlJREk3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdibTl5YldGc2FYcGxLRzVoYldVc0lHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaVlYTmxVR0Z5ZEhNN1hHNWNiaUFnSUNBZ0lDQWdMeTlCWkdwMWMzUWdZVzU1SUhKbGJHRjBhWFpsSUhCaGRHaHpMbHh1SUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU0FtSmlCdVlXMWxMbU5vWVhKQmRDZ3dLU0E5UFQwZ0p5NG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMGxtSUdoaGRtVWdZU0JpWVhObElHNWhiV1VzSUhSeWVTQjBieUJ1YjNKdFlXeHBlbVVnWVdkaGFXNXpkQ0JwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2YjNSb1pYSjNhWE5sTENCaGMzTjFiV1VnYVhRZ2FYTWdZU0IwYjNBdGJHVjJaV3dnY21WeGRXbHlaU0IwYUdGMElIZHBiR3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZZbVVnY21Wc1lYUnBkbVVnZEc4Z1ltRnpaVlZ5YkNCcGJpQjBhR1VnWlc1a0xseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGNuUnpJRDBnWW1GelpVNWhiV1V1YzNCc2FYUW9KeThuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYTmxVR0Z5ZEhNZ1BTQmlZWE5sVUdGeWRITXVjMnhwWTJVb01Dd2dZbUZ6WlZCaGNuUnpMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGMyVlFZWEowY3lBOUlHSmhjMlZRWVhKMGN5NWpiMjVqWVhRb2JtRnRaUzV6Y0d4cGRDZ25MeWNwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGNtbHRSRzkwY3loaVlYTmxVR0Z5ZEhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCaVlYTmxVR0Z5ZEhNdWFtOXBiaWduTHljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHNWhiV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeW9xWEc0Z0lDQWdJQ29nUTNKbFlYUmxJSFJvWlNCdWIzSnRZV3hwZW1Vb0tTQm1kVzVqZEdsdmJpQndZWE56WldRZ2RHOGdZU0JzYjJGa1pYSWdjR3gxWjJsdUozTmNiaUFnSUNBZ0tpQnViM0p0WVd4cGVtVWdiV1YwYUc5a0xseHVJQ0FnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUcxaGEyVk9iM0p0WVd4cGVtVW9jbVZzVG1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdLRzVoYldVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVVvYm1GdFpTd2djbVZzVG1GdFpTazdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiV0ZyWlV4dllXUW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z2JHOWhaQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHOWhaR1Z5UTJGamFHVmJhV1JkSUQwZ2RtRnNkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnNiMkZrTG1aeWIyMVVaWGgwSUQwZ1puVnVZM1JwYjI0Z0tHbGtMQ0IwWlhoMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwxUm9hWE1nYjI1bElHbHpJR1JwWm1acFkzVnNkQ0JpWldOaGRYTmxJSFJvWlNCMFpYaDBJR05oYmk5d2NtOWlZV0pzZVNCMWMyVnpYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwyUmxabWx1WlN3Z1lXNWtJR0Z1ZVNCeVpXeGhkR2wyWlNCd1lYUm9jeUJoYm1RZ2NtVnhkV2x5WlhNZ2MyaHZkV3hrSUdKbElISmxiR0YwYVhabFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDNSdklIUm9ZWFFnYVdRZ2QyRnpJR2wwSUhkdmRXeGtJR0psSUdadmRXNWtJRzl1SUdScGMyc3VJRUoxZENCMGFHbHpJSGR2ZFd4a0lISmxjWFZwY21WY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2WW05dmRITjBjbUZ3Y0dsdVp5QmhJRzF2WkhWc1pTOXlaWEYxYVhKbElHWmhhWEpzZVNCa1pXVndiSGtnWm5KdmJTQnViMlJsSUdOdmNtVXVYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwwNXZkQ0J6ZFhKbElHaHZkeUJpWlhOMElIUnZJR2R2SUdGaWIzVjBJSFJvWVhRZ2VXVjBMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkaGJXUmxabWx1WlNCa2IyVnpJRzV2ZENCcGJYQnNaVzFsYm5RZ2JHOWhaQzVtY205dFZHVjRkQ2NwTzF4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMkZrTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzFoYTJWU1pYRjFhWEpsSUQwZ1puVnVZM1JwYjI0Z0tITjVjM1JsYlZKbGNYVnBjbVVzSUdWNGNHOXlkSE1zSUcxdlpIVnNaU3dnY21Wc1NXUXBJSHRjYmlBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnWVcxa1VtVnhkV2x5WlNoa1pYQnpMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJrWlhCeklEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dlUzbHVZMmh5YjI1dmRYTXNJSE5wYm1kc1pTQnRiMlIxYkdVZ2NtVnhkV2x5WlNnbkp5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzUnlhVzVuVW1WeGRXbHlaU2h6ZVhOMFpXMVNaWEYxYVhKbExDQmxlSEJ2Y25SekxDQnRiMlIxYkdVc0lHUmxjSE1zSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OUJjbkpoZVNCdlppQmtaWEJsYm1SbGJtTnBaWE1nZDJsMGFDQmhJR05oYkd4aVlXTnJMbHh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5RGIyNTJaWEowSUhSb1pTQmtaWEJsYm1SbGJtTnBaWE1nZEc4Z2JXOWtkV3hsY3k1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlITjBjbWx1WjFKbGNYVnBjbVVvYzNsemRHVnRVbVZ4ZFdseVpTd2daWGh3YjNKMGN5d2diVzlrZFd4bExDQmtaWEJPWVcxbExDQnlaV3hKWkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDFkaGFYUWdabTl5SUc1bGVIUWdkR2xqYXlCMGJ5QmpZV3hzSUdKaFkyc2dkR2hsSUhKbGNYVnBjbVVnWTJGc2JDNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEp2WTJWemN5NXVaWGgwVkdsamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheTVoY0hCc2VTaHVkV3hzTENCa1pYQnpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWVcxa1VtVnhkV2x5WlM1MGIxVnliQ0E5SUdaMWJtTjBhVzl1SUNobWFXeGxVR0YwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHWnBiR1ZRWVhSb0xtbHVaR1Y0VDJZb0p5NG5LU0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnViM0p0WVd4cGVtVW9abWxzWlZCaGRHZ3NJSEJoZEdndVpHbHlibUZ0WlNodGIyUjFiR1V1Wm1sc1pXNWhiV1VwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWnBiR1ZRWVhSb08xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhiV1JTWlhGMWFYSmxPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMMFpoZG05eUlHVjRjR3hwWTJsMElIWmhiSFZsTENCd1lYTnpaV1FnYVc0Z2FXWWdkR2hsSUcxdlpIVnNaU0IzWVc1MGN5QjBieUJ6ZFhCd2IzSjBJRTV2WkdVZ01DNDBMbHh1SUNBZ0lISmxjWFZwY21WR2JpQTlJSEpsY1hWcGNtVkdiaUI4ZkNCbWRXNWpkR2x2YmlCeVpYRW9LU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ0YjJSMWJHVXVjbVZ4ZFdseVpTNWhjSEJzZVNodGIyUjFiR1VzSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUhKMWJrWmhZM1J2Y25rb2FXUXNJR1JsY0hNc0lHWmhZM1J2Y25rcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUhJc0lHVXNJRzBzSUhKbGMzVnNkRHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1VnUFNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdJQ0FnSUcwZ1BTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1E2SUdsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVnlhVG9nWDE5bWFXeGxibUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGVIQnZjblJ6T2lCbFhHNGdJQ0FnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdjaUE5SUcxaGEyVlNaWEYxYVhKbEtISmxjWFZwY21WR2Jpd2daU3dnYlN3Z2FXUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OVBibXg1SUhOMWNIQnZjblFnYjI1bElHUmxabWx1WlNCallXeHNJSEJsY2lCbWFXeGxYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZV3h5WldGa2VVTmhiR3hsWkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbllXMWtaV1pwYm1VZ2QybDBhQ0J1YnlCdGIyUjFiR1VnU1VRZ1kyRnVibTkwSUdKbElHTmhiR3hsWkNCdGIzSmxJSFJvWVc0Z2IyNWpaU0J3WlhJZ1ptbHNaUzRuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHRnNjbVZoWkhsRFlXeHNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMVZ6WlNCMGFHVWdjbVZoYkNCMllYSnBZV0pzWlhNZ1puSnZiU0J1YjJSbFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDFWelpTQnRiMlIxYkdVdVpYaHdiM0owY3lCbWIzSWdaWGh3YjNKMGN5d2djMmx1WTJWY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2ZEdobElHVjRjRzl5ZEhNZ2FXNGdhR1Z5WlNCcGN5QmhiV1JsWm1sdVpTQmxlSEJ2Y25SekxseHVJQ0FnSUNBZ0lDQWdJQ0FnWlNBOUlHMXZaSFZzWlM1bGVIQnZjblJ6TzF4dUlDQWdJQ0FnSUNBZ0lDQWdiU0E5SUcxdlpIVnNaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISWdQU0J0WVd0bFVtVnhkV2x5WlNoeVpYRjFhWEpsUm00c0lHVXNJRzBzSUcxdlpIVnNaUzVwWkNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2TDBsbUlIUm9aWEpsSUdGeVpTQmtaWEJsYm1SbGJtTnBaWE1zSUhSb1pYa2dZWEpsSUhOMGNtbHVaM01zSUhOdklHNWxaV1JjYmlBZ0lDQWdJQ0FnTHk5MGJ5QmpiMjUyWlhKMElIUm9aVzBnZEc4Z1pHVndaVzVrWlc1amVTQjJZV3gxWlhNdVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWlhCektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY2loa1pYQk9ZVzFsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdMeTlEWVd4c0lIUm9aU0JtWVdOMGIzSjVJSGRwZEdnZ2RHaGxJSEpwWjJoMElHUmxjR1Z1WkdWdVkybGxjeTVjYmlBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCbVlXTjBiM0o1SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNUxtRndjR3g1S0cwdVpYaHdiM0owY3l3Z1pHVndjeWs3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnRMbVY0Y0c5eWRITWdQU0J5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCdExtVjRjRzl5ZEhNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J6ZEhKcGJtZFNaWEYxYVhKbElEMGdablZ1WTNScGIyNGdLSE41YzNSbGJWSmxjWFZwY21Vc0lHVjRjRzl5ZEhNc0lHMXZaSFZzWlN3Z2FXUXNJSEpsYkVsa0tTQjdYRzRnSUNBZ0lDQWdJQzh2VTNCc2FYUWdkR2hsSUVsRUlHSjVJR0VnSVNCemJ5QjBhR0YwWEc0Z0lDQWdJQ0FnSUhaaGNpQnBibVJsZUNBOUlHbGtMbWx1WkdWNFQyWW9KeUVuS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzl5YVdkcGJtRnNTV1FnUFNCcFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpXWnBlQ3dnY0d4MVoybHVPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZVM1J5WVdsbmFIUWdiVzlrZFd4bElHeHZiMnQxY0M0Z1NXWWdhWFFnYVhNZ2IyNWxJRzltSUhSb1pTQnpjR1ZqYVdGc0lHUmxjR1Z1WkdWdVkybGxjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZaR1ZoYkNCM2FYUm9JR2wwTENCdmRHaGxjbmRwYzJVc0lHUmxiR1ZuWVhSbElIUnZJRzV2WkdVdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXUWdQVDA5SUNkeVpYRjFhWEpsSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlXdGxVbVZ4ZFdseVpTaHplWE4wWlcxU1pYRjFhWEpsTENCbGVIQnZjblJ6TENCdGIyUjFiR1VzSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9hV1FnUFQwOUlDZGxlSEJ2Y25Sekp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmxlSEJ2Y25Sek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNocFpDQTlQVDBnSjIxdlpIVnNaU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYlc5a2RXeGxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNiMkZrWlhKRFlXTm9aUzVvWVhOUGQyNVFjbTl3WlhKMGVTaHBaQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkc5aFpHVnlRMkZqYUdWYmFXUmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV1pwYm1WRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlkVzVHWVdOMGIzSjVMbUZ3Y0d4NUtHNTFiR3dzSUdSbFptbHVaVU5oWTJobFcybGtYU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR3h2WVdSbGNrTmhZMmhsVzJsa1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZb2MzbHpkR1Z0VW1WeGRXbHlaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzbHpkR1Z0VW1WeGRXbHlaU2h2Y21sbmFXNWhiRWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owNXZJRzF2WkhWc1pTQjNhWFJvSUVsRU9pQW5JQ3NnYVdRcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2VkdobGNtVWdhWE1nWVNCd2JIVm5hVzRnYVc0Z2NHeGhlUzVjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaV1pwZUNBOUlHbGtMbk4xWW5OMGNtbHVaeWd3TENCcGJtUmxlQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdsa0xuTjFZbk4wY21sdVp5aHBibVJsZUNBcklERXNJR2xrTG14bGJtZDBhQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJzZFdkcGJpQTlJSE4wY21sdVoxSmxjWFZwY21Vb2MzbHpkR1Z0VW1WeGRXbHlaU3dnWlhod2IzSjBjeXdnYlc5a2RXeGxMQ0J3Y21WbWFYZ3NJSEpsYkVsa0tUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJzZFdkcGJpNXViM0p0WVd4cGVtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQnNkV2RwYmk1dWIzSnRZV3hwZW1Vb2FXUXNJRzFoYTJWT2IzSnRZV3hwZW1Vb2NtVnNTV1FwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlPYjNKdFlXeHBlbVVnZEdobElFbEVJRzV2Y20xaGJHeDVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHNiMkZrWlhKRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHOWhaR1Z5UTJGamFHVmJhV1JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiSFZuYVc0dWJHOWhaQ2hwWkN3Z2JXRnJaVkpsY1hWcGNtVW9jM2x6ZEdWdFVtVnhkV2x5WlN3Z1pYaHdiM0owY3l3Z2JXOWtkV3hsTENCeVpXeEpaQ2tzSUcxaGEyVk1iMkZrS0dsa0tTd2dlMzBwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMME55WldGMFpTQmhJR1JsWm1sdVpTQm1kVzVqZEdsdmJpQnpjR1ZqYVdacFl5QjBieUIwYUdVZ2JXOWtkV3hsSUdGemEybHVaeUJtYjNJZ1lXMWtaV1pwYm1VdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWkdWbWFXNWxLR2xrTENCa1pYQnpMQ0JtWVdOMGIzSjVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dsa0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptRmpkRzl5ZVNBOUlHUmxjSE03WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ2FXUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnYVdRZ0lUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQm1ZV04wYjNKNUlEMGdhV1E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdSbGNITWdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvWkdWd2N5QW1KaUFoUVhKeVlYa3VhWE5CY25KaGVTaGtaWEJ6S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1GamRHOXllU0E5SUdSbGNITTdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGa1pYQnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ1d5ZHlaWEYxYVhKbEp5d2dKMlY0Y0c5eWRITW5MQ0FuYlc5a2RXeGxKMTA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQXZMMU5sZENCMWNDQndjbTl3WlhKMGFXVnpJR1p2Y2lCMGFHbHpJRzF2WkhWc1pTNGdTV1lnWVc0Z1NVUXNJSFJvWlc0Z2RYTmxYRzRnSUNBZ0lDQWdJQzh2YVc1MFpYSnVZV3dnWTJGamFHVXVJRWxtSUc1dklFbEVMQ0IwYUdWdUlIVnpaU0IwYUdVZ1pYaDBaWEp1WVd3Z2RtRnlhV0ZpYkdWelhHNGdJQ0FnSUNBZ0lDOHZabTl5SUhSb2FYTWdibTlrWlNCdGIyUjFiR1V1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeTlRZFhRZ2RHaGxJRzF2WkhWc1pTQnBiaUJrWldWd0lHWnlaV1Y2WlNCMWJuUnBiQ0IwYUdWeVpTQnBjeUJoWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMM0psY1hWcGNtVWdZMkZzYkNCbWIzSWdhWFF1WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1pwYm1WRFlXTm9aVnRwWkYwZ1BTQmJhV1FzSUdSbGNITXNJR1poWTNSdmNubGRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NuVnVSbUZqZEc5eWVTaHBaQ3dnWkdWd2N5d2dabUZqZEc5eWVTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMMlJsWm1sdVpTNXlaWEYxYVhKbExDQjNhR2xqYUNCb1lYTWdZV05qWlhOeklIUnZJR0ZzYkNCMGFHVWdkbUZzZFdWeklHbHVJSFJvWlZ4dUlDQWdJQzh2WTJGamFHVXVJRlZ6WldaMWJDQm1iM0lnUVUxRUlHMXZaSFZzWlhNZ2RHaGhkQ0JoYkd3Z2FHRjJaU0JKUkhNZ2FXNGdkR2hsSUdacGJHVXNYRzRnSUNBZ0x5OWlkWFFnYm1WbFpDQjBieUJtYVc1aGJHeDVJR1Y0Y0c5eWRDQmhJSFpoYkhWbElIUnZJRzV2WkdVZ1ltRnpaV1FnYjI0Z2IyNWxJRzltSUhSb2IzTmxYRzRnSUNBZ0x5OUpSSE11WEc0Z0lDQWdaR1ZtYVc1bExuSmxjWFZwY21VZ1BTQm1kVzVqZEdsdmJpQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR3h2WVdSbGNrTmhZMmhsVzJsa1hTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWldacGJtVkRZV05vWlZ0cFpGMHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISjFia1poWTNSdmNua3VZWEJ3Ykhrb2JuVnNiQ3dnWkdWbWFXNWxRMkZqYUdWYmFXUmRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyRmtaWEpEWVdOb1pWdHBaRjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnWkdWbWFXNWxMbUZ0WkNBOUlIdDlPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxabWx1WlR0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JoYldSbFptbHVaVHRjYmlKZGZRPT0iLCIvLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gd2hlbiB1c2VkIGluIG5vZGUsIHRoaXMgd2lsbCBhY3R1YWxseSBsb2FkIHRoZSB1dGlsIG1vZHVsZSB3ZSBkZXBlbmQgb25cbi8vIHZlcnN1cyBsb2FkaW5nIHRoZSBidWlsdGluIHV0aWwgbW9kdWxlIGFzIGhhcHBlbnMgb3RoZXJ3aXNlXG4vLyB0aGlzIGlzIGEgYnVnIGluIG5vZGUgbW9kdWxlIGxvYWRpbmcgYXMgZmFyIGFzIEkgYW0gY29uY2VybmVkXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwvJyk7XG5cbnZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbnZhciBhc3NlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IG9rO1xuXG4vLyAyLiBUaGUgQXNzZXJ0aW9uRXJyb3IgaXMgZGVmaW5lZCBpbiBhc3NlcnQuXG4vLyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQgfSlcblxuYXNzZXJ0LkFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3Iob3B0aW9ucykge1xuICB0aGlzLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsO1xuICB0aGlzLmV4cGVjdGVkID0gb3B0aW9ucy5leHBlY3RlZDtcbiAgdGhpcy5vcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3I7XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tZXNzYWdlID0gZ2V0TWVzc2FnZSh0aGlzKTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFja1N0YXJ0RnVuY3Rpb24gPSBvcHRpb25zLnN0YWNrU3RhcnRGdW5jdGlvbiB8fCBmYWlsO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gc3RhY2tTdGFydEZ1bmN0aW9uLm5hbWU7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiAnJyArIHZhbHVlO1xuICB9XG4gIGlmICh1dGlsLmlzTnVtYmVyKHZhbHVlKSAmJiAhaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHV0aWwuaXNGdW5jdGlvbih2YWx1ZSkgfHwgdXRpbC5pc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHtcbiAgaWYgKHV0aWwuaXNTdHJpbmcocykpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShKU09OLnN0cmluZ2lmeShzZWxmLmFjdHVhbCwgcmVwbGFjZXIpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoc2VsZi5leHBlY3RlZCwgcmVwbGFjZXIpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGFzc2VydC5kZWVwRXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGFjdHVhbCkgJiYgdXRpbC5pc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICBpZiAoYWN0dWFsLmxlbmd0aCAhPSBleHBlY3RlZC5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYWN0dWFsW2ldICE9PSBleHBlY3RlZFtpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIDcuMi4gSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgRGF0ZSBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgdGltZS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzRGF0ZShhY3R1YWwpICYmIHV0aWwuaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzUmVnRXhwKGFjdHVhbCkgJiYgdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmXG4gICAgICAgICAgIGFjdHVhbC5nbG9iYWwgPT09IGV4cGVjdGVkLmdsb2JhbCAmJlxuICAgICAgICAgICBhY3R1YWwubXVsdGlsaW5lID09PSBleHBlY3RlZC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgYWN0dWFsLmxhc3RJbmRleCA9PT0gZXhwZWN0ZWQubGFzdEluZGV4ICYmXG4gICAgICAgICAgIGFjdHVhbC5pZ25vcmVDYXNlID09PSBleHBlY3RlZC5pZ25vcmVDYXNlO1xuXG4gIC8vIDcuNC4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICghdXRpbC5pc09iamVjdChhY3R1YWwpICYmICF1dGlsLmlzT2JqZWN0KGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gNy41IEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYikge1xuICBpZiAodXRpbC5pc051bGxPclVuZGVmaW5lZChhKSB8fCB1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH1cbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKSxcbiAgICAgIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYik7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKSxcbiAgICAgIGtiID0gb2JqZWN0S2V5cyhiKSxcbiAgICAgIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghX2RlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDkuIFRoZSBzdHJpY3QgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHN0cmljdCBlcXVhbGl0eSwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09JywgYXNzZXJ0LnN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gMTAuIFRoZSBzdHJpY3Qgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igc3RyaWN0IGluZXF1YWxpdHksIGFzXG4vLyBkZXRlcm1pbmVkIGJ5ICE9PS4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIG5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPT0nLCBhc3NlcnQubm90U3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHV0aWwuaXNTdHJpbmcoZXhwZWN0ZWQpKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGFjdHVhbCA9IGU7XG4gIH1cblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICghc2hvdWxkVGhyb3cgJiYgZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdHb3QgdW53YW50ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKChzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgZXhwZWN0ZWQgJiZcbiAgICAgICFleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHwgKCFzaG91bGRUaHJvdyAmJiBhY3R1YWwpKSB7XG4gICAgdGhyb3cgYWN0dWFsO1xuICB9XG59XG5cbi8vIDExLiBFeHBlY3RlZCB0byB0aHJvdyBhbiBlcnJvcjpcbi8vIGFzc2VydC50aHJvd3MoYmxvY2ssIEVycm9yX29wdCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MuYXBwbHkodGhpcywgW3RydWVdLmNvbmNhdChwU2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzLmFwcGx5KHRoaXMsIFtmYWxzZV0uY29uY2F0KHBTbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHt0aHJvdyBlcnI7fX07XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL3NoaW1cIik7XG5cbnJlcXVpcmUoXCJiYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuXG5pZiAoZ2xvYmFsLl9iYWJlbFBvbHlmaWxsKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7XG59XG5nbG9iYWwuX2JhYmVsUG9seWZpbGwgPSB0cnVlO1xufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5aVlXSmxiQzF3YjJ4NVptbHNiQzlzYVdJdmFXNWtaWGd1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKY0luVnpaU0J6ZEhKcFkzUmNJanRjYmx4dWNtVnhkV2x5WlNoY0ltTnZjbVV0YW5NdmMyaHBiVndpS1R0Y2JseHVjbVZ4ZFdseVpTaGNJbUpoWW1Wc0xYSmxaMlZ1WlhKaGRHOXlMWEoxYm5ScGJXVmNJaWs3WEc1Y2JtbG1JQ2huYkc5aVlXd3VYMkpoWW1Wc1VHOXNlV1pwYkd3cElIdGNiaUFnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpYjI1c2VTQnZibVVnYVc1emRHRnVZMlVnYjJZZ1ltRmlaV3d0Y0c5c2VXWnBiR3dnYVhNZ1lXeHNiM2RsWkZ3aUtUdGNibjFjYm1kc2IySmhiQzVmWW1GaVpXeFFiMng1Wm1sc2JDQTlJSFJ5ZFdVN0lsMTkiLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvbWFzdGVyL0xJQ0VOU0UgZmlsZS4gQW5cbiAqIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpblxuICogdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID1cbiAgICB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUoKG91dGVyRm4gfHwgR2VuZXJhdG9yKS5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYHZhbHVlIGluc3RhbmNlb2YgQXdhaXRBcmd1bWVudGAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuIFNvbWUgbWF5IGNvbnNpZGVyIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHRvb1xuICAvLyBjdXRlc3ksIGJ1dCB0aGV5IGFyZSBjdXJtdWRnZW9ucy5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBuZXcgQXdhaXRBcmd1bWVudChhcmcpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEF3YWl0QXJndW1lbnQoYXJnKSB7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gIH1cblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIC8vIFRoaXMgaW52b2tlIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gaW4gYSBzdHlsZSB0aGF0IGFzc3VtZXMgc29tZVxuICAgIC8vIGNhbGxpbmcgZnVuY3Rpb24gKG9yIFByb21pc2UpIHdpbGwgaGFuZGxlIGV4Y2VwdGlvbnMuXG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2VuZXJhdG9yW21ldGhvZF0oYXJnKTtcbiAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnRcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUodmFsdWUuYXJnKS50aGVuKGludm9rZU5leHQsIGludm9rZVRocm93KVxuICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy5kb21haW4pIHtcbiAgICAgIGludm9rZSA9IHByb2Nlc3MuZG9tYWluLmJpbmQoaW52b2tlKTtcbiAgICB9XG5cbiAgICB2YXIgaW52b2tlTmV4dCA9IGludm9rZS5iaW5kKGdlbmVyYXRvciwgXCJuZXh0XCIpO1xuICAgIHZhciBpbnZva2VUaHJvdyA9IGludm9rZS5iaW5kKGdlbmVyYXRvciwgXCJ0aHJvd1wiKTtcbiAgICB2YXIgaW52b2tlUmV0dXJuID0gaW52b2tlLmJpbmQoZ2VuZXJhdG9yLCBcInJldHVyblwiKTtcbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBpbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIiB8fFxuICAgICAgICAgICAgICAobWV0aG9kID09PSBcInRocm93XCIgJiYgZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgLy8gQSByZXR1cm4gb3IgdGhyb3cgKHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyB0aHJvd1xuICAgICAgICAgICAgLy8gbWV0aG9kKSBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgICAgdmFyIHJldHVybk1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKHJldHVybk1ldGhvZCkge1xuICAgICAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gocmV0dXJuTWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgYXJnKTtcbiAgICAgICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmV0dXJuIG1ldGhvZCB0aHJldyBhbiBleGNlcHRpb24sIGxldCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHByZXZhaWwgb3ZlciB0aGUgb3JpZ2luYWwgcmV0dXJuIG9yIHRocm93LlxuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCB0aGUgb3V0ZXIgcmV0dXJuLCBub3cgdGhhdCB0aGUgZGVsZWdhdGVcbiAgICAgICAgICAgICAgLy8gaXRlcmF0b3IgaGFzIGJlZW4gdGVybWluYXRlZC5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKFxuICAgICAgICAgICAgZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kXSxcbiAgICAgICAgICAgIGRlbGVnYXRlLml0ZXJhdG9yLFxuICAgICAgICAgICAgYXJnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gTGlrZSByZXR1cm5pbmcgZ2VuZXJhdG9yLnRocm93KHVuY2F1Z2h0KSwgYnV0IHdpdGhvdXQgdGhlXG4gICAgICAgICAgICAvLyBvdmVyaGVhZCBvZiBhbiBleHRyYSBmdW5jdGlvbiBjYWxsLlxuICAgICAgICAgICAgbWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERlbGVnYXRlIGdlbmVyYXRvciByYW4gYW5kIGhhbmRsZWQgaXRzIG93biBleGNlcHRpb25zIHNvXG4gICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBtZXRob2Qgd2FzLCB3ZSBjb250aW51ZSBhcyBpZiBpdCBpc1xuICAgICAgICAgIC8vIFwibmV4dFwiIHdpdGggYW4gdW5kZWZpbmVkIGFyZy5cbiAgICAgICAgICBtZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBhcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG4gICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG4gICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgY29udGV4dC5fc2VudCA9IGFyZztcblxuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCkge1xuICAgICAgICAgICAgY29udGV4dC5zZW50ID0gYXJnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0LnNlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGFyZykpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgICAgbWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgICBhcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5kZWxlZ2F0ZSAmJiBtZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihhcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgbWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIHRoaXMuc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcbiAgICAgICAgcmV0dXJuICEhY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBBbW9uZyB0aGUgdmFyaW91cyB0cmlja3MgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsXG4gIC8vIG9iamVjdCwgdGhpcyBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSB0ZWNobmlxdWUgdGhhdCBkb2VzIG5vdFxuICAvLyB1c2UgaW5kaXJlY3QgZXZhbCAod2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kpLlxuICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6XG4gIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHRoaXNcbik7XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5aVlXSmxiQzF5WldkbGJtVnlZWFJ2Y2kxeWRXNTBhVzFsTDNKMWJuUnBiV1V1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUVOdmNIbHlhV2RvZENBb1l5a2dNakF4TkN3Z1JtRmpaV0p2YjJzc0lFbHVZeTVjYmlBcUlFRnNiQ0J5YVdkb2RITWdjbVZ6WlhKMlpXUXVYRzRnS2x4dUlDb2dWR2hwY3lCemIzVnlZMlVnWTI5a1pTQnBjeUJzYVdObGJuTmxaQ0IxYm1SbGNpQjBhR1VnUWxORUxYTjBlV3hsSUd4cFkyVnVjMlVnWm05MWJtUWdhVzRnZEdobFhHNGdLaUJvZEhSd2N6b3ZMM0poZHk1bmFYUm9kV0l1WTI5dEwyWmhZMlZpYjI5ckwzSmxaMlZ1WlhKaGRHOXlMMjFoYzNSbGNpOU1TVU5GVGxORklHWnBiR1V1SUVGdVhHNGdLaUJoWkdScGRHbHZibUZzSUdkeVlXNTBJRzltSUhCaGRHVnVkQ0J5YVdkb2RITWdZMkZ1SUdKbElHWnZkVzVrSUdsdUlIUm9aU0JRUVZSRlRsUlRJR1pwYkdVZ2FXNWNiaUFxSUhSb1pTQnpZVzFsSUdScGNtVmpkRzl5ZVM1Y2JpQXFMMXh1WEc0aEtHWjFibU4wYVc5dUtHZHNiMkpoYkNrZ2UxeHVJQ0JjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1SUNCMllYSWdhR0Z6VDNkdUlEMGdUMkpxWldOMExuQnliM1J2ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVR0Y2JpQWdkbUZ5SUhWdVpHVm1hVzVsWkRzZ0x5OGdUVzl5WlNCamIyMXdjbVZ6YzJsaWJHVWdkR2hoYmlCMmIybGtJREF1WEc0Z0lIWmhjaUJwZEdWeVlYUnZjbE41YldKdmJDQTlYRzRnSUNBZ2RIbHdaVzltSUZONWJXSnZiQ0E5UFQwZ1hDSm1kVzVqZEdsdmJsd2lJQ1ltSUZONWJXSnZiQzVwZEdWeVlYUnZjaUI4ZkNCY0lrQkFhWFJsY21GMGIzSmNJanRjYmx4dUlDQjJZWElnYVc1TmIyUjFiR1VnUFNCMGVYQmxiMllnYlc5a2RXeGxJRDA5UFNCY0ltOWlhbVZqZEZ3aU8xeHVJQ0IyWVhJZ2NuVnVkR2x0WlNBOUlHZHNiMkpoYkM1eVpXZGxibVZ5WVhSdmNsSjFiblJwYldVN1hHNGdJR2xtSUNoeWRXNTBhVzFsS1NCN1hHNGdJQ0FnYVdZZ0tHbHVUVzlrZFd4bEtTQjdYRzRnSUNBZ0lDQXZMeUJKWmlCeVpXZGxibVZ5WVhSdmNsSjFiblJwYldVZ2FYTWdaR1ZtYVc1bFpDQm5iRzlpWVd4c2VTQmhibVFnZDJVbmNtVWdhVzRnWVNCdGIyUjFiR1VzWEc0Z0lDQWdJQ0F2THlCdFlXdGxJSFJvWlNCbGVIQnZjblJ6SUc5aWFtVmpkQ0JwWkdWdWRHbGpZV3dnZEc4Z2NtVm5aVzVsY21GMGIzSlNkVzUwYVcxbExseHVJQ0FnSUNBZ2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCeWRXNTBhVzFsTzF4dUlDQWdJSDFjYmlBZ0lDQXZMeUJFYjI0bmRDQmliM1JvWlhJZ1pYWmhiSFZoZEdsdVp5QjBhR1VnY21WemRDQnZaaUIwYUdseklHWnBiR1VnYVdZZ2RHaGxJSEoxYm5ScGJXVWdkMkZ6WEc0Z0lDQWdMeThnWVd4eVpXRmtlU0JrWldacGJtVmtJR2RzYjJKaGJHeDVMbHh1SUNBZ0lISmxkSFZ5Ymp0Y2JpQWdmVnh1WEc0Z0lDOHZJRVJsWm1sdVpTQjBhR1VnY25WdWRHbHRaU0JuYkc5aVlXeHNlU0FvWVhNZ1pYaHdaV04wWldRZ1lua2daMlZ1WlhKaGRHVmtJR052WkdVcElHRnpJR1ZwZEdobGNseHVJQ0F2THlCdGIyUjFiR1V1Wlhod2IzSjBjeUFvYVdZZ2QyVW5jbVVnYVc0Z1lTQnRiMlIxYkdVcElHOXlJR0VnYm1WM0xDQmxiWEIwZVNCdlltcGxZM1F1WEc0Z0lISjFiblJwYldVZ1BTQm5iRzlpWVd3dWNtVm5aVzVsY21GMGIzSlNkVzUwYVcxbElEMGdhVzVOYjJSMWJHVWdQeUJ0YjJSMWJHVXVaWGh3YjNKMGN5QTZJSHQ5TzF4dVhHNGdJR1oxYm1OMGFXOXVJSGR5WVhBb2FXNXVaWEpHYml3Z2IzVjBaWEpHYml3Z2MyVnNaaXdnZEhKNVRHOWpjMHhwYzNRcElIdGNiaUFnSUNBdkx5QkpaaUJ2ZFhSbGNrWnVJSEJ5YjNacFpHVmtMQ0IwYUdWdUlHOTFkR1Z5Um00dWNISnZkRzkwZVhCbElHbHVjM1JoYm1ObGIyWWdSMlZ1WlhKaGRHOXlMbHh1SUNBZ0lIWmhjaUJuWlc1bGNtRjBiM0lnUFNCUFltcGxZM1F1WTNKbFlYUmxLQ2h2ZFhSbGNrWnVJSHg4SUVkbGJtVnlZWFJ2Y2lrdWNISnZkRzkwZVhCbEtUdGNiaUFnSUNCMllYSWdZMjl1ZEdWNGRDQTlJRzVsZHlCRGIyNTBaWGgwS0hSeWVVeHZZM05NYVhOMElIeDhJRnRkS1R0Y2JseHVJQ0FnSUM4dklGUm9aU0F1WDJsdWRtOXJaU0J0WlhSb2IyUWdkVzVwWm1sbGN5QjBhR1VnYVcxd2JHVnRaVzUwWVhScGIyNXpJRzltSUhSb1pTQXVibVY0ZEN4Y2JpQWdJQ0F2THlBdWRHaHliM2NzSUdGdVpDQXVjbVYwZFhKdUlHMWxkR2h2WkhNdVhHNGdJQ0FnWjJWdVpYSmhkRzl5TGw5cGJuWnZhMlVnUFNCdFlXdGxTVzUyYjJ0bFRXVjBhRzlrS0dsdWJtVnlSbTRzSUhObGJHWXNJR052Ym5SbGVIUXBPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHZGxibVZ5WVhSdmNqdGNiaUFnZlZ4dUlDQnlkVzUwYVcxbExuZHlZWEFnUFNCM2NtRndPMXh1WEc0Z0lDOHZJRlJ5ZVM5allYUmphQ0JvWld4d1pYSWdkRzhnYldsdWFXMXBlbVVnWkdWdmNIUnBiV2w2WVhScGIyNXpMaUJTWlhSMWNtNXpJR0VnWTI5dGNHeGxkR2x2Ymx4dUlDQXZMeUJ5WldOdmNtUWdiR2xyWlNCamIyNTBaWGgwTG5SeWVVVnVkSEpwWlhOYmFWMHVZMjl0Y0d4bGRHbHZiaTRnVkdocGN5QnBiblJsY21aaFkyVWdZMjkxYkdSY2JpQWdMeThnYUdGMlpTQmlaV1Z1SUNoaGJtUWdkMkZ6SUhCeVpYWnBiM1Z6YkhrcElHUmxjMmxuYm1Wa0lIUnZJSFJoYTJVZ1lTQmpiRzl6ZFhKbElIUnZJR0psWEc0Z0lDOHZJR2x1ZG05clpXUWdkMmwwYUc5MWRDQmhjbWQxYldWdWRITXNJR0oxZENCcGJpQmhiR3dnZEdobElHTmhjMlZ6SUhkbElHTmhjbVVnWVdKdmRYUWdkMlZjYmlBZ0x5OGdZV3h5WldGa2VTQm9ZWFpsSUdGdUlHVjRhWE4wYVc1bklHMWxkR2h2WkNCM1pTQjNZVzUwSUhSdklHTmhiR3dzSUhOdklIUm9aWEpsSjNNZ2JtOGdibVZsWkZ4dUlDQXZMeUIwYnlCamNtVmhkR1VnWVNCdVpYY2dablZ1WTNScGIyNGdiMkpxWldOMExpQlhaU0JqWVc0Z1pYWmxiaUJuWlhRZ1lYZGhlU0IzYVhSb0lHRnpjM1Z0YVc1blhHNGdJQzh2SUhSb1pTQnRaWFJvYjJRZ2RHRnJaWE1nWlhoaFkzUnNlU0J2Ym1VZ1lYSm5kVzFsYm5Rc0lITnBibU5sSUhSb1lYUWdhR0Z3Y0dWdWN5QjBieUJpWlNCMGNuVmxYRzRnSUM4dklHbHVJR1YyWlhKNUlHTmhjMlVzSUhOdklIZGxJR1J2YmlkMElHaGhkbVVnZEc4Z2RHOTFZMmdnZEdobElHRnlaM1Z0Wlc1MGN5QnZZbXBsWTNRdUlGUm9aVnh1SUNBdkx5QnZibXg1SUdGa1pHbDBhVzl1WVd3Z1lXeHNiMk5oZEdsdmJpQnlaWEYxYVhKbFpDQnBjeUIwYUdVZ1kyOXRjR3hsZEdsdmJpQnlaV052Y21Rc0lIZG9hV05vWEc0Z0lDOHZJR2hoY3lCaElITjBZV0pzWlNCemFHRndaU0JoYm1RZ2MyOGdhRzl3WldaMWJHeDVJSE5vYjNWc1pDQmlaU0JqYUdWaGNDQjBieUJoYkd4dlkyRjBaUzVjYmlBZ1puVnVZM1JwYjI0Z2RISjVRMkYwWTJnb1ptNHNJRzlpYWl3Z1lYSm5LU0I3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUI3SUhSNWNHVTZJRndpYm05eWJXRnNYQ0lzSUdGeVp6b2dabTR1WTJGc2JDaHZZbW9zSUdGeVp5a2dmVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxjbklwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUI3SUhSNWNHVTZJRndpZEdoeWIzZGNJaXdnWVhKbk9pQmxjbklnZlR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCMllYSWdSMlZ1VTNSaGRHVlRkWE53Wlc1a1pXUlRkR0Z5ZENBOUlGd2ljM1Z6Y0dWdVpHVmtVM1JoY25SY0lqdGNiaUFnZG1GeUlFZGxibE4wWVhSbFUzVnpjR1Z1WkdWa1dXbGxiR1FnUFNCY0luTjFjM0JsYm1SbFpGbHBaV3hrWENJN1hHNGdJSFpoY2lCSFpXNVRkR0YwWlVWNFpXTjFkR2x1WnlBOUlGd2laWGhsWTNWMGFXNW5YQ0k3WEc0Z0lIWmhjaUJIWlc1VGRHRjBaVU52YlhCc1pYUmxaQ0E5SUZ3aVkyOXRjR3hsZEdWa1hDSTdYRzVjYmlBZ0x5OGdVbVYwZFhKdWFXNW5JSFJvYVhNZ2IySnFaV04wSUdaeWIyMGdkR2hsSUdsdWJtVnlSbTRnYUdGeklIUm9aU0J6WVcxbElHVm1abVZqZENCaGMxeHVJQ0F2THlCaWNtVmhhMmx1WnlCdmRYUWdiMllnZEdobElHUnBjM0JoZEdOb0lITjNhWFJqYUNCemRHRjBaVzFsYm5RdVhHNGdJSFpoY2lCRGIyNTBhVzUxWlZObGJuUnBibVZzSUQwZ2UzMDdYRzVjYmlBZ0x5OGdSSFZ0YlhrZ1kyOXVjM1J5ZFdOMGIzSWdablZ1WTNScGIyNXpJSFJvWVhRZ2QyVWdkWE5sSUdGeklIUm9aU0F1WTI5dWMzUnlkV04wYjNJZ1lXNWtYRzRnSUM4dklDNWpiMjV6ZEhKMVkzUnZjaTV3Y205MGIzUjVjR1VnY0hKdmNHVnlkR2xsY3lCbWIzSWdablZ1WTNScGIyNXpJSFJvWVhRZ2NtVjBkWEp1SUVkbGJtVnlZWFJ2Y2x4dUlDQXZMeUJ2WW1wbFkzUnpMaUJHYjNJZ1puVnNiQ0J6Y0dWaklHTnZiWEJzYVdGdVkyVXNJSGx2ZFNCdFlYa2dkMmx6YUNCMGJ5QmpiMjVtYVdkMWNtVWdlVzkxY2x4dUlDQXZMeUJ0YVc1cFptbGxjaUJ1YjNRZ2RHOGdiV0Z1WjJ4bElIUm9aU0J1WVcxbGN5QnZaaUIwYUdWelpTQjBkMjhnWm5WdVkzUnBiMjV6TGx4dUlDQm1kVzVqZEdsdmJpQkhaVzVsY21GMGIzSW9LU0I3ZlZ4dUlDQm1kVzVqZEdsdmJpQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJpZ3BJSHQ5WEc0Z0lHWjFibU4wYVc5dUlFZGxibVZ5WVhSdmNrWjFibU4wYVc5dVVISnZkRzkwZVhCbEtDa2dlMzFjYmx4dUlDQjJZWElnUjNBZ1BTQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJsQnliM1J2ZEhsd1pTNXdjbTkwYjNSNWNHVWdQU0JIWlc1bGNtRjBiM0l1Y0hKdmRHOTBlWEJsTzF4dUlDQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJpNXdjbTkwYjNSNWNHVWdQU0JIY0M1amIyNXpkSEoxWTNSdmNpQTlJRWRsYm1WeVlYUnZja1oxYm1OMGFXOXVVSEp2ZEc5MGVYQmxPMXh1SUNCSFpXNWxjbUYwYjNKR2RXNWpkR2x2YmxCeWIzUnZkSGx3WlM1amIyNXpkSEoxWTNSdmNpQTlJRWRsYm1WeVlYUnZja1oxYm1OMGFXOXVPMXh1SUNCSFpXNWxjbUYwYjNKR2RXNWpkR2x2Ymk1a2FYTndiR0Y1VG1GdFpTQTlJRndpUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjVjSWp0Y2JseHVJQ0F2THlCSVpXeHdaWElnWm05eUlHUmxabWx1YVc1bklIUm9aU0F1Ym1WNGRDd2dMblJvY205M0xDQmhibVFnTG5KbGRIVnliaUJ0WlhSb2IyUnpJRzltSUhSb1pWeHVJQ0F2THlCSmRHVnlZWFJ2Y2lCcGJuUmxjbVpoWTJVZ2FXNGdkR1Z5YlhNZ2IyWWdZU0J6YVc1bmJHVWdMbDlwYm5admEyVWdiV1YwYUc5a0xseHVJQ0JtZFc1amRHbHZiaUJrWldacGJtVkpkR1Z5WVhSdmNrMWxkR2h2WkhNb2NISnZkRzkwZVhCbEtTQjdYRzRnSUNBZ1cxd2libVY0ZEZ3aUxDQmNJblJvY205M1hDSXNJRndpY21WMGRYSnVYQ0pkTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvYldWMGFHOWtLU0I3WEc0Z0lDQWdJQ0J3Y205MGIzUjVjR1ZiYldWMGFHOWtYU0E5SUdaMWJtTjBhVzl1S0dGeVp5a2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmFXNTJiMnRsS0cxbGRHaHZaQ3dnWVhKbktUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZTazdYRzRnSUgxY2JseHVJQ0J5ZFc1MGFXMWxMbWx6UjJWdVpYSmhkRzl5Um5WdVkzUnBiMjRnUFNCbWRXNWpkR2x2YmloblpXNUdkVzRwSUh0Y2JpQWdJQ0IyWVhJZ1kzUnZjaUE5SUhSNWNHVnZaaUJuWlc1R2RXNGdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQW1KaUJuWlc1R2RXNHVZMjl1YzNSeWRXTjBiM0k3WEc0Z0lDQWdjbVYwZFhKdUlHTjBiM0pjYmlBZ0lDQWdJRDhnWTNSdmNpQTlQVDBnUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjRnZkh4Y2JpQWdJQ0FnSUNBZ0x5OGdSbTl5SUhSb1pTQnVZWFJwZG1VZ1IyVnVaWEpoZEc5eVJuVnVZM1JwYjI0Z1kyOXVjM1J5ZFdOMGIzSXNJSFJvWlNCaVpYTjBJSGRsSUdOaGJseHVJQ0FnSUNBZ0lDQXZMeUJrYnlCcGN5QjBieUJqYUdWamF5QnBkSE1nTG01aGJXVWdjSEp2Y0dWeWRIa3VYRzRnSUNBZ0lDQWdJQ2hqZEc5eUxtUnBjM0JzWVhsT1lXMWxJSHg4SUdOMGIzSXVibUZ0WlNrZ1BUMDlJRndpUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjVjSWx4dUlDQWdJQ0FnT2lCbVlXeHpaVHRjYmlBZ2ZUdGNibHh1SUNCeWRXNTBhVzFsTG0xaGNtc2dQU0JtZFc1amRHbHZiaWhuWlc1R2RXNHBJSHRjYmlBZ0lDQnBaaUFvVDJKcVpXTjBMbk5sZEZCeWIzUnZkSGx3WlU5bUtTQjdYRzRnSUNBZ0lDQlBZbXBsWTNRdWMyVjBVSEp2ZEc5MGVYQmxUMllvWjJWdVJuVnVMQ0JIWlc1bGNtRjBiM0pHZFc1amRHbHZibEJ5YjNSdmRIbHdaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHZGxia1oxYmk1ZlgzQnliM1J2WDE4Z1BTQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJsQnliM1J2ZEhsd1pUdGNiaUFnSUNCOVhHNGdJQ0FnWjJWdVJuVnVMbkJ5YjNSdmRIbHdaU0E5SUU5aWFtVmpkQzVqY21WaGRHVW9SM0FwTzF4dUlDQWdJSEpsZEhWeWJpQm5aVzVHZFc0N1hHNGdJSDA3WEc1Y2JpQWdMeThnVjJsMGFHbHVJSFJvWlNCaWIyUjVJRzltSUdGdWVTQmhjM2x1WXlCbWRXNWpkR2x2Yml3Z1lHRjNZV2wwSUhoZ0lHbHpJSFJ5WVc1elptOXliV1ZrSUhSdlhHNGdJQzh2SUdCNWFXVnNaQ0J5WldkbGJtVnlZWFJ2Y2xKMWJuUnBiV1V1WVhkeVlYQW9lQ2xnTENCemJ5QjBhR0YwSUhSb1pTQnlkVzUwYVcxbElHTmhiaUIwWlhOMFhHNGdJQzh2SUdCMllXeDFaU0JwYm5OMFlXNWpaVzltSUVGM1lXbDBRWEpuZFcxbGJuUmdJSFJ2SUdSbGRHVnliV2x1WlNCcFppQjBhR1VnZVdsbGJHUmxaQ0IyWVd4MVpTQnBjMXh1SUNBdkx5QnRaV0Z1ZENCMGJ5QmlaU0JoZDJGcGRHVmtMaUJUYjIxbElHMWhlU0JqYjI1emFXUmxjaUIwYUdVZ2JtRnRaU0J2WmlCMGFHbHpJRzFsZEdodlpDQjBiMjljYmlBZ0x5OGdZM1YwWlhONUxDQmlkWFFnZEdobGVTQmhjbVVnWTNWeWJYVmtaMlZ2Ym5NdVhHNGdJSEoxYm5ScGJXVXVZWGR5WVhBZ1BTQm1kVzVqZEdsdmJpaGhjbWNwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzSUVGM1lXbDBRWEpuZFcxbGJuUW9ZWEpuS1R0Y2JpQWdmVHRjYmx4dUlDQm1kVzVqZEdsdmJpQkJkMkZwZEVGeVozVnRaVzUwS0dGeVp5a2dlMXh1SUNBZ0lIUm9hWE11WVhKbklEMGdZWEpuTzF4dUlDQjlYRzVjYmlBZ1puVnVZM1JwYjI0Z1FYTjVibU5KZEdWeVlYUnZjaWhuWlc1bGNtRjBiM0lwSUh0Y2JpQWdJQ0F2THlCVWFHbHpJR2x1ZG05clpTQm1kVzVqZEdsdmJpQnBjeUIzY21sMGRHVnVJR2x1SUdFZ2MzUjViR1VnZEdoaGRDQmhjM04xYldWeklITnZiV1ZjYmlBZ0lDQXZMeUJqWVd4c2FXNW5JR1oxYm1OMGFXOXVJQ2h2Y2lCUWNtOXRhWE5sS1NCM2FXeHNJR2hoYm1Sc1pTQmxlR05sY0hScGIyNXpMbHh1SUNBZ0lHWjFibU4wYVc5dUlHbHVkbTlyWlNodFpYUm9iMlFzSUdGeVp5a2dlMXh1SUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUdkbGJtVnlZWFJ2Y2x0dFpYUm9iMlJkS0dGeVp5azdYRzRnSUNBZ0lDQjJZWElnZG1Gc2RXVWdQU0J5WlhOMWJIUXVkbUZzZFdVN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZG1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJCZDJGcGRFRnlaM1Z0Wlc1MFhHNGdJQ0FnSUNBZ0lEOGdVSEp2YldselpTNXlaWE52YkhabEtIWmhiSFZsTG1GeVp5a3VkR2hsYmlocGJuWnZhMlZPWlhoMExDQnBiblp2YTJWVWFISnZkeWxjYmlBZ0lDQWdJQ0FnT2lCUWNtOXRhWE5sTG5KbGMyOXNkbVVvZG1Gc2RXVXBMblJvWlc0b1puVnVZM1JwYjI0b2RXNTNjbUZ3Y0dWa0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QlhhR1Z1SUdFZ2VXbGxiR1JsWkNCUWNtOXRhWE5sSUdseklISmxjMjlzZG1Wa0xDQnBkSE1nWm1sdVlXd2dkbUZzZFdVZ1ltVmpiMjFsYzF4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnZEdobElDNTJZV3gxWlNCdlppQjBhR1VnVUhKdmJXbHpaVHg3ZG1Gc2RXVXNaRzl1WlgwK0lISmxjM1ZzZENCbWIzSWdkR2hsWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJqZFhKeVpXNTBJR2wwWlhKaGRHbHZiaTRnU1dZZ2RHaGxJRkJ5YjIxcGMyVWdhWE1nY21WcVpXTjBaV1FzSUdodmQyVjJaWElzSUhSb1pWeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NtVnpkV3gwSUdadmNpQjBhR2x6SUdsMFpYSmhkR2x2YmlCM2FXeHNJR0psSUhKbGFtVmpkR1ZrSUhkcGRHZ2dkR2hsSUhOaGJXVmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklISmxZWE52Ymk0Z1RtOTBaU0IwYUdGMElISmxhbVZqZEdsdmJuTWdiMllnZVdsbGJHUmxaQ0JRY205dGFYTmxjeUJoY21VZ2JtOTBYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QjBhSEp2ZDI0Z1ltRmpheUJwYm5SdklIUm9aU0JuWlc1bGNtRjBiM0lnWm5WdVkzUnBiMjRzSUdGeklHbHpJSFJvWlNCallYTmxYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QjNhR1Z1SUdGdUlHRjNZV2wwWldRZ1VISnZiV2x6WlNCcGN5QnlaV3BsWTNSbFpDNGdWR2hwY3lCa2FXWm1aWEpsYm1ObElHbHVYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmlaV2hoZG1sdmNpQmlaWFIzWldWdUlIbHBaV3hrSUdGdVpDQmhkMkZwZENCcGN5QnBiWEJ2Y25SaGJuUXNJR0psWTJGMWMyVWdhWFJjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR0ZzYkc5M2N5QjBhR1VnWTI5dWMzVnRaWElnZEc4Z1pHVmphV1JsSUhkb1lYUWdkRzhnWkc4Z2QybDBhQ0IwYUdVZ2VXbGxiR1JsWkZ4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnY21WcVpXTjBhVzl1SUNoemQyRnNiRzkzSUdsMElHRnVaQ0JqYjI1MGFXNTFaU3dnYldGdWRXRnNiSGtnTG5Sb2NtOTNJR2wwSUdKaFkydGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHbHVkRzhnZEdobElHZGxibVZ5WVhSdmNpd2dZV0poYm1SdmJpQnBkR1Z5WVhScGIyNHNJSGRvWVhSbGRtVnlLUzRnVjJsMGFGeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1lYZGhhWFFzSUdKNUlHTnZiblJ5WVhOMExDQjBhR1Z5WlNCcGN5QnVieUJ2Y0hCdmNuUjFibWwwZVNCMGJ5QmxlR0Z0YVc1bElIUm9aVnh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjbVZxWldOMGFXOXVJSEpsWVhOdmJpQnZkWFJ6YVdSbElIUm9aU0JuWlc1bGNtRjBiM0lnWm5WdVkzUnBiMjRzSUhOdklIUm9aVnh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdiMjVzZVNCdmNIUnBiMjRnYVhNZ2RHOGdkR2h5YjNjZ2FYUWdabkp2YlNCMGFHVWdZWGRoYVhRZ1pYaHdjbVZ6YzJsdmJpd2dZVzVrWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJzWlhRZ2RHaGxJR2RsYm1WeVlYUnZjaUJtZFc1amRHbHZiaUJvWVc1a2JHVWdkR2hsSUdWNFkyVndkR2x2Ymk1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNTJZV3gxWlNBOUlIVnVkM0poY0hCbFpEdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCd2NtOWpaWE56SUQwOVBTQmNJbTlpYW1WamRGd2lJQ1ltSUhCeWIyTmxjM011Wkc5dFlXbHVLU0I3WEc0Z0lDQWdJQ0JwYm5admEyVWdQU0J3Y205alpYTnpMbVJ2YldGcGJpNWlhVzVrS0dsdWRtOXJaU2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkbUZ5SUdsdWRtOXJaVTVsZUhRZ1BTQnBiblp2YTJVdVltbHVaQ2huWlc1bGNtRjBiM0lzSUZ3aWJtVjRkRndpS1R0Y2JpQWdJQ0IyWVhJZ2FXNTJiMnRsVkdoeWIzY2dQU0JwYm5admEyVXVZbWx1WkNoblpXNWxjbUYwYjNJc0lGd2lkR2h5YjNkY0lpazdYRzRnSUNBZ2RtRnlJR2x1ZG05clpWSmxkSFZ5YmlBOUlHbHVkbTlyWlM1aWFXNWtLR2RsYm1WeVlYUnZjaXdnWENKeVpYUjFjbTVjSWlrN1hHNGdJQ0FnZG1GeUlIQnlaWFpwYjNWelVISnZiV2x6WlR0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUdWdWNYVmxkV1VvYldWMGFHOWtMQ0JoY21jcElIdGNiaUFnSUNBZ0lHWjFibU4wYVc5dUlHTmhiR3hKYm5admEyVlhhWFJvVFdWMGFHOWtRVzVrUVhKbktDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdhVzUyYjJ0bEtHMWxkR2h2WkN3Z1lYSm5LVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSEJ5WlhacGIzVnpVSEp2YldselpTQTlYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHVnVjWFZsZFdVZ2FHRnpJR0psWlc0Z1kyRnNiR1ZrSUdKbFptOXlaU3dnZEdobGJpQjNaU0IzWVc1MElIUnZJSGRoYVhRZ2RXNTBhV3hjYmlBZ0lDQWdJQ0FnTHk4Z1lXeHNJSEJ5WlhacGIzVnpJRkJ5YjIxcGMyVnpJR2hoZG1VZ1ltVmxiaUJ5WlhOdmJIWmxaQ0JpWldadmNtVWdZMkZzYkdsdVp5QnBiblp2YTJVc1hHNGdJQ0FnSUNBZ0lDOHZJSE52SUhSb1lYUWdjbVZ6ZFd4MGN5QmhjbVVnWVd4M1lYbHpJR1JsYkdsMlpYSmxaQ0JwYmlCMGFHVWdZMjl5Y21WamRDQnZjbVJsY2k0Z1NXWmNiaUFnSUNBZ0lDQWdMeThnWlc1eGRXVjFaU0JvWVhNZ2JtOTBJR0psWlc0Z1kyRnNiR1ZrSUdKbFptOXlaU3dnZEdobGJpQnBkQ0JwY3lCcGJYQnZjblJoYm5RZ2RHOWNiaUFnSUNBZ0lDQWdMeThnWTJGc2JDQnBiblp2YTJVZ2FXMXRaV1JwWVhSbGJIa3NJSGRwZEdodmRYUWdkMkZwZEdsdVp5QnZiaUJoSUdOaGJHeGlZV05ySUhSdklHWnBjbVVzWEc0Z0lDQWdJQ0FnSUM4dklITnZJSFJvWVhRZ2RHaGxJR0Z6ZVc1aklHZGxibVZ5WVhSdmNpQm1kVzVqZEdsdmJpQm9ZWE1nZEdobElHOXdjRzl5ZEhWdWFYUjVJSFJ2SUdSdlhHNGdJQ0FnSUNBZ0lDOHZJR0Z1ZVNCdVpXTmxjM05oY25rZ2MyVjBkWEFnYVc0Z1lTQndjbVZrYVdOMFlXSnNaU0IzWVhrdUlGUm9hWE1nY0hKbFpHbGpkR0ZpYVd4cGRIbGNiaUFnSUNBZ0lDQWdMeThnYVhNZ2QyaDVJSFJvWlNCUWNtOXRhWE5sSUdOdmJuTjBjblZqZEc5eUlITjVibU5vY205dWIzVnpiSGtnYVc1MmIydGxjeUJwZEhOY2JpQWdJQ0FnSUNBZ0x5OGdaWGhsWTNWMGIzSWdZMkZzYkdKaFkyc3NJR0Z1WkNCM2FIa2dZWE41Ym1NZ1puVnVZM1JwYjI1eklITjVibU5vY205dWIzVnpiSGxjYmlBZ0lDQWdJQ0FnTHk4Z1pYaGxZM1YwWlNCamIyUmxJR0psWm05eVpTQjBhR1VnWm1seWMzUWdZWGRoYVhRdUlGTnBibU5sSUhkbElHbHRjR3hsYldWdWRDQnphVzF3YkdWY2JpQWdJQ0FnSUNBZ0x5OGdZWE41Ym1NZ1puVnVZM1JwYjI1eklHbHVJSFJsY20xeklHOW1JR0Z6ZVc1aklHZGxibVZ5WVhSdmNuTXNJR2wwSUdseklHVnpjR1ZqYVdGc2JIbGNiaUFnSUNBZ0lDQWdMeThnYVcxd2IzSjBZVzUwSUhSdklHZGxkQ0IwYUdseklISnBaMmgwTENCbGRtVnVJSFJvYjNWbmFDQnBkQ0J5WlhGMWFYSmxjeUJqWVhKbExseHVJQ0FnSUNBZ0lDQndjbVYyYVc5MWMxQnliMjFwYzJVZ1B5QndjbVYyYVc5MWMxQnliMjFwYzJVdWRHaGxiaWhjYmlBZ0lDQWdJQ0FnSUNCallXeHNTVzUyYjJ0bFYybDBhRTFsZEdodlpFRnVaRUZ5Wnl4Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJCZG05cFpDQndjbTl3WVdkaGRHbHVaeUJtWVdsc2RYSmxjeUIwYnlCUWNtOXRhWE5sY3lCeVpYUjFjbTVsWkNCaWVTQnNZWFJsY2x4dUlDQWdJQ0FnSUNBZ0lDOHZJR2x1ZG05allYUnBiMjV6SUc5bUlIUm9aU0JwZEdWeVlYUnZjaTVjYmlBZ0lDQWdJQ0FnSUNCallXeHNTVzUyYjJ0bFYybDBhRTFsZEdodlpFRnVaRUZ5WjF4dUlDQWdJQ0FnSUNBcElEb2dibVYzSUZCeWIyMXBjMlVvWm5WdVkzUnBiMjRnS0hKbGMyOXNkbVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWE52YkhabEtHTmhiR3hKYm5admEyVlhhWFJvVFdWMGFHOWtRVzVrUVhKbktDa3BPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCRVpXWnBibVVnZEdobElIVnVhV1pwWldRZ2FHVnNjR1Z5SUcxbGRHaHZaQ0IwYUdGMElHbHpJSFZ6WldRZ2RHOGdhVzF3YkdWdFpXNTBJQzV1WlhoMExGeHVJQ0FnSUM4dklDNTBhSEp2ZHl3Z1lXNWtJQzV5WlhSMWNtNGdLSE5sWlNCa1pXWnBibVZKZEdWeVlYUnZjazFsZEdodlpITXBMbHh1SUNBZ0lIUm9hWE11WDJsdWRtOXJaU0E5SUdWdWNYVmxkV1U3WEc0Z0lIMWNibHh1SUNCa1pXWnBibVZKZEdWeVlYUnZjazFsZEdodlpITW9RWE41Ym1OSmRHVnlZWFJ2Y2k1d2NtOTBiM1I1Y0dVcE8xeHVYRzRnSUM4dklFNXZkR1VnZEdoaGRDQnphVzF3YkdVZ1lYTjVibU1nWm5WdVkzUnBiMjV6SUdGeVpTQnBiWEJzWlcxbGJuUmxaQ0J2YmlCMGIzQWdiMlpjYmlBZ0x5OGdRWE41Ym1OSmRHVnlZWFJ2Y2lCdlltcGxZM1J6T3lCMGFHVjVJR3AxYzNRZ2NtVjBkWEp1SUdFZ1VISnZiV2x6WlNCbWIzSWdkR2hsSUhaaGJIVmxJRzltWEc0Z0lDOHZJSFJvWlNCbWFXNWhiQ0J5WlhOMWJIUWdjSEp2WkhWalpXUWdZbmtnZEdobElHbDBaWEpoZEc5eUxseHVJQ0J5ZFc1MGFXMWxMbUZ6ZVc1aklEMGdablZ1WTNScGIyNG9hVzV1WlhKR2Jpd2diM1YwWlhKR2Jpd2djMlZzWml3Z2RISjVURzlqYzB4cGMzUXBJSHRjYmlBZ0lDQjJZWElnYVhSbGNpQTlJRzVsZHlCQmMzbHVZMGwwWlhKaGRHOXlLRnh1SUNBZ0lDQWdkM0poY0NocGJtNWxja1p1TENCdmRYUmxja1p1TENCelpXeG1MQ0IwY25sTWIyTnpUR2x6ZENsY2JpQWdJQ0FwTzF4dVhHNGdJQ0FnY21WMGRYSnVJSEoxYm5ScGJXVXVhWE5IWlc1bGNtRjBiM0pHZFc1amRHbHZiaWh2ZFhSbGNrWnVLVnh1SUNBZ0lDQWdQeUJwZEdWeUlDOHZJRWxtSUc5MWRHVnlSbTRnYVhNZ1lTQm5aVzVsY21GMGIzSXNJSEpsZEhWeWJpQjBhR1VnWm5Wc2JDQnBkR1Z5WVhSdmNpNWNiaUFnSUNBZ0lEb2dhWFJsY2k1dVpYaDBLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpaHlaWE4xYkhRcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4MExtUnZibVVnUHlCeVpYTjFiSFF1ZG1Gc2RXVWdPaUJwZEdWeUxtNWxlSFFvS1R0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUgwN1hHNWNiaUFnWm5WdVkzUnBiMjRnYldGclpVbHVkbTlyWlUxbGRHaHZaQ2hwYm01bGNrWnVMQ0J6Wld4bUxDQmpiMjUwWlhoMEtTQjdYRzRnSUNBZ2RtRnlJSE4wWVhSbElEMGdSMlZ1VTNSaGRHVlRkWE53Wlc1a1pXUlRkR0Z5ZER0Y2JseHVJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaUJwYm5admEyVW9iV1YwYUc5a0xDQmhjbWNwSUh0Y2JpQWdJQ0FnSUdsbUlDaHpkR0YwWlNBOVBUMGdSMlZ1VTNSaGRHVkZlR1ZqZFhScGJtY3BJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpUjJWdVpYSmhkRzl5SUdseklHRnNjbVZoWkhrZ2NuVnVibWx1WjF3aUtUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hOMFlYUmxJRDA5UFNCSFpXNVRkR0YwWlVOdmJYQnNaWFJsWkNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvYldWMGFHOWtJRDA5UFNCY0luUm9jbTkzWENJcElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUhKdmR5QmhjbWM3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQXZMeUJDWlNCbWIzSm5hWFpwYm1jc0lIQmxjaUF5TlM0ekxqTXVNeTR6SUc5bUlIUm9aU0J6Y0dWak9seHVJQ0FnSUNBZ0lDQXZMeUJvZEhSd2N6b3ZMM0JsYjNCc1pTNXRiM3BwYkd4aExtOXlaeTkrYW05eVpXNWtiM0ptWmk5bGN6WXRaSEpoWm5RdWFIUnRiQ056WldNdFoyVnVaWEpoZEc5eWNtVnpkVzFsWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJrYjI1bFVtVnpkV3gwS0NrN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIZG9hV3hsSUNoMGNuVmxLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmtaV3hsWjJGMFpTQTlJR052Ym5SbGVIUXVaR1ZzWldkaGRHVTdYRzRnSUNBZ0lDQWdJR2xtSUNoa1pXeGxaMkYwWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNodFpYUm9iMlFnUFQwOUlGd2ljbVYwZFhKdVhDSWdmSHhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdLRzFsZEdodlpDQTlQVDBnWENKMGFISnZkMXdpSUNZbUlHUmxiR1ZuWVhSbExtbDBaWEpoZEc5eVcyMWxkR2h2WkYwZ1BUMDlJSFZ1WkdWbWFXNWxaQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVFZ2NtVjBkWEp1SUc5eUlIUm9jbTkzSUNoM2FHVnVJSFJvWlNCa1pXeGxaMkYwWlNCcGRHVnlZWFJ2Y2lCb1lYTWdibThnZEdoeWIzZGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHMWxkR2h2WkNrZ1lXeDNZWGx6SUhSbGNtMXBibUYwWlhNZ2RHaGxJSGxwWld4a0tpQnNiMjl3TGx4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNWtaV3hsWjJGMFpTQTlJRzUxYkd3N1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFbG1JSFJvWlNCa1pXeGxaMkYwWlNCcGRHVnlZWFJ2Y2lCb1lYTWdZU0J5WlhSMWNtNGdiV1YwYUc5a0xDQm5hWFpsSUdsMElHRmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHTm9ZVzVqWlNCMGJ5QmpiR1ZoYmlCMWNDNWNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWFIxY201TlpYUm9iMlFnUFNCa1pXeGxaMkYwWlM1cGRHVnlZWFJ2Y2x0Y0luSmxkSFZ5Ymx3aVhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHlaWFIxY201TlpYUm9iMlFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxZMjl5WkNBOUlIUnllVU5oZEdOb0tISmxkSFZ5YmsxbGRHaHZaQ3dnWkdWc1pXZGhkR1V1YVhSbGNtRjBiM0lzSUdGeVp5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h5WldOdmNtUXVkSGx3WlNBOVBUMGdYQ0owYUhKdmQxd2lLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1NXWWdkR2hsSUhKbGRIVnliaUJ0WlhSb2IyUWdkR2h5WlhjZ1lXNGdaWGhqWlhCMGFXOXVMQ0JzWlhRZ2RHaGhkRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWNFkyVndkR2x2YmlCd2NtVjJZV2xzSUc5MlpYSWdkR2hsSUc5eWFXZHBibUZzSUhKbGRIVnliaUJ2Y2lCMGFISnZkeTVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WlhSb2IyUWdQU0JjSW5Sb2NtOTNYQ0k3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVhKbklEMGdjbVZqYjNKa0xtRnlaenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iV1YwYUc5a0lEMDlQU0JjSW5KbGRIVnlibHdpS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklFTnZiblJwYm5WbElIZHBkR2dnZEdobElHOTFkR1Z5SUhKbGRIVnliaXdnYm05M0lIUm9ZWFFnZEdobElHUmxiR1ZuWVhSbFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHbDBaWEpoZEc5eUlHaGhjeUJpWldWdUlIUmxjbTFwYm1GMFpXUXVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiblJwYm5WbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnlaV052Y21RZ1BTQjBjbmxEWVhSamFDaGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbGJHVm5ZWFJsTG1sMFpYSmhkRzl5VzIxbGRHaHZaRjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV3hsWjJGMFpTNXBkR1Z5WVhSdmNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUdGeVoxeHVJQ0FnSUNBZ0lDQWdJQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNWtaV3hsWjJGMFpTQTlJRzUxYkd3N1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFeHBhMlVnY21WMGRYSnVhVzVuSUdkbGJtVnlZWFJ2Y2k1MGFISnZkeWgxYm1OaGRXZG9kQ2tzSUdKMWRDQjNhWFJvYjNWMElIUm9aVnh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdiM1psY21obFlXUWdiMllnWVc0Z1pYaDBjbUVnWm5WdVkzUnBiMjRnWTJGc2JDNWNiaUFnSUNBZ0lDQWdJQ0FnSUcxbGRHaHZaQ0E5SUZ3aWRHaHliM2RjSWp0Y2JpQWdJQ0FnSUNBZ0lDQWdJR0Z5WnlBOUlISmxZMjl5WkM1aGNtYzdYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBdkx5QkVaV3hsWjJGMFpTQm5aVzVsY21GMGIzSWdjbUZ1SUdGdVpDQm9ZVzVrYkdWa0lHbDBjeUJ2ZDI0Z1pYaGpaWEIwYVc5dWN5QnpiMXh1SUNBZ0lDQWdJQ0FnSUM4dklISmxaMkZ5Wkd4bGMzTWdiMllnZDJoaGRDQjBhR1VnYldWMGFHOWtJSGRoY3l3Z2QyVWdZMjl1ZEdsdWRXVWdZWE1nYVdZZ2FYUWdhWE5jYmlBZ0lDQWdJQ0FnSUNBdkx5QmNJbTVsZUhSY0lpQjNhWFJvSUdGdUlIVnVaR1ZtYVc1bFpDQmhjbWN1WEc0Z0lDQWdJQ0FnSUNBZ2JXVjBhRzlrSUQwZ1hDSnVaWGgwWENJN1hHNGdJQ0FnSUNBZ0lDQWdZWEpuSUQwZ2RXNWtaV1pwYm1Wa08xeHVYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlHbHVabThnUFNCeVpXTnZjbVF1WVhKbk8xeHVJQ0FnSUNBZ0lDQWdJR2xtSUNocGJtWnZMbVJ2Ym1VcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFJiWkdWc1pXZGhkR1V1Y21WemRXeDBUbUZ0WlYwZ1BTQnBibVp2TG5aaGJIVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEM1dVpYaDBJRDBnWkdWc1pXZGhkR1V1Ym1WNGRFeHZZenRjYmlBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjM1JoZEdVZ1BTQkhaVzVUZEdGMFpWTjFjM0JsYm1SbFpGbHBaV3hrTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHbHVabTg3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHVjRkQzVrWld4bFoyRjBaU0E5SUc1MWJHdzdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9iV1YwYUc5a0lEMDlQU0JjSW01bGVIUmNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRdVgzTmxiblFnUFNCaGNtYzdYRzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jM1JoZEdVZ1BUMDlJRWRsYmxOMFlYUmxVM1Z6Y0dWdVpHVmtXV2xsYkdRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1YzJWdWRDQTlJR0Z5Wnp0Y2JpQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWTI5dWRHVjRkQzV6Wlc1MElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHRaWFJvYjJRZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2h6ZEdGMFpTQTlQVDBnUjJWdVUzUmhkR1ZUZFhOd1pXNWtaV1JUZEdGeWRDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MzUmhkR1VnUFNCSFpXNVRkR0YwWlVOdmJYQnNaWFJsWkR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHRnlaenRjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1kyOXVkR1Y0ZEM1a2FYTndZWFJqYUVWNFkyVndkR2x2YmloaGNtY3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJKWmlCMGFHVWdaR2x6Y0dGMFkyaGxaQ0JsZUdObGNIUnBiMjRnZDJGeklHTmhkV2RvZENCaWVTQmhJR05oZEdOb0lHSnNiMk5yTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnZEdobGJpQnNaWFFnZEdoaGRDQmpZWFJqYUNCaWJHOWpheUJvWVc1a2JHVWdkR2hsSUdWNFkyVndkR2x2YmlCdWIzSnRZV3hzZVM1Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFsZEdodlpDQTlJRndpYm1WNGRGd2lPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1lYSm5JRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0cxbGRHaHZaQ0E5UFQwZ1hDSnlaWFIxY201Y0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1WVdKeWRYQjBLRndpY21WMGRYSnVYQ0lzSUdGeVp5azdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCemRHRjBaU0E5SUVkbGJsTjBZWFJsUlhobFkzVjBhVzVuTzF4dVhHNGdJQ0FnSUNBZ0lIWmhjaUJ5WldOdmNtUWdQU0IwY25sRFlYUmphQ2hwYm01bGNrWnVMQ0J6Wld4bUxDQmpiMjUwWlhoMEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0hKbFkyOXlaQzUwZVhCbElEMDlQU0JjSW01dmNtMWhiRndpS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnU1dZZ1lXNGdaWGhqWlhCMGFXOXVJR2x6SUhSb2NtOTNiaUJtY205dElHbHVibVZ5Um00c0lIZGxJR3hsWVhabElITjBZWFJsSUQwOVBWeHVJQ0FnSUNBZ0lDQWdJQzh2SUVkbGJsTjBZWFJsUlhobFkzVjBhVzVuSUdGdVpDQnNiMjl3SUdKaFkyc2dabTl5SUdGdWIzUm9aWElnYVc1MmIyTmhkR2x2Ymk1Y2JpQWdJQ0FnSUNBZ0lDQnpkR0YwWlNBOUlHTnZiblJsZUhRdVpHOXVaVnh1SUNBZ0lDQWdJQ0FnSUNBZ1B5QkhaVzVUZEdGMFpVTnZiWEJzWlhSbFpGeHVJQ0FnSUNBZ0lDQWdJQ0FnT2lCSFpXNVRkR0YwWlZOMWMzQmxibVJsWkZscFpXeGtPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR2x1Wm04Z1BTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaVG9nY21WamIzSmtMbUZ5Wnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJR1J2Ym1VNklHTnZiblJsZUhRdVpHOXVaVnh1SUNBZ0lDQWdJQ0FnSUgwN1hHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2NtVmpiM0prTG1GeVp5QTlQVDBnUTI5dWRHbHVkV1ZUWlc1MGFXNWxiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmJuUmxlSFF1WkdWc1pXZGhkR1VnSmlZZ2JXVjBhRzlrSUQwOVBTQmNJbTVsZUhSY0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJFWld4cFltVnlZWFJsYkhrZ1ptOXlaMlYwSUhSb1pTQnNZWE4wSUhObGJuUWdkbUZzZFdVZ2MyOGdkR2hoZENCM1pTQmtiMjRuZEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCaFkyTnBaR1Z1ZEdGc2JIa2djR0Z6Y3lCcGRDQnZiaUIwYnlCMGFHVWdaR1ZzWldkaGRHVXVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnlaeUE5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHbHVabTg3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lITjBZWFJsSUQwZ1IyVnVVM1JoZEdWRGIyMXdiR1YwWldRN1hHNGdJQ0FnSUNBZ0lDQWdMeThnUkdsemNHRjBZMmdnZEdobElHVjRZMlZ3ZEdsdmJpQmllU0JzYjI5d2FXNW5JR0poWTJzZ1lYSnZkVzVrSUhSdklIUm9aVnh1SUNBZ0lDQWdJQ0FnSUM4dklHTnZiblJsZUhRdVpHbHpjR0YwWTJoRmVHTmxjSFJwYjI0b1lYSm5LU0JqWVd4c0lHRmliM1psTGx4dUlDQWdJQ0FnSUNBZ0lHMWxkR2h2WkNBOUlGd2lkR2h5YjNkY0lqdGNiaUFnSUNBZ0lDQWdJQ0JoY21jZ1BTQnlaV052Y21RdVlYSm5PMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVHRjYmlBZ2ZWeHVYRzRnSUM4dklFUmxabWx1WlNCSFpXNWxjbUYwYjNJdWNISnZkRzkwZVhCbExudHVaWGgwTEhSb2NtOTNMSEpsZEhWeWJuMGdhVzRnZEdWeWJYTWdiMllnZEdobFhHNGdJQzh2SUhWdWFXWnBaV1FnTGw5cGJuWnZhMlVnYUdWc2NHVnlJRzFsZEdodlpDNWNiaUFnWkdWbWFXNWxTWFJsY21GMGIzSk5aWFJvYjJSektFZHdLVHRjYmx4dUlDQkhjRnRwZEdWeVlYUnZjbE41YldKdmJGMGdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmVHRjYmx4dUlDQkhjQzUwYjFOMGNtbHVaeUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJjSWx0dlltcGxZM1FnUjJWdVpYSmhkRzl5WFZ3aU8xeHVJQ0I5TzF4dVhHNGdJR1oxYm1OMGFXOXVJSEIxYzJoVWNubEZiblJ5ZVNoc2IyTnpLU0I3WEc0Z0lDQWdkbUZ5SUdWdWRISjVJRDBnZXlCMGNubE1iMk02SUd4dlkzTmJNRjBnZlR0Y2JseHVJQ0FnSUdsbUlDZ3hJR2x1SUd4dlkzTXBJSHRjYmlBZ0lDQWdJR1Z1ZEhKNUxtTmhkR05vVEc5aklEMGdiRzlqYzFzeFhUdGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9NaUJwYmlCc2IyTnpLU0I3WEc0Z0lDQWdJQ0JsYm5SeWVTNW1hVzVoYkd4NVRHOWpJRDBnYkc5amMxc3lYVHRjYmlBZ0lDQWdJR1Z1ZEhKNUxtRm1kR1Z5VEc5aklEMGdiRzlqYzFzelhUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMGFHbHpMblJ5ZVVWdWRISnBaWE11Y0hWemFDaGxiblJ5ZVNrN1hHNGdJSDFjYmx4dUlDQm1kVzVqZEdsdmJpQnlaWE5sZEZSeWVVVnVkSEo1S0dWdWRISjVLU0I3WEc0Z0lDQWdkbUZ5SUhKbFkyOXlaQ0E5SUdWdWRISjVMbU52YlhCc1pYUnBiMjRnZkh3Z2UzMDdYRzRnSUNBZ2NtVmpiM0prTG5SNWNHVWdQU0JjSW01dmNtMWhiRndpTzF4dUlDQWdJR1JsYkdWMFpTQnlaV052Y21RdVlYSm5PMXh1SUNBZ0lHVnVkSEo1TG1OdmJYQnNaWFJwYjI0Z1BTQnlaV052Y21RN1hHNGdJSDFjYmx4dUlDQm1kVzVqZEdsdmJpQkRiMjUwWlhoMEtIUnllVXh2WTNOTWFYTjBLU0I3WEc0Z0lDQWdMeThnVkdobElISnZiM1FnWlc1MGNua2diMkpxWldOMElDaGxabVpsWTNScGRtVnNlU0JoSUhSeWVTQnpkR0YwWlcxbGJuUWdkMmwwYUc5MWRDQmhJR05oZEdOb1hHNGdJQ0FnTHk4Z2IzSWdZU0JtYVc1aGJHeDVJR0pzYjJOcktTQm5hWFpsY3lCMWN5QmhJSEJzWVdObElIUnZJSE4wYjNKbElIWmhiSFZsY3lCMGFISnZkMjRnWm5KdmJWeHVJQ0FnSUM4dklHeHZZMkYwYVc5dWN5QjNhR1Z5WlNCMGFHVnlaU0JwY3lCdWJ5QmxibU5zYjNOcGJtY2dkSEo1SUhOMFlYUmxiV1Z1ZEM1Y2JpQWdJQ0IwYUdsekxuUnllVVZ1ZEhKcFpYTWdQU0JiZXlCMGNubE1iMk02SUZ3aWNtOXZkRndpSUgxZE8xeHVJQ0FnSUhSeWVVeHZZM05NYVhOMExtWnZja1ZoWTJnb2NIVnphRlJ5ZVVWdWRISjVMQ0IwYUdsektUdGNiaUFnSUNCMGFHbHpMbkpsYzJWMEtIUnlkV1VwTzF4dUlDQjlYRzVjYmlBZ2NuVnVkR2x0WlM1clpYbHpJRDBnWm5WdVkzUnBiMjRvYjJKcVpXTjBLU0I3WEc0Z0lDQWdkbUZ5SUd0bGVYTWdQU0JiWFR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJyWlhrZ2FXNGdiMkpxWldOMEtTQjdYRzRnSUNBZ0lDQnJaWGx6TG5CMWMyZ29hMlY1S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdhMlY1Y3k1eVpYWmxjbk5sS0NrN1hHNWNiaUFnSUNBdkx5QlNZWFJvWlhJZ2RHaGhiaUJ5WlhSMWNtNXBibWNnWVc0Z2IySnFaV04wSUhkcGRHZ2dZU0J1WlhoMElHMWxkR2h2WkN3Z2QyVWdhMlZsY0Z4dUlDQWdJQzh2SUhSb2FXNW5jeUJ6YVcxd2JHVWdZVzVrSUhKbGRIVnliaUIwYUdVZ2JtVjRkQ0JtZFc1amRHbHZiaUJwZEhObGJHWXVYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUc1bGVIUW9LU0I3WEc0Z0lDQWdJQ0IzYUdsc1pTQW9hMlY1Y3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR3RsZVNBOUlHdGxlWE11Y0c5d0tDazdYRzRnSUNBZ0lDQWdJR2xtSUNoclpYa2dhVzRnYjJKcVpXTjBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JtVjRkQzUyWVd4MVpTQTlJR3RsZVR0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGgwTG1SdmJtVWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdibVY0ZER0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUJVYnlCaGRtOXBaQ0JqY21WaGRHbHVaeUJoYmlCaFpHUnBkR2x2Ym1Gc0lHOWlhbVZqZEN3Z2QyVWdhblZ6ZENCb1lXNW5JSFJvWlNBdWRtRnNkV1ZjYmlBZ0lDQWdJQzh2SUdGdVpDQXVaRzl1WlNCd2NtOXdaWEowYVdWeklHOW1aaUIwYUdVZ2JtVjRkQ0JtZFc1amRHbHZiaUJ2WW1wbFkzUWdhWFJ6Wld4bUxpQlVhR2x6WEc0Z0lDQWdJQ0F2THlCaGJITnZJR1Z1YzNWeVpYTWdkR2hoZENCMGFHVWdiV2x1YVdacFpYSWdkMmxzYkNCdWIzUWdZVzV2Ym5sdGFYcGxJSFJvWlNCbWRXNWpkR2x2Ymk1Y2JpQWdJQ0FnSUc1bGVIUXVaRzl1WlNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVY0ZER0Y2JpQWdJQ0I5TzF4dUlDQjlPMXh1WEc0Z0lHWjFibU4wYVc5dUlIWmhiSFZsY3locGRHVnlZV0pzWlNrZ2UxeHVJQ0FnSUdsbUlDaHBkR1Z5WVdKc1pTa2dlMXh1SUNBZ0lDQWdkbUZ5SUdsMFpYSmhkRzl5VFdWMGFHOWtJRDBnYVhSbGNtRmliR1ZiYVhSbGNtRjBiM0pUZVcxaWIyeGRPMXh1SUNBZ0lDQWdhV1lnS0dsMFpYSmhkRzl5VFdWMGFHOWtLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJwZEdWeVlYUnZjazFsZEdodlpDNWpZV3hzS0dsMFpYSmhZbXhsS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnBkR1Z5WVdKc1pTNXVaWGgwSUQwOVBTQmNJbVoxYm1OMGFXOXVYQ0lwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdsMFpYSmhZbXhsTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCcFppQW9JV2x6VG1GT0tHbDBaWEpoWW14bExteGxibWQwYUNrcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdrZ1BTQXRNU3dnYm1WNGRDQTlJR1oxYm1OMGFXOXVJRzVsZUhRb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnZDJocGJHVWdLQ3NyYVNBOElHbDBaWEpoWW14bExteGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHaGhjMDkzYmk1allXeHNLR2wwWlhKaFlteGxMQ0JwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVpYaDBMblpoYkhWbElEMGdhWFJsY21GaWJHVmJhVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJRzVsZUhRdVpHOXVaU0E5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JtVjRkRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQnVaWGgwTG5aaGJIVmxJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNBZ0lHNWxlSFF1Wkc5dVpTQTlJSFJ5ZFdVN1hHNWNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdibVY0ZER0Y2JpQWdJQ0FnSUNBZ2ZUdGNibHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdibVY0ZEM1dVpYaDBJRDBnYm1WNGREdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlNaWFIxY200Z1lXNGdhWFJsY21GMGIzSWdkMmwwYUNCdWJ5QjJZV3gxWlhNdVhHNGdJQ0FnY21WMGRYSnVJSHNnYm1WNGREb2daRzl1WlZKbGMzVnNkQ0I5TzF4dUlDQjlYRzRnSUhKMWJuUnBiV1V1ZG1Gc2RXVnpJRDBnZG1Gc2RXVnpPMXh1WEc0Z0lHWjFibU4wYVc5dUlHUnZibVZTWlhOMWJIUW9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlIc2dkbUZzZFdVNklIVnVaR1ZtYVc1bFpDd2daRzl1WlRvZ2RISjFaU0I5TzF4dUlDQjlYRzVjYmlBZ1EyOXVkR1Y0ZEM1d2NtOTBiM1I1Y0dVZ1BTQjdYRzRnSUNBZ1kyOXVjM1J5ZFdOMGIzSTZJRU52Ym5SbGVIUXNYRzVjYmlBZ0lDQnlaWE5sZERvZ1puVnVZM1JwYjI0b2MydHBjRlJsYlhCU1pYTmxkQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NXdjbVYySUQwZ01EdGNiaUFnSUNBZ0lIUm9hWE11Ym1WNGRDQTlJREE3WEc0Z0lDQWdJQ0IwYUdsekxuTmxiblFnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNCMGFHbHpMbVJ2Ym1VZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUhSb2FYTXVaR1ZzWldkaGRHVWdQU0J1ZFd4c08xeHVYRzRnSUNBZ0lDQjBhR2x6TG5SeWVVVnVkSEpwWlhNdVptOXlSV0ZqYUNoeVpYTmxkRlJ5ZVVWdWRISjVLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tDRnphMmx3VkdWdGNGSmxjMlYwS1NCN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvZG1GeUlHNWhiV1VnYVc0Z2RHaHBjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJRTV2ZENCemRYSmxJR0ZpYjNWMElIUm9aU0J2Y0hScGJXRnNJRzl5WkdWeUlHOW1JSFJvWlhObElHTnZibVJwZEdsdmJuTTZYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tHNWhiV1V1WTJoaGNrRjBLREFwSUQwOVBTQmNJblJjSWlBbUpseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCb1lYTlBkMjR1WTJGc2JDaDBhR2x6TENCdVlXMWxLU0FtSmx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FoYVhOT1lVNG9LMjVoYldVdWMyeHBZMlVvTVNrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpXMjVoYldWZElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwc1hHNWNiaUFnSUNCemRHOXdPaUJtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaRzl1WlNBOUlIUnlkV1U3WEc1Y2JpQWdJQ0FnSUhaaGNpQnliMjkwUlc1MGNua2dQU0IwYUdsekxuUnllVVZ1ZEhKcFpYTmJNRjA3WEc0Z0lDQWdJQ0IyWVhJZ2NtOXZkRkpsWTI5eVpDQTlJSEp2YjNSRmJuUnllUzVqYjIxd2JHVjBhVzl1TzF4dUlDQWdJQ0FnYVdZZ0tISnZiM1JTWldOdmNtUXVkSGx3WlNBOVBUMGdYQ0owYUhKdmQxd2lLU0I3WEc0Z0lDQWdJQ0FnSUhSb2NtOTNJSEp2YjNSU1pXTnZjbVF1WVhKbk8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV5ZG1Gc08xeHVJQ0FnSUgwc1hHNWNiaUFnSUNCa2FYTndZWFJqYUVWNFkyVndkR2x2YmpvZ1puVnVZM1JwYjI0b1pYaGpaWEIwYVc5dUtTQjdYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NWtiMjVsS1NCN1hHNGdJQ0FnSUNBZ0lIUm9jbTkzSUdWNFkyVndkR2x2Ymp0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2RtRnlJR052Ym5SbGVIUWdQU0IwYUdsek8xeHVJQ0FnSUNBZ1puVnVZM1JwYjI0Z2FHRnVaR3hsS0d4dll5d2dZMkYxWjJoMEtTQjdYRzRnSUNBZ0lDQWdJSEpsWTI5eVpDNTBlWEJsSUQwZ1hDSjBhSEp2ZDF3aU8xeHVJQ0FnSUNBZ0lDQnlaV052Y21RdVlYSm5JRDBnWlhoalpYQjBhVzl1TzF4dUlDQWdJQ0FnSUNCamIyNTBaWGgwTG01bGVIUWdQU0JzYjJNN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlBaElXTmhkV2RvZER0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJSFJvYVhNdWRISjVSVzUwY21sbGN5NXNaVzVuZEdnZ0xTQXhPeUJwSUQ0OUlEQTdJQzB0YVNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWlc1MGNua2dQU0IwYUdsekxuUnllVVZ1ZEhKcFpYTmJhVjA3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaV052Y21RZ1BTQmxiblJ5ZVM1amIyMXdiR1YwYVc5dU8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNobGJuUnllUzUwY25sTWIyTWdQVDA5SUZ3aWNtOXZkRndpS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnUlhoalpYQjBhVzl1SUhSb2NtOTNiaUJ2ZFhSemFXUmxJRzltSUdGdWVTQjBjbmtnWW14dlkyc2dkR2hoZENCamIzVnNaQ0JvWVc1a2JHVmNiaUFnSUNBZ0lDQWdJQ0F2THlCcGRDd2djMjhnYzJWMElIUm9aU0JqYjIxd2JHVjBhVzl1SUhaaGJIVmxJRzltSUhSb1pTQmxiblJwY21VZ1puVnVZM1JwYjI0Z2RHOWNiaUFnSUNBZ0lDQWdJQ0F2THlCMGFISnZkeUIwYUdVZ1pYaGpaWEIwYVc5dUxseHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm9ZVzVrYkdVb1hDSmxibVJjSWlrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JwWmlBb1pXNTBjbmt1ZEhKNVRHOWpJRHc5SUhSb2FYTXVjSEpsZGlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCb1lYTkRZWFJqYUNBOUlHaGhjMDkzYmk1allXeHNLR1Z1ZEhKNUxDQmNJbU5oZEdOb1RHOWpYQ0lwTzF4dUlDQWdJQ0FnSUNBZ0lIWmhjaUJvWVhOR2FXNWhiR3g1SUQwZ2FHRnpUM2R1TG1OaGJHd29aVzUwY25rc0lGd2labWx1WVd4c2VVeHZZMXdpS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJR2xtSUNob1lYTkRZWFJqYUNBbUppQm9ZWE5HYVc1aGJHeDVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXdjbVYySUR3Z1pXNTBjbmt1WTJGMFkyaE1iMk1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2hoYm1Sc1pTaGxiblJ5ZVM1allYUmphRXh2WXl3Z2RISjFaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJvYVhNdWNISmxkaUE4SUdWdWRISjVMbVpwYm1Gc2JIbE1iMk1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2hoYm1Sc1pTaGxiblJ5ZVM1bWFXNWhiR3g1VEc5aktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYUdGelEyRjBZMmdwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbkJ5WlhZZ1BDQmxiblJ5ZVM1allYUmphRXh2WXlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYUdGdVpHeGxLR1Z1ZEhKNUxtTmhkR05vVEc5akxDQjBjblZsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9hR0Z6Um1sdVlXeHNlU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjSEpsZGlBOElHVnVkSEo1TG1acGJtRnNiSGxNYjJNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdoaGJtUnNaU2hsYm5SeWVTNW1hVzVoYkd4NVRHOWpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1hDSjBjbmtnYzNSaGRHVnRaVzUwSUhkcGRHaHZkWFFnWTJGMFkyZ2diM0lnWm1sdVlXeHNlVndpS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlMRnh1WEc0Z0lDQWdZV0p5ZFhCME9pQm1kVzVqZEdsdmJpaDBlWEJsTENCaGNtY3BJSHRjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJR2tnUFNCMGFHbHpMblJ5ZVVWdWRISnBaWE11YkdWdVozUm9JQzBnTVRzZ2FTQStQU0F3T3lBdExXa3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHVnVkSEo1SUQwZ2RHaHBjeTUwY25sRmJuUnlhV1Z6VzJsZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWlc1MGNua3VkSEo1VEc5aklEdzlJSFJvYVhNdWNISmxkaUFtSmx4dUlDQWdJQ0FnSUNBZ0lDQWdhR0Z6VDNkdUxtTmhiR3dvWlc1MGNua3NJRndpWm1sdVlXeHNlVXh2WTF3aUtTQW1KbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3Y21WMklEd2daVzUwY25rdVptbHVZV3hzZVV4dll5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQm1hVzVoYkd4NVJXNTBjbmtnUFNCbGJuUnllVHRjYmlBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCcFppQW9abWx1WVd4c2VVVnVkSEo1SUNZbVhHNGdJQ0FnSUNBZ0lDQWdLSFI1Y0dVZ1BUMDlJRndpWW5KbFlXdGNJaUI4ZkZ4dUlDQWdJQ0FnSUNBZ0lDQjBlWEJsSUQwOVBTQmNJbU52Ym5ScGJuVmxYQ0lwSUNZbVhHNGdJQ0FnSUNBZ0lDQWdabWx1WVd4c2VVVnVkSEo1TG5SeWVVeHZZeUE4UFNCaGNtY2dKaVpjYmlBZ0lDQWdJQ0FnSUNCaGNtY2dQRDBnWm1sdVlXeHNlVVZ1ZEhKNUxtWnBibUZzYkhsTWIyTXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1NXZHViM0psSUhSb1pTQm1hVzVoYkd4NUlHVnVkSEo1SUdsbUlHTnZiblJ5YjJ3Z2FYTWdibTkwSUdwMWJYQnBibWNnZEc4Z1lWeHVJQ0FnSUNBZ0lDQXZMeUJzYjJOaGRHbHZiaUJ2ZFhSemFXUmxJSFJvWlNCMGNua3ZZMkYwWTJnZ1lteHZZMnN1WEc0Z0lDQWdJQ0FnSUdacGJtRnNiSGxGYm5SeWVTQTlJRzUxYkd3N1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJ5WldOdmNtUWdQU0JtYVc1aGJHeDVSVzUwY25rZ1B5Qm1hVzVoYkd4NVJXNTBjbmt1WTI5dGNHeGxkR2x2YmlBNklIdDlPMXh1SUNBZ0lDQWdjbVZqYjNKa0xuUjVjR1VnUFNCMGVYQmxPMXh1SUNBZ0lDQWdjbVZqYjNKa0xtRnlaeUE5SUdGeVp6dGNibHh1SUNBZ0lDQWdhV1lnS0dacGJtRnNiSGxGYm5SeWVTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFFnUFNCbWFXNWhiR3g1Ulc1MGNua3VabWx1WVd4c2VVeHZZenRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdVkyOXRjR3hsZEdVb2NtVmpiM0prS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2NtVjBkWEp1SUVOdmJuUnBiblZsVTJWdWRHbHVaV3c3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJR052YlhCc1pYUmxPaUJtZFc1amRHbHZiaWh5WldOdmNtUXNJR0ZtZEdWeVRHOWpLU0I3WEc0Z0lDQWdJQ0JwWmlBb2NtVmpiM0prTG5SNWNHVWdQVDA5SUZ3aWRHaHliM2RjSWlrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCeVpXTnZjbVF1WVhKbk8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpWW5KbFlXdGNJaUI4ZkZ4dUlDQWdJQ0FnSUNBZ0lISmxZMjl5WkM1MGVYQmxJRDA5UFNCY0ltTnZiblJwYm5WbFhDSXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXVaWGgwSUQwZ2NtVmpiM0prTG1GeVp6dGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9jbVZqYjNKa0xuUjVjR1VnUFQwOUlGd2ljbVYwZFhKdVhDSXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXlkbUZzSUQwZ2NtVmpiM0prTG1GeVp6dGNiaUFnSUNBZ0lDQWdkR2hwY3k1dVpYaDBJRDBnWENKbGJtUmNJanRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpYm05eWJXRnNYQ0lnSmlZZ1lXWjBaWEpNYjJNcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dVpYaDBJRDBnWVdaMFpYSk1iMk03WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU3hjYmx4dUlDQWdJR1pwYm1semFEb2dablZ1WTNScGIyNG9abWx1WVd4c2VVeHZZeWtnZTF4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlIUm9hWE11ZEhKNVJXNTBjbWxsY3k1c1pXNW5kR2dnTFNBeE95QnBJRDQ5SURBN0lDMHRhU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdaVzUwY25rZ1BTQjBhR2x6TG5SeWVVVnVkSEpwWlhOYmFWMDdYRzRnSUNBZ0lDQWdJR2xtSUNobGJuUnllUzVtYVc1aGJHeDVURzlqSUQwOVBTQm1hVzVoYkd4NVRHOWpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjIxd2JHVjBaU2hsYm5SeWVTNWpiMjF3YkdWMGFXOXVMQ0JsYm5SeWVTNWhablJsY2t4dll5azdYRzRnSUNBZ0lDQWdJQ0FnY21WelpYUlVjbmxGYm5SeWVTaGxiblJ5ZVNrN1hHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlFTnZiblJwYm5WbFUyVnVkR2x1Wld3N1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOUxGeHVYRzRnSUNBZ1hDSmpZWFJqYUZ3aU9pQm1kVzVqZEdsdmJpaDBjbmxNYjJNcElIdGNiaUFnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0IwYUdsekxuUnllVVZ1ZEhKcFpYTXViR1Z1WjNSb0lDMGdNVHNnYVNBK1BTQXdPeUF0TFdrcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWdWRISjVJRDBnZEdocGN5NTBjbmxGYm5SeWFXVnpXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9aVzUwY25rdWRISjVURzlqSUQwOVBTQjBjbmxNYjJNcElIdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2NtVmpiM0prSUQwZ1pXNTBjbmt1WTI5dGNHeGxkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhSb2NtOTNiaUE5SUhKbFkyOXlaQzVoY21jN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhObGRGUnllVVZ1ZEhKNUtHVnVkSEo1S1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvY205M2JqdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0F2THlCVWFHVWdZMjl1ZEdWNGRDNWpZWFJqYUNCdFpYUm9iMlFnYlhWemRDQnZibXg1SUdKbElHTmhiR3hsWkNCM2FYUm9JR0VnYkc5allYUnBiMjVjYmlBZ0lDQWdJQzh2SUdGeVozVnRaVzUwSUhSb1lYUWdZMjl5Y21WemNHOXVaSE1nZEc4Z1lTQnJibTkzYmlCallYUmphQ0JpYkc5amF5NWNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0ltbHNiR1ZuWVd3Z1kyRjBZMmdnWVhSMFpXMXdkRndpS1R0Y2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWkdWc1pXZGhkR1ZaYVdWc1pEb2dablZ1WTNScGIyNG9hWFJsY21GaWJHVXNJSEpsYzNWc2RFNWhiV1VzSUc1bGVIUk1iMk1wSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaR1ZzWldkaGRHVWdQU0I3WEc0Z0lDQWdJQ0FnSUdsMFpYSmhkRzl5T2lCMllXeDFaWE1vYVhSbGNtRmliR1VwTEZ4dUlDQWdJQ0FnSUNCeVpYTjFiSFJPWVcxbE9pQnlaWE4xYkhST1lXMWxMRnh1SUNBZ0lDQWdJQ0J1WlhoMFRHOWpPaUJ1WlhoMFRHOWpYRzRnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdRMjl1ZEdsdWRXVlRaVzUwYVc1bGJEdGNiaUFnSUNCOVhHNGdJSDA3WEc1OUtTaGNiaUFnTHk4Z1FXMXZibWNnZEdobElIWmhjbWx2ZFhNZ2RISnBZMnR6SUdadmNpQnZZblJoYVc1cGJtY2dZU0J5WldabGNtVnVZMlVnZEc4Z2RHaGxJR2RzYjJKaGJGeHVJQ0F2THlCdlltcGxZM1FzSUhSb2FYTWdjMlZsYlhNZ2RHOGdZbVVnZEdobElHMXZjM1FnY21Wc2FXRmliR1VnZEdWamFHNXBjWFZsSUhSb1lYUWdaRzlsY3lCdWIzUmNiaUFnTHk4Z2RYTmxJR2x1WkdseVpXTjBJR1YyWVd3Z0tIZG9hV05vSUhacGIyeGhkR1Z6SUVOdmJuUmxiblFnVTJWamRYSnBkSGtnVUc5c2FXTjVLUzVjYmlBZ2RIbHdaVzltSUdkc2IySmhiQ0E5UFQwZ1hDSnZZbXBsWTNSY0lpQS9JR2RzYjJKaGJDQTZYRzRnSUhSNWNHVnZaaUIzYVc1a2IzY2dQVDA5SUZ3aWIySnFaV04wWENJZ1B5QjNhVzVrYjNjZ09seHVJQ0IwZVhCbGIyWWdjMlZzWmlBOVBUMGdYQ0p2WW1wbFkzUmNJaUEvSUhObGJHWWdPaUIwYUdselhHNHBPMXh1SWwxOSIsInZhciBsb29rdXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbjsoZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG4gIHZhciBBcnIgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKVxuICAgID8gVWludDhBcnJheVxuICAgIDogQXJyYXlcblxuXHR2YXIgUExVUyAgID0gJysnLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIICA9ICcvJy5jaGFyQ29kZUF0KDApXG5cdHZhciBOVU1CRVIgPSAnMCcuY2hhckNvZGVBdCgwKVxuXHR2YXIgTE9XRVIgID0gJ2EnLmNoYXJDb2RlQXQoMClcblx0dmFyIFVQUEVSICA9ICdBJy5jaGFyQ29kZUF0KDApXG5cdHZhciBQTFVTX1VSTF9TQUZFID0gJy0nLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIX1VSTF9TQUZFID0gJ18nLmNoYXJDb2RlQXQoMClcblxuXHRmdW5jdGlvbiBkZWNvZGUgKGVsdCkge1xuXHRcdHZhciBjb2RlID0gZWx0LmNoYXJDb2RlQXQoMClcblx0XHRpZiAoY29kZSA9PT0gUExVUyB8fFxuXHRcdCAgICBjb2RlID09PSBQTFVTX1VSTF9TQUZFKVxuXHRcdFx0cmV0dXJuIDYyIC8vICcrJ1xuXHRcdGlmIChjb2RlID09PSBTTEFTSCB8fFxuXHRcdCAgICBjb2RlID09PSBTTEFTSF9VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MyAvLyAnLydcblx0XHRpZiAoY29kZSA8IE5VTUJFUilcblx0XHRcdHJldHVybiAtMSAvL25vIG1hdGNoXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIgKyAxMClcblx0XHRcdHJldHVybiBjb2RlIC0gTlVNQkVSICsgMjYgKyAyNlxuXHRcdGlmIChjb2RlIDwgVVBQRVIgKyAyNilcblx0XHRcdHJldHVybiBjb2RlIC0gVVBQRVJcblx0XHRpZiAoY29kZSA8IExPV0VSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIExPV0VSICsgMjZcblx0fVxuXG5cdGZ1bmN0aW9uIGI2NFRvQnl0ZUFycmF5IChiNjQpIHtcblx0XHR2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuXG5cdFx0aWYgKGI2NC5sZW5ndGggJSA0ID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jylcblx0XHR9XG5cblx0XHQvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuXHRcdC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcblx0XHQvLyByZXByZXNlbnQgb25lIGJ5dGVcblx0XHQvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcblx0XHQvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG5cdFx0dmFyIGxlbiA9IGI2NC5sZW5ndGhcblx0XHRwbGFjZUhvbGRlcnMgPSAnPScgPT09IGI2NC5jaGFyQXQobGVuIC0gMikgPyAyIDogJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDEpID8gMSA6IDBcblxuXHRcdC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXHRcdGFyciA9IG5ldyBBcnIoYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuXHRcdGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gYjY0Lmxlbmd0aCAtIDQgOiBiNjQubGVuZ3RoXG5cblx0XHR2YXIgTCA9IDBcblxuXHRcdGZ1bmN0aW9uIHB1c2ggKHYpIHtcblx0XHRcdGFycltMKytdID0gdlxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTgpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgMTIpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPDwgNikgfCBkZWNvZGUoYjY0LmNoYXJBdChpICsgMykpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDAwMCkgPj4gMTYpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDApID4+IDgpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0aWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuXHRcdFx0dG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpID4+IDQpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTApIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgNCkgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDIpKSA+PiAyKVxuXHRcdFx0cHVzaCgodG1wID4+IDgpICYgMHhGRilcblx0XHRcdHB1c2godG1wICYgMHhGRilcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyXG5cdH1cblxuXHRmdW5jdGlvbiB1aW50OFRvQmFzZTY0ICh1aW50OCkge1xuXHRcdHZhciBpLFxuXHRcdFx0ZXh0cmFCeXRlcyA9IHVpbnQ4Lmxlbmd0aCAlIDMsIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cdFx0XHRvdXRwdXQgPSBcIlwiLFxuXHRcdFx0dGVtcCwgbGVuZ3RoXG5cblx0XHRmdW5jdGlvbiBlbmNvZGUgKG51bSkge1xuXHRcdFx0cmV0dXJuIGxvb2t1cC5jaGFyQXQobnVtKVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKG51bSA+PiAxOCAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiAxMiAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiA2ICYgMHgzRikgKyBlbmNvZGUobnVtICYgMHgzRilcblx0XHR9XG5cblx0XHQvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gdWludDgubGVuZ3RoIC0gZXh0cmFCeXRlczsgaSA8IGxlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHR0ZW1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuXHRcdFx0b3V0cHV0ICs9IHRyaXBsZXRUb0Jhc2U2NCh0ZW1wKVxuXHRcdH1cblxuXHRcdC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcblx0XHRzd2l0Y2ggKGV4dHJhQnl0ZXMpIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dGVtcCA9IHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDFdXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAyKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9ICc9PSdcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dGVtcCA9ICh1aW50OFt1aW50OC5sZW5ndGggLSAyXSA8PCA4KSArICh1aW50OFt1aW50OC5sZW5ndGggLSAxXSlcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSh0ZW1wID4+IDEwKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wID4+IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCAyKSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPSdcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0XG5cdH1cblxuXHRleHBvcnRzLnRvQnl0ZUFycmF5ID0gYjY0VG9CeXRlQXJyYXlcblx0ZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gdWludDhUb0Jhc2U2NFxufSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAodGhpcy5iYXNlNjRqcyA9IHt9KSA6IGV4cG9ydHMpKVxuIixudWxsLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbnZhciByb290UGFyZW50ID0ge31cblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBTYWZhcmkgNS03IGxhY2tzIHN1cHBvcnQgZm9yIGNoYW5naW5nIHRoZSBgT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcmAgcHJvcGVydHlcbiAqICAgICBvbiBvYmplY3RzLlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgZnVuY3Rpb24gQmFyICgpIHt9XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLmZvbyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgICBhcnIuY29uc3RydWN0b3IgPSBCYXJcbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICBhcnIuY29uc3RydWN0b3IgPT09IEJhciAmJiAvLyBjb25zdHJ1Y3RvciBjYW4gYmUgc2V0XG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKGFyZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIC8vIEF2b2lkIGdvaW5nIHRocm91Z2ggYW4gQXJndW1lbnRzQWRhcHRvclRyYW1wb2xpbmUgaW4gdGhlIGNvbW1vbiBjYXNlLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBhcmd1bWVudHNbMV0pXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXMubGVuZ3RoID0gMFxuICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcywgYXJnKVxuICB9XG5cbiAgLy8gU2xpZ2h0bHkgbGVzcyBjb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhpcywgYXJnLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6ICd1dGY4JylcbiAgfVxuXG4gIC8vIFVudXN1YWwuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoaXMsIGFyZylcbn1cblxuZnVuY3Rpb24gZnJvbU51bWJlciAodGhhdCwgbGVuZ3RoKSB7XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGggPCAwID8gMCA6IGNoZWNrZWQobGVuZ3RoKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykgZW5jb2RpbmcgPSAndXRmOCdcblxuICAvLyBBc3N1bXB0aW9uOiBieXRlTGVuZ3RoKCkgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyA8IGtNYXhMZW5ndGguXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqZWN0KSkgcmV0dXJuIGZyb21CdWZmZXIodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChpc0FycmF5KG9iamVjdCkpIHJldHVybiBmcm9tQXJyYXkodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ211c3Qgc3RhcnQgd2l0aCBudW1iZXIsIGJ1ZmZlciwgYXJyYXkgb3Igc3RyaW5nJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9iamVjdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21UeXBlZEFycmF5KHRoYXQsIG9iamVjdClcbiAgICB9XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIG9iamVjdClcbiAgICB9XG4gIH1cblxuICBpZiAob2JqZWN0Lmxlbmd0aCkgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqZWN0KVxuXG4gIHJldHVybiBmcm9tSnNvbk9iamVjdCh0aGF0LCBvYmplY3QpXG59XG5cbmZ1bmN0aW9uIGZyb21CdWZmZXIgKHRoYXQsIGJ1ZmZlcikge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChidWZmZXIubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgYnVmZmVyLmNvcHkodGhhdCwgMCwgMCwgbGVuZ3RoKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEdXBsaWNhdGUgb2YgZnJvbUFycmF5KCkgdG8ga2VlcCBmcm9tQXJyYXkoKSBtb25vbW9ycGhpYy5cbmZ1bmN0aW9uIGZyb21UeXBlZEFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICAvLyBUcnVuY2F0aW5nIHRoZSBlbGVtZW50cyBpcyBwcm9iYWJseSBub3Qgd2hhdCBwZW9wbGUgZXhwZWN0IGZyb20gdHlwZWRcbiAgLy8gYXJyYXlzIHdpdGggQllURVNfUEVSX0VMRU1FTlQgPiAxIGJ1dCBpdCdzIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3JcbiAgLy8gb2YgdGhlIG9sZCBCdWZmZXIgY29uc3RydWN0b3IuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5KSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIGFycmF5LmJ5dGVMZW5ndGhcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21UeXBlZEFycmF5KHRoYXQsIG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRGVzZXJpYWxpemUgeyB0eXBlOiAnQnVmZmVyJywgZGF0YTogWzEsMiwzLC4uLl0gfSBpbnRvIGEgQnVmZmVyIG9iamVjdC5cbi8vIFJldHVybnMgYSB6ZXJvLWxlbmd0aCBidWZmZXIgZm9yIGlucHV0cyB0aGF0IGRvbid0IGNvbmZvcm0gdG8gdGhlIHNwZWMuXG5mdW5jdGlvbiBmcm9tSnNvbk9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIHZhciBhcnJheVxuICB2YXIgbGVuZ3RoID0gMFxuXG4gIGlmIChvYmplY3QudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmplY3QuZGF0YSkpIHtcbiAgICBhcnJheSA9IG9iamVjdC5kYXRhXG4gICAgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB9XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG59IGVsc2Uge1xuICAvLyBwcmUtc2V0IGZvciB2YWx1ZXMgdGhhdCBtYXkgZXhpc3QgaW4gdGhlIGZ1dHVyZVxuICBCdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IHVuZGVmaW5lZFxuICBCdWZmZXIucHJvdG90eXBlLnBhcmVudCA9IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBhbGxvY2F0ZSAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGF0Ll9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSBicmVha1xuXG4gICAgKytpXG4gIH1cblxuICBpZiAoaSAhPT0gbGVuKSB7XG4gICAgeCA9IGFbaV1cbiAgICB5ID0gYltpXVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgc3RyaW5nID0gJycgKyBzdHJpbmdcblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICBjYXNlICdyYXdzJzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICBzdGFydCA9IHN0YXJ0IHwgMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPT09IEluZmluaXR5ID8gdGhpcy5sZW5ndGggOiBlbmQgfCAwXG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcbiAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuICcnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiAwXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICBieXRlT2Zmc2V0ID4+PSAwXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiAtMVxuXG4gIC8vIE5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5sZW5ndGggKyBieXRlT2Zmc2V0LCAwKVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSByZXR1cm4gLTEgLy8gc3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcgYWx3YXlzIGZhaWxzXG4gICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yICh2YXIgaSA9IDA7IGJ5dGVPZmZzZXQgKyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2J5dGVPZmZzZXQgKyBpXSA9PT0gdmFsW2ZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4XSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbC5sZW5ndGgpIHJldHVybiBieXRlT2Zmc2V0ICsgZm91bmRJbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuLy8gYGdldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLmdldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMucmVhZFVJbnQ4KG9mZnNldClcbn1cblxuLy8gYHNldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKHYsIG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmluYXJ5V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHZhciBzd2FwID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIG9mZnNldCA9IGxlbmd0aCB8IDBcbiAgICBsZW5ndGggPSBzd2FwXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IEJ1ZmZlci5fYXVnbWVudCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47IGkrKykge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld0J1Zi5sZW5ndGgpIG5ld0J1Zi5wYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdidWZmZXIgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0Ll9zZXQodGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLCB0YXJnZXRTdGFydClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gZmlsbCh2YWx1ZSwgc3RhcnQ9MCwgZW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDBcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aFxuXG4gIGlmIChlbmQgPCBzdGFydCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCA8IHN0YXJ0JylcblxuICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gdmFsdWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gdXRmOFRvQnl0ZXModmFsdWUudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuXG4gKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoKSB7XG4gIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgYnVmW2ldID0gdGhpc1tpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1Zi5idWZmZXJcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICB9XG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZVxuXG4vKipcbiAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHNcbiAqL1xuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gX2F1Z21lbnQgKGFycikge1xuICBhcnIuY29uc3RydWN0b3IgPSBCdWZmZXJcbiAgYXJyLl9pc0J1ZmZlciA9IHRydWVcblxuICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBVaW50OEFycmF5IHNldCBtZXRob2QgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGFyci5fc2V0ID0gYXJyLnNldFxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgYXJyLmdldCA9IEJQLmdldFxuICBhcnIuc2V0ID0gQlAuc2V0XG5cbiAgYXJyLndyaXRlID0gQlAud3JpdGVcbiAgYXJyLnRvU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvTG9jYWxlU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvSlNPTiA9IEJQLnRvSlNPTlxuICBhcnIuZXF1YWxzID0gQlAuZXF1YWxzXG4gIGFyci5jb21wYXJlID0gQlAuY29tcGFyZVxuICBhcnIuaW5kZXhPZiA9IEJQLmluZGV4T2ZcbiAgYXJyLmNvcHkgPSBCUC5jb3B5XG4gIGFyci5zbGljZSA9IEJQLnNsaWNlXG4gIGFyci5yZWFkVUludExFID0gQlAucmVhZFVJbnRMRVxuICBhcnIucmVhZFVJbnRCRSA9IEJQLnJlYWRVSW50QkVcbiAgYXJyLnJlYWRVSW50OCA9IEJQLnJlYWRVSW50OFxuICBhcnIucmVhZFVJbnQxNkxFID0gQlAucmVhZFVJbnQxNkxFXG4gIGFyci5yZWFkVUludDE2QkUgPSBCUC5yZWFkVUludDE2QkVcbiAgYXJyLnJlYWRVSW50MzJMRSA9IEJQLnJlYWRVSW50MzJMRVxuICBhcnIucmVhZFVJbnQzMkJFID0gQlAucmVhZFVJbnQzMkJFXG4gIGFyci5yZWFkSW50TEUgPSBCUC5yZWFkSW50TEVcbiAgYXJyLnJlYWRJbnRCRSA9IEJQLnJlYWRJbnRCRVxuICBhcnIucmVhZEludDggPSBCUC5yZWFkSW50OFxuICBhcnIucmVhZEludDE2TEUgPSBCUC5yZWFkSW50MTZMRVxuICBhcnIucmVhZEludDE2QkUgPSBCUC5yZWFkSW50MTZCRVxuICBhcnIucmVhZEludDMyTEUgPSBCUC5yZWFkSW50MzJMRVxuICBhcnIucmVhZEludDMyQkUgPSBCUC5yZWFkSW50MzJCRVxuICBhcnIucmVhZEZsb2F0TEUgPSBCUC5yZWFkRmxvYXRMRVxuICBhcnIucmVhZEZsb2F0QkUgPSBCUC5yZWFkRmxvYXRCRVxuICBhcnIucmVhZERvdWJsZUxFID0gQlAucmVhZERvdWJsZUxFXG4gIGFyci5yZWFkRG91YmxlQkUgPSBCUC5yZWFkRG91YmxlQkVcbiAgYXJyLndyaXRlVUludDggPSBCUC53cml0ZVVJbnQ4XG4gIGFyci53cml0ZVVJbnRMRSA9IEJQLndyaXRlVUludExFXG4gIGFyci53cml0ZVVJbnRCRSA9IEJQLndyaXRlVUludEJFXG4gIGFyci53cml0ZVVJbnQxNkxFID0gQlAud3JpdGVVSW50MTZMRVxuICBhcnIud3JpdGVVSW50MTZCRSA9IEJQLndyaXRlVUludDE2QkVcbiAgYXJyLndyaXRlVUludDMyTEUgPSBCUC53cml0ZVVJbnQzMkxFXG4gIGFyci53cml0ZVVJbnQzMkJFID0gQlAud3JpdGVVSW50MzJCRVxuICBhcnIud3JpdGVJbnRMRSA9IEJQLndyaXRlSW50TEVcbiAgYXJyLndyaXRlSW50QkUgPSBCUC53cml0ZUludEJFXG4gIGFyci53cml0ZUludDggPSBCUC53cml0ZUludDhcbiAgYXJyLndyaXRlSW50MTZMRSA9IEJQLndyaXRlSW50MTZMRVxuICBhcnIud3JpdGVJbnQxNkJFID0gQlAud3JpdGVJbnQxNkJFXG4gIGFyci53cml0ZUludDMyTEUgPSBCUC53cml0ZUludDMyTEVcbiAgYXJyLndyaXRlSW50MzJCRSA9IEJQLndyaXRlSW50MzJCRVxuICBhcnIud3JpdGVGbG9hdExFID0gQlAud3JpdGVGbG9hdExFXG4gIGFyci53cml0ZUZsb2F0QkUgPSBCUC53cml0ZUZsb2F0QkVcbiAgYXJyLndyaXRlRG91YmxlTEUgPSBCUC53cml0ZURvdWJsZUxFXG4gIGFyci53cml0ZURvdWJsZUJFID0gQlAud3JpdGVEb3VibGVCRVxuICBhcnIuZmlsbCA9IEJQLmZpbGxcbiAgYXJyLmluc3BlY3QgPSBCUC5pbnNwZWN0XG4gIGFyci50b0FycmF5QnVmZmVyID0gQlAudG9BcnJheUJ1ZmZlclxuXG4gIHJldHVybiBhcnJcbn1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWlkV1ptWlhJdmFXNWtaWGd1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpRmNiaUFxSUZSb1pTQmlkV1ptWlhJZ2JXOWtkV3hsSUdaeWIyMGdibTlrWlM1cWN5d2dabTl5SUhSb1pTQmljbTkzYzJWeUxseHVJQ3BjYmlBcUlFQmhkWFJvYjNJZ0lDQkdaWEp2YzNNZ1FXSnZkV3RvWVdScGFtVm9JRHhtWlhKdmMzTkFabVZ5YjNOekxtOXlaejRnUEdoMGRIQTZMeTltWlhKdmMzTXViM0puUGx4dUlDb2dRR3hwWTJWdWMyVWdJRTFKVkZ4dUlDb3ZYRzR2S2lCbGMyeHBiblF0WkdsellXSnNaU0J1Ynkxd2NtOTBieUFxTDF4dVhHNG5kWE5sSUhOMGNtbGpkQ2RjYmx4dWRtRnlJR0poYzJVMk5DQTlJSEpsY1hWcGNtVW9KMkpoYzJVMk5DMXFjeWNwWEc1MllYSWdhV1ZsWlRjMU5DQTlJSEpsY1hWcGNtVW9KMmxsWldVM05UUW5LVnh1ZG1GeUlHbHpRWEp5WVhrZ1BTQnlaWEYxYVhKbEtDZHBjMkZ5Y21GNUp5bGNibHh1Wlhod2IzSjBjeTVDZFdabVpYSWdQU0JDZFdabVpYSmNibVY0Y0c5eWRITXVVMnh2ZDBKMVptWmxjaUE5SUZOc2IzZENkV1ptWlhKY2JtVjRjRzl5ZEhNdVNVNVRVRVZEVkY5TlFWaGZRbGxVUlZNZ1BTQTFNRnh1UW5WbVptVnlMbkJ2YjJ4VGFYcGxJRDBnT0RFNU1pQXZMeUJ1YjNRZ2RYTmxaQ0JpZVNCMGFHbHpJR2x0Y0d4bGJXVnVkR0YwYVc5dVhHNWNiblpoY2lCeWIyOTBVR0Z5Wlc1MElEMGdlMzFjYmx4dUx5b3FYRzRnS2lCSlppQmdRblZtWm1WeUxsUlpVRVZFWDBGU1VrRlpYMU5WVUZCUFVsUmdPbHh1SUNvZ0lDQTlQVDBnZEhKMVpTQWdJQ0JWYzJVZ1ZXbHVkRGhCY25KaGVTQnBiWEJzWlcxbGJuUmhkR2x2YmlBb1ptRnpkR1Z6ZENsY2JpQXFJQ0FnUFQwOUlHWmhiSE5sSUNBZ1ZYTmxJRTlpYW1WamRDQnBiWEJzWlcxbGJuUmhkR2x2YmlBb2JXOXpkQ0JqYjIxd1lYUnBZbXhsTENCbGRtVnVJRWxGTmlsY2JpQXFYRzRnS2lCQ2NtOTNjMlZ5Y3lCMGFHRjBJSE4xY0hCdmNuUWdkSGx3WldRZ1lYSnlZWGx6SUdGeVpTQkpSU0F4TUNzc0lFWnBjbVZtYjNnZ05Dc3NJRU5vY205dFpTQTNLeXdnVTJGbVlYSnBJRFV1TVNzc1hHNGdLaUJQY0dWeVlTQXhNUzQyS3l3Z2FVOVRJRFF1TWlzdVhHNGdLbHh1SUNvZ1JIVmxJSFJ2SUhaaGNtbHZkWE1nWW5KdmQzTmxjaUJpZFdkekxDQnpiMjFsZEdsdFpYTWdkR2hsSUU5aWFtVmpkQ0JwYlhCc1pXMWxiblJoZEdsdmJpQjNhV3hzSUdKbElIVnpaV1FnWlhabGJseHVJQ29nZDJobGJpQjBhR1VnWW5KdmQzTmxjaUJ6ZFhCd2IzSjBjeUIwZVhCbFpDQmhjbkpoZVhNdVhHNGdLbHh1SUNvZ1RtOTBaVHBjYmlBcVhHNGdLaUFnSUMwZ1JtbHlaV1p2ZUNBMExUSTVJR3hoWTJ0eklITjFjSEJ2Y25RZ1ptOXlJR0ZrWkdsdVp5QnVaWGNnY0hKdmNHVnlkR2xsY3lCMGJ5QmdWV2x1ZERoQmNuSmhlV0FnYVc1emRHRnVZMlZ6TEZ4dUlDb2dJQ0FnSUZObFpUb2dhSFIwY0hNNkx5OWlkV2Q2YVd4c1lTNXRiM3BwYkd4aExtOXlaeTl6YUc5M1gySjFaeTVqWjJrL2FXUTlOamsxTkRNNExseHVJQ3BjYmlBcUlDQWdMU0JUWVdaaGNta2dOUzAzSUd4aFkydHpJSE4xY0hCdmNuUWdabTl5SUdOb1lXNW5hVzVuSUhSb1pTQmdUMkpxWldOMExuQnliM1J2ZEhsd1pTNWpiMjV6ZEhKMVkzUnZjbUFnY0hKdmNHVnlkSGxjYmlBcUlDQWdJQ0J2YmlCdlltcGxZM1J6TGx4dUlDcGNiaUFxSUNBZ0xTQkRhSEp2YldVZ09TMHhNQ0JwY3lCdGFYTnphVzVuSUhSb1pTQmdWSGx3WldSQmNuSmhlUzV3Y205MGIzUjVjR1V1YzNWaVlYSnlZWGxnSUdaMWJtTjBhVzl1TGx4dUlDcGNiaUFxSUNBZ0xTQkpSVEV3SUdoaGN5QmhJR0p5YjJ0bGJpQmdWSGx3WldSQmNuSmhlUzV3Y205MGIzUjVjR1V1YzNWaVlYSnlZWGxnSUdaMWJtTjBhVzl1SUhkb2FXTm9JSEpsZEhWeWJuTWdZWEp5WVhseklHOW1YRzRnS2lBZ0lDQWdhVzVqYjNKeVpXTjBJR3hsYm1kMGFDQnBiaUJ6YjIxbElITnBkSFZoZEdsdmJuTXVYRzVjYmlBcUlGZGxJR1JsZEdWamRDQjBhR1Z6WlNCaWRXZG5lU0JpY205M2MyVnljeUJoYm1RZ2MyVjBJR0JDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWR0FnZEc4Z1lHWmhiSE5sWUNCemJ5QjBhR1Y1WEc0Z0tpQm5aWFFnZEdobElFOWlhbVZqZENCcGJYQnNaVzFsYm5SaGRHbHZiaXdnZDJocFkyZ2dhWE1nYzJ4dmQyVnlJR0oxZENCaVpXaGhkbVZ6SUdOdmNuSmxZM1JzZVM1Y2JpQXFMMXh1UW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFnUFNCbmJHOWlZV3d1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNBaFBUMGdkVzVrWldacGJtVmtYRzRnSUQ4Z1oyeHZZbUZzTGxSWlVFVkVYMEZTVWtGWlgxTlZVRkJQVWxSY2JpQWdPaUIwZVhCbFpFRnljbUY1VTNWd2NHOXlkQ2dwWEc1Y2JtWjFibU4wYVc5dUlIUjVjR1ZrUVhKeVlYbFRkWEJ3YjNKMElDZ3BJSHRjYmlBZ1puVnVZM1JwYjI0Z1FtRnlJQ2dwSUh0OVhHNGdJSFJ5ZVNCN1hHNGdJQ0FnZG1GeUlHRnljaUE5SUc1bGR5QlZhVzUwT0VGeWNtRjVLREVwWEc0Z0lDQWdZWEp5TG1admJ5QTlJR1oxYm1OMGFXOXVJQ2dwSUhzZ2NtVjBkWEp1SURReUlIMWNiaUFnSUNCaGNuSXVZMjl1YzNSeWRXTjBiM0lnUFNCQ1lYSmNiaUFnSUNCeVpYUjFjbTRnWVhKeUxtWnZieWdwSUQwOVBTQTBNaUFtSmlBdkx5QjBlWEJsWkNCaGNuSmhlU0JwYm5OMFlXNWpaWE1nWTJGdUlHSmxJR0YxWjIxbGJuUmxaRnh1SUNBZ0lDQWdJQ0JoY25JdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUVKaGNpQW1KaUF2THlCamIyNXpkSEoxWTNSdmNpQmpZVzRnWW1VZ2MyVjBYRzRnSUNBZ0lDQWdJSFI1Y0dWdlppQmhjbkl1YzNWaVlYSnlZWGtnUFQwOUlDZG1kVzVqZEdsdmJpY2dKaVlnTHk4Z1kyaHliMjFsSURrdE1UQWdiR0ZqYXlCZ2MzVmlZWEp5WVhsZ1hHNGdJQ0FnSUNBZ0lHRnljaTV6ZFdKaGNuSmhlU2d4TENBeEtTNWllWFJsVEdWdVozUm9JRDA5UFNBd0lDOHZJR2xsTVRBZ2FHRnpJR0p5YjJ0bGJpQmdjM1ZpWVhKeVlYbGdYRzRnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNCeVpYUjFjbTRnWm1Gc2MyVmNiaUFnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJyVFdGNFRHVnVaM1JvSUNncElIdGNiaUFnY21WMGRYSnVJRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVYRzRnSUNBZ1B5QXdlRGRtWm1abVptWm1YRzRnSUNBZ09pQXdlRE5tWm1abVptWm1YRzU5WEc1Y2JpOHFLbHh1SUNvZ1EyeGhjM002SUVKMVptWmxjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVnh1SUNwY2JpQXFJRlJvWlNCQ2RXWm1aWElnWTI5dWMzUnlkV04wYjNJZ2NtVjBkWEp1Y3lCcGJuTjBZVzVqWlhNZ2IyWWdZRlZwYm5RNFFYSnlZWGxnSUhSb1lYUWdZWEpsSUdGMVoyMWxiblJsWkZ4dUlDb2dkMmwwYUNCbWRXNWpkR2x2YmlCd2NtOXdaWEowYVdWeklHWnZjaUJoYkd3Z2RHaGxJRzV2WkdVZ1lFSjFabVpsY21BZ1FWQkpJR1oxYm1OMGFXOXVjeTRnVjJVZ2RYTmxYRzRnS2lCZ1ZXbHVkRGhCY25KaGVXQWdjMjhnZEdoaGRDQnpjWFZoY21VZ1luSmhZMnRsZENCdWIzUmhkR2x2YmlCM2IzSnJjeUJoY3lCbGVIQmxZM1JsWkNBdExTQnBkQ0J5WlhSMWNtNXpYRzRnS2lCaElITnBibWRzWlNCdlkzUmxkQzVjYmlBcVhHNGdLaUJDZVNCaGRXZHRaVzUwYVc1bklIUm9aU0JwYm5OMFlXNWpaWE1zSUhkbElHTmhiaUJoZG05cFpDQnRiMlJwWm5scGJtY2dkR2hsSUdCVmFXNTBPRUZ5Y21GNVlGeHVJQ29nY0hKdmRHOTBlWEJsTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJDZFdabVpYSWdLR0Z5WnlrZ2UxeHVJQ0JwWmlBb0lTaDBhR2x6SUdsdWMzUmhibU5sYjJZZ1FuVm1abVZ5S1NrZ2UxeHVJQ0FnSUM4dklFRjJiMmxrSUdkdmFXNW5JSFJvY205MVoyZ2dZVzRnUVhKbmRXMWxiblJ6UVdSaGNIUnZjbFJ5WVcxd2IyeHBibVVnYVc0Z2RHaGxJR052YlcxdmJpQmpZWE5sTGx4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01Ta2djbVYwZFhKdUlHNWxkeUJDZFdabVpYSW9ZWEpuTENCaGNtZDFiV1Z1ZEhOYk1WMHBYRzRnSUNBZ2NtVjBkWEp1SUc1bGR5QkNkV1ptWlhJb1lYSm5LVnh1SUNCOVhHNWNiaUFnYVdZZ0tDRkNkV1ptWlhJdVZGbFFSVVJmUVZKU1FWbGZVMVZRVUU5U1ZDa2dlMXh1SUNBZ0lIUm9hWE11YkdWdVozUm9JRDBnTUZ4dUlDQWdJSFJvYVhNdWNHRnlaVzUwSUQwZ2RXNWtaV1pwYm1Wa1hHNGdJSDFjYmx4dUlDQXZMeUJEYjIxdGIyNGdZMkZ6WlM1Y2JpQWdhV1lnS0hSNWNHVnZaaUJoY21jZ1BUMDlJQ2R1ZFcxaVpYSW5LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWnliMjFPZFcxaVpYSW9kR2hwY3l3Z1lYSm5LVnh1SUNCOVhHNWNiaUFnTHk4Z1UyeHBaMmgwYkhrZ2JHVnpjeUJqYjIxdGIyNGdZMkZ6WlM1Y2JpQWdhV1lnS0hSNWNHVnZaaUJoY21jZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWnliMjFUZEhKcGJtY29kR2hwY3l3Z1lYSm5MQ0JoY21kMWJXVnVkSE11YkdWdVozUm9JRDRnTVNBL0lHRnlaM1Z0Wlc1MGMxc3hYU0E2SUNkMWRHWTRKeWxjYmlBZ2ZWeHVYRzRnSUM4dklGVnVkWE4xWVd3dVhHNGdJSEpsZEhWeWJpQm1jbTl0VDJKcVpXTjBLSFJvYVhNc0lHRnlaeWxjYm4xY2JseHVablZ1WTNScGIyNGdabkp2YlU1MWJXSmxjaUFvZEdoaGRDd2diR1Z1WjNSb0tTQjdYRzRnSUhSb1lYUWdQU0JoYkd4dlkyRjBaU2gwYUdGMExDQnNaVzVuZEdnZ1BDQXdJRDhnTUNBNklHTm9aV05yWldRb2JHVnVaM1JvS1NCOElEQXBYRzRnSUdsbUlDZ2hRblZtWm1WeUxsUlpVRVZFWDBGU1VrRlpYMU5WVUZCUFVsUXBJSHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMGFHRjBXMmxkSUQwZ01GeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnZEdoaGRGeHVmVnh1WEc1bWRXNWpkR2x2YmlCbWNtOXRVM1J5YVc1bklDaDBhR0YwTENCemRISnBibWNzSUdWdVkyOWthVzVuS1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnWlc1amIyUnBibWNnSVQwOUlDZHpkSEpwYm1jbklIeDhJR1Z1WTI5a2FXNW5JRDA5UFNBbkp5a2daVzVqYjJScGJtY2dQU0FuZFhSbU9DZGNibHh1SUNBdkx5QkJjM04xYlhCMGFXOXVPaUJpZVhSbFRHVnVaM1JvS0NrZ2NtVjBkWEp1SUhaaGJIVmxJR2x6SUdGc2QyRjVjeUE4SUd0TllYaE1aVzVuZEdndVhHNGdJSFpoY2lCc1pXNW5kR2dnUFNCaWVYUmxUR1Z1WjNSb0tITjBjbWx1Wnl3Z1pXNWpiMlJwYm1jcElId2dNRnh1SUNCMGFHRjBJRDBnWVd4c2IyTmhkR1VvZEdoaGRDd2diR1Z1WjNSb0tWeHVYRzRnSUhSb1lYUXVkM0pwZEdVb2MzUnlhVzVuTENCbGJtTnZaR2x1WnlsY2JpQWdjbVYwZFhKdUlIUm9ZWFJjYm4xY2JseHVablZ1WTNScGIyNGdabkp2YlU5aWFtVmpkQ0FvZEdoaGRDd2diMkpxWldOMEtTQjdYRzRnSUdsbUlDaENkV1ptWlhJdWFYTkNkV1ptWlhJb2IySnFaV04wS1NrZ2NtVjBkWEp1SUdaeWIyMUNkV1ptWlhJb2RHaGhkQ3dnYjJKcVpXTjBLVnh1WEc0Z0lHbG1JQ2hwYzBGeWNtRjVLRzlpYW1WamRDa3BJSEpsZEhWeWJpQm1jbTl0UVhKeVlYa29kR2hoZEN3Z2IySnFaV04wS1Z4dVhHNGdJR2xtSUNodlltcGxZM1FnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjIxMWMzUWdjM1JoY25RZ2QybDBhQ0J1ZFcxaVpYSXNJR0oxWm1abGNpd2dZWEp5WVhrZ2IzSWdjM1J5YVc1bkp5bGNiaUFnZlZ4dVhHNGdJR2xtSUNoMGVYQmxiMllnUVhKeVlYbENkV1ptWlhJZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNGdJQ0FnYVdZZ0tHOWlhbVZqZEM1aWRXWm1aWElnYVc1emRHRnVZMlZ2WmlCQmNuSmhlVUoxWm1abGNpa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHWnliMjFVZVhCbFpFRnljbUY1S0hSb1lYUXNJRzlpYW1WamRDbGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHOWlhbVZqZENCcGJuTjBZVzVqWlc5bUlFRnljbUY1UW5WbVptVnlLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabkp2YlVGeWNtRjVRblZtWm1WeUtIUm9ZWFFzSUc5aWFtVmpkQ2xjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JwWmlBb2IySnFaV04wTG14bGJtZDBhQ2tnY21WMGRYSnVJR1p5YjIxQmNuSmhlVXhwYTJVb2RHaGhkQ3dnYjJKcVpXTjBLVnh1WEc0Z0lISmxkSFZ5YmlCbWNtOXRTbk52Yms5aWFtVmpkQ2gwYUdGMExDQnZZbXBsWTNRcFhHNTlYRzVjYm1aMWJtTjBhVzl1SUdaeWIyMUNkV1ptWlhJZ0tIUm9ZWFFzSUdKMVptWmxjaWtnZTF4dUlDQjJZWElnYkdWdVozUm9JRDBnWTJobFkydGxaQ2hpZFdabVpYSXViR1Z1WjNSb0tTQjhJREJjYmlBZ2RHaGhkQ0E5SUdGc2JHOWpZWFJsS0hSb1lYUXNJR3hsYm1kMGFDbGNiaUFnWW5WbVptVnlMbU52Y0hrb2RHaGhkQ3dnTUN3Z01Dd2diR1Z1WjNSb0tWeHVJQ0J5WlhSMWNtNGdkR2hoZEZ4dWZWeHVYRzVtZFc1amRHbHZiaUJtY205dFFYSnlZWGtnS0hSb1lYUXNJR0Z5Y21GNUtTQjdYRzRnSUhaaGNpQnNaVzVuZEdnZ1BTQmphR1ZqYTJWa0tHRnljbUY1TG14bGJtZDBhQ2tnZkNBd1hHNGdJSFJvWVhRZ1BTQmhiR3h2WTJGMFpTaDBhR0YwTENCc1pXNW5kR2dwWEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2diR1Z1WjNSb095QnBJQ3M5SURFcElIdGNiaUFnSUNCMGFHRjBXMmxkSUQwZ1lYSnlZWGxiYVYwZ0ppQXlOVFZjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkR2hoZEZ4dWZWeHVYRzR2THlCRWRYQnNhV05oZEdVZ2IyWWdabkp2YlVGeWNtRjVLQ2tnZEc4Z2EyVmxjQ0JtY205dFFYSnlZWGtvS1NCdGIyNXZiVzl5Y0docFl5NWNibVoxYm1OMGFXOXVJR1p5YjIxVWVYQmxaRUZ5Y21GNUlDaDBhR0YwTENCaGNuSmhlU2tnZTF4dUlDQjJZWElnYkdWdVozUm9JRDBnWTJobFkydGxaQ2hoY25KaGVTNXNaVzVuZEdncElId2dNRnh1SUNCMGFHRjBJRDBnWVd4c2IyTmhkR1VvZEdoaGRDd2diR1Z1WjNSb0tWeHVJQ0F2THlCVWNuVnVZMkYwYVc1bklIUm9aU0JsYkdWdFpXNTBjeUJwY3lCd2NtOWlZV0pzZVNCdWIzUWdkMmhoZENCd1pXOXdiR1VnWlhod1pXTjBJR1p5YjIwZ2RIbHdaV1JjYmlBZ0x5OGdZWEp5WVhseklIZHBkR2dnUWxsVVJWTmZVRVZTWDBWTVJVMUZUbFFnUGlBeElHSjFkQ0JwZENkeklHTnZiWEJoZEdsaWJHVWdkMmwwYUNCMGFHVWdZbVZvWVhacGIzSmNiaUFnTHk4Z2IyWWdkR2hsSUc5c1pDQkNkV1ptWlhJZ1kyOXVjM1J5ZFdOMGIzSXVYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2JHVnVaM1JvT3lCcElDczlJREVwSUh0Y2JpQWdJQ0IwYUdGMFcybGRJRDBnWVhKeVlYbGJhVjBnSmlBeU5UVmNiaUFnZlZ4dUlDQnlaWFIxY200Z2RHaGhkRnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQm1jbTl0UVhKeVlYbENkV1ptWlhJZ0tIUm9ZWFFzSUdGeWNtRjVLU0I3WEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJQzh2SUZKbGRIVnliaUJoYmlCaGRXZHRaVzUwWldRZ1lGVnBiblE0UVhKeVlYbGdJR2x1YzNSaGJtTmxMQ0JtYjNJZ1ltVnpkQ0J3WlhKbWIzSnRZVzVqWlZ4dUlDQWdJR0Z5Y21GNUxtSjVkR1ZNWlc1bmRHaGNiaUFnSUNCMGFHRjBJRDBnUW5WbVptVnlMbDloZFdkdFpXNTBLRzVsZHlCVmFXNTBPRUZ5Y21GNUtHRnljbUY1S1NsY2JpQWdmU0JsYkhObElIdGNiaUFnSUNBdkx5QkdZV3hzWW1GamF6b2dVbVYwZFhKdUlHRnVJRzlpYW1WamRDQnBibk4wWVc1alpTQnZaaUIwYUdVZ1FuVm1abVZ5SUdOc1lYTnpYRzRnSUNBZ2RHaGhkQ0E5SUdaeWIyMVVlWEJsWkVGeWNtRjVLSFJvWVhRc0lHNWxkeUJWYVc1ME9FRnljbUY1S0dGeWNtRjVLU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkR2hoZEZ4dWZWeHVYRzVtZFc1amRHbHZiaUJtY205dFFYSnlZWGxNYVd0bElDaDBhR0YwTENCaGNuSmhlU2tnZTF4dUlDQjJZWElnYkdWdVozUm9JRDBnWTJobFkydGxaQ2hoY25KaGVTNXNaVzVuZEdncElId2dNRnh1SUNCMGFHRjBJRDBnWVd4c2IyTmhkR1VvZEdoaGRDd2diR1Z1WjNSb0tWeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNBclBTQXhLU0I3WEc0Z0lDQWdkR2hoZEZ0cFhTQTlJR0Z5Y21GNVcybGRJQ1lnTWpVMVhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhSb1lYUmNibjFjYmx4dUx5OGdSR1Z6WlhKcFlXeHBlbVVnZXlCMGVYQmxPaUFuUW5WbVptVnlKeXdnWkdGMFlUb2dXekVzTWl3ekxDNHVMbDBnZlNCcGJuUnZJR0VnUW5WbVptVnlJRzlpYW1WamRDNWNiaTh2SUZKbGRIVnlibk1nWVNCNlpYSnZMV3hsYm1kMGFDQmlkV1ptWlhJZ1ptOXlJR2x1Y0hWMGN5QjBhR0YwSUdSdmJpZDBJR052Ym1admNtMGdkRzhnZEdobElITndaV011WEc1bWRXNWpkR2x2YmlCbWNtOXRTbk52Yms5aWFtVmpkQ0FvZEdoaGRDd2diMkpxWldOMEtTQjdYRzRnSUhaaGNpQmhjbkpoZVZ4dUlDQjJZWElnYkdWdVozUm9JRDBnTUZ4dVhHNGdJR2xtSUNodlltcGxZM1F1ZEhsd1pTQTlQVDBnSjBKMVptWmxjaWNnSmlZZ2FYTkJjbkpoZVNodlltcGxZM1F1WkdGMFlTa3BJSHRjYmlBZ0lDQmhjbkpoZVNBOUlHOWlhbVZqZEM1a1lYUmhYRzRnSUNBZ2JHVnVaM1JvSUQwZ1kyaGxZMnRsWkNoaGNuSmhlUzVzWlc1bmRHZ3BJSHdnTUZ4dUlDQjlYRzRnSUhSb1lYUWdQU0JoYkd4dlkyRjBaU2gwYUdGMExDQnNaVzVuZEdncFhHNWNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCc1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJSFJvWVhSYmFWMGdQU0JoY25KaGVWdHBYU0FtSURJMU5WeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCMGFHRjBYRzU5WEc1Y2JtbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQkNkV1ptWlhJdWNISnZkRzkwZVhCbExsOWZjSEp2ZEc5Zlh5QTlJRlZwYm5RNFFYSnlZWGt1Y0hKdmRHOTBlWEJsWEc0Z0lFSjFabVpsY2k1ZlgzQnliM1J2WDE4Z1BTQlZhVzUwT0VGeWNtRjVYRzU5SUdWc2MyVWdlMXh1SUNBdkx5QndjbVV0YzJWMElHWnZjaUIyWVd4MVpYTWdkR2hoZENCdFlYa2daWGhwYzNRZ2FXNGdkR2hsSUdaMWRIVnlaVnh1SUNCQ2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG14bGJtZDBhQ0E5SUhWdVpHVm1hVzVsWkZ4dUlDQkNkV1ptWlhJdWNISnZkRzkwZVhCbExuQmhjbVZ1ZENBOUlIVnVaR1ZtYVc1bFpGeHVmVnh1WEc1bWRXNWpkR2x2YmlCaGJHeHZZMkYwWlNBb2RHaGhkQ3dnYkdWdVozUm9LU0I3WEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJQzh2SUZKbGRIVnliaUJoYmlCaGRXZHRaVzUwWldRZ1lGVnBiblE0UVhKeVlYbGdJR2x1YzNSaGJtTmxMQ0JtYjNJZ1ltVnpkQ0J3WlhKbWIzSnRZVzVqWlZ4dUlDQWdJSFJvWVhRZ1BTQkNkV1ptWlhJdVgyRjFaMjFsYm5Rb2JtVjNJRlZwYm5RNFFYSnlZWGtvYkdWdVozUm9LU2xjYmlBZ0lDQjBhR0YwTGw5ZmNISnZkRzlmWHlBOUlFSjFabVpsY2k1d2NtOTBiM1I1Y0dWY2JpQWdmU0JsYkhObElIdGNiaUFnSUNBdkx5QkdZV3hzWW1GamF6b2dVbVYwZFhKdUlHRnVJRzlpYW1WamRDQnBibk4wWVc1alpTQnZaaUIwYUdVZ1FuVm1abVZ5SUdOc1lYTnpYRzRnSUNBZ2RHaGhkQzVzWlc1bmRHZ2dQU0JzWlc1bmRHaGNiaUFnSUNCMGFHRjBMbDlwYzBKMVptWmxjaUE5SUhSeWRXVmNiaUFnZlZ4dVhHNGdJSFpoY2lCbWNtOXRVRzl2YkNBOUlHeGxibWQwYUNBaFBUMGdNQ0FtSmlCc1pXNW5kR2dnUEQwZ1FuVm1abVZ5TG5CdmIyeFRhWHBsSUQ0K1BpQXhYRzRnSUdsbUlDaG1jbTl0VUc5dmJDa2dkR2hoZEM1d1lYSmxiblFnUFNCeWIyOTBVR0Z5Wlc1MFhHNWNiaUFnY21WMGRYSnVJSFJvWVhSY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJobFkydGxaQ0FvYkdWdVozUm9LU0I3WEc0Z0lDOHZJRTV2ZEdVNklHTmhibTV2ZENCMWMyVWdZR3hsYm1kMGFDQThJR3ROWVhoTVpXNW5kR2hnSUdobGNtVWdZbVZqWVhWelpTQjBhR0YwSUdaaGFXeHpJSGRvWlc1Y2JpQWdMeThnYkdWdVozUm9JR2x6SUU1aFRpQW9kMmhwWTJnZ2FYTWdiM1JvWlhKM2FYTmxJR052WlhKalpXUWdkRzhnZW1WeWJ5NHBYRzRnSUdsbUlDaHNaVzVuZEdnZ1BqMGdhMDFoZUV4bGJtZDBhQ2dwS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0owRjBkR1Z0Y0hRZ2RHOGdZV3hzYjJOaGRHVWdRblZtWm1WeUlHeGhjbWRsY2lCMGFHRnVJRzFoZUdsdGRXMGdKeUFyWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSjNOcGVtVTZJREI0SnlBcklHdE5ZWGhNWlc1bmRHZ29LUzUwYjFOMGNtbHVaeWd4TmlrZ0t5QW5JR0o1ZEdWekp5bGNiaUFnZlZ4dUlDQnlaWFIxY200Z2JHVnVaM1JvSUh3Z01GeHVmVnh1WEc1bWRXNWpkR2x2YmlCVGJHOTNRblZtWm1WeUlDaHpkV0pxWldOMExDQmxibU52WkdsdVp5a2dlMXh1SUNCcFppQW9JU2gwYUdseklHbHVjM1JoYm1ObGIyWWdVMnh2ZDBKMVptWmxjaWtwSUhKbGRIVnliaUJ1WlhjZ1UyeHZkMEoxWm1abGNpaHpkV0pxWldOMExDQmxibU52WkdsdVp5bGNibHh1SUNCMllYSWdZblZtSUQwZ2JtVjNJRUoxWm1abGNpaHpkV0pxWldOMExDQmxibU52WkdsdVp5bGNiaUFnWkdWc1pYUmxJR0oxWmk1d1lYSmxiblJjYmlBZ2NtVjBkWEp1SUdKMVpseHVmVnh1WEc1Q2RXWm1aWEl1YVhOQ2RXWm1aWElnUFNCbWRXNWpkR2x2YmlCcGMwSjFabVpsY2lBb1lpa2dlMXh1SUNCeVpYUjFjbTRnSVNFb1lpQWhQU0J1ZFd4c0lDWW1JR0l1WDJselFuVm1abVZ5S1Z4dWZWeHVYRzVDZFdabVpYSXVZMjl0Y0dGeVpTQTlJR1oxYm1OMGFXOXVJR052YlhCaGNtVWdLR0VzSUdJcElIdGNiaUFnYVdZZ0tDRkNkV1ptWlhJdWFYTkNkV1ptWlhJb1lTa2dmSHdnSVVKMVptWmxjaTVwYzBKMVptWmxjaWhpS1NrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0owRnlaM1Z0Wlc1MGN5QnRkWE4wSUdKbElFSjFabVpsY25NbktWeHVJQ0I5WEc1Y2JpQWdhV1lnS0dFZ1BUMDlJR0lwSUhKbGRIVnliaUF3WEc1Y2JpQWdkbUZ5SUhnZ1BTQmhMbXhsYm1kMGFGeHVJQ0IyWVhJZ2VTQTlJR0l1YkdWdVozUm9YRzVjYmlBZ2RtRnlJR2tnUFNBd1hHNGdJSFpoY2lCc1pXNGdQU0JOWVhSb0xtMXBiaWg0TENCNUtWeHVJQ0IzYUdsc1pTQW9hU0E4SUd4bGJpa2dlMXh1SUNBZ0lHbG1JQ2hoVzJsZElDRTlQU0JpVzJsZEtTQmljbVZoYTF4dVhHNGdJQ0FnS3l0cFhHNGdJSDFjYmx4dUlDQnBaaUFvYVNBaFBUMGdiR1Z1S1NCN1hHNGdJQ0FnZUNBOUlHRmJhVjFjYmlBZ0lDQjVJRDBnWWx0cFhWeHVJQ0I5WEc1Y2JpQWdhV1lnS0hnZ1BDQjVLU0J5WlhSMWNtNGdMVEZjYmlBZ2FXWWdLSGtnUENCNEtTQnlaWFIxY200Z01WeHVJQ0J5WlhSMWNtNGdNRnh1ZlZ4dVhHNUNkV1ptWlhJdWFYTkZibU52WkdsdVp5QTlJR1oxYm1OMGFXOXVJR2x6Ulc1amIyUnBibWNnS0dWdVkyOWthVzVuS1NCN1hHNGdJSE4zYVhSamFDQW9VM1J5YVc1bktHVnVZMjlrYVc1bktTNTBiMHh2ZDJWeVEyRnpaU2dwS1NCN1hHNGdJQ0FnWTJGelpTQW5hR1Y0SnpwY2JpQWdJQ0JqWVhObElDZDFkR1k0SnpwY2JpQWdJQ0JqWVhObElDZDFkR1l0T0NjNlhHNGdJQ0FnWTJGelpTQW5ZWE5qYVdrbk9seHVJQ0FnSUdOaGMyVWdKMkpwYm1GeWVTYzZYRzRnSUNBZ1kyRnpaU0FuWW1GelpUWTBKenBjYmlBZ0lDQmpZWE5sSUNkeVlYY25PbHh1SUNBZ0lHTmhjMlVnSjNWamN6SW5PbHh1SUNBZ0lHTmhjMlVnSjNWamN5MHlKenBjYmlBZ0lDQmpZWE5sSUNkMWRHWXhObXhsSnpwY2JpQWdJQ0JqWVhObElDZDFkR1l0TVRac1pTYzZYRzRnSUNBZ0lDQnlaWFIxY200Z2RISjFaVnh1SUNBZ0lHUmxabUYxYkhRNlhHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVmNiaUFnZlZ4dWZWeHVYRzVDZFdabVpYSXVZMjl1WTJGMElEMGdablZ1WTNScGIyNGdZMjl1WTJGMElDaHNhWE4wTENCc1pXNW5kR2dwSUh0Y2JpQWdhV1lnS0NGcGMwRnljbUY1S0d4cGMzUXBLU0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0Nkc2FYTjBJR0Z5WjNWdFpXNTBJRzExYzNRZ1ltVWdZVzRnUVhKeVlYa2diMllnUW5WbVptVnljeTRuS1Z4dVhHNGdJR2xtSUNoc2FYTjBMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ1WlhjZ1FuVm1abVZ5S0RBcFhHNGdJSDFjYmx4dUlDQjJZWElnYVZ4dUlDQnBaaUFvYkdWdVozUm9JRDA5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNCc1pXNW5kR2dnUFNBd1hHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJR3hwYzNRdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR3hsYm1kMGFDQXJQU0JzYVhOMFcybGRMbXhsYm1kMGFGeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIWmhjaUJpZFdZZ1BTQnVaWGNnUW5WbVptVnlLR3hsYm1kMGFDbGNiaUFnZG1GeUlIQnZjeUE5SURCY2JpQWdabTl5SUNocElEMGdNRHNnYVNBOElHeHBjM1F1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCMllYSWdhWFJsYlNBOUlHeHBjM1JiYVYxY2JpQWdJQ0JwZEdWdExtTnZjSGtvWW5WbUxDQndiM01wWEc0Z0lDQWdjRzl6SUNzOUlHbDBaVzB1YkdWdVozUm9YRzRnSUgxY2JpQWdjbVYwZFhKdUlHSjFabHh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmllWFJsVEdWdVozUm9JQ2h6ZEhKcGJtY3NJR1Z1WTI5a2FXNW5LU0I3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdjM1J5YVc1bklDRTlQU0FuYzNSeWFXNW5KeWtnYzNSeWFXNW5JRDBnSnljZ0t5QnpkSEpwYm1kY2JseHVJQ0IyWVhJZ2JHVnVJRDBnYzNSeWFXNW5MbXhsYm1kMGFGeHVJQ0JwWmlBb2JHVnVJRDA5UFNBd0tTQnlaWFIxY200Z01GeHVYRzRnSUM4dklGVnpaU0JoSUdadmNpQnNiMjl3SUhSdklHRjJiMmxrSUhKbFkzVnljMmx2Ymx4dUlDQjJZWElnYkc5M1pYSmxaRU5oYzJVZ1BTQm1ZV3h6WlZ4dUlDQm1iM0lnS0RzN0tTQjdYRzRnSUNBZ2MzZHBkR05vSUNobGJtTnZaR2x1WnlrZ2UxeHVJQ0FnSUNBZ1kyRnpaU0FuWVhOamFXa25PbHh1SUNBZ0lDQWdZMkZ6WlNBblltbHVZWEo1SnpwY2JpQWdJQ0FnSUM4dklFUmxjSEpsWTJGMFpXUmNiaUFnSUNBZ0lHTmhjMlVnSjNKaGR5YzZYRzRnSUNBZ0lDQmpZWE5sSUNkeVlYZHpKenBjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR3hsYmx4dUlDQWdJQ0FnWTJGelpTQW5kWFJtT0NjNlhHNGdJQ0FnSUNCallYTmxJQ2QxZEdZdE9DYzZYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR1k0Vkc5Q2VYUmxjeWh6ZEhKcGJtY3BMbXhsYm1kMGFGeHVJQ0FnSUNBZ1kyRnpaU0FuZFdOek1pYzZYRzRnSUNBZ0lDQmpZWE5sSUNkMVkzTXRNaWM2WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1l4Tm14bEp6cGNiaUFnSUNBZ0lHTmhjMlVnSjNWMFppMHhObXhsSnpwY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4bGJpQXFJREpjYmlBZ0lDQWdJR05oYzJVZ0oyaGxlQ2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzWlc0Z1BqNCtJREZjYmlBZ0lDQWdJR05oYzJVZ0oySmhjMlUyTkNjNlhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaVlYTmxOalJVYjBKNWRHVnpLSE4wY21sdVp5a3ViR1Z1WjNSb1hHNGdJQ0FnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnSUNCcFppQW9iRzkzWlhKbFpFTmhjMlVwSUhKbGRIVnliaUIxZEdZNFZHOUNlWFJsY3loemRISnBibWNwTG14bGJtZDBhQ0F2THlCaGMzTjFiV1VnZFhSbU9GeHVJQ0FnSUNBZ0lDQmxibU52WkdsdVp5QTlJQ2duSnlBcklHVnVZMjlrYVc1bktTNTBiMHh2ZDJWeVEyRnpaU2dwWEc0Z0lDQWdJQ0FnSUd4dmQyVnlaV1JEWVhObElEMGdkSEoxWlZ4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1UW5WbVptVnlMbUo1ZEdWTVpXNW5kR2dnUFNCaWVYUmxUR1Z1WjNSb1hHNWNibVoxYm1OMGFXOXVJSE5zYjNkVWIxTjBjbWx1WnlBb1pXNWpiMlJwYm1jc0lITjBZWEowTENCbGJtUXBJSHRjYmlBZ2RtRnlJR3h2ZDJWeVpXUkRZWE5sSUQwZ1ptRnNjMlZjYmx4dUlDQnpkR0Z5ZENBOUlITjBZWEowSUh3Z01GeHVJQ0JsYm1RZ1BTQmxibVFnUFQwOUlIVnVaR1ZtYVc1bFpDQjhmQ0JsYm1RZ1BUMDlJRWx1Wm1sdWFYUjVJRDhnZEdocGN5NXNaVzVuZEdnZ09pQmxibVFnZkNBd1hHNWNiaUFnYVdZZ0tDRmxibU52WkdsdVp5a2daVzVqYjJScGJtY2dQU0FuZFhSbU9DZGNiaUFnYVdZZ0tITjBZWEowSUR3Z01Da2djM1JoY25RZ1BTQXdYRzRnSUdsbUlDaGxibVFnUGlCMGFHbHpMbXhsYm1kMGFDa2daVzVrSUQwZ2RHaHBjeTVzWlc1bmRHaGNiaUFnYVdZZ0tHVnVaQ0E4UFNCemRHRnlkQ2tnY21WMGRYSnVJQ2NuWEc1Y2JpQWdkMmhwYkdVZ0tIUnlkV1VwSUh0Y2JpQWdJQ0J6ZDJsMFkyZ2dLR1Z1WTI5a2FXNW5LU0I3WEc0Z0lDQWdJQ0JqWVhObElDZG9aWGduT2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYUdWNFUyeHBZMlVvZEdocGN5d2djM1JoY25Rc0lHVnVaQ2xjYmx4dUlDQWdJQ0FnWTJGelpTQW5kWFJtT0NjNlhHNGdJQ0FnSUNCallYTmxJQ2QxZEdZdE9DYzZYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR1k0VTJ4cFkyVW9kR2hwY3l3Z2MzUmhjblFzSUdWdVpDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBbllYTmphV2tuT2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWVhOamFXbFRiR2xqWlNoMGFHbHpMQ0J6ZEdGeWRDd2daVzVrS1Z4dVhHNGdJQ0FnSUNCallYTmxJQ2RpYVc1aGNua25PbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZbWx1WVhKNVUyeHBZMlVvZEdocGN5d2djM1JoY25Rc0lHVnVaQ2xjYmx4dUlDQWdJQ0FnWTJGelpTQW5ZbUZ6WlRZMEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHSmhjMlUyTkZOc2FXTmxLSFJvYVhNc0lITjBZWEowTENCbGJtUXBYRzVjYmlBZ0lDQWdJR05oYzJVZ0ozVmpjekluT2x4dUlDQWdJQ0FnWTJGelpTQW5kV056TFRJbk9seHVJQ0FnSUNBZ1kyRnpaU0FuZFhSbU1UWnNaU2M2WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1l0TVRac1pTYzZYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR1l4Tm14bFUyeHBZMlVvZEdocGN5d2djM1JoY25Rc0lHVnVaQ2xjYmx4dUlDQWdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJQ0FnYVdZZ0tHeHZkMlZ5WldSRFlYTmxLU0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkVmJtdHViM2R1SUdWdVkyOWthVzVuT2lBbklDc2daVzVqYjJScGJtY3BYRzRnSUNBZ0lDQWdJR1Z1WTI5a2FXNW5JRDBnS0dWdVkyOWthVzVuSUNzZ0p5Y3BMblJ2VEc5M1pYSkRZWE5sS0NsY2JpQWdJQ0FnSUNBZ2JHOTNaWEpsWkVOaGMyVWdQU0IwY25WbFhHNGdJQ0FnZlZ4dUlDQjlYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jZ1BTQm1kVzVqZEdsdmJpQjBiMU4wY21sdVp5QW9LU0I3WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0IwYUdsekxteGxibWQwYUNCOElEQmNiaUFnYVdZZ0tHeGxibWQwYUNBOVBUMGdNQ2tnY21WMGRYSnVJQ2NuWEc0Z0lHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBd0tTQnlaWFIxY200Z2RYUm1PRk5zYVdObEtIUm9hWE1zSURBc0lHeGxibWQwYUNsY2JpQWdjbVYwZFhKdUlITnNiM2RVYjFOMGNtbHVaeTVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1WlhGMVlXeHpJRDBnWm5WdVkzUnBiMjRnWlhGMVlXeHpJQ2hpS1NCN1hHNGdJR2xtSUNnaFFuVm1abVZ5TG1selFuVm1abVZ5S0dJcEtTQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RCY21kMWJXVnVkQ0J0ZFhOMElHSmxJR0VnUW5WbVptVnlKeWxjYmlBZ2FXWWdLSFJvYVhNZ1BUMDlJR0lwSUhKbGRIVnliaUIwY25WbFhHNGdJSEpsZEhWeWJpQkNkV1ptWlhJdVkyOXRjR0Z5WlNoMGFHbHpMQ0JpS1NBOVBUMGdNRnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExtbHVjM0JsWTNRZ1BTQm1kVzVqZEdsdmJpQnBibk53WldOMElDZ3BJSHRjYmlBZ2RtRnlJSE4wY2lBOUlDY25YRzRnSUhaaGNpQnRZWGdnUFNCbGVIQnZjblJ6TGtsT1UxQkZRMVJmVFVGWVgwSlpWRVZUWEc0Z0lHbG1JQ2gwYUdsekxteGxibWQwYUNBK0lEQXBJSHRjYmlBZ0lDQnpkSElnUFNCMGFHbHpMblJ2VTNSeWFXNW5LQ2RvWlhnbkxDQXdMQ0J0WVhncExtMWhkR05vS0M4dWV6SjlMMmNwTG1wdmFXNG9KeUFuS1Z4dUlDQWdJR2xtSUNoMGFHbHpMbXhsYm1kMGFDQStJRzFoZUNrZ2MzUnlJQ3M5SUNjZ0xpNHVJQ2RjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdKenhDZFdabVpYSWdKeUFySUhOMGNpQXJJQ2MrSjF4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbU52YlhCaGNtVWdQU0JtZFc1amRHbHZiaUJqYjIxd1lYSmxJQ2hpS1NCN1hHNGdJR2xtSUNnaFFuVm1abVZ5TG1selFuVm1abVZ5S0dJcEtTQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RCY21kMWJXVnVkQ0J0ZFhOMElHSmxJR0VnUW5WbVptVnlKeWxjYmlBZ2FXWWdLSFJvYVhNZ1BUMDlJR0lwSUhKbGRIVnliaUF3WEc0Z0lISmxkSFZ5YmlCQ2RXWm1aWEl1WTI5dGNHRnlaU2gwYUdsekxDQmlLVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExtbHVaR1Y0VDJZZ1BTQm1kVzVqZEdsdmJpQnBibVJsZUU5bUlDaDJZV3dzSUdKNWRHVlBabVp6WlhRcElIdGNiaUFnYVdZZ0tHSjVkR1ZQWm1aelpYUWdQaUF3ZURkbVptWm1abVptS1NCaWVYUmxUMlptYzJWMElEMGdNSGczWm1abVptWm1abHh1SUNCbGJITmxJR2xtSUNoaWVYUmxUMlptYzJWMElEd2dMVEI0T0RBd01EQXdNREFwSUdKNWRHVlBabVp6WlhRZ1BTQXRNSGc0TURBd01EQXdNRnh1SUNCaWVYUmxUMlptYzJWMElENCtQU0F3WEc1Y2JpQWdhV1lnS0hSb2FYTXViR1Z1WjNSb0lEMDlQU0F3S1NCeVpYUjFjbTRnTFRGY2JpQWdhV1lnS0dKNWRHVlBabVp6WlhRZ1BqMGdkR2hwY3k1c1pXNW5kR2dwSUhKbGRIVnliaUF0TVZ4dVhHNGdJQzh2SUU1bFoyRjBhWFpsSUc5bVpuTmxkSE1nYzNSaGNuUWdabkp2YlNCMGFHVWdaVzVrSUc5bUlIUm9aU0JpZFdabVpYSmNiaUFnYVdZZ0tHSjVkR1ZQWm1aelpYUWdQQ0F3S1NCaWVYUmxUMlptYzJWMElEMGdUV0YwYUM1dFlYZ29kR2hwY3k1c1pXNW5kR2dnS3lCaWVYUmxUMlptYzJWMExDQXdLVnh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdkbUZzSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lHbG1JQ2gyWVd3dWJHVnVaM1JvSUQwOVBTQXdLU0J5WlhSMWNtNGdMVEVnTHk4Z2MzQmxZMmxoYkNCallYTmxPaUJzYjI5cmFXNW5JR1p2Y2lCbGJYQjBlU0J6ZEhKcGJtY2dZV3gzWVhseklHWmhhV3h6WEc0Z0lDQWdjbVYwZFhKdUlGTjBjbWx1Wnk1d2NtOTBiM1I1Y0dVdWFXNWtaWGhQWmk1allXeHNLSFJvYVhNc0lIWmhiQ3dnWW5sMFpVOW1abk5sZENsY2JpQWdmVnh1SUNCcFppQW9RblZtWm1WeUxtbHpRblZtWm1WeUtIWmhiQ2twSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZWEp5WVhsSmJtUmxlRTltS0hSb2FYTXNJSFpoYkN3Z1lubDBaVTltWm5ObGRDbGNiaUFnZlZ4dUlDQnBaaUFvZEhsd1pXOW1JSFpoYkNBOVBUMGdKMjUxYldKbGNpY3BJSHRjYmlBZ0lDQnBaaUFvUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFnSmlZZ1ZXbHVkRGhCY25KaGVTNXdjbTkwYjNSNWNHVXVhVzVrWlhoUFppQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUZWcGJuUTRRWEp5WVhrdWNISnZkRzkwZVhCbExtbHVaR1Y0VDJZdVkyRnNiQ2gwYUdsekxDQjJZV3dzSUdKNWRHVlBabVp6WlhRcFhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQmhjbkpoZVVsdVpHVjRUMllvZEdocGN5d2dXeUIyWVd3Z1hTd2dZbmwwWlU5bVpuTmxkQ2xjYmlBZ2ZWeHVYRzRnSUdaMWJtTjBhVzl1SUdGeWNtRjVTVzVrWlhoUFppQW9ZWEp5TENCMllXd3NJR0o1ZEdWUFptWnpaWFFwSUh0Y2JpQWdJQ0IyWVhJZ1ptOTFibVJKYm1SbGVDQTlJQzB4WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHSjVkR1ZQWm1aelpYUWdLeUJwSUR3Z1lYSnlMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9ZWEp5VzJKNWRHVlBabVp6WlhRZ0t5QnBYU0E5UFQwZ2RtRnNXMlp2ZFc1a1NXNWtaWGdnUFQwOUlDMHhJRDhnTUNBNklHa2dMU0JtYjNWdVpFbHVaR1Y0WFNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWm05MWJtUkpibVJsZUNBOVBUMGdMVEVwSUdadmRXNWtTVzVrWlhnZ1BTQnBYRzRnSUNBZ0lDQWdJR2xtSUNocElDMGdabTkxYm1SSmJtUmxlQ0FySURFZ1BUMDlJSFpoYkM1c1pXNW5kR2dwSUhKbGRIVnliaUJpZVhSbFQyWm1jMlYwSUNzZ1ptOTFibVJKYm1SbGVGeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1ptOTFibVJKYm1SbGVDQTlJQzB4WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlBdE1WeHVJQ0I5WEc1Y2JpQWdkR2h5YjNjZ2JtVjNJRlI1Y0dWRmNuSnZjaWduZG1Gc0lHMTFjM1FnWW1VZ2MzUnlhVzVuTENCdWRXMWlaWElnYjNJZ1FuVm1abVZ5SnlsY2JuMWNibHh1THk4Z1lHZGxkR0FnYVhNZ1pHVndjbVZqWVhSbFpGeHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNW5aWFFnUFNCbWRXNWpkR2x2YmlCblpYUWdLRzltWm5ObGRDa2dlMXh1SUNCamIyNXpiMnhsTG14dlp5Z25MbWRsZENncElHbHpJR1JsY0hKbFkyRjBaV1F1SUVGalkyVnpjeUIxYzJsdVp5QmhjbkpoZVNCcGJtUmxlR1Z6SUdsdWMzUmxZV1F1SnlsY2JpQWdjbVYwZFhKdUlIUm9hWE11Y21WaFpGVkpiblE0S0c5bVpuTmxkQ2xjYm4xY2JseHVMeThnWUhObGRHQWdhWE1nWkdWd2NtVmpZWFJsWkZ4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1elpYUWdQU0JtZFc1amRHbHZiaUJ6WlhRZ0tIWXNJRzltWm5ObGRDa2dlMXh1SUNCamIyNXpiMnhsTG14dlp5Z25Mbk5sZENncElHbHpJR1JsY0hKbFkyRjBaV1F1SUVGalkyVnpjeUIxYzJsdVp5QmhjbkpoZVNCcGJtUmxlR1Z6SUdsdWMzUmxZV1F1SnlsY2JpQWdjbVYwZFhKdUlIUm9hWE11ZDNKcGRHVlZTVzUwT0NoMkxDQnZabVp6WlhRcFhHNTlYRzVjYm1aMWJtTjBhVzl1SUdobGVGZHlhWFJsSUNoaWRXWXNJSE4wY21sdVp5d2diMlptYzJWMExDQnNaVzVuZEdncElIdGNiaUFnYjJabWMyVjBJRDBnVG5WdFltVnlLRzltWm5ObGRDa2dmSHdnTUZ4dUlDQjJZWElnY21WdFlXbHVhVzVuSUQwZ1luVm1MbXhsYm1kMGFDQXRJRzltWm5ObGRGeHVJQ0JwWmlBb0lXeGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGJtZDBhQ0E5SUhKbGJXRnBibWx1WjF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUd4bGJtZDBhQ0E5SUU1MWJXSmxjaWhzWlc1bmRHZ3BYRzRnSUNBZ2FXWWdLR3hsYm1kMGFDQStJSEpsYldGcGJtbHVaeWtnZTF4dUlDQWdJQ0FnYkdWdVozUm9JRDBnY21WdFlXbHVhVzVuWEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z2JYVnpkQ0JpWlNCaGJpQmxkbVZ1SUc1MWJXSmxjaUJ2WmlCa2FXZHBkSE5jYmlBZ2RtRnlJSE4wY2t4bGJpQTlJSE4wY21sdVp5NXNaVzVuZEdoY2JpQWdhV1lnS0hOMGNreGxiaUFsSURJZ0lUMDlJREFwSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduU1c1MllXeHBaQ0JvWlhnZ2MzUnlhVzVuSnlsY2JseHVJQ0JwWmlBb2JHVnVaM1JvSUQ0Z2MzUnlUR1Z1SUM4Z01pa2dlMXh1SUNBZ0lHeGxibWQwYUNBOUlITjBja3hsYmlBdklESmNiaUFnZlZ4dUlDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnZG1GeUlIQmhjbk5sWkNBOUlIQmhjbk5sU1c1MEtITjBjbWx1Wnk1emRXSnpkSElvYVNBcUlESXNJRElwTENBeE5pbGNiaUFnSUNCcFppQW9hWE5PWVU0b2NHRnljMlZrS1NrZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkSmJuWmhiR2xrSUdobGVDQnpkSEpwYm1jbktWeHVJQ0FnSUdKMVpsdHZabVp6WlhRZ0t5QnBYU0E5SUhCaGNuTmxaRnh1SUNCOVhHNGdJSEpsZEhWeWJpQnBYRzU5WEc1Y2JtWjFibU4wYVc5dUlIVjBaamhYY21sMFpTQW9ZblZtTENCemRISnBibWNzSUc5bVpuTmxkQ3dnYkdWdVozUm9LU0I3WEc0Z0lISmxkSFZ5YmlCaWJHbDBRblZtWm1WeUtIVjBaamhVYjBKNWRHVnpLSE4wY21sdVp5d2dZblZtTG14bGJtZDBhQ0F0SUc5bVpuTmxkQ2tzSUdKMVppd2diMlptYzJWMExDQnNaVzVuZEdncFhHNTlYRzVjYm1aMWJtTjBhVzl1SUdGelkybHBWM0pwZEdVZ0tHSjFaaXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDa2dlMXh1SUNCeVpYUjFjbTRnWW14cGRFSjFabVpsY2loaGMyTnBhVlJ2UW5sMFpYTW9jM1J5YVc1bktTd2dZblZtTENCdlptWnpaWFFzSUd4bGJtZDBhQ2xjYm4xY2JseHVablZ1WTNScGIyNGdZbWx1WVhKNVYzSnBkR1VnS0dKMVppd2djM1J5YVc1bkxDQnZabVp6WlhRc0lHeGxibWQwYUNrZ2UxeHVJQ0J5WlhSMWNtNGdZWE5qYVdsWGNtbDBaU2hpZFdZc0lITjBjbWx1Wnl3Z2IyWm1jMlYwTENCc1pXNW5kR2dwWEc1OVhHNWNibVoxYm1OMGFXOXVJR0poYzJVMk5GZHlhWFJsSUNoaWRXWXNJSE4wY21sdVp5d2diMlptYzJWMExDQnNaVzVuZEdncElIdGNiaUFnY21WMGRYSnVJR0pzYVhSQ2RXWm1aWElvWW1GelpUWTBWRzlDZVhSbGN5aHpkSEpwYm1jcExDQmlkV1lzSUc5bVpuTmxkQ3dnYkdWdVozUm9LVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQjFZM015VjNKcGRHVWdLR0oxWml3Z2MzUnlhVzVuTENCdlptWnpaWFFzSUd4bGJtZDBhQ2tnZTF4dUlDQnlaWFIxY200Z1lteHBkRUoxWm1abGNpaDFkR1l4Tm14bFZHOUNlWFJsY3loemRISnBibWNzSUdKMVppNXNaVzVuZEdnZ0xTQnZabVp6WlhRcExDQmlkV1lzSUc5bVpuTmxkQ3dnYkdWdVozUm9LVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsSUQwZ1puVnVZM1JwYjI0Z2QzSnBkR1VnS0hOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3NJR1Z1WTI5a2FXNW5LU0I3WEc0Z0lDOHZJRUoxWm1abGNpTjNjbWwwWlNoemRISnBibWNwWEc0Z0lHbG1JQ2h2Wm1aelpYUWdQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUdWdVkyOWthVzVuSUQwZ0ozVjBaamduWEc0Z0lDQWdiR1Z1WjNSb0lEMGdkR2hwY3k1c1pXNW5kR2hjYmlBZ0lDQnZabVp6WlhRZ1BTQXdYRzRnSUM4dklFSjFabVpsY2lOM2NtbDBaU2h6ZEhKcGJtY3NJR1Z1WTI5a2FXNW5LVnh1SUNCOUlHVnNjMlVnYVdZZ0tHeGxibWQwYUNBOVBUMGdkVzVrWldacGJtVmtJQ1ltSUhSNWNHVnZaaUJ2Wm1aelpYUWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnWlc1amIyUnBibWNnUFNCdlptWnpaWFJjYmlBZ0lDQnNaVzVuZEdnZ1BTQjBhR2x6TG14bGJtZDBhRnh1SUNBZ0lHOW1abk5sZENBOUlEQmNiaUFnTHk4Z1FuVm1abVZ5STNkeWFYUmxLSE4wY21sdVp5d2diMlptYzJWMFd5d2diR1Z1WjNSb1hWc3NJR1Z1WTI5a2FXNW5YU2xjYmlBZ2ZTQmxiSE5sSUdsbUlDaHBjMFpwYm1sMFpTaHZabVp6WlhRcEtTQjdYRzRnSUNBZ2IyWm1jMlYwSUQwZ2IyWm1jMlYwSUh3Z01GeHVJQ0FnSUdsbUlDaHBjMFpwYm1sMFpTaHNaVzVuZEdncEtTQjdYRzRnSUNBZ0lDQnNaVzVuZEdnZ1BTQnNaVzVuZEdnZ2ZDQXdYRzRnSUNBZ0lDQnBaaUFvWlc1amIyUnBibWNnUFQwOUlIVnVaR1ZtYVc1bFpDa2daVzVqYjJScGJtY2dQU0FuZFhSbU9DZGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWlc1amIyUnBibWNnUFNCc1pXNW5kR2hjYmlBZ0lDQWdJR3hsYm1kMGFDQTlJSFZ1WkdWbWFXNWxaRnh1SUNBZ0lIMWNiaUFnTHk4Z2JHVm5ZV041SUhkeWFYUmxLSE4wY21sdVp5d2daVzVqYjJScGJtY3NJRzltWm5ObGRDd2diR1Z1WjNSb0tTQXRJSEpsYlc5MlpTQnBiaUIyTUM0eE0xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lIWmhjaUJ6ZDJGd0lEMGdaVzVqYjJScGJtZGNiaUFnSUNCbGJtTnZaR2x1WnlBOUlHOW1abk5sZEZ4dUlDQWdJRzltWm5ObGRDQTlJR3hsYm1kMGFDQjhJREJjYmlBZ0lDQnNaVzVuZEdnZ1BTQnpkMkZ3WEc0Z0lIMWNibHh1SUNCMllYSWdjbVZ0WVdsdWFXNW5JRDBnZEdocGN5NXNaVzVuZEdnZ0xTQnZabVp6WlhSY2JpQWdhV1lnS0d4bGJtZDBhQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lIeDhJR3hsYm1kMGFDQStJSEpsYldGcGJtbHVaeWtnYkdWdVozUm9JRDBnY21WdFlXbHVhVzVuWEc1Y2JpQWdhV1lnS0NoemRISnBibWN1YkdWdVozUm9JRDRnTUNBbUppQW9iR1Z1WjNSb0lEd2dNQ0I4ZkNCdlptWnpaWFFnUENBd0tTa2dmSHdnYjJabWMyVjBJRDRnZEdocGN5NXNaVzVuZEdncElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1VtRnVaMlZGY25KdmNpZ25ZWFIwWlcxd2RDQjBieUIzY21sMFpTQnZkWFJ6YVdSbElHSjFabVpsY2lCaWIzVnVaSE1uS1Z4dUlDQjlYRzVjYmlBZ2FXWWdLQ0ZsYm1OdlpHbHVaeWtnWlc1amIyUnBibWNnUFNBbmRYUm1PQ2RjYmx4dUlDQjJZWElnYkc5M1pYSmxaRU5oYzJVZ1BTQm1ZV3h6WlZ4dUlDQm1iM0lnS0RzN0tTQjdYRzRnSUNBZ2MzZHBkR05vSUNobGJtTnZaR2x1WnlrZ2UxeHVJQ0FnSUNBZ1kyRnpaU0FuYUdWNEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHaGxlRmR5YVhSbEtIUm9hWE1zSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzVjYmlBZ0lDQWdJR05oYzJVZ0ozVjBaamduT2x4dUlDQWdJQ0FnWTJGelpTQW5kWFJtTFRnbk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RYUm1PRmR5YVhSbEtIUm9hWE1zSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzVjYmlBZ0lDQWdJR05oYzJVZ0oyRnpZMmxwSnpwY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdGelkybHBWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBblltbHVZWEo1SnpwY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdKcGJtRnllVmR5YVhSbEtIUm9hWE1zSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzVjYmlBZ0lDQWdJR05oYzJVZ0oySmhjMlUyTkNjNlhHNGdJQ0FnSUNBZ0lDOHZJRmRoY201cGJtYzZJRzFoZUV4bGJtZDBhQ0J1YjNRZ2RHRnJaVzRnYVc1MGJ5QmhZMk52ZFc1MElHbHVJR0poYzJVMk5GZHlhWFJsWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJpWVhObE5qUlhjbWwwWlNoMGFHbHpMQ0J6ZEhKcGJtY3NJRzltWm5ObGRDd2diR1Z1WjNSb0tWeHVYRzRnSUNBZ0lDQmpZWE5sSUNkMVkzTXlKenBjYmlBZ0lDQWdJR05oYzJVZ0ozVmpjeTB5SnpwY2JpQWdJQ0FnSUdOaGMyVWdKM1YwWmpFMmJHVW5PbHh1SUNBZ0lDQWdZMkZ6WlNBbmRYUm1MVEUyYkdVbk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RXTnpNbGR5YVhSbEtIUm9hWE1zSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzVjYmlBZ0lDQWdJR1JsWm1GMWJIUTZYRzRnSUNBZ0lDQWdJR2xtSUNoc2IzZGxjbVZrUTJGelpTa2dkR2h5YjNjZ2JtVjNJRlI1Y0dWRmNuSnZjaWduVlc1cmJtOTNiaUJsYm1OdlpHbHVaem9nSnlBcklHVnVZMjlrYVc1bktWeHVJQ0FnSUNBZ0lDQmxibU52WkdsdVp5QTlJQ2duSnlBcklHVnVZMjlrYVc1bktTNTBiMHh2ZDJWeVEyRnpaU2dwWEc0Z0lDQWdJQ0FnSUd4dmQyVnlaV1JEWVhObElEMGdkSEoxWlZ4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5SdlNsTlBUaUE5SUdaMWJtTjBhVzl1SUhSdlNsTlBUaUFvS1NCN1hHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2RIbHdaVG9nSjBKMVptWmxjaWNzWEc0Z0lDQWdaR0YwWVRvZ1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5Oc2FXTmxMbU5oYkd3b2RHaHBjeTVmWVhKeUlIeDhJSFJvYVhNc0lEQXBYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWW1GelpUWTBVMnhwWTJVZ0tHSjFaaXdnYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0JwWmlBb2MzUmhjblFnUFQwOUlEQWdKaVlnWlc1a0lEMDlQU0JpZFdZdWJHVnVaM1JvS1NCN1hHNGdJQ0FnY21WMGRYSnVJR0poYzJVMk5DNW1jbTl0UW5sMFpVRnljbUY1S0dKMVppbGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z1ltRnpaVFkwTG1aeWIyMUNlWFJsUVhKeVlYa29ZblZtTG5Oc2FXTmxLSE4wWVhKMExDQmxibVFwS1Z4dUlDQjlYRzU5WEc1Y2JtWjFibU4wYVc5dUlIVjBaamhUYkdsalpTQW9ZblZtTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUdWdVpDQTlJRTFoZEdndWJXbHVLR0oxWmk1c1pXNW5kR2dzSUdWdVpDbGNiaUFnZG1GeUlISmxjeUE5SUZ0ZFhHNWNiaUFnZG1GeUlHa2dQU0J6ZEdGeWRGeHVJQ0IzYUdsc1pTQW9hU0E4SUdWdVpDa2dlMXh1SUNBZ0lIWmhjaUJtYVhKemRFSjVkR1VnUFNCaWRXWmJhVjFjYmlBZ0lDQjJZWElnWTI5a1pWQnZhVzUwSUQwZ2JuVnNiRnh1SUNBZ0lIWmhjaUJpZVhSbGMxQmxjbE5sY1hWbGJtTmxJRDBnS0dacGNuTjBRbmwwWlNBK0lEQjRSVVlwSUQ4Z05GeHVJQ0FnSUNBZ09pQW9abWx5YzNSQ2VYUmxJRDRnTUhoRVJpa2dQeUF6WEc0Z0lDQWdJQ0E2SUNobWFYSnpkRUo1ZEdVZ1BpQXdlRUpHS1NBL0lESmNiaUFnSUNBZ0lEb2dNVnh1WEc0Z0lDQWdhV1lnS0drZ0t5QmllWFJsYzFCbGNsTmxjWFZsYm1ObElEdzlJR1Z1WkNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSE5sWTI5dVpFSjVkR1VzSUhSb2FYSmtRbmwwWlN3Z1ptOTFjblJvUW5sMFpTd2dkR1Z0Y0VOdlpHVlFiMmx1ZEZ4dVhHNGdJQ0FnSUNCemQybDBZMmdnS0dKNWRHVnpVR1Z5VTJWeGRXVnVZMlVwSUh0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0F4T2x4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2htYVhKemRFSjVkR1VnUENBd2VEZ3dLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMlJsVUc5cGJuUWdQU0JtYVhKemRFSjVkR1ZjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdZbkpsWVd0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0F5T2x4dUlDQWdJQ0FnSUNBZ0lITmxZMjl1WkVKNWRHVWdQU0JpZFdaYmFTQXJJREZkWEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLQ2h6WldOdmJtUkNlWFJsSUNZZ01IaERNQ2tnUFQwOUlEQjRPREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJsYlhCRGIyUmxVRzlwYm5RZ1BTQW9abWx5YzNSQ2VYUmxJQ1lnTUhneFJpa2dQRHdnTUhnMklId2dLSE5sWTI5dVpFSjVkR1VnSmlBd2VETkdLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJsYlhCRGIyUmxVRzlwYm5RZ1BpQXdlRGRHS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdlpHVlFiMmx1ZENBOUlIUmxiWEJEYjJSbFVHOXBiblJjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ1luSmxZV3RjYmlBZ0lDQWdJQ0FnWTJGelpTQXpPbHh1SUNBZ0lDQWdJQ0FnSUhObFkyOXVaRUo1ZEdVZ1BTQmlkV1piYVNBcklERmRYRzRnSUNBZ0lDQWdJQ0FnZEdocGNtUkNlWFJsSUQwZ1luVm1XMmtnS3lBeVhWeHVJQ0FnSUNBZ0lDQWdJR2xtSUNnb2MyVmpiMjVrUW5sMFpTQW1JREI0UXpBcElEMDlQU0F3ZURnd0lDWW1JQ2gwYUdseVpFSjVkR1VnSmlBd2VFTXdLU0E5UFQwZ01IZzRNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR1Z0Y0VOdlpHVlFiMmx1ZENBOUlDaG1hWEp6ZEVKNWRHVWdKaUF3ZUVZcElEdzhJREI0UXlCOElDaHpaV052Ym1SQ2VYUmxJQ1lnTUhnelJpa2dQRHdnTUhnMklId2dLSFJvYVhKa1FubDBaU0FtSURCNE0wWXBYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR1Z0Y0VOdlpHVlFiMmx1ZENBK0lEQjROMFpHSUNZbUlDaDBaVzF3UTI5a1pWQnZhVzUwSUR3Z01IaEVPREF3SUh4OElIUmxiWEJEYjJSbFVHOXBiblFnUGlBd2VFUkdSa1lwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdlpHVlFiMmx1ZENBOUlIUmxiWEJEYjJSbFVHOXBiblJjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ1luSmxZV3RjYmlBZ0lDQWdJQ0FnWTJGelpTQTBPbHh1SUNBZ0lDQWdJQ0FnSUhObFkyOXVaRUo1ZEdVZ1BTQmlkV1piYVNBcklERmRYRzRnSUNBZ0lDQWdJQ0FnZEdocGNtUkNlWFJsSUQwZ1luVm1XMmtnS3lBeVhWeHVJQ0FnSUNBZ0lDQWdJR1p2ZFhKMGFFSjVkR1VnUFNCaWRXWmJhU0FySUROZFhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NoelpXTnZibVJDZVhSbElDWWdNSGhETUNrZ1BUMDlJREI0T0RBZ0ppWWdLSFJvYVhKa1FubDBaU0FtSURCNFF6QXBJRDA5UFNBd2VEZ3dJQ1ltSUNobWIzVnlkR2hDZVhSbElDWWdNSGhETUNrZ1BUMDlJREI0T0RBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSbGJYQkRiMlJsVUc5cGJuUWdQU0FvWm1seWMzUkNlWFJsSUNZZ01IaEdLU0E4UENBd2VERXlJSHdnS0hObFkyOXVaRUo1ZEdVZ0ppQXdlRE5HS1NBOFBDQXdlRU1nZkNBb2RHaHBjbVJDZVhSbElDWWdNSGd6UmlrZ1BEd2dNSGcySUh3Z0tHWnZkWEowYUVKNWRHVWdKaUF3ZUROR0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUmxiWEJEYjJSbFVHOXBiblFnUGlBd2VFWkdSa1lnSmlZZ2RHVnRjRU52WkdWUWIybHVkQ0E4SURCNE1URXdNREF3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdlpHVlFiMmx1ZENBOUlIUmxiWEJEYjJSbFVHOXBiblJjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0dOdlpHVlFiMmx1ZENBOVBUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0x5OGdkMlVnWkdsa0lHNXZkQ0JuWlc1bGNtRjBaU0JoSUhaaGJHbGtJR052WkdWUWIybHVkQ0J6YnlCcGJuTmxjblFnWVZ4dUlDQWdJQ0FnTHk4Z2NtVndiR0ZqWlcxbGJuUWdZMmhoY2lBb1ZTdEdSa1pFS1NCaGJtUWdZV1IyWVc1alpTQnZibXg1SURFZ1lubDBaVnh1SUNBZ0lDQWdZMjlrWlZCdmFXNTBJRDBnTUhoR1JrWkVYRzRnSUNBZ0lDQmllWFJsYzFCbGNsTmxjWFZsYm1ObElEMGdNVnh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZMjlrWlZCdmFXNTBJRDRnTUhoR1JrWkdLU0I3WEc0Z0lDQWdJQ0F2THlCbGJtTnZaR1VnZEc4Z2RYUm1NVFlnS0hOMWNuSnZaMkYwWlNCd1lXbHlJR1JoYm1ObEtWeHVJQ0FnSUNBZ1kyOWtaVkJ2YVc1MElDMDlJREI0TVRBd01EQmNiaUFnSUNBZ0lISmxjeTV3ZFhOb0tHTnZaR1ZRYjJsdWRDQStQajRnTVRBZ0ppQXdlRE5HUmlCOElEQjRSRGd3TUNsY2JpQWdJQ0FnSUdOdlpHVlFiMmx1ZENBOUlEQjRSRU13TUNCOElHTnZaR1ZRYjJsdWRDQW1JREI0TTBaR1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WekxuQjFjMmdvWTI5a1pWQnZhVzUwS1Z4dUlDQWdJR2tnS3owZ1lubDBaWE5RWlhKVFpYRjFaVzVqWlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUdSbFkyOWtaVU52WkdWUWIybHVkSE5CY25KaGVTaHlaWE1wWEc1OVhHNWNiaTh2SUVKaGMyVmtJRzl1SUdoMGRIQTZMeTl6ZEdGamEyOTJaWEptYkc5M0xtTnZiUzloTHpJeU56UTNNamN5THpZNE1EYzBNaXdnZEdobElHSnliM2R6WlhJZ2QybDBhRnh1THk4Z2RHaGxJR3h2ZDJWemRDQnNhVzFwZENCcGN5QkRhSEp2YldVc0lIZHBkR2dnTUhneE1EQXdNQ0JoY21kekxseHVMeThnVjJVZ1oyOGdNU0J0WVdkdWFYUjFaR1VnYkdWemN5d2dabTl5SUhOaFptVjBlVnh1ZG1GeUlFMUJXRjlCVWtkVlRVVk9WRk5mVEVWT1IxUklJRDBnTUhneE1EQXdYRzVjYm1aMWJtTjBhVzl1SUdSbFkyOWtaVU52WkdWUWIybHVkSE5CY25KaGVTQW9ZMjlrWlZCdmFXNTBjeWtnZTF4dUlDQjJZWElnYkdWdUlEMGdZMjlrWlZCdmFXNTBjeTVzWlc1bmRHaGNiaUFnYVdZZ0tHeGxiaUE4UFNCTlFWaGZRVkpIVlUxRlRsUlRYMHhGVGtkVVNDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbExtRndjR3g1S0ZOMGNtbHVaeXdnWTI5a1pWQnZhVzUwY3lrZ0x5OGdZWFp2YVdRZ1pYaDBjbUVnYzJ4cFkyVW9LVnh1SUNCOVhHNWNiaUFnTHk4Z1JHVmpiMlJsSUdsdUlHTm9kVzVyY3lCMGJ5QmhkbTlwWkNCY0ltTmhiR3dnYzNSaFkyc2djMmw2WlNCbGVHTmxaV1JsWkZ3aUxseHVJQ0IyWVhJZ2NtVnpJRDBnSnlkY2JpQWdkbUZ5SUdrZ1BTQXdYRzRnSUhkb2FXeGxJQ2hwSUR3Z2JHVnVLU0I3WEc0Z0lDQWdjbVZ6SUNzOUlGTjBjbWx1Wnk1bWNtOXRRMmhoY2tOdlpHVXVZWEJ3Ykhrb1hHNGdJQ0FnSUNCVGRISnBibWNzWEc0Z0lDQWdJQ0JqYjJSbFVHOXBiblJ6TG5Oc2FXTmxLR2tzSUdrZ0t6MGdUVUZZWDBGU1IxVk5SVTVVVTE5TVJVNUhWRWdwWEc0Z0lDQWdLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnlaWE5jYm4xY2JseHVablZ1WTNScGIyNGdZWE5qYVdsVGJHbGpaU0FvWW5WbUxDQnpkR0Z5ZEN3Z1pXNWtLU0I3WEc0Z0lIWmhjaUJ5WlhRZ1BTQW5KMXh1SUNCbGJtUWdQU0JOWVhSb0xtMXBiaWhpZFdZdWJHVnVaM1JvTENCbGJtUXBYRzVjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJSE4wWVhKME95QnBJRHdnWlc1a095QnBLeXNwSUh0Y2JpQWdJQ0J5WlhRZ0t6MGdVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2hpZFdaYmFWMGdKaUF3ZURkR0tWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYUmNibjFjYmx4dVpuVnVZM1JwYjI0Z1ltbHVZWEo1VTJ4cFkyVWdLR0oxWml3Z2MzUmhjblFzSUdWdVpDa2dlMXh1SUNCMllYSWdjbVYwSUQwZ0p5ZGNiaUFnWlc1a0lEMGdUV0YwYUM1dGFXNG9ZblZtTG14bGJtZDBhQ3dnWlc1a0tWeHVYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQnpkR0Z5ZERzZ2FTQThJR1Z1WkRzZ2FTc3JLU0I3WEc0Z0lDQWdjbVYwSUNzOUlGTjBjbWx1Wnk1bWNtOXRRMmhoY2tOdlpHVW9ZblZtVzJsZEtWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYUmNibjFjYmx4dVpuVnVZM1JwYjI0Z2FHVjRVMnhwWTJVZ0tHSjFaaXdnYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0IyWVhJZ2JHVnVJRDBnWW5WbUxteGxibWQwYUZ4dVhHNGdJR2xtSUNnaGMzUmhjblFnZkh3Z2MzUmhjblFnUENBd0tTQnpkR0Z5ZENBOUlEQmNiaUFnYVdZZ0tDRmxibVFnZkh3Z1pXNWtJRHdnTUNCOGZDQmxibVFnUGlCc1pXNHBJR1Z1WkNBOUlHeGxibHh1WEc0Z0lIWmhjaUJ2ZFhRZ1BTQW5KMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdjM1JoY25RN0lHa2dQQ0JsYm1RN0lHa3JLeWtnZTF4dUlDQWdJRzkxZENBclBTQjBiMGhsZUNoaWRXWmJhVjBwWEc0Z0lIMWNiaUFnY21WMGRYSnVJRzkxZEZ4dWZWeHVYRzVtZFc1amRHbHZiaUIxZEdZeE5teGxVMnhwWTJVZ0tHSjFaaXdnYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0IyWVhJZ1lubDBaWE1nUFNCaWRXWXVjMnhwWTJVb2MzUmhjblFzSUdWdVpDbGNiaUFnZG1GeUlISmxjeUE5SUNjblhHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnWW5sMFpYTXViR1Z1WjNSb095QnBJQ3M5SURJcElIdGNiaUFnSUNCeVpYTWdLejBnVTNSeWFXNW5MbVp5YjIxRGFHRnlRMjlrWlNoaWVYUmxjMXRwWFNBcklHSjVkR1Z6VzJrZ0t5QXhYU0FxSURJMU5pbGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVnpYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWMyeHBZMlVnUFNCbWRXNWpkR2x2YmlCemJHbGpaU0FvYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0IyWVhJZ2JHVnVJRDBnZEdocGN5NXNaVzVuZEdoY2JpQWdjM1JoY25RZ1BTQitmbk4wWVhKMFhHNGdJR1Z1WkNBOUlHVnVaQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lEOGdiR1Z1SURvZ2ZuNWxibVJjYmx4dUlDQnBaaUFvYzNSaGNuUWdQQ0F3S1NCN1hHNGdJQ0FnYzNSaGNuUWdLejBnYkdWdVhHNGdJQ0FnYVdZZ0tITjBZWEowSUR3Z01Da2djM1JoY25RZ1BTQXdYRzRnSUgwZ1pXeHpaU0JwWmlBb2MzUmhjblFnUGlCc1pXNHBJSHRjYmlBZ0lDQnpkR0Z5ZENBOUlHeGxibHh1SUNCOVhHNWNiaUFnYVdZZ0tHVnVaQ0E4SURBcElIdGNiaUFnSUNCbGJtUWdLejBnYkdWdVhHNGdJQ0FnYVdZZ0tHVnVaQ0E4SURBcElHVnVaQ0E5SURCY2JpQWdmU0JsYkhObElHbG1JQ2hsYm1RZ1BpQnNaVzRwSUh0Y2JpQWdJQ0JsYm1RZ1BTQnNaVzVjYmlBZ2ZWeHVYRzRnSUdsbUlDaGxibVFnUENCemRHRnlkQ2tnWlc1a0lEMGdjM1JoY25SY2JseHVJQ0IyWVhJZ2JtVjNRblZtWEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJRzVsZDBKMVppQTlJRUoxWm1abGNpNWZZWFZuYldWdWRDaDBhR2x6TG5OMVltRnljbUY1S0hOMFlYSjBMQ0JsYm1RcEtWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lIWmhjaUJ6YkdsalpVeGxiaUE5SUdWdVpDQXRJSE4wWVhKMFhHNGdJQ0FnYm1WM1FuVm1JRDBnYm1WM0lFSjFabVpsY2loemJHbGpaVXhsYml3Z2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2MyeHBZMlZNWlc0N0lHa3JLeWtnZTF4dUlDQWdJQ0FnYm1WM1FuVm1XMmxkSUQwZ2RHaHBjMXRwSUNzZ2MzUmhjblJkWEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYVdZZ0tHNWxkMEoxWmk1c1pXNW5kR2dwSUc1bGQwSjFaaTV3WVhKbGJuUWdQU0IwYUdsekxuQmhjbVZ1ZENCOGZDQjBhR2x6WEc1Y2JpQWdjbVYwZFhKdUlHNWxkMEoxWmx4dWZWeHVYRzR2S2x4dUlDb2dUbVZsWkNCMGJ5QnRZV3RsSUhOMWNtVWdkR2hoZENCaWRXWm1aWElnYVhOdUozUWdkSEo1YVc1bklIUnZJSGR5YVhSbElHOTFkQ0J2WmlCaWIzVnVaSE11WEc0Z0tpOWNibVoxYm1OMGFXOXVJR05vWldOclQyWm1jMlYwSUNodlptWnpaWFFzSUdWNGRDd2diR1Z1WjNSb0tTQjdYRzRnSUdsbUlDZ29iMlptYzJWMElDVWdNU2tnSVQwOUlEQWdmSHdnYjJabWMyVjBJRHdnTUNrZ2RHaHliM2NnYm1WM0lGSmhibWRsUlhKeWIzSW9KMjltWm5ObGRDQnBjeUJ1YjNRZ2RXbHVkQ2NwWEc0Z0lHbG1JQ2h2Wm1aelpYUWdLeUJsZUhRZ1BpQnNaVzVuZEdncElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2RVY25scGJtY2dkRzhnWVdOalpYTnpJR0psZVc5dVpDQmlkV1ptWlhJZ2JHVnVaM1JvSnlsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1ZVbHVkRXhGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRlZKYm5STVJTQW9iMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdKNWRHVk1aVzVuZEdnZ1BTQmllWFJsVEdWdVozUm9JSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lHSjVkR1ZNWlc1bmRHZ3NJSFJvYVhNdWJHVnVaM1JvS1Z4dVhHNGdJSFpoY2lCMllXd2dQU0IwYUdselcyOW1abk5sZEYxY2JpQWdkbUZ5SUcxMWJDQTlJREZjYmlBZ2RtRnlJR2tnUFNBd1hHNGdJSGRvYVd4bElDZ3JLMmtnUENCaWVYUmxUR1Z1WjNSb0lDWW1JQ2h0ZFd3Z0tqMGdNSGd4TURBcEtTQjdYRzRnSUNBZ2RtRnNJQ3M5SUhSb2FYTmJiMlptYzJWMElDc2dhVjBnS2lCdGRXeGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjJZV3hjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrVlVsdWRFSkZJRDBnWm5WdVkzUnBiMjRnY21WaFpGVkpiblJDUlNBb2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xDQnViMEZ6YzJWeWRDa2dlMXh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnZkNBd1hHNGdJR0o1ZEdWTVpXNW5kR2dnUFNCaWVYUmxUR1Z1WjNSb0lId2dNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0I3WEc0Z0lDQWdZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnZlZ4dVhHNGdJSFpoY2lCMllXd2dQU0IwYUdselcyOW1abk5sZENBcklDMHRZbmwwWlV4bGJtZDBhRjFjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZDJocGJHVWdLR0o1ZEdWTVpXNW5kR2dnUGlBd0lDWW1JQ2h0ZFd3Z0tqMGdNSGd4TURBcEtTQjdYRzRnSUNBZ2RtRnNJQ3M5SUhSb2FYTmJiMlptYzJWMElDc2dMUzFpZVhSbFRHVnVaM1JvWFNBcUlHMTFiRnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSFpoYkZ4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSVlNXNTBPQ0E5SUdaMWJtTjBhVzl1SUhKbFlXUlZTVzUwT0NBb2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTA5bVpuTmxkQ2h2Wm1aelpYUXNJREVzSUhSb2FYTXViR1Z1WjNSb0tWeHVJQ0J5WlhSMWNtNGdkR2hwYzF0dlptWnpaWFJkWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkZWSmJuUXhOa3hGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRlZKYm5ReE5reEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z01pd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lISmxkSFZ5YmlCMGFHbHpXMjltWm5ObGRGMGdmQ0FvZEdocGMxdHZabVp6WlhRZ0t5QXhYU0E4UENBNEtWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUlZTVzUwTVRaQ1JTQTlJR1oxYm1OMGFXOXVJSEpsWVdSVlNXNTBNVFpDUlNBb2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTA5bVpuTmxkQ2h2Wm1aelpYUXNJRElzSUhSb2FYTXViR1Z1WjNSb0tWeHVJQ0J5WlhSMWNtNGdLSFJvYVhOYmIyWm1jMlYwWFNBOFBDQTRLU0I4SUhSb2FYTmJiMlptYzJWMElDc2dNVjFjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrVlVsdWRETXlURVVnUFNCbWRXNWpkR2x2YmlCeVpXRmtWVWx1ZERNeVRFVWdLRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENBMExDQjBhR2x6TG14bGJtZDBhQ2xjYmx4dUlDQnlaWFIxY200Z0tDaDBhR2x6VzI5bVpuTmxkRjBwSUh4Y2JpQWdJQ0FnSUNoMGFHbHpXMjltWm5ObGRDQXJJREZkSUR3OElEZ3BJSHhjYmlBZ0lDQWdJQ2gwYUdselcyOW1abk5sZENBcklESmRJRHc4SURFMktTa2dLMXh1SUNBZ0lDQWdLSFJvYVhOYmIyWm1jMlYwSUNzZ00xMGdLaUF3ZURFd01EQXdNREFwWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkZWSmJuUXpNa0pGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRlZKYm5Rek1rSkZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z05Dd2dkR2hwY3k1c1pXNW5kR2dwWEc1Y2JpQWdjbVYwZFhKdUlDaDBhR2x6VzI5bVpuTmxkRjBnS2lBd2VERXdNREF3TURBcElDdGNiaUFnSUNBb0tIUm9hWE5iYjJabWMyVjBJQ3NnTVYwZ1BEd2dNVFlwSUh4Y2JpQWdJQ0FvZEdocGMxdHZabVp6WlhRZ0t5QXlYU0E4UENBNEtTQjhYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1NXNTBURVVnUFNCbWRXNWpkR2x2YmlCeVpXRmtTVzUwVEVVZ0tHOW1abk5sZEN3Z1lubDBaVXhsYm1kMGFDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2IyWm1jMlYwSUQwZ2IyWm1jMlYwSUh3Z01GeHVJQ0JpZVhSbFRHVnVaM1JvSUQwZ1lubDBaVXhsYm1kMGFDQjhJREJjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xDQjBhR2x6TG14bGJtZDBhQ2xjYmx4dUlDQjJZWElnZG1Gc0lEMGdkR2hwYzF0dlptWnpaWFJkWEc0Z0lIWmhjaUJ0ZFd3Z1BTQXhYRzRnSUhaaGNpQnBJRDBnTUZ4dUlDQjNhR2xzWlNBb0t5dHBJRHdnWW5sMFpVeGxibWQwYUNBbUppQW9iWFZzSUNvOUlEQjRNVEF3S1NrZ2UxeHVJQ0FnSUhaaGJDQXJQU0IwYUdselcyOW1abk5sZENBcklHbGRJQ29nYlhWc1hHNGdJSDFjYmlBZ2JYVnNJQ285SURCNE9EQmNibHh1SUNCcFppQW9kbUZzSUQ0OUlHMTFiQ2tnZG1Gc0lDMDlJRTFoZEdndWNHOTNLRElzSURnZ0tpQmllWFJsVEdWdVozUm9LVnh1WEc0Z0lISmxkSFZ5YmlCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtTVzUwUWtVZ1BTQm1kVzVqZEdsdmJpQnlaV0ZrU1c1MFFrVWdLRzltWm5ObGRDd2dZbmwwWlV4bGJtZDBhQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElId2dNRnh1SUNCaWVYUmxUR1Z1WjNSb0lEMGdZbmwwWlV4bGJtZDBhQ0I4SURCY2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0IwYUdsekxteGxibWQwYUNsY2JseHVJQ0IyWVhJZ2FTQTlJR0o1ZEdWTVpXNW5kR2hjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZG1GeUlIWmhiQ0E5SUhSb2FYTmJiMlptYzJWMElDc2dMUzFwWFZ4dUlDQjNhR2xzWlNBb2FTQStJREFnSmlZZ0tHMTFiQ0FxUFNBd2VERXdNQ2twSUh0Y2JpQWdJQ0IyWVd3Z0t6MGdkR2hwYzF0dlptWnpaWFFnS3lBdExXbGRJQ29nYlhWc1hHNGdJSDFjYmlBZ2JYVnNJQ285SURCNE9EQmNibHh1SUNCcFppQW9kbUZzSUQ0OUlHMTFiQ2tnZG1Gc0lDMDlJRTFoZEdndWNHOTNLRElzSURnZ0tpQmllWFJsVEdWdVozUm9LVnh1WEc0Z0lISmxkSFZ5YmlCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtTVzUwT0NBOUlHWjFibU4wYVc5dUlISmxZV1JKYm5RNElDaHZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclQyWm1jMlYwS0c5bVpuTmxkQ3dnTVN3Z2RHaHBjeTVzWlc1bmRHZ3BYRzRnSUdsbUlDZ2hLSFJvYVhOYmIyWm1jMlYwWFNBbUlEQjRPREFwS1NCeVpYUjFjbTRnS0hSb2FYTmJiMlptYzJWMFhTbGNiaUFnY21WMGRYSnVJQ2dvTUhobVppQXRJSFJvYVhOYmIyWm1jMlYwWFNBcklERXBJQ29nTFRFcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1Y21WaFpFbHVkREUyVEVVZ1BTQm1kVzVqZEdsdmJpQnlaV0ZrU1c1ME1UWk1SU0FvYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lESXNJSFJvYVhNdWJHVnVaM1JvS1Z4dUlDQjJZWElnZG1Gc0lEMGdkR2hwYzF0dlptWnpaWFJkSUh3Z0tIUm9hWE5iYjJabWMyVjBJQ3NnTVYwZ1BEd2dPQ2xjYmlBZ2NtVjBkWEp1SUNoMllXd2dKaUF3ZURnd01EQXBJRDhnZG1Gc0lId2dNSGhHUmtaR01EQXdNQ0E2SUhaaGJGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkpiblF4TmtKRklEMGdablZ1WTNScGIyNGdjbVZoWkVsdWRERTJRa1VnS0c5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQXlMQ0IwYUdsekxteGxibWQwYUNsY2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdmQ0FvZEdocGMxdHZabVp6WlhSZElEdzhJRGdwWEc0Z0lISmxkSFZ5YmlBb2RtRnNJQ1lnTUhnNE1EQXdLU0EvSUhaaGJDQjhJREI0UmtaR1JqQXdNREFnT2lCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtTVzUwTXpKTVJTQTlJR1oxYm1OMGFXOXVJSEpsWVdSSmJuUXpNa3hGSUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dOQ3dnZEdocGN5NXNaVzVuZEdncFhHNWNiaUFnY21WMGRYSnVJQ2gwYUdselcyOW1abk5sZEYwcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQTRLU0I4WEc0Z0lDQWdLSFJvYVhOYmIyWm1jMlYwSUNzZ01sMGdQRHdnTVRZcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNBOFBDQXlOQ2xjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrU1c1ME16SkNSU0E5SUdaMWJtTjBhVzl1SUhKbFlXUkpiblF6TWtKRklDaHZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclQyWm1jMlYwS0c5bVpuTmxkQ3dnTkN3Z2RHaHBjeTVzWlc1bmRHZ3BYRzVjYmlBZ2NtVjBkWEp1SUNoMGFHbHpXMjltWm5ObGRGMGdQRHdnTWpRcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQXhOaWtnZkZ4dUlDQWdJQ2gwYUdselcyOW1abk5sZENBcklESmRJRHc4SURncElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1JteHZZWFJNUlNBOUlHWjFibU4wYVc5dUlISmxZV1JHYkc5aGRFeEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z05Dd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lISmxkSFZ5YmlCcFpXVmxOelUwTG5KbFlXUW9kR2hwY3l3Z2IyWm1jMlYwTENCMGNuVmxMQ0F5TXl3Z05DbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtSbXh2WVhSQ1JTQTlJR1oxYm1OMGFXOXVJSEpsWVdSR2JHOWhkRUpGSUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dOQ3dnZEdocGN5NXNaVzVuZEdncFhHNGdJSEpsZEhWeWJpQnBaV1ZsTnpVMExuSmxZV1FvZEdocGN5d2diMlptYzJWMExDQm1ZV3h6WlN3Z01qTXNJRFFwWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkVSdmRXSnNaVXhGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRVJ2ZFdKc1pVeEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z09Dd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lISmxkSFZ5YmlCcFpXVmxOelUwTG5KbFlXUW9kR2hwY3l3Z2IyWm1jMlYwTENCMGNuVmxMQ0ExTWl3Z09DbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtSRzkxWW14bFFrVWdQU0JtZFc1amRHbHZiaUJ5WldGa1JHOTFZbXhsUWtVZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0E0TENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnY21WMGRYSnVJR2xsWldVM05UUXVjbVZoWkNoMGFHbHpMQ0J2Wm1aelpYUXNJR1poYkhObExDQTFNaXdnT0NsY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJobFkydEpiblFnS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z1pYaDBMQ0J0WVhnc0lHMXBiaWtnZTF4dUlDQnBaaUFvSVVKMVptWmxjaTVwYzBKMVptWmxjaWhpZFdZcEtTQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RpZFdabVpYSWdiWFZ6ZENCaVpTQmhJRUoxWm1abGNpQnBibk4wWVc1alpTY3BYRzRnSUdsbUlDaDJZV3gxWlNBK0lHMWhlQ0I4ZkNCMllXeDFaU0E4SUcxcGJpa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjNaaGJIVmxJR2x6SUc5MWRDQnZaaUJpYjNWdVpITW5LVnh1SUNCcFppQW9iMlptYzJWMElDc2daWGgwSUQ0Z1luVm1MbXhsYm1kMGFDa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjJsdVpHVjRJRzkxZENCdlppQnlZVzVuWlNjcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVlZTVzUwVEVVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlZWSmJuUk1SU0FvZG1Gc2RXVXNJRzltWm5ObGRDd2dZbmwwWlV4bGJtZDBhQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElId2dNRnh1SUNCaWVYUmxUR1Z1WjNSb0lEMGdZbmwwWlV4bGJtZDBhQ0I4SURCY2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRKYm5Rb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dZbmwwWlV4bGJtZDBhQ3dnVFdGMGFDNXdiM2NvTWl3Z09DQXFJR0o1ZEdWTVpXNW5kR2dwTENBd0tWeHVYRzRnSUhaaGNpQnRkV3dnUFNBeFhHNGdJSFpoY2lCcElEMGdNRnh1SUNCMGFHbHpXMjltWm5ObGRGMGdQU0IyWVd4MVpTQW1JREI0UmtaY2JpQWdkMmhwYkdVZ0tDc3JhU0E4SUdKNWRHVk1aVzVuZEdnZ0ppWWdLRzExYkNBcVBTQXdlREV3TUNrcElIdGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJR2xkSUQwZ0tIWmhiSFZsSUM4Z2JYVnNLU0FtSURCNFJrWmNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QmllWFJsVEdWdVozUm9YRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZWU1c1MFFrVWdQU0JtZFc1amRHbHZiaUIzY21sMFpWVkpiblJDUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnWW5sMFpVeGxibWQwYUN3Z2JtOUJjM05sY25RcElIdGNiaUFnZG1Gc2RXVWdQU0FyZG1Gc2RXVmNiaUFnYjJabWMyVjBJRDBnYjJabWMyVjBJSHdnTUZ4dUlDQmllWFJsVEdWdVozUm9JRDBnWW5sMFpVeGxibWQwYUNCOElEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnWW5sMFpVeGxibWQwYUN3Z1RXRjBhQzV3YjNjb01pd2dPQ0FxSUdKNWRHVk1aVzVuZEdncExDQXdLVnh1WEc0Z0lIWmhjaUJwSUQwZ1lubDBaVXhsYm1kMGFDQXRJREZjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZEdocGMxdHZabVp6WlhRZ0t5QnBYU0E5SUhaaGJIVmxJQ1lnTUhoR1JseHVJQ0IzYUdsc1pTQW9MUzFwSUQ0OUlEQWdKaVlnS0cxMWJDQXFQU0F3ZURFd01Da3BJSHRjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySUdsZElEMGdLSFpoYkhWbElDOGdiWFZzS1NBbUlEQjRSa1pjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ2Wm1aelpYUWdLeUJpZVhSbFRHVnVaM1JvWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVkM0pwZEdWVlNXNTBPQ0E5SUdaMWJtTjBhVzl1SUhkeWFYUmxWVWx1ZERnZ0tIWmhiSFZsTENCdlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJSFpoYkhWbElEMGdLM1poYkhWbFhHNGdJRzltWm5ObGRDQTlJRzltWm5ObGRDQjhJREJjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydEpiblFvZEdocGN5d2dkbUZzZFdVc0lHOW1abk5sZEN3Z01Td2dNSGhtWml3Z01DbGNiaUFnYVdZZ0tDRkNkV1ptWlhJdVZGbFFSVVJmUVZKU1FWbGZVMVZRVUU5U1ZDa2dkbUZzZFdVZ1BTQk5ZWFJvTG1ac2IyOXlLSFpoYkhWbEtWeHVJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ0ppQXdlR1ptS1Z4dUlDQnlaWFIxY200Z2IyWm1jMlYwSUNzZ01WeHVmVnh1WEc1bWRXNWpkR2x2YmlCdlltcGxZM1JYY21sMFpWVkpiblF4TmlBb1luVm1MQ0IyWVd4MVpTd2diMlptYzJWMExDQnNhWFIwYkdWRmJtUnBZVzRwSUh0Y2JpQWdhV1lnS0haaGJIVmxJRHdnTUNrZ2RtRnNkV1VnUFNBd2VHWm1abVlnS3lCMllXeDFaU0FySURGY2JpQWdabTl5SUNoMllYSWdhU0E5SURBc0lHb2dQU0JOWVhSb0xtMXBiaWhpZFdZdWJHVnVaM1JvSUMwZ2IyWm1jMlYwTENBeUtUc2dhU0E4SUdvN0lHa3JLeWtnZTF4dUlDQWdJR0oxWmx0dlptWnpaWFFnS3lCcFhTQTlJQ2gyWVd4MVpTQW1JQ2d3ZUdabUlEdzhJQ2c0SUNvZ0tHeHBkSFJzWlVWdVpHbGhiaUEvSUdrZ09pQXhJQzBnYVNrcEtTa2dQajQrWEc0Z0lDQWdJQ0FvYkdsMGRHeGxSVzVrYVdGdUlEOGdhU0E2SURFZ0xTQnBLU0FxSURoY2JpQWdmVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsVlVsdWRERTJURVVnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVlZKYm5ReE5reEZJQ2gyWVd4MVpTd2diMlptYzJWMExDQnViMEZ6YzJWeWRDa2dlMXh1SUNCMllXeDFaU0E5SUN0MllXeDFaVnh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnZkNBd1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yU1c1MEtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJRElzSURCNFptWm1aaXdnTUNsY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhSZElEMGdLSFpoYkhWbElDWWdNSGhtWmlsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklERmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOWlhbVZqZEZkeWFYUmxWVWx1ZERFMktIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJSFJ5ZFdVcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURKY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpWVkpiblF4TmtKRklEMGdablZ1WTNScGIyNGdkM0pwZEdWVlNXNTBNVFpDUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElId2dNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwbHVkQ2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENBeUxDQXdlR1ptWm1Zc0lEQXBYRzRnSUdsbUlDaENkV1ptWlhJdVZGbFFSVVJmUVZKU1FWbGZVMVZRVUU5U1ZDa2dlMXh1SUNBZ0lIUm9hWE5iYjJabWMyVjBYU0E5SUNoMllXeDFaU0ErUGo0Z09DbGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJREZkSUQwZ0tIWmhiSFZsSUNZZ01IaG1aaWxjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J2WW1wbFkzUlhjbWwwWlZWSmJuUXhOaWgwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbVlXeHpaU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dNbHh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnZZbXBsWTNSWGNtbDBaVlZKYm5Rek1pQW9ZblZtTENCMllXeDFaU3dnYjJabWMyVjBMQ0JzYVhSMGJHVkZibVJwWVc0cElIdGNiaUFnYVdZZ0tIWmhiSFZsSUR3Z01Da2dkbUZzZFdVZ1BTQXdlR1ptWm1abVptWm1JQ3NnZG1Gc2RXVWdLeUF4WEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0F3TENCcUlEMGdUV0YwYUM1dGFXNG9ZblZtTG14bGJtZDBhQ0F0SUc5bVpuTmxkQ3dnTkNrN0lHa2dQQ0JxT3lCcEt5c3BJSHRjYmlBZ0lDQmlkV1piYjJabWMyVjBJQ3NnYVYwZ1BTQW9kbUZzZFdVZ1BqNCtJQ2hzYVhSMGJHVkZibVJwWVc0Z1B5QnBJRG9nTXlBdElHa3BJQ29nT0NrZ0ppQXdlR1ptWEc0Z0lIMWNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1M2NtbDBaVlZKYm5Rek1reEZJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVlZTVzUwTXpKTVJTQW9kbUZzZFdVc0lHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnZG1Gc2RXVWdQU0FyZG1Gc2RXVmNiaUFnYjJabWMyVjBJRDBnYjJabWMyVjBJSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMGx1ZENoMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQTBMQ0F3ZUdabVptWm1abVptTENBd0tWeHVJQ0JwWmlBb1FuVm1abVZ5TGxSWlVFVkVYMEZTVWtGWlgxTlZVRkJQVWxRcElIdGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJRE5kSUQwZ0tIWmhiSFZsSUQ0K1BpQXlOQ2xjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySURKZElEMGdLSFpoYkhWbElENCtQaUF4TmlsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklERmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMFhTQTlJQ2gyWVd4MVpTQW1JREI0Wm1ZcFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2IySnFaV04wVjNKcGRHVlZTVzUwTXpJb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dkSEoxWlNsY2JpQWdmVnh1SUNCeVpYUjFjbTRnYjJabWMyVjBJQ3NnTkZ4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbmR5YVhSbFZVbHVkRE15UWtVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlZWSmJuUXpNa0pGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURRc0lEQjRabVptWm1abVptWXNJREFwWEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJSFJvYVhOYmIyWm1jMlYwWFNBOUlDaDJZV3gxWlNBK1BqNGdNalFwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJQ2gyWVd4MVpTQStQajRnTVRZcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXlYU0E5SUNoMllXeDFaU0ErUGo0Z09DbGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJRE5kSUQwZ0tIWmhiSFZsSUNZZ01IaG1aaWxjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J2WW1wbFkzUlhjbWwwWlZWSmJuUXpNaWgwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbVlXeHpaU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dORnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsU1c1MFRFVWdQU0JtZFc1amRHbHZiaUIzY21sMFpVbHVkRXhGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdmQ0F3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUh0Y2JpQWdJQ0IyWVhJZ2JHbHRhWFFnUFNCTllYUm9MbkJ2ZHlneUxDQTRJQ29nWW5sMFpVeGxibWQwYUNBdElERXBYRzVjYmlBZ0lDQmphR1ZqYTBsdWRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCc2FXMXBkQ0F0SURFc0lDMXNhVzFwZENsY2JpQWdmVnh1WEc0Z0lIWmhjaUJwSUQwZ01GeHVJQ0IyWVhJZ2JYVnNJRDBnTVZ4dUlDQjJZWElnYzNWaUlEMGdkbUZzZFdVZ1BDQXdJRDhnTVNBNklEQmNiaUFnZEdocGMxdHZabVp6WlhSZElEMGdkbUZzZFdVZ0ppQXdlRVpHWEc0Z0lIZG9hV3hsSUNncksya2dQQ0JpZVhSbFRHVnVaM1JvSUNZbUlDaHRkV3dnS2owZ01IZ3hNREFwS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QnBYU0E5SUNnb2RtRnNkV1VnTHlCdGRXd3BJRDQrSURBcElDMGdjM1ZpSUNZZ01IaEdSbHh1SUNCOVhHNWNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJR0o1ZEdWTVpXNW5kR2hjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVsdWRFSkZJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVkpiblJDUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnWW5sMFpVeGxibWQwYUN3Z2JtOUJjM05sY25RcElIdGNiaUFnZG1Gc2RXVWdQU0FyZG1Gc2RXVmNiaUFnYjJabWMyVjBJRDBnYjJabWMyVjBJSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCN1hHNGdJQ0FnZG1GeUlHeHBiV2wwSUQwZ1RXRjBhQzV3YjNjb01pd2dPQ0FxSUdKNWRHVk1aVzVuZEdnZ0xTQXhLVnh1WEc0Z0lDQWdZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnWW5sMFpVeGxibWQwYUN3Z2JHbHRhWFFnTFNBeExDQXRiR2x0YVhRcFhHNGdJSDFjYmx4dUlDQjJZWElnYVNBOUlHSjVkR1ZNWlc1bmRHZ2dMU0F4WEc0Z0lIWmhjaUJ0ZFd3Z1BTQXhYRzRnSUhaaGNpQnpkV0lnUFNCMllXeDFaU0E4SURBZ1B5QXhJRG9nTUZ4dUlDQjBhR2x6VzI5bVpuTmxkQ0FySUdsZElEMGdkbUZzZFdVZ0ppQXdlRVpHWEc0Z0lIZG9hV3hsSUNndExXa2dQajBnTUNBbUppQW9iWFZzSUNvOUlEQjRNVEF3S1NrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dhVjBnUFNBb0tIWmhiSFZsSUM4Z2JYVnNLU0ErUGlBd0tTQXRJSE4xWWlBbUlEQjRSa1pjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ2Wm1aelpYUWdLeUJpZVhSbFRHVnVaM1JvWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVkM0pwZEdWSmJuUTRJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVkpiblE0SUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURFc0lEQjROMllzSUMwd2VEZ3dLVnh1SUNCcFppQW9JVUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0IyWVd4MVpTQTlJRTFoZEdndVpteHZiM0lvZG1Gc2RXVXBYRzRnSUdsbUlDaDJZV3gxWlNBOElEQXBJSFpoYkhWbElEMGdNSGhtWmlBcklIWmhiSFZsSUNzZ01WeHVJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ0ppQXdlR1ptS1Z4dUlDQnlaWFIxY200Z2IyWm1jMlYwSUNzZ01WeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxTVzUwTVRaTVJTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFNXNTBNVFpNUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElId2dNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwbHVkQ2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENBeUxDQXdlRGRtWm1Zc0lDMHdlRGd3TURBcFhHNGdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMFhTQTlJQ2gyWVd4MVpTQW1JREI0Wm1ZcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXhYU0E5SUNoMllXeDFaU0ErUGo0Z09DbGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnZZbXBsWTNSWGNtbDBaVlZKYm5ReE5paDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0IwY25WbEtWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCdlptWnpaWFFnS3lBeVhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVkpiblF4TmtKRklEMGdablZ1WTNScGIyNGdkM0pwZEdWSmJuUXhOa0pGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURJc0lEQjROMlptWml3Z0xUQjRPREF3TUNsY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhSZElEMGdLSFpoYkhWbElENCtQaUE0S1Z4dUlDQWdJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdQU0FvZG1Gc2RXVWdKaUF3ZUdabUtWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOWlhbVZqZEZkeWFYUmxWVWx1ZERFMktIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJR1poYkhObEtWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCdlptWnpaWFFnS3lBeVhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVkpiblF6TWt4RklEMGdablZ1WTNScGIyNGdkM0pwZEdWSmJuUXpNa3hGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURRc0lEQjROMlptWm1abVptWXNJQzB3ZURnd01EQXdNREF3S1Z4dUlDQnBaaUFvUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUh0Y2JpQWdJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ0ppQXdlR1ptS1Z4dUlDQWdJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdQU0FvZG1Gc2RXVWdQajQrSURncFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXlYU0E5SUNoMllXeDFaU0ErUGo0Z01UWXBYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNBOUlDaDJZV3gxWlNBK1BqNGdNalFwWEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnYjJKcVpXTjBWM0pwZEdWVlNXNTBNeklvZEdocGN5d2dkbUZzZFdVc0lHOW1abk5sZEN3Z2RISjFaU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dORnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsU1c1ME16SkNSU0E5SUdaMWJtTjBhVzl1SUhkeWFYUmxTVzUwTXpKQ1JTQW9kbUZzZFdVc0lHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnZG1Gc2RXVWdQU0FyZG1Gc2RXVmNiaUFnYjJabWMyVjBJRDBnYjJabWMyVjBJSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMGx1ZENoMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQTBMQ0F3ZURkbVptWm1abVptTENBdE1IZzRNREF3TURBd01DbGNiaUFnYVdZZ0tIWmhiSFZsSUR3Z01Da2dkbUZzZFdVZ1BTQXdlR1ptWm1abVptWm1JQ3NnZG1Gc2RXVWdLeUF4WEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJSFJvYVhOYmIyWm1jMlYwWFNBOUlDaDJZV3gxWlNBK1BqNGdNalFwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJQ2gyWVd4MVpTQStQajRnTVRZcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXlYU0E5SUNoMllXeDFaU0ErUGo0Z09DbGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJRE5kSUQwZ0tIWmhiSFZsSUNZZ01IaG1aaWxjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J2WW1wbFkzUlhjbWwwWlZWSmJuUXpNaWgwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbVlXeHpaU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dORnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmphR1ZqYTBsRlJVVTNOVFFnS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z1pYaDBMQ0J0WVhnc0lHMXBiaWtnZTF4dUlDQnBaaUFvZG1Gc2RXVWdQaUJ0WVhnZ2ZId2dkbUZzZFdVZ1BDQnRhVzRwSUhSb2NtOTNJRzVsZHlCU1lXNW5aVVZ5Y205eUtDZDJZV3gxWlNCcGN5QnZkWFFnYjJZZ1ltOTFibVJ6SnlsY2JpQWdhV1lnS0c5bVpuTmxkQ0FySUdWNGRDQStJR0oxWmk1c1pXNW5kR2dwSUhSb2NtOTNJRzVsZHlCU1lXNW5aVVZ5Y205eUtDZHBibVJsZUNCdmRYUWdiMllnY21GdVoyVW5LVnh1SUNCcFppQW9iMlptYzJWMElEd2dNQ2tnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0oybHVaR1Y0SUc5MWRDQnZaaUJ5WVc1blpTY3BYRzU5WEc1Y2JtWjFibU4wYVc5dUlIZHlhWFJsUm14dllYUWdLR0oxWml3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnYkdsMGRHeGxSVzVrYVdGdUxDQnViMEZ6YzJWeWRDa2dlMXh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0I3WEc0Z0lDQWdZMmhsWTJ0SlJVVkZOelUwS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z05Dd2dNeTQwTURJNE1qTTBOall6T0RVeU9EZzJaU3N6T0N3Z0xUTXVOREF5T0RJek5EWTJNemcxTWpnNE5tVXJNemdwWEc0Z0lIMWNiaUFnYVdWbFpUYzFOQzUzY21sMFpTaGlkV1lzSUhaaGJIVmxMQ0J2Wm1aelpYUXNJR3hwZEhSc1pVVnVaR2xoYml3Z01qTXNJRFFwWEc0Z0lISmxkSFZ5YmlCdlptWnpaWFFnS3lBMFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVkdiRzloZEV4RklEMGdablZ1WTNScGIyNGdkM0pwZEdWR2JHOWhkRXhGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnlaWFIxY200Z2QzSnBkR1ZHYkc5aGRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0IwY25WbExDQnViMEZ6YzJWeWRDbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1M2NtbDBaVVpzYjJGMFFrVWdQU0JtZFc1amRHbHZiaUIzY21sMFpVWnNiMkYwUWtVZ0tIWmhiSFZsTENCdlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJSEpsZEhWeWJpQjNjbWwwWlVac2IyRjBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdaaGJITmxMQ0J1YjBGemMyVnlkQ2xjYm4xY2JseHVablZ1WTNScGIyNGdkM0pwZEdWRWIzVmliR1VnS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z2JHbDBkR3hsUlc1a2FXRnVMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCN1hHNGdJQ0FnWTJobFkydEpSVVZGTnpVMEtHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dPQ3dnTVM0M09UYzJPVE14TXpRNE5qSXpNVFUzUlNzek1EZ3NJQzB4TGpjNU56WTVNekV6TkRnMk1qTXhOVGRGS3pNd09DbGNiaUFnZlZ4dUlDQnBaV1ZsTnpVMExuZHlhWFJsS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z2JHbDBkR3hsUlc1a2FXRnVMQ0ExTWl3Z09DbGNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJRGhjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVSdmRXSnNaVXhGSUQwZ1puVnVZM1JwYjI0Z2QzSnBkR1ZFYjNWaWJHVk1SU0FvZG1Gc2RXVXNJRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2NtVjBkWEp1SUhkeWFYUmxSRzkxWW14bEtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJSFJ5ZFdVc0lHNXZRWE56WlhKMEtWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxSRzkxWW14bFFrVWdQU0JtZFc1amRHbHZiaUIzY21sMFpVUnZkV0pzWlVKRklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0J5WlhSMWNtNGdkM0pwZEdWRWIzVmliR1VvZEdocGN5d2dkbUZzZFdVc0lHOW1abk5sZEN3Z1ptRnNjMlVzSUc1dlFYTnpaWEowS1Z4dWZWeHVYRzR2THlCamIzQjVLSFJoY21kbGRFSjFabVpsY2l3Z2RHRnlaMlYwVTNSaGNuUTlNQ3dnYzI5MWNtTmxVM1JoY25ROU1Dd2djMjkxY21ObFJXNWtQV0oxWm1abGNpNXNaVzVuZEdncFhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExtTnZjSGtnUFNCbWRXNWpkR2x2YmlCamIzQjVJQ2gwWVhKblpYUXNJSFJoY21kbGRGTjBZWEowTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUdsbUlDZ2hjM1JoY25RcElITjBZWEowSUQwZ01GeHVJQ0JwWmlBb0lXVnVaQ0FtSmlCbGJtUWdJVDA5SURBcElHVnVaQ0E5SUhSb2FYTXViR1Z1WjNSb1hHNGdJR2xtSUNoMFlYSm5aWFJUZEdGeWRDQStQU0IwWVhKblpYUXViR1Z1WjNSb0tTQjBZWEpuWlhSVGRHRnlkQ0E5SUhSaGNtZGxkQzVzWlc1bmRHaGNiaUFnYVdZZ0tDRjBZWEpuWlhSVGRHRnlkQ2tnZEdGeVoyVjBVM1JoY25RZ1BTQXdYRzRnSUdsbUlDaGxibVFnUGlBd0lDWW1JR1Z1WkNBOElITjBZWEowS1NCbGJtUWdQU0J6ZEdGeWRGeHVYRzRnSUM4dklFTnZjSGtnTUNCaWVYUmxjenNnZDJVbmNtVWdaRzl1WlZ4dUlDQnBaaUFvWlc1a0lEMDlQU0J6ZEdGeWRDa2djbVYwZFhKdUlEQmNiaUFnYVdZZ0tIUmhjbWRsZEM1c1pXNW5kR2dnUFQwOUlEQWdmSHdnZEdocGN5NXNaVzVuZEdnZ1BUMDlJREFwSUhKbGRIVnliaUF3WEc1Y2JpQWdMeThnUm1GMFlXd2daWEp5YjNJZ1kyOXVaR2wwYVc5dWMxeHVJQ0JwWmlBb2RHRnlaMlYwVTNSaGNuUWdQQ0F3S1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0ozUmhjbWRsZEZOMFlYSjBJRzkxZENCdlppQmliM1Z1WkhNbktWeHVJQ0I5WEc0Z0lHbG1JQ2h6ZEdGeWRDQThJREFnZkh3Z2MzUmhjblFnUGowZ2RHaHBjeTVzWlc1bmRHZ3BJSFJvY205M0lHNWxkeUJTWVc1blpVVnljbTl5S0NkemIzVnlZMlZUZEdGeWRDQnZkWFFnYjJZZ1ltOTFibVJ6SnlsY2JpQWdhV1lnS0dWdVpDQThJREFwSUhSb2NtOTNJRzVsZHlCU1lXNW5aVVZ5Y205eUtDZHpiM1Z5WTJWRmJtUWdiM1YwSUc5bUlHSnZkVzVrY3ljcFhHNWNiaUFnTHk4Z1FYSmxJSGRsSUc5dllqOWNiaUFnYVdZZ0tHVnVaQ0ErSUhSb2FYTXViR1Z1WjNSb0tTQmxibVFnUFNCMGFHbHpMbXhsYm1kMGFGeHVJQ0JwWmlBb2RHRnlaMlYwTG14bGJtZDBhQ0F0SUhSaGNtZGxkRk4wWVhKMElEd2daVzVrSUMwZ2MzUmhjblFwSUh0Y2JpQWdJQ0JsYm1RZ1BTQjBZWEpuWlhRdWJHVnVaM1JvSUMwZ2RHRnlaMlYwVTNSaGNuUWdLeUJ6ZEdGeWRGeHVJQ0I5WEc1Y2JpQWdkbUZ5SUd4bGJpQTlJR1Z1WkNBdElITjBZWEowWEc0Z0lIWmhjaUJwWEc1Y2JpQWdhV1lnS0hSb2FYTWdQVDA5SUhSaGNtZGxkQ0FtSmlCemRHRnlkQ0E4SUhSaGNtZGxkRk4wWVhKMElDWW1JSFJoY21kbGRGTjBZWEowSUR3Z1pXNWtLU0I3WEc0Z0lDQWdMeThnWkdWelkyVnVaR2x1WnlCamIzQjVJR1p5YjIwZ1pXNWtYRzRnSUNBZ1ptOXlJQ2hwSUQwZ2JHVnVJQzBnTVRzZ2FTQStQU0F3T3lCcExTMHBJSHRjYmlBZ0lDQWdJSFJoY21kbGRGdHBJQ3NnZEdGeVoyVjBVM1JoY25SZElEMGdkR2hwYzF0cElDc2djM1JoY25SZFhHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2FXWWdLR3hsYmlBOElERXdNREFnZkh3Z0lVSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjdYRzRnSUNBZ0x5OGdZWE5qWlc1a2FXNW5JR052Y0hrZ1puSnZiU0J6ZEdGeWRGeHVJQ0FnSUdadmNpQW9hU0E5SURBN0lHa2dQQ0JzWlc0N0lHa3JLeWtnZTF4dUlDQWdJQ0FnZEdGeVoyVjBXMmtnS3lCMFlYSm5aWFJUZEdGeWRGMGdQU0IwYUdselcya2dLeUJ6ZEdGeWRGMWNiaUFnSUNCOVhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RHRnlaMlYwTGw5elpYUW9kR2hwY3k1emRXSmhjbkpoZVNoemRHRnlkQ3dnYzNSaGNuUWdLeUJzWlc0cExDQjBZWEpuWlhSVGRHRnlkQ2xjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJzWlc1Y2JuMWNibHh1THk4Z1ptbHNiQ2gyWVd4MVpTd2djM1JoY25ROU1Dd2daVzVrUFdKMVptWmxjaTVzWlc1bmRHZ3BYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbVpwYkd3Z1BTQm1kVzVqZEdsdmJpQm1hV3hzSUNoMllXeDFaU3dnYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0JwWmlBb0lYWmhiSFZsS1NCMllXeDFaU0E5SURCY2JpQWdhV1lnS0NGemRHRnlkQ2tnYzNSaGNuUWdQU0F3WEc0Z0lHbG1JQ2doWlc1a0tTQmxibVFnUFNCMGFHbHpMbXhsYm1kMGFGeHVYRzRnSUdsbUlDaGxibVFnUENCemRHRnlkQ2tnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0oyVnVaQ0E4SUhOMFlYSjBKeWxjYmx4dUlDQXZMeUJHYVd4c0lEQWdZbmwwWlhNN0lIZGxKM0psSUdSdmJtVmNiaUFnYVdZZ0tHVnVaQ0E5UFQwZ2MzUmhjblFwSUhKbGRIVnlibHh1SUNCcFppQW9kR2hwY3k1c1pXNW5kR2dnUFQwOUlEQXBJSEpsZEhWeWJseHVYRzRnSUdsbUlDaHpkR0Z5ZENBOElEQWdmSHdnYzNSaGNuUWdQajBnZEdocGN5NXNaVzVuZEdncElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2R6ZEdGeWRDQnZkWFFnYjJZZ1ltOTFibVJ6SnlsY2JpQWdhV1lnS0dWdVpDQThJREFnZkh3Z1pXNWtJRDRnZEdocGN5NXNaVzVuZEdncElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2RsYm1RZ2IzVjBJRzltSUdKdmRXNWtjeWNwWEc1Y2JpQWdkbUZ5SUdsY2JpQWdhV1lnS0hSNWNHVnZaaUIyWVd4MVpTQTlQVDBnSjI1MWJXSmxjaWNwSUh0Y2JpQWdJQ0JtYjNJZ0tHa2dQU0J6ZEdGeWREc2dhU0E4SUdWdVpEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMGFHbHpXMmxkSUQwZ2RtRnNkV1ZjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkbUZ5SUdKNWRHVnpJRDBnZFhSbU9GUnZRbmwwWlhNb2RtRnNkV1V1ZEc5VGRISnBibWNvS1NsY2JpQWdJQ0IyWVhJZ2JHVnVJRDBnWW5sMFpYTXViR1Z1WjNSb1hHNGdJQ0FnWm05eUlDaHBJRDBnYzNSaGNuUTdJR2tnUENCbGJtUTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjMXRwWFNBOUlHSjVkR1Z6VzJrZ0pTQnNaVzVkWEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSFJvYVhOY2JuMWNibHh1THlvcVhHNGdLaUJEY21WaGRHVnpJR0VnYm1WM0lHQkJjbkpoZVVKMVptWmxjbUFnZDJsMGFDQjBhR1VnS21OdmNHbGxaQ29nYldWdGIzSjVJRzltSUhSb1pTQmlkV1ptWlhJZ2FXNXpkR0Z1WTJVdVhHNGdLaUJCWkdSbFpDQnBiaUJPYjJSbElEQXVNVEl1SUU5dWJIa2dZWFpoYVd4aFlteGxJR2x1SUdKeWIzZHpaWEp6SUhSb1lYUWdjM1Z3Y0c5eWRDQkJjbkpoZVVKMVptWmxjaTVjYmlBcUwxeHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTBiMEZ5Y21GNVFuVm1abVZ5SUQwZ1puVnVZM1JwYjI0Z2RHOUJjbkpoZVVKMVptWmxjaUFvS1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnVldsdWREaEJjbkpoZVNBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0JwWmlBb1FuVm1abVZ5TGxSWlVFVkVYMEZTVWtGWlgxTlZVRkJQVWxRcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlBb2JtVjNJRUoxWm1abGNpaDBhR2x6S1NrdVluVm1abVZ5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIWmhjaUJpZFdZZ1BTQnVaWGNnVldsdWREaEJjbkpoZVNoMGFHbHpMbXhsYm1kMGFDbGNiaUFnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3TENCc1pXNGdQU0JpZFdZdWJHVnVaM1JvT3lCcElEd2diR1Z1T3lCcElDczlJREVwSUh0Y2JpQWdJQ0FnSUNBZ1luVm1XMmxkSUQwZ2RHaHBjMXRwWFZ4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJR0oxWmk1aWRXWm1aWEpjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRlI1Y0dWRmNuSnZjaWduUW5WbVptVnlMblJ2UVhKeVlYbENkV1ptWlhJZ2JtOTBJSE4xY0hCdmNuUmxaQ0JwYmlCMGFHbHpJR0p5YjNkelpYSW5LVnh1SUNCOVhHNTlYRzVjYmk4dklFaEZURkJGVWlCR1ZVNURWRWxQVGxOY2JpOHZJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNibHh1ZG1GeUlFSlFJRDBnUW5WbVptVnlMbkJ5YjNSdmRIbHdaVnh1WEc0dktpcGNiaUFxSUVGMVoyMWxiblFnWVNCVmFXNTBPRUZ5Y21GNUlDcHBibk4wWVc1alpTb2dLRzV2ZENCMGFHVWdWV2x1ZERoQmNuSmhlU0JqYkdGemN5RXBJSGRwZEdnZ1FuVm1abVZ5SUcxbGRHaHZaSE5jYmlBcUwxeHVRblZtWm1WeUxsOWhkV2R0Wlc1MElEMGdablZ1WTNScGIyNGdYMkYxWjIxbGJuUWdLR0Z5Y2lrZ2UxeHVJQ0JoY25JdVkyOXVjM1J5ZFdOMGIzSWdQU0JDZFdabVpYSmNiaUFnWVhKeUxsOXBjMEoxWm1abGNpQTlJSFJ5ZFdWY2JseHVJQ0F2THlCellYWmxJSEpsWm1WeVpXNWpaU0IwYnlCdmNtbG5hVzVoYkNCVmFXNTBPRUZ5Y21GNUlITmxkQ0J0WlhSb2IyUWdZbVZtYjNKbElHOTJaWEozY21sMGFXNW5YRzRnSUdGeWNpNWZjMlYwSUQwZ1lYSnlMbk5sZEZ4dVhHNGdJQzh2SUdSbGNISmxZMkYwWldSY2JpQWdZWEp5TG1kbGRDQTlJRUpRTG1kbGRGeHVJQ0JoY25JdWMyVjBJRDBnUWxBdWMyVjBYRzVjYmlBZ1lYSnlMbmR5YVhSbElEMGdRbEF1ZDNKcGRHVmNiaUFnWVhKeUxuUnZVM1J5YVc1bklEMGdRbEF1ZEc5VGRISnBibWRjYmlBZ1lYSnlMblJ2VEc5allXeGxVM1J5YVc1bklEMGdRbEF1ZEc5VGRISnBibWRjYmlBZ1lYSnlMblJ2U2xOUFRpQTlJRUpRTG5SdlNsTlBUbHh1SUNCaGNuSXVaWEYxWVd4eklEMGdRbEF1WlhGMVlXeHpYRzRnSUdGeWNpNWpiMjF3WVhKbElEMGdRbEF1WTI5dGNHRnlaVnh1SUNCaGNuSXVhVzVrWlhoUFppQTlJRUpRTG1sdVpHVjRUMlpjYmlBZ1lYSnlMbU52Y0hrZ1BTQkNVQzVqYjNCNVhHNGdJR0Z5Y2k1emJHbGpaU0E5SUVKUUxuTnNhV05sWEc0Z0lHRnljaTV5WldGa1ZVbHVkRXhGSUQwZ1FsQXVjbVZoWkZWSmJuUk1SVnh1SUNCaGNuSXVjbVZoWkZWSmJuUkNSU0E5SUVKUUxuSmxZV1JWU1c1MFFrVmNiaUFnWVhKeUxuSmxZV1JWU1c1ME9DQTlJRUpRTG5KbFlXUlZTVzUwT0Z4dUlDQmhjbkl1Y21WaFpGVkpiblF4Tmt4RklEMGdRbEF1Y21WaFpGVkpiblF4Tmt4RlhHNGdJR0Z5Y2k1eVpXRmtWVWx1ZERFMlFrVWdQU0JDVUM1eVpXRmtWVWx1ZERFMlFrVmNiaUFnWVhKeUxuSmxZV1JWU1c1ME16Sk1SU0E5SUVKUUxuSmxZV1JWU1c1ME16Sk1SVnh1SUNCaGNuSXVjbVZoWkZWSmJuUXpNa0pGSUQwZ1FsQXVjbVZoWkZWSmJuUXpNa0pGWEc0Z0lHRnljaTV5WldGa1NXNTBURVVnUFNCQ1VDNXlaV0ZrU1c1MFRFVmNiaUFnWVhKeUxuSmxZV1JKYm5SQ1JTQTlJRUpRTG5KbFlXUkpiblJDUlZ4dUlDQmhjbkl1Y21WaFpFbHVkRGdnUFNCQ1VDNXlaV0ZrU1c1ME9GeHVJQ0JoY25JdWNtVmhaRWx1ZERFMlRFVWdQU0JDVUM1eVpXRmtTVzUwTVRaTVJWeHVJQ0JoY25JdWNtVmhaRWx1ZERFMlFrVWdQU0JDVUM1eVpXRmtTVzUwTVRaQ1JWeHVJQ0JoY25JdWNtVmhaRWx1ZERNeVRFVWdQU0JDVUM1eVpXRmtTVzUwTXpKTVJWeHVJQ0JoY25JdWNtVmhaRWx1ZERNeVFrVWdQU0JDVUM1eVpXRmtTVzUwTXpKQ1JWeHVJQ0JoY25JdWNtVmhaRVpzYjJGMFRFVWdQU0JDVUM1eVpXRmtSbXh2WVhSTVJWeHVJQ0JoY25JdWNtVmhaRVpzYjJGMFFrVWdQU0JDVUM1eVpXRmtSbXh2WVhSQ1JWeHVJQ0JoY25JdWNtVmhaRVJ2ZFdKc1pVeEZJRDBnUWxBdWNtVmhaRVJ2ZFdKc1pVeEZYRzRnSUdGeWNpNXlaV0ZrUkc5MVlteGxRa1VnUFNCQ1VDNXlaV0ZrUkc5MVlteGxRa1ZjYmlBZ1lYSnlMbmR5YVhSbFZVbHVkRGdnUFNCQ1VDNTNjbWwwWlZWSmJuUTRYRzRnSUdGeWNpNTNjbWwwWlZWSmJuUk1SU0E5SUVKUUxuZHlhWFJsVlVsdWRFeEZYRzRnSUdGeWNpNTNjbWwwWlZWSmJuUkNSU0E5SUVKUUxuZHlhWFJsVlVsdWRFSkZYRzRnSUdGeWNpNTNjbWwwWlZWSmJuUXhOa3hGSUQwZ1FsQXVkM0pwZEdWVlNXNTBNVFpNUlZ4dUlDQmhjbkl1ZDNKcGRHVlZTVzUwTVRaQ1JTQTlJRUpRTG5keWFYUmxWVWx1ZERFMlFrVmNiaUFnWVhKeUxuZHlhWFJsVlVsdWRETXlURVVnUFNCQ1VDNTNjbWwwWlZWSmJuUXpNa3hGWEc0Z0lHRnljaTUzY21sMFpWVkpiblF6TWtKRklEMGdRbEF1ZDNKcGRHVlZTVzUwTXpKQ1JWeHVJQ0JoY25JdWQzSnBkR1ZKYm5STVJTQTlJRUpRTG5keWFYUmxTVzUwVEVWY2JpQWdZWEp5TG5keWFYUmxTVzUwUWtVZ1BTQkNVQzUzY21sMFpVbHVkRUpGWEc0Z0lHRnljaTUzY21sMFpVbHVkRGdnUFNCQ1VDNTNjbWwwWlVsdWREaGNiaUFnWVhKeUxuZHlhWFJsU1c1ME1UWk1SU0E5SUVKUUxuZHlhWFJsU1c1ME1UWk1SVnh1SUNCaGNuSXVkM0pwZEdWSmJuUXhOa0pGSUQwZ1FsQXVkM0pwZEdWSmJuUXhOa0pGWEc0Z0lHRnljaTUzY21sMFpVbHVkRE15VEVVZ1BTQkNVQzUzY21sMFpVbHVkRE15VEVWY2JpQWdZWEp5TG5keWFYUmxTVzUwTXpKQ1JTQTlJRUpRTG5keWFYUmxTVzUwTXpKQ1JWeHVJQ0JoY25JdWQzSnBkR1ZHYkc5aGRFeEZJRDBnUWxBdWQzSnBkR1ZHYkc5aGRFeEZYRzRnSUdGeWNpNTNjbWwwWlVac2IyRjBRa1VnUFNCQ1VDNTNjbWwwWlVac2IyRjBRa1ZjYmlBZ1lYSnlMbmR5YVhSbFJHOTFZbXhsVEVVZ1BTQkNVQzUzY21sMFpVUnZkV0pzWlV4RlhHNGdJR0Z5Y2k1M2NtbDBaVVJ2ZFdKc1pVSkZJRDBnUWxBdWQzSnBkR1ZFYjNWaWJHVkNSVnh1SUNCaGNuSXVabWxzYkNBOUlFSlFMbVpwYkd4Y2JpQWdZWEp5TG1sdWMzQmxZM1FnUFNCQ1VDNXBibk53WldOMFhHNGdJR0Z5Y2k1MGIwRnljbUY1UW5WbVptVnlJRDBnUWxBdWRHOUJjbkpoZVVKMVptWmxjbHh1WEc0Z0lISmxkSFZ5YmlCaGNuSmNibjFjYmx4dWRtRnlJRWxPVmtGTVNVUmZRa0ZUUlRZMFgxSkZJRDBnTDF0ZUsxeGNMekF0T1VFdFdtRXRlaTFmWFM5blhHNWNibVoxYm1OMGFXOXVJR0poYzJVMk5HTnNaV0Z1SUNoemRISXBJSHRjYmlBZ0x5OGdUbTlrWlNCemRISnBjSE1nYjNWMElHbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeWN5QnNhV3RsSUZ4Y2JpQmhibVFnWEZ4MElHWnliMjBnZEdobElITjBjbWx1Wnl3Z1ltRnpaVFkwTFdweklHUnZaWE1nYm05MFhHNGdJSE4wY2lBOUlITjBjbWx1WjNSeWFXMG9jM1J5S1M1eVpYQnNZV05sS0VsT1ZrRk1TVVJmUWtGVFJUWTBYMUpGTENBbkp5bGNiaUFnTHk4Z1RtOWtaU0JqYjI1MlpYSjBjeUJ6ZEhKcGJtZHpJSGRwZEdnZ2JHVnVaM1JvSUR3Z01pQjBieUFuSjF4dUlDQnBaaUFvYzNSeUxteGxibWQwYUNBOElESXBJSEpsZEhWeWJpQW5KMXh1SUNBdkx5Qk9iMlJsSUdGc2JHOTNjeUJtYjNJZ2JtOXVMWEJoWkdSbFpDQmlZWE5sTmpRZ2MzUnlhVzVuY3lBb2JXbHpjMmx1WnlCMGNtRnBiR2x1WnlBOVBUMHBMQ0JpWVhObE5qUXRhbk1nWkc5bGN5QnViM1JjYmlBZ2QyaHBiR1VnS0hOMGNpNXNaVzVuZEdnZ0pTQTBJQ0U5UFNBd0tTQjdYRzRnSUNBZ2MzUnlJRDBnYzNSeUlDc2dKejBuWEc0Z0lIMWNiaUFnY21WMGRYSnVJSE4wY2x4dWZWeHVYRzVtZFc1amRHbHZiaUJ6ZEhKcGJtZDBjbWx0SUNoemRISXBJSHRjYmlBZ2FXWWdLSE4wY2k1MGNtbHRLU0J5WlhSMWNtNGdjM1J5TG5SeWFXMG9LVnh1SUNCeVpYUjFjbTRnYzNSeUxuSmxjR3hoWTJVb0wxNWNYSE1yZkZ4Y2N5c2tMMmNzSUNjbktWeHVmVnh1WEc1bWRXNWpkR2x2YmlCMGIwaGxlQ0FvYmlrZ2UxeHVJQ0JwWmlBb2JpQThJREUyS1NCeVpYUjFjbTRnSnpBbklDc2diaTUwYjFOMGNtbHVaeWd4TmlsY2JpQWdjbVYwZFhKdUlHNHVkRzlUZEhKcGJtY29NVFlwWEc1OVhHNWNibVoxYm1OMGFXOXVJSFYwWmpoVWIwSjVkR1Z6SUNoemRISnBibWNzSUhWdWFYUnpLU0I3WEc0Z0lIVnVhWFJ6SUQwZ2RXNXBkSE1nZkh3Z1NXNW1hVzVwZEhsY2JpQWdkbUZ5SUdOdlpHVlFiMmx1ZEZ4dUlDQjJZWElnYkdWdVozUm9JRDBnYzNSeWFXNW5MbXhsYm1kMGFGeHVJQ0IyWVhJZ2JHVmhaRk4xY25KdloyRjBaU0E5SUc1MWJHeGNiaUFnZG1GeUlHSjVkR1Z6SUQwZ1cxMWNibHh1SUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdZMjlrWlZCdmFXNTBJRDBnYzNSeWFXNW5MbU5vWVhKRGIyUmxRWFFvYVNsY2JseHVJQ0FnSUM4dklHbHpJSE4xY25KdloyRjBaU0JqYjIxd2IyNWxiblJjYmlBZ0lDQnBaaUFvWTI5a1pWQnZhVzUwSUQ0Z01IaEVOMFpHSUNZbUlHTnZaR1ZRYjJsdWRDQThJREI0UlRBd01Da2dlMXh1SUNBZ0lDQWdMeThnYkdGemRDQmphR0Z5SUhkaGN5QmhJR3hsWVdSY2JpQWdJQ0FnSUdsbUlDZ2hiR1ZoWkZOMWNuSnZaMkYwWlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1YnlCc1pXRmtJSGxsZEZ4dUlDQWdJQ0FnSUNCcFppQW9ZMjlrWlZCdmFXNTBJRDRnTUhoRVFrWkdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdkVzVsZUhCbFkzUmxaQ0IwY21GcGJGeHVJQ0FnSUNBZ0lDQWdJR2xtSUNnb2RXNXBkSE1nTFQwZ015a2dQaUF0TVNrZ1lubDBaWE11Y0hWemFDZ3dlRVZHTENBd2VFSkdMQ0F3ZUVKRUtWeHVJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYVNBcklERWdQVDA5SUd4bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSFZ1Y0dGcGNtVmtJR3hsWVdSY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvS0hWdWFYUnpJQzA5SURNcElENGdMVEVwSUdKNWRHVnpMbkIxYzJnb01IaEZSaXdnTUhoQ1Jpd2dNSGhDUkNsY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnTHk4Z2RtRnNhV1FnYkdWaFpGeHVJQ0FnSUNBZ0lDQnNaV0ZrVTNWeWNtOW5ZWFJsSUQwZ1kyOWtaVkJ2YVc1MFhHNWNiaUFnSUNBZ0lDQWdZMjl1ZEdsdWRXVmNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdMeThnTWlCc1pXRmtjeUJwYmlCaElISnZkMXh1SUNBZ0lDQWdhV1lnS0dOdlpHVlFiMmx1ZENBOElEQjRSRU13TUNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvS0hWdWFYUnpJQzA5SURNcElENGdMVEVwSUdKNWRHVnpMbkIxYzJnb01IaEZSaXdnTUhoQ1Jpd2dNSGhDUkNsY2JpQWdJQ0FnSUNBZ2JHVmhaRk4xY25KdloyRjBaU0E5SUdOdlpHVlFiMmx1ZEZ4dUlDQWdJQ0FnSUNCamIyNTBhVzUxWlZ4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBdkx5QjJZV3hwWkNCemRYSnliMmRoZEdVZ2NHRnBjbHh1SUNBZ0lDQWdZMjlrWlZCdmFXNTBJRDBnS0d4bFlXUlRkWEp5YjJkaGRHVWdMU0F3ZUVRNE1EQWdQRHdnTVRBZ2ZDQmpiMlJsVUc5cGJuUWdMU0F3ZUVSRE1EQXBJQ3NnTUhneE1EQXdNRnh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iR1ZoWkZOMWNuSnZaMkYwWlNrZ2UxeHVJQ0FnSUNBZ0x5OGdkbUZzYVdRZ1ltMXdJR05vWVhJc0lHSjFkQ0JzWVhOMElHTm9ZWElnZDJGeklHRWdiR1ZoWkZ4dUlDQWdJQ0FnYVdZZ0tDaDFibWwwY3lBdFBTQXpLU0ErSUMweEtTQmllWFJsY3k1d2RYTm9LREI0UlVZc0lEQjRRa1lzSURCNFFrUXBYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2JHVmhaRk4xY25KdloyRjBaU0E5SUc1MWJHeGNibHh1SUNBZ0lDOHZJR1Z1WTI5a1pTQjFkR1k0WEc0Z0lDQWdhV1lnS0dOdlpHVlFiMmx1ZENBOElEQjRPREFwSUh0Y2JpQWdJQ0FnSUdsbUlDZ29kVzVwZEhNZ0xUMGdNU2tnUENBd0tTQmljbVZoYTF4dUlDQWdJQ0FnWW5sMFpYTXVjSFZ6YUNoamIyUmxVRzlwYm5RcFhHNGdJQ0FnZlNCbGJITmxJR2xtSUNoamIyUmxVRzlwYm5RZ1BDQXdlRGd3TUNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ2gxYm1sMGN5QXRQU0F5S1NBOElEQXBJR0p5WldGclhHNGdJQ0FnSUNCaWVYUmxjeTV3ZFhOb0tGeHVJQ0FnSUNBZ0lDQmpiMlJsVUc5cGJuUWdQajRnTUhnMklId2dNSGhETUN4Y2JpQWdJQ0FnSUNBZ1kyOWtaVkJ2YVc1MElDWWdNSGd6UmlCOElEQjRPREJjYmlBZ0lDQWdJQ2xjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR052WkdWUWIybHVkQ0E4SURCNE1UQXdNREFwSUh0Y2JpQWdJQ0FnSUdsbUlDZ29kVzVwZEhNZ0xUMGdNeWtnUENBd0tTQmljbVZoYTF4dUlDQWdJQ0FnWW5sMFpYTXVjSFZ6YUNoY2JpQWdJQ0FnSUNBZ1kyOWtaVkJ2YVc1MElENCtJREI0UXlCOElEQjRSVEFzWEc0Z0lDQWdJQ0FnSUdOdlpHVlFiMmx1ZENBK1BpQXdlRFlnSmlBd2VETkdJSHdnTUhnNE1DeGNiaUFnSUNBZ0lDQWdZMjlrWlZCdmFXNTBJQ1lnTUhnelJpQjhJREI0T0RCY2JpQWdJQ0FnSUNsY2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0dOdlpHVlFiMmx1ZENBOElEQjRNVEV3TURBd0tTQjdYRzRnSUNBZ0lDQnBaaUFvS0hWdWFYUnpJQzA5SURRcElEd2dNQ2tnWW5KbFlXdGNiaUFnSUNBZ0lHSjVkR1Z6TG5CMWMyZ29YRzRnSUNBZ0lDQWdJR052WkdWUWIybHVkQ0ErUGlBd2VERXlJSHdnTUhoR01DeGNiaUFnSUNBZ0lDQWdZMjlrWlZCdmFXNTBJRDQrSURCNFF5QW1JREI0TTBZZ2ZDQXdlRGd3TEZ4dUlDQWdJQ0FnSUNCamIyUmxVRzlwYm5RZ1BqNGdNSGcySUNZZ01IZ3pSaUI4SURCNE9EQXNYRzRnSUNBZ0lDQWdJR052WkdWUWIybHVkQ0FtSURCNE0wWWdmQ0F3ZURnd1hHNGdJQ0FnSUNBcFhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25TVzUyWVd4cFpDQmpiMlJsSUhCdmFXNTBKeWxjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdZbmwwWlhOY2JuMWNibHh1Wm5WdVkzUnBiMjRnWVhOamFXbFViMEo1ZEdWeklDaHpkSElwSUh0Y2JpQWdkbUZ5SUdKNWRHVkJjbkpoZVNBOUlGdGRYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2MzUnlMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnTHk4Z1RtOWtaU2R6SUdOdlpHVWdjMlZsYlhNZ2RHOGdZbVVnWkc5cGJtY2dkR2hwY3lCaGJtUWdibTkwSUNZZ01IZzNSaTR1WEc0Z0lDQWdZbmwwWlVGeWNtRjVMbkIxYzJnb2MzUnlMbU5vWVhKRGIyUmxRWFFvYVNrZ0ppQXdlRVpHS1Z4dUlDQjlYRzRnSUhKbGRIVnliaUJpZVhSbFFYSnlZWGxjYm4xY2JseHVablZ1WTNScGIyNGdkWFJtTVRac1pWUnZRbmwwWlhNZ0tITjBjaXdnZFc1cGRITXBJSHRjYmlBZ2RtRnlJR01zSUdocExDQnNiMXh1SUNCMllYSWdZbmwwWlVGeWNtRjVJRDBnVzExY2JpQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0J6ZEhJdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnBaaUFvS0hWdWFYUnpJQzA5SURJcElEd2dNQ2tnWW5KbFlXdGNibHh1SUNBZ0lHTWdQU0J6ZEhJdVkyaGhja052WkdWQmRDaHBLVnh1SUNBZ0lHaHBJRDBnWXlBK1BpQTRYRzRnSUNBZ2JHOGdQU0JqSUNVZ01qVTJYRzRnSUNBZ1lubDBaVUZ5Y21GNUxuQjFjMmdvYkc4cFhHNGdJQ0FnWW5sMFpVRnljbUY1TG5CMWMyZ29hR2twWEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWW5sMFpVRnljbUY1WEc1OVhHNWNibVoxYm1OMGFXOXVJR0poYzJVMk5GUnZRbmwwWlhNZ0tITjBjaWtnZTF4dUlDQnlaWFIxY200Z1ltRnpaVFkwTG5SdlFubDBaVUZ5Y21GNUtHSmhjMlUyTkdOc1pXRnVLSE4wY2lrcFhHNTlYRzVjYm1aMWJtTjBhVzl1SUdKc2FYUkNkV1ptWlhJZ0tITnlZeXdnWkhOMExDQnZabVp6WlhRc0lHeGxibWQwYUNrZ2UxeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLQ2hwSUNzZ2IyWm1jMlYwSUQ0OUlHUnpkQzVzWlc1bmRHZ3BJSHg4SUNocElENDlJSE55WXk1c1pXNW5kR2dwS1NCaWNtVmhhMXh1SUNBZ0lHUnpkRnRwSUNzZ2IyWm1jMlYwWFNBOUlITnlZMXRwWFZ4dUlDQjlYRzRnSUhKbGRIVnliaUJwWEc1OVhHNGlYWDA9IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIoZnVuY3Rpb24gKEJ1ZmZlcil7XG52YXIgY2xvbmUgPSAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2xvbmVzIChjb3BpZXMpIGFuIE9iamVjdCB1c2luZyBkZWVwIGNvcHlpbmcuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGRlZmF1bHQsIGJ1dCBpZiB5b3UgYXJlIGNlcnRhaW5cbiAqIHRoZXJlIGFyZSBubyBjaXJjdWxhciByZWZlcmVuY2VzIGluIHlvdXIgb2JqZWN0LCB5b3UgY2FuIHNhdmUgc29tZSBDUFUgdGltZVxuICogYnkgY2FsbGluZyBjbG9uZShvYmosIGZhbHNlKS5cbiAqXG4gKiBDYXV0aW9uOiBpZiBgY2lyY3VsYXJgIGlzIGZhbHNlIGFuZCBgcGFyZW50YCBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2VzLFxuICogeW91ciBwcm9ncmFtIG1heSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGFuZCBjcmFzaC5cbiAqXG4gKiBAcGFyYW0gYHBhcmVudGAgLSB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZFxuICogQHBhcmFtIGBjaXJjdWxhcmAgLSBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZCBtYXkgY29udGFpblxuICogICAgY2lyY3VsYXIgcmVmZXJlbmNlcy4gKG9wdGlvbmFsIC0gdHJ1ZSBieSBkZWZhdWx0KVxuICogQHBhcmFtIGBkZXB0aGAgLSBzZXQgdG8gYSBudW1iZXIgaWYgdGhlIG9iamVjdCBpcyBvbmx5IHRvIGJlIGNsb25lZCB0b1xuICogICAgYSBwYXJ0aWN1bGFyIGRlcHRoLiAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBJbmZpbml0eSlcbiAqIEBwYXJhbSBgcHJvdG90eXBlYCAtIHNldHMgdGhlIHByb3RvdHlwZSB0byBiZSB1c2VkIHdoZW4gY2xvbmluZyBhbiBvYmplY3QuXG4gKiAgICAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBwYXJlbnQgcHJvdG90eXBlKS5cbiovXG5mdW5jdGlvbiBjbG9uZShwYXJlbnQsIGNpcmN1bGFyLCBkZXB0aCwgcHJvdG90eXBlKSB7XG4gIHZhciBmaWx0ZXI7XG4gIGlmICh0eXBlb2YgY2lyY3VsYXIgPT09ICdvYmplY3QnKSB7XG4gICAgZGVwdGggPSBjaXJjdWxhci5kZXB0aDtcbiAgICBwcm90b3R5cGUgPSBjaXJjdWxhci5wcm90b3R5cGU7XG4gICAgZmlsdGVyID0gY2lyY3VsYXIuZmlsdGVyO1xuICAgIGNpcmN1bGFyID0gY2lyY3VsYXIuY2lyY3VsYXJcbiAgfVxuICAvLyBtYWludGFpbiB0d28gYXJyYXlzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLCB3aGVyZSBjb3JyZXNwb25kaW5nIHBhcmVudHNcbiAgLy8gYW5kIGNoaWxkcmVuIGhhdmUgdGhlIHNhbWUgaW5kZXhcbiAgdmFyIGFsbFBhcmVudHMgPSBbXTtcbiAgdmFyIGFsbENoaWxkcmVuID0gW107XG5cbiAgdmFyIHVzZUJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT0gJ3VuZGVmaW5lZCc7XG5cbiAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PSAndW5kZWZpbmVkJylcbiAgICBjaXJjdWxhciA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBkZXB0aCA9PSAndW5kZWZpbmVkJylcbiAgICBkZXB0aCA9IEluZmluaXR5O1xuXG4gIC8vIHJlY3Vyc2UgdGhpcyBmdW5jdGlvbiBzbyB3ZSBkb24ndCByZXNldCBhbGxQYXJlbnRzIGFuZCBhbGxDaGlsZHJlblxuICBmdW5jdGlvbiBfY2xvbmUocGFyZW50LCBkZXB0aCkge1xuICAgIC8vIGNsb25pbmcgbnVsbCBhbHdheXMgcmV0dXJucyBudWxsXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICByZXR1cm4gcGFyZW50O1xuXG4gICAgdmFyIGNoaWxkO1xuICAgIHZhciBwcm90bztcbiAgICBpZiAodHlwZW9mIHBhcmVudCAhPSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmUuX19pc0FycmF5KHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gW107XG4gICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzUmVnRXhwKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IFJlZ0V4cChwYXJlbnQuc291cmNlLCBfX2dldFJlZ0V4cEZsYWdzKHBhcmVudCkpO1xuICAgICAgaWYgKHBhcmVudC5sYXN0SW5kZXgpIGNoaWxkLmxhc3RJbmRleCA9IHBhcmVudC5sYXN0SW5kZXg7XG4gICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzRGF0ZShwYXJlbnQpKSB7XG4gICAgICBjaGlsZCA9IG5ldyBEYXRlKHBhcmVudC5nZXRUaW1lKCkpO1xuICAgIH0gZWxzZSBpZiAodXNlQnVmZmVyICYmIEJ1ZmZlci5pc0J1ZmZlcihwYXJlbnQpKSB7XG4gICAgICBjaGlsZCA9IG5ldyBCdWZmZXIocGFyZW50Lmxlbmd0aCk7XG4gICAgICBwYXJlbnQuY29weShjaGlsZCk7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvdG90eXBlID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBhcmVudCk7XG4gICAgICAgIGNoaWxkID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICAgIHByb3RvID0gcHJvdG90eXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgdmFyIGluZGV4ID0gYWxsUGFyZW50cy5pbmRleE9mKHBhcmVudCk7XG5cbiAgICAgIGlmIChpbmRleCAhPSAtMSkge1xuICAgICAgICByZXR1cm4gYWxsQ2hpbGRyZW5baW5kZXhdO1xuICAgICAgfVxuICAgICAgYWxsUGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgICBhbGxDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpIGluIHBhcmVudCkge1xuICAgICAgdmFyIGF0dHJzO1xuICAgICAgaWYgKHByb3RvKSB7XG4gICAgICAgIGF0dHJzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgaSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRycyAmJiBhdHRycy5zZXQgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkW2ldID0gX2Nsb25lKHBhcmVudFtpXSwgZGVwdGggLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICByZXR1cm4gX2Nsb25lKHBhcmVudCwgZGVwdGgpO1xufVxuXG4vKipcbiAqIFNpbXBsZSBmbGF0IGNsb25lIHVzaW5nIHByb3RvdHlwZSwgYWNjZXB0cyBvbmx5IG9iamVjdHMsIHVzZWZ1bGwgZm9yIHByb3BlcnR5XG4gKiBvdmVycmlkZSBvbiBGTEFUIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChubyBuZXN0ZWQgcHJvcHMpLlxuICpcbiAqIFVTRSBXSVRIIENBVVRJT04hIFRoaXMgbWF5IG5vdCBiZWhhdmUgYXMgeW91IHdpc2ggaWYgeW91IGRvIG5vdCBrbm93IGhvdyB0aGlzXG4gKiB3b3Jrcy5cbiAqL1xuY2xvbmUuY2xvbmVQcm90b3R5cGUgPSBmdW5jdGlvbiBjbG9uZVByb3RvdHlwZShwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgYyA9IGZ1bmN0aW9uICgpIHt9O1xuICBjLnByb3RvdHlwZSA9IHBhcmVudDtcbiAgcmV0dXJuIG5ldyBjKCk7XG59O1xuXG4vLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIF9fb2JqVG9TdHIobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufTtcbmNsb25lLl9fb2JqVG9TdHIgPSBfX29ialRvU3RyO1xuXG5mdW5jdGlvbiBfX2lzRGF0ZShvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufTtcbmNsb25lLl9faXNEYXRlID0gX19pc0RhdGU7XG5cbmZ1bmN0aW9uIF9faXNBcnJheShvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5jbG9uZS5fX2lzQXJyYXkgPSBfX2lzQXJyYXk7XG5cbmZ1bmN0aW9uIF9faXNSZWdFeHAobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcbmNsb25lLl9faXNSZWdFeHAgPSBfX2lzUmVnRXhwO1xuXG5mdW5jdGlvbiBfX2dldFJlZ0V4cEZsYWdzKHJlKSB7XG4gIHZhciBmbGFncyA9ICcnO1xuICBpZiAocmUuZ2xvYmFsKSBmbGFncyArPSAnZyc7XG4gIGlmIChyZS5pZ25vcmVDYXNlKSBmbGFncyArPSAnaSc7XG4gIGlmIChyZS5tdWx0aWxpbmUpIGZsYWdzICs9ICdtJztcbiAgcmV0dXJuIGZsYWdzO1xufTtcbmNsb25lLl9fZ2V0UmVnRXhwRmxhZ3MgPSBfX2dldFJlZ0V4cEZsYWdzO1xuXG5yZXR1cm4gY2xvbmU7XG59KSgpO1xuXG5pZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBjbG9uZTtcbn1cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWpiRzl1WlM5amJHOXVaUzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpZG1GeUlHTnNiMjVsSUQwZ0tHWjFibU4wYVc5dUtDa2dlMXh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzR2S2lwY2JpQXFJRU5zYjI1bGN5QW9ZMjl3YVdWektTQmhiaUJQWW1wbFkzUWdkWE5wYm1jZ1pHVmxjQ0JqYjNCNWFXNW5MbHh1SUNwY2JpQXFJRlJvYVhNZ1puVnVZM1JwYjI0Z2MzVndjRzl5ZEhNZ1kybHlZM1ZzWVhJZ2NtVm1aWEpsYm1ObGN5QmllU0JrWldaaGRXeDBMQ0JpZFhRZ2FXWWdlVzkxSUdGeVpTQmpaWEowWVdsdVhHNGdLaUIwYUdWeVpTQmhjbVVnYm04Z1kybHlZM1ZzWVhJZ2NtVm1aWEpsYm1ObGN5QnBiaUI1YjNWeUlHOWlhbVZqZEN3Z2VXOTFJR05oYmlCellYWmxJSE52YldVZ1ExQlZJSFJwYldWY2JpQXFJR0o1SUdOaGJHeHBibWNnWTJ4dmJtVW9iMkpxTENCbVlXeHpaU2t1WEc0Z0tseHVJQ29nUTJGMWRHbHZiam9nYVdZZ1lHTnBjbU4xYkdGeVlDQnBjeUJtWVd4elpTQmhibVFnWUhCaGNtVnVkR0FnWTI5dWRHRnBibk1nWTJseVkzVnNZWElnY21WbVpYSmxibU5sY3l4Y2JpQXFJSGx2ZFhJZ2NISnZaM0poYlNCdFlYa2daVzUwWlhJZ1lXNGdhVzVtYVc1cGRHVWdiRzl2Y0NCaGJtUWdZM0poYzJndVhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUdCd1lYSmxiblJnSUMwZ2RHaGxJRzlpYW1WamRDQjBieUJpWlNCamJHOXVaV1JjYmlBcUlFQndZWEpoYlNCZ1kybHlZM1ZzWVhKZ0lDMGdjMlYwSUhSdklIUnlkV1VnYVdZZ2RHaGxJRzlpYW1WamRDQjBieUJpWlNCamJHOXVaV1FnYldGNUlHTnZiblJoYVc1Y2JpQXFJQ0FnSUdOcGNtTjFiR0Z5SUhKbFptVnlaVzVqWlhNdUlDaHZjSFJwYjI1aGJDQXRJSFJ5ZFdVZ1lua2daR1ZtWVhWc2RDbGNiaUFxSUVCd1lYSmhiU0JnWkdWd2RHaGdJQzBnYzJWMElIUnZJR0VnYm5WdFltVnlJR2xtSUhSb1pTQnZZbXBsWTNRZ2FYTWdiMjVzZVNCMGJ5QmlaU0JqYkc5dVpXUWdkRzljYmlBcUlDQWdJR0VnY0dGeWRHbGpkV3hoY2lCa1pYQjBhQzRnS0c5d2RHbHZibUZzSUMwZ1pHVm1ZWFZzZEhNZ2RHOGdTVzVtYVc1cGRIa3BYRzRnS2lCQWNHRnlZVzBnWUhCeWIzUnZkSGx3WldBZ0xTQnpaWFJ6SUhSb1pTQndjbTkwYjNSNWNHVWdkRzhnWW1VZ2RYTmxaQ0IzYUdWdUlHTnNiMjVwYm1jZ1lXNGdiMkpxWldOMExseHVJQ29nSUNBZ0tHOXdkR2x2Ym1Gc0lDMGdaR1ZtWVhWc2RITWdkRzhnY0dGeVpXNTBJSEJ5YjNSdmRIbHdaU2t1WEc0cUwxeHVablZ1WTNScGIyNGdZMnh2Ym1Vb2NHRnlaVzUwTENCamFYSmpkV3hoY2l3Z1pHVndkR2dzSUhCeWIzUnZkSGx3WlNrZ2UxeHVJQ0IyWVhJZ1ptbHNkR1Z5TzF4dUlDQnBaaUFvZEhsd1pXOW1JR05wY21OMWJHRnlJRDA5UFNBbmIySnFaV04wSnlrZ2UxeHVJQ0FnSUdSbGNIUm9JRDBnWTJseVkzVnNZWEl1WkdWd2RHZzdYRzRnSUNBZ2NISnZkRzkwZVhCbElEMGdZMmx5WTNWc1lYSXVjSEp2ZEc5MGVYQmxPMXh1SUNBZ0lHWnBiSFJsY2lBOUlHTnBjbU4xYkdGeUxtWnBiSFJsY2p0Y2JpQWdJQ0JqYVhKamRXeGhjaUE5SUdOcGNtTjFiR0Z5TG1OcGNtTjFiR0Z5WEc0Z0lIMWNiaUFnTHk4Z2JXRnBiblJoYVc0Z2RIZHZJR0Z5Y21GNWN5Qm1iM0lnWTJseVkzVnNZWElnY21WbVpYSmxibU5sY3l3Z2QyaGxjbVVnWTI5eWNtVnpjRzl1WkdsdVp5QndZWEpsYm5SelhHNGdJQzh2SUdGdVpDQmphR2xzWkhKbGJpQm9ZWFpsSUhSb1pTQnpZVzFsSUdsdVpHVjRYRzRnSUhaaGNpQmhiR3hRWVhKbGJuUnpJRDBnVzEwN1hHNGdJSFpoY2lCaGJHeERhR2xzWkhKbGJpQTlJRnRkTzF4dVhHNGdJSFpoY2lCMWMyVkNkV1ptWlhJZ1BTQjBlWEJsYjJZZ1FuVm1abVZ5SUNFOUlDZDFibVJsWm1sdVpXUW5PMXh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdZMmx5WTNWc1lYSWdQVDBnSjNWdVpHVm1hVzVsWkNjcFhHNGdJQ0FnWTJseVkzVnNZWElnUFNCMGNuVmxPMXh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdaR1Z3ZEdnZ1BUMGdKM1Z1WkdWbWFXNWxaQ2NwWEc0Z0lDQWdaR1Z3ZEdnZ1BTQkpibVpwYm1sMGVUdGNibHh1SUNBdkx5QnlaV04xY25ObElIUm9hWE1nWm5WdVkzUnBiMjRnYzI4Z2QyVWdaRzl1SjNRZ2NtVnpaWFFnWVd4c1VHRnlaVzUwY3lCaGJtUWdZV3hzUTJocGJHUnlaVzVjYmlBZ1puVnVZM1JwYjI0Z1gyTnNiMjVsS0hCaGNtVnVkQ3dnWkdWd2RHZ3BJSHRjYmlBZ0lDQXZMeUJqYkc5dWFXNW5JRzUxYkd3Z1lXeDNZWGx6SUhKbGRIVnlibk1nYm5Wc2JGeHVJQ0FnSUdsbUlDaHdZWEpsYm5RZ1BUMDlJRzUxYkd3cFhHNGdJQ0FnSUNCeVpYUjFjbTRnYm5Wc2JEdGNibHh1SUNBZ0lHbG1JQ2hrWlhCMGFDQTlQU0F3S1Z4dUlDQWdJQ0FnY21WMGRYSnVJSEJoY21WdWREdGNibHh1SUNBZ0lIWmhjaUJqYUdsc1pEdGNiaUFnSUNCMllYSWdjSEp2ZEc4N1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCd1lYSmxiblFnSVQwZ0oyOWlhbVZqZENjcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd1lYSmxiblE3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0dOc2IyNWxMbDlmYVhOQmNuSmhlU2h3WVhKbGJuUXBLU0I3WEc0Z0lDQWdJQ0JqYUdsc1pDQTlJRnRkTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWTJ4dmJtVXVYMTlwYzFKbFowVjRjQ2h3WVhKbGJuUXBLU0I3WEc0Z0lDQWdJQ0JqYUdsc1pDQTlJRzVsZHlCU1pXZEZlSEFvY0dGeVpXNTBMbk52ZFhKalpTd2dYMTluWlhSU1pXZEZlSEJHYkdGbmN5aHdZWEpsYm5RcEtUdGNiaUFnSUNBZ0lHbG1JQ2h3WVhKbGJuUXViR0Z6ZEVsdVpHVjRLU0JqYUdsc1pDNXNZWE4wU1c1a1pYZ2dQU0J3WVhKbGJuUXViR0Z6ZEVsdVpHVjRPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZMnh2Ym1VdVgxOXBjMFJoZEdVb2NHRnlaVzUwS1NrZ2UxeHVJQ0FnSUNBZ1kyaHBiR1FnUFNCdVpYY2dSR0YwWlNod1lYSmxiblF1WjJWMFZHbHRaU2dwS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hWelpVSjFabVpsY2lBbUppQkNkV1ptWlhJdWFYTkNkV1ptWlhJb2NHRnlaVzUwS1NrZ2UxeHVJQ0FnSUNBZ1kyaHBiR1FnUFNCdVpYY2dRblZtWm1WeUtIQmhjbVZ1ZEM1c1pXNW5kR2dwTzF4dUlDQWdJQ0FnY0dGeVpXNTBMbU52Y0hrb1kyaHBiR1FwTzF4dUlDQWdJQ0FnY21WMGRYSnVJR05vYVd4a08xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCeWIzUnZkSGx3WlNBOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnSUNCd2NtOTBieUE5SUU5aWFtVmpkQzVuWlhSUWNtOTBiM1I1Y0dWUFppaHdZWEpsYm5RcE8xeHVJQ0FnSUNBZ0lDQmphR2xzWkNBOUlFOWlhbVZqZEM1amNtVmhkR1VvY0hKdmRHOHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lHTm9hV3hrSUQwZ1QySnFaV04wTG1OeVpXRjBaU2h3Y205MGIzUjVjR1VwTzF4dUlDQWdJQ0FnSUNCd2NtOTBieUE5SUhCeWIzUnZkSGx3WlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb1kybHlZM1ZzWVhJcElIdGNiaUFnSUNBZ0lIWmhjaUJwYm1SbGVDQTlJR0ZzYkZCaGNtVnVkSE11YVc1a1pYaFBaaWh3WVhKbGJuUXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb2FXNWtaWGdnSVQwZ0xURXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR0ZzYkVOb2FXeGtjbVZ1VzJsdVpHVjRYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR0ZzYkZCaGNtVnVkSE11Y0hWemFDaHdZWEpsYm5RcE8xeHVJQ0FnSUNBZ1lXeHNRMmhwYkdSeVpXNHVjSFZ6YUNoamFHbHNaQ2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdabTl5SUNoMllYSWdhU0JwYmlCd1lYSmxiblFwSUh0Y2JpQWdJQ0FnSUhaaGNpQmhkSFJ5Y3p0Y2JpQWdJQ0FnSUdsbUlDaHdjbTkwYnlrZ2UxeHVJQ0FnSUNBZ0lDQmhkSFJ5Y3lBOUlFOWlhbVZqZEM1blpYUlBkMjVRY205d1pYSjBlVVJsYzJOeWFYQjBiM0lvY0hKdmRHOHNJR2twTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCcFppQW9ZWFIwY25NZ0ppWWdZWFIwY25NdWMyVjBJRDA5SUc1MWJHd3BJSHRjYmlBZ0lDQWdJQ0FnWTI5dWRHbHVkV1U3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JqYUdsc1pGdHBYU0E5SUY5amJHOXVaU2h3WVhKbGJuUmJhVjBzSUdSbGNIUm9JQzBnTVNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJR05vYVd4a08xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlGOWpiRzl1WlNod1lYSmxiblFzSUdSbGNIUm9LVHRjYm4xY2JseHVMeW9xWEc0Z0tpQlRhVzF3YkdVZ1pteGhkQ0JqYkc5dVpTQjFjMmx1WnlCd2NtOTBiM1I1Y0dVc0lHRmpZMlZ3ZEhNZ2IyNXNlU0J2WW1wbFkzUnpMQ0IxYzJWbWRXeHNJR1p2Y2lCd2NtOXdaWEowZVZ4dUlDb2diM1psY25KcFpHVWdiMjRnUmt4QlZDQmpiMjVtYVdkMWNtRjBhVzl1SUc5aWFtVmpkQ0FvYm04Z2JtVnpkR1ZrSUhCeWIzQnpLUzVjYmlBcVhHNGdLaUJWVTBVZ1YwbFVTQ0JEUVZWVVNVOU9JU0JVYUdseklHMWhlU0J1YjNRZ1ltVm9ZWFpsSUdGeklIbHZkU0IzYVhOb0lHbG1JSGx2ZFNCa2J5QnViM1FnYTI1dmR5Qm9iM2NnZEdocGMxeHVJQ29nZDI5eWEzTXVYRzRnS2k5Y2JtTnNiMjVsTG1Oc2IyNWxVSEp2ZEc5MGVYQmxJRDBnWm5WdVkzUnBiMjRnWTJ4dmJtVlFjbTkwYjNSNWNHVW9jR0Z5Wlc1MEtTQjdYRzRnSUdsbUlDaHdZWEpsYm5RZ1BUMDlJRzUxYkd3cFhHNGdJQ0FnY21WMGRYSnVJRzUxYkd3N1hHNWNiaUFnZG1GeUlHTWdQU0JtZFc1amRHbHZiaUFvS1NCN2ZUdGNiaUFnWXk1d2NtOTBiM1I1Y0dVZ1BTQndZWEpsYm5RN1hHNGdJSEpsZEhWeWJpQnVaWGNnWXlncE8xeHVmVHRjYmx4dUx5OGdjSEpwZG1GMFpTQjFkR2xzYVhSNUlHWjFibU4wYVc5dWMxeHVYRzVtZFc1amRHbHZiaUJmWDI5aWFsUnZVM1J5S0c4cElIdGNiaUFnY21WMGRYSnVJRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNodktUdGNibjA3WEc1amJHOXVaUzVmWDI5aWFsUnZVM1J5SUQwZ1gxOXZZbXBVYjFOMGNqdGNibHh1Wm5WdVkzUnBiMjRnWDE5cGMwUmhkR1VvYnlrZ2UxeHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlHOGdQVDA5SUNkdlltcGxZM1FuSUNZbUlGOWZiMkpxVkc5VGRISW9ieWtnUFQwOUlDZGJiMkpxWldOMElFUmhkR1ZkSnp0Y2JuMDdYRzVqYkc5dVpTNWZYMmx6UkdGMFpTQTlJRjlmYVhORVlYUmxPMXh1WEc1bWRXNWpkR2x2YmlCZlgybHpRWEp5WVhrb2J5a2dlMXh1SUNCeVpYUjFjbTRnZEhsd1pXOW1JRzhnUFQwOUlDZHZZbXBsWTNRbklDWW1JRjlmYjJKcVZHOVRkSElvYnlrZ1BUMDlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTYzdYRzU5TzF4dVkyeHZibVV1WDE5cGMwRnljbUY1SUQwZ1gxOXBjMEZ5Y21GNU8xeHVYRzVtZFc1amRHbHZiaUJmWDJselVtVm5SWGh3S0c4cElIdGNiaUFnY21WMGRYSnVJSFI1Y0dWdlppQnZJRDA5UFNBbmIySnFaV04wSnlBbUppQmZYMjlpYWxSdlUzUnlLRzhwSUQwOVBTQW5XMjlpYW1WamRDQlNaV2RGZUhCZEp6dGNibjA3WEc1amJHOXVaUzVmWDJselVtVm5SWGh3SUQwZ1gxOXBjMUpsWjBWNGNEdGNibHh1Wm5WdVkzUnBiMjRnWDE5blpYUlNaV2RGZUhCR2JHRm5jeWh5WlNrZ2UxeHVJQ0IyWVhJZ1pteGhaM01nUFNBbkp6dGNiaUFnYVdZZ0tISmxMbWRzYjJKaGJDa2dabXhoWjNNZ0t6MGdKMmNuTzF4dUlDQnBaaUFvY21VdWFXZHViM0psUTJGelpTa2dabXhoWjNNZ0t6MGdKMmtuTzF4dUlDQnBaaUFvY21VdWJYVnNkR2xzYVc1bEtTQm1iR0ZuY3lBclBTQW5iU2M3WEc0Z0lISmxkSFZ5YmlCbWJHRm5jenRjYm4wN1hHNWpiRzl1WlM1ZlgyZGxkRkpsWjBWNGNFWnNZV2R6SUQwZ1gxOW5aWFJTWldkRmVIQkdiR0ZuY3p0Y2JseHVjbVYwZFhKdUlHTnNiMjVsTzF4dWZTa29LVHRjYmx4dWFXWWdLSFI1Y0dWdlppQnRiMlIxYkdVZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUcxdlpIVnNaUzVsZUhCdmNuUnpLU0I3WEc0Z0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1kyeHZibVU3WEc1OVhHNGlYWDA9IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gMjIuMS4zLjMxIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxudmFyIFVOU0NPUEFCTEVTID0gcmVxdWlyZSgnLi8kLndrcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi8kLmhpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuLyQudG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQvKj0gMCovLCBzdGFydC8qPSAwLCBlbmQgPSBAbGVuZ3RoKi8pe1xuICB2YXIgTyAgICAgPSB0b09iamVjdCh0aGlzKVxuICAgICwgbGVuICAgPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAsIHRvICAgID0gdG9JbmRleCh0YXJnZXQsIGxlbilcbiAgICAsIGZyb20gID0gdG9JbmRleChzdGFydCwgbGVuKVxuICAgICwgJCQgICAgPSBhcmd1bWVudHNcbiAgICAsIGVuZCAgID0gJCQubGVuZ3RoID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkXG4gICAgLCBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKVxuICAgICwgaW5jICAgPSAxO1xuICBpZihmcm9tIDwgdG8gJiYgdG8gPCBmcm9tICsgY291bnQpe1xuICAgIGluYyAgPSAtMTtcbiAgICBmcm9tICs9IGNvdW50IC0gMTtcbiAgICB0byAgICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZShjb3VudC0tID4gMCl7XG4gICAgaWYoZnJvbSBpbiBPKU9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byAgICs9IGluYztcbiAgICBmcm9tICs9IGluYztcbiAgfSByZXR1cm4gTztcbn07IiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0JylcbiAgLCB0b0luZGV4ICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IFtdLmZpbGwgfHwgZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKXtcbiAgdmFyIE8gICAgICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICwgJCRsZW4gID0gJCQubGVuZ3RoXG4gICAgLCBpbmRleCAgPSB0b0luZGV4KCQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkLCBsZW5ndGgpXG4gICAgLCBlbmQgICAgPSAkJGxlbiA+IDIgPyAkJFsyXSA6IHVuZGVmaW5lZFxuICAgICwgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0luZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUoZW5kUG9zID4gaW5kZXgpT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07IiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi8kLnRvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXg7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTsiLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBJT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgYXNjICAgICAgPSByZXF1aXJlKCcuLyQuYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVFlQRSl7XG4gIHZhciBJU19NQVAgICAgICAgID0gVFlQRSA9PSAxXG4gICAgLCBJU19GSUxURVIgICAgID0gVFlQRSA9PSAyXG4gICAgLCBJU19TT01FICAgICAgID0gVFlQRSA9PSAzXG4gICAgLCBJU19FVkVSWSAgICAgID0gVFlQRSA9PSA0XG4gICAgLCBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2XG4gICAgLCBOT19IT0xFUyAgICAgID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCl7XG4gICAgdmFyIE8gICAgICA9IHRvT2JqZWN0KCR0aGlzKVxuICAgICAgLCBzZWxmICAgPSBJT2JqZWN0KE8pXG4gICAgICAsIGYgICAgICA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMFxuICAgICAgLCByZXN1bHQgPSBJU19NQVAgPyBhc2MoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBhc2MoJHRoaXMsIDApIDogdW5kZWZpbmVkXG4gICAgICAsIHZhbCwgcmVzO1xuICAgIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZil7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZihUWVBFKXtcbiAgICAgICAgaWYoSVNfTUFQKXJlc3VsdFtpbmRleF0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgICAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07IiwiLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgaXNBcnJheSAgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXknKVxuICAsIFNQRUNJRVMgID0gcmVxdWlyZSgnLi8kLndrcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9yaWdpbmFsLCBsZW5ndGgpe1xuICB2YXIgQztcbiAgaWYoaXNBcnJheShvcmlnaW5hbCkpe1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSlDID0gdW5kZWZpbmVkO1xuICAgIGlmKGlzT2JqZWN0KEMpKXtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYoQyA9PT0gbnVsbClDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCk7XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi8kLmNvZicpXG4gICwgVEFHID0gcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSAoTyA9IE9iamVjdChpdCkpW1RBR10pID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGhpZGUgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCByZWRlZmluZUFsbCAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJylcbiAgLCBjdHggICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBzdHJpY3ROZXcgICAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZGVmaW5lZCAgICAgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKVxuICAsIGZvck9mICAgICAgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsICRpdGVyRGVmaW5lICA9IHJlcXVpcmUoJy4vJC5pdGVyLWRlZmluZScpXG4gICwgc3RlcCAgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItc3RlcCcpXG4gICwgSUQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCdpZCcpXG4gICwgJGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgc2V0U3BlY2llcyAgID0gcmVxdWlyZSgnLi8kLnNldC1zcGVjaWVzJylcbiAgLCBERVNDUklQVE9SUyAgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKVxuICAsIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgaXNPYmplY3RcbiAgLCBTSVpFICAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSdcbiAgLCBpZCAgICAgICAgICAgPSAwO1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoISRoYXMoaXQsIElEKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IGlkIHRvIGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIGlkXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG9iamVjdCBpZFxuICAgIGhpZGUoaXQsIElELCArK2lkKTtcbiAgLy8gcmV0dXJuIG9iamVjdCBpZCB3aXRoIHByZWZpeFxuICB9IHJldHVybiAnTycgKyBpdFtJRF07XG59O1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbih0aGF0LCBrZXkpe1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpLCBlbnRyeTtcbiAgaWYoaW5kZXggIT09ICdGJylyZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICBpZihlbnRyeS5rID09IGtleSlyZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24od3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUil7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGl0ZXJhYmxlKXtcbiAgICAgIHN0cmljdE5ldyh0aGF0LCBDLCBOQU1FKTtcbiAgICAgIHRoYXQuX2kgPSAkLmNyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgICAvLyBzaXplXG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCl7XG4gICAgICAgIGZvcih2YXIgdGhhdCA9IHRoaXMsIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKGVudHJ5LnApZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAgICwgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZihlbnRyeSl7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uXG4gICAgICAgICAgICAsIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKHByZXYpcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZihuZXh0KW5leHQucCA9IHByZXY7XG4gICAgICAgICAgaWYodGhhdC5fZiA9PSBlbnRyeSl0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZih0aGF0Ll9sID09IGVudHJ5KXRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpXG4gICAgICAgICAgLCBlbnRyeTtcbiAgICAgICAgd2hpbGUoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKXtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKERFU0NSSVBUT1JTKSQuc2V0RGVzYyhDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBkZWZpbmVkKHRoaXNbU0laRV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uKHRoYXQsIGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSlcbiAgICAgICwgcHJldiwgaW5kZXg7XG4gICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgaWYoZW50cnkpe1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYoIXRoYXQuX2YpdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYocHJldilwcmV2Lm4gPSBlbnRyeTtcbiAgICAgIHRoYXRbU0laRV0rKztcbiAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgaWYoaW5kZXggIT09ICdGJyl0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbihDLCBOQU1FLCBJU19NQVApe1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gICAgICB0aGlzLl90ID0gaXRlcmF0ZWQ7ICAvLyB0YXJnZXRcbiAgICAgIHRoaXMuX2sgPSBraW5kOyAgICAgIC8vIGtpbmRcbiAgICAgIHRoaXMuX2wgPSB1bmRlZmluZWQ7IC8vIHByZXZpb3VzXG4gICAgfSwgZnVuY3Rpb24oKXtcbiAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgLCBraW5kICA9IHRoYXQuX2tcbiAgICAgICAgLCBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpe1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gc3RlcCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgZW50cnkuayk7XG4gICAgICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJyAsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59OyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciBmb3JPZiAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgY2xhc3NvZiA9IHJlcXVpcmUoJy4vJC5jbGFzc29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUpe1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCl7XG4gICAgaWYoY2xhc3NvZih0aGlzKSAhPSBOQU1FKXRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvck9mKHRoaXMsIGZhbHNlLCBhcnIucHVzaCwgYXJyKTtcbiAgICByZXR1cm4gYXJyO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgaGlkZSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgcmVkZWZpbmVBbGwgICAgICAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJylcbiAgLCBhbk9iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgc3RyaWN0TmV3ICAgICAgICAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZm9yT2YgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJylcbiAgLCAkaGFzICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIFdFQUsgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCd3ZWFrJylcbiAgLCBpc0V4dGVuc2libGUgICAgICA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgaXNPYmplY3RcbiAgLCBhcnJheUZpbmQgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpXG4gICwgYXJyYXlGaW5kSW5kZXggICAgPSBjcmVhdGVBcnJheU1ldGhvZCg2KVxuICAsIGlkICAgICAgICAgICAgICAgID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIGZyb3plbiBrZXlzXG52YXIgZnJvemVuU3RvcmUgPSBmdW5jdGlvbih0aGF0KXtcbiAgcmV0dXJuIHRoYXQuX2wgfHwgKHRoYXQuX2wgPSBuZXcgRnJvemVuU3RvcmUpO1xufTtcbnZhciBGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kRnJvemVuID0gZnVuY3Rpb24oc3RvcmUsIGtleSl7XG4gIHJldHVybiBhcnJheUZpbmQoc3RvcmUuYSwgZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5Gcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgZW50cnkgPSBmaW5kRnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYoZW50cnkpcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuICEhZmluZEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGZpbmRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZihlbnRyeSllbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbihpdCl7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZih+aW5kZXgpdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBzdHJpY3ROZXcodGhhdCwgQywgTkFNRSk7XG4gICAgICB0aGF0Ll9pID0gaWQrKzsgICAgICAvLyBjb2xsZWN0aW9uIGlkXG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAvLyBsZWFrIHN0b3JlIGZvciBmcm96ZW4gb2JqZWN0c1xuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZighaXNPYmplY3Qoa2V5KSlyZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKCFpc0V4dGVuc2libGUoa2V5KSlyZXR1cm4gZnJvemVuU3RvcmUodGhpcylbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiAkaGFzKGtleSwgV0VBSykgJiYgJGhhcyhrZXlbV0VBS10sIHRoaXMuX2kpICYmIGRlbGV0ZSBrZXlbV0VBS11bdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSl7XG4gICAgICAgIGlmKCFpc09iamVjdChrZXkpKXJldHVybiBmYWxzZTtcbiAgICAgICAgaWYoIWlzRXh0ZW5zaWJsZShrZXkpKXJldHVybiBmcm96ZW5TdG9yZSh0aGlzKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuICRoYXMoa2V5LCBXRUFLKSAmJiAkaGFzKGtleVtXRUFLXSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShhbk9iamVjdChrZXkpKSl7XG4gICAgICBmcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRoYXMoa2V5LCBXRUFLKSB8fCBoaWRlKGtleSwgV0VBSywge30pO1xuICAgICAga2V5W1dFQUtdW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZnJvemVuU3RvcmU6IGZyb3plblN0b3JlLFxuICBXRUFLOiBXRUFLXG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUnKVxuICAsIHJlZGVmaW5lQWxsICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lLWFsbCcpXG4gICwgZm9yT2YgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCBzdHJpY3ROZXcgICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3JylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGZhaWxzICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCAkaXRlckRldGVjdCAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLyQuc2V0LXRvLXN0cmluZy10YWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSyl7XG4gIHZhciBCYXNlICA9IGdsb2JhbFtOQU1FXVxuICAgICwgQyAgICAgPSBCYXNlXG4gICAgLCBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCdcbiAgICAsIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZVxuICAgICwgTyAgICAgPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uKEtFWSl7XG4gICAgdmFyIGZuID0gcHJvdG9bS0VZXTtcbiAgICByZWRlZmluZShwcm90bywgS0VZLFxuICAgICAgS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24oYSl7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKXtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGEpe1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gc2V0KGEsIGIpeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSwgYik7IHJldHVybiB0aGlzOyB9XG4gICAgKTtcbiAgfTtcbiAgaWYodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgQygpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSl7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaW5zdGFuY2UgICAgICAgICAgICAgPSBuZXcgQ1xuICAgICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgICAgLCBIQVNOVF9DSEFJTklORyAgICAgICA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2VcbiAgICAgIC8vIFY4IH4gIENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgLCBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uKCl7IGluc3RhbmNlLmhhcygxKTsgfSlcbiAgICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAgICwgQUNDRVBUX0lURVJBQkxFUyAgICAgPSAkaXRlckRldGVjdChmdW5jdGlvbihpdGVyKXsgbmV3IEMoaXRlcik7IH0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICAgICwgQlVHR1lfWkVSTztcbiAgICBpZighQUNDRVBUX0lURVJBQkxFUyl7IFxuICAgICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGFyZ2V0LCBpdGVyYWJsZSl7XG4gICAgICAgIHN0cmljdE5ldyh0YXJnZXQsIEMsIE5BTUUpO1xuICAgICAgICB2YXIgdGhhdCA9IG5ldyBCYXNlO1xuICAgICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgSVNfV0VBSyB8fCBpbnN0YW5jZS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwga2V5KXtcbiAgICAgIEJVR0dZX1pFUk8gPSAxIC8ga2V5ID09PSAtSW5maW5pdHk7XG4gICAgfSk7XG4gICAgaWYoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTyl7XG4gICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpO1xuICAgICAgZml4TWV0aG9kKCdoYXMnKTtcbiAgICAgIElTX01BUCAmJiBmaXhNZXRob2QoJ2dldCcpO1xuICAgIH1cbiAgICBpZihCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKWZpeE1ldGhvZChBRERFUik7XG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZihJU19XRUFLICYmIHByb3RvLmNsZWFyKWRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZighSVNfV0VBSyljb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzEuMi42J307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTsiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59OyIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgJCA9IHJlcXVpcmUoJy4vJCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBrZXlzICAgICAgID0gJC5nZXRLZXlzKGl0KVxuICAgICwgZ2V0U3ltYm9scyA9ICQuZ2V0U3ltYm9scztcbiAgaWYoZ2V0U3ltYm9scyl7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuICAgICAgLCBpc0VudW0gID0gJC5pc0VudW1cbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vJC5jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgcmVkZWZpbmUgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiBrZXkgaW4gdGFyZ2V0O1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQgJiYgIW93bilyZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0KTtcbiAgICAvLyBleHBvcnRcbiAgICBpZihleHBvcnRzW2tleV0gIT0gb3V0KWhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KWV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7IC8vIHdyYXBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaChlKXtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2goZil7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsIHJlZGVmaW5lID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCBmYWlscyAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpXG4gICwgd2tzICAgICAgPSByZXF1aXJlKCcuLyQud2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZLCBsZW5ndGgsIGV4ZWMpe1xuICB2YXIgU1lNQk9MICAgPSB3a3MoS0VZKVxuICAgICwgb3JpZ2luYWwgPSAnJ1tLRVldO1xuICBpZihmYWlscyhmdW5jdGlvbigpe1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSkpe1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgZXhlYyhkZWZpbmVkLCBTWU1CT0wsIG9yaWdpbmFsKSk7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbihzdHJpbmcsIGFyZyl7IHJldHVybiBvcmlnaW5hbC5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uKHN0cmluZyl7IHJldHVybiBvcmlnaW5hbC5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciB0aGF0ICAgPSBhbk9iamVjdCh0aGlzKVxuICAgICwgcmVzdWx0ID0gJyc7XG4gIGlmKHRoYXQuZ2xvYmFsKSAgICAgcmVzdWx0ICs9ICdnJztcbiAgaWYodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZih0aGF0Lm11bHRpbGluZSkgIHJlc3VsdCArPSAnbSc7XG4gIGlmKHRoYXQudW5pY29kZSkgICAgcmVzdWx0ICs9ICd1JztcbiAgaWYodGhhdC5zdGlja3kpICAgICByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi8kLmlzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCl7XG4gIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgfVxufTsiLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIGdldE5hbWVzICA9IHJlcXVpcmUoJy4vJCcpLmdldE5hbWVzXG4gICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0TmFtZXMoaXQpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5nZXQgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgaWYod2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScpcmV0dXJuIGdldFdpbmRvd05hbWVzKGl0KTtcbiAgcmV0dXJuIGdldE5hbWVzKHRvSU9iamVjdChpdCkpO1xufTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiAkLnNldERlc2Mob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi8kLmNvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vJC5pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuLyQuY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oYXJnKXtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59OyIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpe1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgY29mICAgICAgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCBNQVRDSCAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07IiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLyQuc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuLyQuaGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi8kLmxpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCAkaXRlckNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLyQuc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvICAgICAgID0gcmVxdWlyZSgnLi8kJykuZ2V0UHJvdG9cbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsIG1ldGhvZHMsIGtleTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkbmF0aXZlKXtcbiAgICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90bygkZGVmYXVsdC5jYWxsKG5ldyBCYXNlKSk7XG4gICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgIC8vIEZGIGZpeFxuICAgIGlmKCFMSUJSQVJZICYmIGhhcyhwcm90bywgRkZfSVRFUkFUT1IpKWhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gICAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gICAgfVxuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKVxuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyBzYWZlID0gdHJ1ZTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwidmFyICRPYmplY3QgPSBPYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY3JlYXRlOiAgICAgJE9iamVjdC5jcmVhdGUsXG4gIGdldFByb3RvOiAgICRPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gIGlzRW51bTogICAgIHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICBnZXREZXNjOiAgICAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgc2V0RGVzYzogICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgc2V0RGVzY3M6ICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLFxuICBnZXRLZXlzOiAgICAkT2JqZWN0LmtleXMsXG4gIGdldE5hbWVzOiAgICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgZ2V0U3ltYm9sczogJE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gIGVhY2g6ICAgICAgIFtdLmZvckVhY2hcbn07IiwidmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwga2V5cyAgID0gJC5nZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlOyIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZXhwbTEgfHwgZnVuY3Rpb24gZXhwbTEoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59OyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07IiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24gc2lnbih4KXtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxO1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi8kLnRhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuLyQuY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG52YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICB2YXIgcGFyZW50LCBkb21haW4sIGZuO1xuICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSl7XG4gICAgcHJvY2Vzcy5kb21haW4gPSBudWxsO1xuICAgIHBhcmVudC5leGl0KCk7XG4gIH1cbiAgd2hpbGUoaGVhZCl7XG4gICAgZG9tYWluID0gaGVhZC5kb21haW47XG4gICAgZm4gICAgID0gaGVhZC5mbjtcbiAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgZm4oKTsgLy8gPC0gY3VycmVudGx5IHdlIHVzZSBpdCBvbmx5IGZvciBQcm9taXNlIC0gdHJ5IC8gY2F0Y2ggbm90IHJlcXVpcmVkXG4gICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG59O1xuXG4vLyBOb2RlLmpzXG5pZihpc05vZGUpe1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xuLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG59IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICB2YXIgdG9nZ2xlID0gMVxuICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAtdG9nZ2xlO1xuICB9O1xuLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2Vcbn0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaCk7XG4gIH07XG4vLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuLy8gLSBzZXRJbW1lZGlhdGVcbi8vIC0gTWVzc2FnZUNoYW5uZWxcbi8vIC0gd2luZG93LnBvc3RNZXNzYWdcbi8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4vLyAtIHNldFRpbWVvdXRcbn0gZWxzZSB7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzYXAoZm4pe1xuICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCwgZG9tYWluOiBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW59O1xuICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gIGlmKCFoZWFkKXtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07IiwiLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKTtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBhID0gT2JqZWN0LmFzc2lnblxuICAgICwgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiBhKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKGEoe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRLZXlzICAgID0gJC5nZXRLZXlzXG4gICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzXG4gICAgLCBpc0VudW0gICAgID0gJC5pc0VudW07XG4gIHdoaWxlKCQkbGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KCQkW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH1cbiAgcmV0dXJuIFQ7XG59IDogT2JqZWN0LmFzc2lnbjsiLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgY29yZSAgICA9IHJlcXVpcmUoJy4vJC5jb3JlJylcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59OyIsInZhciAkICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0JylcbiAgLCBpc0VudW0gICAgPSAkLmlzRW51bTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNFbnRyaWVzKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KGl0KVxuICAgICAgLCBrZXlzICAgPSAkLmdldEtleXMoTylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaSAgICAgID0gMFxuICAgICAgLCByZXN1bHQgPSBbXVxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChPLCBrZXkgPSBrZXlzW2krK10pKXtcbiAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07IiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIFJlZmxlY3QgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpe1xuICB2YXIga2V5cyAgICAgICA9ICQuZ2V0TmFtZXMoYW5PYmplY3QoaXQpKVxuICAgICwgZ2V0U3ltYm9scyA9ICQuZ2V0U3ltYm9scztcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCAgICAgID0gcmVxdWlyZSgnLi8kLnBhdGgnKVxuICAsIGludm9rZSAgICA9IHJlcXVpcmUoJy4vJC5pbnZva2UnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKC8qIC4uLnBhcmdzICovKXtcbiAgdmFyIGZuICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgcGFyZ3MgID0gQXJyYXkobGVuZ3RoKVxuICAgICwgaSAgICAgID0gMFxuICAgICwgXyAgICAgID0gcGF0aC5fXG4gICAgLCBob2xkZXIgPSBmYWxzZTtcbiAgd2hpbGUobGVuZ3RoID4gaSlpZigocGFyZ3NbaV0gPSBhcmd1bWVudHNbaSsrXSkgPT09IF8paG9sZGVyID0gdHJ1ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICwgJCQgICAgPSBhcmd1bWVudHNcbiAgICAgICwgJCRsZW4gPSAkJC5sZW5ndGhcbiAgICAgICwgaiA9IDAsIGsgPSAwLCBhcmdzO1xuICAgIGlmKCFob2xkZXIgJiYgISQkbGVuKXJldHVybiBpbnZva2UoZm4sIHBhcmdzLCB0aGF0KTtcbiAgICBhcmdzID0gcGFyZ3Muc2xpY2UoKTtcbiAgICBpZihob2xkZXIpZm9yKDtsZW5ndGggPiBqOyBqKyspaWYoYXJnc1tqXSA9PT0gXylhcmdzW2pdID0gJCRbaysrXTtcbiAgICB3aGlsZSgkJGxlbiA+IGspYXJncy5wdXNoKCQkW2srK10pO1xuICAgIHJldHVybiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIHJldHVybiB0YXJnZXQ7XG59OyIsIi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nXG4vLyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbnZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCdzcmMnKVxuICAsIFRPX1NUUklORyA9ICd0b1N0cmluZydcbiAgLCAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddXG4gICwgVFBMICAgICAgID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuLyQuY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIGlmKHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJyl7XG4gICAgdmFsLmhhc093blByb3BlcnR5KFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICAgIHZhbC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIH1cbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVnRXhwLCByZXBsYWNlKXtcbiAgdmFyIHJlcGxhY2VyID0gcmVwbGFjZSA9PT0gT2JqZWN0KHJlcGxhY2UpID8gZnVuY3Rpb24ocGFydCl7XG4gICAgcmV0dXJuIHJlcGxhY2VbcGFydF07XG4gIH0gOiByZXBsYWNlO1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBTdHJpbmcoaXQpLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlcik7XG4gIH07XG59OyIsIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSl7XG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgZ2V0RGVzYyAgPSByZXF1aXJlKCcuLyQnKS5nZXREZXNjXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uKE8sIHByb3RvKXtcbiAgYW5PYmplY3QoTyk7XG4gIGlmKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24odGVzdCwgYnVnZ3ksIHNldCl7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuLyQuY3R4JykoRnVuY3Rpb24uY2FsbCwgZ2V0RGVzYyhPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vJC5kZXNjcmlwdG9ycycpXG4gICwgU1BFQ0lFUyAgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSQuc2V0RGVzYyhDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59OyIsInZhciBkZWYgPSByZXF1aXJlKCcuLyQnKS5zZXREZXNjXG4gICwgaGFzID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59OyIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3IsIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IFR5cGVFcnJvcihuYW1lICsgXCI6IHVzZSB0aGUgJ25ldycgb3BlcmF0b3IhXCIpO1xuICByZXR1cm4gaXQ7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07IiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vJC5pcy1yZWdleHAnKVxuICAsIGRlZmluZWQgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpe1xuICBpZihpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKXRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLXN0cmluZy1wYWQtbGVmdC1yaWdodFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgcmVwZWF0ICAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLXJlcGVhdCcpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCl7XG4gIHZhciBTICAgICAgICAgICAgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAsIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoXG4gICAgLCBmaWxsU3RyICAgICAgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZylcbiAgICAsIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGgpcmV0dXJuIFM7XG4gIGlmKGZpbGxTdHIgPT0gJycpZmlsbFN0ciA9ICcgJztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGhcbiAgICAsIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi8kLnRvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGNvdW50KXtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKVxuICAgICwgcmVzID0gJydcbiAgICAsIG4gICA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpdGhyb3cgUmFuZ2VFcnJvcihcIkNvdW50IGNhbid0IGJlIG5lZ2F0aXZlXCIpO1xuICBmb3IoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSlpZihuICYgMSlyZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgc3BhY2VzICA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAgICAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnXG4gICwgc3BhY2UgICA9ICdbJyArIHNwYWNlcyArICddJ1xuICAsIG5vbiAgICAgPSAnXFx1MjAwYlxcdTAwODUnXG4gICwgbHRyaW0gICA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKVxuICAsIHJ0cmltICAgPSBSZWdFeHAoc3BhY2UgKyBzcGFjZSArICcqJCcpO1xuXG52YXIgZXhwb3J0ZXIgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuICB2YXIgZXhwICA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWModHJpbSk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gISFzcGFjZXNbS0VZXSgpIHx8IG5vbltLRVldKCkgIT0gbm9uO1xuICB9KSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbihzdHJpbmcsIFRZUEUpe1xuICBzdHJpbmcgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgaWYoVFlQRSAmIDEpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYoVFlQRSAmIDIpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7IiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi8kLmNvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0bmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdG5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59OyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTsiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi8kLnRvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXHJcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcclxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2VcclxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XHJcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XHJcbiAgdmFyIGZuLCB2YWw7XHJcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xyXG4gIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcclxuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xyXG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcclxufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgc3RvcmUgID0gcmVxdWlyZSgnLi8kLnNoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vJC51aWQnKVxuICAsIFN5bWJvbCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5TeW1ib2w7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBTeW1ib2wgJiYgU3ltYm9sW25hbWVdIHx8IChTeW1ib2wgfHwgdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsICRleHBvcnQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgREVTQ1JJUFRPUlMgICAgICAgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKVxuICAsIGNyZWF0ZURlc2MgICAgICAgID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIGh0bWwgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmh0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRvbS1jcmVhdGUnKVxuICAsIGhhcyAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgY29mICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCBpbnZva2UgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pbnZva2UnKVxuICAsIGZhaWxzICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCBhbk9iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIGlzT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgdG9PYmplY3QgICAgICAgICAgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0JylcbiAgLCB0b0lPYmplY3QgICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0JylcbiAgLCB0b0ludGVnZXIgICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1pbnRlZ2VyJylcbiAgLCB0b0luZGV4ICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpXG4gICwgdG9MZW5ndGggICAgICAgICAgPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCBJT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCBJRV9QUk9UTyAgICAgICAgICA9IHJlcXVpcmUoJy4vJC51aWQnKSgnX19wcm90b19fJylcbiAgLCBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJylcbiAgLCBhcnJheUluZGV4T2YgICAgICA9IHJlcXVpcmUoJy4vJC5hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIE9iamVjdFByb3RvICAgICAgID0gT2JqZWN0LnByb3RvdHlwZVxuICAsIEFycmF5UHJvdG8gICAgICAgID0gQXJyYXkucHJvdG90eXBlXG4gICwgYXJyYXlTbGljZSAgICAgICAgPSBBcnJheVByb3RvLnNsaWNlXG4gICwgYXJyYXlKb2luICAgICAgICAgPSBBcnJheVByb3RvLmpvaW5cbiAgLCBkZWZpbmVQcm9wZXJ0eSAgICA9ICQuc2V0RGVzY1xuICAsIGdldE93bkRlc2NyaXB0b3IgID0gJC5nZXREZXNjXG4gICwgZGVmaW5lUHJvcGVydGllcyAgPSAkLnNldERlc2NzXG4gICwgZmFjdG9yaWVzICAgICAgICAgPSB7fVxuICAsIElFOF9ET01fREVGSU5FO1xuXG5pZighREVTQ1JJUFRPUlMpe1xuICBJRThfRE9NX0RFRklORSA9ICFmYWlscyhmdW5jdGlvbigpe1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShjZWwoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuICB9KTtcbiAgJC5zZXREZXNjID0gZnVuY3Rpb24oTywgUCwgQXR0cmlidXRlcyl7XG4gICAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gICAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKWFuT2JqZWN0KE8pW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICByZXR1cm4gTztcbiAgfTtcbiAgJC5nZXREZXNjID0gZnVuY3Rpb24oTywgUCl7XG4gICAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICAgIHJldHVybiBnZXRPd25EZXNjcmlwdG9yKE8sIFApO1xuICAgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIU9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoTywgUCksIE9bUF0pO1xuICB9O1xuICAkLnNldERlc2NzID0gZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uKE8sIFByb3BlcnRpZXMpe1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIHZhciBrZXlzICAgPSAkLmdldEtleXMoUHJvcGVydGllcylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaSA9IDBcbiAgICAgICwgUDtcbiAgICB3aGlsZShsZW5ndGggPiBpKSQuc2V0RGVzYyhPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgICByZXR1cm4gTztcbiAgfTtcbn1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIURFU0NSSVBUT1JTLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuNiAvIDE1LjIuMy4zIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkLmdldERlc2MsXG4gIC8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkLnNldERlc2MsXG4gIC8vIDE5LjEuMi4zIC8gMTUuMi4zLjcgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllc1xufSk7XG5cbiAgLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xudmFyIGtleXMxID0gKCdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLCcgK1xuICAgICAgICAgICAgJ3RvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnKS5zcGxpdCgnLCcpXG4gIC8vIEFkZGl0aW9uYWwga2V5cyBmb3IgZ2V0T3duUHJvcGVydHlOYW1lc1xuICAsIGtleXMyID0ga2V5czEuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJylcbiAgLCBrZXlzTGVuMSA9IGtleXMxLmxlbmd0aDtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGNlbCgnaWZyYW1lJylcbiAgICAsIGkgICAgICA9IGtleXNMZW4xXG4gICAgLCBndCAgICAgPSAnPidcbiAgICAsIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZSgnPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDwvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdC5wcm90b3R5cGVba2V5czFbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcbnZhciBjcmVhdGVHZXRLZXlzID0gZnVuY3Rpb24obmFtZXMsIGxlbmd0aCl7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3Qpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICAgIHdoaWxlKGxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xudmFyIEVtcHR5ID0gZnVuY3Rpb24oKXt9O1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG4gIGdldFByb3RvdHlwZU9mOiAkLmdldFByb3RvID0gJC5nZXRQcm90byB8fCBmdW5jdGlvbihPKXtcbiAgICBPID0gdG9PYmplY3QoTyk7XG4gICAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XG4gICAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbiAgfSxcbiAgLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkLmdldE5hbWVzID0gJC5nZXROYW1lcyB8fCBjcmVhdGVHZXRLZXlzKGtleXMyLCBrZXlzMi5sZW5ndGgsIHRydWUpLFxuICAvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkLmNyZWF0ZSA9ICQuY3JlYXRlIHx8IGZ1bmN0aW9uKE8sIC8qPyovUHJvcGVydGllcyl7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZihPICE9PSBudWxsKXtcbiAgICAgIEVtcHR5LnByb3RvdHlwZSA9IGFuT2JqZWN0KE8pO1xuICAgICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBzaGltXG4gICAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICAgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG4gIH0sXG4gIC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuICBrZXlzOiAkLmdldEtleXMgPSAkLmdldEtleXMgfHwgY3JlYXRlR2V0S2V5cyhrZXlzMSwga2V5c0xlbjEsIGZhbHNlKVxufSk7XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbihGLCBsZW4sIGFyZ3Mpe1xuICBpZighKGxlbiBpbiBmYWN0b3JpZXMpKXtcbiAgICBmb3IodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKyluW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9XG4gIHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiwgYXJncy4uLiAqLyl7XG4gICAgdmFyIGZuICAgICAgID0gYUZ1bmN0aW9uKHRoaXMpXG4gICAgICAsIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGJvdW5kID0gZnVuY3Rpb24oLyogYXJncy4uLiAqLyl7XG4gICAgICB2YXIgYXJncyA9IHBhcnRBcmdzLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICAgIH07XG4gICAgaWYoaXNPYmplY3QoZm4ucHJvdG90eXBlKSlib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9XG59KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpe1xuICBpZihodG1sKWFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbihiZWdpbiwgZW5kKXtcbiAgICB2YXIgbGVuICAgPSB0b0xlbmd0aCh0aGlzLmxlbmd0aClcbiAgICAgICwga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYoa2xhc3MgPT0gJ0FycmF5JylyZXR1cm4gYXJyYXlTbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHZhciBzdGFydCAgPSB0b0luZGV4KGJlZ2luLCBsZW4pXG4gICAgICAsIHVwVG8gICA9IHRvSW5kZXgoZW5kLCBsZW4pXG4gICAgICAsIHNpemUgICA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydClcbiAgICAgICwgY2xvbmVkID0gQXJyYXkoc2l6ZSlcbiAgICAgICwgaSAgICAgID0gMDtcbiAgICBmb3IoOyBpIDwgc2l6ZTsgaSsrKWNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoSU9iamVjdCAhPSBPYmplY3QpLCAnQXJyYXknLCB7XG4gIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKXtcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwoSU9iamVjdCh0aGlzKSwgc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBzZXBhcmF0b3IpO1xuICB9XG59KTtcblxuLy8gMjIuMS4yLjIgLyAxNS40LjMuMiBBcnJheS5pc0FycmF5KGFyZylcbiRleHBvcnQoJGV4cG9ydC5TLCAnQXJyYXknLCB7aXNBcnJheTogcmVxdWlyZSgnLi8kLmlzLWFycmF5Jyl9KTtcblxudmFyIGNyZWF0ZUFycmF5UmVkdWNlID0gZnVuY3Rpb24oaXNSaWdodCl7XG4gIHJldHVybiBmdW5jdGlvbihjYWxsYmFja2ZuLCBtZW1vKXtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgdmFyIE8gICAgICA9IElPYmplY3QodGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMFxuICAgICAgLCBpICAgICAgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKWZvcig7Oyl7XG4gICAgICBpZihpbmRleCBpbiBPKXtcbiAgICAgICAgbWVtbyA9IE9baW5kZXhdO1xuICAgICAgICBpbmRleCArPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBpZihpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KXtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvcig7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSlpZihpbmRleCBpbiBPKXtcbiAgICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIE9baW5kZXhdLCBpbmRleCwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vO1xuICB9O1xufTtcblxudmFyIG1ldGhvZGl6ZSA9IGZ1bmN0aW9uKCRmbil7XG4gIHJldHVybiBmdW5jdGlvbihhcmcxLyosIGFyZzIgPSB1bmRlZmluZWQgKi8pe1xuICAgIHJldHVybiAkZm4odGhpcywgYXJnMSwgYXJndW1lbnRzWzFdKTtcbiAgfTtcbn07XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiAkLmVhY2ggPSAkLmVhY2ggfHwgbWV0aG9kaXplKGNyZWF0ZUFycmF5TWV0aG9kKDApKSxcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgbWFwOiBtZXRob2RpemUoY3JlYXRlQXJyYXlNZXRob2QoMSkpLFxuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogbWV0aG9kaXplKGNyZWF0ZUFycmF5TWV0aG9kKDIpKSxcbiAgLy8gMjIuMS4zLjIzIC8gMTUuNC40LjE3IEFycmF5LnByb3RvdHlwZS5zb21lKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIHNvbWU6IG1ldGhvZGl6ZShjcmVhdGVBcnJheU1ldGhvZCgzKSksXG4gIC8vIDIyLjEuMy41IC8gMTUuNC40LjE2IEFycmF5LnByb3RvdHlwZS5ldmVyeShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBldmVyeTogbWV0aG9kaXplKGNyZWF0ZUFycmF5TWV0aG9kKDQpKSxcbiAgLy8gMjIuMS4zLjE4IC8gMTUuNC40LjIxIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2U6IGNyZWF0ZUFycmF5UmVkdWNlKGZhbHNlKSxcbiAgLy8gMjIuMS4zLjE5IC8gMTUuNC40LjIyIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodChjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZVJpZ2h0OiBjcmVhdGVBcnJheVJlZHVjZSh0cnVlKSxcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgaW5kZXhPZjogbWV0aG9kaXplKGFycmF5SW5kZXhPZiksXG4gIC8vIDIyLjEuMy4xNCAvIDE1LjQuNC4xNSBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBsYXN0SW5kZXhPZjogZnVuY3Rpb24oZWwsIGZyb21JbmRleCAvKiA9IEBbKi0xXSAqLyl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCh0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gbGVuZ3RoIC0gMTtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoID4gMSlpbmRleCA9IE1hdGgubWluKGluZGV4LCB0b0ludGVnZXIoZnJvbUluZGV4KSk7XG4gICAgaWYoaW5kZXggPCAwKWluZGV4ID0gdG9MZW5ndGgobGVuZ3RoICsgaW5kZXgpO1xuICAgIGZvcig7aW5kZXggPj0gMDsgaW5kZXgtLSlpZihpbmRleCBpbiBPKWlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gaW5kZXg7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcblxuLy8gMjAuMy4zLjEgLyAxNS45LjQuNCBEYXRlLm5vdygpXG4kZXhwb3J0KCRleHBvcnQuUywgJ0RhdGUnLCB7bm93OiBmdW5jdGlvbigpeyByZXR1cm4gK25ldyBEYXRlOyB9fSk7XG5cbnZhciBseiA9IGZ1bmN0aW9uKG51bSl7XG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xufTtcblxuLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbi8vIFBoYW50b21KUyAvIG9sZCBXZWJLaXQgaGFzIGEgYnJva2VuIGltcGxlbWVudGF0aW9uc1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIG5ldyBEYXRlKC01ZTEzIC0gMSkudG9JU09TdHJpbmcoKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbigpe1xuICBuZXcgRGF0ZShOYU4pLnRvSVNPU3RyaW5nKCk7XG59KSksICdEYXRlJywge1xuICB0b0lTT1N0cmluZzogZnVuY3Rpb24gdG9JU09TdHJpbmcoKXtcbiAgICBpZighaXNGaW5pdGUodGhpcykpdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gICAgdmFyIGQgPSB0aGlzXG4gICAgICAsIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKClcbiAgICAgICwgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcbiAgICAgICwgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgICByZXR1cm4gcyArICgnMDAwMDAnICsgTWF0aC5hYnMoeSkpLnNsaWNlKHMgPyAtNiA6IC00KSArXG4gICAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXG4gICAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAgICc6JyArIGx6KGQuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChtID4gOTkgPyBtIDogJzAnICsgbHoobSkpICsgJ1onO1xuICB9XG59KTsiLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge2NvcHlXaXRoaW46IHJlcXVpcmUoJy4vJC5hcnJheS1jb3B5LXdpdGhpbicpfSk7XG5cbnJlcXVpcmUoJy4vJC5hZGQtdG8tdW5zY29wYWJsZXMnKSgnY29weVdpdGhpbicpOyIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7ZmlsbDogcmVxdWlyZSgnLi8kLmFycmF5LWZpbGwnKX0pO1xuXG5yZXF1aXJlKCcuLyQuYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZpbGwnKTsiLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGZpbmQgICA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJykoNilcbiAgLCBLRVkgICAgID0gJ2ZpbmRJbmRleCdcbiAgLCBmb3JjZWQgID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZihLRVkgaW4gW10pQXJyYXkoMSlbS0VZXShmdW5jdGlvbigpeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuLyosIHRoYXQgPSB1bmRlZmluZWQgKi8pe1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi8kLmFkZC10by11bnNjb3BhYmxlcycpKEtFWSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjggQXJyYXkucHJvdG90eXBlLmZpbmQocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkZmluZCAgID0gcmVxdWlyZSgnLi8kLmFycmF5LW1ldGhvZHMnKSg1KVxuICAsIEtFWSAgICAgPSAnZmluZCdcbiAgLCBmb3JjZWQgID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZihLRVkgaW4gW10pQXJyYXkoMSlbS0VZXShmdW5jdGlvbigpeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4vKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuLyQuYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuLyQuaXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vJC5pcy1hcnJheS1pdGVyJylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKi8pe1xuICAgIHZhciBPICAgICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKVxuICAgICAgLCBDICAgICAgID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheVxuICAgICAgLCAkJCAgICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuICAgPSAkJC5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9ICQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGluZGV4ICAgPSAwXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sICQkbGVuID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi8kLmFkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgICAgICAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGtpbmQgID0gdGhpcy5fa1xuICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKXtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuLy8gV2ViS2l0IEFycmF5Lm9mIGlzbid0IGdlbmVyaWNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgZnVuY3Rpb24gRigpe31cbiAgcmV0dXJuICEoQXJyYXkub2YuY2FsbChGKSBpbnN0YW5jZW9mIEYpO1xufSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjMgQXJyYXkub2YoIC4uLml0ZW1zKVxuICBvZjogZnVuY3Rpb24gb2YoLyogLi4uYXJncyAqLyl7XG4gICAgdmFyIGluZGV4ICA9IDBcbiAgICAgICwgJCQgICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuICA9ICQkLmxlbmd0aFxuICAgICAgLCByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKCQkbGVuKTtcbiAgICB3aGlsZSgkJGxlbiA+IGluZGV4KXJlc3VsdFtpbmRleF0gPSAkJFtpbmRleCsrXTtcbiAgICByZXN1bHQubGVuZ3RoID0gJCRsZW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7IiwicmVxdWlyZSgnLi8kLnNldC1zcGVjaWVzJykoJ0FycmF5Jyk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGlzT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBIQVNfSU5TVEFOQ0UgID0gcmVxdWlyZSgnLi8kLndrcycpKCdoYXNJbnN0YW5jZScpXG4gICwgRnVuY3Rpb25Qcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYoIShIQVNfSU5TVEFOQ0UgaW4gRnVuY3Rpb25Qcm90bykpJC5zZXREZXNjKEZ1bmN0aW9uUHJvdG8sIEhBU19JTlNUQU5DRSwge3ZhbHVlOiBmdW5jdGlvbihPKXtcbiAgaWYodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpcmV0dXJuIGZhbHNlO1xuICBpZighaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKXJldHVybiBPIGluc3RhbmNlb2YgdGhpcztcbiAgLy8gZm9yIGVudmlyb25tZW50IHcvbyBuYXRpdmUgYEBAaGFzSW5zdGFuY2VgIGxvZ2ljIGVub3VnaCBgaW5zdGFuY2VvZmAsIGJ1dCBhZGQgdGhpczpcbiAgd2hpbGUoTyA9ICQuZ2V0UHJvdG8oTykpaWYodGhpcy5wcm90b3R5cGUgPT09IE8pcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn19KTsiLCJ2YXIgc2V0RGVzYyAgICA9IHJlcXVpcmUoJy4vJCcpLnNldERlc2NcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIGhhcyAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBGUHJvdG8gICAgID0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICwgbmFtZVJFICAgICA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopL1xuICAsIE5BTUUgICAgICAgPSAnbmFtZSc7XG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSAmJiBzZXREZXNjKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKXtcbiAgICB2YXIgbWF0Y2ggPSAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpXG4gICAgICAsIG5hbWUgID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnO1xuICAgIGhhcyh0aGlzLCBOQU1FKSB8fCBzZXREZXNjKHRoaXMsIE5BTUUsIGNyZWF0ZURlc2MoNSwgbmFtZSkpO1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbnJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uJykoJ01hcCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KXtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSl7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcsIHRydWUpOyIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgbG9nMXAgICA9IHJlcXVpcmUoJy4vJC5tYXRoLWxvZzFwJylcbiAgLCBzcXJ0ICAgID0gTWF0aC5zcXJ0XG4gICwgJGFjb3NoICA9IE1hdGguYWNvc2g7XG5cbi8vIFY4IGJ1ZyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzUwOVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhY29zaCAmJiBNYXRoLmZsb29yKCRhY29zaChOdW1iZXIuTUFYX1ZBTFVFKSkgPT0gNzEwKSwgJ01hdGgnLCB7XG4gIGFjb3NoOiBmdW5jdGlvbiBhY29zaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjUgTWF0aC5hc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbmZ1bmN0aW9uIGFzaW5oKHgpe1xuICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IE1hdGgubG9nKHggKyBNYXRoLnNxcnQoeCAqIHggKyAxKSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHthc2luaDogYXNpbmh9KTsiLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCl7XG4gICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHNpZ24gICAgPSByZXF1aXJlKCcuLyQubWF0aC1zaWduJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2JydDogZnVuY3Rpb24gY2JydCh4KXtcbiAgICByZXR1cm4gc2lnbih4ID0gK3gpICogTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KXtcbiAgICByZXR1cm4gKHggPj4+PSAwKSA/IDMxIC0gTWF0aC5mbG9vcihNYXRoLmxvZyh4ICsgMC41KSAqIE1hdGguTE9HMkUpIDogMzI7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNvc2g6IGZ1bmN0aW9uIGNvc2goeCl7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7ZXhwbTE6IHJlcXVpcmUoJy4vJC5tYXRoLWV4cG0xJyl9KTsiLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBzaWduICAgICAgPSByZXF1aXJlKCcuLyQubWF0aC1zaWduJylcbiAgLCBwb3cgICAgICAgPSBNYXRoLnBvd1xuICAsIEVQU0lMT04gICA9IHBvdygyLCAtNTIpXG4gICwgRVBTSUxPTjMyID0gcG93KDIsIC0yMylcbiAgLCBNQVgzMiAgICAgPSBwb3coMiwgMTI3KSAqICgyIC0gRVBTSUxPTjMyKVxuICAsIE1JTjMyICAgICA9IHBvdygyLCAtMTI2KTtcblxudmFyIHJvdW5kVGllc1RvRXZlbiA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnJvdW5kOiBmdW5jdGlvbiBmcm91bmQoeCl7XG4gICAgdmFyICRhYnMgID0gTWF0aC5hYnMoeClcbiAgICAgICwgJHNpZ24gPSBzaWduKHgpXG4gICAgICAsIGEsIHJlc3VsdDtcbiAgICBpZigkYWJzIDwgTUlOMzIpcmV0dXJuICRzaWduICogcm91bmRUaWVzVG9FdmVuKCRhYnMgLyBNSU4zMiAvIEVQU0lMT04zMikgKiBNSU4zMiAqIEVQU0lMT04zMjtcbiAgICBhID0gKDEgKyBFUFNJTE9OMzIgLyBFUFNJTE9OKSAqICRhYnM7XG4gICAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gICAgaWYocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdClyZXR1cm4gJHNpZ24gKiBJbmZpbml0eTtcbiAgICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhYnMgICAgID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdW0gICA9IDBcbiAgICAgICwgaSAgICAgPSAwXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIGxhcmcgID0gMFxuICAgICAgLCBhcmcsIGRpdjtcbiAgICB3aGlsZShpIDwgJCRsZW4pe1xuICAgICAgYXJnID0gYWJzKCQkW2krK10pO1xuICAgICAgaWYobGFyZyA8IGFyZyl7XG4gICAgICAgIGRpdiAgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZihhcmcgPiAwKXtcbiAgICAgICAgZGl2ICA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogTWF0aC5zcXJ0KHN1bSk7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4xOCBNYXRoLmltdWwoeCwgeSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGltdWwgICA9IE1hdGguaW11bDtcblxuLy8gc29tZSBXZWJLaXQgdmVyc2lvbnMgZmFpbHMgd2l0aCBiaWcgbnVtYmVycywgc29tZSBoYXMgd3JvbmcgYXJpdHlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpe1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmZcbiAgICAgICwgeG4gPSAreFxuICAgICAgLCB5biA9ICt5XG4gICAgICAsIHhsID0gVUlOVDE2ICYgeG5cbiAgICAgICwgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuMjEgTWF0aC5sb2cxMCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7bG9nMXA6IHJlcXVpcmUoJy4vJC5tYXRoLWxvZzFwJyl9KTsiLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge3NpZ246IHJlcXVpcmUoJy4vJC5tYXRoLXNpZ24nKX0pOyIsIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwbTEgICA9IHJlcXVpcmUoJy4vJC5tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KXtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwbTEgICA9IHJlcXVpcmUoJy4vJC5tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KXtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreClcbiAgICAgICwgYiA9IGV4cG0xKC14KTtcbiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KXtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgY29mICAgICAgICAgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vJC50by1wcmltaXRpdmUnKVxuICAsIGZhaWxzICAgICAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCAkdHJpbSAgICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctdHJpbScpLnRyaW1cbiAgLCBOVU1CRVIgICAgICA9ICdOdW1iZXInXG4gICwgJE51bWJlciAgICAgPSBnbG9iYWxbTlVNQkVSXVxuICAsIEJhc2UgICAgICAgID0gJE51bWJlclxuICAsIHByb3RvICAgICAgID0gJE51bWJlci5wcm90b3R5cGVcbiAgLy8gT3BlcmEgfjEyIGhhcyBicm9rZW4gT2JqZWN0I3RvU3RyaW5nXG4gICwgQlJPS0VOX0NPRiAgPSBjb2YoJC5jcmVhdGUocHJvdG8pKSA9PSBOVU1CRVJcbiAgLCBUUklNICAgICAgICA9ICd0cmltJyBpbiBTdHJpbmcucHJvdG90eXBlO1xuXG4vLyA3LjEuMyBUb051bWJlcihhcmd1bWVudClcbnZhciB0b051bWJlciA9IGZ1bmN0aW9uKGFyZ3VtZW50KXtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYodHlwZW9mIGl0ID09ICdzdHJpbmcnICYmIGl0Lmxlbmd0aCA+IDIpe1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApXG4gICAgICAsIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZihmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KXtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKXJldHVybiBOYU47IC8vIE51bWJlcignKzB4MScpIHNob3VsZCBiZSBOYU4sIG9sZCBWOCBmaXhcbiAgICB9IGVsc2UgaWYoZmlyc3QgPT09IDQ4KXtcbiAgICAgIHN3aXRjaChpdC5jaGFyQ29kZUF0KDEpKXtcbiAgICAgICAgY2FzZSA2NiA6IGNhc2UgOTggIDogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5IDogY2FzZSAxMTEgOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0IDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvcih2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKyl7XG4gICAgICAgIGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgLy8gcGFyc2VJbnQgcGFyc2VzIGEgc3RyaW5nIHRvIGEgZmlyc3QgdW5hdmFpbGFibGUgc3ltYm9sXG4gICAgICAgIC8vIGJ1dCBUb051bWJlciBzaG91bGQgcmV0dXJuIE5hTiBpZiBhIHN0cmluZyBjb250YWlucyB1bmF2YWlsYWJsZSBzeW1ib2xzXG4gICAgICAgIGlmKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSlyZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZighJE51bWJlcignIDBvMScpIHx8ICEkTnVtYmVyKCcwYjEnKSB8fCAkTnVtYmVyKCcrMHgxJykpe1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKXtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZVxuICAgICAgLCB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gdGhhdCBpbnN0YW5jZW9mICROdW1iZXJcbiAgICAgIC8vIGNoZWNrIG9uIDEuLmNvbnN0cnVjdG9yKGZvbykgY2FzZVxuICAgICAgJiYgKEJST0tFTl9DT0YgPyBmYWlscyhmdW5jdGlvbigpeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBuZXcgQmFzZSh0b051bWJlcihpdCkpIDogdG9OdW1iZXIoaXQpO1xuICB9O1xuICAkLmVhY2guY2FsbChyZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSA/ICQuZ2V0TmFtZXMoQmFzZSkgOiAoXG4gICAgLy8gRVMzOlxuICAgICdNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSwnICtcbiAgICAvLyBFUzYgKGluIGNhc2UsIGlmIG1vZHVsZXMgd2l0aCBFUzYgTnVtYmVyIHN0YXRpY3MgcmVxdWlyZWQgYmVmb3JlKTpcbiAgICAnRVBTSUxPTixpc0Zpbml0ZSxpc0ludGVnZXIsaXNOYU4saXNTYWZlSW50ZWdlcixNQVhfU0FGRV9JTlRFR0VSLCcgK1xuICAgICdNSU5fU0FGRV9JTlRFR0VSLHBhcnNlRmxvYXQscGFyc2VJbnQsaXNJbnRlZ2VyJ1xuICApLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGtleSl7XG4gICAgaWYoaGFzKEJhc2UsIGtleSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKXtcbiAgICAgICQuc2V0RGVzYygkTnVtYmVyLCBrZXksICQuZ2V0RGVzYyhCYXNlLCBrZXkpKTtcbiAgICB9XG4gIH0pO1xuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vJC5yZWRlZmluZScpKGdsb2JhbCwgTlVNQkVSLCAkTnVtYmVyKTtcbn0iLCIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge0VQU0lMT046IE1hdGgucG93KDIsIC01Mil9KTsiLCIvLyAyMC4xLjIuMiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5pc0Zpbml0ZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzRmluaXRlOiBmdW5jdGlvbiBpc0Zpbml0ZShpdCl7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTsiLCIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtpc0ludGVnZXI6IHJlcXVpcmUoJy4vJC5pcy1pbnRlZ2VyJyl9KTsiLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKXtcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7IiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGlzSW50ZWdlciA9IHJlcXVpcmUoJy4vJC5pcy1pbnRlZ2VyJylcbiAgLCBhYnMgICAgICAgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzU2FmZUludGVnZXI6IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIobnVtYmVyKXtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7IiwiLy8gMjAuMS4yLjYgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtNQVhfU0FGRV9JTlRFR0VSOiAweDFmZmZmZmZmZmZmZmZmfSk7IiwiLy8gMjAuMS4yLjEwIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7TUlOX1NBRkVfSU5URUdFUjogLTB4MWZmZmZmZmZmZmZmZmZ9KTsiLCIvLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge3BhcnNlRmxvYXQ6IHBhcnNlRmxvYXR9KTsiLCIvLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7cGFyc2VJbnQ6IHBhcnNlSW50fSk7IiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHthc3NpZ246IHJlcXVpcmUoJy4vJC5vYmplY3QtYXNzaWduJyl9KTsiLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKGl0KSA6IGl0O1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uKCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiByZXF1aXJlKCcuLyQuZ2V0LW5hbWVzJykuZ2V0O1xufSk7IiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24oJGdldFByb3RvdHlwZU9mKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KXtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbigkaXNFeHRlbnNpYmxlKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnaXNGcm96ZW4nLCBmdW5jdGlvbigkaXNGcm96ZW4pe1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpe1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNGcm96ZW4gPyAkaXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjEzIE9iamVjdC5pc1NlYWxlZChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uKCRpc1NlYWxlZCl7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTsiLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtpczogcmVxdWlyZSgnLi8kLnNhbWUtdmFsdWUnKX0pOyIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oJGtleXMpe1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCl7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24oJHByZXZlbnRFeHRlbnNpb25zKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KXtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhpdCkgOiBpdDtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi4xNyBPYmplY3Quc2VhbChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdzZWFsJywgZnVuY3Rpb24oJHNlYWwpe1xuICByZXR1cm4gZnVuY3Rpb24gc2VhbChpdCl7XG4gICAgcmV0dXJuICRzZWFsICYmIGlzT2JqZWN0KGl0KSA/ICRzZWFsKGl0KSA6IGl0O1xuICB9O1xufSk7IiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7c2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vJC5zZXQtcHJvdG8nKS5zZXR9KTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi8kLmNsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuLyQucmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIExJQlJBUlkgICAgPSByZXF1aXJlKCcuLyQubGlicmFyeScpXG4gICwgZ2xvYmFsICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBjbGFzc29mICAgID0gcmVxdWlyZSgnLi8kLmNsYXNzb2YnKVxuICAsICRleHBvcnQgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBpc09iamVjdCAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgYW5PYmplY3QgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpXG4gICwgc3RyaWN0TmV3ICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3JylcbiAgLCBmb3JPZiAgICAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgc2V0UHJvdG8gICA9IHJlcXVpcmUoJy4vJC5zZXQtcHJvdG8nKS5zZXRcbiAgLCBzYW1lICAgICAgID0gcmVxdWlyZSgnLi8kLnNhbWUtdmFsdWUnKVxuICAsIFNQRUNJRVMgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ3NwZWNpZXMnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vJC5zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCBhc2FwICAgICAgID0gcmVxdWlyZSgnLi8kLm1pY3JvdGFzaycpXG4gICwgUFJPTUlTRSAgICA9ICdQcm9taXNlJ1xuICAsIHByb2Nlc3MgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIFAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBXcmFwcGVyO1xuXG52YXIgdGVzdFJlc29sdmUgPSBmdW5jdGlvbihzdWIpe1xuICB2YXIgdGVzdCA9IG5ldyBQKGZ1bmN0aW9uKCl7fSk7XG4gIGlmKHN1Yil0ZXN0LmNvbnN0cnVjdG9yID0gT2JqZWN0O1xuICByZXR1cm4gUC5yZXNvbHZlKHRlc3QpID09PSB0ZXN0O1xufTtcblxudmFyIFVTRV9OQVRJVkUgPSBmdW5jdGlvbigpe1xuICB2YXIgd29ya3MgPSBmYWxzZTtcbiAgZnVuY3Rpb24gUDIoeCl7XG4gICAgdmFyIHNlbGYgPSBuZXcgUCh4KTtcbiAgICBzZXRQcm90byhzZWxmLCBQMi5wcm90b3R5cGUpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG4gIHRyeSB7XG4gICAgd29ya3MgPSBQICYmIFAucmVzb2x2ZSAmJiB0ZXN0UmVzb2x2ZSgpO1xuICAgIHNldFByb3RvKFAyLCBQKTtcbiAgICBQMi5wcm90b3R5cGUgPSAkLmNyZWF0ZShQLnByb3RvdHlwZSwge2NvbnN0cnVjdG9yOiB7dmFsdWU6IFAyfX0pO1xuICAgIC8vIGFjdHVhbCBGaXJlZm94IGhhcyBicm9rZW4gc3ViY2xhc3Mgc3VwcG9ydCwgdGVzdCB0aGF0XG4gICAgaWYoIShQMi5yZXNvbHZlKDUpLnRoZW4oZnVuY3Rpb24oKXt9KSBpbnN0YW5jZW9mIFAyKSl7XG4gICAgICB3b3JrcyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBhY3R1YWwgVjggYnVnLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDE2MlxuICAgIGlmKHdvcmtzICYmIHJlcXVpcmUoJy4vJC5kZXNjcmlwdG9ycycpKXtcbiAgICAgIHZhciB0aGVuYWJsZVRoZW5Hb3R0ZW4gPSBmYWxzZTtcbiAgICAgIFAucmVzb2x2ZSgkLnNldERlc2Moe30sICd0aGVuJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHRoZW5hYmxlVGhlbkdvdHRlbiA9IHRydWU7IH1cbiAgICAgIH0pKTtcbiAgICAgIHdvcmtzID0gdGhlbmFibGVUaGVuR290dGVuO1xuICAgIH1cbiAgfSBjYXRjaChlKXsgd29ya3MgPSBmYWxzZTsgfVxuICByZXR1cm4gd29ya3M7XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICBpZihMSUJSQVJZICYmIGEgPT09IFAgJiYgYiA9PT0gV3JhcHBlcilyZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHNhbWUoYSwgYik7XG59O1xudmFyIGdldENvbnN0cnVjdG9yID0gZnVuY3Rpb24oQyl7XG4gIHZhciBTID0gYW5PYmplY3QoQylbU1BFQ0lFU107XG4gIHJldHVybiBTICE9IHVuZGVmaW5lZCA/IFMgOiBDO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpLFxuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KVxufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHJlY29yZCwgaXNSZWplY3Qpe1xuICBpZihyZWNvcmQubilyZXR1cm47XG4gIHJlY29yZC5uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcmVjb3JkLmM7XG4gIGFzYXAoZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSByZWNvcmQudlxuICAgICAgLCBvayAgICA9IHJlY29yZC5zID09IDFcbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbihyZWFjdGlvbil7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsXG4gICAgICAgICwgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmVcbiAgICAgICAgLCByZWplY3QgID0gcmVhY3Rpb24ucmVqZWN0XG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXJlY29yZC5oID0gdHJ1ZTtcbiAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyID09PSB0cnVlID8gdmFsdWUgOiBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgY2hhaW4ubGVuZ3RoID0gMDtcbiAgICByZWNvcmQubiA9IGZhbHNlO1xuICAgIGlmKGlzUmVqZWN0KXNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHZhciBwcm9taXNlID0gcmVjb3JkLnBcbiAgICAgICAgLCBoYW5kbGVyLCBjb25zb2xlO1xuICAgICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IHJlY29yZC5hID0gdW5kZWZpbmVkO1xuICAgIH0sIDEpO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdmFyIHJlY29yZCA9IHByb21pc2UuX2RcbiAgICAsIGNoYWluICA9IHJlY29yZC5hIHx8IHJlY29yZC5jXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZWFjdGlvbjtcbiAgaWYocmVjb3JkLmgpcmV0dXJuIGZhbHNlO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcmVjb3JkID0gdGhpcztcbiAgaWYocmVjb3JkLmQpcmV0dXJuO1xuICByZWNvcmQuZCA9IHRydWU7XG4gIHJlY29yZCA9IHJlY29yZC5yIHx8IHJlY29yZDsgLy8gdW53cmFwXG4gIHJlY29yZC52ID0gdmFsdWU7XG4gIHJlY29yZC5zID0gMjtcbiAgcmVjb3JkLmEgPSByZWNvcmQuYy5zbGljZSgpO1xuICBub3RpZnkocmVjb3JkLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciByZWNvcmQgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihyZWNvcmQuZClyZXR1cm47XG4gIHJlY29yZC5kID0gdHJ1ZTtcbiAgcmVjb3JkID0gcmVjb3JkLnIgfHwgcmVjb3JkOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihyZWNvcmQucCA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7cjogcmVjb3JkLCBkOiBmYWxzZX07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkLnYgPSB2YWx1ZTtcbiAgICAgIHJlY29yZC5zID0gMTtcbiAgICAgIG5vdGlmeShyZWNvcmQsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtyOiByZWNvcmQsIGQ6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgdmFyIHJlY29yZCA9IHRoaXMuX2QgPSB7XG4gICAgICBwOiBzdHJpY3ROZXcodGhpcywgUCwgUFJPTUlTRSksICAgICAgICAgLy8gPC0gcHJvbWlzZVxuICAgICAgYzogW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgICAgYTogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgICBzOiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICAgIGQ6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBkb25lXG4gICAgICB2OiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgIGg6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBoYW5kbGVkIHJlamVjdGlvblxuICAgICAgbjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgcmVjb3JkLCAxKSwgY3R4KCRyZWplY3QsIHJlY29yZCwgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbChyZWNvcmQsIGVycik7XG4gICAgfVxuICB9O1xuICByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJykoUC5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQKSlcbiAgICAgICAgLCBwcm9taXNlICA9IHJlYWN0aW9uLnByb21pc2VcbiAgICAgICAgLCByZWNvcmQgICA9IHRoaXMuX2Q7XG4gICAgICByZWFjdGlvbi5vayAgID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVjb3JkLmMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZihyZWNvcmQuYSlyZWNvcmQuYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHJlY29yZC5zKW5vdGlmeShyZWNvcmQsIGZhbHNlKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7UHJvbWlzZTogUH0pO1xucmVxdWlyZSgnLi8kLnNldC10by1zdHJpbmctdGFnJykoUCwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuLyQuc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuLyQuY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8IHRlc3RSZXNvbHZlKHRydWUpKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KXtcbiAgICAvLyBpbnN0YW5jZW9mIGluc3RlYWQgb2YgaW50ZXJuYWwgc2xvdCBjaGVjayBiZWNhdXNlIHdlIHNob3VsZCBmaXggaXQgd2l0aG91dCByZXBsYWNlbWVudCBuYXRpdmUgUHJvbWlzZSBjb3JlXG4gICAgaWYoeCBpbnN0YW5jZW9mIFAgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVzb2x2ZSAgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgJCRyZXNvbHZlKHgpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi8kLml0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gIFAuYWxsKGl0ZXIpWydjYXRjaCddKGZ1bmN0aW9uKCl7fSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IGdldENvbnN0cnVjdG9yKHRoaXMpXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVzb2x2ZSAgICA9IGNhcGFiaWxpdHkucmVzb2x2ZVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3RcbiAgICAgICwgdmFsdWVzICAgICA9IFtdO1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIHZhbHVlcy5wdXNoLCB2YWx1ZXMpO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHZhbHVlcy5sZW5ndGhcbiAgICAgICAgLCByZXN1bHRzICAgPSBBcnJheShyZW1haW5pbmcpO1xuICAgICAgaWYocmVtYWluaW5nKSQuZWFjaC5jYWxsKHZhbHVlcywgZnVuY3Rpb24ocHJvbWlzZSwgaW5kZXgpe1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgaWYoYWxyZWFkeUNhbGxlZClyZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICBlbHNlIHJlc29sdmUocmVzdWx0cyk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSBnZXRDb25zdHJ1Y3Rvcih0aGlzKVxuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBfYXBwbHkgID0gRnVuY3Rpb24uYXBwbHk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KXtcbiAgICByZXR1cm4gX2FwcGx5LmNhbGwodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpO1xuICB9XG59KTsiLCIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJCAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZXhwb3J0ICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpXG4gICwgYW5PYmplY3QgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgaXNPYmplY3QgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgYmluZCAgICAgID0gRnVuY3Rpb24uYmluZCB8fCByZXF1aXJlKCcuLyQuY29yZScpLkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHNcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgZnVuY3Rpb24gRigpe31cbiAgcmV0dXJuICEoUmVmbGVjdC5jb25zdHJ1Y3QoZnVuY3Rpb24oKXt9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qLCBuZXdUYXJnZXQqLyl7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYoVGFyZ2V0ID09IG5ld1RhcmdldCl7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgaWYoYXJncyAhPSB1bmRlZmluZWQpc3dpdGNoKGFuT2JqZWN0KGFyZ3MpLmxlbmd0aCl7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQ7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvICAgID0gbmV3VGFyZ2V0LnByb3RvdHlwZVxuICAgICAgLCBpbnN0YW5jZSA9ICQuY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSlcbiAgICAgICwgcmVzdWx0ICAgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pOyIsIi8vIDI2LjEuMyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpXG52YXIgJCAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSgkLnNldERlc2Moe30sIDEsIHt2YWx1ZTogMX0pLCAxLCB7dmFsdWU6IDJ9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgICQuc2V0RGVzYyh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTsiLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZ2V0RGVzYyAgPSByZXF1aXJlKCcuLyQnKS5nZXREZXNjXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHZhciBkZXNjID0gZ2V0RGVzYyhhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gICAgcmV0dXJuIGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlID8gZmFsc2UgOiBkZWxldGUgdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjYuMS41IFJlZmxlY3QuZW51bWVyYXRlKHRhcmdldClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW10gICAgICAgLy8ga2V5c1xuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIGl0ZXJhdGVkKWtleXMucHVzaChrZXkpO1xufTtcbnJlcXVpcmUoJy4vJC5pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uKCl7XG4gIHZhciB0aGF0ID0gdGhpc1xuICAgICwga2V5cyA9IHRoYXQuX2tcbiAgICAsIGtleTtcbiAgZG8ge1xuICAgIGlmKHRoYXQuX2kgPj0ga2V5cy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgfSB3aGlsZSghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHt2YWx1ZToga2V5LCBkb25lOiBmYWxzZX07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBlbnVtZXJhdGU6IGZ1bmN0aW9uIGVudW1lcmF0ZSh0YXJnZXQpe1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pOyIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiAkLmdldERlc2MoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTsiLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBnZXRQcm90byA9IHJlcXVpcmUoJy4vJCcpLmdldFByb3RvXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCl7XG4gICAgcmV0dXJuIGdldFByb3RvKGFuT2JqZWN0KHRhcmdldCkpO1xuICB9XG59KTsiLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgJCAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGhhcyAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleS8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl1cbiAgICAsIGRlc2MsIHByb3RvO1xuICBpZihhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcilyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYoZGVzYyA9ICQuZ2V0RGVzYyh0YXJnZXQsIHByb3BlcnR5S2V5KSlyZXR1cm4gaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgPyBkZXNjLnZhbHVlXG4gICAgOiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYoaXNPYmplY3QocHJvdG8gPSAkLmdldFByb3RvKHRhcmdldCkpKXJldHVybiBnZXQocHJvdG8sIHByb3BlcnR5S2V5LCByZWNlaXZlcik7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtnZXQ6IGdldH0pOyIsIi8vIDI2LjEuOSBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSl7XG4gICAgcmV0dXJuIHByb3BlcnR5S2V5IGluIHRhcmdldDtcbiAgfVxufSk7IiwiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGFuT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKHRhcmdldCkgOiB0cnVlO1xuICB9XG59KTsiLCIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge293bktleXM6IHJlcXVpcmUoJy4vJC5vd24ta2V5cycpfSk7IiwiLy8gMjYuMS4xMiBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldClcbnZhciAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCAkcHJldmVudEV4dGVuc2lvbnMgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCl7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYoJHByZXZlbnRFeHRlbnNpb25zKSRwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pOyIsIi8vIDI2LjEuMTQgUmVmbGVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgc2V0UHJvdG8gPSByZXF1aXJlKCcuLyQuc2V0LXByb3RvJyk7XG5cbmlmKHNldFByb3RvKSRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pe1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7IiwiLy8gMjYuMS4xMyBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIFssIHJlY2VpdmVyXSlcbnZhciAkICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoYXMgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgYW5PYmplY3QgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWLyosIHJlY2VpdmVyKi8pe1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXVxuICAgICwgb3duRGVzYyAgPSAkLmdldERlc2MoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpXG4gICAgLCBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZighb3duRGVzYyl7XG4gICAgaWYoaXNPYmplY3QocHJvdG8gPSAkLmdldFByb3RvKHRhcmdldCkpKXtcbiAgICAgIHJldHVybiBzZXQocHJvdG8sIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7XG4gICAgfVxuICAgIG93bkRlc2MgPSBjcmVhdGVEZXNjKDApO1xuICB9XG4gIGlmKGhhcyhvd25EZXNjLCAndmFsdWUnKSl7XG4gICAgaWYob3duRGVzYy53cml0YWJsZSA9PT0gZmFsc2UgfHwgIWlzT2JqZWN0KHJlY2VpdmVyKSlyZXR1cm4gZmFsc2U7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yID0gJC5nZXREZXNjKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkgfHwgY3JlYXRlRGVzYygwKTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgICQuc2V0RGVzYyhyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtzZXQ6IHNldH0pOyIsInZhciAkICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vJC5pcy1yZWdleHAnKVxuICAsICRmbGFncyAgID0gcmVxdWlyZSgnLi8kLmZsYWdzJylcbiAgLCAkUmVnRXhwICA9IGdsb2JhbC5SZWdFeHBcbiAgLCBCYXNlICAgICA9ICRSZWdFeHBcbiAgLCBwcm90byAgICA9ICRSZWdFeHAucHJvdG90eXBlXG4gICwgcmUxICAgICAgPSAvYS9nXG4gICwgcmUyICAgICAgPSAvYS9nXG4gIC8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxuICAsIENPUlJFQ1RfTkVXID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZihyZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJlMltyZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKXtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKXtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApXG4gICAgICAsIGZpVSAgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICEodGhpcyBpbnN0YW5jZW9mICRSZWdFeHApICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKTtcbiAgfTtcbiAgJC5lYWNoLmNhbGwoJC5nZXROYW1lcyhCYXNlKSwgZnVuY3Rpb24oa2V5KXtcbiAgICBrZXkgaW4gJFJlZ0V4cCB8fCAkLnNldERlc2MoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGl0KXsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi8kLnJlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vJC5zZXQtc3BlY2llcycpKCdSZWdFeHAnKTsiLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG52YXIgJCA9IHJlcXVpcmUoJy4vJCcpO1xuaWYocmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpJC5zZXREZXNjKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IHJlcXVpcmUoJy4vJC5mbGFncycpXG59KTsiLCIvLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuLyQuZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uKGRlZmluZWQsIE1BVENIKXtcbiAgLy8gMjEuMS4zLjExIFN0cmluZy5wcm90b3R5cGUubWF0Y2gocmVnZXhwKVxuICByZXR1cm4gZnVuY3Rpb24gbWF0Y2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICB9O1xufSk7IiwiLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuLyQuZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2Upe1xuICAvLyAyMS4xLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpXG4gIHJldHVybiBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gIH07XG59KTsiLCIvLyBAQHNlYXJjaCBsb2dpY1xucmVxdWlyZSgnLi8kLmZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24oZGVmaW5lZCwgU0VBUkNIKXtcbiAgLy8gMjEuMS4zLjE1IFN0cmluZy5wcm90b3R5cGUuc2VhcmNoKHJlZ2V4cClcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYXJjaChyZWdleHApe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtTRUFSQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW1NFQVJDSF0oU3RyaW5nKE8pKTtcbiAgfTtcbn0pOyIsIi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vJC5maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgU1BMSVQsICRzcGxpdCl7XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgIDogJHNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgfTtcbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMiBTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZyk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkYXQgICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcyl7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTsiLCIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgY29udGV4dCAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1jb250ZXh0JylcbiAgLCBFTkRTX1dJVEggPSAnZW5kc1dpdGgnXG4gICwgJGVuZHNXaXRoID0gJydbRU5EU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKXtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpXG4gICAgICAsICQkICAgPSBhcmd1bWVudHNcbiAgICAgICwgZW5kUG9zaXRpb24gPSAkJC5sZW5ndGggPiAxID8gJCRbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbGVuICAgID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpXG4gICAgICAsIGVuZCAgICA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbilcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pOyIsInZhciAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHRvSW5kZXggICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWluZGV4JylcbiAgLCBmcm9tQ2hhckNvZGUgICA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgLCAkZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghISRmcm9tQ29kZVBvaW50ICYmICRmcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxKSwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjIgU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cylcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgICA9IFtdXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIGkgICAgID0gMFxuICAgICAgLCBjb2RlO1xuICAgIHdoaWxlKCQkbGVuID4gaSl7XG4gICAgICBjb2RlID0gKyQkW2krK107XG4gICAgICBpZih0b0luZGV4KGNvZGUsIDB4MTBmZmZmKSAhPT0gY29kZSl0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTsiLCIvLyAyMS4xLjMuNyBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKHNlYXJjaFN0cmluZywgcG9zaXRpb24gPSAwKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgY29udGV4dCAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLWNvbnRleHQnKVxuICAsIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMtaXMtcmVnZXhwJykoSU5DTFVERVMpLCAnU3RyaW5nJywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qLCBwb3NpdGlvbiA9IDAgKi8pe1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vJC5pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsInZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjQgU3RyaW5nLnJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucylcbiAgcmF3OiBmdW5jdGlvbiByYXcoY2FsbFNpdGUpe1xuICAgIHZhciB0cGwgICA9IHRvSU9iamVjdChjYWxsU2l0ZS5yYXcpXG4gICAgICAsIGxlbiAgID0gdG9MZW5ndGgodHBsLmxlbmd0aClcbiAgICAgICwgJCQgICAgPSBhcmd1bWVudHNcbiAgICAgICwgJCRsZW4gPSAkJC5sZW5ndGhcbiAgICAgICwgcmVzICAgPSBbXVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgd2hpbGUobGVuID4gaSl7XG4gICAgICByZXMucHVzaChTdHJpbmcodHBsW2krK10pKTtcbiAgICAgIGlmKGkgPCAkJGxlbilyZXMucHVzaChTdHJpbmcoJCRbaV0pKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pOyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vJC5zdHJpbmctcmVwZWF0Jylcbn0pOyIsIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGNvbnRleHQgICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1jb250ZXh0JylcbiAgLCBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJ1xuICAsICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vJC5mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qLCBwb3NpdGlvbiA9IDAgKi8pe1xuICAgIHZhciB0aGF0ICAgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpXG4gICAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICAgLCBpbmRleCAgPSB0b0xlbmd0aChNYXRoLm1pbigkJC5sZW5ndGggPiAxID8gJCRbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSlcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vJC5zdHJpbmctdHJpbScpKCd0cmltJywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbSgpe1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAzKTtcbiAgfTtcbn0pOyIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciAkICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCAkZmFpbHMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgc2hhcmVkICAgICAgICAgPSByZXF1aXJlKCcuLyQuc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vJC5zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQudWlkJylcbiAgLCB3a3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC53a3MnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmtleW9mJylcbiAgLCAkbmFtZXMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nZXQtbmFtZXMnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi8kLmVudW0ta2V5cycpXG4gICwgaXNBcnJheSAgICAgICAgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgZ2V0RGVzYyAgICAgICAgPSAkLmdldERlc2NcbiAgLCBzZXREZXNjICAgICAgICA9ICQuc2V0RGVzY1xuICAsIF9jcmVhdGUgICAgICAgID0gJC5jcmVhdGVcbiAgLCBnZXROYW1lcyAgICAgICA9ICRuYW1lcy5nZXRcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBzZXR0ZXIgICAgICAgICA9IGZhbHNlXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIGlzRW51bSAgICAgICAgID0gJC5pc0VudW1cbiAgLCBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5JylcbiAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG4gICwgdXNlTmF0aXZlICAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKHNldERlc2Moe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHNldERlc2ModGhpcywgJ2EnLCB7dmFsdWU6IDd9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuICB2YXIgcHJvdG9EZXNjID0gZ2V0RGVzYyhPYmplY3RQcm90bywga2V5KTtcbiAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBzZXREZXNjKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKXNldERlc2MoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBzZXREZXNjO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHRhZyl7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2wucHJvdG90eXBlKTtcbiAgc3ltLl9rID0gdGFnO1xuICBERVNDUklQVE9SUyAmJiBzZXR0ZXIgJiYgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpe1xuICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpc2V0RGVzYyhpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gc2V0RGVzYyhpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG4gICAgLCBpICAgID0gMFxuICAgICwgbCA9IGtleXMubGVuZ3RoXG4gICAgLCBrZXk7XG4gIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5KTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XVxuICAgID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSl7XG4gIHZhciBEID0gZ2V0RGVzYyhpdCA9IHRvSU9iamVjdChpdCksIGtleSk7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSlELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdldE5hbWVzKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTilyZXN1bHQucHVzaChrZXkpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdldE5hbWVzKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gIHZhciBhcmdzID0gW2l0XVxuICAgICwgaSAgICA9IDFcbiAgICAsICQkICAgPSBhcmd1bWVudHNcbiAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gIHdoaWxlKCQkLmxlbmd0aCA+IGkpYXJncy5wdXNoKCQkW2krK10pO1xuICByZXBsYWNlciA9IGFyZ3NbMV07XG4gIGlmKHR5cGVvZiByZXBsYWNlciA9PSAnZnVuY3Rpb24nKSRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgaWYoIWlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7XG4gIH07XG4gIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xufTtcbnZhciBidWdneUpTT04gPSAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSk7XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIXVzZU5hdGl2ZSl7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcbiAgICBpZihpc1N5bWJvbCh0aGlzKSl0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiB3cmFwKHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCkpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgaXNTeW1ib2wgPSBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbiAgfTtcblxuICAkLmNyZWF0ZSAgICAgPSAkY3JlYXRlO1xuICAkLmlzRW51bSAgICAgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gICQuZ2V0RGVzYyAgICA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICQuc2V0RGVzYyAgICA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgJC5zZXREZXNjcyAgID0gJGRlZmluZVByb3BlcnRpZXM7XG4gICQuZ2V0TmFtZXMgICA9ICRuYW1lcy5nZXQgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgJC5nZXRTeW1ib2xzID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi8kLmxpYnJhcnknKSl7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cbn1cblxudmFyIHN5bWJvbFN0YXRpY3MgPSB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG4gICAgcmV0dXJuIGtleU9mKFN5bWJvbFJlZ2lzdHJ5LCBrZXkpO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24oKXsgc2V0dGVyID0gZmFsc2U7IH1cbn07XG4vLyAxOS40LjIuMiBTeW1ib2wuaGFzSW5zdGFuY2Vcbi8vIDE5LjQuMi4zIFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVcbi8vIDE5LjQuMi40IFN5bWJvbC5pdGVyYXRvclxuLy8gMTkuNC4yLjYgU3ltYm9sLm1hdGNoXG4vLyAxOS40LjIuOCBTeW1ib2wucmVwbGFjZVxuLy8gMTkuNC4yLjkgU3ltYm9sLnNlYXJjaFxuLy8gMTkuNC4yLjEwIFN5bWJvbC5zcGVjaWVzXG4vLyAxOS40LjIuMTEgU3ltYm9sLnNwbGl0XG4vLyAxOS40LjIuMTIgU3ltYm9sLnRvUHJpbWl0aXZlXG4vLyAxOS40LjIuMTMgU3ltYm9sLnRvU3RyaW5nVGFnXG4vLyAxOS40LjIuMTQgU3ltYm9sLnVuc2NvcGFibGVzXG4kLmVhY2guY2FsbCgoXG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsJyArXG4gICdzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihpdCl7XG4gIHZhciBzeW0gPSB3a3MoaXQpO1xuICBzeW1ib2xTdGF0aWNzW2l0XSA9IHVzZU5hdGl2ZSA/IHN5bSA6IHdyYXAoc3ltKTtcbn0pO1xuXG5zZXR0ZXIgPSB0cnVlO1xuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVywge1N5bWJvbDogJFN5bWJvbH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5bWJvbCcsIHN5bWJvbFN0YXRpY3MpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICF1c2VOYXRpdmUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCF1c2VOYXRpdmUgfHwgYnVnZ3lKU09OKSwgJ0pTT04nLCB7c3RyaW5naWZ5OiAkc3RyaW5naWZ5fSk7XG5cbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgcmVkZWZpbmUgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCB3ZWFrICAgICAgICAgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi13ZWFrJylcbiAgLCBpc09iamVjdCAgICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBmcm96ZW5TdG9yZSAgPSB3ZWFrLmZyb3plblN0b3JlXG4gICwgV0VBSyAgICAgICAgID0gd2Vhay5XRUFLXG4gICwgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBpc09iamVjdFxuICAsIHRtcCAgICAgICAgICA9IHt9O1xuXG4vLyAyMy4zIFdlYWtNYXAgT2JqZWN0c1xudmFyICRXZWFrTWFwID0gcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnV2Vha01hcCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIGlmKGlzT2JqZWN0KGtleSkpe1xuICAgICAgaWYoIWlzRXh0ZW5zaWJsZShrZXkpKXJldHVybiBmcm96ZW5TdG9yZSh0aGlzKS5nZXQoa2V5KTtcbiAgICAgIGlmKGhhcyhrZXksIFdFQUspKXJldHVybiBrZXlbV0VBS11bdGhpcy5faV07XG4gICAgfVxuICB9LFxuICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSl7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHRoaXMsIGtleSwgdmFsdWUpO1xuICB9XG59LCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYobmV3ICRXZWFrTWFwKCkuc2V0KChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkodG1wKSwgNykuZ2V0KHRtcCkgIT0gNyl7XG4gICQuZWFjaC5jYWxsKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIHByb3RvICA9ICRXZWFrTWFwLnByb3RvdHlwZVxuICAgICAgLCBtZXRob2QgPSBwcm90b1trZXldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBrZXksIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgLy8gc3RvcmUgZnJvemVuIG9iamVjdHMgb24gbGVha3kgbWFwXG4gICAgICBpZihpc09iamVjdChhKSAmJiAhaXNFeHRlbnNpYmxlKGEpKXtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZyb3plblN0b3JlKHRoaXMpW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi13ZWFrJyk7XG5cbi8vIDIzLjQgV2Vha1NldCBPYmplY3RzXG5yZXF1aXJlKCcuLyQuY29sbGVjdGlvbicpKCdXZWFrU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiB3ZWFrLmRlZih0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi8kLmFycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb21lbmljL0FycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyosIGZyb21JbmRleCA9IDAgKi8pe1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vJC5hZGQtdG8tdW5zY29wYWJsZXMnKSgnaW5jbHVkZXMnKTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnTWFwJywge3RvSlNPTjogcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKX0pOyIsIi8vIGh0dHA6Ly9nb28uZ2wvWGtCcmpEXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkZW50cmllcyA9IHJlcXVpcmUoJy4vJC5vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpe1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pOyIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vOTM1Mzc4MVxudmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsICRleHBvcnQgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBvd25LZXlzICAgID0gcmVxdWlyZSgnLi8kLm93bi1rZXlzJylcbiAgLCB0b0lPYmplY3QgID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3Qpe1xuICAgIHZhciBPICAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAgICwgc2V0RGVzYyA9ICQuc2V0RGVzY1xuICAgICAgLCBnZXREZXNjID0gJC5nZXREZXNjXG4gICAgICAsIGtleXMgICAgPSBvd25LZXlzKE8pXG4gICAgICAsIHJlc3VsdCAgPSB7fVxuICAgICAgLCBpICAgICAgID0gMFxuICAgICAgLCBrZXksIEQ7XG4gICAgd2hpbGUoa2V5cy5sZW5ndGggPiBpKXtcbiAgICAgIEQgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZihrZXkgaW4gcmVzdWx0KXNldERlc2MocmVzdWx0LCBrZXksIGNyZWF0ZURlc2MoMCwgRCkpO1xuICAgICAgZWxzZSByZXN1bHRba2V5XSA9IEQ7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTsiLCIvLyBodHRwOi8vZ29vLmdsL1hrQnJqRFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkdmFsdWVzID0gcmVxdWlyZSgnLi8kLm9iamVjdC10by1hcnJheScpKGZhbHNlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKGl0KXtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JleEV4cC5lc2NhcGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJHJlICAgICA9IHJlcXVpcmUoJy4vJC5yZXBsYWNlcicpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZ0V4cCcsIHtlc2NhcGU6IGZ1bmN0aW9uIGVzY2FwZShpdCl7IHJldHVybiAkcmUoaXQpOyB9fSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU2V0Jywge3RvSlNPTjogcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKX0pOyIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGF0ICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3Mpe1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkcGFkICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1wYWQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIHBhZExlZnQ6IGZ1bmN0aW9uIHBhZExlZnQobWF4TGVuZ3RoIC8qLCBmaWxsU3RyaW5nID0gJyAnICovKXtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkcGFkICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1wYWQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIHBhZFJpZ2h0OiBmdW5jdGlvbiBwYWRSaWdodChtYXhMZW5ndGggLyosIGZpbGxTdHJpbmcgPSAnICcgKi8pe1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi8kLnN0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbUxlZnQoKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59KTsiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKSgndHJpbVJpZ2h0JywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbVJpZ2h0KCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDIpO1xuICB9O1xufSk7IiwiLy8gSmF2YVNjcmlwdCAxLjYgLyBTdHJhd21hbiBhcnJheSBzdGF0aWNzIHNoaW1cbnZhciAkICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGN0eCAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsICRBcnJheSAgPSByZXF1aXJlKCcuLyQuY29yZScpLkFycmF5IHx8IEFycmF5XG4gICwgc3RhdGljcyA9IHt9O1xudmFyIHNldFN0YXRpY3MgPSBmdW5jdGlvbihrZXlzLCBsZW5ndGgpe1xuICAkLmVhY2guY2FsbChrZXlzLnNwbGl0KCcsJyksIGZ1bmN0aW9uKGtleSl7XG4gICAgaWYobGVuZ3RoID09IHVuZGVmaW5lZCAmJiBrZXkgaW4gJEFycmF5KXN0YXRpY3Nba2V5XSA9ICRBcnJheVtrZXldO1xuICAgIGVsc2UgaWYoa2V5IGluIFtdKXN0YXRpY3Nba2V5XSA9ICRjdHgoRnVuY3Rpb24uY2FsbCwgW11ba2V5XSwgbGVuZ3RoKTtcbiAgfSk7XG59O1xuc2V0U3RhdGljcygncG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcycsIDEpO1xuc2V0U3RhdGljcygnaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlcycsIDMpO1xuc2V0U3RhdGljcygnam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLCcgK1xuICAgICAgICAgICAncmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHN0YXRpY3MpOyIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCBJdGVyYXRvcnMgICA9IHJlcXVpcmUoJy4vJC5pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgTkwgICAgICAgICAgPSBnbG9iYWwuTm9kZUxpc3RcbiAgLCBIVEMgICAgICAgICA9IGdsb2JhbC5IVE1MQ29sbGVjdGlvblxuICAsIE5MUHJvdG8gICAgID0gTkwgJiYgTkwucHJvdG90eXBlXG4gICwgSFRDUHJvdG8gICAgPSBIVEMgJiYgSFRDLnByb3RvdHlwZVxuICAsIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLk5vZGVMaXN0ID0gSXRlcmF0b3JzLkhUTUxDb2xsZWN0aW9uID0gSXRlcmF0b3JzLkFycmF5O1xuaWYoTkxQcm90byAmJiAhTkxQcm90b1tJVEVSQVRPUl0paGlkZShOTFByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuaWYoSFRDUHJvdG8gJiYgIUhUQ1Byb3RvW0lURVJBVE9SXSloaWRlKEhUQ1Byb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpOyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJHRhc2sgICA9IHJlcXVpcmUoJy4vJC50YXNrJyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiwge1xuICBzZXRJbW1lZGlhdGU6ICAgJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pOyIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuLyQuaW52b2tlJylcbiAgLCBwYXJ0aWFsICAgID0gcmVxdWlyZSgnLi8kLnBhcnRpYWwnKVxuICAsIG5hdmlnYXRvciAgPSBnbG9iYWwubmF2aWdhdG9yXG4gICwgTVNJRSAgICAgICA9ICEhbmF2aWdhdG9yICYmIC9NU0lFIC5cXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7IC8vIDwtIGRpcnR5IGllOS0gY2hlY2tcbnZhciB3cmFwID0gZnVuY3Rpb24oc2V0KXtcbiAgcmV0dXJuIE1TSUUgPyBmdW5jdGlvbihmbiwgdGltZSAvKiwgLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIHNldChpbnZva2UoXG4gICAgICBwYXJ0aWFsLFxuICAgICAgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgdHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKVxuICAgICksIHRpbWUpO1xuICB9IDogc2V0O1xufTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CICsgJGV4cG9ydC5GICogTVNJRSwge1xuICBzZXRUaW1lb3V0OiAgd3JhcChnbG9iYWwuc2V0VGltZW91dCksXG4gIHNldEludGVydmFsOiB3cmFwKGdsb2JhbC5zZXRJbnRlcnZhbClcbn0pOyIsInJlcXVpcmUoJy4vbW9kdWxlcy9lczUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcuYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1sZWZ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWdleHAuZXNjYXBlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9qcy5hcnJheS5zdGF0aWNzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLnRpbWVycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbW9kdWxlcy8kLmNvcmUnKTsiLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBEYW4gVGFvIDxkYW5pZWwudGFvQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEzIEFuZHJldyBFaXNlbmJlcmcgPGFuZHJld0BlaXNlbmJlcmcuYXM+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdHlwZWQsXG4gICAgICAgIHV0aWxpdHksXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGpzZG9jLFxuICAgICAgICBlc3V0aWxzLFxuICAgICAgICBoYXNPd25Qcm9wZXJ0eTtcblxuICAgIGVzdXRpbHMgPSByZXF1aXJlKCdlc3V0aWxzJyk7XG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbiAgICB0eXBlZCA9IHJlcXVpcmUoJy4vdHlwZWQnKTtcbiAgICB1dGlsaXR5ID0gcmVxdWlyZSgnLi91dGlsaXR5Jyk7XG5cbiAgICBmdW5jdGlvbiBzbGljZVNvdXJjZShzb3VyY2UsIGluZGV4LCBsYXN0KSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoaW5kZXgsIGxhc3QpO1xuICAgIH1cblxuICAgIGhhc093blByb3BlcnR5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKG9iaiwgbmFtZSk7XG4gICAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIGZ1bmN0aW9uIHNoYWxsb3dDb3B5KG9iaikge1xuICAgICAgICB2YXIgcmV0ID0ge30sIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBU0NJSUFscGhhbnVtZXJpYyhjaCkge1xuICAgICAgICByZXR1cm4gKGNoID49IDB4NjEgIC8qICdhJyAqLyAmJiBjaCA8PSAweDdBICAvKiAneicgKi8pIHx8XG4gICAgICAgICAgICAoY2ggPj0gMHg0MSAgLyogJ0EnICovICYmIGNoIDw9IDB4NUEgIC8qICdaJyAqLykgfHxcbiAgICAgICAgICAgIChjaCA+PSAweDMwICAvKiAnMCcgKi8gJiYgY2ggPD0gMHgzOSAgLyogJzknICovKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1BhcmFtVGl0bGUodGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIHRpdGxlID09PSAncGFyYW0nIHx8IHRpdGxlID09PSAnYXJndW1lbnQnIHx8IHRpdGxlID09PSAnYXJnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1JldHVyblRpdGxlKHRpdGxlKSB7XG4gICAgICAgIHJldHVybiB0aXRsZSA9PT0gJ3JldHVybicgfHwgdGl0bGUgPT09ICdyZXR1cm5zJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5KHRpdGxlKSB7XG4gICAgICAgIHJldHVybiB0aXRsZSA9PT0gJ3Byb3BlcnR5JyB8fCB0aXRsZSA9PT0gJ3Byb3AnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTmFtZVBhcmFtZXRlclJlcXVpcmVkKHRpdGxlKSB7XG4gICAgICAgIHJldHVybiBpc1BhcmFtVGl0bGUodGl0bGUpIHx8IGlzUHJvcGVydHkodGl0bGUpIHx8XG4gICAgICAgICAgICB0aXRsZSA9PT0gJ2FsaWFzJyB8fCB0aXRsZSA9PT0gJ3RoaXMnIHx8IHRpdGxlID09PSAnbWl4ZXMnIHx8IHRpdGxlID09PSAncmVxdWlyZXMnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWxsb3dlZE5hbWUodGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIGlzTmFtZVBhcmFtZXRlclJlcXVpcmVkKHRpdGxlKSB8fCB0aXRsZSA9PT0gJ2NvbnN0JyB8fCB0aXRsZSA9PT0gJ2NvbnN0YW50JztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FsbG93ZWROZXN0ZWQodGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIGlzUHJvcGVydHkodGl0bGUpIHx8IGlzUGFyYW1UaXRsZSh0aXRsZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNUeXBlUGFyYW1ldGVyUmVxdWlyZWQodGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIGlzUGFyYW1UaXRsZSh0aXRsZSkgfHwgaXNSZXR1cm5UaXRsZSh0aXRsZSkgfHxcbiAgICAgICAgICAgIHRpdGxlID09PSAnZGVmaW5lJyB8fCB0aXRsZSA9PT0gJ2VudW0nIHx8XG4gICAgICAgICAgICB0aXRsZSA9PT0gJ2ltcGxlbWVudHMnIHx8IHRpdGxlID09PSAndGhpcycgfHxcbiAgICAgICAgICAgIHRpdGxlID09PSAndHlwZScgfHwgdGl0bGUgPT09ICd0eXBlZGVmJyB8fCBpc1Byb3BlcnR5KHRpdGxlKTtcbiAgICB9XG5cbiAgICAvLyBDb25zaWRlciBkZXByZWNhdGlvbiBpbnN0ZWFkIHVzaW5nICdpc1R5cGVQYXJhbWV0ZXJSZXF1aXJlZCcgYW5kICdSdWxlcycgZGVjbGFyYXRpb24gdG8gcGljayB3aGVuIGEgdHlwZSBpcyBvcHRpb25hbC9yZXF1aXJlZFxuICAgIC8vIFRoaXMgd291bGQgcmVxdWlyZSBjaGFuZ2VzIHRvICdwYXJzZVR5cGUnXG4gICAgZnVuY3Rpb24gaXNBbGxvd2VkVHlwZSh0aXRsZSkge1xuICAgICAgICByZXR1cm4gaXNUeXBlUGFyYW1ldGVyUmVxdWlyZWQodGl0bGUpIHx8IHRpdGxlID09PSAndGhyb3dzJyB8fCB0aXRsZSA9PT0gJ2NvbnN0JyB8fCB0aXRsZSA9PT0gJ2NvbnN0YW50JyB8fFxuICAgICAgICAgICAgdGl0bGUgPT09ICduYW1lc3BhY2UnIHx8IHRpdGxlID09PSAnbWVtYmVyJyB8fCB0aXRsZSA9PT0gJ3ZhcicgfHwgdGl0bGUgPT09ICdtb2R1bGUnIHx8XG4gICAgICAgICAgICB0aXRsZSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCB0aXRsZSA9PT0gJ2NsYXNzJyB8fCB0aXRsZSA9PT0gJ2V4dGVuZHMnIHx8IHRpdGxlID09PSAnYXVnbWVudHMnIHx8XG4gICAgICAgICAgICB0aXRsZSA9PT0gJ3B1YmxpYycgfHwgdGl0bGUgPT09ICdwcml2YXRlJyB8fCB0aXRsZSA9PT0gJ3Byb3RlY3RlZCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKy8sICcnKS5yZXBsYWNlKC9cXHMrJC8sICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bndyYXBDb21tZW50KGRvYykge1xuICAgICAgICAvLyBKU0RvYyBjb21tZW50IGlzIGZvbGxvd2luZyBmb3JtXG4gICAgICAgIC8vICAgLyoqXG4gICAgICAgIC8vICAgICogLi4uLi4uLlxuICAgICAgICAvLyAgICAqL1xuICAgICAgICAvLyByZW1vdmUgLyoqLCAqLyBhbmQgKlxuICAgICAgICB2YXIgQkVGT1JFX1NUQVIgPSAwLFxuICAgICAgICAgICAgU1RBUiA9IDEsXG4gICAgICAgICAgICBBRlRFUl9TVEFSID0gMixcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNoO1xuXG4gICAgICAgIGRvYyA9IGRvYy5yZXBsYWNlKC9eXFwvXFwqXFwqPy8sICcnKS5yZXBsYWNlKC9cXCpcXC8kLywgJycpO1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIGxlbiA9IGRvYy5sZW5ndGg7XG4gICAgICAgIG1vZGUgPSBCRUZPUkVfU1RBUjtcbiAgICAgICAgcmVzdWx0ID0gJyc7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBjaCA9IGRvYy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSBCRUZPUkVfU1RBUjpcbiAgICAgICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJBICAvKiAnKicgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFNUQVI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gQUZURVJfU1RBUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU1RBUjpcbiAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbW9kZSA9IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNoKSA/IEJFRk9SRV9TVEFSIDogQUZURVJfU1RBUjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBBRlRFUl9TVEFSOlxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGUgPSBCRUZPUkVfU1RBUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKC9cXHMrJC8sICcnKTtcbiAgICB9XG5cbiAgICAvLyBKU0RvYyBUYWcgUGFyc2VyXG5cbiAgICAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgICAgICAgdmFyIFJ1bGVzLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgcmVjb3ZlcmFibGUsXG4gICAgICAgICAgICBzbG9wcHksXG4gICAgICAgICAgICBzdHJpY3Q7XG5cbiAgICAgICAgZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY2gpICYmICEoY2ggPT09IDB4MEQgIC8qICdcXHInICovICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwQSAgLyogJ1xcbicgKi8pKSB7XG4gICAgICAgICAgICAgICAgbGluZU51bWJlciArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2NhblRpdGxlKCkge1xuICAgICAgICAgICAgdmFyIHRpdGxlID0gJyc7XG4gICAgICAgICAgICAvLyB3YXN0ZSAnQCdcbiAgICAgICAgICAgIGFkdmFuY2UoKTtcblxuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIGlzQVNDSUlBbHBoYW51bWVyaWMoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgICAgIHRpdGxlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRpdGxlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2Vla0NvbnRlbnQoKSB7XG4gICAgICAgICAgICB2YXIgY2gsIHdhaXRpbmcsIGxhc3QgPSBpbmRleDtcblxuICAgICAgICAgICAgd2FpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKGxhc3QgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGxhc3QpO1xuICAgICAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjaCkgJiYgIShjaCA9PT0gMHgwRCAgLyogJ1xccicgKi8gJiYgc291cmNlLmNoYXJDb2RlQXQobGFzdCArIDEpID09PSAweDBBICAvKiAnXFxuJyAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHg0MCAgLyogJ0AnICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0eXBlIGV4cHJlc3Npb24gbWF5IGhhdmUgbmVzdCBicmFjZSwgc3VjaCBhcyxcbiAgICAgICAgLy8geyB7IG9rOiBzdHJpbmcgfSB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vIHRoZXJlZm9yZSwgc2Nhbm5pbmcgdHlwZSBleHByZXNzaW9uIHdpdGggYmFsYW5jaW5nIGJyYWNlcy5cbiAgICAgICAgZnVuY3Rpb24gcGFyc2VUeXBlKHRpdGxlLCBsYXN0KSB7XG4gICAgICAgICAgICB2YXIgY2gsIGJyYWNlLCB0eXBlLCBkaXJlY3QgPSBmYWxzZTtcblxuXG4gICAgICAgICAgICAvLyBzZWFyY2ggJ3snXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0KSB7XG4gICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDdCICAvKiAneycgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGRpcmVjdCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHR5cGUgZXhwcmVzc2lvbiB7IGlzIGZvdW5kXG4gICAgICAgICAgICBicmFjZSA9IDE7XG4gICAgICAgICAgICB0eXBlID0gJyc7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0KSB7XG4gICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNoKSkge1xuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDdEICAvKiAnfScgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNlIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2UgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4N0IgIC8qICd7JyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eXBlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChicmFjZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGJyYWNlcyBpcyBub3QgYmFsYW5jZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbGl0eS50aHJvd0Vycm9yKCdCcmFjZXMgYXJlIG5vdCBiYWxhbmNlZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNQYXJhbVRpdGxlKHRpdGxlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlZC5wYXJzZVBhcmFtVHlwZSh0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0eXBlZC5wYXJzZVR5cGUodHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzY2FuSWRlbnRpZmllcihsYXN0KSB7XG4gICAgICAgICAgICB2YXIgaWRlbnRpZmllcjtcbiAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclN0YXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkZW50aWZpZXIgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0ICYmIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2tpcFdoaXRlU3BhY2UobGFzdCkge1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGFzdCAmJiAoZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShzb3VyY2UuY2hhckNvZGVBdChpbmRleCkpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGFyc2VOYW1lKGxhc3QsIGFsbG93QnJhY2tldHMsIGFsbG93TmVzdGVkUGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9ICcnLCB1c2VCcmFja2V0cztcblxuICAgICAgICAgICAgc2tpcFdoaXRlU3BhY2UobGFzdCk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA+PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbGxvd0JyYWNrZXRzICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHg1QiAgLyogJ1snICovKSB7XG4gICAgICAgICAgICAgICAgdXNlQnJhY2tldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclN0YXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmFtZSArPSBzY2FuSWRlbnRpZmllcihsYXN0KTtcblxuICAgICAgICAgICAgaWYgKGFsbG93TmVzdGVkUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgzQSAvKiAnOicgKi8gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PT0gJ21vZHVsZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT09ICdleHRlcm5hbCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT09ICdldmVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lICs9IHNjYW5JZGVudGlmaWVyKGxhc3QpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHg1QiAgLyogJ1snICovICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4NUQgIC8qICddJyAqLyl7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgyRSAgLyogJy4nICovIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDB4MjMgIC8qICcjJyAqLyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpID09PSAweDdFICAvKiAnficgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gc2NhbklkZW50aWZpZXIobGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodXNlQnJhY2tldHMpIHtcblxuXG4gICAgICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXM/XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgzRCAgLyogJz0nICovKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlICc9Jycgc3ltYm9sXG4gICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnJhY2tldERlcHRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2NhbiBpbiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpID09PSAweDVCIC8qICdbJyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrZXREZXB0aCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDB4NUQgIC8qICddJyAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYnJhY2tldERlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBsYXN0ICB8fCBzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgIT09IDB4NUQgIC8qICddJyAqLykge1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZXZlciBmb3VuZCBhIGNsb3NpbmcgJ10nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIGxhc3QgJ10nXG4gICAgICAgICAgICAgICAgbmFtZSArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2tpcFRvVGFnKCkge1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSAhPT0gMHg0MCAgLyogJ0AnICovKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4ID49IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHV0aWxpdHkuYXNzZXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHg0MCAgLyogJ0AnICovKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gVGFnUGFyc2VyKG9wdGlvbnMsIHRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICB0aGlzLl90YWcgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubGluZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWcubGluZU51bWJlciA9IGxpbmVOdW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sYXN0ID0gMDtcbiAgICAgICAgICAgIC8vIHNwYWNlIHRvIHNhdmUgc3BlY2lhbCBpbmZvcm1hdGlvbiBmb3IgdGl0bGUgcGFyc2Vycy5cbiAgICAgICAgICAgIHRoaXMuX2V4dHJhID0geyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkRXJyb3IoZXJyLCAuLi4pXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUuYWRkRXJyb3IgPSBmdW5jdGlvbiBhZGRFcnJvcihlcnJvclRleHQpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgICAgICBtc2cgPSBlcnJvclRleHQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyUoXFxkKS9nLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAod2hvbGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsaXR5LmFzc2VydChpbmRleCA8IGFyZ3MubGVuZ3RoLCAnTWVzc2FnZSByZWZlcmVuY2UgbXVzdCBiZSBpbiByYW5nZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl90YWcuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFnLmVycm9ycyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGFnLmVycm9ycy5wdXNoKG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3ZlcmFibGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgVGFnUGFyc2VyLnByb3RvdHlwZS5wYXJzZVR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyB0eXBlIHJlcXVpcmVkIHRpdGxlc1xuICAgICAgICAgICAgaWYgKGlzVHlwZVBhcmFtZXRlclJlcXVpcmVkKHRoaXMuX3RpdGxlKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhZy50eXBlID0gcGFyc2VUeXBlKHRoaXMuX3RpdGxlLCB0aGlzLl9sYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YWcudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BhcmFtVGl0bGUodGhpcy5fdGl0bGUpICYmICFpc1JldHVyblRpdGxlKHRoaXMuX3RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIHRhZyB0eXBlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhZy50eXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZEVycm9yKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQWxsb3dlZFR5cGUodGhpcy5fdGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgdHlwZXNcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWcudHlwZSA9IHBhcnNlVHlwZSh0aGlzLl90aXRsZSwgdGhpcy5fbGFzdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL0ZvciBvcHRpb25hbCB0eXBlcywgbGV0cyBkcm9wIHRoZSB0aHJvd24gZXJyb3Igd2hlbiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlTmFtZVBhdGggPSBmdW5jdGlvbiAob3B0aW9uYWwpIHtcbiAgICAgICAgICAgIHZhciBuYW1lO1xuICAgICAgICAgICAgbmFtZSA9IHBhcnNlTmFtZSh0aGlzLl9sYXN0LCBzbG9wcHkgJiYgaXNQYXJhbVRpdGxlKHRoaXMuX3RpdGxlKSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIHRhZyBuYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RhZy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUucGFyc2VOYW1lUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZU5hbWVQYXRoKGZhbHNlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBUYWdQYXJzZXIucHJvdG90eXBlLnBhcnNlTmFtZVBhdGhPcHRpb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZU5hbWVQYXRoKHRydWUpO1xuICAgICAgICB9O1xuXG5cbiAgICAgICAgVGFnUGFyc2VyLnByb3RvdHlwZS5wYXJzZU5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXNzaWduLCBuYW1lO1xuXG4gICAgICAgICAgICAvLyBwYXJhbSwgcHJvcGVydHkgcmVxdWlyZXMgbmFtZVxuICAgICAgICAgICAgaWYgKGlzQWxsb3dlZE5hbWUodGhpcy5fdGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFnLm5hbWUgPSBwYXJzZU5hbWUodGhpcy5fbGFzdCwgc2xvcHB5ICYmIGlzUGFyYW1UaXRsZSh0aGlzLl90aXRsZSksIGlzQWxsb3dlZE5lc3RlZCh0aGlzLl90aXRsZSkpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFnLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hbWVQYXJhbWV0ZXJSZXF1aXJlZCh0aGlzLl90aXRsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBidXQgaW50ZXJwcmV0ZWQgYXMgYSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgYWxzbyBwb3NzaWJsZSB0aGlzIGlzIGEgc2xvcHB5IGRlY2xhcmF0aW9uLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXJhbVRpdGxlKHRoaXMuX3RpdGxlKSAmJiB0aGlzLl90YWcudHlwZSAmJiB0aGlzLl90YWcudHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9leHRyYS5uYW1lID0gdGhpcy5fdGFnLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWcubmFtZSA9IHRoaXMuX3RhZy50eXBlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWcudHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWRkRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCB0YWcgbmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3RhZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICdbJyAmJiBuYW1lLmNoYXJBdChuYW1lLmxlbmd0aCAtIDEpID09PSAnXScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBAcGFyYW0ge3N0cmluZ30gW3NvbWVib2R5PUpvaG4gRG9lXSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduID0gbmFtZS5zdWJzdHJpbmcoMSwgbmFtZS5sZW5ndGggLSAxKS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2lnblsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhZ1snZGVmYXVsdCddID0gYXNzaWduWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFnLm5hbWUgPSBhc3NpZ25bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYW4gb3B0aW9uYWwgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RhZy50eXBlICYmIHRoaXMuX3RhZy50eXBlLnR5cGUgIT09ICdPcHRpb25hbFR5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFnLnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdPcHRpb25hbFR5cGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLl90YWcudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUucGFyc2VEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oKSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSB0cmltKHNsaWNlU291cmNlKHNvdXJjZSwgaW5kZXgsIHRoaXMuX2xhc3QpKTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICgoL14tXFxzKy8pLnRlc3QoZGVzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl90YWcuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUucGFyc2VLaW5kID0gZnVuY3Rpb24gcGFyc2VLaW5kKCkge1xuICAgICAgICAgICAgdmFyIGtpbmQsIGtpbmRzO1xuICAgICAgICAgICAga2luZHMgPSB7XG4gICAgICAgICAgICAgICAgJ2NsYXNzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnY29uc3RhbnQnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdldmVudCc6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2V4dGVybmFsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnbWVtYmVyJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnbWl4aW4nOiB0cnVlLFxuICAgICAgICAgICAgICAgICdtb2R1bGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICduYW1lc3BhY2UnOiB0cnVlLFxuICAgICAgICAgICAgICAgICd0eXBlZGVmJzogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGtpbmQgPSB0cmltKHNsaWNlU291cmNlKHNvdXJjZSwgaW5kZXgsIHRoaXMuX2xhc3QpKTtcbiAgICAgICAgICAgIHRoaXMuX3RhZy5raW5kID0ga2luZDtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcGVydHkoa2luZHMsIGtpbmQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZEVycm9yKCdJbnZhbGlkIGtpbmQgbmFtZSBcXCclMFxcJycsIGtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBUYWdQYXJzZXIucHJvdG90eXBlLnBhcnNlQWNjZXNzID0gZnVuY3Rpb24gcGFyc2VBY2Nlc3MoKSB7XG4gICAgICAgICAgICB2YXIgYWNjZXNzO1xuICAgICAgICAgICAgYWNjZXNzID0gdHJpbShzbGljZVNvdXJjZShzb3VyY2UsIGluZGV4LCB0aGlzLl9sYXN0KSk7XG4gICAgICAgICAgICB0aGlzLl90YWcuYWNjZXNzID0gYWNjZXNzO1xuICAgICAgICAgICAgaWYgKGFjY2VzcyAhPT0gJ3ByaXZhdGUnICYmIGFjY2VzcyAhPT0gJ3Byb3RlY3RlZCcgJiYgYWNjZXNzICE9PSAncHVibGljJykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRFcnJvcignSW52YWxpZCBhY2Nlc3MgbmFtZSBcXCclMFxcJycsIGFjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYXRpb24gPSBmdW5jdGlvbiBwYXJzZVZhcmlhdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB2YXJpYXRpb24sIHRleHQ7XG4gICAgICAgICAgICB0ZXh0ID0gdHJpbShzbGljZVNvdXJjZShzb3VyY2UsIGluZGV4LCB0aGlzLl9sYXN0KSk7XG4gICAgICAgICAgICB2YXJpYXRpb24gPSBwYXJzZUZsb2F0KHRleHQsIDEwKTtcbiAgICAgICAgICAgIHRoaXMuX3RhZy52YXJpYXRpb24gPSB2YXJpYXRpb247XG4gICAgICAgICAgICBpZiAoaXNOYU4odmFyaWF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRFcnJvcignSW52YWxpZCB2YXJpYXRpb24gXFwnJTBcXCcnLCB0ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgVGFnUGFyc2VyLnByb3RvdHlwZS5lbnN1cmVFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2hvdWxkQmVFbXB0eSA9IHRyaW0oc2xpY2VTb3VyY2Uoc291cmNlLCBpbmRleCwgdGhpcy5fbGFzdCkpO1xuICAgICAgICAgICAgaWYgKHNob3VsZEJlRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWRkRXJyb3IoJ1Vua25vd24gY29udGVudCBcXCclMFxcJycsIHNob3VsZEJlRW1wdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBUYWdQYXJzZXIucHJvdG90eXBlLmVwaWxvZ3VlID0gZnVuY3Rpb24gZXBpbG9ndWUoKSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb247XG5cbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5fdGFnLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgLy8gdW4tZml4IHBvdGVudGlhbGx5IHNsb3BweSBkZWNsYXJhdGlvblxuICAgICAgICAgICAgaWYgKGlzUGFyYW1UaXRsZSh0aGlzLl90aXRsZSkgJiYgIXRoaXMuX3RhZy50eXBlICYmIGRlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uLmNoYXJBdCgwKSA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFnLnR5cGUgPSB0aGlzLl9leHRyYS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFnLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFnLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFzbG9wcHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgdGFnIG5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBSdWxlcyA9IHtcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1hY2Nlc3MuaHRtbFxuICAgICAgICAgICAgJ2FjY2Vzcyc6IFsncGFyc2VBY2Nlc3MnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1hbGlhcy5odG1sXG4gICAgICAgICAgICAnYWxpYXMnOiBbJ3BhcnNlTmFtZVBhdGgnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtYXVnbWVudHMuaHRtbFxuICAgICAgICAgICAgJ2F1Z21lbnRzJzogWydwYXJzZVR5cGUnLCAncGFyc2VOYW1lUGF0aE9wdGlvbmFsJywgJ2Vuc3VyZUVuZCddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLWNvbnN0cnVjdG9yLmh0bWxcbiAgICAgICAgICAgICdjb25zdHJ1Y3Rvcic6IFsncGFyc2VUeXBlJywgJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIFN5bm9ueW06IGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1jb25zdHJ1Y3Rvci5odG1sXG4gICAgICAgICAgICAnY2xhc3MnOiBbJ3BhcnNlVHlwZScsICdwYXJzZU5hbWVQYXRoT3B0aW9uYWwnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBTeW5vbnltOiBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtZXh0ZW5kcy5odG1sXG4gICAgICAgICAgICAnZXh0ZW5kcyc6IFsncGFyc2VUeXBlJywgJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1kZXByZWNhdGVkLmh0bWxcbiAgICAgICAgICAgICdkZXByZWNhdGVkJzogWydwYXJzZURlc2NyaXB0aW9uJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtZ2xvYmFsLmh0bWxcbiAgICAgICAgICAgICdnbG9iYWwnOiBbJ2Vuc3VyZUVuZCddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLWlubmVyLmh0bWxcbiAgICAgICAgICAgICdpbm5lcic6IFsnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtaW5zdGFuY2UuaHRtbFxuICAgICAgICAgICAgJ2luc3RhbmNlJzogWydlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1raW5kLmh0bWxcbiAgICAgICAgICAgICdraW5kJzogWydwYXJzZUtpbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1taXhlcy5odG1sXG4gICAgICAgICAgICAnbWl4ZXMnOiBbJ3BhcnNlTmFtZVBhdGgnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtbWl4aW4uaHRtbFxuICAgICAgICAgICAgJ21peGluJzogWydwYXJzZU5hbWVQYXRoT3B0aW9uYWwnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtbWVtYmVyLmh0bWxcbiAgICAgICAgICAgICdtZW1iZXInOiBbJ3BhcnNlVHlwZScsICdwYXJzZU5hbWVQYXRoT3B0aW9uYWwnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtbWV0aG9kLmh0bWxcbiAgICAgICAgICAgICdtZXRob2QnOiBbJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1tb2R1bGUuaHRtbFxuICAgICAgICAgICAgJ21vZHVsZSc6IFsncGFyc2VUeXBlJywgJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIFN5bm9ueW06IGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1tZXRob2QuaHRtbFxuICAgICAgICAgICAgJ2Z1bmMnOiBbJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIFN5bm9ueW06IGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1tZXRob2QuaHRtbFxuICAgICAgICAgICAgJ2Z1bmN0aW9uJzogWydwYXJzZU5hbWVQYXRoT3B0aW9uYWwnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBTeW5vbnltOiBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtbWVtYmVyLmh0bWxcbiAgICAgICAgICAgICd2YXInOiBbJ3BhcnNlVHlwZScsICdwYXJzZU5hbWVQYXRoT3B0aW9uYWwnLCAnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtbmFtZS5odG1sXG4gICAgICAgICAgICAnbmFtZSc6IFsncGFyc2VOYW1lUGF0aCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1uYW1lc3BhY2UuaHRtbFxuICAgICAgICAgICAgJ25hbWVzcGFjZSc6IFsncGFyc2VUeXBlJywgJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1wcml2YXRlLmh0bWxcbiAgICAgICAgICAgICdwcml2YXRlJzogWydwYXJzZVR5cGUnLCAncGFyc2VEZXNjcmlwdGlvbiddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXByb3RlY3RlZC5odG1sXG4gICAgICAgICAgICAncHJvdGVjdGVkJzogWydwYXJzZVR5cGUnLCAncGFyc2VEZXNjcmlwdGlvbiddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXB1YmxpYy5odG1sXG4gICAgICAgICAgICAncHVibGljJzogWydwYXJzZVR5cGUnLCAncGFyc2VEZXNjcmlwdGlvbiddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXJlYWRvbmx5Lmh0bWxcbiAgICAgICAgICAgICdyZWFkb25seSc6IFsnZW5zdXJlRW5kJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtcmVxdWlyZXMuaHRtbFxuICAgICAgICAgICAgJ3JlcXVpcmVzJzogWydwYXJzZU5hbWVQYXRoJywgJ2Vuc3VyZUVuZCddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXNpbmNlLmh0bWxcbiAgICAgICAgICAgICdzaW5jZSc6IFsncGFyc2VEZXNjcmlwdGlvbiddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXN0YXRpYy5odG1sXG4gICAgICAgICAgICAnc3RhdGljJzogWydlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy1zdW1tYXJ5Lmh0bWxcbiAgICAgICAgICAgICdzdW1tYXJ5JzogWydwYXJzZURlc2NyaXB0aW9uJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtdGhpcy5odG1sXG4gICAgICAgICAgICAndGhpcyc6IFsncGFyc2VOYW1lUGF0aCcsICdlbnN1cmVFbmQnXSxcbiAgICAgICAgICAgIC8vIGh0dHA6Ly91c2Vqc2RvYy5vcmcvdGFncy10b2RvLmh0bWxcbiAgICAgICAgICAgICd0b2RvJzogWydwYXJzZURlc2NyaXB0aW9uJ10sXG4gICAgICAgICAgICAvLyBodHRwOi8vdXNlanNkb2Mub3JnL3RhZ3MtdHlwZWRlZi5odG1sXG4gICAgICAgICAgICAndHlwZWRlZic6IFsncGFyc2VUeXBlJywgJ3BhcnNlTmFtZVBhdGhPcHRpb25hbCddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXZhcmlhdGlvbi5odG1sXG4gICAgICAgICAgICAndmFyaWF0aW9uJzogWydwYXJzZVZhcmlhdGlvbiddLFxuICAgICAgICAgICAgLy8gaHR0cDovL3VzZWpzZG9jLm9yZy90YWdzLXZlcnNpb24uaHRtbFxuICAgICAgICAgICAgJ3ZlcnNpb24nOiBbJ3BhcnNlRGVzY3JpcHRpb24nXVxuICAgICAgICB9O1xuXG4gICAgICAgIFRhZ1BhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiBwYXJzZSgpIHtcbiAgICAgICAgICAgIHZhciBpLCBpeiwgc2VxdWVuY2VzLCBtZXRob2Q7XG5cbiAgICAgICAgICAgIC8vIGVtcHR5IHRpdGxlXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgdGl0bGUnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlZWsgdG8gY29udGVudCBsYXN0IGluZGV4LlxuICAgICAgICAgICAgdGhpcy5fbGFzdCA9IHNlZWtDb250ZW50KHRoaXMuX3RpdGxlKTtcblxuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5KFJ1bGVzLCB0aGlzLl90aXRsZSkpIHtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZXMgPSBSdWxlc1t0aGlzLl90aXRsZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VxdWVuY2VzXG4gICAgICAgICAgICAgICAgc2VxdWVuY2VzID0gWydwYXJzZVR5cGUnLCAncGFyc2VOYW1lJywgJ3BhcnNlRGVzY3JpcHRpb24nLCAnZXBpbG9ndWUnXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzZXF1ZW5jZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHNlcXVlbmNlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNbbWV0aG9kXSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhZztcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBwYXJzZVRhZyhvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgdGl0bGUsIHBhcnNlciwgdGFnO1xuXG4gICAgICAgICAgICAvLyBza2lwIHRvIHRhZ1xuICAgICAgICAgICAgaWYgKCFza2lwVG9UYWcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzY2FuIHRpdGxlXG4gICAgICAgICAgICB0aXRsZSA9IHNjYW5UaXRsZSgpO1xuXG4gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGFnIHBhcnNlclxuICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRhZ1BhcnNlcihvcHRpb25zLCB0aXRsZSk7XG4gICAgICAgICAgICB0YWcgPSBwYXJzZXIucGFyc2UoKTtcblxuICAgICAgICAgICAgLy8gU2VlayBnbG9iYWwgaW5kZXggdG8gZW5kIG9mIHRoaXMgdGFnLlxuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgcGFyc2VyLl9sYXN0KSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFBhcnNlIEpTRG9jXG4gICAgICAgIC8vXG5cbiAgICAgICAgZnVuY3Rpb24gc2NhbkpTRG9jRGVzY3JpcHRpb24ocHJlc2VydmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSAnJywgY2gsIGF0QWxsb3dlZDtcblxuICAgICAgICAgICAgYXRBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGF0QWxsb3dlZCAmJiBjaCA9PT0gMHg0MCAgLyogJ0AnICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXRBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0QWxsb3dlZCAmJiAhZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXRBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcHJlc2VydmVXaGl0ZXNwYWNlID8gZGVzY3JpcHRpb24gOiB0cmltKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHBhcnNlKGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciB0YWdzID0gW10sIHRhZywgZGVzY3JpcHRpb24sIGludGVyZXN0aW5nVGFncywgaSwgaXo7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51bndyYXAgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLnVud3JhcCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IHVud3JhcENvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFycmF5IG9mIHJlbGV2YW50IHRhZ3NcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShvcHRpb25zLnRhZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGFncyA9IHsgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBvcHRpb25zLnRhZ3MubGVuZ3RoOyBpIDwgaXo7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRhZ3NbaV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUYWdzW29wdGlvbnMudGFnc1tpXV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ0ludmFsaWQgXCJ0YWdzXCIgcGFyYW1ldGVyOiAnICsgb3B0aW9ucy50YWdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcignSW52YWxpZCBcInRhZ3NcIiBwYXJhbWV0ZXI6ICcgKyBvcHRpb25zLnRhZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgIGxpbmVOdW1iZXIgPSAwO1xuICAgICAgICAgICAgcmVjb3ZlcmFibGUgPSBvcHRpb25zLnJlY292ZXJhYmxlO1xuICAgICAgICAgICAgc2xvcHB5ID0gb3B0aW9ucy5zbG9wcHk7XG4gICAgICAgICAgICBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDtcblxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBzY2FuSlNEb2NEZXNjcmlwdGlvbihvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSk7XG5cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGFnID0gcGFyc2VUYWcob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaW50ZXJlc3RpbmdUYWdzIHx8IGludGVyZXN0aW5nVGFncy5oYXNPd25Qcm9wZXJ0eSh0YWcudGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgdGFnczogdGFnc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRzLnBhcnNlID0gcGFyc2U7XG4gICAgfShqc2RvYyA9IHt9KSk7XG5cbiAgICBleHBvcnRzLnZlcnNpb24gPSB1dGlsaXR5LlZFUlNJT047XG4gICAgZXhwb3J0cy5wYXJzZSA9IGpzZG9jLnBhcnNlO1xuICAgIGV4cG9ydHMucGFyc2VUeXBlID0gdHlwZWQucGFyc2VUeXBlO1xuICAgIGV4cG9ydHMucGFyc2VQYXJhbVR5cGUgPSB0eXBlZC5wYXJzZVBhcmFtVHlwZTtcbiAgICBleHBvcnRzLnVud3JhcENvbW1lbnQgPSB1bndyYXBDb21tZW50O1xuICAgIGV4cG9ydHMuU3ludGF4ID0gc2hhbGxvd0NvcHkodHlwZWQuU3ludGF4KTtcbiAgICBleHBvcnRzLkVycm9yID0gdXRpbGl0eS5Eb2N0cmluZUVycm9yO1xuICAgIGV4cG9ydHMudHlwZSA9IHtcbiAgICAgICAgU3ludGF4OiBleHBvcnRzLlN5bnRheCxcbiAgICAgICAgcGFyc2VUeXBlOiB0eXBlZC5wYXJzZVR5cGUsXG4gICAgICAgIHBhcnNlUGFyYW1UeXBlOiB0eXBlZC5wYXJzZVBhcmFtVHlwZSxcbiAgICAgICAgc3RyaW5naWZ5OiB0eXBlZC5zdHJpbmdpZnlcbiAgICB9O1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBEYW4gVGFvIDxkYW5pZWwudGFvQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEzIEFuZHJldyBFaXNlbmJlcmcgPGFuZHJld0BlaXNlbmJlcmcuYXM+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLy8gXCJ0eXBlZFwiLCB0aGUgVHlwZSBFeHByZXNzaW9uIFBhcnNlciBmb3IgZG9jdHJpbmUuXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFN5bnRheCxcbiAgICAgICAgVG9rZW4sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgcHJldmlvdXMsXG4gICAgICAgIHRva2VuLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXN1dGlscyxcbiAgICAgICAgdXRpbGl0eTtcblxuICAgIGVzdXRpbHMgPSByZXF1aXJlKCdlc3V0aWxzJyk7XG4gICAgdXRpbGl0eSA9IHJlcXVpcmUoJy4vdXRpbGl0eScpO1xuXG4gICAgU3ludGF4ID0ge1xuICAgICAgICBOdWxsYWJsZUxpdGVyYWw6ICdOdWxsYWJsZUxpdGVyYWwnLFxuICAgICAgICBBbGxMaXRlcmFsOiAnQWxsTGl0ZXJhbCcsXG4gICAgICAgIE51bGxMaXRlcmFsOiAnTnVsbExpdGVyYWwnLFxuICAgICAgICBVbmRlZmluZWRMaXRlcmFsOiAnVW5kZWZpbmVkTGl0ZXJhbCcsXG4gICAgICAgIFZvaWRMaXRlcmFsOiAnVm9pZExpdGVyYWwnLFxuICAgICAgICBVbmlvblR5cGU6ICdVbmlvblR5cGUnLFxuICAgICAgICBBcnJheVR5cGU6ICdBcnJheVR5cGUnLFxuICAgICAgICBSZWNvcmRUeXBlOiAnUmVjb3JkVHlwZScsXG4gICAgICAgIEZpZWxkVHlwZTogJ0ZpZWxkVHlwZScsXG4gICAgICAgIEZ1bmN0aW9uVHlwZTogJ0Z1bmN0aW9uVHlwZScsXG4gICAgICAgIFBhcmFtZXRlclR5cGU6ICdQYXJhbWV0ZXJUeXBlJyxcbiAgICAgICAgUmVzdFR5cGU6ICdSZXN0VHlwZScsXG4gICAgICAgIE5vbk51bGxhYmxlVHlwZTogJ05vbk51bGxhYmxlVHlwZScsXG4gICAgICAgIE9wdGlvbmFsVHlwZTogJ09wdGlvbmFsVHlwZScsXG4gICAgICAgIE51bGxhYmxlVHlwZTogJ051bGxhYmxlVHlwZScsXG4gICAgICAgIE5hbWVFeHByZXNzaW9uOiAnTmFtZUV4cHJlc3Npb24nLFxuICAgICAgICBUeXBlQXBwbGljYXRpb246ICdUeXBlQXBwbGljYXRpb24nXG4gICAgfTtcblxuICAgIFRva2VuID0ge1xuICAgICAgICBJTExFR0FMOiAwLCAgICAvLyBJTExFR0FMXG4gICAgICAgIERPVF9MVDogMSwgICAgIC8vIC48XG4gICAgICAgIFJFU1Q6IDIsICAgICAgIC8vIC4uLlxuICAgICAgICBMVDogMywgICAgICAgICAvLyA8XG4gICAgICAgIEdUOiA0LCAgICAgICAgIC8vID5cbiAgICAgICAgTFBBUkVOOiA1LCAgICAgLy8gKFxuICAgICAgICBSUEFSRU46IDYsICAgICAvLyApXG4gICAgICAgIExCUkFDRTogNywgICAgIC8vIHtcbiAgICAgICAgUkJSQUNFOiA4LCAgICAgLy8gfVxuICAgICAgICBMQlJBQ0s6IDksICAgIC8vIFtcbiAgICAgICAgUkJSQUNLOiAxMCwgICAgLy8gXVxuICAgICAgICBDT01NQTogMTEsICAgICAvLyAsXG4gICAgICAgIENPTE9OOiAxMiwgICAgIC8vIDpcbiAgICAgICAgU1RBUjogMTMsICAgICAgLy8gKlxuICAgICAgICBQSVBFOiAxNCwgICAgICAvLyB8XG4gICAgICAgIFFVRVNUSU9OOiAxNSwgIC8vID9cbiAgICAgICAgQkFORzogMTYsICAgICAgLy8gIVxuICAgICAgICBFUVVBTDogMTcsICAgICAvLyA9XG4gICAgICAgIE5BTUU6IDE4LCAgICAgIC8vIG5hbWUgdG9rZW5cbiAgICAgICAgU1RSSU5HOiAxOSwgICAgLy8gc3RyaW5nXG4gICAgICAgIE5VTUJFUjogMjAsICAgIC8vIG51bWJlclxuICAgICAgICBFT0Y6IDIxXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGlzVHlwZU5hbWUoY2gpIHtcbiAgICAgICAgcmV0dXJuICc+PCgpe31bXSw6Knw/IT0nLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpID09PSAtMSAmJiAhZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjaCkgJiYgIWVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb250ZXh0KHByZXZpb3VzLCBpbmRleCwgdG9rZW4sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQ29udGV4dC5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJldmlvdXMgPSB0aGlzLl9wcmV2aW91cztcbiAgICAgICAgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgdG9rZW4gPSB0aGlzLl90b2tlbjtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB9O1xuXG4gICAgQ29udGV4dC5zYXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRleHQocHJldmlvdXMsIGluZGV4LCB0b2tlbiwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgICB2YXIgY2ggPSBzb3VyY2UuY2hhckF0KGluZGV4KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgcmV0dXJuIGNoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYW5IZXhFc2NhcGUocHJlZml4KSB7XG4gICAgICAgIHZhciBpLCBsZW4sIGNoLCBjb2RlID0gMDtcblxuICAgICAgICBsZW4gPSAocHJlZml4ID09PSAndScpID8gNCA6IDI7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVzdXRpbHMuY29kZS5pc0hleERpZ2l0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICBjaCA9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgJzAxMjM0NTY3ODlhYmNkZWYnLmluZGV4T2YoY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2FuU3RyaW5nKCkge1xuICAgICAgICB2YXIgc3RyID0gJycsIHF1b3RlLCBjaCwgY29kZSwgdW5lc2NhcGVkLCByZXN0b3JlOyAvL1RPRE8gcmV2aWV3IHJlbW92YWwgb2N0YWwgPSBmYWxzZVxuICAgICAgICBxdW90ZSA9IHNvdXJjZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICArK2luZGV4O1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2ggPSBhZHZhbmNlKCk7XG5cbiAgICAgICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcbiAgICAgICAgICAgICAgICBxdW90ZSA9ICcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgY2ggPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmUgPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZCA9IHNjYW5IZXhFc2NhcGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB1bmVzY2FwZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcmVzdG9yZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcYic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcZic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcdic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJzAxMjM0NTY3Jy5pbmRleE9mKGNoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFxcMCBpcyBub3Qgb2N0YWwgZXNjYXBlIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVwcmVjYXRpbmcgdW51c2VkIGNvZGUuIFRPRE8gcmV2aWV3IHJlbW92YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb2N0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVzdXRpbHMuY29kZS5pc09jdGFsRGlnaXQoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gUmV2aWV3IFJlbW92YWwgb2N0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyAnMDEyMzQ1NjcnLmluZGV4T2YoYWR2YW5jZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIGRpZ2l0cyBhcmUgb25seSBhbGxvd2VkIHdoZW4gc3RyaW5nIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAsIDEsIDIsIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcwMTIzJy5pbmRleE9mKGNoKSA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3V0aWxzLmNvZGUuaXNPY3RhbERpZ2l0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArICcwMTIzNDU2NycuaW5kZXhPZihhZHZhbmNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gICdcXHInICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwQSAgLyogJ1xcbicgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChxdW90ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcigndW5leHBlY3RlZCBxdW90ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBzdHI7XG4gICAgICAgIHJldHVybiBUb2tlbi5TVFJJTkc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nhbk51bWJlcigpIHtcbiAgICAgICAgdmFyIG51bWJlciwgY2g7XG5cbiAgICAgICAgbnVtYmVyID0gJyc7XG4gICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaCAhPT0gMHgyRSAgLyogJy4nICovKSB7XG4gICAgICAgICAgICBudW1iZXIgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gJzAnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDc4ICAvKiAneCcgKi8gfHwgY2ggPT09IDB4NTggIC8qICdYJyAqLykge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXIgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNIZXhEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IDB4XG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ3VuZXhwZWN0ZWQgdG9rZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclN0YXJ0KGNoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcigndW5leHBlY3RlZCB0b2tlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQobnVtYmVyLCAxNik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5OVU1CRVI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlciArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyU3RhcnQoY2gpIHx8IGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ3VuZXhwZWN0ZWQgdG9rZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KG51bWJlciwgOCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5OVU1CRVI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbGl0eS50aHJvd0Vycm9yKCd1bmV4cGVjdGVkIHRva2VuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG51bWJlciArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4MkUgIC8qICcuJyAqLykge1xuICAgICAgICAgICAgbnVtYmVyICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KGNoKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbnVtYmVyICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHg2NSAgLyogJ2UnICovIHx8IGNoID09PSAweDQ1ICAvKiAnRScgKi8pIHtcbiAgICAgICAgICAgIG51bWJlciArPSBhZHZhbmNlKCk7XG5cbiAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGNoID09PSAweDJCICAvKiAnKycgKi8gfHwgY2ggPT09IDB4MkQgIC8qICctJyAqLykge1xuICAgICAgICAgICAgICAgIG51bWJlciArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNEZWNpbWFsRGlnaXQoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbGl0eS50aHJvd0Vycm9yKCd1bmV4cGVjdGVkIHRva2VuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJTdGFydChjaCkpIHtcbiAgICAgICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ3VuZXhwZWN0ZWQgdG9rZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChudW1iZXIpO1xuICAgICAgICByZXR1cm4gVG9rZW4uTlVNQkVSO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gc2NhblR5cGVOYW1lKCkge1xuICAgICAgICB2YXIgY2gsIGNoMjtcblxuICAgICAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIGlzVHlwZU5hbWUoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICBpZiAoY2ggPT09IDB4MkUgIC8qICcuJyAqLykge1xuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggKyAxKSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLklMTEVHQUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoMiA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoMiA9PT0gMHgzQyAgLyogJzwnICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVG9rZW4uTkFNRTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICB2YXIgY2g7XG5cbiAgICAgICAgcHJldmlvdXMgPSBpbmRleDtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShzb3VyY2UuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID49IGxlbmd0aCkge1xuICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5FT0Y7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIDB4Mjc6ICAvKiAnJycgKi9cbiAgICAgICAgY2FzZSAweDIyOiAgLyogJ1wiJyAqL1xuICAgICAgICAgICAgdG9rZW4gPSBzY2FuU3RyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDNBOiAgLyogJzonICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLkNPTE9OO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXG4gICAgICAgIGNhc2UgMHgyQzogIC8qICcsJyAqL1xuICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5DT01NQTtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4Mjg6ICAvKiAnKCcgKi9cbiAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRva2VuID0gVG9rZW4uTFBBUkVOO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXG4gICAgICAgIGNhc2UgMHgyOTogIC8qICcpJyAqL1xuICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5SUEFSRU47XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDVCOiAgLyogJ1snICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLkxCUkFDSztcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4NUQ6ICAvKiAnXScgKi9cbiAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRva2VuID0gVG9rZW4uUkJSQUNLO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXG4gICAgICAgIGNhc2UgMHg3QjogIC8qICd7JyAqL1xuICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5MQlJBQ0U7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDdEOiAgLyogJ30nICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLlJCUkFDRTtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4MkU6ICAvKiAnLicgKi9cbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDNDICAvKiAnPCcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOyAgLy8gJy4nXG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsgIC8vICc8J1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IFRva2VuLkRPVF9MVDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgyRSAgLyogJy4nICovICYmIGluZGV4ICsgMiA8IGxlbmd0aCAmJiBzb3VyY2UuY2hhckNvZGVBdChpbmRleCArIDIpID09PSAweDJFICAvKiAnLicgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOyAgLy8gJy4nXG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsgIC8vICcuJ1xuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7ICAvLyAnLidcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5SRVNUO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzY2FuTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLklMTEVHQUw7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDNDOiAgLyogJzwnICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLkxUO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXG4gICAgICAgIGNhc2UgMHgzRTogIC8qICc+JyAqL1xuICAgICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5HVDtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4MkE6ICAvKiAnKicgKi9cbiAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRva2VuID0gVG9rZW4uU1RBUjtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4N0M6ICAvKiAnfCcgKi9cbiAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRva2VuID0gVG9rZW4uUElQRTtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblxuICAgICAgICBjYXNlIDB4M0Y6ICAvKiAnPycgKi9cbiAgICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRva2VuID0gVG9rZW4uUVVFU1RJT047XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDIxOiAgLyogJyEnICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLkJBTkc7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cbiAgICAgICAgY2FzZSAweDNEOiAgLyogJz0nICovXG4gICAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgICB0b2tlbiA9IFRva2VuLkVRVUFMO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KGNoKSkge1xuICAgICAgICAgICAgICAgIHRva2VuID0gc2Nhbk51bWJlcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHlwZSBzdHJpbmcgcGVybWl0cyBmb2xsb3dpbmcgY2FzZSxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBuYW1lc3BhY2UubW9kdWxlLk15Q2xhc3NcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGlzIHJlZHVjZWQgMSB0b2tlbiBUS19OQU1FXG4gICAgICAgICAgICB1dGlsaXR5LmFzc2VydChpc1R5cGVOYW1lKGNoKSk7XG4gICAgICAgICAgICB0b2tlbiA9IHNjYW5UeXBlTmFtZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc3VtZSh0YXJnZXQsIHRleHQpIHtcbiAgICAgICAgdXRpbGl0eS5hc3NlcnQodG9rZW4gPT09IHRhcmdldCwgdGV4dCB8fCAnY29uc3VtZWQgdG9rZW4gbm90IG1hdGNoZWQnKTtcbiAgICAgICAgbmV4dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGVjdCh0YXJnZXQsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRva2VuICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcihtZXNzYWdlIHx8ICd1bmV4cGVjdGVkIHRva2VuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgIH1cblxuICAgIC8vIFVuaW9uVHlwZSA6PSAnKCcgVHlwZVVuaW9uTGlzdCAnKSdcbiAgICAvL1xuICAgIC8vIFR5cGVVbmlvbkxpc3QgOj1cbiAgICAvLyAgICAgPDxlbXB0eT4+XG4gICAgLy8gICB8IE5vbmVtcHR5VHlwZVVuaW9uTGlzdFxuICAgIC8vXG4gICAgLy8gTm9uZW1wdHlUeXBlVW5pb25MaXN0IDo9XG4gICAgLy8gICAgIFR5cGVFeHByZXNzaW9uXG4gICAgLy8gICB8IFR5cGVFeHByZXNzaW9uICd8JyBOb25lbXB0eVR5cGVVbmlvbkxpc3RcbiAgICBmdW5jdGlvbiBwYXJzZVVuaW9uVHlwZSgpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzO1xuICAgICAgICBjb25zdW1lKFRva2VuLkxQQVJFTiwgJ1VuaW9uVHlwZSBzaG91bGQgc3RhcnQgd2l0aCAoJyk7XG4gICAgICAgIGVsZW1lbnRzID0gW107XG4gICAgICAgIGlmICh0b2tlbiAhPT0gVG9rZW4uUlBBUkVOKSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gocGFyc2VUeXBlRXhwcmVzc2lvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLlJQQVJFTikge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwZWN0KFRva2VuLlBJUEUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN1bWUoVG9rZW4uUlBBUkVOLCAnVW5pb25UeXBlIHNob3VsZCBlbmQgd2l0aCApJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTeW50YXguVW5pb25UeXBlLFxuICAgICAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQXJyYXlUeXBlIDo9ICdbJyBFbGVtZW50VHlwZUxpc3QgJ10nXG4gICAgLy9cbiAgICAvLyBFbGVtZW50VHlwZUxpc3QgOj1cbiAgICAvLyAgICAgPDxlbXB0eT4+XG4gICAgLy8gIHwgVHlwZUV4cHJlc3Npb25cbiAgICAvLyAgfCAnLi4uJyBUeXBlRXhwcmVzc2lvblxuICAgIC8vICB8IFR5cGVFeHByZXNzaW9uICcsJyBFbGVtZW50VHlwZUxpc3RcbiAgICBmdW5jdGlvbiBwYXJzZUFycmF5VHlwZSgpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzO1xuICAgICAgICBjb25zdW1lKFRva2VuLkxCUkFDSywgJ0FycmF5VHlwZSBzaG91bGQgc3RhcnQgd2l0aCBbJyk7XG4gICAgICAgIGVsZW1lbnRzID0gW107XG4gICAgICAgIHdoaWxlICh0b2tlbiAhPT0gVG9rZW4uUkJSQUNLKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLlJFU1QpIHtcbiAgICAgICAgICAgICAgICBjb25zdW1lKFRva2VuLlJFU1QpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguUmVzdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IHBhcnNlVHlwZUV4cHJlc3Npb24oKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHBhcnNlVHlwZUV4cHJlc3Npb24oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IFRva2VuLlJCUkFDSykge1xuICAgICAgICAgICAgICAgIGV4cGVjdChUb2tlbi5DT01NQSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwZWN0KFRva2VuLlJCUkFDSyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTeW50YXguQXJyYXlUeXBlLFxuICAgICAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VGaWVsZE5hbWUoKSB7XG4gICAgICAgIHZhciB2ID0gdmFsdWU7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uTkFNRSB8fCB0b2tlbiA9PT0gVG9rZW4uU1RSSU5HKSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uTlVNQkVSKSB7XG4gICAgICAgICAgICBjb25zdW1lKFRva2VuLk5VTUJFUik7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXRpbGl0eS50aHJvd0Vycm9yKCd1bmV4cGVjdGVkIHRva2VuJyk7XG4gICAgfVxuXG4gICAgLy8gRmllbGRUeXBlIDo9XG4gICAgLy8gICAgIEZpZWxkTmFtZVxuICAgIC8vICAgfCBGaWVsZE5hbWUgJzonIFR5cGVFeHByZXNzaW9uXG4gICAgLy9cbiAgICAvLyBGaWVsZE5hbWUgOj1cbiAgICAvLyAgICAgTmFtZUV4cHJlc3Npb25cbiAgICAvLyAgIHwgU3RyaW5nTGl0ZXJhbFxuICAgIC8vICAgfCBOdW1iZXJMaXRlcmFsXG4gICAgLy8gICB8IFJlc2VydmVkSWRlbnRpZmllclxuICAgIGZ1bmN0aW9uIHBhcnNlRmllbGRUeXBlKCkge1xuICAgICAgICB2YXIga2V5O1xuXG4gICAgICAgIGtleSA9IHBhcnNlRmllbGROYW1lKCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uQ09MT04pIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQ09MT04pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguRmllbGRUeXBlLFxuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJzZVR5cGVFeHByZXNzaW9uKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFN5bnRheC5GaWVsZFR5cGUsXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkVHlwZSA6PSAneycgRmllbGRUeXBlTGlzdCAnfSdcbiAgICAvL1xuICAgIC8vIEZpZWxkVHlwZUxpc3QgOj1cbiAgICAvLyAgICAgPDxlbXB0eT4+XG4gICAgLy8gICB8IEZpZWxkVHlwZVxuICAgIC8vICAgfCBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZUxpc3RcbiAgICBmdW5jdGlvbiBwYXJzZVJlY29yZFR5cGUoKSB7XG4gICAgICAgIHZhciBmaWVsZHM7XG5cbiAgICAgICAgY29uc3VtZShUb2tlbi5MQlJBQ0UsICdSZWNvcmRUeXBlIHNob3VsZCBzdGFydCB3aXRoIHsnKTtcbiAgICAgICAgZmllbGRzID0gW107XG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uQ09NTUEpIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQ09NTUEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSBUb2tlbi5SQlJBQ0UpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChwYXJzZUZpZWxkVHlwZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT09IFRva2VuLlJCUkFDRSkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoVG9rZW4uQ09NTUEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBleHBlY3QoVG9rZW4uUkJSQUNFKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFN5bnRheC5SZWNvcmRUeXBlLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBOYW1lRXhwcmVzc2lvbiA6PVxuICAgIC8vICAgIElkZW50aWZpZXJcbiAgICAvLyAgfCBUYWdJZGVudGlmaWVyICc6JyBJZGVudGlmaWVyXG4gICAgLy9cbiAgICAvLyBUYWcgaWRlbnRpZmllciBpcyBvbmUgb2YgXCJtb2R1bGVcIiwgXCJleHRlcm5hbFwiIG9yIFwiZXZlbnRcIlxuICAgIC8vIElkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgVG9rZW4uTkFNRSwgaW5jbHVkaW5nIGFueSBkb3RzLCBzb21ldGhpbmcgbGlrZVxuICAgIC8vIG5hbWVzcGFjZS5tb2R1bGUuTXlDbGFzc1xuICAgIGZ1bmN0aW9uIHBhcnNlTmFtZUV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBuYW1lID0gdmFsdWU7XG4gICAgICAgIGV4cGVjdChUb2tlbi5OQU1FKTtcblxuICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkNPTE9OICYmIChcbiAgICAgICAgICAgICAgICBuYW1lID09PSAnbW9kdWxlJyB8fFxuICAgICAgICAgICAgICAgIG5hbWUgPT09ICdleHRlcm5hbCcgfHxcbiAgICAgICAgICAgICAgICBuYW1lID09PSAnZXZlbnQnKSkge1xuICAgICAgICAgICAgY29uc3VtZShUb2tlbi5DT0xPTik7XG4gICAgICAgICAgICBuYW1lICs9ICc6JyArIHZhbHVlO1xuICAgICAgICAgICAgZXhwZWN0KFRva2VuLk5BTUUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFN5bnRheC5OYW1lRXhwcmVzc2lvbixcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUeXBlRXhwcmVzc2lvbkxpc3QgOj1cbiAgICAvLyAgICAgVG9wTGV2ZWxUeXBlRXhwcmVzc2lvblxuICAgIC8vICAgfCBUb3BMZXZlbFR5cGVFeHByZXNzaW9uICcsJyBUeXBlRXhwcmVzc2lvbkxpc3RcbiAgICBmdW5jdGlvbiBwYXJzZVR5cGVFeHByZXNzaW9uTGlzdCgpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gW107XG5cbiAgICAgICAgZWxlbWVudHMucHVzaChwYXJzZVRvcCgpKTtcbiAgICAgICAgd2hpbGUgKHRva2VuID09PSBUb2tlbi5DT01NQSkge1xuICAgICAgICAgICAgY29uc3VtZShUb2tlbi5DT01NQSk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHBhcnNlVG9wKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9XG5cbiAgICAvLyBUeXBlTmFtZSA6PVxuICAgIC8vICAgICBOYW1lRXhwcmVzc2lvblxuICAgIC8vICAgfCBOYW1lRXhwcmVzc2lvbiBUeXBlQXBwbGljYXRpb25cbiAgICAvL1xuICAgIC8vIFR5cGVBcHBsaWNhdGlvbiA6PVxuICAgIC8vICAgICAnLjwnIFR5cGVFeHByZXNzaW9uTGlzdCAnPidcbiAgICAvLyAgIHwgJzwnIFR5cGVFeHByZXNzaW9uTGlzdCAnPicgICAvLyB0aGlzIGlzIGV4dGVuc2lvbiBvZiBkb2N0cmluZVxuICAgIGZ1bmN0aW9uIHBhcnNlVHlwZU5hbWUoKSB7XG4gICAgICAgIHZhciBleHByLCBhcHBsaWNhdGlvbnM7XG5cbiAgICAgICAgZXhwciA9IHBhcnNlTmFtZUV4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHRva2VuID09PSBUb2tlbi5ET1RfTFQgfHwgdG9rZW4gPT09IFRva2VuLkxUKSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICBhcHBsaWNhdGlvbnMgPSBwYXJzZVR5cGVFeHByZXNzaW9uTGlzdCgpO1xuICAgICAgICAgICAgZXhwZWN0KFRva2VuLkdUKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlR5cGVBcHBsaWNhdGlvbixcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByLFxuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uczogYXBwbGljYXRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuICAgIC8vIFJlc3VsdFR5cGUgOj1cbiAgICAvLyAgICAgPDxlbXB0eT4+XG4gICAgLy8gICB8ICc6JyB2b2lkXG4gICAgLy8gICB8ICc6JyBUeXBlRXhwcmVzc2lvblxuICAgIC8vXG4gICAgLy8gQk5GIGlzIGFib3ZlXG4gICAgLy8gYnV0LCB3ZSByZW1vdmUgPDxlbXB0eT4+IHBhdHRlcm4sIHNvIHRva2VuIGlzIGFsd2F5cyBUeXBlVG9rZW46OkNPTE9OXG4gICAgZnVuY3Rpb24gcGFyc2VSZXN1bHRUeXBlKCkge1xuICAgICAgICBjb25zdW1lKFRva2VuLkNPTE9OLCAnUmVzdWx0VHlwZSBzaG91bGQgc3RhcnQgd2l0aCA6Jyk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uTkFNRSAmJiB2YWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgICAgICBjb25zdW1lKFRva2VuLk5BTUUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVm9pZExpdGVyYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlVHlwZUV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvLyBQYXJhbWV0ZXJzVHlwZSA6PVxuICAgIC8vICAgICBSZXN0UGFyYW1ldGVyVHlwZVxuICAgIC8vICAgfCBOb25SZXN0UGFyYW1ldGVyc1R5cGVcbiAgICAvLyAgIHwgTm9uUmVzdFBhcmFtZXRlcnNUeXBlICcsJyBSZXN0UGFyYW1ldGVyVHlwZVxuICAgIC8vXG4gICAgLy8gUmVzdFBhcmFtZXRlclR5cGUgOj1cbiAgICAvLyAgICAgJy4uLidcbiAgICAvLyAgICAgJy4uLicgSWRlbnRpZmllclxuICAgIC8vXG4gICAgLy8gTm9uUmVzdFBhcmFtZXRlcnNUeXBlIDo9XG4gICAgLy8gICAgIFBhcmFtZXRlclR5cGUgJywnIE5vblJlc3RQYXJhbWV0ZXJzVHlwZVxuICAgIC8vICAgfCBQYXJhbWV0ZXJUeXBlXG4gICAgLy8gICB8IE9wdGlvbmFsUGFyYW1ldGVyc1R5cGVcbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsUGFyYW1ldGVyc1R5cGUgOj1cbiAgICAvLyAgICAgT3B0aW9uYWxQYXJhbWV0ZXJUeXBlXG4gICAgLy8gICB8IE9wdGlvbmFsUGFyYW1ldGVyVHlwZSwgT3B0aW9uYWxQYXJhbWV0ZXJzVHlwZVxuICAgIC8vXG4gICAgLy8gT3B0aW9uYWxQYXJhbWV0ZXJUeXBlIDo9IFBhcmFtZXRlclR5cGU9XG4gICAgLy9cbiAgICAvLyBQYXJhbWV0ZXJUeXBlIDo9IFR5cGVFeHByZXNzaW9uIHwgSWRlbnRpZmllciAnOicgVHlwZUV4cHJlc3Npb25cbiAgICAvL1xuICAgIC8vIElkZW50aWZpZXIgaXMgXCJuZXdcIiBvciBcInRoaXNcIlxuICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyc1R5cGUoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBbXSwgb3B0aW9uYWxTZXF1ZW5jZSA9IGZhbHNlLCBleHByLCByZXN0ID0gZmFsc2U7XG5cbiAgICAgICAgd2hpbGUgKHRva2VuICE9PSBUb2tlbi5SUEFSRU4pIHtcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uUkVTVCkge1xuICAgICAgICAgICAgICAgIC8vIFJlc3RQYXJhbWV0ZXJUeXBlXG4gICAgICAgICAgICAgICAgY29uc3VtZShUb2tlbi5SRVNUKTtcbiAgICAgICAgICAgICAgICByZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwciA9IHBhcnNlVHlwZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGlmIChleHByLnR5cGUgPT09IFN5bnRheC5OYW1lRXhwcmVzc2lvbiAmJiB0b2tlbiA9PT0gVG9rZW4uQ09MT04pIHtcbiAgICAgICAgICAgICAgICAvLyBJZGVudGlmaWVyICc6JyBUeXBlRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQ09MT04pO1xuICAgICAgICAgICAgICAgIGV4cHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5QYXJhbWV0ZXJUeXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBleHByLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IHBhcnNlVHlwZUV4cHJlc3Npb24oKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkVRVUFMKSB7XG4gICAgICAgICAgICAgICAgY29uc3VtZShUb2tlbi5FUVVBTCk7XG4gICAgICAgICAgICAgICAgZXhwciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU3ludGF4Lk9wdGlvbmFsVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgb3B0aW9uYWxTZXF1ZW5jZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbFNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWxpdHkudGhyb3dFcnJvcigndW5leHBlY3RlZCB0b2tlbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICAgICAgZXhwciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlJlc3RUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgaWYgKHRva2VuICE9PSBUb2tlbi5SUEFSRU4pIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoVG9rZW4uQ09NTUEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb25UeXBlIDo9ICdmdW5jdGlvbicgRnVuY3Rpb25TaWduYXR1cmVUeXBlXG4gICAgLy9cbiAgICAvLyBGdW5jdGlvblNpZ25hdHVyZVR5cGUgOj1cbiAgICAvLyAgIHwgVHlwZVBhcmFtZXRlcnMgJygnICcpJyBSZXN1bHRUeXBlXG4gICAgLy8gICB8IFR5cGVQYXJhbWV0ZXJzICcoJyBQYXJhbWV0ZXJzVHlwZSAnKScgUmVzdWx0VHlwZVxuICAgIC8vICAgfCBUeXBlUGFyYW1ldGVycyAnKCcgJ3RoaXMnICc6JyBUeXBlTmFtZSAnKScgUmVzdWx0VHlwZVxuICAgIC8vICAgfCBUeXBlUGFyYW1ldGVycyAnKCcgJ3RoaXMnICc6JyBUeXBlTmFtZSAnLCcgUGFyYW1ldGVyc1R5cGUgJyknIFJlc3VsdFR5cGVcbiAgICBmdW5jdGlvbiBwYXJzZUZ1bmN0aW9uVHlwZSgpIHtcbiAgICAgICAgdmFyIGlzTmV3LCB0aGlzQmluZGluZywgcGFyYW1zLCByZXN1bHQsIGZuVHlwZTtcbiAgICAgICAgdXRpbGl0eS5hc3NlcnQodG9rZW4gPT09IFRva2VuLk5BTUUgJiYgdmFsdWUgPT09ICdmdW5jdGlvbicsICdGdW5jdGlvblR5cGUgc2hvdWxkIHN0YXJ0IHdpdGggXFwnZnVuY3Rpb25cXCcnKTtcbiAgICAgICAgY29uc3VtZShUb2tlbi5OQU1FKTtcblxuICAgICAgICAvLyBHb29nbGUgQ2xvc3VyZSBDb21waWxlciBpcyBub3QgaW1wbGVtZW50aW5nIFR5cGVQYXJhbWV0ZXJzLlxuICAgICAgICAvLyBTbyB3ZSBkbyBub3QuIGlmIHdlIGRvbid0IGdldCAnKCcsIHdlIHNlZSBpdCBhcyBlcnJvci5cbiAgICAgICAgZXhwZWN0KFRva2VuLkxQQVJFTik7XG5cbiAgICAgICAgaXNOZXcgPSBmYWxzZTtcbiAgICAgICAgcGFyYW1zID0gW107XG4gICAgICAgIHRoaXNCaW5kaW5nID0gbnVsbDtcbiAgICAgICAgaWYgKHRva2VuICE9PSBUb2tlbi5SUEFSRU4pIHtcbiAgICAgICAgICAgIC8vIFBhcmFtZXRlcnNUeXBlIG9yICd0aGlzJ1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSBUb2tlbi5OQU1FICYmXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJ3RoaXMnIHx8IHZhbHVlID09PSAnbmV3JykpIHtcbiAgICAgICAgICAgICAgICAvLyAndGhpcycgb3IgJ25ldydcbiAgICAgICAgICAgICAgICAvLyAnbmV3JyBpcyBDbG9zdXJlIENvbXBpbGVyIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIGlzTmV3ID0gdmFsdWUgPT09ICduZXcnO1xuICAgICAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uTkFNRSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KFRva2VuLkNPTE9OKTtcbiAgICAgICAgICAgICAgICB0aGlzQmluZGluZyA9IHBhcnNlVHlwZU5hbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkNPTU1BKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQ09NTUEpO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnNUeXBlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnNUeXBlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoVG9rZW4uUlBBUkVOKTtcblxuICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkNPTE9OKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJzZVJlc3VsdFR5cGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuVHlwZSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFN5bnRheC5GdW5jdGlvblR5cGUsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzQmluZGluZykge1xuICAgICAgICAgICAgLy8gYXZvaWQgYWRkaW5nIG51bGwgJ25ldycgYW5kICd0aGlzJyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBmblR5cGVbJ3RoaXMnXSA9IHRoaXNCaW5kaW5nO1xuICAgICAgICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgICAgICAgICAgZm5UeXBlWyduZXcnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVHlwZTtcbiAgICB9XG5cbiAgICAvLyBCYXNpY1R5cGVFeHByZXNzaW9uIDo9XG4gICAgLy8gICAgICcqJ1xuICAgIC8vICAgfCAnbnVsbCdcbiAgICAvLyAgIHwgJ3VuZGVmaW5lZCdcbiAgICAvLyAgIHwgVHlwZU5hbWVcbiAgICAvLyAgIHwgRnVuY3Rpb25UeXBlXG4gICAgLy8gICB8IFVuaW9uVHlwZVxuICAgIC8vICAgfCBSZWNvcmRUeXBlXG4gICAgLy8gICB8IEFycmF5VHlwZVxuICAgIGZ1bmN0aW9uIHBhcnNlQmFzaWNUeXBlRXhwcmVzc2lvbigpIHtcbiAgICAgICAgdmFyIGNvbnRleHQ7XG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgY2FzZSBUb2tlbi5TVEFSOlxuICAgICAgICAgICAgY29uc3VtZShUb2tlbi5TVEFSKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkFsbExpdGVyYWxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSBUb2tlbi5MUEFSRU46XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVbmlvblR5cGUoKTtcblxuICAgICAgICBjYXNlIFRva2VuLkxCUkFDSzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUFycmF5VHlwZSgpO1xuXG4gICAgICAgIGNhc2UgVG9rZW4uTEJSQUNFOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVjb3JkVHlwZSgpO1xuXG4gICAgICAgIGNhc2UgVG9rZW4uTkFNRTpcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICAgICAgY29uc3VtZShUb2tlbi5OQU1FKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguTnVsbExpdGVyYWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3VtZShUb2tlbi5OQU1FKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVW5kZWZpbmVkTGl0ZXJhbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRleHQgPSBDb250ZXh0LnNhdmUoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uVHlwZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUeXBlTmFtZSgpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ3VuZXhwZWN0ZWQgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFR5cGVFeHByZXNzaW9uIDo9XG4gICAgLy8gICAgIEJhc2ljVHlwZUV4cHJlc3Npb25cbiAgICAvLyAgIHwgJz8nIEJhc2ljVHlwZUV4cHJlc3Npb25cbiAgICAvLyAgIHwgJyEnIEJhc2ljVHlwZUV4cHJlc3Npb25cbiAgICAvLyAgIHwgQmFzaWNUeXBlRXhwcmVzc2lvbiAnPydcbiAgICAvLyAgIHwgQmFzaWNUeXBlRXhwcmVzc2lvbiAnISdcbiAgICAvLyAgIHwgJz8nXG4gICAgLy8gICB8IEJhc2ljVHlwZUV4cHJlc3Npb24gJ1tdJ1xuICAgIGZ1bmN0aW9uIHBhcnNlVHlwZUV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBleHByO1xuXG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uUVVFU1RJT04pIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uUVVFU1RJT04pO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSBUb2tlbi5DT01NQSB8fCB0b2tlbiA9PT0gVG9rZW4uRVFVQUwgfHwgdG9rZW4gPT09IFRva2VuLlJCUkFDRSB8fFxuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9PT0gVG9rZW4uUlBBUkVOIHx8IHRva2VuID09PSBUb2tlbi5QSVBFIHx8IHRva2VuID09PSBUb2tlbi5FT0YgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPT09IFRva2VuLlJCUkFDSyB8fCB0b2tlbiA9PT0gVG9rZW4uR1QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguTnVsbGFibGVMaXRlcmFsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4Lk51bGxhYmxlVHlwZSxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBwYXJzZUJhc2ljVHlwZUV4cHJlc3Npb24oKSxcbiAgICAgICAgICAgICAgICBwcmVmaXg6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkJBTkcpIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQkFORyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Ob25OdWxsYWJsZVR5cGUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogcGFyc2VCYXNpY1R5cGVFeHByZXNzaW9uKCksXG4gICAgICAgICAgICAgICAgcHJlZml4OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwciA9IHBhcnNlQmFzaWNUeXBlRXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLkJBTkcpIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uQkFORyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Ob25OdWxsYWJsZVR5cGUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcixcbiAgICAgICAgICAgICAgICBwcmVmaXg6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBUb2tlbi5RVUVTVElPTikge1xuICAgICAgICAgICAgY29uc3VtZShUb2tlbi5RVUVTVElPTik7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5OdWxsYWJsZVR5cGUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcixcbiAgICAgICAgICAgICAgICBwcmVmaXg6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBUb2tlbi5MQlJBQ0spIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uTEJSQUNLKTtcbiAgICAgICAgICAgIGV4cGVjdChUb2tlbi5SQlJBQ0ssICdleHBlY3RlZCBhbiBhcnJheS1zdHlsZSB0eXBlIGRlY2xhcmF0aW9uICgnICsgdmFsdWUgKyAnW10pJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5UeXBlQXBwbGljYXRpb24sXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguTmFtZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBcnJheSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uczogW2V4cHJdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgLy8gVG9wTGV2ZWxUeXBlRXhwcmVzc2lvbiA6PVxuICAgIC8vICAgICAgVHlwZUV4cHJlc3Npb25cbiAgICAvLyAgICB8IFR5cGVVbmlvbkxpc3RcbiAgICAvL1xuICAgIC8vIFRoaXMgcnVsZSBpcyBHb29nbGUgQ2xvc3VyZSBDb21waWxlciBleHRlbnNpb24sIG5vdCBFUzRcbiAgICAvLyBsaWtlLFxuICAgIC8vICAgeyBudW1iZXIgfCBzdHJpbmcgfVxuICAgIC8vIElmIHN0cmljdCB0byBFUzQsIHdlIHNob3VsZCB3cml0ZSBpdCBhc1xuICAgIC8vICAgeyAobnVtYmVyfHN0cmluZykgfVxuICAgIGZ1bmN0aW9uIHBhcnNlVG9wKCkge1xuICAgICAgICB2YXIgZXhwciwgZWxlbWVudHM7XG5cbiAgICAgICAgZXhwciA9IHBhcnNlVHlwZUV4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHRva2VuICE9PSBUb2tlbi5QSVBFKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzID0gWyBleHByIF07XG4gICAgICAgIGNvbnN1bWUoVG9rZW4uUElQRSk7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHBhcnNlVHlwZUV4cHJlc3Npb24oKSk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IFRva2VuLlBJUEUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uUElQRSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU3ludGF4LlVuaW9uVHlwZSxcbiAgICAgICAgICAgIGVsZW1lbnRzOiBlbGVtZW50c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlVG9wUGFyYW1UeXBlKCkge1xuICAgICAgICB2YXIgZXhwcjtcblxuICAgICAgICBpZiAodG9rZW4gPT09IFRva2VuLlJFU1QpIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uUkVTVCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5SZXN0VHlwZSxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBwYXJzZVRvcCgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwciA9IHBhcnNlVG9wKCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gVG9rZW4uRVFVQUwpIHtcbiAgICAgICAgICAgIGNvbnN1bWUoVG9rZW4uRVFVQUwpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguT3B0aW9uYWxUeXBlLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVR5cGUoc3JjLCBvcHQpIHtcbiAgICAgICAgdmFyIGV4cHI7XG5cbiAgICAgICAgc291cmNlID0gc3JjO1xuICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIHByZXZpb3VzID0gMDtcblxuICAgICAgICBuZXh0KCk7XG4gICAgICAgIGV4cHIgPSBwYXJzZVRvcCgpO1xuXG4gICAgICAgIGlmIChvcHQgJiYgb3B0Lm1pZHN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByLFxuICAgICAgICAgICAgICAgIGluZGV4OiBwcmV2aW91c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiAhPT0gVG9rZW4uRU9GKSB7XG4gICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ25vdCByZWFjaCB0byBFT0YnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1UeXBlKHNyYywgb3B0KSB7XG4gICAgICAgIHZhciBleHByO1xuXG4gICAgICAgIHNvdXJjZSA9IHNyYztcbiAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBwcmV2aW91cyA9IDA7XG5cbiAgICAgICAgbmV4dCgpO1xuICAgICAgICBleHByID0gcGFyc2VUb3BQYXJhbVR5cGUoKTtcblxuICAgICAgICBpZiAob3B0ICYmIG9wdC5taWRzdHJlYW0pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcixcbiAgICAgICAgICAgICAgICBpbmRleDogcHJldmlvdXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gIT09IFRva2VuLkVPRikge1xuICAgICAgICAgICAgdXRpbGl0eS50aHJvd0Vycm9yKCdub3QgcmVhY2ggdG8gRU9GJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdpZnlJbXBsKG5vZGUsIGNvbXBhY3QsIHRvcExldmVsKSB7XG4gICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgU3ludGF4Lk51bGxhYmxlTGl0ZXJhbDpcbiAgICAgICAgICAgIHJlc3VsdCA9ICc/JztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4LkFsbExpdGVyYWw6XG4gICAgICAgICAgICByZXN1bHQgPSAnKic7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN5bnRheC5OdWxsTGl0ZXJhbDpcbiAgICAgICAgICAgIHJlc3VsdCA9ICdudWxsJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4LlVuZGVmaW5lZExpdGVyYWw6XG4gICAgICAgICAgICByZXN1bHQgPSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4LlZvaWRMaXRlcmFsOlxuICAgICAgICAgICAgcmVzdWx0ID0gJ3ZvaWQnO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTeW50YXguVW5pb25UeXBlOlxuICAgICAgICAgICAgaWYgKCF0b3BMZXZlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICcoJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gbm9kZS5lbGVtZW50cy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUltcGwobm9kZS5lbGVtZW50c1tpXSwgY29tcGFjdCk7XG4gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnfCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRvcExldmVsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4LkFycmF5VHlwZTpcbiAgICAgICAgICAgIHJlc3VsdCA9ICdbJztcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gbm9kZS5lbGVtZW50cy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUltcGwobm9kZS5lbGVtZW50c1tpXSwgY29tcGFjdCk7XG4gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjb21wYWN0ID8gJywnIDogJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTeW50YXguUmVjb3JkVHlwZTpcbiAgICAgICAgICAgIHJlc3VsdCA9ICd7JztcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gbm9kZS5maWVsZHMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmdpZnlJbXBsKG5vZGUuZmllbGRzW2ldLCBjb21wYWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNvbXBhY3QgPyAnLCcgOiAnLCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSAnfSc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN5bnRheC5GaWVsZFR5cGU6XG4gICAgICAgICAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUua2V5ICsgKGNvbXBhY3QgPyAnOicgOiAnOiAnKSArIHN0cmluZ2lmeUltcGwobm9kZS52YWx1ZSwgY29tcGFjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUua2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTeW50YXguRnVuY3Rpb25UeXBlOlxuICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFjdCA/ICdmdW5jdGlvbignIDogJ2Z1bmN0aW9uICgnO1xuXG4gICAgICAgICAgICBpZiAobm9kZVsndGhpcyddKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbJ25ldyddKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoY29tcGFjdCA/ICduZXc6JyA6ICduZXc6ICcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoY29tcGFjdCA/ICd0aGlzOicgOiAndGhpczogJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUltcGwobm9kZVsndGhpcyddLCBjb21wYWN0KTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNvbXBhY3QgPyAnLCcgOiAnLCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBub2RlLnBhcmFtcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUltcGwobm9kZS5wYXJhbXNbaV0sIGNvbXBhY3QpO1xuICAgICAgICAgICAgICAgIGlmICgoaSArIDEpICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY29tcGFjdCA/ICcsJyA6ICcsICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgKz0gJyknO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gKGNvbXBhY3QgPyAnOicgOiAnOiAnKSArIHN0cmluZ2lmeUltcGwobm9kZS5yZXN1bHQsIGNvbXBhY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTeW50YXguUGFyYW1ldGVyVHlwZTpcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUubmFtZSArIChjb21wYWN0ID8gJzonIDogJzogJykgKyBzdHJpbmdpZnlJbXBsKG5vZGUuZXhwcmVzc2lvbiwgY29tcGFjdCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN5bnRheC5SZXN0VHlwZTpcbiAgICAgICAgICAgIHJlc3VsdCA9ICcuLi4nO1xuICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmdpZnlJbXBsKG5vZGUuZXhwcmVzc2lvbiwgY29tcGFjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN5bnRheC5Ob25OdWxsYWJsZVR5cGU6XG4gICAgICAgICAgICBpZiAobm9kZS5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAnIScgKyBzdHJpbmdpZnlJbXBsKG5vZGUuZXhwcmVzc2lvbiwgY29tcGFjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmluZ2lmeUltcGwobm9kZS5leHByZXNzaW9uLCBjb21wYWN0KSArICchJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4Lk9wdGlvbmFsVHlwZTpcbiAgICAgICAgICAgIHJlc3VsdCA9IHN0cmluZ2lmeUltcGwobm9kZS5leHByZXNzaW9uLCBjb21wYWN0KSArICc9JztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU3ludGF4Lk51bGxhYmxlVHlwZTpcbiAgICAgICAgICAgIGlmIChub2RlLnByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICc/JyArIHN0cmluZ2lmeUltcGwobm9kZS5leHByZXNzaW9uLCBjb21wYWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyaW5naWZ5SW1wbChub2RlLmV4cHJlc3Npb24sIGNvbXBhY3QpICsgJz8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTeW50YXguTmFtZUV4cHJlc3Npb246XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLm5hbWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN5bnRheC5UeXBlQXBwbGljYXRpb246XG4gICAgICAgICAgICByZXN1bHQgPSBzdHJpbmdpZnlJbXBsKG5vZGUuZXhwcmVzc2lvbiwgY29tcGFjdCkgKyAnLjwnO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBub2RlLmFwcGxpY2F0aW9ucy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUltcGwobm9kZS5hcHBsaWNhdGlvbnNbaV0sIGNvbXBhY3QpO1xuICAgICAgICAgICAgICAgIGlmICgoaSArIDEpICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY29tcGFjdCA/ICcsJyA6ICcsICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICc+JztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB1dGlsaXR5LnRocm93RXJyb3IoJ1Vua25vd24gdHlwZSAnICsgbm9kZS50eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlJbXBsKG5vZGUsIG9wdGlvbnMuY29tcGFjdCwgb3B0aW9ucy50b3BMZXZlbCk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5wYXJzZVR5cGUgPSBwYXJzZVR5cGU7XG4gICAgZXhwb3J0cy5wYXJzZVBhcmFtVHlwZSA9IHBhcnNlUGFyYW1UeXBlO1xuICAgIGV4cG9ydHMuc3RyaW5naWZ5ID0gc3RyaW5naWZ5O1xuICAgIGV4cG9ydHMuU3ludGF4ID0gU3ludGF4O1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgVkVSU0lPTjtcblxuICAgIFZFUlNJT04gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuICAgIGV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICBmdW5jdGlvbiBEb2N0cmluZUVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0RvY3RyaW5lRXJyb3InO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICBEb2N0cmluZUVycm9yLnByb3RvdHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNaWRkbGUgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIE1pZGRsZS5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBuZXcgTWlkZGxlKCk7XG4gICAgfSgpKTtcbiAgICBEb2N0cmluZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvY3RyaW5lRXJyb3I7XG4gICAgZXhwb3J0cy5Eb2N0cmluZUVycm9yID0gRG9jdHJpbmVFcnJvcjtcblxuICAgIGZ1bmN0aW9uIHRocm93RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRG9jdHJpbmVFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgZXhwb3J0cy50aHJvd0Vycm9yID0gdGhyb3dFcnJvcjtcblxuICAgIGV4cG9ydHMuYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG59KCkpO1xuXG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICdBUyBJUydcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBmdW5jdGlvbiBpc0V4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0JpbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgY2FzZSAnTG9naWNhbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ09iamVjdEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnU2VxdWVuY2VFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1RoaXNFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1VuYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdVcGRhdGVFeHByZXNzaW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRpb25TdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdCcmVha1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdDb250aW51ZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEZWJ1Z2dlclN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEb1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0VtcHR5U3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0V4cHJlc3Npb25TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnUmV0dXJuU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1N3aXRjaFN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUaHJvd1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvbic6XG4gICAgICAgICAgICBjYXNlICdXaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTb3VyY2VFbGVtZW50KG5vZGUpIHtcbiAgICAgIHJldHVybiBpc1N0YXRlbWVudChub2RlKSB8fCBub2RlICE9IG51bGwgJiYgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhaWxpbmdTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmFsdGVybmF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnNlcXVlbnQ7XG5cbiAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvckluU3RhdGVtZW50JzpcbiAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgIHJldHVybiBub2RlLmJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFsdGVybmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG5vZGUuY29uc2VxdWVudDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQudHlwZSA9PT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmFsdGVybmF0ZSA9PSBudWxsKSAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gdHJhaWxpbmdTdGF0ZW1lbnQoY3VycmVudCk7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNFeHByZXNzaW9uOiBpc0V4cHJlc3Npb24sXG4gICAgICAgIGlzU3RhdGVtZW50OiBpc1N0YXRlbWVudCxcbiAgICAgICAgaXNJdGVyYXRpb25TdGF0ZW1lbnQ6IGlzSXRlcmF0aW9uU3RhdGVtZW50LFxuICAgICAgICBpc1NvdXJjZUVsZW1lbnQ6IGlzU291cmNlRWxlbWVudCxcbiAgICAgICAgaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50OiBpc1Byb2JsZW1hdGljSWZTdGF0ZW1lbnQsXG5cbiAgICAgICAgdHJhaWxpbmdTdGF0ZW1lbnQ6IHRyYWlsaW5nU3RhdGVtZW50XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTQgSXZhbiBOaWt1bGluIDxpZmFhYW5AZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFJlZ2V4LCBOT05fQVNDSUlfV0hJVEVTUEFDRVM7XG5cbiAgICAvLyBTZWUgYHRvb2xzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuICAgIFJlZ2V4ID0ge1xuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogbmV3IFJlZ0V4cCgnW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTI3XFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwXFx1MDhBMi1cXHUwOEFDXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5NzdcXHUwOTc5LVxcdTA5N0ZcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzM1xcdTBDMzUtXFx1MEMzOVxcdTBDM0RcXHUwQzU4XFx1MEM1OVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDYwXFx1MEQ2MVxcdTBEN0EtXFx1MEQ3RlxcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRTAxLVxcdTBFMzBcXHUwRTMyXFx1MEUzM1xcdTBFNDAtXFx1MEU0NlxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUIwXFx1MEVCMlxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjQwLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjg4LVxcdTBGOENcXHUxMDAwLVxcdTEwMkFcXHUxMDNGXFx1MTA1MC1cXHUxMDU1XFx1MTA1QS1cXHUxMDVEXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2RS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4RVxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjBcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzgwLVxcdTE3QjNcXHUxN0Q3XFx1MTdEQ1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBOFxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUNcXHUxOTUwLVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUMxLVxcdTE5QzdcXHUxQTAwLVxcdTFBMTZcXHUxQTIwLVxcdTFBNTRcXHUxQUE3XFx1MUIwNS1cXHUxQjMzXFx1MUI0NS1cXHUxQjRCXFx1MUI4My1cXHUxQkEwXFx1MUJBRVxcdTFCQUZcXHUxQkJBLVxcdTFCRTVcXHUxQzAwLVxcdTFDMjNcXHUxQzRELVxcdTFDNEZcXHUxQzVBLVxcdTFDN0RcXHUxQ0U5LVxcdTFDRUNcXHUxQ0VFLVxcdTFDRjFcXHUxQ0Y1XFx1MUNGNlxcdTFEMDAtXFx1MURCRlxcdTFFMDAtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5N1xcdUE2QTAtXFx1QTZFRlxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTc5M1xcdUE3QTAtXFx1QTdBQVxcdUE3RjgtXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBODAtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUJDMC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXScpLFxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OiBuZXcgUmVnRXhwKCdbXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MjdcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwXFx1MDhBMi1cXHUwOEFDXFx1MDhFNC1cXHUwOEZFXFx1MDkwMC1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdGXFx1MDk4MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDEtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzM1xcdTBDMzUtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OFxcdTBDNTlcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgyXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMlxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU3XFx1MEQ2MC1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkYwXFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUNcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5RDlcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUQwMC1cXHUxREU2XFx1MURGQy1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwMENcXHUyMDBEXFx1MjAzRlxcdTIwNDBcXHUyMDU0XFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMEQwLVxcdTIwRENcXHUyMEUxXFx1MjBFNS1cXHUyMEYwXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTJEXFx1MjEyRi1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEN0YtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJERTAtXFx1MkRGRlxcdTJFMkZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDk5XFx1MzA5QVxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZDQ1xcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYyQlxcdUE2NDAtXFx1QTY2RlxcdUE2NzQtXFx1QTY3RFxcdUE2N0YtXFx1QTY5N1xcdUE2OUYtXFx1QTZGMVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTc5M1xcdUE3QTAtXFx1QTdBQVxcdUE3RjgtXFx1QTgyN1xcdUE4NDAtXFx1QTg3M1xcdUE4ODAtXFx1QThDNFxcdUE4RDAtXFx1QThEOVxcdUE4RTAtXFx1QThGN1xcdUE4RkJcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3QlxcdUFBODAtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCQzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMjZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdJylcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNEZWNpbWFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA+PSA0OCAmJiBjaCA8PSA1Nyk7ICAgLy8gMC4uOVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIGlzRGVjaW1hbERpZ2l0KGNoKSB8fCAgICAvLyAwLi45XG4gICAgICAgICAgICAoOTcgPD0gY2ggJiYgY2ggPD0gMTAyKSB8fCAgLy8gYS4uZlxuICAgICAgICAgICAgKDY1IDw9IGNoICYmIGNoIDw9IDcwKTsgICAgIC8vIEEuLkZcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09jdGFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA+PSA0OCAmJiBjaCA8PSA1NSk7ICAgLy8gMC4uN1xuICAgIH1cblxuICAgIC8vIDcuMiBXaGl0ZSBTcGFjZVxuXG4gICAgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTID0gW1xuICAgICAgICAweDE2ODAsIDB4MTgwRSxcbiAgICAgICAgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsXG4gICAgICAgIDB4MjAyRiwgMHgyMDVGLFxuICAgICAgICAweDMwMDAsXG4gICAgICAgIDB4RkVGRlxuICAgIF07XG5cbiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA9PT0gMHgyMCkgfHwgKGNoID09PSAweDA5KSB8fCAoY2ggPT09IDB4MEIpIHx8IChjaCA9PT0gMHgwQykgfHwgKGNoID09PSAweEEwKSB8fFxuICAgICAgICAgICAgKGNoID49IDB4MTY4MCAmJiBOT05fQVNDSUlfV0hJVEVTUEFDRVMuaW5kZXhPZihjaCkgPj0gMCk7XG4gICAgfVxuXG4gICAgLy8gNy4zIExpbmUgVGVybWluYXRvcnNcblxuICAgIGZ1bmN0aW9uIGlzTGluZVRlcm1pbmF0b3IoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA9PT0gMHgwQSkgfHwgKGNoID09PSAweDBEKSB8fCAoY2ggPT09IDB4MjAyOCkgfHwgKGNoID09PSAweDIwMjkpO1xuICAgIH1cblxuICAgIC8vIDcuNiBJZGVudGlmaWVyIE5hbWVzIGFuZCBJZGVudGlmaWVyc1xuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA+PSA5NyAmJiBjaCA8PSAxMjIpIHx8ICAgICAvLyBhLi56XG4gICAgICAgICAgICAoY2ggPj0gNjUgJiYgY2ggPD0gOTApIHx8ICAgICAgICAgLy8gQS4uWlxuICAgICAgICAgICAgKGNoID09PSAzNikgfHwgKGNoID09PSA5NSkgfHwgICAgIC8vICQgKGRvbGxhcikgYW5kIF8gKHVuZGVyc2NvcmUpXG4gICAgICAgICAgICAoY2ggPT09IDkyKSB8fCAgICAgICAgICAgICAgICAgICAgLy8gXFwgKGJhY2tzbGFzaClcbiAgICAgICAgICAgICgoY2ggPj0gMHg4MCkgJiYgUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA+PSA5NyAmJiBjaCA8PSAxMjIpIHx8ICAgICAvLyBhLi56XG4gICAgICAgICAgICAoY2ggPj0gNjUgJiYgY2ggPD0gOTApIHx8ICAgICAgICAgLy8gQS4uWlxuICAgICAgICAgICAgKGNoID49IDQ4ICYmIGNoIDw9IDU3KSB8fCAgICAgICAgIC8vIDAuLjlcbiAgICAgICAgICAgIChjaCA9PT0gMzYpIHx8IChjaCA9PT0gOTUpIHx8ICAgICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgICAgICAgICAgKGNoID09PSA5MikgfHwgICAgICAgICAgICAgICAgICAgIC8vIFxcIChiYWNrc2xhc2gpXG4gICAgICAgICAgICAoKGNoID49IDB4ODApICYmIFJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICBpc0RlY2ltYWxEaWdpdDogaXNEZWNpbWFsRGlnaXQsXG4gICAgICAgIGlzSGV4RGlnaXQ6IGlzSGV4RGlnaXQsXG4gICAgICAgIGlzT2N0YWxEaWdpdDogaXNPY3RhbERpZ2l0LFxuICAgICAgICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgICAgICAgaXNMaW5lVGVybWluYXRvcjogaXNMaW5lVGVybWluYXRvcixcbiAgICAgICAgaXNJZGVudGlmaWVyU3RhcnQ6IGlzSWRlbnRpZmllclN0YXJ0LFxuICAgICAgICBpc0lkZW50aWZpZXJQYXJ0OiBpc0lkZW50aWZpZXJQYXJ0XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBjb2RlID0gcmVxdWlyZSgnLi9jb2RlJyk7XG5cbiAgICBmdW5jdGlvbiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpIHtcbiAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICBjYXNlICdpbXBsZW1lbnRzJzpcbiAgICAgICAgY2FzZSAnaW50ZXJmYWNlJzpcbiAgICAgICAgY2FzZSAncGFja2FnZSc6XG4gICAgICAgIGNhc2UgJ3ByaXZhdGUnOlxuICAgICAgICBjYXNlICdwcm90ZWN0ZWQnOlxuICAgICAgICBjYXNlICdwdWJsaWMnOlxuICAgICAgICBjYXNlICdzdGF0aWMnOlxuICAgICAgICBjYXNlICdsZXQnOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0tleXdvcmRFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICAvLyB5aWVsZCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMga2V5d29yZCB1bmRlciBub24tc3RyaWN0IG1vZGUuXG4gICAgICAgIGlmICghc3RyaWN0ICYmIGlkID09PSAneWllbGQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzS2V5d29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCkge1xuICAgICAgICBpZiAoc3RyaWN0ICYmIGlzU3RyaWN0TW9kZVJlc2VydmVkV29yZEVTNihpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChpZC5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2lmJykgfHwgKGlkID09PSAnaW4nKSB8fCAoaWQgPT09ICdkbycpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAndmFyJykgfHwgKGlkID09PSAnZm9yJykgfHwgKGlkID09PSAnbmV3JykgfHwgKGlkID09PSAndHJ5Jyk7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd0aGlzJykgfHwgKGlkID09PSAnZWxzZScpIHx8IChpZCA9PT0gJ2Nhc2UnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3ZvaWQnKSB8fCAoaWQgPT09ICd3aXRoJykgfHwgKGlkID09PSAnZW51bScpO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnd2hpbGUnKSB8fCAoaWQgPT09ICdicmVhaycpIHx8IChpZCA9PT0gJ2NhdGNoJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICd0aHJvdycpIHx8IChpZCA9PT0gJ2NvbnN0JykgfHwgKGlkID09PSAneWllbGQnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ2NsYXNzJykgfHwgKGlkID09PSAnc3VwZXInKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3JldHVybicpIHx8IChpZCA9PT0gJ3R5cGVvZicpIHx8IChpZCA9PT0gJ2RlbGV0ZScpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAnc3dpdGNoJykgfHwgKGlkID09PSAnZXhwb3J0JykgfHwgKGlkID09PSAnaW1wb3J0Jyk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdkZWZhdWx0JykgfHwgKGlkID09PSAnZmluYWxseScpIHx8IChpZCA9PT0gJ2V4dGVuZHMnKTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2Z1bmN0aW9uJykgfHwgKGlkID09PSAnY29udGludWUnKSB8fCAoaWQgPT09ICdkZWJ1Z2dlcicpO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2luc3RhbmNlb2YnKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzUoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNlcnZlZFdvcmRFUzYoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdudWxsJyB8fCBpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnIHx8IGlzS2V5d29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRXb3JkKGlkKSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ2V2YWwnIHx8IGlkID09PSAnYXJndW1lbnRzJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lKGlkKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY2g7XG5cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyU3RhcnQoY2gpIHx8IGNoID09PSA5MikgeyAgLy8gXFwgKGJhY2tzbGFzaClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gaWQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKCFjb2RlLmlzSWRlbnRpZmllclBhcnQoY2gpIHx8IGNoID09PSA5MikgeyAgLy8gXFwgKGJhY2tzbGFzaClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWUoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNShpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJFUzYoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaXNJZGVudGlmaWVyTmFtZShpZCkgJiYgIWlzUmVzZXJ2ZWRXb3JkRVM2KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICBpc0tleXdvcmRFUzU6IGlzS2V5d29yZEVTNSxcbiAgICAgICAgaXNLZXl3b3JkRVM2OiBpc0tleXdvcmRFUzYsXG4gICAgICAgIGlzUmVzZXJ2ZWRXb3JkRVM1OiBpc1Jlc2VydmVkV29yZEVTNSxcbiAgICAgICAgaXNSZXNlcnZlZFdvcmRFUzY6IGlzUmVzZXJ2ZWRXb3JkRVM2LFxuICAgICAgICBpc1Jlc3RyaWN0ZWRXb3JkOiBpc1Jlc3RyaWN0ZWRXb3JkLFxuICAgICAgICBpc0lkZW50aWZpZXJOYW1lOiBpc0lkZW50aWZpZXJOYW1lLFxuICAgICAgICBpc0lkZW50aWZpZXJFUzU6IGlzSWRlbnRpZmllckVTNSxcbiAgICAgICAgaXNJZGVudGlmaWVyRVM2OiBpc0lkZW50aWZpZXJFUzZcbiAgICB9O1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBleHBvcnRzLmFzdCA9IHJlcXVpcmUoJy4vYXN0Jyk7XG4gICAgZXhwb3J0cy5jb2RlID0gcmVxdWlyZSgnLi9jb2RlJyk7XG4gICAgZXhwb3J0cy5rZXl3b3JkID0gcmVxdWlyZSgnLi9rZXl3b3JkJyk7XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJfYXJnc1wiOiBbXG4gICAgW1xuICAgICAgXCJkb2N0cmluZUBeMC43LjBcIixcbiAgICAgIFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZG9jdHJpbmVAPj0wLjcuMCA8MC44LjBcIixcbiAgXCJfaWRcIjogXCJkb2N0cmluZUAwLjcuMlwiLFxuICBcIl9pbkNhY2hlXCI6IHRydWUsXG4gIFwiX2luc3RhbGxhYmxlXCI6IHRydWUsXG4gIFwiX2xvY2F0aW9uXCI6IFwiL2RvY3RyaW5lXCIsXG4gIFwiX25wbVVzZXJcIjoge1xuICAgIFwiZW1haWxcIjogXCJuaWNob2xhc0BuY3pjb25zdWx0aW5nLmNvbVwiLFxuICAgIFwibmFtZVwiOiBcIm56YWthc1wiXG4gIH0sXG4gIFwiX25wbVZlcnNpb25cIjogXCIxLjQuMjhcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHt9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImRvY3RyaW5lXCIsXG4gICAgXCJyYXdcIjogXCJkb2N0cmluZUBeMC43LjBcIixcbiAgICBcInJhd1NwZWNcIjogXCJeMC43LjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj0wLjcuMCA8MC44LjBcIixcbiAgICBcInR5cGVcIjogXCJyYW5nZVwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL1wiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9jdHJpbmUvLS9kb2N0cmluZS0wLjcuMi50Z3pcIixcbiAgXCJfc2hhc3VtXCI6IFwiN2NiODYwMzU5YmEzYmU5MGUwNDBiMjZiNzI5Y2U0YmZhNjU0YzUyM1wiLFxuICBcIl9zaHJpbmt3cmFwXCI6IG51bGwsXG4gIFwiX3NwZWNcIjogXCJkb2N0cmluZUBeMC43LjBcIixcbiAgXCJfd2hlcmVcIjogXCIvVXNlcnMvYWpvL3dvcmtzcGFjZS9oeWRyb2x5c2lzXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2RvY3RyaW5lL2lzc3Vlc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImVzdXRpbHNcIjogXCJeMS4xLjZcIixcbiAgICBcImlzYXJyYXlcIjogXCIwLjAuMVwiXG4gIH0sXG4gIFwiZGVzY3JpcHRpb25cIjogXCJKU0RvYyBwYXJzZXJcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY292ZXJhbGxzXCI6IFwiXjIuMTEuMlwiLFxuICAgIFwiZGF0ZWZvcm1hdFwiOiBcIl4xLjAuMTFcIixcbiAgICBcImVzbGludFwiOiBcIl4xLjkuMFwiLFxuICAgIFwiZ3VscFwiOiBcIl4zLjguMTBcIixcbiAgICBcImd1bHAtYnVtcFwiOiBcIl4wLjEuMTNcIixcbiAgICBcImd1bHAtZXNsaW50XCI6IFwiXjAuNS4wXCIsXG4gICAgXCJndWxwLWZpbHRlclwiOiBcIl4yLjAuMlwiLFxuICAgIFwiZ3VscC1naXRcIjogXCJeMS4wLjBcIixcbiAgICBcImd1bHAtaXN0YW5idWxcIjogXCJeMC42LjBcIixcbiAgICBcImd1bHAtanNoaW50XCI6IFwiXjEuOS4wXCIsXG4gICAgXCJndWxwLW1vY2hhXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJndWxwLXRhZy12ZXJzaW9uXCI6IFwiXjEuMi4xXCIsXG4gICAgXCJqc2hpbnQtc3R5bGlzaFwiOiBcIl4xLjAuMFwiLFxuICAgIFwibGluZWZpeFwiOiBcIl4wLjEuMVwiLFxuICAgIFwibW9jaGFcIjogXCJeMi4zLjNcIixcbiAgICBcIm5wbS1saWNlbnNlXCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNS4wLjNcIixcbiAgICBcInNoZWxsanNcIjogXCJeMC41LjNcIixcbiAgICBcInNoZWxsanMtbm9kZWNsaVwiOiBcIl4wLjEuMVwiLFxuICAgIFwic2hvdWxkXCI6IFwiXjUuMC4xXCJcbiAgfSxcbiAgXCJkaXJlY3Rvcmllc1wiOiB7XG4gICAgXCJsaWJcIjogXCIuL2xpYlwiXG4gIH0sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCI3Y2I4NjAzNTliYTNiZTkwZTA0MGIyNmI3MjljZTRiZmE2NTRjNTIzXCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb2N0cmluZS8tL2RvY3RyaW5lLTAuNy4yLnRnelwiXG4gIH0sXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0wLjEwLjBcIlxuICB9LFxuICBcImZpbGVzXCI6IFtcbiAgICBcIkxJQ0VOU0UuQlNEXCIsXG4gICAgXCJMSUNFTlNFLmNsb3N1cmUtY29tcGlsZXJcIixcbiAgICBcIkxJQ0VOU0UuZXNwcmltYVwiLFxuICAgIFwiUkVBRE1FLm1kXCIsXG4gICAgXCJsaWJcIlxuICBdLFxuICBcImdpdEhlYWRcIjogXCJkNzhlMzg3Y2U5NDE4ODBhZTk3Y2E3NjgwOTJlZTExMDI5YmRiOTE2XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2RvY3RyaW5lXCIsXG4gIFwibGljZW5zZXNcIjogW1xuICAgIHtcbiAgICAgIFwidHlwZVwiOiBcIkJTRFwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwOi8vZ2l0aHViLmNvbS9lc2xpbnQvZG9jdHJpbmUvcmF3L21hc3Rlci9MSUNFTlNFLkJTRFwiXG4gICAgfVxuICBdLFxuICBcIm1haW5cIjogXCJsaWIvZG9jdHJpbmUuanNcIixcbiAgXCJtYWludGFpbmVyc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiY29uc3RlbGxhdGlvblwiLFxuICAgICAgXCJlbWFpbFwiOiBcInV0YXRhbmUudGVhQGdtYWlsLmNvbVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJuemFrYXNcIixcbiAgICAgIFwiZW1haWxcIjogXCJuaWNob2xhc0BuY3pjb25zdWx0aW5nLmNvbVwiXG4gICAgfVxuICBdLFxuICBcIm5hbWVcIjogXCJkb2N0cmluZVwiLFxuICBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCI6IHt9LFxuICBcInJlYWRtZVwiOiBcIkVSUk9SOiBObyBSRUFETUUgZGF0YSBmb3VuZCFcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtzc2g6Ly9naXRAZ2l0aHViLmNvbS9lc2xpbnQvZG9jdHJpbmUuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNvdmVyYWxsc1wiOiBcImNhdCAuL2NvdmVyYWdlL2xjb3YuaW5mbyB8IGNvdmVyYWxscyAmJiBybSAtcmYgLi9jb3ZlcmFnZVwiLFxuICAgIFwibGludFwiOiBcImd1bHAgbGludFwiLFxuICAgIFwidGVzdFwiOiBcImd1bHBcIixcbiAgICBcInVuaXQtdGVzdFwiOiBcImd1bHAgdGVzdFwiXG4gIH0sXG4gIFwidmVyc2lvblwiOiBcIjAuNy4yXCJcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuXG4vLyBqc2hpbnQgbm9kZTogdHJ1ZVxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xvbmVPYmplY3QgPSByZXF1aXJlKCdjbG9uZScpO1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVJbmRleChlbGVtZW50LCBuYW1lKSB7XG4gIGlmICghZWxlbWVudC5hdHRycykge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgbiA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50LmF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGVsZW1lbnQuYXR0cnNbaV0ubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWZmIFtlbGVtZW50XSBoYXMgdGhlIGF0dHJpYnV0ZSBbbmFtZV0sIGBmYWxzZWBcbiAqICAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSkge1xuICByZXR1cm4gZ2V0QXR0cmlidXRlSW5kZXgoZWxlbWVudCwgbmFtZSkgIT09IC0xO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gVGhlIHN0cmluZyB2YWx1ZSBvZiBhdHRyaWJ1dGUgYG5hbWVgLCBvciBgbnVsbGAuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbGVtZW50LCBuYW1lKSB7XG4gIHZhciBpID0gZ2V0QXR0cmlidXRlSW5kZXgoZWxlbWVudCwgbmFtZSk7XG4gIGlmIChpID4gLTEpIHtcbiAgICByZXR1cm4gZWxlbWVudC5hdHRyc1tpXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpID0gZ2V0QXR0cmlidXRlSW5kZXgoZWxlbWVudCwgbmFtZSk7XG4gIGlmIChpID4gLTEpIHtcbiAgICBlbGVtZW50LmF0dHJzW2ldLnZhbHVlID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5hdHRycy5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSkge1xuICB2YXIgaSA9IGdldEF0dHJpYnV0ZUluZGV4KGVsZW1lbnQsIG5hbWUpO1xuICBpZiAoaSA+IC0xKSB7XG4gICAgZWxlbWVudC5hdHRycy5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVGFnTmFtZShuYW1lKSB7XG4gIHZhciBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS50YWdOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gbjtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHJlZ2V4Lm1hdGNoKHRhZ05hbWUpYCBmaW5kcyBhIG1hdGNoLlxuICpcbiAqIFRoaXMgd2lsbCB1c2UgdGhlIGxvd2VyY2FzZWQgdGFnTmFtZSBmb3IgY29tcGFyaXNvbi5cbiAqXG4gKiBAcGFyYW0gIHtSZWdFeHB9IHJlZ2V4XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNNYXRjaGluZ1RhZ05hbWUocmVnZXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUudGFnTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmVnZXgudGVzdChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgYXR0ciA9IGdldEF0dHJpYnV0ZShub2RlLCAnY2xhc3MnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIuc3BsaXQoJyAnKS5pbmRleE9mKG5hbWUpID4gLTE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbGxhcHNlVGV4dFJhbmdlKHBhcmVudCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdGV4dCA9ICcnO1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICB0ZXh0ICs9IGdldFRleHRDb250ZW50KHBhcmVudC5jaGlsZE5vZGVzW2ldKTtcbiAgfVxuICBwYXJlbnQuY2hpbGROb2Rlcy5zcGxpY2Uoc3RhcnQsIChlbmQgLSBzdGFydCkgKyAxKTtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgdG4gPSBuZXdUZXh0Tm9kZSh0ZXh0KTtcbiAgICB0bi5wYXJlbnROb2RlID0gcGFyZW50O1xuICAgIHBhcmVudC5jaGlsZE5vZGVzLnNwbGljZShzdGFydCwgMCwgdG4pO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSB0ZXh0IGluc2lkZSBhbiBlbGVtZW50XG4gKlxuICogRXF1aXZhbGVudCB0byBgZWxlbWVudC5ub3JtYWxpemUoKWAgaW4gdGhlIGJyb3dzZXJcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9ub3JtYWxpemVcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKG5vZGUpIHtcbiAgaWYgKCEoaXNFbGVtZW50KG5vZGUpIHx8IGlzRG9jdW1lbnQobm9kZSkgfHwgaXNEb2N1bWVudEZyYWdtZW50KG5vZGUpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgdGV4dFJhbmdlU3RhcnQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggLSAxLCBuOyBpID49IDA7IGktLSkge1xuICAgIG4gPSBub2RlLmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKGlzVGV4dE5vZGUobikpIHtcbiAgICAgIGlmICh0ZXh0UmFuZ2VTdGFydCA9PSAtMSkge1xuICAgICAgICB0ZXh0UmFuZ2VTdGFydCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAvLyBjb2xsYXBzZSBsZWFkaW5nIHRleHQgbm9kZXNcbiAgICAgICAgY29sbGFwc2VUZXh0UmFuZ2Uobm9kZSwgMCwgdGV4dFJhbmdlU3RhcnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZWN1cnNlXG4gICAgICBub3JtYWxpemUobik7XG4gICAgICAvLyBjb2xsYXBzZSB0aGUgcmFuZ2UgYWZ0ZXIgdGhpcyBub2RlXG4gICAgICBpZiAodGV4dFJhbmdlU3RhcnQgPiAtMSkge1xuICAgICAgICBjb2xsYXBzZVRleHRSYW5nZShub2RlLCBpICsgMSwgdGV4dFJhbmdlU3RhcnQpO1xuICAgICAgICB0ZXh0UmFuZ2VTdGFydCA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgdGV4dCB2YWx1ZSBvZiBhIG5vZGUgb3IgZWxlbWVudFxuICpcbiAqIEVxdWl2YWxlbnQgdG8gYG5vZGUudGV4dENvbnRlbnRgIGluIHRoZSBicm93c2VyXG4gKi9cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50KG5vZGUpIHtcbiAgaWYgKGlzQ29tbWVudE5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5kYXRhO1xuICB9XG4gIGlmIChpc1RleHROb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cbiAgdmFyIHN1YnRyZWUgPSBub2RlV2Fsa0FsbChub2RlLCBpc1RleHROb2RlKTtcbiAgcmV0dXJuIHN1YnRyZWUubWFwKGdldFRleHRDb250ZW50KS5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHRleHQgdmFsdWUgb2YgYSBub2RlIG9yIGVsZW1lbnRcbiAqXG4gKiBFcXVpdmFsZW50IHRvIGBub2RlLnRleHRDb250ZW50ID0gdmFsdWVgIGluIHRoZSBicm93c2VyXG4gKi9cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50KG5vZGUsIHZhbHVlKSB7XG4gIGlmIChpc0NvbW1lbnROb2RlKG5vZGUpKSB7XG4gICAgbm9kZS5kYXRhID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShub2RlKSkge1xuICAgIG5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdG4gPSBuZXdUZXh0Tm9kZSh2YWx1ZSk7XG4gICAgdG4ucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgbm9kZS5jaGlsZE5vZGVzID0gW3RuXTtcbiAgfVxufVxuXG4vKipcbiAqIE1hdGNoIHRoZSB0ZXh0IGluc2lkZSBhbiBlbGVtZW50LCB0ZXh0bm9kZSwgb3IgY29tbWVudFxuICpcbiAqIE5vdGU6IG5vZGVXYWxrQWxsIHdpdGggaGFzVGV4dFZhbHVlIG1heSByZXR1cm4gYW4gdGV4dG5vZGUgYW5kIGl0cyBwYXJlbnQgaWZcbiAqIHRoZSB0ZXh0bm9kZSBpcyB0aGUgb25seSBjaGlsZCBpbiB0aGF0IHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gaGFzVGV4dFZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldFRleHRDb250ZW50KG5vZGUpID09PSB2YWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBPUiBhbiBhcnJheSBvZiBwcmVkaWNhdGVzXG4gKi9cbmZ1bmN0aW9uIE9SKC8qIC4uLnJ1bGVzICovKSB7XG4gIHZhciBydWxlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBydWxlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChydWxlc1tpXShub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG4vKipcbiAqIEFORCBhbiBhcnJheSBvZiBwcmVkaWNhdGVzXG4gKi9cbmZ1bmN0aW9uIEFORCgvKiAuLi5ydWxlcyAqLykge1xuICB2YXIgcnVsZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgcnVsZXNbaV0gPSBhcmd1bWVudHNbaV07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXJ1bGVzW2ldKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogbmVnYXRlIGFuIGluZGl2aWR1YWwgcHJlZGljYXRlLCBvciBhIGdyb3VwIHdpdGggQU5EIG9yIE9SXG4gKi9cbmZ1bmN0aW9uIE5PVChwcmVkaWNhdGVGbikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiAhcHJlZGljYXRlRm4obm9kZSk7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IG1hdGNoZXMgYW55IG5vZGUgd2l0aCBhIHBhcmVudCBtYXRjaGluZyBgcHJlZGljYXRlRm5gLlxuICovXG5mdW5jdGlvbiBwYXJlbnRNYXRjaGVzKHByZWRpY2F0ZUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB3aGlsZShwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByZWRpY2F0ZUZuKHBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBoYXNBdHRyKGF0dHIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0QXR0cmlidXRlSW5kZXgobm9kZSwgYXR0cikgPiAtMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGFzQXR0clZhbHVlKGF0dHIsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShub2RlLCBhdHRyKSA9PT0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCc7XG59XG5cbmZ1bmN0aW9uIGlzRG9jdW1lbnRGcmFnbWVudChub2RlKSB7XG4gIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnI2RvY3VtZW50LWZyYWdtZW50Jztcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IG5vZGUudGFnTmFtZTtcbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnI3RleHQnO1xufVxuXG5mdW5jdGlvbiBpc0NvbW1lbnROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICcjY29tbWVudCc7XG59XG5cbi8qKlxuICogQXBwbGllcyBgbWFwZm5gIHRvIGBub2RlYCBhbmQgdGhlIHRyZWUgYmVsb3cgYG5vZGVgLCByZXR1cm5pbmcgYSBmbGF0dGVuZWRcbiAqIGxpc3Qgb2YgcmVzdWx0cy5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiB0cmVlTWFwKG5vZGUsIG1hcGZuKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIG5vZGVXYWxrKG5vZGUsIGZ1bmN0aW9uKG5vZGUpe1xuICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChtYXBmbihub2RlKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogV2FsayB0aGUgdHJlZSBkb3duIGZyb20gYG5vZGVgLCBhcHBseWluZyB0aGUgYHByZWRpY2F0ZWAgZnVuY3Rpb24uXG4gKiBSZXR1cm4gdGhlIGZpcnN0IG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gKlxuICogQHJldHVybnMge05vZGV9IGBudWxsYCBpZiBubyBub2RlIG1hdGNoZXMsIHBhcnNlNSBub2RlIG9iamVjdCBpZiBhIG5vZGVcbiAqIG1hdGNoZXNcbiAqL1xuZnVuY3Rpb24gbm9kZVdhbGsobm9kZSwgcHJlZGljYXRlKSB7XG4gIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICB2YXIgbWF0Y2ggPSBudWxsO1xuICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdGNoID0gbm9kZVdhbGsobm9kZS5jaGlsZE5vZGVzW2ldLCBwcmVkaWNhdGUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0Y2g7XG59XG5cbi8qKlxuICogV2FsayB0aGUgdHJlZSBkb3duIGZyb20gYG5vZGVgLCBhcHBseWluZyB0aGUgYHByZWRpY2F0ZWAgZnVuY3Rpb24uXG4gKiBBbGwgbm9kZXMgbWF0Y2hpbmcgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiBmcm9tIGBub2RlYCB0byBsZWF2ZXMgd2lsbCBiZVxuICogcmV0dXJuZWQuXG4gKlxuICogQHJldHVybnMge0FycmF5W05vZGVdfVxuICovXG5mdW5jdGlvbiBub2RlV2Fsa0FsbChub2RlLCBwcmVkaWNhdGUsIG1hdGNoZXMpIHtcbiAgaWYgKCFtYXRjaGVzKSB7XG4gICAgbWF0Y2hlcyA9IFtdO1xuICB9XG4gIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICBtYXRjaGVzLnB1c2gobm9kZSk7XG4gIH1cbiAgaWYgKG5vZGUuY2hpbGROb2Rlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlV2Fsa0FsbChub2RlLmNoaWxkTm9kZXNbaV0sIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBfcmV2ZXJzZU5vZGVXYWxrQWxsKG5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcykge1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICBtYXRjaGVzID0gW107XG4gIH1cbiAgaWYgKG5vZGUuY2hpbGROb2Rlcykge1xuICAgIGZvciAodmFyIGkgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIG5vZGVXYWxrQWxsKG5vZGUuY2hpbGROb2Rlc1tpXSwgcHJlZGljYXRlLCBtYXRjaGVzKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgIG1hdGNoZXMucHVzaChub2RlKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIGBub2RlV2Fsa2AsIGJ1dCBvbmx5IHJldHVybnMgbm9kZXMgdGhhdCBhcmUgZWl0aGVyXG4gKiBhbmNlc3RvcnMgb3IgZWFybGllciBjb3VzaW5zL3NpYmxpbmdzIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBOb2RlcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSBkb2N1bWVudCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUgc2libGluZ1xuICogcHJpb3IgdG8gYG5vZGVgLlxuICovXG5mdW5jdGlvbiBub2RlV2Fsa1ByaW9yKG5vZGUsIHByZWRpY2F0ZSkge1xuICAvLyBTZWFyY2ggb3VyIGVhcmxpZXIgc2libGluZ3MgYW5kIHRoZWlyIGRlc2NlbmRlbnRzLlxuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSB7XG4gICAgdmFyIGlkeCA9IHBhcmVudC5jaGlsZE5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgdmFyIHNpYmxpbmdzID0gcGFyZW50LmNoaWxkTm9kZXMuc2xpY2UoMCwgaWR4KTtcbiAgICBmb3IgKHZhciBpID0gc2libGluZ3MubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgc2libGluZyA9IHNpYmxpbmdzW2ldO1xuICAgICAgaWYgKHByZWRpY2F0ZShzaWJsaW5nKSkge1xuICAgICAgICByZXR1cm4gc2libGluZztcbiAgICAgIH1cbiAgICAgIHZhciBmb3VuZCA9IG5vZGVXYWxrUHJpb3Ioc2libGluZywgcHJlZGljYXRlKTtcbiAgICB9XG4gICAgaWYgKHByZWRpY2F0ZShwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZVdhbGtQcmlvcihwYXJlbnQsIHByZWRpY2F0ZSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIGBub2RlV2Fsa0FsbGAsIGJ1dCBvbmx5IHJldHVybnMgbm9kZXMgdGhhdCBhcmUgZWl0aGVyXG4gKiBhbmNlc3RvcnMgb3IgZWFybGllciBjb3VzaW5zL3NpYmxpbmdzIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBOb2RlcyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBkb2N1bWVudCBvcmRlciwgc3RhcnRpbmcgZnJvbSBgbm9kZWAuXG4gKi9cbmZ1bmN0aW9uIG5vZGVXYWxrQWxsUHJpb3Iobm9kZSwgcHJlZGljYXRlLCBtYXRjaGVzKSB7XG4gIGlmICghbWF0Y2hlcykge1xuICAgIG1hdGNoZXMgPSBbXTtcbiAgfVxuICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgbWF0Y2hlcy5wdXNoKG5vZGUpO1xuICB9XG4gIC8vIFNlYXJjaCBvdXIgZWFybGllciBzaWJsaW5ncyBhbmQgdGhlaXIgZGVzY2VuZGVudHMuXG4gIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHtcbiAgICB2YXIgaWR4ID0gcGFyZW50LmNoaWxkTm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICB2YXIgc2libGluZ3MgPSBwYXJlbnQuY2hpbGROb2Rlcy5zbGljZSgwLCBpZHgpO1xuICAgIGZvciAodmFyIGkgPSBzaWJsaW5ncy5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIF9yZXZlcnNlTm9kZVdhbGtBbGwoc2libGluZ3NbaV0sIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgfVxuICAgIG5vZGVXYWxrQWxsUHJpb3IocGFyZW50LCBwcmVkaWNhdGUsIG1hdGNoZXMpO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gYG5vZGVXYWxrYCwgYnV0IG9ubHkgbWF0Y2hlcyBlbGVtZW50c1xuICpcbiAqIEByZXR1cm5zIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBxdWVyeShub2RlLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGVsZW1lbnRQcmVkaWNhdGUgPSBBTkQoaXNFbGVtZW50LCBwcmVkaWNhdGUpO1xuICByZXR1cm4gbm9kZVdhbGsobm9kZSwgZWxlbWVudFByZWRpY2F0ZSk7XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBgbm9kZVdhbGtBbGxgLCBidXQgb25seSBtYXRjaGVzIGVsZW1lbnRzXG4gKlxuICogQHJldHVybiB7QXJyYXlbRWxlbWVudF19XG4gKi9cbmZ1bmN0aW9uIHF1ZXJ5QWxsKG5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcykge1xuICB2YXIgZWxlbWVudFByZWRpY2F0ZSA9IEFORChpc0VsZW1lbnQsIHByZWRpY2F0ZSk7XG4gIHJldHVybiBub2RlV2Fsa0FsbChub2RlLCBlbGVtZW50UHJlZGljYXRlLCBtYXRjaGVzKTtcbn1cblxuZnVuY3Rpb24gbmV3VGV4dE5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBub2RlTmFtZTogJyN0ZXh0JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgcGFyZW50Tm9kZTogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXdDb21tZW50Tm9kZShjb21tZW50KSB7XG4gIHJldHVybiB7XG4gICAgbm9kZU5hbWU6ICcjY29tbWVudCcsXG4gICAgZGF0YTogY29tbWVudCxcbiAgICBwYXJlbnROb2RlOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5ld0VsZW1lbnQodGFnTmFtZSwgbmFtZXNwYWNlKSB7XG4gIHJldHVybiB7XG4gICAgbm9kZU5hbWU6IHRhZ05hbWUsXG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICBuYW1lc3BhY2VVUkk6IG5hbWVzcGFjZSB8fCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsXG4gICAgYXR0cnM6IFtdLFxuICAgIHBhcmVudE5vZGU6IG51bGwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5ld0RvY3VtZW50RnJhZ21lbnQoKSB7XG4gIHJldHVybiB7XG4gICAgbm9kZU5hbWU6ICcjZG9jdW1lbnQtZnJhZ21lbnQnLFxuICAgIGNoaWxkTm9kZXM6IFtdLFxuICAgIHBhcmVudE5vZGU6IG51bGwsXG4gICAgcXVpcmtzTW9kZTogZmFsc2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsb25lTm9kZShub2RlKSB7XG4gIC8vIHBhcmVudCBpcyBhIGJhY2tyZWZlcmVuY2UsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNsb25lIHRoZSB3aG9sZSB0cmVlLCBzb1xuICAvLyBtYWtlIGl0IG51bGwgYmVmb3JlIGNsb25pbmcuXG4gIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gIG5vZGUucGFyZW50Tm9kZSA9IG51bGw7XG4gIHZhciBjbG9uZSA9IGNsb25lT2JqZWN0KG5vZGUpO1xuICBub2RlLnBhcmVudE5vZGUgPSBwYXJlbnQ7XG4gIHJldHVybiBjbG9uZTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBuZXdOb2RlYCBpbnRvIGBwYXJlbnRgIGF0IGBpbmRleGAsIG9wdGlvbmFsbHkgcmVwbGFjZWluZyB0aGVcbiAqIGN1cnJlbnQgbm9kZSBhdCBgaW5kZXhgLiBJZiBgbmV3Tm9kZWAgaXMgYSBEb2N1bWVudEZyYWdtZW50LCBpdHMgY2hpbGROb2Rlc1xuICogYXJlIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIGZyYWdtZW50LlxuICovXG5mdW5jdGlvbiBpbnNlcnROb2RlKHBhcmVudCwgaW5kZXgsIG5ld05vZGUsIHJlcGxhY2UpIHtcbiAgdmFyIG5ld05vZGVzID0gW107XG4gIHZhciByZW1vdmVkTm9kZSA9IHJlcGxhY2UgPyBwYXJlbnQuY2hpbGROb2Rlc1tpbmRleF0gOiBudWxsO1xuXG4gIGlmIChuZXdOb2RlKSB7XG4gICAgaWYgKGlzRG9jdW1lbnRGcmFnbWVudChuZXdOb2RlKSkge1xuICAgICAgbmV3Tm9kZXMgPSBuZXdOb2RlLmNoaWxkTm9kZXM7XG4gICAgICBuZXdOb2RlLmNoaWxkTm9kZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Tm9kZXMgPSBbbmV3Tm9kZV07XG4gICAgICByZW1vdmUobmV3Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlcGxhY2UpIHtcbiAgICByZW1vdmVkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2luZGV4XTtcbiAgfVxuXG4gIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkocGFyZW50LmNoaWxkTm9kZXMsXG4gICAgICBbaW5kZXgsIHJlcGxhY2UgPyAxIDogMF0uY29uY2F0KG5ld05vZGVzKSk7XG5cbiAgbmV3Tm9kZXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgbi5wYXJlbnROb2RlID0gcGFyZW50O1xuICB9KTtcblxuICBpZiAocmVtb3ZlZE5vZGUpIHtcbiAgICByZW1vdmVkTm9kZS5wYXJlbnROb2RlID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlKG9sZE5vZGUsIG5ld05vZGUpIHtcbiAgdmFyIHBhcmVudCA9IG9sZE5vZGUucGFyZW50Tm9kZTtcbiAgdmFyIGluZGV4ID0gcGFyZW50LmNoaWxkTm9kZXMuaW5kZXhPZihvbGROb2RlKTtcbiAgaW5zZXJ0Tm9kZShwYXJlbnQsIGluZGV4LCBuZXdOb2RlLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkge1xuICAgIHZhciBpZHggPSBwYXJlbnQuY2hpbGROb2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgIHBhcmVudC5jaGlsZE5vZGVzLnNwbGljZShpZHgsIDEpO1xuICB9XG4gIG5vZGUucGFyZW50Tm9kZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnQsIG9sZE5vZGUsIG5ld05vZGUpIHtcbiAgdmFyIGluZGV4ID0gcGFyZW50LmNoaWxkTm9kZXMuaW5kZXhPZihvbGROb2RlKTtcbiAgaW5zZXJ0Tm9kZShwYXJlbnQsIGluZGV4LCBuZXdOb2RlKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHBhcmVudCwgbmV3Tm9kZSkge1xuICBpbnNlcnROb2RlKHBhcmVudCwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoLCBuZXdOb2RlKTtcbn1cblxudmFyIHBhcnNlNSA9IHJlcXVpcmUoJ3BhcnNlNScpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgb3B0aW9ucykge1xuICB2YXIgcGFyc2VyID0gbmV3IHBhcnNlNS5QYXJzZXIocGFyc2U1LlRyZWVBZGFwdGVycy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgcmV0dXJuIHBhcnNlci5wYXJzZSh0ZXh0KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcmFnbWVudCh0ZXh0KSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgcGFyc2U1LlBhcnNlcigpO1xuICByZXR1cm4gcGFyc2VyLnBhcnNlRnJhZ21lbnQodGV4dCk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZShhc3QpIHtcbiAgdmFyIHNlcmlhbGl6ZXIgPSBuZXcgcGFyc2U1LlNlcmlhbGl6ZXIoKTtcbiAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFzdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRBdHRyaWJ1dGU6IGdldEF0dHJpYnV0ZSxcbiAgaGFzQXR0cmlidXRlOiBoYXNBdHRyaWJ1dGUsXG4gIHNldEF0dHJpYnV0ZTogc2V0QXR0cmlidXRlLFxuICByZW1vdmVBdHRyaWJ1dGU6IHJlbW92ZUF0dHJpYnV0ZSxcbiAgZ2V0VGV4dENvbnRlbnQ6IGdldFRleHRDb250ZW50LFxuICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gIHJlbW92ZTogcmVtb3ZlLFxuICByZXBsYWNlOiByZXBsYWNlLFxuICBhcHBlbmQ6IGFwcGVuZCxcbiAgY2xvbmVOb2RlOiBjbG9uZU5vZGUsXG4gIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZSxcbiAgaXNEb2N1bWVudDogaXNEb2N1bWVudCxcbiAgaXNEb2N1bWVudEZyYWdtZW50OiBpc0RvY3VtZW50RnJhZ21lbnQsXG4gIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICBpc1RleHROb2RlOiBpc1RleHROb2RlLFxuICBpc0NvbW1lbnROb2RlOiBpc0NvbW1lbnROb2RlLFxuICBxdWVyeTogcXVlcnksXG4gIHF1ZXJ5QWxsOiBxdWVyeUFsbCxcbiAgbm9kZVdhbGs6IG5vZGVXYWxrLFxuICBub2RlV2Fsa0FsbDogbm9kZVdhbGtBbGwsXG4gIG5vZGVXYWxrUHJpb3I6IG5vZGVXYWxrUHJpb3IsXG4gIG5vZGVXYWxrQWxsUHJpb3I6IG5vZGVXYWxrQWxsUHJpb3IsXG4gIHRyZWVNYXA6IHRyZWVNYXAsXG4gIHByZWRpY2F0ZXM6IHtcbiAgICBoYXNDbGFzczogaGFzQ2xhc3MsXG4gICAgaGFzQXR0cjogaGFzQXR0cixcbiAgICBoYXNBdHRyVmFsdWU6IGhhc0F0dHJWYWx1ZSxcbiAgICBoYXNNYXRjaGluZ1RhZ05hbWU6IGhhc01hdGNoaW5nVGFnTmFtZSxcbiAgICBoYXNUYWdOYW1lOiBoYXNUYWdOYW1lLFxuICAgIGhhc1RleHRWYWx1ZTogaGFzVGV4dFZhbHVlLFxuICAgIEFORDogQU5ELFxuICAgIE9SOiBPUixcbiAgICBOT1Q6IE5PVCxcbiAgICBwYXJlbnRNYXRjaGVzOiBwYXJlbnRNYXRjaGVzLFxuICB9LFxuICBjb25zdHJ1Y3RvcnM6IHtcbiAgICB0ZXh0OiBuZXdUZXh0Tm9kZSxcbiAgICBjb21tZW50OiBuZXdDb21tZW50Tm9kZSxcbiAgICBlbGVtZW50OiBuZXdFbGVtZW50LFxuICAgIGZyYWdtZW50OiBuZXdEb2N1bWVudEZyYWdtZW50LFxuICB9LFxuICBwYXJzZTogcGFyc2UsXG4gIHBhcnNlRnJhZ21lbnQ6IHBhcnNlRnJhZ21lbnQsXG4gIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE1IEluZ3ZhciBTdGVwYW55YW4gPG1lQHJyZXZlcnNlci5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBJdmFuIE5pa3VsaW4gPGlmYWFhbkBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1pY2hhZWwgRmljYXJyYSA8ZXNjb2RlZ2VuLmNvcHlyaWdodEBtaWNoYWVsLmZpY2FycmEubWU+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1hdGhpYXMgQnluZW5zIDxtYXRoaWFzQHFpd2kuYmU+XG4gIENvcHlyaWdodCAoQykgMjAxMyBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iZXJ0IEd1c3QtQmFyZG9uIDxkb25hdGVAcm9iZXJ0Lmd1c3QtYmFyZG9uLm9yZz5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEpvaG4gRnJlZW1hbiA8amZyZWVtYW4wOEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgSm9vc3QtV2ltIEJvZWtlc3RlaWpuIDxqb29zdC13aW1AYm9la2VzdGVpam4ubmw+XG4gIENvcHlyaWdodCAoQykgMjAxMiBLcmlzIEtvd2FsIDxrcmlzLmtvd2FsQGNpeGFyLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFycGFkIEJvcnNvcyA8YXJwYWQuYm9yc29zQGdvb2dsZW1haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSwgcmVxdWlyZTp0cnVlLCBnbG9iYWw6dHJ1ZSovXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIFByZWNlZGVuY2UsXG4gICAgICAgIEJpbmFyeVByZWNlZGVuY2UsXG4gICAgICAgIFNvdXJjZU5vZGUsXG4gICAgICAgIGVzdHJhdmVyc2UsXG4gICAgICAgIGVzdXRpbHMsXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIGJhc2UsXG4gICAgICAgIGluZGVudCxcbiAgICAgICAganNvbixcbiAgICAgICAgcmVudW1iZXIsXG4gICAgICAgIGhleGFkZWNpbWFsLFxuICAgICAgICBxdW90ZXMsXG4gICAgICAgIGVzY2FwZWxlc3MsXG4gICAgICAgIG5ld2xpbmUsXG4gICAgICAgIHNwYWNlLFxuICAgICAgICBwYXJlbnRoZXNlcyxcbiAgICAgICAgc2VtaWNvbG9ucyxcbiAgICAgICAgc2FmZUNvbmNhdGVuYXRpb24sXG4gICAgICAgIGRpcmVjdGl2ZSxcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIHBhcnNlLFxuICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIHNvdXJjZUNvZGUsXG4gICAgICAgIHByZXNlcnZlQmxhbmtMaW5lcyxcbiAgICAgICAgRk9STUFUX01JTklGWSxcbiAgICAgICAgRk9STUFUX0RFRkFVTFRTO1xuXG4gICAgZXN0cmF2ZXJzZSA9IHJlcXVpcmUoJ2VzdHJhdmVyc2UnKTtcbiAgICBlc3V0aWxzID0gcmVxdWlyZSgnZXN1dGlscycpO1xuXG4gICAgU3ludGF4ID0gZXN0cmF2ZXJzZS5TeW50YXg7XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVFeHByZXNzaW9uLlxuICAgIGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24uaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVTdGF0ZW1lbnQuXG4gICAgZnVuY3Rpb24gaXNTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBQcmVjZWRlbmNlID0ge1xuICAgICAgICBTZXF1ZW5jZTogMCxcbiAgICAgICAgWWllbGQ6IDEsXG4gICAgICAgIEF3YWl0OiAxLFxuICAgICAgICBBc3NpZ25tZW50OiAxLFxuICAgICAgICBDb25kaXRpb25hbDogMixcbiAgICAgICAgQXJyb3dGdW5jdGlvbjogMixcbiAgICAgICAgTG9naWNhbE9SOiAzLFxuICAgICAgICBMb2dpY2FsQU5EOiA0LFxuICAgICAgICBCaXR3aXNlT1I6IDUsXG4gICAgICAgIEJpdHdpc2VYT1I6IDYsXG4gICAgICAgIEJpdHdpc2VBTkQ6IDcsXG4gICAgICAgIEVxdWFsaXR5OiA4LFxuICAgICAgICBSZWxhdGlvbmFsOiA5LFxuICAgICAgICBCaXR3aXNlU0hJRlQ6IDEwLFxuICAgICAgICBBZGRpdGl2ZTogMTEsXG4gICAgICAgIE11bHRpcGxpY2F0aXZlOiAxMixcbiAgICAgICAgVW5hcnk6IDEzLFxuICAgICAgICBQb3N0Zml4OiAxNCxcbiAgICAgICAgQ2FsbDogMTUsXG4gICAgICAgIE5ldzogMTYsXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlOiAxNyxcbiAgICAgICAgTWVtYmVyOiAxOCxcbiAgICAgICAgUHJpbWFyeTogMTlcbiAgICB9O1xuXG4gICAgQmluYXJ5UHJlY2VkZW5jZSA9IHtcbiAgICAgICAgJ3x8JzogUHJlY2VkZW5jZS5Mb2dpY2FsT1IsXG4gICAgICAgICcmJic6IFByZWNlZGVuY2UuTG9naWNhbEFORCxcbiAgICAgICAgJ3wnOiBQcmVjZWRlbmNlLkJpdHdpc2VPUixcbiAgICAgICAgJ14nOiBQcmVjZWRlbmNlLkJpdHdpc2VYT1IsXG4gICAgICAgICcmJzogUHJlY2VkZW5jZS5CaXR3aXNlQU5ELFxuICAgICAgICAnPT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnIT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnPT09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJyE9PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpcyc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpc250JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJzwnOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPD0nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+PSc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJ2luJzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnaW5zdGFuY2VvZic6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJzw8JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICc+Pic6IFByZWNlZGVuY2UuQml0d2lzZVNISUZULFxuICAgICAgICAnPj4+JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICcrJzogUHJlY2VkZW5jZS5BZGRpdGl2ZSxcbiAgICAgICAgJy0nOiBQcmVjZWRlbmNlLkFkZGl0aXZlLFxuICAgICAgICAnKic6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICclJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZSxcbiAgICAgICAgJy8nOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlXG4gICAgfTtcblxuICAgIC8vRmxhZ3NcbiAgICB2YXIgRl9BTExPV19JTiA9IDEsXG4gICAgICAgIEZfQUxMT1dfQ0FMTCA9IDEgPDwgMSxcbiAgICAgICAgRl9BTExPV19VTlBBUkFUSF9ORVcgPSAxIDw8IDIsXG4gICAgICAgIEZfRlVOQ19CT0RZID0gMSA8PCAzLFxuICAgICAgICBGX0RJUkVDVElWRV9DVFggPSAxIDw8IDQsXG4gICAgICAgIEZfU0VNSUNPTE9OX09QVCA9IDEgPDwgNTtcblxuICAgIC8vRXhwcmVzc2lvbiBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfQUxMT1dfQ0FMTFxuICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXXG4gICAgdmFyIEVfRlRUID0gRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVFRGID0gRl9BTExPV19JTiB8IEZfQUxMT1dfQ0FMTCxcbiAgICAgICAgRV9UVFQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVEZGID0gRl9BTExPV19JTixcbiAgICAgICAgRV9GRlQgPSBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9URlQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19VTlBBUkFUSF9ORVc7XG5cbiAgICAvL1N0YXRlbWVudCBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfRlVOQ19CT0RZXG4gICAgLy8gRl9ESVJFQ1RJVkVfQ1RYXG4gICAgLy8gRl9TRU1JQ09MT05fT1BUXG4gICAgdmFyIFNfVEZGRiA9IEZfQUxMT1dfSU4sXG4gICAgICAgIFNfVEZGVCA9IEZfQUxMT1dfSU4gfCBGX1NFTUlDT0xPTl9PUFQsXG4gICAgICAgIFNfRkZGRiA9IDB4MDAsXG4gICAgICAgIFNfVEZURiA9IEZfQUxMT1dfSU4gfCBGX0RJUkVDVElWRV9DVFgsXG4gICAgICAgIFNfVFRGRiA9IEZfQUxMT1dfSU4gfCBGX0ZVTkNfQk9EWTtcblxuICAgIGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICAgICAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGVudDogbnVsbCxcbiAgICAgICAgICAgIGJhc2U6IG51bGwsXG4gICAgICAgICAgICBwYXJzZTogbnVsbCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgaW5kZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnICAgICcsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdE11bHRpbGluZUNvbW1lbnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiAnXFxuJyxcbiAgICAgICAgICAgICAgICBzcGFjZTogJyAnLFxuICAgICAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlbnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoZXhhZGVjaW1hbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcXVvdGVzOiAnc2luZ2xlJyxcbiAgICAgICAgICAgICAgICBlc2NhcGVsZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb21wYWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRoZXNlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW1pY29sb25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNhZmVDb25jYXRlbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXM6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW96OiB7XG4gICAgICAgICAgICAgICAgY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3Rhcmxlc3NHZW5lcmF0b3I6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc291cmNlTWFwOiBudWxsLFxuICAgICAgICAgICAgc291cmNlTWFwUm9vdDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZU1hcFdpdGhDb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICByYXc6IHRydWUsXG4gICAgICAgICAgICB2ZXJiYXRpbTogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdSZXBlYXQoc3RyLCBudW0pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgIGZvciAobnVtIHw9IDA7IG51bSA+IDA7IG51bSA+Pj49IDEsIHN0ciArPSBzdHIpIHtcbiAgICAgICAgICAgIGlmIChudW0gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgaWYgKCFpc0FycmF5KSB7XG4gICAgICAgIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNMaW5lVGVybWluYXRvcihzdHIpIHtcbiAgICAgICAgcmV0dXJuICgvW1xcclxcbl0vZykudGVzdChzdHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZHNXaXRoTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbGVuICYmIGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHN0ci5jaGFyQ29kZUF0KGxlbiAtIDEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gb3ZlcnJpZGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZXBseSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXksIHZhbDtcblxuICAgICAgICBmdW5jdGlvbiBpc0hhc2hPYmplY3QodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0IGluc3RhbmNlb2YgT2JqZWN0ICYmICEodGFyZ2V0IGluc3RhbmNlb2YgUmVnRXhwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzSGFzaE9iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWVwbHkodGFyZ2V0W2tleV0sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHVwZGF0ZURlZXBseSh7fSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHBvaW50LCB0ZW1wLCBleHBvbmVudCwgcG9zO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVtZXJpYyBsaXRlcmFsIHdob3NlIHZhbHVlIGlzIE5hTicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSAxIC8gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGpzb24gPyAnbnVsbCcgOiByZW51bWJlciA/ICcxZTQwMCcgOiAnMWUrNDAwJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9ICcnICsgdmFsdWU7XG4gICAgICAgIGlmICghcmVudW1iZXIgfHwgcmVzdWx0Lmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBwb2ludCA9IHJlc3VsdC5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmICghanNvbiAmJiByZXN1bHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzMCAgLyogMCAqLyAmJiBwb2ludCA9PT0gMSkge1xuICAgICAgICAgICAgcG9pbnQgPSAwO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXAgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCdlKycsICdlJyk7XG4gICAgICAgIGV4cG9uZW50ID0gMDtcbiAgICAgICAgaWYgKChwb3MgPSB0ZW1wLmluZGV4T2YoJ2UnKSkgPiAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCA9ICt0ZW1wLnNsaWNlKHBvcyArIDEpO1xuICAgICAgICAgICAgdGVtcCA9IHRlbXAuc2xpY2UoMCwgcG9zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnQgPj0gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgLT0gdGVtcC5sZW5ndGggLSBwb2ludCAtIDE7XG4gICAgICAgICAgICB0ZW1wID0gKyh0ZW1wLnNsaWNlKDAsIHBvaW50KSArIHRlbXAuc2xpY2UocG9pbnQgKyAxKSkgKyAnJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSAwO1xuICAgICAgICB3aGlsZSAodGVtcC5jaGFyQ29kZUF0KHRlbXAubGVuZ3RoICsgcG9zIC0gMSkgPT09IDB4MzAgIC8qIDAgKi8pIHtcbiAgICAgICAgICAgIC0tcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgIT09IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHBvcztcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9uZW50ICE9PSAwKSB7XG4gICAgICAgICAgICB0ZW1wICs9ICdlJyArIGV4cG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICgodGVtcC5sZW5ndGggPCByZXN1bHQubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIChoZXhhZGVjaW1hbCAmJiB2YWx1ZSA+IDFlMTIgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlICYmICh0ZW1wID0gJzB4JyArIHZhbHVlLnRvU3RyaW5nKDE2KSkubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCkpICYmXG4gICAgICAgICAgICAgICAgK3RlbXAgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YWxpZCBSZWdFeHAgZXhwcmVzc2lvbi5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9Db25zdGVsbGF0aW9uL2l2IEVuZ2luZVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgIC8vIG5vdCBoYW5kbGluZyAnXFwnIGFuZCBoYW5kbGluZyBcXHUyMDI4IG9yIFxcdTIwMjkgdG8gdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VcbiAgICAgICAgaWYgKChjaCAmIH4xKSA9PT0gMHgyMDI4KSB7XG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAndScgOiAnXFxcXHUnKSArICgoY2ggPT09IDB4MjAyOCkgPyAnMjAyOCcgOiAnMjAyOScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAxMCB8fCBjaCA9PT0gMTMpIHsgIC8vIFxcbiwgXFxyXG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAnJyA6ICdcXFxcJykgKyAoKGNoID09PSAxMCkgPyAnbicgOiAncicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJlZ0V4cChyZWcpIHtcbiAgICAgICAgdmFyIG1hdGNoLCByZXN1bHQsIGZsYWdzLCBpLCBpeiwgY2gsIGNoYXJhY3RlckluQnJhY2ssIHByZXZpb3VzSXNCYWNrc2xhc2g7XG5cbiAgICAgICAgcmVzdWx0ID0gcmVnLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKHJlZy5zb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgZmxhZyBmcm9tIHRvU3RyaW5nIHJlc3VsdFxuICAgICAgICAgICAgbWF0Y2ggPSByZXN1bHQubWF0Y2goL1xcLyhbXi9dKikkLyk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxhZ3MgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHJlZy5zb3VyY2UubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGNoID0gcmVnLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJJbkJyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDkzKSB7ICAvLyBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA0NykgeyAgLy8gL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSA5MSkgeyAgLy8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gY2ggPT09IDkyOyAgLy8gXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBuZXcgUmVnRXhwKFwiXFxcXFxcbicpIGlzIHByb3ZpZGVkLCBjcmVhdGUgL1xcbi9cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlrZSAvXFxcXFsvXS9cbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICcvJyArIHJlc3VsdCArICcvJyArIGZsYWdzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIG5leHQpIHtcbiAgICAgICAgdmFyIGhleDtcblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwOCAgLyogXFxiICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxiJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBDICAvKiBcXGYgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXGYnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDkgIC8qIFxcdCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdCc7XG4gICAgICAgIH1cblxuICAgICAgICBoZXggPSBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoanNvbiB8fCBjb2RlID4gMHhGRikge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdScgKyAnMDAwMCcuc2xpY2UoaGV4Lmxlbmd0aCkgKyBoZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgwMDAwICYmICFlc3V0aWxzLmNvZGUuaXNEZWNpbWFsRGlnaXQobmV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXDAnO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwQiAgLyogXFx2ICovKSB7IC8vICdcXHYnXG4gICAgICAgICAgICByZXR1cm4gJ1xcXFx4MEInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceCcgKyAnMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlRGlzYWxsb3dlZENoYXJhY3Rlcihjb2RlKSB7XG4gICAgICAgIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQSAgLyogXFxuICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBEICAvKiBcXHIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHInO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjgnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOSkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjknO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3RseSBjbGFzc2lmaWVkIGNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpcmVjdGl2ZShzdHIpIHtcbiAgICAgICAgdmFyIGksIGl6LCBjb2RlLCBxdW90ZTtcblxuICAgICAgICBxdW90ZSA9IHF1b3RlcyA9PT0gJ2RvdWJsZScgPyAnXCInIDogJ1xcJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgcXVvdGUgPSAnXCInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1xcJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1b3RlICsgc3RyICsgcXVvdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJycsIGksIGxlbiwgY29kZSwgc2luZ2xlUXVvdGVzID0gMCwgZG91YmxlUXVvdGVzID0gMCwgc2luZ2xlLCBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgKytzaW5nbGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovKSB7XG4gICAgICAgICAgICAgICAgKytkb3VibGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MkYgIC8qIC8gKi8gJiYganNvbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpIHx8IGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShjb2RlKSAmJiAoanNvbiAmJiBjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgIWpzb24gJiYgIWVzY2FwZWxlc3MgJiYgKGNvZGUgPCAweDIwICAvKiBTUCAqLyB8fCBjb2RlID4gMHg3RSAgLyogfiAqLykpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZUFsbG93ZWRDaGFyYWN0ZXIoY29kZSwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2luZ2xlID0gIShxdW90ZXMgPT09ICdkb3VibGUnIHx8IChxdW90ZXMgPT09ICdhdXRvJyAmJiBkb3VibGVRdW90ZXMgPCBzaW5nbGVRdW90ZXMpKTtcbiAgICAgICAgcXVvdGUgPSBzaW5nbGUgPyAnXFwnJyA6ICdcIic7XG5cbiAgICAgICAgaWYgKCEoc2luZ2xlID8gc2luZ2xlUXVvdGVzIDogZG91YmxlUXVvdGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1b3RlICsgcmVzdWx0ICsgcXVvdGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHF1b3RlO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKChjb2RlID09PSAweDI3ICAvKiAnICovICYmIHNpbmdsZSkgfHwgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovICYmICFzaW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXFxcJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIHF1b3RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZsYXR0ZW4gYW4gYXJyYXkgdG8gYSBzdHJpbmcsIHdoZXJlIHRoZSBhcnJheSBjYW4gY29udGFpblxuICAgICAqIGVpdGhlciBzdHJpbmdzIG9yIG5lc3RlZCBhcnJheXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuVG9TdHJpbmcoYXJyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgZWxlbSwgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gYXJyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW0gPSBhcnJbaV07XG4gICAgICAgICAgICByZXN1bHQgKz0gaXNBcnJheShlbGVtKSA/IGZsYXR0ZW5Ub1N0cmluZyhlbGVtKSA6IGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0IGdlbmVyYXRlZCB0byBhIFNvdXJjZU5vZGUgd2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGdlbmVyYXRlZCwgbm9kZSkge1xuICAgICAgICBpZiAoIXNvdXJjZU1hcCkge1xuICAgICAgICAgICAgLy8gd2l0aCBubyBzb3VyY2UgbWFwcywgZ2VuZXJhdGVkIGlzIGVpdGhlciBhblxuICAgICAgICAgICAgLy8gYXJyYXkgb3IgYSBzdHJpbmcuICBpZiBhbiBhcnJheSwgZmxhdHRlbiBpdC5cbiAgICAgICAgICAgIC8vIGlmIGEgc3RyaW5nLCBqdXN0IHJldHVybiBpdFxuICAgICAgICAgICAgaWYgKGlzQXJyYXkoZ2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVG9TdHJpbmcoZ2VuZXJhdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkIGluc3RhbmNlb2YgU291cmNlTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sb2MgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG51bGwsIG51bGwsIHNvdXJjZU1hcCwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG5vZGUubG9jLnN0YXJ0LmxpbmUsIG5vZGUubG9jLnN0YXJ0LmNvbHVtbiwgKHNvdXJjZU1hcCA9PT0gdHJ1ZSA/IG5vZGUubG9jLnNvdXJjZSB8fCBudWxsIDogc291cmNlTWFwKSwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9FbXB0eVNwYWNlKCkge1xuICAgICAgICByZXR1cm4gKHNwYWNlKSA/IHNwYWNlIDogJyAnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpvaW4obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgdmFyIGxlZnRTb3VyY2UsXG4gICAgICAgICAgICByaWdodFNvdXJjZSxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSxcbiAgICAgICAgICAgIHJpZ2h0Q2hhckNvZGU7XG5cbiAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQobGVmdCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGxlZnRTb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3JpZ2h0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJpZ2h0U291cmNlID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyaWdodCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJpZ2h0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxlZnRDaGFyQ29kZSA9IGxlZnRTb3VyY2UuY2hhckNvZGVBdChsZWZ0U291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICByaWdodENoYXJDb2RlID0gcmlnaHRTb3VyY2UuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoKGxlZnRDaGFyQ29kZSA9PT0gMHgyQiAgLyogKyAqLyB8fCBsZWZ0Q2hhckNvZGUgPT09IDB4MkQgIC8qIC0gKi8pICYmIGxlZnRDaGFyQ29kZSA9PT0gcmlnaHRDaGFyQ29kZSB8fFxuICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUobGVmdENoYXJDb2RlKSAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShyaWdodENoYXJDb2RlKSB8fFxuICAgICAgICAgICAgbGVmdENoYXJDb2RlID09PSAweDJGICAvKiAvICovICYmIHJpZ2h0Q2hhckNvZGUgPT09IDB4NjkgIC8qIGkgKi8pIHsgLy8gaW5maXggd29yZCBvcGVyYXRvcnMgYWxsIHN0YXJ0IHdpdGggYGlgXG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIG5vRW1wdHlTcGFjZSgpLCByaWdodF07XG4gICAgICAgIH0gZWxzZSBpZiAoZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShsZWZ0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGxlZnRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgICAgICBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKHJpZ2h0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHJpZ2h0Q2hhckNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIHJpZ2h0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2xlZnQsIHNwYWNlLCByaWdodF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkSW5kZW50KHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIFtiYXNlLCBzdG10XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3aXRoSW5kZW50KGZuKSB7XG4gICAgICAgIHZhciBwcmV2aW91c0Jhc2U7XG4gICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIGJhc2UgKz0gaW5kZW50O1xuICAgICAgICBmbihiYXNlKTtcbiAgICAgICAgYmFzZSA9IHByZXZpb3VzQmFzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjZXMoc3RyKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHN0ci5sZW5ndGggLSAxKSAtIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRqdXN0TXVsdGlsaW5lQ29tbWVudCh2YWx1ZSwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgdmFyIGFycmF5LCBpLCBsZW4sIGxpbmUsIGosIHNwYWNlcywgcHJldmlvdXNCYXNlLCBzbjtcblxuICAgICAgICBhcnJheSA9IHZhbHVlLnNwbGl0KC9cXHJcXG58W1xcclxcbl0vKTtcbiAgICAgICAgc3BhY2VzID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgICAgICAvLyBmaXJzdCBsaW5lIGRvZXNuJ3QgaGF2ZSBpbmRlbnRhdGlvblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgbGluZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxpbmUubGVuZ3RoICYmIGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGluZS5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGFjZXMgPiBqKSB7XG4gICAgICAgICAgICAgICAgc3BhY2VzID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3BlY2lhbEJhc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBwYXR0ZXJuIGxpa2VcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgdmFyIHQgPSAyMDsgIC8qXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGNvbW1lbnRcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgICAgIGlmIChhcnJheVsxXVtzcGFjZXNdID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsQmFzZSArPSAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYXNlID0gc3BlY2lhbEJhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3BhY2VzICYgMSkge1xuICAgICAgICAgICAgICAgIC8vIC8qXG4gICAgICAgICAgICAgICAgLy8gICpcbiAgICAgICAgICAgICAgICAvLyAgKi9cbiAgICAgICAgICAgICAgICAvLyBJZiBzcGFjZXMgYXJlIG9kZCBudW1iZXIsIGFib3ZlIHBhdHRlcm4gaXMgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICAvLyBXZSB3YXN0ZSAxIHNwYWNlLlxuICAgICAgICAgICAgICAgIC0tc3BhY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBzbiA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQoYWRkSW5kZW50KGFycmF5W2ldLnNsaWNlKHNwYWNlcykpKTtcbiAgICAgICAgICAgIGFycmF5W2ldID0gc291cmNlTWFwID8gc24uam9pbignJykgOiBzbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG5cbiAgICAgICAgcmV0dXJuIGFycmF5LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQ29tbWVudChjb21tZW50LCBzcGVjaWFsQmFzZSkge1xuICAgICAgICBpZiAoY29tbWVudC50eXBlID09PSAnTGluZScpIHtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aExpbmVUZXJtaW5hdG9yKGNvbW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNlIExpbmVUZXJtaW5hdG9yXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmEuZm9ybWF0LmluZGVudC5hZGp1c3RNdWx0aWxpbmVDb21tZW50ICYmIC9bXFxuXFxyXS8udGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFkanVzdE11bHRpbGluZUNvbW1lbnQoJy8qJyArIGNvbW1lbnQudmFsdWUgKyAnKi8nLCBzcGVjaWFsQmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDb21tZW50cyhzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGksIGxlbiwgY29tbWVudCwgc2F2ZSwgdGFpbGluZ1RvU3RhdGVtZW50LCBzcGVjaWFsQmFzZSwgZnJhZ21lbnQsXG4gICAgICAgICAgICBleHRSYW5nZSwgcmFuZ2UsIHByZXZSYW5nZSwgcHJlZml4LCBpbmZpeCwgc3VmZml4LCBjb3VudDtcblxuICAgICAgICBpZiAoc3RtdC5sZWFkaW5nQ29tbWVudHMgJiYgc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2F2ZSA9IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgICAgIGV4dFJhbmdlID0gY29tbWVudC5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgIHByZWZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKGV4dFJhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAocHJlZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldlJhbmdlID0gcmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgICAgICBpbmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHByZXZSYW5nZVsxXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IChpbmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHJhbmdlWzFdLCBleHRSYW5nZVsxXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAoc3VmZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoc2FmZUNvbmNhdGVuYXRpb24gJiYgc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiBzdG10LmJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW2dlbmVyYXRlQ29tbWVudChjb21tZW50KV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGZyYWdtZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoc2F2ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0bXQudHJhaWxpbmdDb21tZW50cykge1xuXG4gICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQudHJhaWxpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWlsaW5nVG9TdGF0ZW1lbnQgPSAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgPSBzdHJpbmdSZXBlYXQoJyAnLCBjYWxjdWxhdGVTcGFjZXModG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChbYmFzZSwgcmVzdWx0LCBpbmRlbnRdKS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWlsaW5nVG9TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0YXJnZXQgbGlrZSBmb2xsb3dpbmcgc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHQgPSAyMDsgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqIFRoaXMgaXMgY29tbWVudCBvZiB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBpbmRlbnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBzcGVjaWFsQmFzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsIGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gbGVuIC0gMSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsICdcXG4nXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVCbGFua0xpbmVzKHN0YXJ0LCBlbmQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgaiwgbmV3bGluZUNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29kZVtqXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICBuZXdsaW5lQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDE7IGogPCBuZXdsaW5lQ291bnQ7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJlbnRoZXNpemUodGV4dCwgY3VycmVudCwgc2hvdWxkKSB7XG4gICAgICAgIGlmIChjdXJyZW50IDwgc2hvdWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gWycoJywgdGV4dCwgJyknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHN0cmluZykge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gc3RyaW5nLnNwbGl0KC9cXHJcXG58XFxuLyk7XG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGl6OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ld2xpbmUgKyBiYXNlICsgcmVzdWx0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKSB7XG4gICAgICAgIHZhciB2ZXJiYXRpbSwgcmVzdWx0LCBwcmVjO1xuICAgICAgICB2ZXJiYXRpbSA9IGV4cHJbZXh0cmEudmVyYmF0aW1dO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmVyYmF0aW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUoZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbSksIFByZWNlZGVuY2UuU2VxdWVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdmVyYmF0aW0gaXMgb2JqZWN0XG4gICAgICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHZlcmJhdGltLmNvbnRlbnQpO1xuICAgICAgICAgICAgcHJlYyA9ICh2ZXJiYXRpbS5wcmVjZWRlbmNlICE9IG51bGwpID8gdmVyYmF0aW0ucHJlY2VkZW5jZSA6IFByZWNlZGVuY2UuU2VxdWVuY2U7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUocmVzdWx0LCBwcmVjLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgZXhwcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29kZUdlbmVyYXRvcigpIHtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzLlxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9jayA9IGZ1bmN0aW9uKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIG5vTGVhZGluZ0NvbW1lbnQsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIG5vTGVhZGluZ0NvbW1lbnQgPSAhZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHM7XG5cbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmIG5vTGVhZGluZ0NvbW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3BhY2UsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5FbXB0eVN0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gJzsnO1xuICAgICAgICB9XG5cbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgbmV3bGluZSxcbiAgICAgICAgICAgICAgICBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LCBmbGFncykpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5tYXliZUJsb2NrU3VmZml4ID0gZnVuY3Rpb24gKHN0bXQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgZW5kcyA9IGVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQgJiYgKCFleHRyYS5jb21tZW50IHx8ICFzdG10LmxlYWRpbmdDb21tZW50cykgJiYgIWVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBzcGFjZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBiYXNlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbmV3bGluZSwgYmFzZV07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKG5vZGUubmFtZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCBzcGFjZVJlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBub2RlLmFzeW5jID8gJ2FzeW5jJyArIChzcGFjZVJlcXVpcmVkID8gbm9FbXB0eVNwYWNlKCkgOiBzcGFjZSkgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVN0YXJTdWZmaXgobm9kZSkge1xuICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBub2RlLmdlbmVyYXRvciAmJiAhZXh0cmEubW96LnN0YXJsZXNzR2VuZXJhdG9yO1xuICAgICAgICByZXR1cm4gaXNHZW5lcmF0b3IgPyAnKicgKyBzcGFjZSA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTWV0aG9kUHJlZml4KHByb3ApIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBwcm9wLnZhbHVlO1xuICAgICAgICBpZiAoZnVuYy5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXN5bmNQcmVmaXgoZnVuYywgIXByb3AuY29tcHV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYXZvaWQgc3BhY2UgYmVmb3JlIG1ldGhvZCBuYW1lXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVTdGFyU3VmZml4KGZ1bmMpID8gJyonIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVBhdHRlcm4gPSBmdW5jdGlvbiAobm9kZSwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKG5vZGUsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVGdW5jdGlvblBhcmFtcyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBpLCBpeiwgcmVzdWx0LCBoYXNEZWZhdWx0O1xuXG4gICAgICAgIGhhc0RlZmF1bHQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobm9kZS50eXBlID09PSBTeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAhbm9kZS5yZXN0ICYmICghbm9kZS5kZWZhdWx0cyB8fCBub2RlLmRlZmF1bHRzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICAgICAgICAgICBub2RlLnBhcmFtcy5sZW5ndGggPT09IDEgJiYgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gU3ludGF4LklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIC8vIGFyZyA9PiB7IH0gY2FzZVxuICAgICAgICAgICAgcmVzdWx0ID0gW2dlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgdHJ1ZSksIGdlbmVyYXRlSWRlbnRpZmllcihub2RlLnBhcmFtc1swXSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gbm9kZS50eXBlID09PSBTeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPyBbZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCBmYWxzZSldIDogW107XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKCcpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gbm9kZS5wYXJhbXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0ICYmIG5vZGUuZGVmYXVsdHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGRlZmF1bHQgdmFsdWVzLlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlQXNzaWdubWVudChub2RlLnBhcmFtc1tpXSwgbm9kZS5kZWZhdWx0c1tpXSwgJz0nLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZVBhdHRlcm4obm9kZS5wYXJhbXNbaV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUucmVzdCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLi4uJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUucmVzdCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVGdW5jdGlvbkJvZHkgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgcmVzdWx0LCBleHByO1xuXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVGdW5jdGlvblBhcmFtcyhub2RlKTtcblxuICAgICAgICBpZiAobm9kZS50eXBlID09PSBTeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc9PicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgZXhwciA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKG5vZGUuYm9keSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCk7XG4gICAgICAgICAgICBpZiAoZXhwci50b1N0cmluZygpLmNoYXJBdCgwKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgZXhwciA9IFsnKCcsIGV4cHIsICcpJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChleHByKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhub2RlLmJvZHksIFNfVFRGRikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQgPSBmdW5jdGlvbiAob3BlcmF0b3IsIHN0bXQsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbJ2ZvcicgKyBzcGFjZSArICcoJ10sIHRoYXQgPSB0aGlzO1xuICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RtdC5sZWZ0LmtpbmQgKyBub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5sZWZ0LmRlY2xhcmF0aW9uc1swXSwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgb3BlcmF0b3IpO1xuICAgICAgICAgICAgcmVzdWx0ID0gW2pvaW4oXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucmlnaHQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKVxuICAgICAgICAgICAgKSwgJyknXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoZXhwciwgY29tcHV0ZWQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1snKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlQXNzaWdubWVudCA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgb3BlcmF0b3IsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChQcmVjZWRlbmNlLkFzc2lnbm1lbnQgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihsZWZ0LCBQcmVjZWRlbmNlLkNhbGwsIGZsYWdzKSxcbiAgICAgICAgICAgICAgICBzcGFjZSArIG9wZXJhdG9yICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24ocmlnaHQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LFxuICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5zZW1pY29sb24gPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgaWYgKCFzZW1pY29sb25zICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc7JztcbiAgICB9O1xuXG4gICAgLy8gU3RhdGVtZW50cy5cblxuICAgIENvZGVHZW5lcmF0b3IuU3RhdGVtZW50ID0ge1xuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByYW5nZSwgY29udGVudCwgcmVzdWx0ID0gWyd7JywgbmV3bGluZV0sIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZnVuY3Rpb25zIHdpdGhvdXQgYW55IGNvZGVcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCAmJiBwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LnJhbmdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbMV0gLSByYW5nZVswXSA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSArIDEsIHJhbmdlWzFdIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGksIGl6LCBmcmFnbWVudCwgYm9keUZsYWdzO1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX0ZVTkNfQk9EWSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9ESVJFQ1RJVkVfQ1RYO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzWzBdLmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSwgcmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsneyddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5yYW5nZVswXSwgc3RtdC5ib2R5WzBdLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZXR3ZWVuIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpIC0gMV0udHJhaWxpbmdDb21tZW50cyAgJiYgIXN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHlbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMgJiYgaSA8IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCBhIG5ldyBsaW5lIGlmIHRoZXJlIGFyZSBsZWFkaW5nIGNvbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbmV4dCBzdGF0ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpICsgMV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGFmdGVyIHRoZSBsYXN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaV0ucmFuZ2VbMV0sIHN0bXQucmFuZ2VbMV0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCgnfScpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQnJlYWtTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2JyZWFrJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGludWUgJyArIHN0bXQubGFiZWwubmFtZSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnY29udGludWUnICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzQm9keTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmJvZHkubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmJvZHlbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgID0gWydjbGFzcyAnICsgc3RtdC5pZC5uYW1lXTtcbiAgICAgICAgICAgIGlmIChzdG10LnN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oJ2V4dGVuZHMnLCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnN1cGVyQ2xhc3MsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHksIFNfVEZGVCkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4dHJhLnJhdyAmJiBzdG10LnJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG10LnJhdyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlc2NhcGVEaXJlY3RpdmUoc3RtdC5kaXJlY3RpdmUpICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gQmVjYXVzZSBgZG8gNDIgd2hpbGUgKGNvbmQpYCBpcyBTeW50YXggRXJyb3IuIFdlIG5lZWQgc2VtaWNvbG9uLlxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGpvaW4oJ2RvJywgdGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgU19URkZGKSk7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgJ3doaWxlJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICcpJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ2F0Y2hDbGF1c2U6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3VhcmQ7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdjYXRjaCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5wYXJhbSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuZ3VhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3VhcmQgPSB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10Lmd1YXJkLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoMiwgMCwgJyBpZiAnLCBndWFyZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdkZWJ1Z2dlcicgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpID8gU19URkZUIDogU19URkZGO1xuXG4gICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBIb2lzdGFibGVEZWNsYXJhdGlvbltEZWZhdWx0XVxuICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgQXNzaWdubWVudEV4cHJlc3Npb25bSW5dIDtcbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAnZGVmYXVsdCcpO1xuICAgICAgICAgICAgaWYgKGlzU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbiwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmRlY2xhcmF0aW9uLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSA/IFNfVEZGVCA6IFNfVEZGRjtcblxuICAgICAgICAgICAgLy8gZXhwb3J0IFZhcmlhYmxlU3RhdGVtZW50XG4gICAgICAgICAgICAvLyBleHBvcnQgRGVjbGFyYXRpb25bRGVmYXVsdF1cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBleHBvcnQgRXhwb3J0Q2xhdXNlW05vUmVmZXJlbmNlXSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIC8vIGV4cG9ydCBFeHBvcnRDbGF1c2UgO1xuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAneycgKyBzcGFjZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG10LnNwZWNpZmllcnNbMF0udHlwZSA9PT0gU3ludGF4LkV4cG9ydEJhdGNoU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICd7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuc3BlY2lmaWVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbWljb2xvbihmbGFncykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gZXhwb3J0ICogRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdleHBvcnQnICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJyonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGU7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKDAsIDUpICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoNSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4N0IgIC8qICd7JyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgOCkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdCg4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHgyOCAvKiAnKCcgKi8gfHwgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjb2RlKSB8fCBjb2RlID09PSAweDJBICAvKiAnKicgKi8gfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlLCBpLCBpejtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgNSkgIT09ICdhc3luYycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoZnJhZ21lbnQuY2hhckNvZGVBdCg1KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSA2LCBpeiA9IGZyYWdtZW50Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGZyYWdtZW50LmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoaSwgaSArIDgpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoaSArIDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDI4IC8qICcoJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGNvZGUgPT09IDB4MkEgIC8qICcqJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZXhwcmVzc2lvbiwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXTtcbiAgICAgICAgICAgIC8vIDEyLjQgJ3snLCAnZnVuY3Rpb24nLCAnY2xhc3MnIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcG9zaXRpb24uXG4gICAgICAgICAgICAvLyB3cmFwIGV4cHJlc3Npb24gd2l0aCBwYXJlbnRoZXNlc1xuICAgICAgICAgICAgZnJhZ21lbnQgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSAweDdCICAvKiAneycgKi8gfHwgIC8vIE9iamVjdEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSAmJiAoZmxhZ3MgJiBGX0RJUkVDVElWRV9DVFgpICYmIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2Ygc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJygnLCByZXN1bHQsICcpJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEVTNjogMTUuMi4xIHZhbGlkIGltcG9ydCBkZWNsYXJhdGlvbnM6XG4gICAgICAgICAgICAvLyAgICAgLSBpbXBvcnQgSW1wb3J0Q2xhdXNlIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgLy8gICAgIC0gaW1wb3J0IE1vZHVsZVNwZWNpZmllciA7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBjdXJzb3IsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBJbXBvcnRDbGF1c2UgaXMgcHJlc2VudCxcbiAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyYCBzbyBza2lwIGBmcm9tYFxuICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyIGlzIFN0cmluZ0xpdGVyYWwuXG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGltcG9ydCBNb2R1bGVTcGVjaWZpZXIgO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGltcG9ydCBJbXBvcnRDbGF1c2UgRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgJ2ltcG9ydCdcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjdXJzb3IgPSAwO1xuXG4gICAgICAgICAgICAvLyBJbXBvcnRlZEJpbmRpbmdcbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXS50eXBlID09PSBTeW50YXguSW1wb3J0RGVmYXVsdFNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgKytjdXJzb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXSkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0udHlwZSA9PT0gU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYW1lU3BhY2VJbXBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVkSW1wb3J0c1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd7Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChzdG10LnNwZWNpZmllcnMubGVuZ3RoIC0gY3Vyc29yKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHsgLi4uIH0gZnJvbSBcIi4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd9JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGZyb20gXCIuLi5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJzb3IsIGl6ID0gc3RtdC5zcGVjaWZpZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UgKyAnfScgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gRV9UVFQgOiBFX0ZUVDtcbiAgICAgICAgICAgIGlmIChzdG10LmluaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmlkLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVBhdHRlcm4oc3RtdC5pZCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdG9yIGlzIHR5cGVkIGFzIFN0YXRlbWVudCxcbiAgICAgICAgICAgIC8vIGJ1dCBqb2luZWQgd2l0aCBjb21tYSAobm90IExpbmVUZXJtaW5hdG9yKS5cbiAgICAgICAgICAgIC8vIFNvIGlmIGNvbW1lbnQgaXMgYXR0YWNoZWQgdG8gdGFyZ2V0IG5vZGUsIHdlIHNob3VsZCBzcGVjaWFsaXplLlxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIG5vZGUsIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFsgc3RtdC5raW5kIF07XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gU19URkZGIDogU19GRkZGO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBibG9jaygpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gc3RtdC5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHRyYS5jb21tZW50ICYmIG5vZGUubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChibG9jayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2NrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICd0aHJvdycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICApLCB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRyeVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgZ3VhcmRlZEhhbmRsZXJzO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBbJ3RyeScsIHRoaXMubWF5YmVCbG9jayhzdG10LmJsb2NrLCBTX1RGRkYpXTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmJsb2NrLCByZXN1bHQpO1xuXG4gICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIC8vIG9sZCBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuaGFuZGxlcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJzW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3VhcmRlZEhhbmRsZXJzID0gc3RtdC5ndWFyZGVkSGFuZGxlcnMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGd1YXJkZWRIYW5kbGVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGd1YXJkZWRIYW5kbGVyc1tpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChndWFyZGVkSGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG5ldyBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHN0bXQuaGFuZGxlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5oYW5kbGVyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcltpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlciwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWydmaW5hbGx5JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuZmluYWxpemVyLCBTX1RGRkYpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFN3aXRjaFN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdzd2l0Y2gnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZGlzY3JpbWluYW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJyArIHNwYWNlICsgJ3snICsgbmV3bGluZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzdG10LmNhc2VzKSB7XG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5jYXNlcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmNhc2VzW2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KCd9JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBTd2l0Y2hDYXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgam9pbignY2FzZScsIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICc6J1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnZGVmYXVsdDonXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpeiA9IHN0bXQuY29uc2VxdWVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGl6ICYmIHN0bXQuY29uc2VxdWVudFswXS50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0Lm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50WzBdLCBTX1RGRkYpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5jb25zZXF1ZW50W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgIT09IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJZlN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBib2R5RmxhZ3MsIHNlbWljb2xvbk9wdGlvbmFsLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ2lmJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VtaWNvbG9uT3B0aW9uYWwgPSBmbGFncyAmIEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgIGlmIChzZW1pY29sb25PcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50LCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5jb25zZXF1ZW50LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzdG10LmFsdGVybmF0ZS50eXBlID09PSBTeW50YXguSWZTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsnZWxzZSAnLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYWx0ZXJuYXRlLCBib2R5RmxhZ3MpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGpvaW4oJ2Vsc2UnLCB0aGlzLm1heWJlQmxvY2soc3RtdC5hbHRlcm5hdGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnQsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2ZvcicgKyBzcGFjZSArICcoJ107XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuaW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5pbml0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaW5pdCwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGX0FMTE9XX0lOIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfRlRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC50ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC51cGRhdGUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQoJ2luJywgc3RtdCwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50KCdvZicsIHN0bXQsIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKTtcbiAgICAgICAgfSxcblxuICAgICAgICBMYWJlbGVkU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3RtdC5sYWJlbC5uYW1lICsgJzonLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRildO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb2dyYW06IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3M7XG4gICAgICAgICAgICBpeiA9IHN0bXQuYm9keS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQgPSBbc2FmZUNvbmNhdGVuYXRpb24gJiYgaXogPiAwID8gJ1xcbicgOiAnJ107XG4gICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGVEY7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICghc2FmZUNvbmNhdGVuYXRpb24gJiYgaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGJlZm9yZSB0aGUgZmlyc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2kgLSAxXS50cmFpbGluZ0NvbW1lbnRzICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYWZ0ZXIgdGhlIGxhc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpXS5yYW5nZVsxXSwgc3RtdC5yYW5nZVsxXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoc3RtdCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVN0YXJTdWZmaXgoc3RtdCkgfHwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgc3RtdC5pZCA/IGdlbmVyYXRlSWRlbnRpZmllcihzdG10LmlkKSA6ICcnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoc3RtdClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICAgICAncmV0dXJuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgKSwgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbJ3JldHVybicgKyB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2hpbGUnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBXaXRoU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2l0aCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5vYmplY3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBtZXJnZShDb2RlR2VuZXJhdG9yLnByb3RvdHlwZSwgQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQpO1xuXG4gICAgLy8gRXhwcmVzc2lvbnMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24gPSB7XG5cbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuU2VxdWVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb25zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCBleHByLm9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZSh0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIpLCBQcmVjZWRlbmNlLkFycm93RnVuY3Rpb24sIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5Db25kaXRpb25hbCA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGVzdCwgUHJlY2VkZW5jZS5Mb2dpY2FsT1IsIGZsYWdzKSxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UgKyAnPycgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jb25zZXF1ZW50LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKSxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UgKyAnOicgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hbHRlcm5hdGUsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBQcmVjZWRlbmNlLkNvbmRpdGlvbmFsLFxuICAgICAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTG9naWNhbEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQmluYXJ5RXhwcmVzc2lvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBjdXJyZW50UHJlY2VkZW5jZSwgZnJhZ21lbnQsIGxlZnRTb3VyY2U7XG4gICAgICAgICAgICBjdXJyZW50UHJlY2VkZW5jZSA9IEJpbmFyeVByZWNlZGVuY2VbZXhwci5vcGVyYXRvcl07XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJlY2VkZW5jZSA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgY3VycmVudFByZWNlZGVuY2UsIGZsYWdzKTtcblxuICAgICAgICAgICAgbGVmdFNvdXJjZSA9IGZyYWdtZW50LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKSA9PT0gMHgyRiAvKiAvICovICYmIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGV4cHIub3BlcmF0b3IuY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZnJhZ21lbnQsIG5vRW1wdHlTcGFjZSgpLCBleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihmcmFnbWVudCwgZXhwci5vcGVyYXRvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgY3VycmVudFByZWNlZGVuY2UgKyAxLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yID09PSAnLycgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICcvJyB8fFxuICAgICAgICAgICAgZXhwci5vcGVyYXRvci5zbGljZSgtMSkgPT09ICc8JyAmJiBmcmFnbWVudC50b1N0cmluZygpLnNsaWNlKDAsIDMpID09PSAnIS0tJykge1xuICAgICAgICAgICAgICAgIC8vIElmICcvJyBjb25jYXRzIHdpdGggJy8nIG9yIGA8YCBjb25jYXRzIHdpdGggYCEtLWAsIGl0IGlzIGludGVycHJldGVkIGFzIGNvbW1lbnQgc3RhcnRcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJ2luJyAmJiAhKGZsYWdzICYgRl9BTExPV19JTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIGN1cnJlbnRQcmVjZWRlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpejtcbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVEYpXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHJbJ2FyZ3VtZW50cyddLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByWydhcmd1bWVudHMnXVtpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfQ0FMTCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuQ2FsbCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTmV3RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBsZW5ndGgsIGksIGl6LCBpdGVtRmxhZ3M7XG4gICAgICAgICAgICBsZW5ndGggPSBleHByWydhcmd1bWVudHMnXS5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfQ0FMTCBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgLy8gRl9BTExPV19VTlBBUkFUSF9ORVcgbWF5IGJlY29tZSBmYWxzZS5cbiAgICAgICAgICAgIGl0ZW1GbGFncyA9IChmbGFncyAmIEZfQUxMT1dfVU5QQVJBVEhfTkVXICYmICFwYXJlbnRoZXNlcyAmJiBsZW5ndGggPT09IDApID8gRV9URlQgOiBFX1RGRjtcblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihcbiAgICAgICAgICAgICAgICAnbmV3JyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmNhbGxlZSwgUHJlY2VkZW5jZS5OZXcsIGl0ZW1GbGFncylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghKGZsYWdzICYgRl9BTExPV19VTlBBUkFUSF9ORVcpIHx8IHBhcmVudGhlc2VzIHx8IGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKCcpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gbGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByWydhcmd1bWVudHMnXVtpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk5ldywgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcblxuICAgICAgICAgICAgLy8gRl9BTExPV19VTlBBUkFUSF9ORVcgYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgIHJlc3VsdCA9IFt0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLm9iamVjdCwgUHJlY2VkZW5jZS5DYWxsLCAoZmxhZ3MgJiBGX0FMTE9XX0NBTEwpID8gRV9UVEYgOiBFX1RGRildO1xuXG4gICAgICAgICAgICBpZiAoZXhwci5jb21wdXRlZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdbJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0eSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgZmxhZ3MgJiBGX0FMTE9XX0NBTEwgPyBFX1RUVCA6IEVfVEZUKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub2JqZWN0LnR5cGUgPT09IFN5bnRheC5MaXRlcmFsICYmIHR5cGVvZiBleHByLm9iamVjdC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFsbCB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDEuIE5vIGZsb2F0aW5nIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIC8vICAgMi4gRG9uJ3QgaGF2ZSBleHBvbmVudHNcbiAgICAgICAgICAgICAgICAgICAgLy8gICAzLiBUaGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBkZWNpbWFsIGRpZ2l0XG4gICAgICAgICAgICAgICAgICAgIC8vICAgNC4gTm90IGhleGFkZWNpbWFsIE9SIG9jdGFsIG51bWJlciBsaXRlcmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmluZGV4T2YoJy4nKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhL1tlRXhYXS8udGVzdChmcmFnbWVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3V0aWxzLmNvZGUuaXNEZWNpbWFsRGlnaXQoZnJhZ21lbnQuY2hhckNvZGVBdChmcmFnbWVudC5sZW5ndGggLSAxKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZyYWdtZW50Lmxlbmd0aCA+PSAyICYmIGZyYWdtZW50LmNoYXJDb2RlQXQoMCkgPT09IDQ4KSAgLy8gJzAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIucHJvcGVydHkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTWVtYmVyLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRhUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwci5tZXRhKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChleHByLnByb3BlcnR5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCByaWdodENoYXJDb2RlLCBsZWZ0U291cmNlLCBsZWZ0Q2hhckNvZGU7XG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKTtcblxuICAgICAgICAgICAgaWYgKHNwYWNlID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZXhwci5vcGVyYXRvciwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUsIHZvaWQsIHR5cGVvZlxuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYHR5cGVvZiBbXWAsIG5vdCBgdHlwZW9mW11gXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBpbnNlcnRpbmcgc3BhY2VzIGJldHdlZW4gb3BlcmF0b3IgYW5kIGFyZ3VtZW50IGlmIGl0IGlzIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGxpa2UsIGAhY29uZGBcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRDaGFyQ29kZSA9IGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5VbmFyeSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZXhwci5kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICd5aWVsZConO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAneWllbGQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuYXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuWWllbGQsIEVfVFRUKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5ZaWVsZCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgIGV4cHIuYWxsID8gJ2F3YWl0KicgOiAnYXdhaXQnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuQXdhaXQsIEVfVFRUKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkF3YWl0LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLnByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5VbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Qb3N0Zml4LCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3JcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuUG9zdGZpeCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoZXhwciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVTdGFyU3VmZml4KGV4cHIpIHx8IG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZVN0YXJTdWZmaXgoZXhwcikgfHwgc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShleHByKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BcnJheUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MsIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzLCBpc1BhdHRlcm4pIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIG11bHRpbGluZSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBpc1BhdHRlcm4gPyBmYWxzZSA6IGV4cHIuZWxlbWVudHMubGVuZ3RoID4gMTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsnWycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJ107XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByLmVsZW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5lbGVtZW50c1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtdWx0aWxpbmUgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBiYXNlIDogJycpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmVzdEVsZW1lbnQ6IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJy4uLicgKyB0aGlzLmdlbmVyYXRlUGF0dGVybihleHByLmFyZ3VtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbJ2NsYXNzJ107XG4gICAgICAgICAgICBpZiAoZXhwci5pZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmlkLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuc3VwZXJDbGFzcykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbignZXh0ZW5kcycsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuc3VwZXJDbGFzcywgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIuYm9keSwgU19URkZUKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIE1ldGhvZERlZmluaXRpb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICBpZiAoZXhwclsnc3RhdGljJ10pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3N0YXRpYycgKyBzcGFjZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW1xuICAgICAgICAgICAgICAgICAgICBqb2luKGV4cHIua2luZCwgdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHIua2luZCwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5zaG9ydGhhbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci52YWx1ZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbXVsdGlsaW5lLCByZXN1bHQsIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgaWYgKCFleHByLnByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBleHByLnByb3BlcnRpZXMubGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgIC8vIGlzc3VlcyA0XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHRyYW5zZm9ybSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgbWV0aG9kMjogZnVuY3Rpb24gKCkge31cbiAgICAgICAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7bWV0aG9kMjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIH19KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0xpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbICd7Jywgc3BhY2UsIGZyYWdtZW50LCBzcGFjZSwgJ30nIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWyAneycsIG5ld2xpbmUsIGluZGVudCwgZnJhZ21lbnQgXTtcblxuICAgICAgICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ30nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCBleHByLm9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgbXVsdGlsaW5lLCBwcm9wZXJ0eSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIucHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3t9JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZXhwci5wcm9wZXJ0aWVzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS50eXBlICE9PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGV4cHIucHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5zaG9ydGhhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFsneycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJyBdO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBpbmRlbnQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydGllc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIChtdWx0aWxpbmUgPyBuZXdsaW5lIDogc3BhY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAobXVsdGlsaW5lICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gYmFzZSA6ICcnKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRoaXNFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAndGhpcyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3VwZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdzdXBlcic7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSWRlbnRpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByLmlkIHx8IGV4cHIubG9jYWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWycqJ107XG4gICAgICAgICAgICB2YXIgaWQgPSBleHByLmlkIHx8IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGltcG9ydGVkID0gZXhwci5pbXBvcnRlZDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGltcG9ydGVkLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBsb2NhbCA9IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAobG9jYWwgJiYgbG9jYWwubmFtZSAhPT0gaW1wb3J0ZWQubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGxvY2FsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgbG9jYWwubmFtZSBdO1xuICAgICAgICAgICAgdmFyIGV4cG9ydGVkID0gZXhwci5leHBvcnRlZDtcbiAgICAgICAgICAgIGlmIChleHBvcnRlZCAmJiBleHBvcnRlZC5uYW1lICE9PSBsb2NhbC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwb3J0ZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmF3O1xuICAgICAgICAgICAgaWYgKGV4cHIuaGFzT3duUHJvcGVydHkoJ3JhdycpICYmIHBhcnNlICYmIGV4dHJhLnJhdykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdyA9IHBhcnNlKGV4cHIucmF3KS5ib2R5WzBdLmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXcudHlwZSA9PT0gU3ludGF4LkxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXcudmFsdWUgPT09IGV4cHIudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5yYXc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCB1c2UgcmF3IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKGV4cHIudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTnVtYmVyKGV4cHIudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByLnZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVnRXhwKGV4cHIudmFsdWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEdlbmVyYXRvckV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29tcHJlaGVuc2lvbkV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbXByZWhlbnNpb25FeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEdlbmVyYXRvckV4cHJlc3Npb24gc2hvdWxkIGJlIHBhcmVudGhlc2l6ZWQgd2l0aCAoLi4uKSwgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb24gd2l0aCBbLi4uXVxuICAgICAgICAgICAgLy8gRHVlIHRvIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4MzQ2OCBwb3NpdGlvbiBvZiBleHByLmJvZHkgY2FuIGRpZmZlciBpbiBTcGlkZXJtb25rZXkgYW5kIEVTNlxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgZnJhZ21lbnQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgcmVzdWx0ID0gKGV4cHIudHlwZSA9PT0gU3ludGF4LkdlbmVyYXRvckV4cHJlc3Npb24pID8gWycoJ10gOiBbJ1snXTtcblxuICAgICAgICAgICAgaWYgKGV4dHJhLm1vei5jb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5ibG9ja3MubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmJsb2Nrc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwIHx8IGV4dHJhLm1vei5jb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLmZpbHRlcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAnaWYnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5maWx0ZXIsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWyAnKCcsIGZyYWdtZW50LCAnKScgXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZXh0cmEubW96LmNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYm9keSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCk7XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaCgoZXhwci50eXBlID09PSBTeW50YXguR2VuZXJhdG9yRXhwcmVzc2lvbikgPyAnKScgOiAnXScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBDb21wcmVoZW5zaW9uQmxvY2s6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGZyYWdtZW50O1xuICAgICAgICAgICAgaWYgKGV4cHIubGVmdC50eXBlID09PSBTeW50YXguVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW1xuICAgICAgICAgICAgICAgICAgICBleHByLmxlZnQua2luZCwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoZXhwci5sZWZ0LmRlY2xhcmF0aW9uc1swXSwgU19GRkZGKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5sZWZ0LCBQcmVjZWRlbmNlLkNhbGwsIEVfVFRUKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKGZyYWdtZW50LCBleHByLm9mID8gJ29mJyA6ICdpbicpO1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKGZyYWdtZW50LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnJpZ2h0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gWyAnZm9yJyArIHNwYWNlICsgJygnLCBmcmFnbWVudCwgJyknIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3ByZWFkRWxlbWVudDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICcuLi4nLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgaXRlbUZsYWdzID0gRV9UVEY7XG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfQ0FMTCkpIHtcbiAgICAgICAgICAgICAgICBpdGVtRmxhZ3MgPSBFX1RGRjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci50YWcsIFByZWNlZGVuY2UuQ2FsbCwgaXRlbUZsYWdzKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnF1YXNpLCBQcmVjZWRlbmNlLlByaW1hcnksIEVfRkZUKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlRhZ2dlZFRlbXBsYXRlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBUZW1wbGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIFwiY29va2VkXCIuIFNpbmNlIHRhZ2dlZCB0ZW1wbGF0ZSBjYW4gdXNlIHJhdyB0ZW1wbGF0ZVxuICAgICAgICAgICAgLy8gcmVwcmVzZW50YXRpb24uIFNvIGlmIHdlIGRvIHNvLCBpdCBicmVha3MgdGhlIHNjcmlwdCBzZW1hbnRpY3MuXG4gICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZS5yYXc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuICAgICAgICAgICAgcmVzdWx0ID0gWyAnYCcgXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5xdWFzaXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucXVhc2lzW2ldLCBQcmVjZWRlbmNlLlByaW1hcnksIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyR7JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5leHByZXNzaW9uc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAnfScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdgJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5MaXRlcmFsKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIG1lcmdlKENvZGVHZW5lcmF0b3IucHJvdG90eXBlLCBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24pO1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHR5cGU7XG5cbiAgICAgICAgdHlwZSA9IGV4cHIudHlwZSB8fCBTeW50YXguUHJvcGVydHk7XG5cbiAgICAgICAgaWYgKGV4dHJhLnZlcmJhdGltICYmIGV4cHIuaGFzT3duUHJvcGVydHkoZXh0cmEudmVyYmF0aW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbdHlwZV0oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKGV4cHIsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0LCBleHByKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICAgIGZyYWdtZW50O1xuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbc3RtdC50eXBlXShzdG10LCBmbGFncyk7XG5cbiAgICAgICAgLy8gQXR0YWNoIGNvbW1lbnRzXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKHN0bXQsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiAhc2FmZUNvbmNhdGVuYXRpb24gJiYgbmV3bGluZSA9PT0gJycgJiYgIGZyYWdtZW50LmNoYXJBdChmcmFnbWVudC5sZW5ndGggLSAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZU1hcCA/IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS5yZXBsYWNlUmlnaHQoL1xccyskLywgJycpIDogZnJhZ21lbnQucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIHN0bXQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUludGVybmFsKG5vZGUpIHtcbiAgICAgICAgdmFyIGNvZGVnZW47XG5cbiAgICAgICAgY29kZWdlbiA9IG5ldyBDb2RlR2VuZXJhdG9yKCk7XG4gICAgICAgIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVnZW4uZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgU19URkZGKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlZ2VuLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZShub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCksIHJlc3VsdCwgcGFpcjtcblxuICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBPYnNvbGV0ZSBvcHRpb25zXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBgb3B0aW9ucy5pbmRlbnRgXG4gICAgICAgICAgICAvLyAgIGBvcHRpb25zLmJhc2VgXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aGVtLCB3ZSBjYW4gdXNlIGBvcHRpb24uZm9ybWF0LmluZGVudGAuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuaW5kZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGUgPSBvcHRpb25zLmluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5iYXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMgPSB1cGRhdGVEZWVwbHkoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaW5kZW50ID0gb3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IHN0cmluZ1JlcGVhdChpbmRlbnQsIG9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICAgICAgICAgIGluZGVudCA9IG9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZTtcbiAgICAgICAgICAgIGJhc2UgPSBzdHJpbmdSZXBlYXQoaW5kZW50LCBvcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAganNvbiA9IG9wdGlvbnMuZm9ybWF0Lmpzb247XG4gICAgICAgIHJlbnVtYmVyID0gb3B0aW9ucy5mb3JtYXQucmVudW1iZXI7XG4gICAgICAgIGhleGFkZWNpbWFsID0ganNvbiA/IGZhbHNlIDogb3B0aW9ucy5mb3JtYXQuaGV4YWRlY2ltYWw7XG4gICAgICAgIHF1b3RlcyA9IGpzb24gPyAnZG91YmxlJyA6IG9wdGlvbnMuZm9ybWF0LnF1b3RlcztcbiAgICAgICAgZXNjYXBlbGVzcyA9IG9wdGlvbnMuZm9ybWF0LmVzY2FwZWxlc3M7XG4gICAgICAgIG5ld2xpbmUgPSBvcHRpb25zLmZvcm1hdC5uZXdsaW5lO1xuICAgICAgICBzcGFjZSA9IG9wdGlvbnMuZm9ybWF0LnNwYWNlO1xuICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXQuY29tcGFjdCkge1xuICAgICAgICAgICAgbmV3bGluZSA9IHNwYWNlID0gaW5kZW50ID0gYmFzZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudGhlc2VzID0gb3B0aW9ucy5mb3JtYXQucGFyZW50aGVzZXM7XG4gICAgICAgIHNlbWljb2xvbnMgPSBvcHRpb25zLmZvcm1hdC5zZW1pY29sb25zO1xuICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbiA9IG9wdGlvbnMuZm9ybWF0LnNhZmVDb25jYXRlbmF0aW9uO1xuICAgICAgICBkaXJlY3RpdmUgPSBvcHRpb25zLmRpcmVjdGl2ZTtcbiAgICAgICAgcGFyc2UgPSBqc29uID8gbnVsbCA6IG9wdGlvbnMucGFyc2U7XG4gICAgICAgIHNvdXJjZU1hcCA9IG9wdGlvbnMuc291cmNlTWFwO1xuICAgICAgICBzb3VyY2VDb2RlID0gb3B0aW9ucy5zb3VyY2VDb2RlO1xuICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXMgPSBvcHRpb25zLmZvcm1hdC5wcmVzZXJ2ZUJsYW5rTGluZXMgJiYgc291cmNlQ29kZSAhPT0gbnVsbDtcbiAgICAgICAgZXh0cmEgPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy5icm93c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIGVudmlyb25tZW50IGlzIG5vZGUuanNcbiAgICAgICAgICAgICAgICAvLyBBbmQgcHJldmVudCBmcm9tIGluY2x1ZGluZyBzb3VyY2UtbWFwIGJ5IGJyb3dzZXJpZnlcbiAgICAgICAgICAgICAgICBTb3VyY2VOb2RlID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNvdXJjZU5vZGUgPSBnbG9iYWwuc291cmNlTWFwLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZUludGVybmFsKG5vZGUpO1xuXG4gICAgICAgIGlmICghc291cmNlTWFwKSB7XG4gICAgICAgICAgICBwYWlyID0ge2NvZGU6IHJlc3VsdC50b1N0cmluZygpLCBtYXA6IG51bGx9O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlTWFwV2l0aENvZGUgPyBwYWlyIDogcGFpci5jb2RlO1xuICAgICAgICB9XG5cblxuICAgICAgICBwYWlyID0gcmVzdWx0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7XG4gICAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUsXG4gICAgICAgICAgICBzb3VyY2VSb290OiBvcHRpb25zLnNvdXJjZU1hcFJvb3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlQ29udGVudCkge1xuICAgICAgICAgICAgcGFpci5tYXAuc2V0U291cmNlQ29udGVudChvcHRpb25zLnNvdXJjZU1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2VDb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcFdpdGhDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYWlyLm1hcC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIEZPUk1BVF9NSU5JRlkgPSB7XG4gICAgICAgIGluZGVudDoge1xuICAgICAgICAgICAgc3R5bGU6ICcnLFxuICAgICAgICAgICAgYmFzZTogMFxuICAgICAgICB9LFxuICAgICAgICByZW51bWJlcjogdHJ1ZSxcbiAgICAgICAgaGV4YWRlY2ltYWw6IHRydWUsXG4gICAgICAgIHF1b3RlczogJ2F1dG8nLFxuICAgICAgICBlc2NhcGVsZXNzOiB0cnVlLFxuICAgICAgICBjb21wYWN0OiB0cnVlLFxuICAgICAgICBwYXJlbnRoZXNlczogZmFsc2UsXG4gICAgICAgIHNlbWljb2xvbnM6IGZhbHNlXG4gICAgfTtcblxuICAgIEZPUk1BVF9ERUZBVUxUUyA9IGdldERlZmF1bHRPcHRpb25zKCkuZm9ybWF0O1xuXG4gICAgZXhwb3J0cy52ZXJzaW9uID0gcmVxdWlyZSgnLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuICAgIGV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbiAgICBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gZXN0cmF2ZXJzZS5hdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlByZWNlZGVuY2UgPSB1cGRhdGVEZWVwbHkoe30sIFByZWNlZGVuY2UpO1xuICAgIGV4cG9ydHMuYnJvd3NlciA9IGZhbHNlO1xuICAgIGV4cG9ydHMuRk9STUFUX01JTklGWSA9IEZPUk1BVF9NSU5JRlk7XG4gICAgZXhwb3J0cy5GT1JNQVRfREVGQVVMVFMgPSBGT1JNQVRfREVGQVVMVFM7XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5bGMyTnZaR1ZuWlc0dlpYTmpiMlJsWjJWdUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLbHh1SUNCRGIzQjVjbWxuYUhRZ0tFTXBJREl3TVRJdE1qQXhOQ0JaZFhOMWEyVWdVM1Y2ZFd0cElEeDFkR0YwWVc1bExuUmxZVUJuYldGcGJDNWpiMjArWEc0Z0lFTnZjSGx5YVdkb2RDQW9ReWtnTWpBeE5TQkpibWQyWVhJZ1UzUmxjR0Z1ZVdGdUlEeHRaVUJ5Y21WMlpYSnpaWEl1WTI5dFBseHVJQ0JEYjNCNWNtbG5hSFFnS0VNcElESXdNVFFnU1haaGJpQk9hV3QxYkdsdUlEeHBabUZoWVc1QVoyMWhhV3d1WTI5dFBseHVJQ0JEYjNCNWNtbG5hSFFnS0VNcElESXdNVEl0TWpBeE15Qk5hV05vWVdWc0lFWnBZMkZ5Y21FZ1BHVnpZMjlrWldkbGJpNWpiM0I1Y21sbmFIUkFiV2xqYUdGbGJDNW1hV05oY25KaExtMWxQbHh1SUNCRGIzQjVjbWxuYUhRZ0tFTXBJREl3TVRJdE1qQXhNeUJOWVhSb2FXRnpJRUo1Ym1WdWN5QThiV0YwYUdsaGMwQnhhWGRwTG1KbFBseHVJQ0JEYjNCNWNtbG5hSFFnS0VNcElESXdNVE1nU1hKaGEyeHBJRWR2ZW1Gc2FYTm9kbWxzYVNBOGNtWnZZbWxqUUdkdFlXbHNMbU52YlQ1Y2JpQWdRMjl3ZVhKcFoyaDBJQ2hES1NBeU1ERXlJRkp2WW1WeWRDQkhkWE4wTFVKaGNtUnZiaUE4Wkc5dVlYUmxRSEp2WW1WeWRDNW5kWE4wTFdKaGNtUnZiaTV2Y21jK1hHNGdJRU52Y0hseWFXZG9kQ0FvUXlrZ01qQXhNaUJLYjJodUlFWnlaV1Z0WVc0Z1BHcG1jbVZsYldGdU1EaEFaMjFoYVd3dVkyOXRQbHh1SUNCRGIzQjVjbWxuYUhRZ0tFTXBJREl3TVRFdE1qQXhNaUJCY21sNVlTQklhV1JoZVdGMElEeGhjbWw1WVM1b2FXUmhlV0YwUUdkdFlXbHNMbU52YlQ1Y2JpQWdRMjl3ZVhKcFoyaDBJQ2hES1NBeU1ERXlJRXB2YjNOMExWZHBiU0JDYjJWclpYTjBaV2xxYmlBOGFtOXZjM1F0ZDJsdFFHSnZaV3RsYzNSbGFXcHVMbTVzUGx4dUlDQkRiM0I1Y21sbmFIUWdLRU1wSURJd01USWdTM0pwY3lCTGIzZGhiQ0E4YTNKcGN5NXJiM2RoYkVCamFYaGhjaTVqYjIwK1hHNGdJRU52Y0hseWFXZG9kQ0FvUXlrZ01qQXhNaUJCY25CaFpDQkNiM0p6YjNNZ1BHRnljR0ZrTG1KdmNuTnZjMEJuYjI5bmJHVnRZV2xzTG1OdmJUNWNibHh1SUNCU1pXUnBjM1J5YVdKMWRHbHZiaUJoYm1RZ2RYTmxJR2x1SUhOdmRYSmpaU0JoYm1RZ1ltbHVZWEo1SUdadmNtMXpMQ0IzYVhSb0lHOXlJSGRwZEdodmRYUmNiaUFnYlc5a2FXWnBZMkYwYVc5dUxDQmhjbVVnY0dWeWJXbDBkR1ZrSUhCeWIzWnBaR1ZrSUhSb1lYUWdkR2hsSUdadmJHeHZkMmx1WnlCamIyNWthWFJwYjI1eklHRnlaU0J0WlhRNlhHNWNiaUFnSUNBcUlGSmxaR2x6ZEhKcFluVjBhVzl1Y3lCdlppQnpiM1Z5WTJVZ1kyOWtaU0J0ZFhOMElISmxkR0ZwYmlCMGFHVWdZV0p2ZG1VZ1kyOXdlWEpwWjJoMFhHNGdJQ0FnSUNCdWIzUnBZMlVzSUhSb2FYTWdiR2x6ZENCdlppQmpiMjVrYVhScGIyNXpJR0Z1WkNCMGFHVWdabTlzYkc5M2FXNW5JR1JwYzJOc1lXbHRaWEl1WEc0Z0lDQWdLaUJTWldScGMzUnlhV0oxZEdsdmJuTWdhVzRnWW1sdVlYSjVJR1p2Y20wZ2JYVnpkQ0J5WlhCeWIyUjFZMlVnZEdobElHRmliM1psSUdOdmNIbHlhV2RvZEZ4dUlDQWdJQ0FnYm05MGFXTmxMQ0IwYUdseklHeHBjM1FnYjJZZ1kyOXVaR2wwYVc5dWN5QmhibVFnZEdobElHWnZiR3h2ZDJsdVp5QmthWE5qYkdGcGJXVnlJR2x1SUhSb1pWeHVJQ0FnSUNBZ1pHOWpkVzFsYm5SaGRHbHZiaUJoYm1RdmIzSWdiM1JvWlhJZ2JXRjBaWEpwWVd4eklIQnliM1pwWkdWa0lIZHBkR2dnZEdobElHUnBjM1J5YVdKMWRHbHZiaTVjYmx4dUlDQlVTRWxUSUZOUFJsUlhRVkpGSUVsVElGQlNUMVpKUkVWRUlFSlpJRlJJUlNCRFQxQlpVa2xIU0ZRZ1NFOU1SRVZTVXlCQlRrUWdRMDlPVkZKSlFsVlVUMUpUSUZ3aVFWTWdTVk5jSWx4dUlDQkJUa1FnUVU1WklFVllVRkpGVTFNZ1QxSWdTVTFRVEVsRlJDQlhRVkpTUVU1VVNVVlRMQ0JKVGtOTVZVUkpUa2NzSUVKVlZDQk9UMVFnVEVsTlNWUkZSQ0JVVHl3Z1ZFaEZYRzRnSUVsTlVFeEpSVVFnVjBGU1VrRk9WRWxGVXlCUFJpQk5SVkpEU0VGT1ZFRkNTVXhKVkZrZ1FVNUVJRVpKVkU1RlUxTWdSazlTSUVFZ1VFRlNWRWxEVlV4QlVpQlFWVkpRVDFORlhHNGdJRUZTUlNCRVNWTkRURUZKVFVWRUxpQkpUaUJPVHlCRlZrVk9WQ0JUU0VGTVRDQThRMDlRV1ZKSlIwaFVJRWhQVEVSRlVqNGdRa1VnVEVsQlFreEZJRVpQVWlCQlRsbGNiaUFnUkVsU1JVTlVMQ0JKVGtSSlVrVkRWQ3dnU1U1RFNVUkZUbFJCVEN3Z1UxQkZRMGxCVEN3Z1JWaEZUVkJNUVZKWkxDQlBVaUJEVDA1VFJWRlZSVTVVU1VGTUlFUkJUVUZIUlZOY2JpQWdLRWxPUTB4VlJFbE9SeXdnUWxWVUlFNVBWQ0JNU1UxSlZFVkVJRlJQTENCUVVrOURWVkpGVFVWT1ZDQlBSaUJUVlVKVFZFbFVWVlJGSUVkUFQwUlRJRTlTSUZORlVsWkpRMFZUTzF4dUlDQk1UMU5USUU5R0lGVlRSU3dnUkVGVVFTd2dUMUlnVUZKUFJrbFVVenNnVDFJZ1FsVlRTVTVGVTFNZ1NVNVVSVkpTVlZCVVNVOU9LU0JJVDFkRlZrVlNJRU5CVlZORlJDQkJUa1JjYmlBZ1QwNGdRVTVaSUZSSVJVOVNXU0JQUmlCTVNVRkNTVXhKVkZrc0lGZElSVlJJUlZJZ1NVNGdRMDlPVkZKQlExUXNJRk5VVWtsRFZDQk1TVUZDU1V4SlZGa3NJRTlTSUZSUFVsUmNiaUFnS0VsT1EweFZSRWxPUnlCT1JVZE1TVWRGVGtORklFOVNJRTlVU0VWU1YwbFRSU2tnUVZKSlUwbE9SeUJKVGlCQlRsa2dWMEZaSUU5VlZDQlBSaUJVU0VVZ1ZWTkZJRTlHWEc0Z0lGUklTVk1nVTA5R1ZGZEJVa1VzSUVWV1JVNGdTVVlnUVVSV1NWTkZSQ0JQUmlCVVNFVWdVRTlUVTBsQ1NVeEpWRmtnVDBZZ1UxVkRTQ0JFUVUxQlIwVXVYRzRxTDF4dVhHNHZLbWRzYjJKaGJDQmxlSEJ2Y25Sek9uUnlkV1VzSUhKbGNYVnBjbVU2ZEhKMVpTd2daMnh2WW1Gc09uUnlkV1VxTDF4dUtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JpQWdJQ0IyWVhJZ1UzbHVkR0Y0TEZ4dUlDQWdJQ0FnSUNCUWNtVmpaV1JsYm1ObExGeHVJQ0FnSUNBZ0lDQkNhVzVoY25sUWNtVmpaV1JsYm1ObExGeHVJQ0FnSUNBZ0lDQlRiM1Z5WTJWT2IyUmxMRnh1SUNBZ0lDQWdJQ0JsYzNSeVlYWmxjbk5sTEZ4dUlDQWdJQ0FnSUNCbGMzVjBhV3h6TEZ4dUlDQWdJQ0FnSUNCcGMwRnljbUY1TEZ4dUlDQWdJQ0FnSUNCaVlYTmxMRnh1SUNBZ0lDQWdJQ0JwYm1SbGJuUXNYRzRnSUNBZ0lDQWdJR3B6YjI0c1hHNGdJQ0FnSUNBZ0lISmxiblZ0WW1WeUxGeHVJQ0FnSUNBZ0lDQm9aWGhoWkdWamFXMWhiQ3hjYmlBZ0lDQWdJQ0FnY1hWdmRHVnpMRnh1SUNBZ0lDQWdJQ0JsYzJOaGNHVnNaWE56TEZ4dUlDQWdJQ0FnSUNCdVpYZHNhVzVsTEZ4dUlDQWdJQ0FnSUNCemNHRmpaU3hjYmlBZ0lDQWdJQ0FnY0dGeVpXNTBhR1Z6WlhNc1hHNGdJQ0FnSUNBZ0lITmxiV2xqYjJ4dmJuTXNYRzRnSUNBZ0lDQWdJSE5oWm1WRGIyNWpZWFJsYm1GMGFXOXVMRnh1SUNBZ0lDQWdJQ0JrYVhKbFkzUnBkbVVzWEc0Z0lDQWdJQ0FnSUdWNGRISmhMRnh1SUNBZ0lDQWdJQ0J3WVhKelpTeGNiaUFnSUNBZ0lDQWdjMjkxY21ObFRXRndMRnh1SUNBZ0lDQWdJQ0J6YjNWeVkyVkRiMlJsTEZ4dUlDQWdJQ0FnSUNCd2NtVnpaWEoyWlVKc1lXNXJUR2x1WlhNc1hHNGdJQ0FnSUNBZ0lFWlBVazFCVkY5TlNVNUpSbGtzWEc0Z0lDQWdJQ0FnSUVaUFVrMUJWRjlFUlVaQlZVeFVVenRjYmx4dUlDQWdJR1Z6ZEhKaGRtVnljMlVnUFNCeVpYRjFhWEpsS0NkbGMzUnlZWFpsY25ObEp5azdYRzRnSUNBZ1pYTjFkR2xzY3lBOUlISmxjWFZwY21Vb0oyVnpkWFJwYkhNbktUdGNibHh1SUNBZ0lGTjViblJoZUNBOUlHVnpkSEpoZG1WeWMyVXVVM2x1ZEdGNE8xeHVYRzRnSUNBZ0x5OGdSMlZ1WlhKaGRHbHZiaUJwY3lCa2IyNWxJR0o1SUdkbGJtVnlZWFJsUlhod2NtVnpjMmx2Ymk1Y2JpQWdJQ0JtZFc1amRHbHZiaUJwYzBWNGNISmxjM05wYjI0b2JtOWtaU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnUTI5a1pVZGxibVZ5WVhSdmNpNUZlSEJ5WlhOemFXOXVMbWhoYzA5M2JsQnliM0JsY25SNUtHNXZaR1V1ZEhsd1pTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdSMlZ1WlhKaGRHbHZiaUJwY3lCa2IyNWxJR0o1SUdkbGJtVnlZWFJsVTNSaGRHVnRaVzUwTGx4dUlDQWdJR1oxYm1OMGFXOXVJR2x6VTNSaGRHVnRaVzUwS0c1dlpHVXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRU52WkdWSFpXNWxjbUYwYjNJdVUzUmhkR1Z0Wlc1MExtaGhjMDkzYmxCeWIzQmxjblI1S0c1dlpHVXVkSGx3WlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnVUhKbFkyVmtaVzVqWlNBOUlIdGNiaUFnSUNBZ0lDQWdVMlZ4ZFdWdVkyVTZJREFzWEc0Z0lDQWdJQ0FnSUZscFpXeGtPaUF4TEZ4dUlDQWdJQ0FnSUNCQmQyRnBkRG9nTVN4Y2JpQWdJQ0FnSUNBZ1FYTnphV2R1YldWdWREb2dNU3hjYmlBZ0lDQWdJQ0FnUTI5dVpHbDBhVzl1WVd3NklESXNYRzRnSUNBZ0lDQWdJRUZ5Y205M1JuVnVZM1JwYjI0NklESXNYRzRnSUNBZ0lDQWdJRXh2WjJsallXeFBVam9nTXl4Y2JpQWdJQ0FnSUNBZ1RHOW5hV05oYkVGT1JEb2dOQ3hjYmlBZ0lDQWdJQ0FnUW1sMGQybHpaVTlTT2lBMUxGeHVJQ0FnSUNBZ0lDQkNhWFIzYVhObFdFOVNPaUEyTEZ4dUlDQWdJQ0FnSUNCQ2FYUjNhWE5sUVU1RU9pQTNMRnh1SUNBZ0lDQWdJQ0JGY1hWaGJHbDBlVG9nT0N4Y2JpQWdJQ0FnSUNBZ1VtVnNZWFJwYjI1aGJEb2dPU3hjYmlBZ0lDQWdJQ0FnUW1sMGQybHpaVk5JU1VaVU9pQXhNQ3hjYmlBZ0lDQWdJQ0FnUVdSa2FYUnBkbVU2SURFeExGeHVJQ0FnSUNBZ0lDQk5kV3gwYVhCc2FXTmhkR2wyWlRvZ01USXNYRzRnSUNBZ0lDQWdJRlZ1WVhKNU9pQXhNeXhjYmlBZ0lDQWdJQ0FnVUc5emRHWnBlRG9nTVRRc1hHNGdJQ0FnSUNBZ0lFTmhiR3c2SURFMUxGeHVJQ0FnSUNBZ0lDQk9aWGM2SURFMkxGeHVJQ0FnSUNBZ0lDQlVZV2RuWldSVVpXMXdiR0YwWlRvZ01UY3NYRzRnSUNBZ0lDQWdJRTFsYldKbGNqb2dNVGdzWEc0Z0lDQWdJQ0FnSUZCeWFXMWhjbms2SURFNVhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUVKcGJtRnllVkJ5WldObFpHVnVZMlVnUFNCN1hHNGdJQ0FnSUNBZ0lDZDhmQ2M2SUZCeVpXTmxaR1Z1WTJVdVRHOW5hV05oYkU5U0xGeHVJQ0FnSUNBZ0lDQW5KaVluT2lCUWNtVmpaV1JsYm1ObExreHZaMmxqWVd4QlRrUXNYRzRnSUNBZ0lDQWdJQ2Q4SnpvZ1VISmxZMlZrWlc1alpTNUNhWFIzYVhObFQxSXNYRzRnSUNBZ0lDQWdJQ2RlSnpvZ1VISmxZMlZrWlc1alpTNUNhWFIzYVhObFdFOVNMRnh1SUNBZ0lDQWdJQ0FuSmljNklGQnlaV05sWkdWdVkyVXVRbWwwZDJselpVRk9SQ3hjYmlBZ0lDQWdJQ0FnSnowOUp6b2dVSEpsWTJWa1pXNWpaUzVGY1hWaGJHbDBlU3hjYmlBZ0lDQWdJQ0FnSnlFOUp6b2dVSEpsWTJWa1pXNWpaUzVGY1hWaGJHbDBlU3hjYmlBZ0lDQWdJQ0FnSnowOVBTYzZJRkJ5WldObFpHVnVZMlV1UlhGMVlXeHBkSGtzWEc0Z0lDQWdJQ0FnSUNjaFBUMG5PaUJRY21WalpXUmxibU5sTGtWeGRXRnNhWFI1TEZ4dUlDQWdJQ0FnSUNBbmFYTW5PaUJRY21WalpXUmxibU5sTGtWeGRXRnNhWFI1TEZ4dUlDQWdJQ0FnSUNBbmFYTnVkQ2M2SUZCeVpXTmxaR1Z1WTJVdVJYRjFZV3hwZEhrc1hHNGdJQ0FnSUNBZ0lDYzhKem9nVUhKbFkyVmtaVzVqWlM1U1pXeGhkR2x2Ym1Gc0xGeHVJQ0FnSUNBZ0lDQW5QaWM2SUZCeVpXTmxaR1Z1WTJVdVVtVnNZWFJwYjI1aGJDeGNiaUFnSUNBZ0lDQWdKenc5SnpvZ1VISmxZMlZrWlc1alpTNVNaV3hoZEdsdmJtRnNMRnh1SUNBZ0lDQWdJQ0FuUGowbk9pQlFjbVZqWldSbGJtTmxMbEpsYkdGMGFXOXVZV3dzWEc0Z0lDQWdJQ0FnSUNkcGJpYzZJRkJ5WldObFpHVnVZMlV1VW1Wc1lYUnBiMjVoYkN4Y2JpQWdJQ0FnSUNBZ0oybHVjM1JoYm1ObGIyWW5PaUJRY21WalpXUmxibU5sTGxKbGJHRjBhVzl1WVd3c1hHNGdJQ0FnSUNBZ0lDYzhQQ2M2SUZCeVpXTmxaR1Z1WTJVdVFtbDBkMmx6WlZOSVNVWlVMRnh1SUNBZ0lDQWdJQ0FuUGo0bk9pQlFjbVZqWldSbGJtTmxMa0pwZEhkcGMyVlRTRWxHVkN4Y2JpQWdJQ0FnSUNBZ0p6NCtQaWM2SUZCeVpXTmxaR1Z1WTJVdVFtbDBkMmx6WlZOSVNVWlVMRnh1SUNBZ0lDQWdJQ0FuS3ljNklGQnlaV05sWkdWdVkyVXVRV1JrYVhScGRtVXNYRzRnSUNBZ0lDQWdJQ2N0SnpvZ1VISmxZMlZrWlc1alpTNUJaR1JwZEdsMlpTeGNiaUFnSUNBZ0lDQWdKeW9uT2lCUWNtVmpaV1JsYm1ObExrMTFiSFJwY0d4cFkyRjBhWFpsTEZ4dUlDQWdJQ0FnSUNBbkpTYzZJRkJ5WldObFpHVnVZMlV1VFhWc2RHbHdiR2xqWVhScGRtVXNYRzRnSUNBZ0lDQWdJQ2N2SnpvZ1VISmxZMlZrWlc1alpTNU5kV3gwYVhCc2FXTmhkR2wyWlZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0F2TDBac1lXZHpYRzRnSUNBZ2RtRnlJRVpmUVV4TVQxZGZTVTRnUFNBeExGeHVJQ0FnSUNBZ0lDQkdYMEZNVEU5WFgwTkJURXdnUFNBeElEdzhJREVzWEc0Z0lDQWdJQ0FnSUVaZlFVeE1UMWRmVlU1UVFWSkJWRWhmVGtWWElEMGdNU0E4UENBeUxGeHVJQ0FnSUNBZ0lDQkdYMFpWVGtOZlFrOUVXU0E5SURFZ1BEd2dNeXhjYmlBZ0lDQWdJQ0FnUmw5RVNWSkZRMVJKVmtWZlExUllJRDBnTVNBOFBDQTBMRnh1SUNBZ0lDQWdJQ0JHWDFORlRVbERUMHhQVGw5UFVGUWdQU0F4SUR3OElEVTdYRzVjYmlBZ0lDQXZMMFY0Y0hKbGMzTnBiMjRnWm14aFp5QnpaWFJ6WEc0Z0lDQWdMeTlPVDFSRk9pQkdiR0ZuSUc5eVpHVnlPbHh1SUNBZ0lDOHZJRVpmUVV4TVQxZGZTVTVjYmlBZ0lDQXZMeUJHWDBGTVRFOVhYME5CVEV4Y2JpQWdJQ0F2THlCR1gwRk1URTlYWDFWT1VFRlNRVlJJWDA1RlYxeHVJQ0FnSUhaaGNpQkZYMFpVVkNBOUlFWmZRVXhNVDFkZlEwRk1UQ0I4SUVaZlFVeE1UMWRmVlU1UVFWSkJWRWhmVGtWWExGeHVJQ0FnSUNBZ0lDQkZYMVJVUmlBOUlFWmZRVXhNVDFkZlNVNGdmQ0JHWDBGTVRFOVhYME5CVEV3c1hHNGdJQ0FnSUNBZ0lFVmZWRlJVSUQwZ1JsOUJURXhQVjE5SlRpQjhJRVpmUVV4TVQxZGZRMEZNVENCOElFWmZRVXhNVDFkZlZVNVFRVkpCVkVoZlRrVlhMRnh1SUNBZ0lDQWdJQ0JGWDFSR1JpQTlJRVpmUVV4TVQxZGZTVTRzWEc0Z0lDQWdJQ0FnSUVWZlJrWlVJRDBnUmw5QlRFeFBWMTlWVGxCQlVrRlVTRjlPUlZjc1hHNGdJQ0FnSUNBZ0lFVmZWRVpVSUQwZ1JsOUJURXhQVjE5SlRpQjhJRVpmUVV4TVQxZGZWVTVRUVZKQlZFaGZUa1ZYTzF4dVhHNGdJQ0FnTHk5VGRHRjBaVzFsYm5RZ1pteGhaeUJ6WlhSelhHNGdJQ0FnTHk5T1QxUkZPaUJHYkdGbklHOXlaR1Z5T2x4dUlDQWdJQzh2SUVaZlFVeE1UMWRmU1U1Y2JpQWdJQ0F2THlCR1gwWlZUa05mUWs5RVdWeHVJQ0FnSUM4dklFWmZSRWxTUlVOVVNWWkZYME5VV0Z4dUlDQWdJQzh2SUVaZlUwVk5TVU5QVEU5T1gwOVFWRnh1SUNBZ0lIWmhjaUJUWDFSR1JrWWdQU0JHWDBGTVRFOVhYMGxPTEZ4dUlDQWdJQ0FnSUNCVFgxUkdSbFFnUFNCR1gwRk1URTlYWDBsT0lId2dSbDlUUlUxSlEwOU1UMDVmVDFCVUxGeHVJQ0FnSUNBZ0lDQlRYMFpHUmtZZ1BTQXdlREF3TEZ4dUlDQWdJQ0FnSUNCVFgxUkdWRVlnUFNCR1gwRk1URTlYWDBsT0lId2dSbDlFU1ZKRlExUkpWa1ZmUTFSWUxGeHVJQ0FnSUNBZ0lDQlRYMVJVUmtZZ1BTQkdYMEZNVEU5WFgwbE9JSHdnUmw5R1ZVNURYMEpQUkZrN1hHNWNiaUFnSUNCbWRXNWpkR2x2YmlCblpYUkVaV1poZFd4MFQzQjBhVzl1Y3lncElIdGNiaUFnSUNBZ0lDQWdMeThnWkdWbVlYVnNkQ0J2Y0hScGIyNXpYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxiblE2SUc1MWJHd3NYRzRnSUNBZ0lDQWdJQ0FnSUNCaVlYTmxPaUJ1ZFd4c0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnY0dGeWMyVTZJRzUxYkd3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqYjIxdFpXNTBPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUdadmNtMWhkRG9nZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsdVpHVnVkRG9nZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkSGxzWlRvZ0p5QWdJQ0FuTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWE5sT2lBd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWkdwMWMzUk5kV3gwYVd4cGJtVkRiMjF0Wlc1ME9pQm1ZV3h6WlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtVjNiR2x1WlRvZ0oxeGNiaWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNCaFkyVTZJQ2NnSnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcWMyOXVPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaVzUxYldKbGNqb2dabUZzYzJVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FHVjRZV1JsWTJsdFlXdzZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIRjFiM1JsY3pvZ0ozTnBibWRzWlNjc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pYTmpZWEJsYkdWemN6b2dabUZzYzJVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXRjR0ZqZERvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0dGeVpXNTBhR1Z6WlhNNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWdGFXTnZiRzl1Y3pvZ2RISjFaU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WVdabFEyOXVZMkYwWlc1aGRHbHZiam9nWm1Gc2MyVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEpsYzJWeWRtVkNiR0Z1YTB4cGJtVnpPaUJtWVd4elpWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzF2ZWpvZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiWEJ5WldobGJuTnBiMjVGZUhCeVpYTnphVzl1VTNSaGNuUnpWMmwwYUVGemMybG5ibTFsYm5RNklHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMFlYSnNaWE56UjJWdVpYSmhkRzl5T2lCbVlXeHpaVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhOdmRYSmpaVTFoY0RvZ2JuVnNiQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lITnZkWEpqWlUxaGNGSnZiM1E2SUc1MWJHd3NYRzRnSUNBZ0lDQWdJQ0FnSUNCemIzVnlZMlZOWVhCWGFYUm9RMjlrWlRvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmthWEpsWTNScGRtVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnY21GM09pQjBjblZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdkbVZ5WW1GMGFXMDZJRzUxYkd3c1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6YjNWeVkyVkRiMlJsT2lCdWRXeHNYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdjM1J5YVc1blVtVndaV0YwS0hOMGNpd2diblZ0S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUWdQU0FuSnp0Y2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0c1MWJTQjhQU0F3T3lCdWRXMGdQaUF3T3lCdWRXMGdQajQrUFNBeExDQnpkSElnS3owZ2MzUnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYm5WdElDWWdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0FyUFNCemRISTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdselFYSnlZWGtnUFNCQmNuSmhlUzVwYzBGeWNtRjVPMXh1SUNBZ0lHbG1JQ2doYVhOQmNuSmhlU2tnZTF4dUlDQWdJQ0FnSUNCcGMwRnljbUY1SUQwZ1puVnVZM1JwYjI0Z2FYTkJjbkpoZVNoaGNuSmhlU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jdVkyRnNiQ2hoY25KaGVTa2dQVDA5SUNkYmIySnFaV04wSUVGeWNtRjVYU2M3WEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYUdGelRHbHVaVlJsY20xcGJtRjBiM0lvYzNSeUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9MMXRjWEhKY1hHNWRMMmNwTG5SbGMzUW9jM1J5S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJsYm1SelYybDBhRXhwYm1WVVpYSnRhVzVoZEc5eUtITjBjaWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdiR1Z1SUQwZ2MzUnlMbXhsYm1kMGFEdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHeGxiaUFtSmlCbGMzVjBhV3h6TG1OdlpHVXVhWE5NYVc1bFZHVnliV2x1WVhSdmNpaHpkSEl1WTJoaGNrTnZaR1ZCZENoc1pXNGdMU0F4S1NrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYldWeVoyVW9kR0Z5WjJWMExDQnZkbVZ5Y21sa1pTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2EyVjVPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHdGxlU0JwYmlCdmRtVnljbWxrWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOTJaWEp5YVdSbExtaGhjMDkzYmxCeWIzQmxjblI1S0d0bGVTa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUmJhMlY1WFNBOUlHOTJaWEp5YVdSbFcydGxlVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJoY21kbGREdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCMWNHUmhkR1ZFWldWd2JIa29kR0Z5WjJWMExDQnZkbVZ5Y21sa1pTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2EyVjVMQ0IyWVd3N1hHNWNiaUFnSUNBZ0lDQWdablZ1WTNScGIyNGdhWE5JWVhOb1QySnFaV04wS0hSaGNtZGxkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUjVjR1Z2WmlCMFlYSm5aWFFnUFQwOUlDZHZZbXBsWTNRbklDWW1JSFJoY21kbGRDQnBibk4wWVc1alpXOW1JRTlpYW1WamRDQW1KaUFoS0hSaGNtZGxkQ0JwYm5OMFlXNWpaVzltSUZKbFowVjRjQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0d0bGVTQnBiaUJ2ZG1WeWNtbGtaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5MlpYSnlhV1JsTG1oaGMwOTNibEJ5YjNCbGNuUjVLR3RsZVNrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZV3dnUFNCdmRtVnljbWxrWlZ0clpYbGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNocGMwaGhjMmhQWW1wbFkzUW9kbUZzS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FYTklZWE5vVDJKcVpXTjBLSFJoY21kbGRGdHJaWGxkS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYQmtZWFJsUkdWbGNHeDVLSFJoY21kbGRGdHJaWGxkTENCMllXd3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBXMnRsZVYwZ1BTQjFjR1JoZEdWRVpXVndiSGtvZTMwc0lIWmhiQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUmJhMlY1WFNBOUlIWmhiRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJoY21kbGREdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCblpXNWxjbUYwWlU1MWJXSmxjaWgyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTENCd2IybHVkQ3dnZEdWdGNDd2daWGh3YjI1bGJuUXNJSEJ2Y3p0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvZG1Gc2RXVWdJVDA5SUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owNTFiV1Z5YVdNZ2JHbDBaWEpoYkNCM2FHOXpaU0IyWVd4MVpTQnBjeUJPWVU0bktUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JwWmlBb2RtRnNkV1VnUENBd0lIeDhJQ2gyWVd4MVpTQTlQVDBnTUNBbUppQXhJQzhnZG1Gc2RXVWdQQ0F3S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RPZFcxbGNtbGpJR3hwZEdWeVlXd2dkMmh2YzJVZ2RtRnNkV1VnYVhNZ2JtVm5ZWFJwZG1VbktUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaDJZV3gxWlNBOVBUMGdNU0F2SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJxYzI5dUlEOGdKMjUxYkd3bklEb2djbVZ1ZFcxaVpYSWdQeUFuTVdVME1EQW5JRG9nSnpGbEt6UXdNQ2M3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQW5KeUFySUhaaGJIVmxPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lYSmxiblZ0WW1WeUlIeDhJSEpsYzNWc2RDNXNaVzVuZEdnZ1BDQXpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjRzlwYm5RZ1BTQnlaWE4xYkhRdWFXNWtaWGhQWmlnbkxpY3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXcHpiMjRnSmlZZ2NtVnpkV3gwTG1Ob1lYSkRiMlJsUVhRb01Da2dQVDA5SURCNE16QWdJQzhxSURBZ0tpOGdKaVlnY0c5cGJuUWdQVDA5SURFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhCdmFXNTBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJSEpsYzNWc2RDNXpiR2xqWlNneEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IwWlcxd0lEMGdjbVZ6ZFd4ME8xeHVJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnlaWE4xYkhRdWNtVndiR0ZqWlNnblpTc25MQ0FuWlNjcE8xeHVJQ0FnSUNBZ0lDQmxlSEJ2Ym1WdWRDQTlJREE3WEc0Z0lDQWdJQ0FnSUdsbUlDZ29jRzl6SUQwZ2RHVnRjQzVwYm1SbGVFOW1LQ2RsSnlrcElENGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdaWGh3YjI1bGJuUWdQU0FyZEdWdGNDNXpiR2xqWlNod2IzTWdLeUF4S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJsYlhBZ1BTQjBaVzF3TG5Oc2FXTmxLREFzSUhCdmN5azdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tIQnZhVzUwSUQ0OUlEQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHVjRjRzl1Wlc1MElDMDlJSFJsYlhBdWJHVnVaM1JvSUMwZ2NHOXBiblFnTFNBeE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdWdGNDQTlJQ3NvZEdWdGNDNXpiR2xqWlNnd0xDQndiMmx1ZENrZ0t5QjBaVzF3TG5Oc2FXTmxLSEJ2YVc1MElDc2dNU2twSUNzZ0p5YzdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY0c5eklEMGdNRHRjYmlBZ0lDQWdJQ0FnZDJocGJHVWdLSFJsYlhBdVkyaGhja052WkdWQmRDaDBaVzF3TG14bGJtZDBhQ0FySUhCdmN5QXRJREVwSUQwOVBTQXdlRE13SUNBdktpQXdJQ292S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F0TFhCdmN6dGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JwWmlBb2NHOXpJQ0U5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGVIQnZibVZ1ZENBdFBTQndiM003WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBaVzF3SUQwZ2RHVnRjQzV6YkdsalpTZ3dMQ0J3YjNNcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNobGVIQnZibVZ1ZENBaFBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR1Z0Y0NBclBTQW5aU2NnS3lCbGVIQnZibVZ1ZER0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnBaaUFvS0hSbGJYQXViR1Z1WjNSb0lEd2djbVZ6ZFd4MExteGxibWQwYUNCOGZGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvYUdWNFlXUmxZMmx0WVd3Z0ppWWdkbUZzZFdVZ1BpQXhaVEV5SUNZbUlFMWhkR2d1Wm14dmIzSW9kbUZzZFdVcElEMDlQU0IyWVd4MVpTQW1KaUFvZEdWdGNDQTlJQ2N3ZUNjZ0t5QjJZV3gxWlM1MGIxTjBjbWx1WnlneE5pa3BMbXhsYm1kMGFDQThJSEpsYzNWc2RDNXNaVzVuZEdncEtTQW1KbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3QwWlcxd0lEMDlQU0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RHVnRjRHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeThnUjJWdVpYSmhkR1VnZG1Gc2FXUWdVbVZuUlhod0lHVjRjSEpsYzNOcGIyNHVYRzRnSUNBZ0x5OGdWR2hwY3lCbWRXNWpkR2x2YmlCcGN5QmlZWE5sWkNCdmJpQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZRMjl1YzNSbGJHeGhkR2x2Ymk5cGRpQkZibWRwYm1WY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUdWelkyRndaVkpsWjBWNGNFTm9ZWEpoWTNSbGNpaGphQ3dnY0hKbGRtbHZkWE5KYzBKaFkydHpiR0Z6YUNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1YjNRZ2FHRnVaR3hwYm1jZ0oxeGNKeUJoYm1RZ2FHRnVaR3hwYm1jZ1hGeDFNakF5T0NCdmNpQmNYSFV5TURJNUlIUnZJSFZ1YVdOdlpHVWdaWE5qWVhCbElITmxjWFZsYm1ObFhHNGdJQ0FnSUNBZ0lHbG1JQ2dvWTJnZ0ppQitNU2tnUFQwOUlEQjRNakF5T0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2h3Y21WMmFXOTFjMGx6UW1GamEzTnNZWE5vSUQ4Z0ozVW5JRG9nSjF4Y1hGeDFKeWtnS3lBb0tHTm9JRDA5UFNBd2VESXdNamdwSUQ4Z0p6SXdNamduSURvZ0p6SXdNamtuS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGphQ0E5UFQwZ01UQWdmSHdnWTJnZ1BUMDlJREV6S1NCN0lDQXZMeUJjWEc0c0lGeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNod2NtVjJhVzkxYzBselFtRmphM05zWVhOb0lEOGdKeWNnT2lBblhGeGNYQ2NwSUNzZ0tDaGphQ0E5UFQwZ01UQXBJRDhnSjI0bklEb2dKM0luS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1UzUnlhVzVuTG1aeWIyMURhR0Z5UTI5a1pTaGphQ2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdaMlZ1WlhKaGRHVlNaV2RGZUhBb2NtVm5LU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnRZWFJqYUN3Z2NtVnpkV3gwTENCbWJHRm5jeXdnYVN3Z2FYb3NJR05vTENCamFHRnlZV04wWlhKSmJrSnlZV05yTENCd2NtVjJhVzkxYzBselFtRmphM05zWVhOb08xeHVYRzRnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJSEpsWnk1MGIxTjBjbWx1WnlncE8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNoeVpXY3VjMjkxY21ObEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmxlSFJ5WVdOMElHWnNZV2NnWm5KdmJTQjBiMU4wY21sdVp5QnlaWE4xYkhSY2JpQWdJQ0FnSUNBZ0lDQWdJRzFoZEdOb0lEMGdjbVZ6ZFd4MExtMWhkR05vS0M5Y1hDOG9XMTR2WFNvcEpDOHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z0WVhSamFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR1pzWVdkeklEMGdiV0YwWTJoYk1WMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNBbkp6dGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ1kyaGhjbUZqZEdWeVNXNUNjbUZqYXlBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjSEpsZG1sdmRYTkpjMEpoWTJ0emJHRnphQ0E5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Dd2dhWG9nUFNCeVpXY3VjMjkxY21ObExteGxibWQwYURzZ2FTQThJR2w2T3lBcksya3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUNBOUlISmxaeTV6YjNWeVkyVXVZMmhoY2tOdlpHVkJkQ2hwS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doY0hKbGRtbHZkWE5KYzBKaFkydHpiR0Z6YUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyaGhjbUZqZEdWeVNXNUNjbUZqYXlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR05vSUQwOVBTQTVNeWtnZXlBZ0x5OGdYVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb1lYSmhZM1JsY2tsdVFuSmhZMnNnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGphQ0E5UFQwZ05EY3BJSHNnSUM4dklDOWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdLejBnSjF4Y1hGd25PMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYUNBOVBUMGdPVEVwSUhzZ0lDOHZJRnRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamFHRnlZV04wWlhKSmJrSnlZV05ySUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdLejBnWlhOallYQmxVbVZuUlhod1EyaGhjbUZqZEdWeUtHTm9MQ0J3Y21WMmFXOTFjMGx6UW1GamEzTnNZWE5vS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEpsZG1sdmRYTkpjMEpoWTJ0emJHRnphQ0E5SUdOb0lEMDlQU0E1TWpzZ0lDOHZJRnhjWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhV1lnYm1WM0lGSmxaMFY0Y0NoY0lseGNYRnhjWEc0bktTQnBjeUJ3Y205MmFXUmxaQ3dnWTNKbFlYUmxJQzljWEc0dlhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQXJQU0JsYzJOaGNHVlNaV2RGZUhCRGFHRnlZV04wWlhJb1kyZ3NJSEJ5WlhacGIzVnpTWE5DWVdOcmMyeGhjMmdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ3Y21WMlpXNTBJR3hwYTJVZ0wxeGNYRnhiTDEwdlhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJ5WlhacGIzVnpTWE5DWVdOcmMyeGhjMmdnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBbkx5Y2dLeUJ5WlhOMWJIUWdLeUFuTHljZ0t5Qm1iR0ZuY3p0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnWlhOallYQmxRV3hzYjNkbFpFTm9ZWEpoWTNSbGNpaGpiMlJsTENCdVpYaDBLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQm9aWGc3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLR052WkdVZ1BUMDlJREI0TURnZ0lDOHFJRnhjWWlBcUx5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNkY1hGeGNZaWM3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvWTI5a1pTQTlQVDBnTUhnd1F5QWdMeW9nWEZ4bUlDb3ZLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0oxeGNYRnhtSnp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoamIyUmxJRDA5UFNBd2VEQTVJQ0F2S2lCY1hIUWdLaThwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW5YRnhjWEhRbk8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYUdWNElEMGdZMjlrWlM1MGIxTjBjbWx1WnlneE5pa3VkRzlWY0hCbGNrTmhjMlVvS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLR3B6YjI0Z2ZId2dZMjlrWlNBK0lEQjRSa1lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW5YRnhjWEhVbklDc2dKekF3TURBbkxuTnNhV05sS0dobGVDNXNaVzVuZEdncElDc2dhR1Y0TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHTnZaR1VnUFQwOUlEQjRNREF3TUNBbUppQWhaWE4xZEdsc2N5NWpiMlJsTG1selJHVmphVzFoYkVScFoybDBLRzVsZUhRcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSjF4Y1hGd3dKenRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoamIyUmxJRDA5UFNBd2VEQXdNRUlnSUM4cUlGeGNkaUFxTHlrZ2V5QXZMeUFuWEZ4MkoxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2RjWEZ4Y2VEQkNKenRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBblhGeGNYSGduSUNzZ0p6QXdKeTV6YkdsalpTaG9aWGd1YkdWdVozUm9LU0FySUdobGVEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHVnpZMkZ3WlVScGMyRnNiRzkzWldSRGFHRnlZV04wWlhJb1kyOWtaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9ZMjlrWlNBOVBUMGdNSGcxUXlBZ0x5b2dYRndnS2k4cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuWEZ4Y1hGeGNYRnduTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0dOdlpHVWdQVDA5SURCNE1FRWdJQzhxSUZ4Y2JpQXFMeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDZGNYRnhjYmljN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JwWmlBb1kyOWtaU0E5UFQwZ01IZ3dSQ0FnTHlvZ1hGeHlJQ292S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdKMXhjWEZ4eUp6dGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaGpiMlJsSUQwOVBTQXdlREl3TWpncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuWEZ4Y1hIVXlNREk0Snp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoamIyUmxJRDA5UFNBd2VESXdNamtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW5YRnhjWEhVeU1ESTVKenRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblNXNWpiM0p5WldOMGJIa2dZMnhoYzNOcFptbGxaQ0JqYUdGeVlXTjBaWEluS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJsYzJOaGNHVkVhWEpsWTNScGRtVW9jM1J5S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJwTENCcGVpd2dZMjlrWlN3Z2NYVnZkR1U3WEc1Y2JpQWdJQ0FnSUNBZ2NYVnZkR1VnUFNCeGRXOTBaWE1nUFQwOUlDZGtiM1ZpYkdVbklEOGdKMXdpSnlBNklDZGNYQ2NuTzF4dUlDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBd0xDQnBlaUE5SUhOMGNpNXNaVzVuZEdnN0lHa2dQQ0JwZWpzZ0t5dHBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMlJsSUQwZ2MzUnlMbU5vWVhKRGIyUmxRWFFvYVNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyOWtaU0E5UFQwZ01IZ3lOeUFnTHlvZ0p5QXFMeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGMWIzUmxJRDBnSjF3aUp6dGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWTI5a1pTQTlQVDBnTUhneU1pQWdMeW9nWENJZ0tpOHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4ZFc5MFpTQTlJQ2RjWENjbk8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYjJSbElEMDlQU0F3ZURWRElDQXZLaUJjWENBcUx5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3NyYVR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeGRXOTBaU0FySUhOMGNpQXJJSEYxYjNSbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUdWelkyRndaVk4wY21sdVp5aHpkSElwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJQ2NuTENCcExDQnNaVzRzSUdOdlpHVXNJSE5wYm1kc1pWRjFiM1JsY3lBOUlEQXNJR1J2ZFdKc1pWRjFiM1JsY3lBOUlEQXNJSE5wYm1kc1pTd2djWFZ2ZEdVN1hHNWNiaUFnSUNBZ0lDQWdabTl5SUNocElEMGdNQ3dnYkdWdUlEMGdjM1J5TG14bGJtZDBhRHNnYVNBOElHeGxianNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyUmxJRDBnYzNSeUxtTm9ZWEpEYjJSbFFYUW9hU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTI5a1pTQTlQVDBnTUhneU55QWdMeW9nSnlBcUx5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3NyYzJsdVoyeGxVWFZ2ZEdWek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoamIyUmxJRDA5UFNBd2VESXlJQ0F2S2lCY0lpQXFMeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNzclpHOTFZbXhsVVhWdmRHVnpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiMlJsSUQwOVBTQXdlREpHSUNBdktpQXZJQ292SUNZbUlHcHpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnS3owZ0oxeGNYRnduTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hsYzNWMGFXeHpMbU52WkdVdWFYTk1hVzVsVkdWeWJXbHVZWFJ2Y2loamIyUmxLU0I4ZkNCamIyUmxJRDA5UFNBd2VEVkRJQ0F2S2lCY1hDQXFMeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0FyUFNCbGMyTmhjR1ZFYVhOaGJHeHZkMlZrUTJoaGNtRmpkR1Z5S0dOdlpHVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2haWE4xZEdsc2N5NWpiMlJsTG1selNXUmxiblJwWm1sbGNsQmhjblJGVXpVb1kyOWtaU2tnSmlZZ0tHcHpiMjRnSmlZZ1kyOWtaU0E4SURCNE1qQWdJQzhxSUZOUUlDb3ZJSHg4SUNGcWMyOXVJQ1ltSUNGbGMyTmhjR1ZzWlhOeklDWW1JQ2hqYjJSbElEd2dNSGd5TUNBZ0x5b2dVMUFnS2k4Z2ZId2dZMjlrWlNBK0lEQjROMFVnSUM4cUlINGdLaThwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBclBTQmxjMk5oY0dWQmJHeHZkMlZrUTJoaGNtRmpkR1Z5S0dOdlpHVXNJSE4wY2k1amFHRnlRMjlrWlVGMEtHa2dLeUF4S1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ0t6MGdVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2hqYjJSbEtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhOcGJtZHNaU0E5SUNFb2NYVnZkR1Z6SUQwOVBTQW5aRzkxWW14bEp5QjhmQ0FvY1hWdmRHVnpJRDA5UFNBbllYVjBieWNnSmlZZ1pHOTFZbXhsVVhWdmRHVnpJRHdnYzJsdVoyeGxVWFZ2ZEdWektTazdYRzRnSUNBZ0lDQWdJSEYxYjNSbElEMGdjMmx1WjJ4bElEOGdKMXhjSnljZ09pQW5YQ0luTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2doS0hOcGJtZHNaU0EvSUhOcGJtZHNaVkYxYjNSbGN5QTZJR1J2ZFdKc1pWRjFiM1JsY3lrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ4ZFc5MFpTQXJJSEpsYzNWc2RDQXJJSEYxYjNSbE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYzNSeUlEMGdjbVZ6ZFd4ME8xeHVJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnhkVzkwWlR0Y2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdMQ0JzWlc0Z1BTQnpkSEl1YkdWdVozUm9PeUJwSUR3Z2JHVnVPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOdlpHVWdQU0J6ZEhJdVkyaGhja052WkdWQmRDaHBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2dvWTI5a1pTQTlQVDBnTUhneU55QWdMeW9nSnlBcUx5QW1KaUJ6YVc1bmJHVXBJSHg4SUNoamIyUmxJRDA5UFNBd2VESXlJQ0F2S2lCY0lpQXFMeUFtSmlBaGMybHVaMnhsS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBclBTQW5YRnhjWENjN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ0t6MGdVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2hqYjJSbEtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUWdLeUJ4ZFc5MFpUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdktpcGNiaUFnSUNBZ0tpQm1iR0YwZEdWdUlHRnVJR0Z5Y21GNUlIUnZJR0VnYzNSeWFXNW5MQ0IzYUdWeVpTQjBhR1VnWVhKeVlYa2dZMkZ1SUdOdmJuUmhhVzVjYmlBZ0lDQWdLaUJsYVhSb1pYSWdjM1J5YVc1bmN5QnZjaUJ1WlhOMFpXUWdZWEp5WVhselhHNGdJQ0FnSUNvdlhHNGdJQ0FnWm5WdVkzUnBiMjRnWm14aGRIUmxibFJ2VTNSeWFXNW5LR0Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVN3Z2FYb3NJR1ZzWlcwc0lISmxjM1ZzZENBOUlDY25PMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCcGVpQTlJR0Z5Y2k1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRJRDBnWVhKeVcybGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUNzOUlHbHpRWEp5WVhrb1pXeGxiU2tnUHlCbWJHRjBkR1Z1Vkc5VGRISnBibWNvWld4bGJTa2dPaUJsYkdWdE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNvZ1kyOXVkbVZ5ZENCblpXNWxjbUYwWldRZ2RHOGdZU0JUYjNWeVkyVk9iMlJsSUhkb1pXNGdjMjkxY21ObElHMWhjSE1nWVhKbElHVnVZV0pzWldRdVhHNGdJQ0FnSUNvdlhHNGdJQ0FnWm5WdVkzUnBiMjRnZEc5VGIzVnlZMlZPYjJSbFYyaGxiazVsWldSbFpDaG5aVzVsY21GMFpXUXNJRzV2WkdVcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGemIzVnlZMlZOWVhBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIZHBkR2dnYm04Z2MyOTFjbU5sSUcxaGNITXNJR2RsYm1WeVlYUmxaQ0JwY3lCbGFYUm9aWElnWVc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdGeWNtRjVJRzl5SUdFZ2MzUnlhVzVuTGlBZ2FXWWdZVzRnWVhKeVlYa3NJR1pzWVhSMFpXNGdhWFF1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWmlCaElITjBjbWx1Wnl3Z2FuVnpkQ0J5WlhSMWNtNGdhWFJjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYzBGeWNtRjVLR2RsYm1WeVlYUmxaQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm14aGRIUmxibFJ2VTNSeWFXNW5LR2RsYm1WeVlYUmxaQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCblpXNWxjbUYwWldRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2FXWWdLRzV2WkdVZ1BUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHZGxibVZ5WVhSbFpDQnBibk4wWVc1alpXOW1JRk52ZFhKalpVNXZaR1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWjJWdVpYSmhkR1ZrTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnViMlJsSUQwZ2UzMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdhV1lnS0c1dlpHVXViRzlqSUQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVTI5MWNtTmxUbTlrWlNodWRXeHNMQ0J1ZFd4c0xDQnpiM1Z5WTJWTllYQXNJR2RsYm1WeVlYUmxaQ3dnYm05a1pTNXVZVzFsSUh4OElHNTFiR3dwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVMjkxY21ObFRtOWtaU2h1YjJSbExteHZZeTV6ZEdGeWRDNXNhVzVsTENCdWIyUmxMbXh2WXk1emRHRnlkQzVqYjJ4MWJXNHNJQ2h6YjNWeVkyVk5ZWEFnUFQwOUlIUnlkV1VnUHlCdWIyUmxMbXh2WXk1emIzVnlZMlVnZkh3Z2JuVnNiQ0E2SUhOdmRYSmpaVTFoY0Nrc0lHZGxibVZ5WVhSbFpDd2dibTlrWlM1dVlXMWxJSHg4SUc1MWJHd3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHNXZSVzF3ZEhsVGNHRmpaU2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNoemNHRmpaU2tnUHlCemNHRmpaU0E2SUNjZ0p6dGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCcWIybHVLR3hsWm5Rc0lISnBaMmgwS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJzWldaMFUyOTFjbU5sTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbWxuYUhSVGIzVnlZMlVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaV1owUTJoaGNrTnZaR1VzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlhV2RvZEVOb1lYSkRiMlJsTzF4dVhHNGdJQ0FnSUNBZ0lHeGxablJUYjNWeVkyVWdQU0IwYjFOdmRYSmpaVTV2WkdWWGFHVnVUbVZsWkdWa0tHeGxablFwTG5SdlUzUnlhVzVuS0NrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hzWldaMFUyOTFjbU5sTG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUZ0eWFXZG9kRjA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnlhV2RvZEZOdmRYSmpaU0E5SUhSdlUyOTFjbU5sVG05a1pWZG9aVzVPWldWa1pXUW9jbWxuYUhRcExuUnZVM1J5YVc1bktDazdYRzRnSUNBZ0lDQWdJR2xtSUNoeWFXZG9kRk52ZFhKalpTNXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmJiR1ZtZEYwN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JzWldaMFEyaGhja052WkdVZ1BTQnNaV1owVTI5MWNtTmxMbU5vWVhKRGIyUmxRWFFvYkdWbWRGTnZkWEpqWlM1c1pXNW5kR2dnTFNBeEtUdGNiaUFnSUNBZ0lDQWdjbWxuYUhSRGFHRnlRMjlrWlNBOUlISnBaMmgwVTI5MWNtTmxMbU5vWVhKRGIyUmxRWFFvTUNrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0Noc1pXWjBRMmhoY2tOdlpHVWdQVDA5SURCNE1rSWdJQzhxSUNzZ0tpOGdmSHdnYkdWbWRFTm9ZWEpEYjJSbElEMDlQU0F3ZURKRUlDQXZLaUF0SUNvdktTQW1KaUJzWldaMFEyaGhja052WkdVZ1BUMDlJSEpwWjJoMFEyaGhja052WkdVZ2ZIeGNiaUFnSUNBZ0lDQWdJQ0FnSUdWemRYUnBiSE11WTI5a1pTNXBjMGxrWlc1MGFXWnBaWEpRWVhKMFJWTTFLR3hsWm5SRGFHRnlRMjlrWlNrZ0ppWWdaWE4xZEdsc2N5NWpiMlJsTG1selNXUmxiblJwWm1sbGNsQmhjblJGVXpVb2NtbG5hSFJEYUdGeVEyOWtaU2tnZkh4Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hsWm5SRGFHRnlRMjlrWlNBOVBUMGdNSGd5UmlBZ0x5b2dMeUFxTHlBbUppQnlhV2RvZEVOb1lYSkRiMlJsSUQwOVBTQXdlRFk1SUNBdktpQnBJQ292S1NCN0lDOHZJR2x1Wm1sNElIZHZjbVFnYjNCbGNtRjBiM0p6SUdGc2JDQnpkR0Z5ZENCM2FYUm9JR0JwWUZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdHNaV1owTENCdWIwVnRjSFI1VTNCaFkyVW9LU3dnY21sbmFIUmRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dWemRYUnBiSE11WTI5a1pTNXBjMWRvYVhSbFUzQmhZMlVvYkdWbWRFTm9ZWEpEYjJSbEtTQjhmQ0JsYzNWMGFXeHpMbU52WkdVdWFYTk1hVzVsVkdWeWJXbHVZWFJ2Y2loc1pXWjBRMmhoY2tOdlpHVXBJSHg4WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlhOMWRHbHNjeTVqYjJSbExtbHpWMmhwZEdWVGNHRmpaU2h5YVdkb2RFTm9ZWEpEYjJSbEtTQjhmQ0JsYzNWMGFXeHpMbU52WkdVdWFYTk1hVzVsVkdWeWJXbHVZWFJ2Y2loeWFXZG9kRU5vWVhKRGIyUmxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdHNaV1owTENCeWFXZG9kRjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUZ0c1pXWjBMQ0J6Y0dGalpTd2djbWxuYUhSZE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUdGa1pFbHVaR1Z1ZENoemRHMTBLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJiWW1GelpTd2djM1J0ZEYwN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnZDJsMGFFbHVaR1Z1ZENobWJpa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NISmxkbWx2ZFhOQ1lYTmxPMXh1SUNBZ0lDQWdJQ0J3Y21WMmFXOTFjMEpoYzJVZ1BTQmlZWE5sTzF4dUlDQWdJQ0FnSUNCaVlYTmxJQ3M5SUdsdVpHVnVkRHRjYmlBZ0lDQWdJQ0FnWm00b1ltRnpaU2s3WEc0Z0lDQWdJQ0FnSUdKaGMyVWdQU0J3Y21WMmFXOTFjMEpoYzJVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnWTJGc1kzVnNZWFJsVTNCaFkyVnpLSE4wY2lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVR0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ2MzUnlMbXhsYm1kMGFDQXRJREU3SUdrZ1BqMGdNRHNnTFMxcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWE4xZEdsc2N5NWpiMlJsTG1selRHbHVaVlJsY20xcGJtRjBiM0lvYzNSeUxtTm9ZWEpEYjJSbFFYUW9hU2twS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQ2h6ZEhJdWJHVnVaM1JvSUMwZ01Ta2dMU0JwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR0ZrYW5WemRFMTFiSFJwYkdsdVpVTnZiVzFsYm5Rb2RtRnNkV1VzSUhOd1pXTnBZV3hDWVhObEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaGNuSmhlU3dnYVN3Z2JHVnVMQ0JzYVc1bExDQnFMQ0J6Y0dGalpYTXNJSEJ5WlhacGIzVnpRbUZ6WlN3Z2MyNDdYRzVjYmlBZ0lDQWdJQ0FnWVhKeVlYa2dQU0IyWVd4MVpTNXpjR3hwZENndlhGeHlYRnh1ZkZ0Y1hISmNYRzVkTHlrN1hHNGdJQ0FnSUNBZ0lITndZV05sY3lBOUlFNTFiV0psY2k1TlFWaGZWa0ZNVlVVN1hHNWNiaUFnSUNBZ0lDQWdMeThnWm1seWMzUWdiR2x1WlNCa2IyVnpiaWQwSUdoaGRtVWdhVzVrWlc1MFlYUnBiMjVjYmlBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTVN3Z2JHVnVJRDBnWVhKeVlYa3ViR1Z1WjNSb095QnBJRHdnYkdWdU95QXJLMmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hwYm1VZ1BTQmhjbkpoZVZ0cFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdvZ1BTQXdPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2QyaHBiR1VnS0dvZ1BDQnNhVzVsTG14bGJtZDBhQ0FtSmlCbGMzVjBhV3h6TG1OdlpHVXVhWE5YYUdsMFpWTndZV05sS0d4cGJtVXVZMmhoY2tOdlpHVkJkQ2hxS1NrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXJLMm83WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM0JoWTJWeklENGdhaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOd1lXTmxjeUE5SUdvN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSE53WldOcFlXeENZWE5sSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnY0dGMGRHVnliaUJzYVd0bFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlBZ0lIWmhjaUIwSUQwZ01qQTdJQ0F2S2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ29nZEdocGN5QnBjeUJqYjIxdFpXNTBYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tpOWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpYWnBiM1Z6UW1GelpTQTlJR0poYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1lYSnlZWGxiTVYxYmMzQmhZMlZ6WFNBOVBUMGdKeW9uS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzQmxZMmxoYkVKaGMyVWdLejBnSnlBbk8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdZbUZ6WlNBOUlITndaV05wWVd4Q1lYTmxPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE53WVdObGN5QW1JREVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QXZLbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUNBcVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ292WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1NXWWdjM0JoWTJWeklHRnlaU0J2WkdRZ2JuVnRZbVZ5TENCaFltOTJaU0J3WVhSMFpYSnVJR2x6SUdOdmJuTnBaR1Z5WldRdVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdWMlVnZDJGemRHVWdNU0J6Y0dGalpTNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXRMWE53WVdObGN6dGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSEJ5WlhacGIzVnpRbUZ6WlNBOUlHSmhjMlU3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXhMQ0JzWlc0Z1BTQmhjbkpoZVM1c1pXNW5kR2c3SUdrZ1BDQnNaVzQ3SUNzcmFTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MyNGdQU0IwYjFOdmRYSmpaVTV2WkdWWGFHVnVUbVZsWkdWa0tHRmtaRWx1WkdWdWRDaGhjbkpoZVZ0cFhTNXpiR2xqWlNoemNHRmpaWE1wS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoY25KaGVWdHBYU0E5SUhOdmRYSmpaVTFoY0NBL0lITnVMbXB2YVc0b0p5Y3BJRG9nYzI0N1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JpWVhObElEMGdjSEpsZG1sdmRYTkNZWE5sTzF4dVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaGNuSmhlUzVxYjJsdUtDZGNYRzRuS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJuWlc1bGNtRjBaVU52YlcxbGJuUW9ZMjl0YldWdWRDd2djM0JsWTJsaGJFSmhjMlVwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR052YlcxbGJuUXVkSGx3WlNBOVBUMGdKMHhwYm1VbktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aVzVrYzFkcGRHaE1hVzVsVkdWeWJXbHVZWFJ2Y2loamIyMXRaVzUwTG5aaGJIVmxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuTHk4bklDc2dZMjl0YldWdWRDNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnUVd4M1lYbHpJSFZ6WlNCTWFXNWxWR1Z5YldsdVlYUnZjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYTjFiSFFnUFNBbkx5OG5JQ3NnWTI5dGJXVnVkQzUyWVd4MVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhCeVpYTmxjblpsUW14aGJtdE1hVzVsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdLejBnSjF4Y2JpYzdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2FXWWdLR1Y0ZEhKaExtWnZjbTFoZEM1cGJtUmxiblF1WVdScWRYTjBUWFZzZEdsc2FXNWxRMjl0YldWdWRDQW1KaUF2VzF4Y2JseGNjbDB2TG5SbGMzUW9ZMjl0YldWdWRDNTJZV3gxWlNrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJoWkdwMWMzUk5kV3gwYVd4cGJtVkRiMjF0Wlc1MEtDY3ZLaWNnS3lCamIyMXRaVzUwTG5aaGJIVmxJQ3NnSnlvdkp5d2djM0JsWTJsaGJFSmhjMlVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlBbkx5b25JQ3NnWTI5dGJXVnVkQzUyWVd4MVpTQXJJQ2NxTHljN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnWVdSa1EyOXRiV1Z1ZEhNb2MzUnRkQ3dnY21WemRXeDBLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnBMQ0JzWlc0c0lHTnZiVzFsYm5Rc0lITmhkbVVzSUhSaGFXeHBibWRVYjFOMFlYUmxiV1Z1ZEN3Z2MzQmxZMmxoYkVKaGMyVXNJR1p5WVdkdFpXNTBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ1pYaDBVbUZ1WjJVc0lISmhibWRsTENCd2NtVjJVbUZ1WjJVc0lIQnlaV1pwZUN3Z2FXNW1hWGdzSUhOMVptWnBlQ3dnWTI5MWJuUTdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1YkdWaFpHbHVaME52YlcxbGJuUnpJQ1ltSUhOMGJYUXViR1ZoWkdsdVowTnZiVzFsYm5SekxteGxibWQwYUNBK0lEQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmhkbVVnUFNCeVpYTjFiSFE3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod2NtVnpaWEoyWlVKc1lXNXJUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjF0Wlc1MElEMGdjM1J0ZEM1c1pXRmthVzVuUTI5dGJXVnVkSE5iTUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1cxMDdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsZUhSU1lXNW5aU0E5SUdOdmJXMWxiblF1WlhoMFpXNWtaV1JTWVc1blpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZVzVuWlNBOUlHTnZiVzFsYm5RdWNtRnVaMlU3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd2NtVm1hWGdnUFNCemIzVnlZMlZEYjJSbExuTjFZbk4wY21sdVp5aGxlSFJTWVc1blpWc3dYU3dnY21GdVoyVmJNRjBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmRXNTBJRDBnS0hCeVpXWnBlQzV0WVhSamFDZ3ZYRnh1TDJjcElIeDhJRnRkS1M1c1pXNW5kR2c3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTnZkVzUwSUQ0Z01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHpkSEpwYm1kU1pYQmxZWFFvSjF4Y2JpY3NJR052ZFc1MEtTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHRmtaRWx1WkdWdWRDaG5aVzVsY21GMFpVTnZiVzFsYm5Rb1kyOXRiV1Z1ZENrcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNod2NtVm1hWGdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2huWlc1bGNtRjBaVU52YlcxbGJuUW9ZMjl0YldWdWRDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCeVpYWlNZVzVuWlNBOUlISmhibWRsTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Td2diR1Z1SUQwZ2MzUnRkQzVzWldGa2FXNW5RMjl0YldWdWRITXViR1Z1WjNSb095QnBJRHdnYkdWdU95QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl0YldWdWRDQTlJSE4wYlhRdWJHVmhaR2x1WjBOdmJXMWxiblJ6VzJsZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WVc1blpTQTlJR052YlcxbGJuUXVjbUZ1WjJVN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVc1bWFYZ2dQU0J6YjNWeVkyVkRiMlJsTG5OMVluTjBjbWx1Wnlod2NtVjJVbUZ1WjJWYk1WMHNJSEpoYm1kbFd6QmRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOTFiblFnUFNBb2FXNW1hWGd1YldGMFkyZ29MMXhjYmk5bktTQjhmQ0JiWFNrdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2h6ZEhKcGJtZFNaWEJsWVhRb0oxeGNiaWNzSUdOdmRXNTBLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR0ZrWkVsdVpHVnVkQ2huWlc1bGNtRjBaVU52YlcxbGJuUW9ZMjl0YldWdWRDa3BLVHRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndjbVYyVW1GdVoyVWdQU0J5WVc1blpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZFdabWFYZ2dQU0J6YjNWeVkyVkRiMlJsTG5OMVluTjBjbWx1WnloeVlXNW5aVnN4WFN3Z1pYaDBVbUZ1WjJWYk1WMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052ZFc1MElEMGdLSE4xWm1acGVDNXRZWFJqYUNndlhGeHVMMmNwSUh4OElGdGRLUzVzWlc1bmRHZzdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYzNSeWFXNW5VbVZ3WldGMEtDZGNYRzRuTENCamIzVnVkQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjF0Wlc1MElEMGdjM1J0ZEM1c1pXRmthVzVuUTI5dGJXVnVkSE5iTUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1cxMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOaFptVkRiMjVqWVhSbGJtRjBhVzl1SUNZbUlITjBiWFF1ZEhsd1pTQTlQVDBnVTNsdWRHRjRMbEJ5YjJkeVlXMGdKaVlnYzNSdGRDNWliMlI1TG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25YRnh1SnlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR2RsYm1WeVlYUmxRMjl0YldWdWRDaGpiMjF0Wlc1MEtTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGJtUnpWMmwwYUV4cGJtVlVaWEp0YVc1aGRHOXlLSFJ2VTI5MWNtTmxUbTlrWlZkb1pXNU9aV1ZrWldRb2NtVnpkV3gwS1M1MGIxTjBjbWx1WnlncEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25YRnh1SnlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNocElEMGdNU3dnYkdWdUlEMGdjM1J0ZEM1c1pXRmthVzVuUTI5dGJXVnVkSE11YkdWdVozUm9PeUJwSUR3Z2JHVnVPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dGJXVnVkQ0E5SUhOMGJYUXViR1ZoWkdsdVowTnZiVzFsYm5SelcybGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWNtRm5iV1Z1ZENBOUlGdG5aVzVsY21GMFpVTnZiVzFsYm5Rb1kyOXRiV1Z1ZENsZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXVnVaSE5YYVhSb1RHbHVaVlJsY20xcGJtRjBiM0lvZEc5VGIzVnlZMlZPYjJSbFYyaGxiazVsWldSbFpDaG1jbUZuYldWdWRDa3VkRzlUZEhKcGJtY29LU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdaeVlXZHRaVzUwTG5CMWMyZ29KMXhjYmljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR0ZrWkVsdVpHVnVkQ2htY21GbmJXVnVkQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvWVdSa1NXNWtaVzUwS0hOaGRtVXBLVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h6ZEcxMExuUnlZV2xzYVc1blEyOXRiV1Z1ZEhNcElIdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJ5WlhObGNuWmxRbXhoYm10TWFXNWxjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJXMWxiblFnUFNCemRHMTBMblJ5WVdsc2FXNW5RMjl0YldWdWRITmJNRjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlhoMFVtRnVaMlVnUFNCamIyMXRaVzUwTG1WNGRHVnVaR1ZrVW1GdVoyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUZ1WjJVZ1BTQmpiMjF0Wlc1MExuSmhibWRsTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NISmxabWw0SUQwZ2MyOTFjbU5sUTI5a1pTNXpkV0p6ZEhKcGJtY29aWGgwVW1GdVoyVmJNRjBzSUhKaGJtZGxXekJkS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIzVnVkQ0E5SUNod2NtVm1hWGd1YldGMFkyZ29MMXhjYmk5bktTQjhmQ0JiWFNrdWJHVnVaM1JvTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR052ZFc1MElENGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2h6ZEhKcGJtZFNaWEJsWVhRb0oxeGNiaWNzSUdOdmRXNTBLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR0ZrWkVsdVpHVnVkQ2huWlc1bGNtRjBaVU52YlcxbGJuUW9ZMjl0YldWdWRDa3BLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHdjbVZtYVhncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoblpXNWxjbUYwWlVOdmJXMWxiblFvWTI5dGJXVnVkQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR0ZwYkdsdVoxUnZVM1JoZEdWdFpXNTBJRDBnSVdWdVpITlhhWFJvVEdsdVpWUmxjbTFwYm1GMGIzSW9kRzlUYjNWeVkyVk9iMlJsVjJobGJrNWxaV1JsWkNoeVpYTjFiSFFwTG5SdlUzUnlhVzVuS0NrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndaV05wWVd4Q1lYTmxJRDBnYzNSeWFXNW5VbVZ3WldGMEtDY2dKeXdnWTJGc1kzVnNZWFJsVTNCaFkyVnpLSFJ2VTI5MWNtTmxUbTlrWlZkb1pXNU9aV1ZrWldRb1cySmhjMlVzSUhKbGMzVnNkQ3dnYVc1a1pXNTBYU2t1ZEc5VGRISnBibWNvS1NrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR3hsYmlBOUlITjBiWFF1ZEhKaGFXeHBibWREYjIxdFpXNTBjeTVzWlc1bmRHZzdJR2tnUENCc1pXNDdJQ3NyYVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjIxdFpXNTBJRDBnYzNSdGRDNTBjbUZwYkdsdVowTnZiVzFsYm5SelcybGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR0ZwYkdsdVoxUnZVM1JoZEdWdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCWFpTQmhjM04xYldVZ2RHRnlaMlYwSUd4cGEyVWdabTlzYkc5M2FXNW5JSE5qY21sd2RGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSFpoY2lCMElEMGdNakE3SUNBdktpcGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tpQlVhR2x6SUdseklHTnZiVzFsYm5RZ2IyWWdkRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXFMMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJtYVhKemRDQmpZWE5sWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1czSmxjM1ZzZEN3Z2FXNWtaVzUwWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1czSmxjM1ZzZEN3Z2MzQmxZMmxoYkVKaGMyVmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvWjJWdVpYSmhkR1ZEYjIxdFpXNTBLR052YlcxbGJuUXNJSE53WldOcFlXeENZWE5sS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJjbVZ6ZFd4MExDQmhaR1JKYm1SbGJuUW9aMlZ1WlhKaGRHVkRiMjF0Wlc1MEtHTnZiVzFsYm5RcEtWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ0lUMDlJR3hsYmlBdElERWdKaVlnSVdWdVpITlhhWFJvVEdsdVpWUmxjbTFwYm1GMGIzSW9kRzlUYjNWeVkyVk9iMlJsVjJobGJrNWxaV1JsWkNoeVpYTjFiSFFwTG5SdlUzUnlhVzVuS0NrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJjbVZ6ZFd4MExDQW5YRnh1SjEwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHZGxibVZ5WVhSbFFteGhibXRNYVc1bGN5aHpkR0Z5ZEN3Z1pXNWtMQ0J5WlhOMWJIUXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHb3NJRzVsZDJ4cGJtVkRiM1Z1ZENBOUlEQTdYRzVjYmlBZ0lDQWdJQ0FnWm05eUlDaHFJRDBnYzNSaGNuUTdJR29nUENCbGJtUTdJR29yS3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITnZkWEpqWlVOdlpHVmJhbDBnUFQwOUlDZGNYRzRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtVjNiR2x1WlVOdmRXNTBLeXM3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCbWIzSWdLR29nUFNBeE95QnFJRHdnYm1WM2JHbHVaVU52ZFc1ME95QnFLeXNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0c1bGQyeHBibVVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnY0dGeVpXNTBhR1Z6YVhwbEtIUmxlSFFzSUdOMWNuSmxiblFzSUhOb2IzVnNaQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9ZM1Z5Y21WdWRDQThJSE5vYjNWc1pDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUZzbktDY3NJSFJsZUhRc0lDY3BKMTA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSbGVIUTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWV1pYSmlZWFJwYlZOMGNtbHVaeWh6ZEhKcGJtY3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHa3NJR2w2TENCeVpYTjFiSFE3WEc0Z0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUhOMGNtbHVaeTV6Y0d4cGRDZ3ZYRnh5WEZ4dWZGeGNiaThwTzF4dUlDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBeExDQnBlaUE5SUhKbGMzVnNkQzVzWlc1bmRHZzdJR2tnUENCcGVqc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUmJhVjBnUFNCdVpYZHNhVzVsSUNzZ1ltRnpaU0FySUhKbGMzVnNkRnRwWFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR2RsYm1WeVlYUmxWbVZ5WW1GMGFXMG9aWGh3Y2l3Z2NISmxZMlZrWlc1alpTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2RtVnlZbUYwYVcwc0lISmxjM1ZzZEN3Z2NISmxZenRjYmlBZ0lDQWdJQ0FnZG1WeVltRjBhVzBnUFNCbGVIQnlXMlY0ZEhKaExuWmxjbUpoZEdsdFhUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhabGNtSmhkR2x0SUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2NHRnlaVzUwYUdWemFYcGxLR2RsYm1WeVlYUmxWbVZ5WW1GMGFXMVRkSEpwYm1jb2RtVnlZbUYwYVcwcExDQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxMQ0J3Y21WalpXUmxibU5sS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhabGNtSmhkR2x0SUdseklHOWlhbVZqZEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdaMlZ1WlhKaGRHVldaWEppWVhScGJWTjBjbWx1WnloMlpYSmlZWFJwYlM1amIyNTBaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJ5WldNZ1BTQW9kbVZ5WW1GMGFXMHVjSEpsWTJWa1pXNWpaU0FoUFNCdWRXeHNLU0EvSUhabGNtSmhkR2x0TG5CeVpXTmxaR1Z1WTJVZ09pQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2NHRnlaVzUwYUdWemFYcGxLSEpsYzNWc2RDd2djSEpsWXl3Z2NISmxZMlZrWlc1alpTazdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEc5VGIzVnlZMlZPYjJSbFYyaGxiazVsWldSbFpDaHlaWE4xYkhRc0lHVjRjSElwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJRU52WkdWSFpXNWxjbUYwYjNJb0tTQjdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdTR1ZzY0dWeWN5NWNibHh1SUNBZ0lFTnZaR1ZIWlc1bGNtRjBiM0l1Y0hKdmRHOTBlWEJsTG0xaGVXSmxRbXh2WTJzZ1BTQm1kVzVqZEdsdmJpaHpkRzEwTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MExDQnViMHhsWVdScGJtZERiMjF0Wlc1MExDQjBhR0YwSUQwZ2RHaHBjenRjYmx4dUlDQWdJQ0FnSUNCdWIweGxZV1JwYm1kRGIyMXRaVzUwSUQwZ0lXVjRkSEpoTG1OdmJXMWxiblFnZkh3Z0lYTjBiWFF1YkdWaFpHbHVaME52YlcxbGJuUnpPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHpkRzEwTG5SNWNHVWdQVDA5SUZONWJuUmhlQzVDYkc5amExTjBZWFJsYldWdWRDQW1KaUJ1YjB4bFlXUnBibWREYjIxdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1czTndZV05sTENCMGFHbHpMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBLSE4wYlhRc0lHWnNZV2R6S1YwN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzUwZVhCbElEMDlQU0JUZVc1MFlYZ3VSVzF3ZEhsVGRHRjBaVzFsYm5RZ0ppWWdibTlNWldGa2FXNW5RMjl0YldWdWRDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNjN0p6dGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhkcGRHaEpibVJsYm5Rb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1cxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWxkMnhwYm1Vc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUmtTVzVrWlc1MEtIUm9ZWFF1WjJWdVpYSmhkR1ZUZEdGMFpXMWxiblFvYzNSdGRDd2dabXhoWjNNcEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnWFR0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ1EyOWtaVWRsYm1WeVlYUnZjaTV3Y205MGIzUjVjR1V1YldGNVltVkNiRzlqYTFOMVptWnBlQ0E5SUdaMWJtTjBhVzl1SUNoemRHMTBMQ0J5WlhOMWJIUXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHVnVaSE1nUFNCbGJtUnpWMmwwYUV4cGJtVlVaWEp0YVc1aGRHOXlLSFJ2VTI5MWNtTmxUbTlrWlZkb1pXNU9aV1ZrWldRb2NtVnpkV3gwS1M1MGIxTjBjbWx1WnlncEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0hOMGJYUXVkSGx3WlNBOVBUMGdVM2x1ZEdGNExrSnNiMk5yVTNSaGRHVnRaVzUwSUNZbUlDZ2haWGgwY21FdVkyOXRiV1Z1ZENCOGZDQWhjM1J0ZEM1c1pXRmthVzVuUTI5dGJXVnVkSE1wSUNZbUlDRmxibVJ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdXM0psYzNWc2RDd2djM0JoWTJWZE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNobGJtUnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1czSmxjM1ZzZEN3Z1ltRnpaVjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUZ0eVpYTjFiSFFzSUc1bGQyeHBibVVzSUdKaGMyVmRPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQm5aVzVsY21GMFpVbGtaVzUwYVdacFpYSW9ibTlrWlNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHOVRiM1Z5WTJWT2IyUmxWMmhsYms1bFpXUmxaQ2h1YjJSbExtNWhiV1VzSUc1dlpHVXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHZGxibVZ5WVhSbFFYTjVibU5RY21WbWFYZ29ibTlrWlN3Z2MzQmhZMlZTWlhGMWFYSmxaQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYm05a1pTNWhjM2x1WXlBL0lDZGhjM2x1WXljZ0t5QW9jM0JoWTJWU1pYRjFhWEpsWkNBL0lHNXZSVzF3ZEhsVGNHRmpaU2dwSURvZ2MzQmhZMlVwSURvZ0p5YzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWVGRHRnlVM1ZtWm1sNEtHNXZaR1VwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR2x6UjJWdVpYSmhkRzl5SUQwZ2JtOWtaUzVuWlc1bGNtRjBiM0lnSmlZZ0lXVjRkSEpoTG0xdmVpNXpkR0Z5YkdWemMwZGxibVZ5WVhSdmNqdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHbHpSMlZ1WlhKaGRHOXlJRDhnSnlvbklDc2djM0JoWTJVZ09pQW5KenRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQm5aVzVsY21GMFpVMWxkR2h2WkZCeVpXWnBlQ2h3Y205d0tTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCbWRXNWpJRDBnY0hKdmNDNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1oxYm1NdVlYTjVibU1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm5aVzVsY21GMFpVRnplVzVqVUhKbFptbDRLR1oxYm1Nc0lDRndjbTl3TG1OdmJYQjFkR1ZrS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdGMmIybGtJSE53WVdObElHSmxabTl5WlNCdFpYUm9iMlFnYm1GdFpWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2RsYm1WeVlYUmxVM1JoY2xOMVptWnBlQ2htZFc1aktTQS9JQ2NxSnlBNklDY25PMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdRMjlrWlVkbGJtVnlZWFJ2Y2k1d2NtOTBiM1I1Y0dVdVoyVnVaWEpoZEdWUVlYUjBaWEp1SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUhCeVpXTmxaR1Z1WTJVc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h1YjJSbExuUjVjR1VnUFQwOUlGTjViblJoZUM1SlpHVnVkR2xtYVdWeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWjJWdVpYSmhkR1ZKWkdWdWRHbG1hV1Z5S0c1dlpHVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaHViMlJsTENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUVOdlpHVkhaVzVsY21GMGIzSXVjSEp2ZEc5MGVYQmxMbWRsYm1WeVlYUmxSblZ1WTNScGIyNVFZWEpoYlhNZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVN3Z2FYb3NJSEpsYzNWc2RDd2dhR0Z6UkdWbVlYVnNkRHRjYmx4dUlDQWdJQ0FnSUNCb1lYTkVaV1poZFd4MElEMGdabUZzYzJVN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0c1dlpHVXVkSGx3WlNBOVBUMGdVM2x1ZEdGNExrRnljbTkzUm5WdVkzUnBiMjVGZUhCeVpYTnphVzl1SUNZbVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lXNXZaR1V1Y21WemRDQW1KaUFvSVc1dlpHVXVaR1ZtWVhWc2RITWdmSHdnYm05a1pTNWtaV1poZFd4MGN5NXNaVzVuZEdnZ1BUMDlJREFwSUNZbVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtOWtaUzV3WVhKaGJYTXViR1Z1WjNSb0lEMDlQU0F4SUNZbUlHNXZaR1V1Y0dGeVlXMXpXekJkTG5SNWNHVWdQVDA5SUZONWJuUmhlQzVKWkdWdWRHbG1hV1Z5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCaGNtY2dQVDRnZXlCOUlHTmhjMlZjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlGdG5aVzVsY21GMFpVRnplVzVqVUhKbFptbDRLRzV2WkdVc0lIUnlkV1VwTENCblpXNWxjbUYwWlVsa1pXNTBhV1pwWlhJb2JtOWtaUzV3WVhKaGJYTmJNRjBwWFR0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRzV2WkdVdWRIbHdaU0E5UFQwZ1UzbHVkR0Y0TGtGeWNtOTNSblZ1WTNScGIyNUZlSEJ5WlhOemFXOXVJRDhnVzJkbGJtVnlZWFJsUVhONWJtTlFjbVZtYVhnb2JtOWtaU3dnWm1Gc2MyVXBYU0E2SUZ0ZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0p5Z25LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1YjJSbExtUmxabUYxYkhSektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhR0Z6UkdWbVlYVnNkQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCcGVpQTlJRzV2WkdVdWNHRnlZVzF6TG14bGJtZDBhRHNnYVNBOElHbDZPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYUdGelJHVm1ZWFZzZENBbUppQnViMlJsTG1SbFptRjFiSFJ6VzJsZEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklFaGhibVJzWlNCa1pXWmhkV3gwSUhaaGJIVmxjeTVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29kR2hwY3k1blpXNWxjbUYwWlVGemMybG5ibTFsYm5Rb2JtOWtaUzV3WVhKaGJYTmJhVjBzSUc1dlpHVXVaR1ZtWVhWc2RITmJhVjBzSUNjOUp5d2dVSEpsWTJWa1pXNWpaUzVCYzNOcFoyNXRaVzUwTENCRlgxUlVWQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSFJvYVhNdVoyVnVaWEpoZEdWUVlYUjBaWEp1S0c1dlpHVXVjR0Z5WVcxelcybGRMQ0JRY21WalpXUmxibU5sTGtGemMybG5ibTFsYm5Rc0lFVmZWRlJVS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwSUNzZ01TQThJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Njc0p5QXJJSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHViMlJsTG5KbGMzUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOWtaUzV3WVhKaGJYTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tDY3NKeUFySUhOd1lXTmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0p5NHVMaWNwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHZGxibVZ5WVhSbFNXUmxiblJwWm1sbGNpaHViMlJsTG5KbGMzUXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29KeWtuS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUVOdlpHVkhaVzVsY21GMGIzSXVjSEp2ZEc5MGVYQmxMbWRsYm1WeVlYUmxSblZ1WTNScGIyNUNiMlI1SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDd2daWGh3Y2p0Y2JseHVJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQjBhR2x6TG1kbGJtVnlZWFJsUm5WdVkzUnBiMjVRWVhKaGJYTW9ibTlrWlNrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0c1dlpHVXVkSGx3WlNBOVBUMGdVM2x1ZEdGNExrRnljbTkzUm5WdVkzUnBiMjVGZUhCeVpYTnphVzl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoemNHRmpaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2duUFQ0bktUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHViMlJsTG1WNGNISmxjM05wYjI0cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tITndZV05sS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1Y0Y0hJZ1BTQjBhR2x6TG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmlodWIyUmxMbUp2Wkhrc0lGQnlaV05sWkdWdVkyVXVRWE56YVdkdWJXVnVkQ3dnUlY5VVZGUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Y0Y0hJdWRHOVRkSEpwYm1jb0tTNWphR0Z5UVhRb01Da2dQVDA5SUNkN0p5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Y0Y0hJZ1BTQmJKeWduTENCbGVIQnlMQ0FuS1NkZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvWlhod2NpazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaDBhR2x6TG0xaGVXSmxRbXh2WTJzb2JtOWtaUzVpYjJSNUxDQlRYMVJVUmtZcEtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lFTnZaR1ZIWlc1bGNtRjBiM0l1Y0hKdmRHOTBlWEJsTG1kbGJtVnlZWFJsU1hSbGNtRjBhVzl1Um05eVUzUmhkR1Z0Wlc1MElEMGdablZ1WTNScGIyNGdLRzl3WlhKaGRHOXlMQ0J6ZEcxMExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnY21WemRXeDBJRDBnV3lkbWIzSW5JQ3NnYzNCaFkyVWdLeUFuS0NkZExDQjBhR0YwSUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnZDJsMGFFbHVaR1Z1ZENobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM1J0ZEM1c1pXWjBMblI1Y0dVZ1BUMDlJRk41Ym5SaGVDNVdZWEpwWVdKc1pVUmxZMnhoY21GMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZDJsMGFFbHVaR1Z1ZENobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tITjBiWFF1YkdWbWRDNXJhVzVrSUNzZ2JtOUZiWEIwZVZOd1lXTmxLQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gwYUdGMExtZGxibVZ5WVhSbFUzUmhkR1Z0Wlc1MEtITjBiWFF1YkdWbWRDNWtaV05zWVhKaGRHbHZibk5iTUYwc0lGTmZSa1pHUmlrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaDBhR0YwTG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmloemRHMTBMbXhsWm5Rc0lGQnlaV05sWkdWdVkyVXVRMkZzYkN3Z1JWOVVWRlFwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhbTlwYmloeVpYTjFiSFFzSUc5d1pYSmhkRzl5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRnRxYjJsdUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHRjBMbWRsYm1WeVlYUmxSWGh3Y21WemMybHZiaWh6ZEcxMExuSnBaMmgwTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ2tzSUNjcEoxMDdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaDBhR2x6TG0xaGVXSmxRbXh2WTJzb2MzUnRkQzVpYjJSNUxDQm1iR0ZuY3lrcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0JEYjJSbFIyVnVaWEpoZEc5eUxuQnliM1J2ZEhsd1pTNW5aVzVsY21GMFpWQnliM0JsY25SNVMyVjVJRDBnWm5WdVkzUnBiMjRnS0dWNGNISXNJR052YlhCMWRHVmtLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQmJYVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9ZMjl0Y0hWMFpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LQ2RiSnlrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoMGFHbHpMbWRsYm1WeVlYUmxSWGh3Y21WemMybHZiaWhsZUhCeUxDQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxMQ0JGWDFSVVZDa3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb1kyOXRjSFYwWldRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tDZGRKeWs3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0JEYjJSbFIyVnVaWEpoZEc5eUxuQnliM1J2ZEhsd1pTNW5aVzVsY21GMFpVRnpjMmxuYm0xbGJuUWdQU0JtZFc1amRHbHZiaUFvYkdWbWRDd2djbWxuYUhRc0lHOXdaWEpoZEc5eUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1VISmxZMlZrWlc1alpTNUJjM05wWjI1dFpXNTBJRHdnY0hKbFkyVmtaVzVqWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm14aFozTWdmRDBnUmw5QlRFeFBWMTlKVGp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQndZWEpsYm5Sb1pYTnBlbVVvWEc0Z0lDQWdJQ0FnSUNBZ0lDQmJYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b2JHVm1kQ3dnVUhKbFkyVmtaVzVqWlM1RFlXeHNMQ0JtYkdGbmN5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM0JoWTJVZ0t5QnZjR1Z5WVhSdmNpQXJJSE53WVdObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WjJWdVpYSmhkR1ZGZUhCeVpYTnphVzl1S0hKcFoyaDBMQ0JRY21WalpXUmxibU5sTGtGemMybG5ibTFsYm5Rc0lHWnNZV2R6S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lGQnlaV05sWkdWdVkyVXVRWE56YVdkdWJXVnVkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaV05sWkdWdVkyVmNiaUFnSUNBZ0lDQWdLVHRjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdRMjlrWlVkbGJtVnlZWFJ2Y2k1d2NtOTBiM1I1Y0dVdWMyVnRhV052Ykc5dUlEMGdablZ1WTNScGIyNGdLR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaGMyVnRhV052Ykc5dWN5QW1KaUJtYkdGbmN5QW1JRVpmVTBWTlNVTlBURTlPWDA5UVZDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNjbk8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW5PeWM3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJQzh2SUZOMFlYUmxiV1Z1ZEhNdVhHNWNiaUFnSUNCRGIyUmxSMlZ1WlhKaGRHOXlMbE4wWVhSbGJXVnVkQ0E5SUh0Y2JseHVJQ0FnSUNBZ0lDQkNiRzlqYTFOMFlYUmxiV1Z1ZERvZ1puVnVZM1JwYjI0Z0tITjBiWFFzSUdac1lXZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY21GdVoyVXNJR052Ym5SbGJuUXNJSEpsYzNWc2RDQTlJRnNuZXljc0lHNWxkMnhwYm1WZExDQjBhR0YwSUQwZ2RHaHBjenRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdkMmwwYUVsdVpHVnVkQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhR0Z1Wkd4bElHWjFibU4wYVc5dWN5QjNhWFJvYjNWMElHRnVlU0JqYjJSbFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE4wYlhRdVltOWtlUzVzWlc1bmRHZ2dQVDA5SURBZ0ppWWdjSEpsYzJWeWRtVkNiR0Z1YTB4cGJtVnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmhibWRsSUQwZ2MzUnRkQzV5WVc1blpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmhibWRsV3pGZElDMGdjbUZ1WjJWYk1GMGdQaUF5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaVzUwSUQwZ2MyOTFjbU5sUTI5a1pTNXpkV0p6ZEhKcGJtY29jbUZ1WjJWYk1GMGdLeUF4TENCeVlXNW5aVnN4WFNBdElERXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmJuUmxiblJiTUYwZ1BUMDlJQ2RjWEc0bktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnV3lkN0oxMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2hqYjI1MFpXNTBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcExDQnBlaXdnWm5KaFoyMWxiblFzSUdKdlpIbEdiR0ZuY3p0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWIyUjVSbXhoWjNNZ1BTQlRYMVJHUmtZN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1pzWVdkeklDWWdSbDlHVlU1RFgwSlBSRmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbTlrZVVac1lXZHpJSHc5SUVaZlJFbFNSVU5VU1ZaRlgwTlVXRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBd0xDQnBlaUE5SUhOMGJYUXVZbTlrZVM1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHdjbVZ6WlhKMlpVSnNZVzVyVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdoaGJtUnNaU0J6Y0dGalpYTWdZbVZtYjNKbElIUm9aU0JtYVhKemRDQnNhVzVsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FTQTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemRHMTBMbUp2WkhsYk1GMHViR1ZoWkdsdVowTnZiVzFsYm5SektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmhibWRsSUQwZ2MzUnRkQzVpYjJSNVd6QmRMbXhsWVdScGJtZERiMjF0Wlc1MGMxc3dYUzVsZUhSbGJtUmxaRkpoYm1kbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaVzUwSUQwZ2MyOTFjbU5sUTI5a1pTNXpkV0p6ZEhKcGJtY29jbUZ1WjJWYk1GMHNJSEpoYm1kbFd6RmRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmJuUmxiblJiTUYwZ1BUMDlJQ2RjWEc0bktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JiSjNzblhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWE4wYlhRdVltOWtlVnN3WFM1c1pXRmthVzVuUTI5dGJXVnVkSE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjJWdVpYSmhkR1ZDYkdGdWEweHBibVZ6S0hOMGJYUXVjbUZ1WjJWYk1GMHNJSE4wYlhRdVltOWtlVnN3WFM1eVlXNW5aVnN3WFN3Z2NtVnpkV3gwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdoaGJtUnNaU0J6Y0dGalpYTWdZbVYwZDJWbGJpQnNhVzVsYzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHa2dQaUF3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGemRHMTBMbUp2WkhsYmFTQXRJREZkTG5SeVlXbHNhVzVuUTI5dGJXVnVkSE1nSUNZbUlDRnpkRzEwTG1KdlpIbGJhVjB1YkdWaFpHbHVaME52YlcxbGJuUnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1WeVlYUmxRbXhoYm10TWFXNWxjeWh6ZEcxMExtSnZaSGxiYVNBdElERmRMbkpoYm1kbFd6RmRMQ0J6ZEcxMExtSnZaSGxiYVYwdWNtRnVaMlZiTUYwc0lISmxjM1ZzZENrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHa2dQVDA5SUdsNklDMGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW05a2VVWnNZV2R6SUh3OUlFWmZVMFZOU1VOUFRFOU9YMDlRVkR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6ZEcxMExtSnZaSGxiYVYwdWJHVmhaR2x1WjBOdmJXMWxiblJ6SUNZbUlIQnlaWE5sY25abFFteGhibXRNYVc1bGN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabkpoWjIxbGJuUWdQU0IwYUdGMExtZGxibVZ5WVhSbFUzUmhkR1Z0Wlc1MEtITjBiWFF1WW05a2VWdHBYU3dnWW05a2VVWnNZV2R6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnlZV2R0Wlc1MElEMGdZV1JrU1c1a1pXNTBLSFJvWVhRdVoyVnVaWEpoZEdWVGRHRjBaVzFsYm5Rb2MzUnRkQzVpYjJSNVcybGRMQ0JpYjJSNVJteGhaM01wS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR1p5WVdkdFpXNTBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZsYm1SelYybDBhRXhwYm1WVVpYSnRhVzVoZEc5eUtIUnZVMjkxY21ObFRtOWtaVmRvWlc1T1pXVmtaV1FvWm5KaFoyMWxiblFwTG5SdlUzUnlhVzVuS0NrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY0hKbGMyVnlkbVZDYkdGdWEweHBibVZ6SUNZbUlHa2dQQ0JwZWlBdElERXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QmtiMjRuZENCaFpHUWdZU0J1WlhjZ2JHbHVaU0JwWmlCMGFHVnlaU0JoY21VZ2JHVmhaR2x1WnlCamIyMWxiblJ6WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhVzRnZEdobElHNWxlSFFnYzNSaGRHVnRaVzUwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z6ZEcxMExtSnZaSGxiYVNBcklERmRMbXhsWVdScGJtZERiMjF0Wlc1MGN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2h1Wlhkc2FXNWxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LRzVsZDJ4cGJtVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIQnlaWE5sY25abFFteGhibXRNYVc1bGN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYUdGdVpHeGxJSE53WVdObGN5QmhablJsY2lCMGFHVWdiR0Z6ZENCc2FXNWxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVNBOVBUMGdhWG9nTFNBeEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRnpkRzEwTG1KdlpIbGJhVjB1ZEhKaGFXeHBibWREYjIxdFpXNTBjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuWlc1bGNtRjBaVUpzWVc1clRHbHVaWE1vYzNSdGRDNWliMlI1VzJsZExuSmhibWRsV3pGZExDQnpkRzEwTG5KaGJtZGxXekZkTENCeVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoaFpHUkpibVJsYm5Rb0ozMG5LU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRUp5WldGclUzUmhkR1Z0Wlc1ME9pQm1kVzVqZEdsdmJpQW9jM1J0ZEN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemRHMTBMbXhoWW1Wc0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDZGljbVZoYXlBbklDc2djM1J0ZEM1c1lXSmxiQzV1WVcxbElDc2dkR2hwY3k1elpXMXBZMjlzYjI0b1pteGhaM01wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNkaWNtVmhheWNnS3lCMGFHbHpMbk5sYldsamIyeHZiaWhtYkdGbmN5azdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1EyOXVkR2x1ZFdWVGRHRjBaVzFsYm5RNklHWjFibU4wYVc5dUlDaHpkRzEwTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGJYUXViR0ZpWld3cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0oyTnZiblJwYm5WbElDY2dLeUJ6ZEcxMExteGhZbVZzTG01aGJXVWdLeUIwYUdsekxuTmxiV2xqYjJ4dmJpaG1iR0ZuY3lrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0oyTnZiblJwYm5WbEp5QXJJSFJvYVhNdWMyVnRhV052Ykc5dUtHWnNZV2R6S1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JEYkdGemMwSnZaSGs2SUdaMWJtTjBhVzl1SUNoemRHMTBMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJRnNnSjNzbkxDQnVaWGRzYVc1bFhTd2dkR2hoZENBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSGRwZEdoSmJtUmxiblFvWm5WdVkzUnBiMjRnS0dsdVpHVnVkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBMQ0JwZWp0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR2w2SUQwZ2MzUnRkQzVpYjJSNUxteGxibWQwYURzZ2FTQThJR2w2T3lBcksya3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29hVzVrWlc1MEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2RHaGhkQzVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvYzNSdGRDNWliMlI1VzJsZExDQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxMQ0JGWDFSVVZDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hU0FySURFZ1BDQnBlaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2JtVjNiR2x1WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGJtUnpWMmwwYUV4cGJtVlVaWEp0YVc1aGRHOXlLSFJ2VTI5MWNtTmxUbTlrWlZkb1pXNU9aV1ZrWldRb2NtVnpkV3gwS1M1MGIxTjBjbWx1WnlncEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0c1bGQyeHBibVVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29ZbUZ6WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNnbmZTY3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQkRiR0Z6YzBSbFkyeGhjbUYwYVc5dU9pQm1kVzVqZEdsdmJpQW9jM1J0ZEN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYTjFiSFFzSUdaeVlXZHRaVzUwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElDQTlJRnNuWTJ4aGMzTWdKeUFySUhOMGJYUXVhV1F1Ym1GdFpWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM1J0ZEM1emRYQmxja05zWVhOektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabkpoWjIxbGJuUWdQU0JxYjJsdUtDZGxlSFJsYm1Sekp5d2dkR2hwY3k1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b2MzUnRkQzV6ZFhCbGNrTnNZWE56TENCUWNtVmpaV1JsYm1ObExrRnpjMmxuYm0xbGJuUXNJRVZmVkZSVUtTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhbTlwYmloeVpYTjFiSFFzSUdaeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tIUm9hWE11WjJWdVpYSmhkR1ZUZEdGMFpXMWxiblFvYzNSdGRDNWliMlI1TENCVFgxUkdSbFFwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnUkdseVpXTjBhWFpsVTNSaGRHVnRaVzUwT2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsZUhSeVlTNXlZWGNnSmlZZ2MzUnRkQzV5WVhjcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzUnRkQzV5WVhjZ0t5QjBhR2x6TG5ObGJXbGpiMnh2YmlobWJHRm5jeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWlhOallYQmxSR2x5WldOMGFYWmxLSE4wYlhRdVpHbHlaV04wYVhabEtTQXJJSFJvYVhNdWMyVnRhV052Ykc5dUtHWnNZV2R6S1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JFYjFkb2FXeGxVM1JoZEdWdFpXNTBPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFSmxZMkYxYzJVZ1lHUnZJRFF5SUhkb2FXeGxJQ2hqYjI1a0tXQWdhWE1nVTNsdWRHRjRJRVZ5Y205eUxpQlhaU0J1WldWa0lITmxiV2xqYjJ4dmJpNWNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQnFiMmx1S0Nka2J5Y3NJSFJvYVhNdWJXRjVZbVZDYkc5amF5aHpkRzEwTG1KdlpIa3NJRk5mVkVaR1Jpa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RHaHBjeTV0WVhsaVpVSnNiMk5yVTNWbVptbDRLSE4wYlhRdVltOWtlU3dnY21WemRXeDBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCcWIybHVLSEpsYzNWc2RDd2dXMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2QzYUdsc1pTY2dLeUJ6Y0dGalpTQXJJQ2NvSnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWRsYm1WeVlYUmxSWGh3Y21WemMybHZiaWh6ZEcxMExuUmxjM1FzSUZCeVpXTmxaR1Z1WTJVdVUyVnhkV1Z1WTJVc0lFVmZWRlJVS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBbktTY2dLeUIwYUdsekxuTmxiV2xqYjJ4dmJpaG1iR0ZuY3lsY2JpQWdJQ0FnSUNBZ0lDQWdJRjBwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRU5oZEdOb1EyeGhkWE5sT2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUXNJSFJvWVhRZ1BTQjBhR2x6TzF4dUlDQWdJQ0FnSUNBZ0lDQWdkMmwwYUVsdVpHVnVkQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2QxWVhKa08xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdXMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBblkyRjBZMmduSUNzZ2MzQmhZMlVnS3lBbktDY3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb1lYUXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLSE4wYlhRdWNHRnlZVzBzSUZCeVpXTmxaR1Z1WTJVdVUyVnhkV1Z1WTJVc0lFVmZWRlJVS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKeWtuWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWFR0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6ZEcxMExtZDFZWEprS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2QxWVhKa0lEMGdkR2hoZEM1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b2MzUnRkQzVuZFdGeVpDd2dVSEpsWTJWa1pXNWpaUzVUWlhGMVpXNWpaU3dnUlY5VVZGUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1YzNCc2FXTmxLRElzSURBc0lDY2dhV1lnSnl3Z1ozVmhjbVFwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdocGN5NXRZWGxpWlVKc2IyTnJLSE4wYlhRdVltOWtlU3dnVTE5VVJrWkdLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRVJsWW5WbloyVnlVM1JoZEdWdFpXNTBPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuWkdWaWRXZG5aWEluSUNzZ2RHaHBjeTV6WlcxcFkyOXNiMjRvWm14aFozTXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFVnRjSFI1VTNSaGRHVnRaVzUwT2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBbk95YzdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1JYaHdiM0owUkdWbVlYVnNkRVJsWTJ4aGNtRjBhVzl1T2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUWdQU0JiSUNkbGVIQnZjblFuSUYwc0lHSnZaSGxHYkdGbmN6dGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ1ltOWtlVVpzWVdkeklEMGdLR1pzWVdkeklDWWdSbDlUUlUxSlEwOU1UMDVmVDFCVUtTQS9JRk5mVkVaR1ZDQTZJRk5mVkVaR1JqdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaWGh3YjNKMElHUmxabUYxYkhRZ1NHOXBjM1JoWW14bFJHVmpiR0Z5WVhScGIyNWJSR1ZtWVhWc2RGMWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHVjRjRzl5ZENCa1pXWmhkV3gwSUVGemMybG5ibTFsYm5SRmVIQnlaWE56YVc5dVcwbHVYU0E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnSjJSbFptRjFiSFFuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNocGMxTjBZWFJsYldWdWRDaHpkRzEwTG1SbFkyeGhjbUYwYVc5dUtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJR3B2YVc0b2NtVnpkV3gwTENCMGFHbHpMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBLSE4wYlhRdVpHVmpiR0Z5WVhScGIyNHNJR0p2WkhsR2JHRm5jeWtwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1a1pXTnNZWEpoZEdsdmJpd2dVSEpsWTJWa1pXNWpaUzVCYzNOcFoyNXRaVzUwTENCRlgxUlVWQ2tnS3lCMGFHbHpMbk5sYldsamIyeHZiaWhtYkdGbmN5a3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCRmVIQnZjblJPWVcxbFpFUmxZMnhoY21GMGFXOXVPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQmJJQ2RsZUhCdmNuUW5JRjBzSUdKdlpIbEdiR0ZuY3l3Z2RHaGhkQ0E5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHSnZaSGxHYkdGbmN5QTlJQ2htYkdGbmN5QW1JRVpmVTBWTlNVTlBURTlPWDA5UVZDa2dQeUJUWDFSR1JsUWdPaUJUWDFSR1JrWTdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1Y0Y0c5eWRDQldZWEpwWVdKc1pWTjBZWFJsYldWdWRGeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pYaHdiM0owSUVSbFkyeGhjbUYwYVc5dVcwUmxabUYxYkhSZFhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzVrWldOc1lYSmhkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCcWIybHVLSEpsYzNWc2RDd2dkR2hwY3k1blpXNWxjbUYwWlZOMFlYUmxiV1Z1ZENoemRHMTBMbVJsWTJ4aGNtRjBhVzl1TENCaWIyUjVSbXhoWjNNcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pYaHdiM0owSUVWNGNHOXlkRU5zWVhWelpWdE9iMUpsWm1WeVpXNWpaVjBnUm5KdmJVTnNZWFZ6WlNBN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCbGVIQnZjblFnUlhod2IzSjBRMnhoZFhObElEdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpkRzEwTG5Od1pXTnBabWxsY25NcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYzNSdGRDNXpjR1ZqYVdacFpYSnpMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JxYjJsdUtISmxjM1ZzZEN3Z0ozc25JQ3NnYzNCaFkyVWdLeUFuZlNjcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jM1J0ZEM1emNHVmphV1pwWlhKeld6QmRMblI1Y0dVZ1BUMDlJRk41Ym5SaGVDNUZlSEJ2Y25SQ1lYUmphRk53WldOcFptbGxjaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1emNHVmphV1pwWlhKeld6QmRMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgxUlVWQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHcHZhVzRvY21WemRXeDBMQ0FuZXljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IzYVhSb1NXNWtaVzUwS0daMWJtTjBhVzl1SUNocGJtUmxiblFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBMQ0JwZWp0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHNWxkMnhwYm1VcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Dd2dhWG9nUFNCemRHMTBMbk53WldOcFptbGxjbk11YkdWdVozUm9PeUJwSUR3Z2FYbzdJQ3NyYVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0dsdVpHVnVkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29kR2hoZEM1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b2MzUnRkQzV6Y0dWamFXWnBaWEp6VzJsZExDQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxMQ0JGWDFSVVZDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJQ3NnTVNBOElHbDZLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Njc0p5QXJJRzVsZDJ4cGJtVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWlc1a2MxZHBkR2hNYVc1bFZHVnliV2x1WVhSdmNpaDBiMU52ZFhKalpVNXZaR1ZYYUdWdVRtVmxaR1ZrS0hKbGMzVnNkQ2t1ZEc5VGRISnBibWNvS1NrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LRzVsZDJ4cGJtVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0dKaGMyVWdLeUFuZlNjcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemRHMTBMbk52ZFhKalpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCcWIybHVLSEpsYzNWc2RDd2dXMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKMlp5YjIwbklDc2djM0JoWTJVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5Qk5iMlIxYkdWVGNHVmphV1pwWlhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLSE4wYlhRdWMyOTFjbU5sTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYldsamIyeHZiaWhtYkdGbmN5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWFNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdocGN5NXpaVzFwWTI5c2IyNG9abXhoWjNNcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUNBZ0lDQjlMRnh1WEc0Z0lDQWdJQ0FnSUVWNGNHOXlkRUZzYkVSbFkyeGhjbUYwYVc5dU9pQm1kVzVqZEdsdmJpQW9jM1J0ZEN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWNGNHOXlkQ0FxSUVaeWIyMURiR0YxYzJVZ08xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRnRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuWlhod2IzSjBKeUFySUhOd1lXTmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2NxSnlBcklITndZV05sTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNkbWNtOXRKeUFySUhOd1lXTmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUUxdlpIVnNaVk53WldOcFptbGxjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtITjBiWFF1YzI5MWNtTmxMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgxUlVWQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaVzFwWTI5c2IyNG9abXhoWjNNcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JkTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRVY0Y0hKbGMzTnBiMjVUZEdGMFpXMWxiblE2SUdaMWJtTjBhVzl1SUNoemRHMTBMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDd2dabkpoWjIxbGJuUTdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlHbHpRMnhoYzNOUWNtVm1hWGhsWkNobWNtRm5iV1Z1ZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqYjJSbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2htY21GbmJXVnVkQzV6YkdsalpTZ3dMQ0ExS1NBaFBUMGdKMk5zWVhOekp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052WkdVZ1BTQm1jbUZuYldWdWRDNWphR0Z5UTI5a1pVRjBLRFVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqYjJSbElEMDlQU0F3ZURkQ0lDQXZLaUFuZXljZ0tpOGdmSHdnWlhOMWRHbHNjeTVqYjJSbExtbHpWMmhwZEdWVGNHRmpaU2hqYjJSbEtTQjhmQ0JsYzNWMGFXeHpMbU52WkdVdWFYTk1hVzVsVkdWeWJXbHVZWFJ2Y2loamIyUmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z2FYTkdkVzVqZEdsdmJsQnlaV1pwZUdWa0tHWnlZV2R0Wlc1MEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOdlpHVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0daeVlXZHRaVzUwTG5Oc2FXTmxLREFzSURncElDRTlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOWtaU0E5SUdaeVlXZHRaVzUwTG1Ob1lYSkRiMlJsUVhRb09DazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTnZaR1VnUFQwOUlEQjRNamdnTHlvZ0p5Z25JQ292SUh4OElHVnpkWFJwYkhNdVkyOWtaUzVwYzFkb2FYUmxVM0JoWTJVb1kyOWtaU2tnZkh3Z1kyOWtaU0E5UFQwZ01IZ3lRU0FnTHlvZ0p5b25JQ292SUh4OElHVnpkWFJwYkhNdVkyOWtaUzVwYzB4cGJtVlVaWEp0YVc1aGRHOXlLR052WkdVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJwYzBGemVXNWpVSEpsWm1sNFpXUW9abkpoWjIxbGJuUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kyOWtaU3dnYVN3Z2FYbzdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0daeVlXZHRaVzUwTG5Oc2FXTmxLREFzSURVcElDRTlQU0FuWVhONWJtTW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxjM1YwYVd4ekxtTnZaR1V1YVhOWGFHbDBaVk53WVdObEtHWnlZV2R0Wlc1MExtTm9ZWEpEYjJSbFFYUW9OU2twS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ05pd2dhWG9nUFNCbWNtRm5iV1Z1ZEM1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2haWE4xZEdsc2N5NWpiMlJsTG1selYyaHBkR1ZUY0dGalpTaG1jbUZuYldWdWRDNWphR0Z5UTI5a1pVRjBLR2twS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BUMDlJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1p5WVdkdFpXNTBMbk5zYVdObEtHa3NJR2tnS3lBNEtTQWhQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZaR1VnUFNCbWNtRm5iV1Z1ZEM1amFHRnlRMjlrWlVGMEtHa2dLeUE0S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5a1pTQTlQVDBnTUhneU9DQXZLaUFuS0NjZ0tpOGdmSHdnWlhOMWRHbHNjeTVqYjJSbExtbHpWMmhwZEdWVGNHRmpaU2hqYjJSbEtTQjhmQ0JqYjJSbElEMDlQU0F3ZURKQklDQXZLaUFuS2ljZ0tpOGdmSHdnWlhOMWRHbHNjeTVqYjJSbExtbHpUR2x1WlZSbGNtMXBibUYwYjNJb1kyOWtaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlGdDBhR2x6TG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmloemRHMTBMbVY0Y0hKbGMzTnBiMjRzSUZCeVpXTmxaR1Z1WTJVdVUyVnhkV1Z1WTJVc0lFVmZWRlJVS1YwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlBeE1pNDBJQ2Q3Snl3Z0oyWjFibU4wYVc5dUp5d2dKMk5zWVhOekp5QnBjeUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQjBhR2x6SUhCdmMybDBhVzl1TGx4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnZDNKaGNDQmxlSEJ5WlhOemFXOXVJSGRwZEdnZ2NHRnlaVzUwYUdWelpYTmNiaUFnSUNBZ0lDQWdJQ0FnSUdaeVlXZHRaVzUwSUQwZ2RHOVRiM1Z5WTJWT2IyUmxWMmhsYms1bFpXUmxaQ2h5WlhOMWJIUXBMblJ2VTNSeWFXNW5LQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWm5KaFoyMWxiblF1WTJoaGNrTnZaR1ZCZENnd0tTQTlQVDBnTUhnM1FpQWdMeW9nSjNzbklDb3ZJSHg4SUNBdkx5QlBZbXBsWTNSRmVIQnlaWE56YVc5dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6UTJ4aGMzTlFjbVZtYVhobFpDaG1jbUZuYldWdWRDa2dmSHhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTkdkVzVqZEdsdmJsQnlaV1pwZUdWa0tHWnlZV2R0Wlc1MEtTQjhmRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGMwRnplVzVqVUhKbFptbDRaV1FvWm5KaFoyMWxiblFwSUh4OFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2hrYVhKbFkzUnBkbVVnSmlZZ0tHWnNZV2R6SUNZZ1JsOUVTVkpGUTFSSlZrVmZRMVJZS1NBbUppQnpkRzEwTG1WNGNISmxjM05wYjI0dWRIbHdaU0E5UFQwZ1UzbHVkR0Y0TGt4cGRHVnlZV3dnSmlZZ2RIbHdaVzltSUhOMGJYUXVaWGh3Y21WemMybHZiaTUyWVd4MVpTQTlQVDBnSjNOMGNtbHVaeWNwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1d5Y29KeXdnY21WemRXeDBMQ0FuS1NjZ0t5QjBhR2x6TG5ObGJXbGpiMnh2YmlobWJHRm5jeWxkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gwYUdsekxuTmxiV2xqYjJ4dmJpaG1iR0ZuY3lrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JKYlhCdmNuUkVaV05zWVhKaGRHbHZiam9nWm5WdVkzUnBiMjRnS0hOMGJYUXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QkZVelk2SURFMUxqSXVNU0IyWVd4cFpDQnBiWEJ2Y25RZ1pHVmpiR0Z5WVhScGIyNXpPbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ0FnSUMwZ2FXMXdiM0owSUVsdGNHOXlkRU5zWVhWelpTQkdjbTl0UTJ4aGRYTmxJRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJQ0FnSUNBdElHbHRjRzl5ZENCTmIyUjFiR1ZUY0dWamFXWnBaWElnTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ3dnWTNWeWMyOXlMQ0IwYUdGMElEMGdkR2hwY3p0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1NXWWdibThnU1cxd2IzSjBRMnhoZFhObElHbHpJSEJ5WlhObGJuUXNYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QjBhR2x6SUhOb2IzVnNaQ0JpWlNCZ2FXMXdiM0owSUUxdlpIVnNaVk53WldOcFptbGxjbUFnYzI4Z2MydHBjQ0JnWm5KdmJXQmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFMXZaSFZzWlZOd1pXTnBabWxsY2lCcGN5QlRkSEpwYm1kTWFYUmxjbUZzTGx4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGJYUXVjM0JsWTJsbWFXVnljeTVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwYlhCdmNuUWdUVzlrZFd4bFUzQmxZMmxtYVdWeUlEdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1cxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuYVcxd2IzSjBKeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzQmhZMlVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRTF2WkhWc1pWTndaV05wWm1sbGNseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaHpkRzEwTG5OdmRYSmpaU3dnVUhKbFkyVmtaVzVqWlM1VFpYRjFaVzVqWlN3Z1JWOVVWRlFwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJXbGpiMnh2YmlobWJHRm5jeWxjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJwYlhCdmNuUWdTVzF3YjNKMFEyeGhkWE5sSUVaeWIyMURiR0YxYzJVZ08xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnVzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNkcGJYQnZjblFuWEc0Z0lDQWdJQ0FnSUNBZ0lDQmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kzVnljMjl5SUQwZ01EdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdTVzF3YjNKMFpXUkNhVzVrYVc1blhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzV6Y0dWamFXWnBaWEp6VzJOMWNuTnZjbDB1ZEhsd1pTQTlQVDBnVTNsdWRHRjRMa2x0Y0c5eWRFUmxabUYxYkhSVGNHVmphV1pwWlhJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnVzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1emNHVmphV1pwWlhKelcyTjFjbk52Y2wwc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3NyWTNWeWMyOXlPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM1J0ZEM1emNHVmphV1pwWlhKelcyTjFjbk52Y2wwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTNWeWMyOXlJQ0U5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tDY3NKeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE4wYlhRdWMzQmxZMmxtYVdWeWMxdGpkWEp6YjNKZExuUjVjR1VnUFQwOUlGTjViblJoZUM1SmJYQnZjblJPWVcxbGMzQmhZMlZUY0dWamFXWnBaWElwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVG1GdFpWTndZV05sU1cxd2IzSjBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdwdmFXNG9jbVZ6ZFd4MExDQmJYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNCaFkyVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1emNHVmphV1pwWlhKelcyTjFjbk52Y2wwc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JkS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJPWVcxbFpFbHRjRzl5ZEhOY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYzNCaFkyVWdLeUFuZXljcE8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ29jM1J0ZEM1emNHVmphV1pwWlhKekxteGxibWQwYUNBdElHTjFjbk52Y2lrZ1BUMDlJREVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHbHRjRzl5ZENCN0lDNHVMaUI5SUdaeWIyMGdYQ0l1TGk1Y0lqdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtITjBiWFF1YzNCbFkybG1hV1Z5YzF0amRYSnpiM0pkTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29jM0JoWTJVZ0t5QW5mU2NnS3lCemNHRmpaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBiWEJ2Y25RZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ0FnTGk0dUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ0FnTGk0dUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdmU0JtY205dElGd2lMaTR1WENJN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2FYUm9TVzVrWlc1MEtHWjFibU4wYVc5dUlDaHBibVJsYm5RcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FTd2dhWG83WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29ibVYzYkdsdVpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnWTNWeWMyOXlMQ0JwZWlBOUlITjBiWFF1YzNCbFkybG1hV1Z5Y3k1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR2x1WkdWdWRDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSFJvWVhRdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtITjBiWFF1YzNCbFkybG1hV1Z5YzF0cFhTd2dVSEpsWTJWa1pXNWpaUzVUWlhGMVpXNWpaU3dnUlY5VVZGUXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ0t5QXhJRHdnYVhvcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Njc0p5QXJJRzVsZDJ4cGJtVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JV1Z1WkhOWGFYUm9UR2x1WlZSbGNtMXBibUYwYjNJb2RHOVRiM1Z5WTJWT2IyUmxWMmhsYms1bFpXUmxaQ2h5WlhOMWJIUXBMblJ2VTNSeWFXNW5LQ2twS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYm1WM2JHbHVaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoaVlYTmxJQ3NnSjMwbklDc2djM0JoWTJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnVzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNkbWNtOXRKeUFySUhOd1lXTmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUUxdlpIVnNaVk53WldOcFptbGxjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtITjBiWFF1YzI5MWNtTmxMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgxUlVWQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaVzFwWTI5c2IyNG9abXhoWjNNcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JkS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnVm1GeWFXRmliR1ZFWldOc1lYSmhkRzl5T2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwZEdWdFJteGhaM01nUFNBb1pteGhaM01nSmlCR1gwRk1URTlYWDBsT0tTQS9JRVZmVkZSVUlEb2dSVjlHVkZRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzVwYm1sMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1cFpDd2dVSEpsWTJWa1pXNWpaUzVCYzNOcFoyNXRaVzUwTENCcGRHVnRSbXhoWjNNcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Y0dGalpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSnowbkxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Y0dGalpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1cGJtbDBMQ0JRY21WalpXUmxibU5sTGtGemMybG5ibTFsYm5Rc0lHbDBaVzFHYkdGbmN5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVoyVnVaWEpoZEdWUVlYUjBaWEp1S0hOMGJYUXVhV1FzSUZCeVpXTmxaR1Z1WTJVdVFYTnphV2R1YldWdWRDd2dhWFJsYlVac1lXZHpLVHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQldZWEpwWVdKc1pVUmxZMnhoY21GMGFXOXVPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklGWmhjbWxoWW14bFJHVmpiR0Z5WVhSdmNpQnBjeUIwZVhCbFpDQmhjeUJUZEdGMFpXMWxiblFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJpZFhRZ2FtOXBibVZrSUhkcGRHZ2dZMjl0YldFZ0tHNXZkQ0JNYVc1bFZHVnliV2x1WVhSdmNpa3VYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QlRieUJwWmlCamIyMXRaVzUwSUdseklHRjBkR0ZqYUdWa0lIUnZJSFJoY21kbGRDQnViMlJsTENCM1pTQnphRzkxYkdRZ2MzQmxZMmxoYkdsNlpTNWNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRc0lHa3NJR2w2TENCdWIyUmxMQ0JpYjJSNVJteGhaM01zSUhSb1lYUWdQU0IwYUdsek8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCYklITjBiWFF1YTJsdVpDQmRPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQmliMlI1Um14aFozTWdQU0FvWm14aFozTWdKaUJHWDBGTVRFOVhYMGxPS1NBL0lGTmZWRVpHUmlBNklGTmZSa1pHUmp0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnWW14dlkyc29LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm05a1pTQTlJSE4wYlhRdVpHVmpiR0Z5WVhScGIyNXpXekJkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSFJ5WVM1amIyMXRaVzUwSUNZbUlHNXZaR1V1YkdWaFpHbHVaME52YlcxbGJuUnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LQ2RjWEc0bktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb1lXUmtTVzVrWlc1MEtIUm9ZWFF1WjJWdVpYSmhkR1ZUZEdGMFpXMWxiblFvYm05a1pTd2dZbTlrZVVac1lXZHpLU2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LRzV2Ulcxd2RIbFRjR0ZqWlNncEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2RHaGhkQzVuWlc1bGNtRjBaVk4wWVhSbGJXVnVkQ2h1YjJSbExDQmliMlI1Um14aFozTXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBeExDQnBlaUE5SUhOMGJYUXVaR1ZqYkdGeVlYUnBiMjV6TG14bGJtZDBhRHNnYVNBOElHbDZPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm05a1pTQTlJSE4wYlhRdVpHVmpiR0Z5WVhScGIyNXpXMmxkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhoMGNtRXVZMjl0YldWdWRDQW1KaUJ1YjJSbExteGxZV1JwYm1kRGIyMXRaVzUwY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29KeXduSUNzZ2JtVjNiR2x1WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaGhaR1JKYm1SbGJuUW9kR2hoZEM1blpXNWxjbUYwWlZOMFlYUmxiV1Z1ZENodWIyUmxMQ0JpYjJSNVJteGhaM01wS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2duTENjZ0t5QnpjR0ZqWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaDBhR0YwTG1kbGJtVnlZWFJsVTNSaGRHVnRaVzUwS0c1dlpHVXNJR0p2WkhsR2JHRm5jeWtwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM1J0ZEM1a1pXTnNZWEpoZEdsdmJuTXViR1Z1WjNSb0lENGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhkcGRHaEpibVJsYm5Rb1lteHZZMnNwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmliRzlqYXlncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoMGFHbHpMbk5sYldsamIyeHZiaWhtYkdGbmN5a3BPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRlJvY205M1UzUmhkR1Z0Wlc1ME9pQm1kVzVqZEdsdmJpQW9jM1J0ZEN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmJhbTlwYmloY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBbmRHaHliM2NuTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLSE4wYlhRdVlYSm5kVzFsYm5Rc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnS1N3Z2RHaHBjeTV6WlcxcFkyOXNiMjRvWm14aFozTXBYVHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQlVjbmxUZEdGMFpXMWxiblE2SUdaMWJtTjBhVzl1SUNoemRHMTBMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDd2dhU3dnYVhvc0lHZDFZWEprWldSSVlXNWtiR1Z5Y3p0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnV3lkMGNua25MQ0IwYUdsekxtMWhlV0psUW14dlkyc29jM1J0ZEM1aWJHOWpheXdnVTE5VVJrWkdLVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQjBhR2x6TG0xaGVXSmxRbXh2WTJ0VGRXWm1hWGdvYzNSdGRDNWliRzlqYXl3Z2NtVnpkV3gwS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1YUdGdVpHeGxjbk1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnZiR1FnYVc1MFpYSm1ZV05sWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTUN3Z2FYb2dQU0J6ZEcxMExtaGhibVJzWlhKekxteGxibWQwYURzZ2FTQThJR2w2T3lBcksya3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2FtOXBiaWh5WlhOMWJIUXNJSFJvYVhNdVoyVnVaWEpoZEdWVGRHRjBaVzFsYm5Rb2MzUnRkQzVvWVc1a2JHVnljMXRwWFN3Z1UxOVVSa1pHS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemRHMTBMbVpwYm1Gc2FYcGxjaUI4ZkNCcElDc2dNU0FoUFQwZ2FYb3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJSFJvYVhNdWJXRjVZbVZDYkc5amExTjFabVpwZUNoemRHMTBMbWhoYm1Sc1pYSnpXMmxkTG1KdlpIa3NJSEpsYzNWc2RDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2QxWVhKa1pXUklZVzVrYkdWeWN5QTlJSE4wYlhRdVozVmhjbVJsWkVoaGJtUnNaWEp6SUh4OElGdGRPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTUN3Z2FYb2dQU0JuZFdGeVpHVmtTR0Z1Wkd4bGNuTXViR1Z1WjNSb095QnBJRHdnYVhvN0lDc3JhU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnZEdocGN5NW5aVzVsY21GMFpWTjBZWFJsYldWdWRDaG5kV0Z5WkdWa1NHRnVaR3hsY25OYmFWMHNJRk5mVkVaR1Jpa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jM1J0ZEM1bWFXNWhiR2w2WlhJZ2ZId2dhU0FySURFZ0lUMDlJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCMGFHbHpMbTFoZVdKbFFteHZZMnRUZFdabWFYZ29aM1ZoY21SbFpFaGhibVJzWlhKelcybGRMbUp2Wkhrc0lISmxjM1ZzZENrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnVaWGNnYVc1MFpYSm1ZV05sWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1YUdGdVpHeGxjaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhOQmNuSmhlU2h6ZEcxMExtaGhibVJzWlhJcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdMQ0JwZWlBOUlITjBiWFF1YUdGdVpHeGxjaTVzWlc1bmRHZzdJR2tnUENCcGVqc2dLeXRwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhbTlwYmloeVpYTjFiSFFzSUhSb2FYTXVaMlZ1WlhKaGRHVlRkR0YwWlcxbGJuUW9jM1J0ZEM1b1lXNWtiR1Z5VzJsZExDQlRYMVJHUmtZcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzVtYVc1aGJHbDZaWElnZkh3Z2FTQXJJREVnSVQwOUlHbDZLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJSFJvYVhNdWJXRjVZbVZDYkc5amExTjFabVpwZUNoemRHMTBMbWhoYm1Sc1pYSmJhVjB1WW05a2VTd2djbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCcWIybHVLSEpsYzNWc2RDd2dkR2hwY3k1blpXNWxjbUYwWlZOMFlYUmxiV1Z1ZENoemRHMTBMbWhoYm1Sc1pYSXNJRk5mVkVaR1Jpa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGJYUXVabWx1WVd4cGVtVnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RHaHBjeTV0WVhsaVpVSnNiMk5yVTNWbVptbDRLSE4wYlhRdWFHRnVaR3hsY2k1aWIyUjVMQ0J5WlhOMWJIUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGJYUXVabWx1WVd4cGVtVnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnYW05cGJpaHlaWE4xYkhRc0lGc25abWx1WVd4c2VTY3NJSFJvYVhNdWJXRjVZbVZDYkc5amF5aHpkRzEwTG1acGJtRnNhWHBsY2l3Z1UxOVVSa1pHS1YwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JUZDJsMFkyaFRkR0YwWlcxbGJuUTZJR1oxYm1OMGFXOXVJQ2h6ZEcxMExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEN3Z1puSmhaMjFsYm5Rc0lHa3NJR2w2TENCaWIyUjVSbXhoWjNNc0lIUm9ZWFFnUFNCMGFHbHpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2QybDBhRWx1WkdWdWRDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnVzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW5jM2RwZEdOb0p5QXJJSE53WVdObElDc2dKeWduTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR0YwTG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmloemRHMTBMbVJwYzJOeWFXMXBibUZ1ZEN3Z1VISmxZMlZrWlc1alpTNVRaWEYxWlc1alpTd2dSVjlVVkZRcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuS1NjZ0t5QnpjR0ZqWlNBcklDZDdKeUFySUc1bGQyeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYzNSdGRDNWpZWE5sY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnZaSGxHYkdGbmN5QTlJRk5mVkVaR1JqdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdMQ0JwZWlBOUlITjBiWFF1WTJGelpYTXViR1Z1WjNSb095QnBJRHdnYVhvN0lDc3JhU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVNBOVBUMGdhWG9nTFNBeEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmliMlI1Um14aFozTWdmRDBnUmw5VFJVMUpRMDlNVDA1ZlQxQlVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBJRDBnWVdSa1NXNWtaVzUwS0hSb2FYTXVaMlZ1WlhKaGRHVlRkR0YwWlcxbGJuUW9jM1J0ZEM1allYTmxjMXRwWFN3Z1ltOWtlVVpzWVdkektTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHWnlZV2R0Wlc1MEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxibVJ6VjJsMGFFeHBibVZVWlhKdGFXNWhkRzl5S0hSdlUyOTFjbU5sVG05a1pWZG9aVzVPWldWa1pXUW9abkpoWjIxbGJuUXBMblJ2VTNSeWFXNW5LQ2twS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHVaWGRzYVc1bEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR0ZrWkVsdVpHVnVkQ2duZlNjcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1UzZHBkR05vUTJGelpUb2dablZ1WTNScGIyNGdLSE4wYlhRc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTENCbWNtRm5iV1Z1ZEN3Z2FTd2dhWG9zSUdKdlpIbEdiR0ZuY3l3Z2RHaGhkQ0E5SUhSb2FYTTdYRzRnSUNBZ0lDQWdJQ0FnSUNCM2FYUm9TVzVrWlc1MEtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzUwWlhOMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUZ0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdwdmFXNG9KMk5oYzJVbkxDQjBhR0YwTG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmloemRHMTBMblJsYzNRc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW5PaWRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JiSjJSbFptRjFiSFE2SjEwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhU0E5SURBN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYb2dQU0J6ZEcxMExtTnZibk5sY1hWbGJuUXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwZWlBbUppQnpkRzEwTG1OdmJuTmxjWFZsYm5SYk1GMHVkSGx3WlNBOVBUMGdVM2x1ZEdGNExrSnNiMk5yVTNSaGRHVnRaVzUwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBJRDBnZEdoaGRDNXRZWGxpWlVKc2IyTnJLSE4wYlhRdVkyOXVjMlZ4ZFdWdWRGc3dYU3dnVTE5VVJrWkdLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29abkpoWjIxbGJuUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcElEMGdNVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hU0FoUFQwZ2FYb2dKaVlnSVdWdVpITlhhWFJvVEdsdVpWUmxjbTFwYm1GMGIzSW9kRzlUYjNWeVkyVk9iMlJsVjJobGJrNWxaV1JsWkNoeVpYTjFiSFFwTG5SdlUzUnlhVzVuS0NrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHNWxkMnhwYm1VcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p2WkhsR2JHRm5jeUE5SUZOZlZFWkdSanRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tEc2dhU0E4SUdsNk95QXJLMmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BUMDlJR2w2SUMwZ01TQW1KaUJtYkdGbmN5QW1JRVpmVTBWTlNVTlBURTlPWDA5UVZDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbTlrZVVac1lXZHpJSHc5SUVaZlUwVk5TVU5QVEU5T1gwOVFWRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtY21GbmJXVnVkQ0E5SUdGa1pFbHVaR1Z1ZENoMGFHRjBMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBLSE4wYlhRdVkyOXVjMlZ4ZFdWdWRGdHBYU3dnWW05a2VVWnNZV2R6S1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0daeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ0t5QXhJQ0U5UFNCcGVpQW1KaUFoWlc1a2MxZHBkR2hNYVc1bFZHVnliV2x1WVhSdmNpaDBiMU52ZFhKalpVNXZaR1ZYYUdWdVRtVmxaR1ZrS0daeVlXZHRaVzUwS1M1MGIxTjBjbWx1WnlncEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYm1WM2JHbHVaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1NXWlRkR0YwWlcxbGJuUTZJR1oxYm1OMGFXOXVJQ2h6ZEcxMExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEN3Z1ltOWtlVVpzWVdkekxDQnpaVzFwWTI5c2IyNVBjSFJwYjI1aGJDd2dkR2hoZENBOUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUNBZ0lDQjNhWFJvU1c1a1pXNTBLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCYlhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2RwWmljZ0t5QnpjR0ZqWlNBcklDY29KeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaGhkQzVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvYzNSdGRDNTBaWE4wTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2NwSjF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYldsamIyeHZiazl3ZEdsdmJtRnNJRDBnWm14aFozTWdKaUJHWDFORlRVbERUMHhQVGw5UFVGUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCaWIyUjVSbXhoWjNNZ1BTQlRYMVJHUmtZN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MyVnRhV052Ykc5dVQzQjBhVzl1WVd3cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmliMlI1Um14aFozTWdmRDBnUmw5VFJVMUpRMDlNVDA1ZlQxQlVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1WVd4MFpYSnVZWFJsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29kR2hwY3k1dFlYbGlaVUpzYjJOcktITjBiWFF1WTI5dWMyVnhkV1Z1ZEN3Z1UxOVVSa1pHS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RHaHBjeTV0WVhsaVpVSnNiMk5yVTNWbVptbDRLSE4wYlhRdVkyOXVjMlZ4ZFdWdWRDd2djbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYzNSdGRDNWhiSFJsY201aGRHVXVkSGx3WlNBOVBUMGdVM2x1ZEdGNExrbG1VM1JoZEdWdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHcHZhVzRvY21WemRXeDBMQ0JiSjJWc2MyVWdKeXdnZEdocGN5NW5aVzVsY21GMFpWTjBZWFJsYldWdWRDaHpkRzEwTG1Gc2RHVnlibUYwWlN3Z1ltOWtlVVpzWVdkektWMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdwdmFXNG9jbVZ6ZFd4MExDQnFiMmx1S0NkbGJITmxKeXdnZEdocGN5NXRZWGxpWlVKc2IyTnJLSE4wYlhRdVlXeDBaWEp1WVhSbExDQmliMlI1Um14aFozTXBLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gwYUdsekxtMWhlV0psUW14dlkyc29jM1J0ZEM1amIyNXpaWEYxWlc1MExDQmliMlI1Um14aFozTXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1JtOXlVM1JoZEdWdFpXNTBPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRc0lIUm9ZWFFnUFNCMGFHbHpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2QybDBhRWx1WkdWdWRDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnV3lkbWIzSW5JQ3NnYzNCaFkyVWdLeUFuS0NkZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6ZEcxMExtbHVhWFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGJYUXVhVzVwZEM1MGVYQmxJRDA5UFNCVGVXNTBZWGd1Vm1GeWFXRmliR1ZFWldOc1lYSmhkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29kR2hoZEM1blpXNWxjbUYwWlZOMFlYUmxiV1Z1ZENoemRHMTBMbWx1YVhRc0lGTmZSa1pHUmlrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnUmw5QlRFeFBWMTlKVGlCaVpXTnZiV1Z6SUdaaGJITmxMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdoaGRDNW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9jM1J0ZEM1cGJtbDBMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgwWlVWQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0p6c25LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0NjN0p5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1ZEdWemRDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHpjR0ZqWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0hSb1lYUXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLSE4wYlhRdWRHVnpkQ3dnVUhKbFkyVmtaVzVqWlM1VFpYRjFaVzVqWlN3Z1JWOVVWRlFwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvSnpzbktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNnbk95Y3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpkRzEwTG5Wd1pHRjBaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2h6Y0dGalpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tIUm9ZWFF1WjJWdVpYSmhkR1ZGZUhCeVpYTnphVzl1S0hOMGJYUXVkWEJrWVhSbExDQlFjbVZqWldSbGJtTmxMbE5sY1hWbGJtTmxMQ0JGWDFSVVZDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25LU2NwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LQ2NwSnlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tIUm9hWE11YldGNVltVkNiRzlqYXloemRHMTBMbUp2Wkhrc0lHWnNZV2R6SUNZZ1JsOVRSVTFKUTA5TVQwNWZUMUJVSUQ4Z1UxOVVSa1pVSURvZ1UxOVVSa1pHS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUNBZ0lDQjlMRnh1WEc0Z0lDQWdJQ0FnSUVadmNrbHVVM1JoZEdWdFpXNTBPaUJtZFc1amRHbHZiaUFvYzNSdGRDd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtZGxibVZ5WVhSbFNYUmxjbUYwYVc5dVJtOXlVM1JoZEdWdFpXNTBLQ2RwYmljc0lITjBiWFFzSUdac1lXZHpJQ1lnUmw5VFJVMUpRMDlNVDA1ZlQxQlVJRDhnVTE5VVJrWlVJRG9nVTE5VVJrWkdLVHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQkdiM0pQWmxOMFlYUmxiV1Z1ZERvZ1puVnVZM1JwYjI0Z0tITjBiWFFzSUdac1lXZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVuWlc1bGNtRjBaVWwwWlhKaGRHbHZia1p2Y2xOMFlYUmxiV1Z1ZENnbmIyWW5MQ0J6ZEcxMExDQm1iR0ZuY3lBbUlFWmZVMFZOU1VOUFRFOU9YMDlRVkNBL0lGTmZWRVpHVkNBNklGTmZWRVpHUmlrN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnVEdGaVpXeGxaRk4wWVhSbGJXVnVkRG9nWm5WdVkzUnBiMjRnS0hOMGJYUXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnVzNOMGJYUXViR0ZpWld3dWJtRnRaU0FySUNjNkp5d2dkR2hwY3k1dFlYbGlaVUpzYjJOcktITjBiWFF1WW05a2VTd2dabXhoWjNNZ0ppQkdYMU5GVFVsRFQweFBUbDlQVUZRZ1B5QlRYMVJHUmxRZ09pQlRYMVJHUmtZcFhUdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCUWNtOW5jbUZ0T2lCbWRXNWpkR2x2YmlBb2MzUnRkQ3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUXNJR1p5WVdkdFpXNTBMQ0JwTENCcGVpd2dZbTlrZVVac1lXZHpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FYb2dQU0J6ZEcxMExtSnZaSGt1YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1czTmhabVZEYjI1allYUmxibUYwYVc5dUlDWW1JR2w2SUQ0Z01DQS9JQ2RjWEc0bklEb2dKeWRkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZbTlrZVVac1lXZHpJRDBnVTE5VVJsUkdPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUdsNk95QXJLMmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWE5oWm1WRGIyNWpZWFJsYm1GMGFXOXVJQ1ltSUdrZ1BUMDlJR2w2SUMwZ01Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWIyUjVSbXhoWjNNZ2ZEMGdSbDlUUlUxSlEwOU1UMDVmVDFCVU8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod2NtVnpaWEoyWlVKc1lXNXJUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FHRnVaR3hsSUhOd1lXTmxjeUJpWldadmNtVWdkR2hsSUdacGNuTjBJR3hwYm1WY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hjM1J0ZEM1aWIyUjVXekJkTG14bFlXUnBibWREYjIxdFpXNTBjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVZ5WVhSbFFteGhibXRNYVc1bGN5aHpkRzEwTG5KaGJtZGxXekJkTENCemRHMTBMbUp2WkhsYmFWMHVjbUZ1WjJWYk1GMHNJSEpsYzNWc2RDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCb1lXNWtiR1VnYzNCaFkyVnpJR0psZEhkbFpXNGdiR2x1WlhOY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYTjBiWFF1WW05a2VWdHBJQzBnTVYwdWRISmhhV3hwYm1kRGIyMXRaVzUwY3lBbUppQWhjM1J0ZEM1aWIyUjVXMmxkTG14bFlXUnBibWREYjIxdFpXNTBjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVZ5WVhSbFFteGhibXRNYVc1bGN5aHpkRzEwTG1KdlpIbGJhU0F0SURGZExuSmhibWRsV3pGZExDQnpkRzEwTG1KdlpIbGJhVjB1Y21GdVoyVmJNRjBzSUhKbGMzVnNkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtY21GbmJXVnVkQ0E5SUdGa1pFbHVaR1Z1ZENoMGFHbHpMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBLSE4wYlhRdVltOWtlVnRwWFN3Z1ltOWtlVVpzWVdkektTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvWm5KaFoyMWxiblFwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJQ3NnTVNBOElHbDZJQ1ltSUNGbGJtUnpWMmwwYUV4cGJtVlVaWEp0YVc1aGRHOXlLSFJ2VTI5MWNtTmxUbTlrWlZkb1pXNU9aV1ZrWldRb1puSmhaMjFsYm5RcExuUnZVM1J5YVc1bktDa3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h3Y21WelpYSjJaVUpzWVc1clRHbHVaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hjM1J0ZEM1aWIyUjVXMmtnS3lBeFhTNXNaV0ZrYVc1blEyOXRiV1Z1ZEhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNodVpYZHNhVzVsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LRzVsZDJ4cGJtVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hCeVpYTmxjblpsUW14aGJtdE1hVzVsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCb1lXNWtiR1VnYzNCaFkyVnpJR0ZtZEdWeUlIUm9aU0JzWVhOMElHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2tnUFQwOUlHbDZJQzBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z6ZEcxMExtSnZaSGxiYVYwdWRISmhhV3hwYm1kRGIyMXRaVzUwY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2RsYm1WeVlYUmxRbXhoYm10TWFXNWxjeWh6ZEcxMExtSnZaSGxiYVYwdWNtRnVaMlZiTVYwc0lITjBiWFF1Y21GdVoyVmJNVjBzSUhKbGMzVnNkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUNBZ0lDQjlMRnh1WEc0Z0lDQWdJQ0FnSUVaMWJtTjBhVzl1UkdWamJHRnlZWFJwYjI0NklHWjFibU4wYVc5dUlDaHpkRzEwTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsY21GMFpVRnplVzVqVUhKbFptbDRLSE4wYlhRc0lIUnlkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNkbWRXNWpkR2x2Ymljc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1oyVnVaWEpoZEdWVGRHRnlVM1ZtWm1sNEtITjBiWFFwSUh4OElHNXZSVzF3ZEhsVGNHRmpaU2dwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOMGJYUXVhV1FnUHlCblpXNWxjbUYwWlVsa1pXNTBhV1pwWlhJb2MzUnRkQzVwWkNrZ09pQW5KeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJuVnVZM1JwYjI1Q2IyUjVLSE4wYlhRcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JkTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRkpsZEhWeWJsTjBZWFJsYldWdWREb2dablZ1WTNScGIyNGdLSE4wYlhRc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MzUnRkQzVoY21kMWJXVnVkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJiYW05cGJpaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSjNKbGRIVnliaWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WjJWdVpYSmhkR1ZGZUhCeVpYTnphVzl1S0hOMGJYUXVZWEpuZFcxbGJuUXNJRkJ5WldObFpHVnVZMlV1VTJWeGRXVnVZMlVzSUVWZlZGUlVLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2tzSUhSb2FYTXVjMlZ0YVdOdmJHOXVLR1pzWVdkektWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdXeWR5WlhSMWNtNG5JQ3NnZEdocGN5NXpaVzFwWTI5c2IyNG9abXhoWjNNcFhUdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCWGFHbHNaVk4wWVhSbGJXVnVkRG9nWm5WdVkzUnBiMjRnS0hOMGJYUXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MExDQjBhR0YwSUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnSUNBZ0lIZHBkR2hKYm1SbGJuUW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUZ0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKM2RvYVd4bEp5QXJJSE53WVdObElDc2dKeWduTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR0YwTG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmloemRHMTBMblJsYzNRc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSnlrblhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2RHaHBjeTV0WVhsaVpVSnNiMk5yS0hOMGJYUXVZbTlrZVN3Z1pteGhaM01nSmlCR1gxTkZUVWxEVDB4UFRsOVBVRlFnUHlCVFgxUkdSbFFnT2lCVFgxUkdSa1lwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnVjJsMGFGTjBZWFJsYldWdWREb2dablZ1WTNScGIyNGdLSE4wYlhRc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTENCMGFHRjBJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdJQ0FnSUhkcGRHaEpibVJsYm5Rb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRnRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0ozZHBkR2duSUNzZ2MzQmhZMlVnS3lBbktDY3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb1lYUXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLSE4wYlhRdWIySnFaV04wTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2NwSjF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0hSb2FYTXViV0Y1WW1WQ2JHOWpheWh6ZEcxMExtSnZaSGtzSUdac1lXZHpJQ1lnUmw5VFJVMUpRMDlNVDA1ZlQxQlVJRDhnVTE5VVJrWlVJRG9nVTE5VVJrWkdLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2JXVnlaMlVvUTI5a1pVZGxibVZ5WVhSdmNpNXdjbTkwYjNSNWNHVXNJRU52WkdWSFpXNWxjbUYwYjNJdVUzUmhkR1Z0Wlc1MEtUdGNibHh1SUNBZ0lDOHZJRVY0Y0hKbGMzTnBiMjV6TGx4dVhHNGdJQ0FnUTI5a1pVZGxibVZ5WVhSdmNpNUZlSEJ5WlhOemFXOXVJRDBnZTF4dVhHNGdJQ0FnSUNBZ0lGTmxjWFZsYm1ObFJYaHdjbVZ6YzJsdmJqb2dablZ1WTNScGIyNGdLR1Y0Y0hJc0lIQnlaV05sWkdWdVkyVXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MExDQnBMQ0JwZWp0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObElEd2djSEpsWTJWa1pXNWpaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdac1lXZHpJSHc5SUVaZlFVeE1UMWRmU1U0N1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR2w2SUQwZ1pYaHdjaTVsZUhCeVpYTnphVzl1Y3k1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2k1bGVIQnlaWE56YVc5dWMxdHBYU3dnVUhKbFkyVmtaVzVqWlM1QmMzTnBaMjV0Wlc1MExDQm1iR0ZuY3lrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwSUNzZ01TQThJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Njc0p5QXJJSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjR0Z5Wlc1MGFHVnphWHBsS0hKbGMzVnNkQ3dnVUhKbFkyVmtaVzVqWlM1VFpYRjFaVzVqWlN3Z2NISmxZMlZrWlc1alpTazdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1FYTnphV2R1YldWdWRFVjRjSEpsYzNOcGIyNDZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaMlZ1WlhKaGRHVkJjM05wWjI1dFpXNTBLR1Y0Y0hJdWJHVm1kQ3dnWlhod2NpNXlhV2RvZEN3Z1pYaHdjaTV2Y0dWeVlYUnZjaXdnY0hKbFkyVmtaVzVqWlN3Z1pteGhaM01wTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRUZ5Y205M1JuVnVZM1JwYjI1RmVIQnlaWE56YVc5dU9pQm1kVzVqZEdsdmJpQW9aWGh3Y2l3Z2NISmxZMlZrWlc1alpTd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ3WVhKbGJuUm9aWE5wZW1Vb2RHaHBjeTVuWlc1bGNtRjBaVVoxYm1OMGFXOXVRbTlrZVNobGVIQnlLU3dnVUhKbFkyVmtaVzVqWlM1QmNuSnZkMFoxYm1OMGFXOXVMQ0J3Y21WalpXUmxibU5sS1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JEYjI1a2FYUnBiMjVoYkVWNGNISmxjM05wYjI0NklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGQnlaV05sWkdWdVkyVXVRMjl1WkdsMGFXOXVZV3dnUENCd2NtVmpaV1JsYm1ObEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabXhoWjNNZ2ZEMGdSbDlCVEV4UFYxOUpUanRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ3WVhKbGJuUm9aWE5wZW1Vb1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1cxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG5SbGMzUXNJRkJ5WldObFpHVnVZMlV1VEc5bmFXTmhiRTlTTENCbWJHRm5jeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndZV05sSUNzZ0p6OG5JQ3NnYzNCaFkyVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLR1Y0Y0hJdVkyOXVjMlZ4ZFdWdWRDd2dVSEpsWTJWa1pXNWpaUzVCYzNOcFoyNXRaVzUwTENCbWJHRm5jeWtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndZV05sSUNzZ0p6b25JQ3NnYzNCaFkyVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLR1Y0Y0hJdVlXeDBaWEp1WVhSbExDQlFjbVZqWldSbGJtTmxMa0Z6YzJsbmJtMWxiblFzSUdac1lXZHpLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnVUhKbFkyVmtaVzVqWlM1RGIyNWthWFJwYjI1aGJDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndjbVZqWldSbGJtTmxYRzRnSUNBZ0lDQWdJQ0FnSUNBcE8xeHVJQ0FnSUNBZ0lDQjlMRnh1WEc0Z0lDQWdJQ0FnSUV4dloybGpZV3hGZUhCeVpYTnphVzl1T2lCbWRXNWpkR2x2YmlBb1pYaHdjaXdnY0hKbFkyVmtaVzVqWlN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGtKcGJtRnllVVY0Y0hKbGMzTnBiMjRvWlhod2Npd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFSnBibUZ5ZVVWNGNISmxjM05wYjI0NklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEN3Z1kzVnljbVZ1ZEZCeVpXTmxaR1Z1WTJVc0lHWnlZV2R0Wlc1MExDQnNaV1owVTI5MWNtTmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kzVnljbVZ1ZEZCeVpXTmxaR1Z1WTJVZ1BTQkNhVzVoY25sUWNtVmpaV1JsYm1ObFcyVjRjSEl1YjNCbGNtRjBiM0pkTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kzVnljbVZ1ZEZCeVpXTmxaR1Z1WTJVZ1BDQndjbVZqWldSbGJtTmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm14aFozTWdmRDBnUmw5QlRFeFBWMTlKVGp0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdabkpoWjIxbGJuUWdQU0IwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG14bFpuUXNJR04xY25KbGJuUlFjbVZqWldSbGJtTmxMQ0JtYkdGbmN5azdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHeGxablJUYjNWeVkyVWdQU0JtY21GbmJXVnVkQzUwYjFOMGNtbHVaeWdwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JHVm1kRk52ZFhKalpTNWphR0Z5UTI5a1pVRjBLR3hsWm5SVGIzVnlZMlV1YkdWdVozUm9JQzBnTVNrZ1BUMDlJREI0TWtZZ0x5b2dMeUFxTHlBbUppQmxjM1YwYVd4ekxtTnZaR1V1YVhOSlpHVnVkR2xtYVdWeVVHRnlkRVZUTlNobGVIQnlMbTl3WlhKaGRHOXlMbU5vWVhKRGIyUmxRWFFvTUNrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdXMlp5WVdkdFpXNTBMQ0J1YjBWdGNIUjVVM0JoWTJVb0tTd2daWGh3Y2k1dmNHVnlZWFJ2Y2wwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJR3B2YVc0b1puSmhaMjFsYm5Rc0lHVjRjSEl1YjNCbGNtRjBiM0lwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRDQTlJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1Y21sbmFIUXNJR04xY25KbGJuUlFjbVZqWldSbGJtTmxJQ3NnTVN3Z1pteGhaM01wTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pYaHdjaTV2Y0dWeVlYUnZjaUE5UFQwZ0p5OG5JQ1ltSUdaeVlXZHRaVzUwTG5SdlUzUnlhVzVuS0NrdVkyaGhja0YwS0RBcElEMDlQU0FuTHljZ2ZIeGNiaUFnSUNBZ0lDQWdJQ0FnSUdWNGNISXViM0JsY21GMGIzSXVjMnhwWTJVb0xURXBJRDA5UFNBblBDY2dKaVlnWm5KaFoyMWxiblF1ZEc5VGRISnBibWNvS1M1emJHbGpaU2d3TENBektTQTlQVDBnSnlFdExTY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCSlppQW5MeWNnWTI5dVkyRjBjeUIzYVhSb0lDY3ZKeUJ2Y2lCZ1BHQWdZMjl1WTJGMGN5QjNhWFJvSUdBaExTMWdMQ0JwZENCcGN5QnBiblJsY25CeVpYUmxaQ0JoY3lCamIyMXRaVzUwSUhOMFlYSjBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYm05RmJYQjBlVk53WVdObEtDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0daeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhbTlwYmloeVpYTjFiSFFzSUdaeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWNGNISXViM0JsY21GMGIzSWdQVDA5SUNkcGJpY2dKaVlnSVNobWJHRm5jeUFtSUVaZlFVeE1UMWRmU1U0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGc25LQ2NzSUhKbGMzVnNkQ3dnSnlrblhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQndZWEpsYm5Sb1pYTnBlbVVvY21WemRXeDBMQ0JqZFhKeVpXNTBVSEpsWTJWa1pXNWpaU3dnY0hKbFkyVmtaVzVqWlNrN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnUTJGc2JFVjRjSEpsYzNOcGIyNDZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDd2dhU3dnYVhvN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCR1gwRk1URTlYWDFWT1VFRlNRVlJJWDA1RlZ5QmlaV052YldWeklHWmhiSE5sTGx4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdXM1JvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1WTJGc2JHVmxMQ0JRY21WalpXUmxibU5sTGtOaGJHd3NJRVZmVkZSR0tWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25LQ2NwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdabTl5SUNocElEMGdNQ3dnYVhvZ1BTQmxlSEJ5V3lkaGNtZDFiV1Z1ZEhNblhTNXNaVzVuZEdnN0lHa2dQQ0JwZWpzZ0t5dHBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2RHaHBjeTVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvWlhod2Nsc25ZWEpuZFcxbGJuUnpKMTFiYVYwc0lGQnlaV05sWkdWdVkyVXVRWE56YVdkdWJXVnVkQ3dnUlY5VVZGUXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FTQXJJREVnUENCcGVpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25MQ2NnS3lCemNHRmpaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29KeWtuS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRW9abXhoWjNNZ0ppQkdYMEZNVEU5WFgwTkJURXdwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUZzbktDY3NJSEpsYzNWc2RDd2dKeWtuWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCd1lYSmxiblJvWlhOcGVtVW9jbVZ6ZFd4MExDQlFjbVZqWldSbGJtTmxMa05oYkd3c0lIQnlaV05sWkdWdVkyVXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFNWxkMFY0Y0hKbGMzTnBiMjQ2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ3dnYkdWdVozUm9MQ0JwTENCcGVpd2dhWFJsYlVac1lXZHpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHVnVaM1JvSUQwZ1pYaHdjbHNuWVhKbmRXMWxiblJ6SjEwdWJHVnVaM1JvTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCR1gwRk1URTlYWDBOQlRFd2dZbVZqYjIxbGN5Qm1ZV3h6WlM1Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVaZlFVeE1UMWRmVlU1UVFWSkJWRWhmVGtWWElHMWhlU0JpWldOdmJXVWdabUZzYzJVdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwZEdWdFJteGhaM01nUFNBb1pteGhaM01nSmlCR1gwRk1URTlYWDFWT1VFRlNRVlJJWDA1RlZ5QW1KaUFoY0dGeVpXNTBhR1Z6WlhNZ0ppWWdiR1Z1WjNSb0lEMDlQU0F3S1NBL0lFVmZWRVpVSURvZ1JWOVVSa1k3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJR3B2YVc0b1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0oyNWxkeWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2k1allXeHNaV1VzSUZCeVpXTmxaR1Z1WTJVdVRtVjNMQ0JwZEdWdFJteGhaM01wWEc0Z0lDQWdJQ0FnSUNBZ0lDQXBPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVNobWJHRm5jeUFtSUVaZlFVeE1UMWRmVlU1UVFWSkJWRWhmVGtWWEtTQjhmQ0J3WVhKbGJuUm9aWE5sY3lCOGZDQnNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0p5Z25LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCcGVpQTlJR3hsYm1kMGFEc2dhU0E4SUdsNk95QXJLMmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2xzbllYSm5kVzFsYm5SekoxMWJhVjBzSUZCeVpXTmxaR1Z1WTJVdVFYTnphV2R1YldWdWRDd2dSVjlVVkZRcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHa2dLeUF4SUR3Z2FYb3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Njc0p5QXJJSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25LU2NwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NHRnlaVzUwYUdWemFYcGxLSEpsYzNWc2RDd2dVSEpsWTJWa1pXNWpaUzVPWlhjc0lIQnlaV05sWkdWdVkyVXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFMWxiV0psY2tWNGNISmxjM05wYjI0NklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEN3Z1puSmhaMjFsYm5RN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFWmZRVXhNVDFkZlZVNVFRVkpCVkVoZlRrVlhJR0psWTI5dFpYTWdabUZzYzJVdVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JiZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2k1dlltcGxZM1FzSUZCeVpXTmxaR1Z1WTJVdVEyRnNiQ3dnS0dac1lXZHpJQ1lnUmw5QlRFeFBWMTlEUVV4TUtTQS9JRVZmVkZSR0lEb2dSVjlVUmtZcFhUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Y0Y0hJdVkyOXRjSFYwWldRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2duV3ljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1Y0hKdmNHVnlkSGtzSUZCeVpXTmxaR1Z1WTJVdVUyVnhkV1Z1WTJVc0lHWnNZV2R6SUNZZ1JsOUJURXhQVjE5RFFVeE1JRDhnUlY5VVZGUWdPaUJGWDFSR1ZDa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0NkZEp5azdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSEJ5TG05aWFtVmpkQzUwZVhCbElEMDlQU0JUZVc1MFlYZ3VUR2wwWlhKaGJDQW1KaUIwZVhCbGIyWWdaWGh3Y2k1dlltcGxZM1F1ZG1Gc2RXVWdQVDA5SUNkdWRXMWlaWEluS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBJRDBnZEc5VGIzVnlZMlZPYjJSbFYyaGxiazVsWldSbFpDaHlaWE4xYkhRcExuUnZVM1J5YVc1bktDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklGZG9aVzRnZEdobElHWnZiR3h2ZDJsdVp5QmpiMjVrYVhScGIyNXpJR0Z5WlNCaGJHd2dkSEoxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnSUNBeExpQk9ieUJtYkc5aGRHbHVaeUJ3YjJsdWRGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlBZ0lESXVJRVJ2YmlkMElHaGhkbVVnWlhod2IyNWxiblJ6WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJQ0FnTXk0Z1ZHaGxJR3hoYzNRZ1kyaGhjbUZqZEdWeUlHbHpJR0VnWkdWamFXMWhiQ0JrYVdkcGRGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlBZ0lEUXVJRTV2ZENCb1pYaGhaR1ZqYVcxaGJDQlBVaUJ2WTNSaGJDQnVkVzFpWlhJZ2JHbDBaWEpoYkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUIzWlNCemFHOTFiR1FnWVdSa0lHRWdabXh2WVhScGJtY2djRzlwYm5RdVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRDNXBibVJsZUU5bUtDY3VKeWtnUENBd0lDWW1YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSVM5YlpVVjRXRjB2TG5SbGMzUW9abkpoWjIxbGJuUXBJQ1ltWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pYTjFkR2xzY3k1amIyUmxMbWx6UkdWamFXMWhiRVJwWjJsMEtHWnlZV2R0Wlc1MExtTm9ZWEpEYjJSbFFYUW9abkpoWjIxbGJuUXViR1Z1WjNSb0lDMGdNU2twSUNZbVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJU2htY21GbmJXVnVkQzVzWlc1bmRHZ2dQajBnTWlBbUppQm1jbUZuYldWdWRDNWphR0Z5UTI5a1pVRjBLREFwSUQwOVBTQTBPQ2tnSUM4dklDY3dKMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29KeTRuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNnbkxpY3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0dkbGJtVnlZWFJsU1dSbGJuUnBabWxsY2lobGVIQnlMbkJ5YjNCbGNuUjVLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCd1lYSmxiblJvWlhOcGVtVW9jbVZ6ZFd4MExDQlFjbVZqWldSbGJtTmxMazFsYldKbGNpd2djSEpsWTJWa1pXNWpaU2s3WEc0Z0lDQWdJQ0FnSUgwc1hHNWNiaUFnSUNBZ0lDQWdUV1YwWVZCeWIzQmxjblI1T2lCbWRXNWpkR2x2YmlBb1pYaHdjaXdnY0hKbFkyVmtaVzVqWlN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYTjFiSFE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR1Y0Y0hJdWJXVjBZU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2duTGljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb1pYaHdjaTV3Y205d1pYSjBlU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NHRnlaVzUwYUdWemFYcGxLSEpsYzNWc2RDd2dVSEpsWTJWa1pXNWpaUzVOWlcxaVpYSXNJSEJ5WldObFpHVnVZMlVwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRlZ1WVhKNVJYaHdjbVZ6YzJsdmJqb2dablZ1WTNScGIyNGdLR1Y0Y0hJc0lIQnlaV05sWkdWdVkyVXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MExDQm1jbUZuYldWdWRDd2djbWxuYUhSRGFHRnlRMjlrWlN3Z2JHVm1kRk52ZFhKalpTd2diR1ZtZEVOb1lYSkRiMlJsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdabkpoWjIxbGJuUWdQU0IwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG1GeVozVnRaVzUwTENCUWNtVmpaV1JsYm1ObExsVnVZWEo1TENCRlgxUlVWQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemNHRmpaU0E5UFQwZ0p5Y3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JxYjJsdUtHVjRjSEl1YjNCbGNtRjBiM0lzSUdaeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdXMlY0Y0hJdWIzQmxjbUYwYjNKZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsZUhCeUxtOXdaWEpoZEc5eUxteGxibWQwYUNBK0lESXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaR1ZzWlhSbExDQjJiMmxrTENCMGVYQmxiMlpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaMlYwSUdCMGVYQmxiMllnVzExZ0xDQnViM1FnWUhSNWNHVnZabHRkWUZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnWm5KaFoyMWxiblFwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRkJ5WlhabGJuUWdhVzV6WlhKMGFXNW5JSE53WVdObGN5QmlaWFIzWldWdUlHOXdaWEpoZEc5eUlHRnVaQ0JoY21kMWJXVnVkQ0JwWmlCcGRDQnBjeUIxYm01bFkyVnpjMkZ5ZVZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJzYVd0bExDQmdJV052Ym1SZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hsWm5SVGIzVnlZMlVnUFNCMGIxTnZkWEpqWlU1dlpHVlhhR1Z1VG1WbFpHVmtLSEpsYzNWc2RDa3VkRzlUZEhKcGJtY29LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVm1kRU5vWVhKRGIyUmxJRDBnYkdWbWRGTnZkWEpqWlM1amFHRnlRMjlrWlVGMEtHeGxablJUYjNWeVkyVXViR1Z1WjNSb0lDMGdNU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISnBaMmgwUTJoaGNrTnZaR1VnUFNCbWNtRm5iV1Z1ZEM1MGIxTjBjbWx1WnlncExtTm9ZWEpEYjJSbFFYUW9NQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0Nnb2JHVm1kRU5vWVhKRGIyUmxJRDA5UFNBd2VESkNJQ0F2S2lBcklDb3ZJSHg4SUd4bFpuUkRhR0Z5UTI5a1pTQTlQVDBnTUhneVJDQWdMeW9nTFNBcUx5a2dKaVlnYkdWbWRFTm9ZWEpEYjJSbElEMDlQU0J5YVdkb2RFTm9ZWEpEYjJSbEtTQjhmRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNobGMzVjBhV3h6TG1OdlpHVXVhWE5KWkdWdWRHbG1hV1Z5VUdGeWRFVlROU2hzWldaMFEyaGhja052WkdVcElDWW1JR1Z6ZFhScGJITXVZMjlrWlM1cGMwbGtaVzUwYVdacFpYSlFZWEowUlZNMUtISnBaMmgwUTJoaGNrTnZaR1VwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29ibTlGYlhCMGVWTndZV05sS0NrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29abkpoWjIxbGJuUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb1puSmhaMjFsYm5RcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhCaGNtVnVkR2hsYzJsNlpTaHlaWE4xYkhRc0lGQnlaV05sWkdWdVkyVXVWVzVoY25rc0lIQnlaV05sWkdWdVkyVXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lGbHBaV3hrUlhod2NtVnpjMmx2YmpvZ1puVnVZM1JwYjI0Z0tHVjRjSElzSUhCeVpXTmxaR1Z1WTJVc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWNGNISXVaR1ZzWldkaGRHVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0FuZVdsbGJHUXFKenRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ0ozbHBaV3hrSnp0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsZUhCeUxtRnlaM1Z0Wlc1MEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhbTlwYmloY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG1GeVozVnRaVzUwTENCUWNtVmpaV1JsYm1ObExsbHBaV3hrTENCRlgxUlVWQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhCaGNtVnVkR2hsYzJsNlpTaHlaWE4xYkhRc0lGQnlaV05sWkdWdVkyVXVXV2xsYkdRc0lIQnlaV05sWkdWdVkyVXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFRjNZV2wwUlhod2NtVnpjMmx2YmpvZ1puVnVZM1JwYjI0Z0tHVjRjSElzSUhCeVpXTmxaR1Z1WTJVc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2FtOXBiaWhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsZUhCeUxtRnNiQ0EvSUNkaGQyRnBkQ29uSURvZ0oyRjNZV2wwSnl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWRsYm1WeVlYUmxSWGh3Y21WemMybHZiaWhsZUhCeUxtRnlaM1Z0Wlc1MExDQlFjbVZqWldSbGJtTmxMa0YzWVdsMExDQkZYMVJVVkNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NHRnlaVzUwYUdWemFYcGxLSEpsYzNWc2RDd2dVSEpsWTJWa1pXNWpaUzVCZDJGcGRDd2djSEpsWTJWa1pXNWpaU2s3WEc0Z0lDQWdJQ0FnSUgwc1hHNWNiaUFnSUNBZ0lDQWdWWEJrWVhSbFJYaHdjbVZ6YzJsdmJqb2dablZ1WTNScGIyNGdLR1Y0Y0hJc0lIQnlaV05sWkdWdVkyVXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWGh3Y2k1d2NtVm1hWGdwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY0dGeVpXNTBhR1Z6YVhwbEtGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JiWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsZUhCeUxtOXdaWEpoZEc5eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvWlhod2NpNWhjbWQxYldWdWRDd2dVSEpsWTJWa1pXNWpaUzVWYm1GeWVTd2dSVjlVVkZRcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGQnlaV05sWkdWdVkyVXVWVzVoY25rc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJ5WldObFpHVnVZMlZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhCaGNtVnVkR2hsYzJsNlpTaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmJYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLR1Y0Y0hJdVlYSm5kVzFsYm5Rc0lGQnlaV05sWkdWdVkyVXVVRzl6ZEdacGVDd2dSVjlVVkZRcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsZUhCeUxtOXdaWEpoZEc5eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlFjbVZqWldSbGJtTmxMbEJ2YzNSbWFYZ3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEpsWTJWa1pXNWpaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0tUdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCR2RXNWpkR2x2YmtWNGNISmxjM05wYjI0NklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZENBOUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm5aVzVsY21GMFpVRnplVzVqVUhKbFptbDRLR1Y0Y0hJc0lIUnlkV1VwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNkbWRXNWpkR2x2YmlkY2JpQWdJQ0FnSUNBZ0lDQWdJRjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhod2NpNXBaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHZGxibVZ5WVhSbFUzUmhjbE4xWm1acGVDaGxlSEJ5S1NCOGZDQnViMFZ0Y0hSNVUzQmhZMlVvS1NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29aMlZ1WlhKaGRHVkpaR1Z1ZEdsbWFXVnlLR1Y0Y0hJdWFXUXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29aMlZ1WlhKaGRHVlRkR0Z5VTNWbVptbDRLR1Y0Y0hJcElIeDhJSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0hSb2FYTXVaMlZ1WlhKaGRHVkdkVzVqZEdsdmJrSnZaSGtvWlhod2Npa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQkJjbkpoZVZCaGRIUmxjbTQ2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11UVhKeVlYbEZlSEJ5WlhOemFXOXVLR1Y0Y0hJc0lIQnlaV05sWkdWdVkyVXNJR1pzWVdkekxDQjBjblZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JCY25KaGVVVjRjSEpsYzNOcGIyNDZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5d2dhWE5RWVhSMFpYSnVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY21WemRXeDBMQ0J0ZFd4MGFXeHBibVVzSUhSb1lYUWdQU0IwYUdsek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlSEJ5TG1Wc1pXMWxiblJ6TG14bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuVzEwbk8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdiWFZzZEdsc2FXNWxJRDBnYVhOUVlYUjBaWEp1SUQ4Z1ptRnNjMlVnT2lCbGVIQnlMbVZzWlcxbGJuUnpMbXhsYm1kMGFDQStJREU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJKMXNuTENCdGRXeDBhV3hwYm1VZ1B5QnVaWGRzYVc1bElEb2dKeWRkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkMmwwYUVsdVpHVnVkQ2htZFc1amRHbHZiaUFvYVc1a1pXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHa3NJR2w2TzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmNpQW9hU0E5SURBc0lHbDZJRDBnWlhod2NpNWxiR1Z0Wlc1MGN5NXNaVzVuZEdnN0lHa2dQQ0JwZWpzZ0t5dHBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWlhod2NpNWxiR1Z0Wlc1MGMxdHBYU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHMTFiSFJwYkdsdVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHbHVaR1Z1ZENrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hU0FySURFZ1BUMDlJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvSnl3bktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0cxMWJIUnBiR2x1WlNBL0lHbHVaR1Z1ZENBNklDY25LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0hSb1lYUXVaMlZ1WlhKaGRHVkZlSEJ5WlhOemFXOXVLR1Y0Y0hJdVpXeGxiV1Z1ZEhOYmFWMHNJRkJ5WldObFpHVnVZMlV1UVhOemFXZHViV1Z1ZEN3Z1JWOVVWRlFwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hU0FySURFZ1BDQnBlaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0p5d25JQ3NnS0cxMWJIUnBiR2x1WlNBL0lHNWxkMnhwYm1VZ09pQnpjR0ZqWlNrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYlhWc2RHbHNhVzVsSUNZbUlDRmxibVJ6VjJsMGFFeHBibVZVWlhKdGFXNWhkRzl5S0hSdlUyOTFjbU5sVG05a1pWZG9aVzVPWldWa1pXUW9jbVZ6ZFd4MEtTNTBiMU4wY21sdVp5Z3BLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHNWxkMnhwYm1VcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYlhWc2RHbHNhVzVsSUQ4Z1ltRnpaU0E2SUNjbktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tDZGRKeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRkpsYzNSRmJHVnRaVzUwT2lCbWRXNWpkR2x2YmlobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDY3VMaTRuSUNzZ2RHaHBjeTVuWlc1bGNtRjBaVkJoZEhSbGNtNG9aWGh3Y2k1aGNtZDFiV1Z1ZENrN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnUTJ4aGMzTkZlSEJ5WlhOemFXOXVPaUJtZFc1amRHbHZiaUFvWlhod2Npd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUXNJR1p5WVdkdFpXNTBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1d5ZGpiR0Z6Y3lkZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVjRjSEl1YVdRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnZEdocGN5NW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2k1cFpDd2dVSEpsWTJWa1pXNWpaUzVUWlhGMVpXNWpaU3dnUlY5VVZGUXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSEJ5TG5OMWNHVnlRMnhoYzNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRDQTlJR3B2YVc0b0oyVjRkR1Z1WkhNbkxDQjBhR2x6TG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmlobGVIQnlMbk4xY0dWeVEyeGhjM01zSUZCeVpXTmxaR1Z1WTJVdVFYTnphV2R1YldWdWRDd2dSVjlVVkZRcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnWm5KaFoyMWxiblFwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29jM0JoWTJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2RHaHBjeTVuWlc1bGNtRjBaVk4wWVhSbGJXVnVkQ2hsZUhCeUxtSnZaSGtzSUZOZlZFWkdWQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JOWlhSb2IyUkVaV1pwYm1sMGFXOXVPaUJtZFc1amRHbHZiaUFvWlhod2Npd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUXNJR1p5WVdkdFpXNTBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Y0Y0hKYkozTjBZWFJwWXlkZEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdXeWR6ZEdGMGFXTW5JQ3NnYzNCaFkyVmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCYlhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGVIQnlMbXRwYm1RZ1BUMDlJQ2RuWlhRbklIeDhJR1Y0Y0hJdWEybHVaQ0E5UFQwZ0ozTmxkQ2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWNtRm5iV1Z1ZENBOUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYW05cGJpaGxlSEJ5TG10cGJtUXNJSFJvYVhNdVoyVnVaWEpoZEdWUWNtOXdaWEowZVV0bGVTaGxlSEJ5TG10bGVTd2daWGh3Y2k1amIyMXdkWFJsWkNrcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJuVnVZM1JwYjI1Q2IyUjVLR1Y0Y0hJdWRtRnNkV1VwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabkpoWjIxbGJuUWdQU0JiWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVZ5WVhSbFRXVjBhRzlrVUhKbFptbDRLR1Y0Y0hJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFVISnZjR1Z5ZEhsTFpYa29aWGh3Y2k1clpYa3NJR1Y0Y0hJdVkyOXRjSFYwWldRcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJuVnVZM1JwYjI1Q2IyUjVLR1Y0Y0hJdWRtRnNkV1VwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCcWIybHVLSEpsYzNWc2RDd2dabkpoWjIxbGJuUXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lGQnliM0JsY25SNU9pQm1kVzVqZEdsdmJpQW9aWGh3Y2l3Z2NISmxZMlZrWlc1alpTd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSEJ5TG10cGJtUWdQVDA5SUNkblpYUW5JSHg4SUdWNGNISXVhMmx1WkNBOVBUMGdKM05sZENjcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1cxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsZUhCeUxtdHBibVFzSUc1dlJXMXdkSGxUY0dGalpTZ3BMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWRsYm1WeVlYUmxVSEp2Y0dWeWRIbExaWGtvWlhod2NpNXJaWGtzSUdWNGNISXVZMjl0Y0hWMFpXUXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWRsYm1WeVlYUmxSblZ1WTNScGIyNUNiMlI1S0dWNGNISXVkbUZzZFdVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVjRjSEl1YzJodmNuUm9ZVzVrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaMlZ1WlhKaGRHVlFjbTl3WlhKMGVVdGxlU2hsZUhCeUxtdGxlU3dnWlhod2NpNWpiMjF3ZFhSbFpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSEJ5TG0xbGRHaHZaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJiWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxibVZ5WVhSbFRXVjBhRzlrVUhKbFptbDRLR1Y0Y0hJcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFVISnZjR1Z5ZEhsTFpYa29aWGh3Y2k1clpYa3NJR1Y0Y0hJdVkyOXRjSFYwWldRcExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtZGxibVZ5WVhSbFJuVnVZM1JwYjI1Q2IyUjVLR1Y0Y0hJdWRtRnNkV1VwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1kbGJtVnlZWFJsVUhKdmNHVnlkSGxMWlhrb1pYaHdjaTVyWlhrc0lHVjRjSEl1WTI5dGNIVjBaV1FwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNjNkp5QXJJSE53WVdObExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WjJWdVpYSmhkR1ZGZUhCeVpYTnphVzl1S0dWNGNISXVkbUZzZFdVc0lGQnlaV05sWkdWdVkyVXVRWE56YVdkdWJXVnVkQ3dnUlY5VVZGUXBYRzRnSUNBZ0lDQWdJQ0FnSUNCZE8xeHVJQ0FnSUNBZ0lDQjlMRnh1WEc0Z0lDQWdJQ0FnSUU5aWFtVmpkRVY0Y0hKbGMzTnBiMjQ2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUcxMWJIUnBiR2x1WlN3Z2NtVnpkV3gwTENCbWNtRm5iV1Z1ZEN3Z2RHaGhkQ0E5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWlhod2NpNXdjbTl3WlhKMGFXVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW5lMzBuTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2JYVnNkR2xzYVc1bElEMGdaWGh3Y2k1d2NtOXdaWEowYVdWekxteGxibWQwYUNBK0lERTdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lIZHBkR2hKYm1SbGJuUW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdaeVlXZHRaVzUwSUQwZ2RHaGhkQzVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvWlhod2NpNXdjbTl3WlhKMGFXVnpXekJkTENCUWNtVmpaV1JsYm1ObExsTmxjWFZsYm1ObExDQkZYMVJVVkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRnRkV3gwYVd4cGJtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcGMzTjFaWE1nTkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklFUnZJRzV2ZENCMGNtRnVjMlp2Y20wZ1puSnZiVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUNBZ1pHVnFZWFoxTGtOc1lYTnpMbVJsWTJ4aGNtVW9lMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUNBZ0lDQWdJRzFsZEdodlpESTZJR1oxYm1OMGFXOXVJQ2dwSUh0OVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QjBiMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUNBZ1pHVnFZWFoxTGtOc1lYTnpMbVJsWTJ4aGNtVW9lMjFsZEdodlpESTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QWdJQ0FnSUNCOWZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGb1lYTk1hVzVsVkdWeWJXbHVZWFJ2Y2loMGIxTnZkWEpqWlU1dlpHVlhhR1Z1VG1WbFpHVmtLR1p5WVdkdFpXNTBLUzUwYjFOMGNtbHVaeWdwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdXeUFuZXljc0lITndZV05sTENCbWNtRm5iV1Z1ZEN3Z2MzQmhZMlVzSUNkOUp5QmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2QybDBhRWx1WkdWdWRDaG1kVzVqZEdsdmJpQW9hVzVrWlc1MEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdrc0lHbDZPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRnNnSjNzbkxDQnVaWGRzYVc1bExDQnBibVJsYm5Rc0lHWnlZV2R0Wlc1MElGMDdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JYVnNkR2xzYVc1bEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tDY3NKeUFySUc1bGQyeHBibVVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXhMQ0JwZWlBOUlHVjRjSEl1Y0hKdmNHVnlkR2xsY3k1c1pXNW5kR2c3SUdrZ1BDQnBlanNnS3l0cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2hwYm1SbGJuUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZEdoaGRDNW5aVzVsY21GMFpVVjRjSEpsYzNOcGIyNG9aWGh3Y2k1d2NtOXdaWEowYVdWelcybGRMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgxUlVWQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHa2dLeUF4SUR3Z2FYb3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25MQ2NnS3lCdVpYZHNhVzVsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdWdVpITlhhWFJvVEdsdVpWUmxjbTFwYm1GMGIzSW9kRzlUYjNWeVkyVk9iMlJsVjJobGJrNWxaV1JsWkNoeVpYTjFiSFFwTG5SdlUzUnlhVzVuS0NrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvYm1WM2JHbHVaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaGlZWE5sS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0NkOUp5azdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFRnpjMmxuYm0xbGJuUlFZWFIwWlhKdU9pQm1kVzVqZEdsdmJpaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVoyVnVaWEpoZEdWQmMzTnBaMjV0Wlc1MEtHVjRjSEl1YkdWbWRDd2daWGh3Y2k1eWFXZG9kQ3dnWlhod2NpNXZjR1Z5WVhSdmNpd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFOWlhbVZqZEZCaGRIUmxjbTQ2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ3dnYVN3Z2FYb3NJRzExYkhScGJHbHVaU3dnY0hKdmNHVnlkSGtzSUhSb1lYUWdQU0IwYUdsek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlSEJ5TG5CeWIzQmxjblJwWlhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNkN2ZTYzdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUcxMWJIUnBiR2x1WlNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWNGNISXVjSEp2Y0dWeWRHbGxjeTVzWlc1bmRHZ2dQVDA5SURFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndjbTl3WlhKMGVTQTlJR1Y0Y0hJdWNISnZjR1Z5ZEdsbGMxc3dYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NISnZjR1Z5ZEhrdWRtRnNkV1V1ZEhsd1pTQWhQVDBnVTNsdWRHRjRMa2xrWlc1MGFXWnBaWElwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiWFZzZEdsc2FXNWxJRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmNpQW9hU0E5SURBc0lHbDZJRDBnWlhod2NpNXdjbTl3WlhKMGFXVnpMbXhsYm1kMGFEc2dhU0E4SUdsNk95QXJLMmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEp2Y0dWeWRIa2dQU0JsZUhCeUxuQnliM0JsY25ScFpYTmJhVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doY0hKdmNHVnlkSGt1YzJodmNuUm9ZVzVrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdGRXeDBhV3hwYm1VZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmJKM3NuTENCdGRXeDBhV3hwYm1VZ1B5QnVaWGRzYVc1bElEb2dKeWNnWFR0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnZDJsMGFFbHVaR1Z1ZENobWRXNWpkR2x2YmlBb2FXNWtaVzUwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2tzSUdsNk8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR2w2SUQwZ1pYaHdjaTV3Y205d1pYSjBhV1Z6TG14bGJtZDBhRHNnYVNBOElHbDZPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2JYVnNkR2xzYVc1bElEOGdhVzVrWlc1MElEb2dKeWNwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gwYUdGMExtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG5CeWIzQmxjblJwWlhOYmFWMHNJRkJ5WldObFpHVnVZMlV1VTJWeGRXVnVZMlVzSUVWZlZGUlVLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwSUNzZ01TQThJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25MQ2NnS3lBb2JYVnNkR2xzYVc1bElEOGdibVYzYkdsdVpTQTZJSE53WVdObEtTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHMTFiSFJwYkdsdVpTQW1KaUFoWlc1a2MxZHBkR2hNYVc1bFZHVnliV2x1WVhSdmNpaDBiMU52ZFhKalpVNXZaR1ZYYUdWdVRtVmxaR1ZrS0hKbGMzVnNkQ2t1ZEc5VGRISnBibWNvS1NrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2h1Wlhkc2FXNWxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHMTFiSFJwYkdsdVpTQS9JR0poYzJVZ09pQW5KeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2duZlNjcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCVWFHbHpSWGh3Y21WemMybHZiam9nWm5WdVkzUnBiMjRnS0dWNGNISXNJSEJ5WldObFpHVnVZMlVzSUdac1lXZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0ozUm9hWE1uTzF4dUlDQWdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0lDQWdJRk4xY0dWeU9pQm1kVzVqZEdsdmJpQW9aWGh3Y2l3Z2NISmxZMlZrWlc1alpTd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuYzNWd1pYSW5PMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFbGtaVzUwYVdacFpYSTZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdkbGJtVnlZWFJsU1dSbGJuUnBabWxsY2lobGVIQnlLVHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQkpiWEJ2Y25SRVpXWmhkV3gwVTNCbFkybG1hV1Z5T2lCbWRXNWpkR2x2YmlBb1pYaHdjaXdnY0hKbFkyVmtaVzVqWlN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm5aVzVsY21GMFpVbGtaVzUwYVdacFpYSW9aWGh3Y2k1cFpDQjhmQ0JsZUhCeUxteHZZMkZzS1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JKYlhCdmNuUk9ZVzFsYzNCaFkyVlRjR1ZqYVdacFpYSTZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJRnNuS2lkZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHbGtJRDBnWlhod2NpNXBaQ0I4ZkNCbGVIQnlMbXh2WTJGc08xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbGtLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2MzQmhZMlVnS3lBbllYTW5JQ3NnYm05RmJYQjBlVk53WVdObEtDa2dLeUJuWlc1bGNtRjBaVWxrWlc1MGFXWnBaWElvYVdRcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnU1cxd2IzSjBVM0JsWTJsbWFXVnlPaUJtZFc1amRHbHZiaUFvWlhod2Npd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwYlhCdmNuUmxaQ0E5SUdWNGNISXVhVzF3YjNKMFpXUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MElEMGdXeUJwYlhCdmNuUmxaQzV1WVcxbElGMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiRzlqWVd3Z1BTQmxlSEJ5TG14dlkyRnNPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR3h2WTJGc0lDWW1JR3h2WTJGc0xtNWhiV1VnSVQwOUlHbHRjRzl5ZEdWa0xtNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHViMFZ0Y0hSNVUzQmhZMlVvS1NBcklDZGhjeWNnS3lCdWIwVnRjSFI1VTNCaFkyVW9LU0FySUdkbGJtVnlZWFJsU1dSbGJuUnBabWxsY2loc2IyTmhiQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ0lDQWdJQ0FnZlN4Y2JseHVJQ0FnSUNBZ0lDQkZlSEJ2Y25SVGNHVmphV1pwWlhJNklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHeHZZMkZzSUQwZ1pYaHdjaTVzYjJOaGJEdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQmJJR3h2WTJGc0xtNWhiV1VnWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGVIQnZjblJsWkNBOUlHVjRjSEl1Wlhod2IzSjBaV1E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhod2IzSjBaV1FnSmlZZ1pYaHdiM0owWldRdWJtRnRaU0FoUFQwZ2JHOWpZV3d1Ym1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0c1dlJXMXdkSGxUY0dGalpTZ3BJQ3NnSjJGekp5QXJJRzV2Ulcxd2RIbFRjR0ZqWlNncElDc2daMlZ1WlhKaGRHVkpaR1Z1ZEdsbWFXVnlLR1Y0Y0c5eWRHVmtLU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lFeHBkR1Z5WVd3NklHWjFibU4wYVc5dUlDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmhkenRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsZUhCeUxtaGhjMDkzYmxCeWIzQmxjblI1S0NkeVlYY25LU0FtSmlCd1lYSnpaU0FtSmlCbGVIUnlZUzV5WVhjcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZWGNnUFNCd1lYSnpaU2hsZUhCeUxuSmhkeWt1WW05a2VWc3dYUzVsZUhCeVpYTnphVzl1TzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21GM0xuUjVjR1VnUFQwOUlGTjViblJoZUM1TWFYUmxjbUZzS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jbUYzTG5aaGJIVmxJRDA5UFNCbGVIQnlMblpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1Y0Y0hJdWNtRjNPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmpZWFJqYUNBb1pTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnViM1FnZFhObElISmhkeUJ3Y205d1pYSjBlVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Y0Y0hJdWRtRnNkV1VnUFQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSjI1MWJHd25PMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHVjRjSEl1ZG1Gc2RXVWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdWelkyRndaVk4wY21sdVp5aGxlSEJ5TG5aaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQmxlSEJ5TG5aaGJIVmxJRDA5UFNBbmJuVnRZbVZ5SnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCblpXNWxjbUYwWlU1MWJXSmxjaWhsZUhCeUxuWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJsZUhCeUxuWmhiSFZsSUQwOVBTQW5ZbTl2YkdWaGJpY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdaWGh3Y2k1MllXeDFaU0EvSUNkMGNuVmxKeUE2SUNkbVlXeHpaU2M3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCblpXNWxjbUYwWlZKbFowVjRjQ2hsZUhCeUxuWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JIWlc1bGNtRjBiM0pGZUhCeVpYTnphVzl1T2lCbWRXNWpkR2x2YmlBb1pYaHdjaXdnY0hKbFkyVmtaVzVqWlN3Z1pteGhaM01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGtOdmJYQnlaV2hsYm5OcGIyNUZlSEJ5WlhOemFXOXVLR1Y0Y0hJc0lIQnlaV05sWkdWdVkyVXNJR1pzWVdkektUdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCRGIyMXdjbVZvWlc1emFXOXVSWGh3Y21WemMybHZiam9nWm5WdVkzUnBiMjRnS0dWNGNISXNJSEJ5WldObFpHVnVZMlVzSUdac1lXZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJIWlc1bGNtRjBiM0pGZUhCeVpYTnphVzl1SUhOb2IzVnNaQ0JpWlNCd1lYSmxiblJvWlhOcGVtVmtJSGRwZEdnZ0tDNHVMaWtzSUVOdmJYQnlaV2hsYm5OcGIyNUZlSEJ5WlhOemFXOXVJSGRwZEdnZ1d5NHVMbDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRVIxWlNCMGJ5Qm9kSFJ3Y3pvdkwySjFaM3BwYkd4aExtMXZlbWxzYkdFdWIzSm5MM05vYjNkZlluVm5MbU5uYVQ5cFpEMDRPRE0wTmpnZ2NHOXphWFJwYjI0Z2IyWWdaWGh3Y2k1aWIyUjVJR05oYmlCa2FXWm1aWElnYVc0Z1UzQnBaR1Z5Ylc5dWEyVjVJR0Z1WkNCRlV6WmNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDd2dhU3dnYVhvc0lHWnlZV2R0Wlc1MExDQjBhR0YwSUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlDaGxlSEJ5TG5SNWNHVWdQVDA5SUZONWJuUmhlQzVIWlc1bGNtRjBiM0pGZUhCeVpYTnphVzl1S1NBL0lGc25LQ2RkSURvZ1d5ZGJKMTA3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGVIUnlZUzV0YjNvdVkyOXRjSEpsYUdWdWMybHZia1Y0Y0hKbGMzTnBiMjVUZEdGeWRITlhhWFJvUVhOemFXZHViV1Z1ZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnlZV2R0Wlc1MElEMGdkR2hwY3k1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b1pYaHdjaTVpYjJSNUxDQlFjbVZqWldSbGJtTmxMa0Z6YzJsbmJtMWxiblFzSUVWZlZGUlVLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNobWNtRm5iV1Z1ZENrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGVIQnlMbUpzYjJOcmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGRwZEdoSmJtUmxiblFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCcGVpQTlJR1Y0Y0hJdVlteHZZMnR6TG14bGJtZDBhRHNnYVNBOElHbDZPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnlZV2R0Wlc1MElEMGdkR2hoZEM1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b1pYaHdjaTVpYkc5amEzTmJhVjBzSUZCeVpXTmxaR1Z1WTJVdVUyVnhkV1Z1WTJVc0lFVmZWRlJVS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJRDRnTUNCOGZDQmxlSFJ5WVM1dGIzb3VZMjl0Y0hKbGFHVnVjMmx2YmtWNGNISmxjM05wYjI1VGRHRnlkSE5YYVhSb1FYTnphV2R1YldWdWRDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdwdmFXNG9jbVZ6ZFd4MExDQm1jbUZuYldWdWRDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0daeVlXZHRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhod2NpNW1hV3gwWlhJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnFiMmx1S0hKbGMzVnNkQ3dnSjJsbUp5QXJJSE53WVdObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRDQTlJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1Wm1sc2RHVnlMQ0JRY21WalpXUmxibU5sTGxObGNYVmxibU5sTENCRlgxUlVWQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnYW05cGJpaHlaWE4xYkhRc0lGc2dKeWduTENCbWNtRm5iV1Z1ZEN3Z0p5a25JRjBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdWNGRISmhMbTF2ZWk1amIyMXdjbVZvWlc1emFXOXVSWGh3Y21WemMybHZibE4wWVhKMGMxZHBkR2hCYzNOcFoyNXRaVzUwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1puSmhaMjFsYm5RZ1BTQjBhR2x6TG1kbGJtVnlZWFJsUlhod2NtVnpjMmx2YmlobGVIQnlMbUp2Wkhrc0lGQnlaV05sWkdWdVkyVXVRWE56YVdkdWJXVnVkQ3dnUlY5VVZGUXBPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnYW05cGJpaHlaWE4xYkhRc0lHWnlZV2R0Wlc1MEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBMbkIxYzJnb0tHVjRjSEl1ZEhsd1pTQTlQVDBnVTNsdWRHRjRMa2RsYm1WeVlYUnZja1Y0Y0hKbGMzTnBiMjRwSUQ4Z0p5a25JRG9nSjEwbktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJSDBzWEc1Y2JpQWdJQ0FnSUNBZ1EyOXRjSEpsYUdWdWMybHZia0pzYjJOck9pQm1kVzVqZEdsdmJpQW9aWGh3Y2l3Z2NISmxZMlZrWlc1alpTd2dabXhoWjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQm1jbUZuYldWdWREdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxlSEJ5TG14bFpuUXVkSGx3WlNBOVBUMGdVM2x1ZEdGNExsWmhjbWxoWW14bFJHVmpiR0Z5WVhScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtY21GbmJXVnVkQ0E5SUZ0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaWGh3Y2k1c1pXWjBMbXRwYm1Rc0lHNXZSVzF3ZEhsVGNHRmpaU2dwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1kbGJtVnlZWFJsVTNSaGRHVnRaVzUwS0dWNGNISXViR1ZtZEM1a1pXTnNZWEpoZEdsdmJuTmJNRjBzSUZOZlJrWkdSaWxjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRDQTlJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1YkdWbWRDd2dVSEpsWTJWa1pXNWpaUzVEWVd4c0xDQkZYMVJVVkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBJRDBnYW05cGJpaG1jbUZuYldWdWRDd2daWGh3Y2k1dlppQS9JQ2R2WmljZ09pQW5hVzRuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBJRDBnYW05cGJpaG1jbUZuYldWdWRDd2dkR2hwY3k1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b1pYaHdjaTV5YVdkb2RDd2dVSEpsWTJWa1pXNWpaUzVUWlhGMVpXNWpaU3dnUlY5VVZGUXBLVHRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGc2dKMlp2Y2ljZ0t5QnpjR0ZqWlNBcklDY29KeXdnWm5KaFoyMWxiblFzSUNjcEp5QmRPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lGTndjbVZoWkVWc1pXMWxiblE2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlGdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW5MaTR1Snl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWRsYm1WeVlYUmxSWGh3Y21WemMybHZiaWhsZUhCeUxtRnlaM1Z0Wlc1MExDQlFjbVZqWldSbGJtTmxMa0Z6YzJsbmJtMWxiblFzSUVWZlZGUlVLVnh1SUNBZ0lDQWdJQ0FnSUNBZ1hUdGNiaUFnSUNBZ0lDQWdmU3hjYmx4dUlDQWdJQ0FnSUNCVVlXZG5aV1JVWlcxd2JHRjBaVVY0Y0hKbGMzTnBiMjQ2SUdaMWJtTjBhVzl1SUNobGVIQnlMQ0J3Y21WalpXUmxibU5sTENCbWJHRm5jeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdsMFpXMUdiR0ZuY3lBOUlFVmZWRlJHTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NFb1pteGhaM01nSmlCR1gwRk1URTlYWDBOQlRFd3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVhSbGJVWnNZV2R6SUQwZ1JWOVVSa1k3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ6ZFd4MElEMGdXMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVoyVnVaWEpoZEdWRmVIQnlaWE56YVc5dUtHVjRjSEl1ZEdGbkxDQlFjbVZqWldSbGJtTmxMa05oYkd3c0lHbDBaVzFHYkdGbmN5a3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1blpXNWxjbUYwWlVWNGNISmxjM05wYjI0b1pYaHdjaTV4ZFdGemFTd2dVSEpsWTJWa1pXNWpaUzVRY21sdFlYSjVMQ0JGWDBaR1ZDbGNiaUFnSUNBZ0lDQWdJQ0FnSUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjR0Z5Wlc1MGFHVnphWHBsS0hKbGMzVnNkQ3dnVUhKbFkyVmtaVzVqWlM1VVlXZG5aV1JVWlcxd2JHRjBaU3dnY0hKbFkyVmtaVzVqWlNrN1hHNGdJQ0FnSUNBZ0lIMHNYRzVjYmlBZ0lDQWdJQ0FnVkdWdGNHeGhkR1ZGYkdWdFpXNTBPaUJtZFc1amRHbHZiaUFvWlhod2Npd2djSEpsWTJWa1pXNWpaU3dnWm14aFozTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRVJ2YmlkMElIVnpaU0JjSW1OdmIydGxaRndpTGlCVGFXNWpaU0IwWVdkblpXUWdkR1Z0Y0d4aGRHVWdZMkZ1SUhWelpTQnlZWGNnZEdWdGNHeGhkR1ZjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSEpsY0hKbGMyVnVkR0YwYVc5dUxpQlRieUJwWmlCM1pTQmtieUJ6Ynl3Z2FYUWdZbkpsWVd0eklIUm9aU0J6WTNKcGNIUWdjMlZ0WVc1MGFXTnpMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdWNGNISXVkbUZzZFdVdWNtRjNPMXh1SUNBZ0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnSUNBZ0lGUmxiWEJzWVhSbFRHbDBaWEpoYkRvZ1puVnVZM1JwYjI0Z0tHVjRjSElzSUhCeVpXTmxaR1Z1WTJVc0lHWnNZV2R6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTENCcExDQnBlanRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlGc2dKMkFuSUYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCcGVpQTlJR1Y0Y0hJdWNYVmhjMmx6TG14bGJtZDBhRHNnYVNBOElHbDZPeUFySzJrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gwYUdsekxtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpaGxlSEJ5TG5GMVlYTnBjMXRwWFN3Z1VISmxZMlZrWlc1alpTNVFjbWx0WVhKNUxDQkZYMVJVVkNrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwSUNzZ01TQThJR2w2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNXdkWE5vS0Nja2V5Y2dLeUJ6Y0dGalpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tIUm9hWE11WjJWdVpYSmhkR1ZGZUhCeVpYTnphVzl1S0dWNGNISXVaWGh3Y21WemMybHZibk5iYVYwc0lGQnlaV05sWkdWdVkyVXVVMlZ4ZFdWdVkyVXNJRVZmVkZSVUtTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tITndZV05sSUNzZ0ozMG5LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDZ25ZQ2NwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUNBZ2ZTeGNibHh1SUNBZ0lDQWdJQ0JOYjJSMWJHVlRjR1ZqYVdacFpYSTZJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVUR2wwWlhKaGJDaGxlSEJ5TENCd2NtVmpaV1JsYm1ObExDQm1iR0ZuY3lrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnRaWEpuWlNoRGIyUmxSMlZ1WlhKaGRHOXlMbkJ5YjNSdmRIbHdaU3dnUTI5a1pVZGxibVZ5WVhSdmNpNUZlSEJ5WlhOemFXOXVLVHRjYmx4dUlDQWdJRU52WkdWSFpXNWxjbUYwYjNJdWNISnZkRzkwZVhCbExtZGxibVZ5WVhSbFJYaHdjbVZ6YzJsdmJpQTlJR1oxYm1OMGFXOXVJQ2hsZUhCeUxDQndjbVZqWldSbGJtTmxMQ0JtYkdGbmN5a2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTENCMGVYQmxPMXh1WEc0Z0lDQWdJQ0FnSUhSNWNHVWdQU0JsZUhCeUxuUjVjR1VnZkh3Z1UzbHVkR0Y0TGxCeWIzQmxjblI1TzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hsZUhSeVlTNTJaWEppWVhScGJTQW1KaUJsZUhCeUxtaGhjMDkzYmxCeWIzQmxjblI1S0dWNGRISmhMblpsY21KaGRHbHRLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHZGxibVZ5WVhSbFZtVnlZbUYwYVcwb1pYaHdjaXdnY0hKbFkyVmtaVzVqWlNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0IwYUdselczUjVjR1ZkS0dWNGNISXNJSEJ5WldObFpHVnVZMlVzSUdac1lXZHpLVHRjYmx4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hsZUhSeVlTNWpiMjF0Wlc1MEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCaFpHUkRiMjF0Wlc1MGN5aGxlSEJ5TENCeVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGIxTnZkWEpqWlU1dlpHVlhhR1Z1VG1WbFpHVmtLSEpsYzNWc2RDd2daWGh3Y2lrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUVOdlpHVkhaVzVsY21GMGIzSXVjSEp2ZEc5MGVYQmxMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBJRDBnWm5WdVkzUnBiMjRnS0hOMGJYUXNJR1pzWVdkektTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCeVpYTjFiSFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWREdGNibHh1SUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0IwYUdselczTjBiWFF1ZEhsd1pWMG9jM1J0ZEN3Z1pteGhaM01wTzF4dVhHNGdJQ0FnSUNBZ0lDOHZJRUYwZEdGamFDQmpiMjF0Wlc1MGMxeHVYRzRnSUNBZ0lDQWdJR2xtSUNobGVIUnlZUzVqYjIxdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQmhaR1JEYjIxdFpXNTBjeWh6ZEcxMExDQnlaWE4xYkhRcE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWm5KaFoyMWxiblFnUFNCMGIxTnZkWEpqWlU1dlpHVlhhR1Z1VG1WbFpHVmtLSEpsYzNWc2RDa3VkRzlUZEhKcGJtY29LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tITjBiWFF1ZEhsd1pTQTlQVDBnVTNsdWRHRjRMbEJ5YjJkeVlXMGdKaVlnSVhOaFptVkRiMjVqWVhSbGJtRjBhVzl1SUNZbUlHNWxkMnhwYm1VZ1BUMDlJQ2NuSUNZbUlDQm1jbUZuYldWdWRDNWphR0Z5UVhRb1puSmhaMjFsYm5RdWJHVnVaM1JvSUMwZ01Ta2dQVDA5SUNkY1hHNG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQnpiM1Z5WTJWTllYQWdQeUIwYjFOdmRYSmpaVTV2WkdWWGFHVnVUbVZsWkdWa0tISmxjM1ZzZENrdWNtVndiR0ZqWlZKcFoyaDBLQzljWEhNckpDOHNJQ2NuS1NBNklHWnlZV2R0Wlc1MExuSmxjR3hoWTJVb0wxeGNjeXNrTHl3Z0p5Y3BPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSdlUyOTFjbU5sVG05a1pWZG9aVzVPWldWa1pXUW9jbVZ6ZFd4MExDQnpkRzEwS1R0Y2JpQWdJQ0I5TzF4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnWjJWdVpYSmhkR1ZKYm5SbGNtNWhiQ2h1YjJSbEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCamIyUmxaMlZ1TzF4dVhHNGdJQ0FnSUNBZ0lHTnZaR1ZuWlc0Z1BTQnVaWGNnUTI5a1pVZGxibVZ5WVhSdmNpZ3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FYTlRkR0YwWlcxbGJuUW9ibTlrWlNrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqYjJSbFoyVnVMbWRsYm1WeVlYUmxVM1JoZEdWdFpXNTBLRzV2WkdVc0lGTmZWRVpHUmlrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JwWmlBb2FYTkZlSEJ5WlhOemFXOXVLRzV2WkdVcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5a1pXZGxiaTVuWlc1bGNtRjBaVVY0Y0hKbGMzTnBiMjRvYm05a1pTd2dVSEpsWTJWa1pXNWpaUzVUWlhGMVpXNWpaU3dnUlY5VVZGUXBPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkVmJtdHViM2R1SUc1dlpHVWdkSGx3WlRvZ0p5QXJJRzV2WkdVdWRIbHdaU2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdaMlZ1WlhKaGRHVW9ibTlrWlN3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWkdWbVlYVnNkRTl3ZEdsdmJuTWdQU0JuWlhSRVpXWmhkV3gwVDNCMGFXOXVjeWdwTENCeVpYTjFiSFFzSUhCaGFYSTdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tHOXdkR2x2Ym5NZ0lUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1QySnpiMnhsZEdVZ2IzQjBhVzl1YzF4dUlDQWdJQ0FnSUNBZ0lDQWdMeTljYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJQ0FnWUc5d2RHbHZibk11YVc1a1pXNTBZRnh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdJQ0JnYjNCMGFXOXVjeTVpWVhObFlGeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk5Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVsdWMzUmxZV1FnYjJZZ2RHaGxiU3dnZDJVZ1kyRnVJSFZ6WlNCZ2IzQjBhVzl1TG1admNtMWhkQzVwYm1SbGJuUmdMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnZjSFJwYjI1ekxtbHVaR1Z1ZENBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWldaaGRXeDBUM0IwYVc5dWN5NW1iM0p0WVhRdWFXNWtaVzUwTG5OMGVXeGxJRDBnYjNCMGFXOXVjeTVwYm1SbGJuUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUc5d2RHbHZibk11WW1GelpTQTlQVDBnSjI1MWJXSmxjaWNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pXWmhkV3gwVDNCMGFXOXVjeTVtYjNKdFlYUXVhVzVrWlc1MExtSmhjMlVnUFNCdmNIUnBiMjV6TG1KaGMyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J2Y0hScGIyNXpJRDBnZFhCa1lYUmxSR1ZsY0d4NUtHUmxabUYxYkhSUGNIUnBiMjV6TENCdmNIUnBiMjV6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x1WkdWdWRDQTlJRzl3ZEdsdmJuTXVabTl5YldGMExtbHVaR1Z1ZEM1emRIbHNaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5NWlZWE5sSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0poYzJVZ1BTQnZjSFJwYjI1ekxtSmhjMlU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjMlVnUFNCemRISnBibWRTWlhCbFlYUW9hVzVrWlc1MExDQnZjSFJwYjI1ekxtWnZjbTFoZEM1cGJtUmxiblF1WW1GelpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2Y0hScGIyNXpJRDBnWkdWbVlYVnNkRTl3ZEdsdmJuTTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxiblFnUFNCdmNIUnBiMjV6TG1admNtMWhkQzVwYm1SbGJuUXVjM1I1YkdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JpWVhObElEMGdjM1J5YVc1blVtVndaV0YwS0dsdVpHVnVkQ3dnYjNCMGFXOXVjeTVtYjNKdFlYUXVhVzVrWlc1MExtSmhjMlVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHcHpiMjRnUFNCdmNIUnBiMjV6TG1admNtMWhkQzVxYzI5dU8xeHVJQ0FnSUNBZ0lDQnlaVzUxYldKbGNpQTlJRzl3ZEdsdmJuTXVabTl5YldGMExuSmxiblZ0WW1WeU8xeHVJQ0FnSUNBZ0lDQm9aWGhoWkdWamFXMWhiQ0E5SUdwemIyNGdQeUJtWVd4elpTQTZJRzl3ZEdsdmJuTXVabTl5YldGMExtaGxlR0ZrWldOcGJXRnNPMXh1SUNBZ0lDQWdJQ0J4ZFc5MFpYTWdQU0JxYzI5dUlEOGdKMlJ2ZFdKc1pTY2dPaUJ2Y0hScGIyNXpMbVp2Y20xaGRDNXhkVzkwWlhNN1hHNGdJQ0FnSUNBZ0lHVnpZMkZ3Wld4bGMzTWdQU0J2Y0hScGIyNXpMbVp2Y20xaGRDNWxjMk5oY0dWc1pYTnpPMXh1SUNBZ0lDQWdJQ0J1Wlhkc2FXNWxJRDBnYjNCMGFXOXVjeTVtYjNKdFlYUXVibVYzYkdsdVpUdGNiaUFnSUNBZ0lDQWdjM0JoWTJVZ1BTQnZjSFJwYjI1ekxtWnZjbTFoZEM1emNHRmpaVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdVptOXliV0YwTG1OdmJYQmhZM1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDJ4cGJtVWdQU0J6Y0dGalpTQTlJR2x1WkdWdWRDQTlJR0poYzJVZ1BTQW5KenRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCd1lYSmxiblJvWlhObGN5QTlJRzl3ZEdsdmJuTXVabTl5YldGMExuQmhjbVZ1ZEdobGMyVnpPMXh1SUNBZ0lDQWdJQ0J6WlcxcFkyOXNiMjV6SUQwZ2IzQjBhVzl1Y3k1bWIzSnRZWFF1YzJWdGFXTnZiRzl1Y3p0Y2JpQWdJQ0FnSUNBZ2MyRm1aVU52Ym1OaGRHVnVZWFJwYjI0Z1BTQnZjSFJwYjI1ekxtWnZjbTFoZEM1ellXWmxRMjl1WTJGMFpXNWhkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ1pHbHlaV04wYVhabElEMGdiM0IwYVc5dWN5NWthWEpsWTNScGRtVTdYRzRnSUNBZ0lDQWdJSEJoY25ObElEMGdhbk52YmlBL0lHNTFiR3dnT2lCdmNIUnBiMjV6TG5CaGNuTmxPMXh1SUNBZ0lDQWdJQ0J6YjNWeVkyVk5ZWEFnUFNCdmNIUnBiMjV6TG5OdmRYSmpaVTFoY0R0Y2JpQWdJQ0FnSUNBZ2MyOTFjbU5sUTI5a1pTQTlJRzl3ZEdsdmJuTXVjMjkxY21ObFEyOWtaVHRjYmlBZ0lDQWdJQ0FnY0hKbGMyVnlkbVZDYkdGdWEweHBibVZ6SUQwZ2IzQjBhVzl1Y3k1bWIzSnRZWFF1Y0hKbGMyVnlkbVZDYkdGdWEweHBibVZ6SUNZbUlITnZkWEpqWlVOdlpHVWdJVDA5SUc1MWJHdzdYRzRnSUNBZ0lDQWdJR1Y0ZEhKaElEMGdiM0IwYVc5dWN6dGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MyOTFjbU5sVFdGd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JV1Y0Y0c5eWRITXVZbkp2ZDNObGNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUZkbElHRnpjM1Z0WlNCbGJuWnBjbTl1YldWdWRDQnBjeUJ1YjJSbExtcHpYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnUVc1a0lIQnlaWFpsYm5RZ1puSnZiU0JwYm1Oc2RXUnBibWNnYzI5MWNtTmxMVzFoY0NCaWVTQmljbTkzYzJWeWFXWjVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdVMjkxY21ObFRtOWtaU0E5SUhKbGNYVnBjbVVvSjNOdmRYSmpaUzF0WVhBbktTNVRiM1Z5WTJWT2IyUmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCVGIzVnlZMlZPYjJSbElEMGdaMnh2WW1Gc0xuTnZkWEpqWlUxaGNDNVRiM1Z5WTJWT2IyUmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnY21WemRXeDBJRDBnWjJWdVpYSmhkR1ZKYm5SbGNtNWhiQ2h1YjJSbEtUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb0lYTnZkWEpqWlUxaGNDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NHRnBjaUE5SUh0amIyUmxPaUJ5WlhOMWJIUXVkRzlUZEhKcGJtY29LU3dnYldGd09pQnVkV3hzZlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZjSFJwYjI1ekxuTnZkWEpqWlUxaGNGZHBkR2hEYjJSbElEOGdjR0ZwY2lBNklIQmhhWEl1WTI5a1pUdGNiaUFnSUNBZ0lDQWdmVnh1WEc1Y2JpQWdJQ0FnSUNBZ2NHRnBjaUE5SUhKbGMzVnNkQzUwYjFOMGNtbHVaMWRwZEdoVGIzVnlZMlZOWVhBb2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1sc1pUb2diM0IwYVc5dWN5NW1hV3hsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjMjkxY21ObFVtOXZkRG9nYjNCMGFXOXVjeTV6YjNWeVkyVk5ZWEJTYjI5MFhHNGdJQ0FnSUNBZ0lIMHBPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHZjSFJwYjI1ekxuTnZkWEpqWlVOdmJuUmxiblFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJoYVhJdWJXRndMbk5sZEZOdmRYSmpaVU52Ym5SbGJuUW9iM0IwYVc5dWN5NXpiM1Z5WTJWTllYQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RHbHZibk11YzI5MWNtTmxRMjl1ZEdWdWRDazdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9iM0IwYVc5dWN5NXpiM1Z5WTJWTllYQlhhWFJvUTI5a1pTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhCaGFYSTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY0dGcGNpNXRZWEF1ZEc5VGRISnBibWNvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JHVDFKTlFWUmZUVWxPU1VaWklEMGdlMXh1SUNBZ0lDQWdJQ0JwYm1SbGJuUTZJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITjBlV3hsT2lBbkp5eGNiaUFnSUNBZ0lDQWdJQ0FnSUdKaGMyVTZJREJjYmlBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ2NtVnVkVzFpWlhJNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUdobGVHRmtaV05wYldGc09pQjBjblZsTEZ4dUlDQWdJQ0FnSUNCeGRXOTBaWE02SUNkaGRYUnZKeXhjYmlBZ0lDQWdJQ0FnWlhOallYQmxiR1Z6Y3pvZ2RISjFaU3hjYmlBZ0lDQWdJQ0FnWTI5dGNHRmpkRG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdjR0Z5Wlc1MGFHVnpaWE02SUdaaGJITmxMRnh1SUNBZ0lDQWdJQ0J6WlcxcFkyOXNiMjV6T2lCbVlXeHpaVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQkdUMUpOUVZSZlJFVkdRVlZNVkZNZ1BTQm5aWFJFWldaaGRXeDBUM0IwYVc5dWN5Z3BMbVp2Y20xaGREdGNibHh1SUNBZ0lHVjRjRzl5ZEhNdWRtVnljMmx2YmlBOUlISmxjWFZwY21Vb0p5NHZjR0ZqYTJGblpTNXFjMjl1SnlrdWRtVnljMmx2Ymp0Y2JpQWdJQ0JsZUhCdmNuUnpMbWRsYm1WeVlYUmxJRDBnWjJWdVpYSmhkR1U3WEc0Z0lDQWdaWGh3YjNKMGN5NWhkSFJoWTJoRGIyMXRaVzUwY3lBOUlHVnpkSEpoZG1WeWMyVXVZWFIwWVdOb1EyOXRiV1Z1ZEhNN1hHNGdJQ0FnWlhod2IzSjBjeTVRY21WalpXUmxibU5sSUQwZ2RYQmtZWFJsUkdWbGNHeDVLSHQ5TENCUWNtVmpaV1JsYm1ObEtUdGNiaUFnSUNCbGVIQnZjblJ6TG1KeWIzZHpaWElnUFNCbVlXeHpaVHRjYmlBZ0lDQmxlSEJ2Y25SekxrWlBVazFCVkY5TlNVNUpSbGtnUFNCR1QxSk5RVlJmVFVsT1NVWlpPMXh1SUNBZ0lHVjRjRzl5ZEhNdVJrOVNUVUZVWDBSRlJrRlZURlJUSUQwZ1JrOVNUVUZVWDBSRlJrRlZURlJUTzF4dWZTZ3BLVHRjYmk4cUlIWnBiVG9nYzJWMElITjNQVFFnZEhNOU5DQmxkQ0IwZHowNE1DQTZJQ292WEc0aVhYMD0iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuLypqc2xpbnQgdmFyczpmYWxzZSwgYml0d2lzZTp0cnVlKi9cbi8qanNoaW50IGluZGVudDo0Ki9cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSwgZGVmaW5lOnRydWUqL1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gVW5pdmVyc2FsIE1vZHVsZSBEZWZpbml0aW9uIChVTUQpIHRvIHN1cHBvcnQgQU1ELCBDb21tb25KUy9Ob2RlLmpzLFxuICAgIC8vIGFuZCBwbGFpbiBicm93c2VyIGxvYWRpbmcsXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeSgocm9vdC5lc3RyYXZlcnNlID0ge30pKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uIGNsb25lKGV4cG9ydHMpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgU3ludGF4LFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBWaXNpdG9yT3B0aW9uLFxuICAgICAgICBWaXNpdG9yS2V5cyxcbiAgICAgICAgb2JqZWN0Q3JlYXRlLFxuICAgICAgICBvYmplY3RLZXlzLFxuICAgICAgICBCUkVBSyxcbiAgICAgICAgU0tJUCxcbiAgICAgICAgUkVNT1ZFO1xuXG4gICAgZnVuY3Rpb24gaWdub3JlSlNIaW50RXJyb3IoKSB7IH1cblxuICAgIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShhcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnJheSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVlcENvcHkob2JqKSB7XG4gICAgICAgIHZhciByZXQgPSB7fSwga2V5LCB2YWw7XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IGRlZXBDb3B5KHZhbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hhbGxvd0NvcHkob2JqKSB7XG4gICAgICAgIHZhciByZXQgPSB7fSwga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgaWdub3JlSlNIaW50RXJyb3Ioc2hhbGxvd0NvcHkpO1xuXG4gICAgLy8gYmFzZWQgb24gTExWTSBsaWJjKysgdXBwZXJfYm91bmQgLyBsb3dlcl9ib3VuZFxuICAgIC8vIE1JVCBMaWNlbnNlXG5cbiAgICBmdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCBmdW5jKSB7XG4gICAgICAgIHZhciBkaWZmLCBsZW4sIGksIGN1cnJlbnQ7XG5cbiAgICAgICAgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICAgICAgY3VycmVudCA9IGkgKyBkaWZmO1xuICAgICAgICAgICAgaWYgKGZ1bmMoYXJyYXlbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnQgKyAxO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb3dlckJvdW5kKGFycmF5LCBmdW5jKSB7XG4gICAgICAgIHZhciBkaWZmLCBsZW4sIGksIGN1cnJlbnQ7XG5cbiAgICAgICAgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICAgICAgY3VycmVudCA9IGkgKyBkaWZmO1xuICAgICAgICAgICAgaWYgKGZ1bmMoYXJyYXlbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnQgKyAxO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgaWdub3JlSlNIaW50RXJyb3IobG93ZXJCb3VuZCk7XG5cbiAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEYoKSB7IH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIEYucHJvdG90eXBlID0gbztcbiAgICAgICAgICAgIHJldHVybiBuZXcgRigpO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgdmFyIGtleXMgPSBbXSwga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cztcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKHRvLCBmcm9tKSB7XG4gICAgICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhmcm9tKSwga2V5LCBpLCBsZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICBTeW50YXggPSB7XG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiAnQXNzaWdubWVudEV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246ICdBcnJheUV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiAnQXdhaXRFeHByZXNzaW9uJywgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiAnQmxvY2tTdGF0ZW1lbnQnLFxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogJ0NhbGxFeHByZXNzaW9uJyxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG4gICAgICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246ICdDbGFzc0RlY2xhcmF0aW9uJyxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiAnQ29tcHJlaGVuc2lvbkJsb2NrJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogJ0NvbXByZWhlbnNpb25FeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246ICdDb25kaXRpb25hbEV4cHJlc3Npb24nLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50JyxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogJ0RpcmVjdGl2ZVN0YXRlbWVudCcsXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG4gICAgICAgIEV4cG9ydEJhdGNoU3BlY2lmaWVyOiAnRXhwb3J0QmF0Y2hTcGVjaWZpZXInLFxuICAgICAgICBFeHBvcnREZWNsYXJhdGlvbjogJ0V4cG9ydERlY2xhcmF0aW9uJyxcbiAgICAgICAgRXhwb3J0U3BlY2lmaWVyOiAnRXhwb3J0U3BlY2lmaWVyJyxcbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogJ0V4cHJlc3Npb25TdGF0ZW1lbnQnLFxuICAgICAgICBGb3JTdGF0ZW1lbnQ6ICdGb3JTdGF0ZW1lbnQnLFxuICAgICAgICBGb3JJblN0YXRlbWVudDogJ0ZvckluU3RhdGVtZW50JyxcbiAgICAgICAgRm9yT2ZTdGF0ZW1lbnQ6ICdGb3JPZlN0YXRlbWVudCcsXG4gICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyxcbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiAnRnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogJ0dlbmVyYXRvckV4cHJlc3Npb24nLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIElkZW50aWZpZXI6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgSWZTdGF0ZW1lbnQ6ICdJZlN0YXRlbWVudCcsXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiAnSW1wb3J0RGVjbGFyYXRpb24nLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydFNwZWNpZmllcjogJ0ltcG9ydFNwZWNpZmllcicsXG4gICAgICAgIExpdGVyYWw6ICdMaXRlcmFsJyxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogJ0xhYmVsZWRTdGF0ZW1lbnQnLFxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogJ0xvZ2ljYWxFeHByZXNzaW9uJyxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiAnTWV0aG9kRGVmaW5pdGlvbicsXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogJ01vZHVsZVNwZWNpZmllcicsXG4gICAgICAgIE5ld0V4cHJlc3Npb246ICdOZXdFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiAnT2JqZWN0UGF0dGVybicsXG4gICAgICAgIFByb2dyYW06ICdQcm9ncmFtJyxcbiAgICAgICAgUHJvcGVydHk6ICdQcm9wZXJ0eScsXG4gICAgICAgIFJldHVyblN0YXRlbWVudDogJ1JldHVyblN0YXRlbWVudCcsXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogJ1NlcXVlbmNlRXhwcmVzc2lvbicsXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6ICdTcHJlYWRFbGVtZW50JyxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiAnU3dpdGNoU3RhdGVtZW50JyxcbiAgICAgICAgU3dpdGNoQ2FzZTogJ1N3aXRjaENhc2UnLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFxuICAgICAgICBUZW1wbGF0ZUVsZW1lbnQ6ICdUZW1wbGF0ZUVsZW1lbnQnLFxuICAgICAgICBUZW1wbGF0ZUxpdGVyYWw6ICdUZW1wbGF0ZUxpdGVyYWwnLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogJ1RoaXNFeHByZXNzaW9uJyxcbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6ICdUaHJvd1N0YXRlbWVudCcsXG4gICAgICAgIFRyeVN0YXRlbWVudDogJ1RyeVN0YXRlbWVudCcsXG4gICAgICAgIFVuYXJ5RXhwcmVzc2lvbjogJ1VuYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246ICdVcGRhdGVFeHByZXNzaW9uJyxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6ICdWYXJpYWJsZURlY2xhcmF0b3InLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogJ1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogJ1dpdGhTdGF0ZW1lbnQnLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246ICdZaWVsZEV4cHJlc3Npb24nXG4gICAgfTtcblxuICAgIFZpc2l0b3JLZXlzID0ge1xuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogWydlbGVtZW50cyddLFxuICAgICAgICBBcnJheVBhdHRlcm46IFsnZWxlbWVudHMnXSxcbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFsncGFyYW1zJywgJ2RlZmF1bHRzJywgJ3Jlc3QnLCAnYm9keSddLFxuICAgICAgICBBd2FpdEV4cHJlc3Npb246IFsnYXJndW1lbnQnXSwgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBbJ2JvZHknXSxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBbJ2xhYmVsJ10sXG4gICAgICAgIENhbGxFeHByZXNzaW9uOiBbJ2NhbGxlZScsICdhcmd1bWVudHMnXSxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6IFsncGFyYW0nLCAnYm9keSddLFxuICAgICAgICBDbGFzc0JvZHk6IFsnYm9keSddLFxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBbJ2lkJywgJ2JvZHknLCAnc3VwZXJDbGFzcyddLFxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IFsnaWQnLCAnYm9keScsICdzdXBlckNsYXNzJ10sXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogWydsZWZ0JywgJ3JpZ2h0J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246IFsnYmxvY2tzJywgJ2ZpbHRlcicsICdib2R5J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCcsICdhbHRlcm5hdGUnXSxcbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IFsnbGFiZWwnXSxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBbJ2JvZHknLCAndGVzdCddLFxuICAgICAgICBFbXB0eVN0YXRlbWVudDogW10sXG4gICAgICAgIEV4cG9ydEJhdGNoU3BlY2lmaWVyOiBbXSxcbiAgICAgICAgRXhwb3J0RGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb24nLCAnc3BlY2lmaWVycycsICdzb3VyY2UnXSxcbiAgICAgICAgRXhwb3J0U3BlY2lmaWVyOiBbJ2lkJywgJ25hbWUnXSxcbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogWydleHByZXNzaW9uJ10sXG4gICAgICAgIEZvclN0YXRlbWVudDogWydpbml0JywgJ3Rlc3QnLCAndXBkYXRlJywgJ2JvZHknXSxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IFsnbGVmdCcsICdyaWdodCcsICdib2R5J10sXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBbJ2xlZnQnLCAncmlnaHQnLCAnYm9keSddLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBbJ2lkJywgJ3BhcmFtcycsICdkZWZhdWx0cycsICdyZXN0JywgJ2JvZHknXSxcbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBbJ2lkJywgJ3BhcmFtcycsICdkZWZhdWx0cycsICdyZXN0JywgJ2JvZHknXSxcbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogWydibG9ja3MnLCAnZmlsdGVyJywgJ2JvZHknXSwgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiBbXSxcbiAgICAgICAgSWZTdGF0ZW1lbnQ6IFsndGVzdCcsICdjb25zZXF1ZW50JywgJ2FsdGVybmF0ZSddLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogWydzcGVjaWZpZXJzJywgJ3NvdXJjZSddLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBbJ2lkJ10sXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogWydpZCddLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IFsnaWQnLCAnbmFtZSddLFxuICAgICAgICBMaXRlcmFsOiBbXSxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogWydsYWJlbCcsICdib2R5J10sXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogWydvYmplY3QnLCAncHJvcGVydHknXSxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogWydrZXknLCAndmFsdWUnXSxcbiAgICAgICAgTW9kdWxlU3BlY2lmaWVyOiBbXSxcbiAgICAgICAgTmV3RXhwcmVzc2lvbjogWydjYWxsZWUnLCAnYXJndW1lbnRzJ10sXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IFsncHJvcGVydGllcyddLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBbJ3Byb3BlcnRpZXMnXSxcbiAgICAgICAgUHJvZ3JhbTogWydib2R5J10sXG4gICAgICAgIFByb3BlcnR5OiBbJ2tleScsICd2YWx1ZSddLFxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBbJ2V4cHJlc3Npb25zJ10sXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiBbJ2Rpc2NyaW1pbmFudCcsICdjYXNlcyddLFxuICAgICAgICBTd2l0Y2hDYXNlOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCddLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IFsndGFnJywgJ3F1YXNpJ10sXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogW10sXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogWydxdWFzaXMnLCAnZXhwcmVzc2lvbnMnXSxcbiAgICAgICAgVGhpc0V4cHJlc3Npb246IFtdLFxuICAgICAgICBUaHJvd1N0YXRlbWVudDogWydhcmd1bWVudCddLFxuICAgICAgICBUcnlTdGF0ZW1lbnQ6IFsnYmxvY2snLCAnaGFuZGxlcnMnLCAnaGFuZGxlcicsICdndWFyZGVkSGFuZGxlcnMnLCAnZmluYWxpemVyJ10sXG4gICAgICAgIFVuYXJ5RXhwcmVzc2lvbjogWydhcmd1bWVudCddLFxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb25zJ10sXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogWydpZCcsICdpbml0J10sXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiBbJ3Rlc3QnLCAnYm9keSddLFxuICAgICAgICBXaXRoU3RhdGVtZW50OiBbJ29iamVjdCcsICdib2R5J10sXG4gICAgICAgIFlpZWxkRXhwcmVzc2lvbjogWydhcmd1bWVudCddXG4gICAgfTtcblxuICAgIC8vIHVuaXF1ZSBpZFxuICAgIEJSRUFLID0ge307XG4gICAgU0tJUCA9IHt9O1xuICAgIFJFTU9WRSA9IHt9O1xuXG4gICAgVmlzaXRvck9wdGlvbiA9IHtcbiAgICAgICAgQnJlYWs6IEJSRUFLLFxuICAgICAgICBTa2lwOiBTS0lQLFxuICAgICAgICBSZW1vdmU6IFJFTU9WRVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBSZWZlcmVuY2UocGFyZW50LCBrZXkpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cblxuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uobm9kZSkge1xuICAgICAgICB0aGlzLnBhcmVudFt0aGlzLmtleV0gPSBub2RlO1xuICAgIH07XG5cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGhpcy5wYXJlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5zcGxpY2UodGhpcy5rZXksIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gRWxlbWVudChub2RlLCBwYXRoLCB3cmFwLCByZWYpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHsgfVxuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBwcm9wZXJ0eSBwYXRoIGFycmF5IGZyb20gcm9vdCB0byBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gcGF0aCgpIHtcbiAgICAgICAgdmFyIGksIGl6LCBqLCBqeiwgcmVzdWx0LCBlbGVtZW50O1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZFRvUGF0aChyZXN1bHQsIHBhdGgpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMCwganogPSBwYXRoLmxlbmd0aDsgaiA8IGp6OyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGF0aFtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJvb3Qgbm9kZVxuICAgICAgICBpZiAoIXRoaXMuX19jdXJyZW50LnBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3Qgbm9kZSBpcyBzZW50aW5lbCwgc2Vjb25kIG5vZGUgaXMgcm9vdCBlbGVtZW50XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAyLCBpeiA9IHRoaXMuX19sZWF2ZWxpc3QubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuX19sZWF2ZWxpc3RbaV07XG4gICAgICAgICAgICBhZGRUb1BhdGgocmVzdWx0LCBlbGVtZW50LnBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFRvUGF0aChyZXN1bHQsIHRoaXMuX19jdXJyZW50LnBhdGgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIHR5cGUgb2YgY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmN1cnJlbnQoKTtcbiAgICAgICAgcmV0dXJuIG5vZGUudHlwZSB8fCB0aGlzLl9fY3VycmVudC53cmFwO1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIGFycmF5IG9mIHBhcmVudCBlbGVtZW50c1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnBhcmVudHMgPSBmdW5jdGlvbiBwYXJlbnRzKCkge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdDtcblxuICAgICAgICAvLyBmaXJzdCBub2RlIGlzIHNlbnRpbmVsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IHRoaXMuX19sZWF2ZWxpc3QubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5fX2xlYXZlbGlzdFtpXS5ub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuY3VycmVudCA9IGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fY3VycmVudC5ub2RlO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fX2V4ZWN1dGUgPSBmdW5jdGlvbiBfX2V4ZWN1dGUoY2FsbGJhY2ssIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzLCByZXN1bHQ7XG5cbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHByZXZpb3VzICA9IHRoaXMuX19jdXJyZW50O1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX19zdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2suY2FsbCh0aGlzLCBlbGVtZW50Lm5vZGUsIHRoaXMuX19sZWF2ZWxpc3RbdGhpcy5fX2xlYXZlbGlzdC5sZW5ndGggLSAxXS5ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fY3VycmVudCA9IHByZXZpb3VzO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBub3RpZnkgY29udHJvbCBza2lwIC8gYnJlYWtcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkoZmxhZykge1xuICAgICAgICB0aGlzLl9fc3RhdGUgPSBmbGFnO1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gc2tpcCBjaGlsZCBub2RlcyBvZiBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShTS0lQKTtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIGJyZWFrIHRyYXZlcnNhbHNcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZVsnYnJlYWsnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoQlJFQUspO1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmVtb3ZlIG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KFJFTU9WRSk7XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl9faW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdGhpcy52aXNpdG9yID0gdmlzaXRvcjtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICAgICAgdGhpcy5fX3dvcmtsaXN0ID0gW107XG4gICAgICAgIHRoaXMuX19sZWF2ZWxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9fc3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9fZmFsbGJhY2sgPSB2aXNpdG9yLmZhbGxiYWNrID09PSAnaXRlcmF0aW9uJztcbiAgICAgICAgdGhpcy5fX2tleXMgPSBWaXNpdG9yS2V5cztcbiAgICAgICAgaWYgKHZpc2l0b3Iua2V5cykge1xuICAgICAgICAgICAgdGhpcy5fX2tleXMgPSBleHRlbmQob2JqZWN0Q3JlYXRlKHRoaXMuX19rZXlzKSwgdmlzaXRvci5rZXlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygbm9kZS50eXBlID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5KG5vZGVUeXBlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIChub2RlVHlwZSA9PT0gU3ludGF4Lk9iamVjdEV4cHJlc3Npb24gfHwgbm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RQYXR0ZXJuKSAmJiAncHJvcGVydGllcycgPT09IGtleTtcbiAgICB9XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS50cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbDtcblxuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZShyb290LCB2aXNpdG9yKTtcblxuICAgICAgICBzZW50aW5lbCA9IHt9O1xuXG4gICAgICAgIC8vIHJlZmVyZW5jZVxuICAgICAgICB3b3JrbGlzdCA9IHRoaXMuX193b3JrbGlzdDtcbiAgICAgICAgbGVhdmVsaXN0ID0gdGhpcy5fX2xlYXZlbGlzdDtcblxuICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQocm9vdCwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgICAgICBsZWF2ZWxpc3QucHVzaChuZXcgRWxlbWVudChudWxsLCBudWxsLCBudWxsLCBudWxsKSk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCByZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGUpIHtcblxuICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IuZW50ZXIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgcmV0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChzZW50aW5lbCk7XG4gICAgICAgICAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHJldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlID0gZWxlbWVudC5ub2RlO1xuICAgICAgICAgICAgICAgIG5vZGVUeXBlID0gZWxlbWVudC53cmFwIHx8IG5vZGUudHlwZTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX2ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gb2JqZWN0S2V5cyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgJyArIG5vZGVUeXBlICsgJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBjYW5kaWRhdGVzW2N1cnJlbnRdO1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBub2RlW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQyID0gY2FuZGlkYXRlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudDIgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlW2N1cnJlbnQyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkobm9kZVR5cGUsIGNhbmRpZGF0ZXNbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChjYW5kaWRhdGVbY3VycmVudDJdLCBba2V5LCBjdXJyZW50Ml0sICdQcm9wZXJ0eScsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChjYW5kaWRhdGVbY3VycmVudDJdLCBba2V5LCBjdXJyZW50Ml0sIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoKG5ldyBFbGVtZW50KGNhbmRpZGF0ZSwga2V5LCBudWxsLCBudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uocm9vdCwgdmlzaXRvcikge1xuICAgICAgICBmdW5jdGlvbiByZW1vdmVFbGVtKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBuZXh0RWxlbSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnJlZi5yZW1vdmUoKSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJlZmVyZW5jZSBpcyBhbiBlbGVtZW50IG9mIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgIGtleSA9IGVsZW1lbnQucmVmLmtleTtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnJlZi5wYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiByZW1vdmVkIGZyb20gYXJyYXksIHRoZW4gZGVjcmVhc2UgZm9sbG93aW5nIGl0ZW1zJyBrZXlzLlxuICAgICAgICAgICAgICAgIGkgPSB3b3JrbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbSA9IHdvcmtsaXN0W2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW0ucmVmICYmIG5leHRFbGVtLnJlZi5wYXJlbnQgPT09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgIChuZXh0RWxlbS5yZWYua2V5IDwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAtLW5leHRFbGVtLnJlZi5rZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd29ya2xpc3QsXG4gICAgICAgICAgICBsZWF2ZWxpc3QsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGN1cnJlbnQyLFxuICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgICAgIHNlbnRpbmVsLFxuICAgICAgICAgICAgb3V0ZXIsXG4gICAgICAgICAgICBrZXk7XG5cbiAgICAgICAgdGhpcy5fX2luaXRpYWxpemUocm9vdCwgdmlzaXRvcik7XG5cbiAgICAgICAgc2VudGluZWwgPSB7fTtcblxuICAgICAgICAvLyByZWZlcmVuY2VcbiAgICAgICAgd29ya2xpc3QgPSB0aGlzLl9fd29ya2xpc3Q7XG4gICAgICAgIGxlYXZlbGlzdCA9IHRoaXMuX19sZWF2ZWxpc3Q7XG5cbiAgICAgICAgLy8gaW5pdGlhbGl6ZVxuICAgICAgICBvdXRlciA9IHtcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RcbiAgICAgICAgfTtcbiAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHJvb3QsIG51bGwsIG51bGwsIG5ldyBSZWZlcmVuY2Uob3V0ZXIsICdyb290JykpO1xuICAgICAgICB3b3JrbGlzdC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBsZWF2ZWxpc3QucHVzaChlbGVtZW50KTtcblxuICAgICAgICB3aGlsZSAod29ya2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gd29ya2xpc3QucG9wKCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSBzZW50aW5lbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsZWF2ZWxpc3QucG9wKCk7XG5cbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLl9fZXhlY3V0ZSh2aXNpdG9yLmxlYXZlLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIHJlcGxhY2VkIHdpdGggbnVsbCxcbiAgICAgICAgICAgICAgICAvLyBzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVuZGVmaW5lZCBhbmQgbnVsbCBpbiB0aGlzIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gQlJFQUsgJiYgdGFyZ2V0ICE9PSBTS0lQICYmIHRhcmdldCAhPT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZWYucmVwbGFjZSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IFJFTU9WRSB8fCB0YXJnZXQgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHRhcmdldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLl9fZXhlY3V0ZSh2aXNpdG9yLmVudGVyLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgcmVwbGFjZWQgd2l0aCBudWxsLFxuICAgICAgICAgICAgLy8gc28gZGlzdGluZ3Vpc2ggYmV0d2VlbiB1bmRlZmluZWQgYW5kIG51bGwgaW4gdGhpcyBwbGFjZVxuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gQlJFQUsgJiYgdGFyZ2V0ICE9PSBTS0lQICYmIHRhcmdldCAhPT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVmLnJlcGxhY2UodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm5vZGUgPSB0YXJnZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IFJFTU9WRSB8fCB0YXJnZXQgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZUVsZW0oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgdGFyZ2V0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBub2RlIG1heSBiZSBudWxsXG4gICAgICAgICAgICBub2RlID0gZWxlbWVudC5ub2RlO1xuICAgICAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goc2VudGluZWwpO1xuICAgICAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IFNLSVAgfHwgdGFyZ2V0ID09PSBTS0lQKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGVUeXBlID0gZWxlbWVudC53cmFwIHx8IG5vZGUudHlwZTtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB0aGlzLl9fa2V5c1tub2RlVHlwZV07XG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX2ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBvYmplY3RLZXlzKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgJyArIG5vZGVUeXBlICsgJy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBub2RlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudDIgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVbY3VycmVudDJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShub2RlVHlwZSwgY2FuZGlkYXRlc1tjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBuZXcgUmVmZXJlbmNlKGNhbmRpZGF0ZSwgY3VycmVudDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgbnVsbCwgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbmV3IFJlZmVyZW5jZShub2RlLCBrZXkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci50cmF2ZXJzZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5yZXBsYWNlKHJvb3QsIHZpc2l0b3IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZENvbW1lbnRSYW5nZShjb21tZW50LCB0b2tlbnMpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcblxuICAgICAgICB0YXJnZXQgPSB1cHBlckJvdW5kKHRva2VucywgZnVuY3Rpb24gc2VhcmNoKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4ucmFuZ2VbMF0gPiBjb21tZW50LnJhbmdlWzBdO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbY29tbWVudC5yYW5nZVswXSwgY29tbWVudC5yYW5nZVsxXV07XG5cbiAgICAgICAgaWYgKHRhcmdldCAhPT0gdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzFdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMF07XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgLT0gMTtcbiAgICAgICAgaWYgKHRhcmdldCA+PSAwKSB7XG4gICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0gPSB0b2tlbnNbdGFyZ2V0XS5yYW5nZVsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0dGFjaENvbW1lbnRzKHRyZWUsIHByb3ZpZGVkQ29tbWVudHMsIHRva2Vucykge1xuICAgICAgICAvLyBBdCBmaXJzdCwgd2Ugc2hvdWxkIGNhbGN1bGF0ZSBleHRlbmRlZCBjb21tZW50IHJhbmdlcy5cbiAgICAgICAgdmFyIGNvbW1lbnRzID0gW10sIGNvbW1lbnQsIGxlbiwgaSwgY3Vyc29yO1xuXG4gICAgICAgIGlmICghdHJlZS5yYW5nZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRhY2hDb21tZW50cyBuZWVkcyByYW5nZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG9rZW5zIGFycmF5IGlzIGVtcHR5LCB3ZSBhdHRhY2ggY29tbWVudHMgdG8gdHJlZSBhcyAnbGVhZGluZ0NvbW1lbnRzJ1xuICAgICAgICBpZiAoIXRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlZENvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbMCwgdHJlZS5yYW5nZVswXV07XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyZWUubGVhZGluZ0NvbW1lbnRzID0gY29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZXh0ZW5kQ29tbWVudFJhbmdlKGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pLCB0b2tlbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgaXMgYmFzZWQgb24gSm9obiBGcmVlbWFuJ3MgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGVudGVyOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA+IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9PT0gbm9kZS5yYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGxlYXZlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPCBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPT09IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLnRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIGV4cG9ydHMudmVyc2lvbiA9ICcxLjguMS1kZXYnO1xuICAgIGV4cG9ydHMuU3ludGF4ID0gU3ludGF4O1xuICAgIGV4cG9ydHMudHJhdmVyc2UgPSB0cmF2ZXJzZTtcbiAgICBleHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGV4cG9ydHMuYXR0YWNoQ29tbWVudHMgPSBhdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlZpc2l0b3JLZXlzID0gVmlzaXRvcktleXM7XG4gICAgZXhwb3J0cy5WaXNpdG9yT3B0aW9uID0gVmlzaXRvck9wdGlvbjtcbiAgICBleHBvcnRzLkNvbnRyb2xsZXIgPSBDb250cm9sbGVyO1xuICAgIGV4cG9ydHMuY2xvbmVFbnZpcm9ubWVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNsb25lKHt9KTsgfTtcblxuICAgIHJldHVybiBleHBvcnRzO1xufSkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8qKlxuICAgKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAgICogbWVtYmVyIGlzIE8oMSksIHRlc3RpbmcgZm9yIG1lbWJlcnNoaXAgaXMgTygxKSwgYW5kIGZpbmRpbmcgdGhlIGluZGV4IG9mIGFuXG4gICAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAgICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICAgKi9cbiAgZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gICAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgICB0aGlzLl9zZXQgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAgICovXG4gIEFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gQXJyYXlTZXRfYWRkKGFTdHIsIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICB2YXIgaXNEdXBsaWNhdGUgPSB0aGlzLmhhcyhhU3RyKTtcbiAgICB2YXIgaWR4ID0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgICB9XG4gICAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgICAgdGhpcy5fc2V0W3V0aWwudG9TZXRTdHJpbmcoYVN0cildID0gaWR4O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGdpdmVuIHN0cmluZyBhIG1lbWJlciBvZiB0aGlzIHNldD9cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwudG9TZXRTdHJpbmcoYVN0cikpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICAgIGlmICh0aGlzLmhhcyhhU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFt1dGlsLnRvU2V0U3RyaW5nKGFTdHIpXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAgICpcbiAgICogQHBhcmFtIE51bWJlciBhSWR4XG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gICAgaWYgKGFJZHggPj0gMCAmJiBhSWR4IDwgdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBpbmRleGVkIGJ5ICcgKyBhSWR4KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZXQgKHdoaWNoIGhhcyB0aGUgcHJvcGVyIGluZGljZXNcbiAgICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAgICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbiAgfTtcblxuICBleHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjpcbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2xvc3VyZS1jb21waWxlci9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmFcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSBUaGUgQ2xvc3VyZSBDb21waWxlciBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWRcbiAqICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcblxuICAvLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbiAgLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4gIC8vIHRoZSBuZXh0IGZvdXIgYml0cyBhcmUgdGhlIGFjdHVhbCB2YWx1ZSwgYW5kIHRoZSA2dGggYml0IGlzIHRoZVxuICAvLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4gIC8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuICAvL1xuICAvLyAgIENvbnRpbnVhdGlvblxuICAvLyAgIHwgICAgU2lnblxuICAvLyAgIHwgICAgfFxuICAvLyAgIFYgICAgVlxuICAvLyAgIDEwMTAxMVxuXG4gIHZhciBWTFFfQkFTRV9TSElGVCA9IDU7XG5cbiAgLy8gYmluYXJ5OiAxMDAwMDBcbiAgdmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuICAvLyBiaW5hcnk6IDAxMTExMVxuICB2YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuICAvLyBiaW5hcnk6IDEwMDAwMFxuICB2YXIgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSBWTFFfQkFTRTtcblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gICAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICAgKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAgICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAgICovXG4gIGZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICAgIHJldHVybiBhVmFsdWUgPCAwXG4gICAgICA/ICgoLWFWYWx1ZSkgPDwgMSkgKyAxXG4gICAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICAgKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAgICogICAyICgxMCBiaW5hcnkpIGJlY29tZXMgMSwgMyAoMTEgYmluYXJ5KSBiZWNvbWVzIC0xXG4gICAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gICAqL1xuICBmdW5jdGlvbiBmcm9tVkxRU2lnbmVkKGFWYWx1ZSkge1xuICAgIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICAgIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gICAgcmV0dXJuIGlzTmVnYXRpdmVcbiAgICAgID8gLXNoaWZ0ZWRcbiAgICAgIDogc2hpZnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICAgIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgICB2YXIgZGlnaXQ7XG5cbiAgICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICAgIGRvIHtcbiAgICAgIGRpZ2l0ID0gdmxxICYgVkxRX0JBU0VfTUFTSztcbiAgICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgICAgaWYgKHZscSA+IDApIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHN0aWxsIG1vcmUgZGlnaXRzIGluIHRoaXMgdmFsdWUsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgICB9XG4gICAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICAgIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIG5leHQgYmFzZSA2NCBWTFEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIHRoZVxuICAgKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gICAqL1xuICBleHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9kZWNvZGUoYVN0ciwgYU91dFBhcmFtKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICB2YXIgc2hpZnQgPSAwO1xuICAgIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKGkgPj0gc3RyTGVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICAgIH1cbiAgICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJBdChpKyspKTtcbiAgICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCArIChkaWdpdCA8PCBzaGlmdCk7XG4gICAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gICAgYU91dFBhcmFtLnZhbHVlID0gZnJvbVZMUVNpZ25lZChyZXN1bHQpO1xuICAgIGFPdXRQYXJhbS5yZXN0ID0gYVN0ci5zbGljZShpKTtcbiAgfTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBjaGFyVG9JbnRNYXAgPSB7fTtcbiAgdmFyIGludFRvQ2hhck1hcCA9IHt9O1xuXG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICAgIC5zcGxpdCgnJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbiAoY2gsIGluZGV4KSB7XG4gICAgICBjaGFyVG9JbnRNYXBbY2hdID0gaW5kZXg7XG4gICAgICBpbnRUb0NoYXJNYXBbaW5kZXhdID0gY2g7XG4gICAgfSk7XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gICAqL1xuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NF9lbmNvZGUoYU51bWJlcikge1xuICAgIGlmIChhTnVtYmVyIGluIGludFRvQ2hhck1hcCkge1xuICAgICAgcmV0dXJuIGludFRvQ2hhck1hcFthTnVtYmVyXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBhTnVtYmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgdG8gYW4gaW50ZWdlci5cbiAgICovXG4gIGV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0X2RlY29kZShhQ2hhcikge1xuICAgIGlmIChhQ2hhciBpbiBjaGFyVG9JbnRNYXApIHtcbiAgICAgIHJldHVybiBjaGFyVG9JbnRNYXBbYUNoYXJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm90IGEgdmFsaWQgYmFzZSA2NCBkaWdpdDogXCIgKyBhQ2hhcik7XG4gIH07XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuICB2YXIgYmluYXJ5U2VhcmNoID0gcmVxdWlyZSgnLi9iaW5hcnktc2VhcmNoJyk7XG4gIHZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG4gIHZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbiAgdmFyIFNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5cbiAgLyoqXG4gICAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gICAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICAgKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICpcbiAgICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gICAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAgICogZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gICAqXG4gICAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICAgKiAgIC0gc291cmNlczogQW4gYXJyYXkgb2YgVVJMcyB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICAgKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICAgKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAgICogICAtIHNvdXJjZXNDb250ZW50OiBPcHRpb25hbC4gQW4gYXJyYXkgb2YgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAgICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gICAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqXG4gICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gICAqXG4gICAqICAgICB7XG4gICAqICAgICAgIHZlcnNpb24gOiAzLFxuICAgKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICAgKiAgICAgICBzb3VyY2VSb290IDogXCJcIixcbiAgICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICAgKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAgICogICAgICAgbWFwcGluZ3M6IFwiQUEsQUI7O0FCQ0RFO1wiXG4gICAqICAgICB9XG4gICAqXG4gICAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICAgKi9cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwKSB7XG4gICAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgc291cmNlTWFwID0gSlNPTi5wYXJzZShhU291cmNlTWFwLnJlcGxhY2UoL15cXClcXF1cXH0nLywgJycpKTtcbiAgICB9XG5cbiAgICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgICAvLyBTYXNzIDMuMyBsZWF2ZXMgb3V0IHRoZSAnbmFtZXMnIGFycmF5LCBzbyB3ZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgKHdoaWNoXG4gICAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgICB2YXIgc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICAgIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gICAgdmFyIGZpbGUgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdmaWxlJywgbnVsbCk7XG5cbiAgICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICAgIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICBzb3VyY2VzID0gc291cmNlcy5tYXAodXRpbC5ub3JtYWxpemUpO1xuXG4gICAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAgIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gICAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAgIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcywgdHJ1ZSk7XG4gICAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICAgIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gICAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICAgIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgfVxuXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICAgKiBAcmV0dXJucyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCkge1xuICAgICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgICBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgICBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgICAgc21jLnNvdXJjZVJvb3QgPSBhU291cmNlTWFwLl9zb3VyY2VSb290O1xuICAgICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgICBzbWMuZmlsZSA9IGFTb3VyY2VNYXAuX2ZpbGU7XG5cbiAgICAgIHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgICBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKClcbiAgICAgICAgLnNvcnQodXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICAgIHJldHVybiBzbWM7XG4gICAgfTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICAgKi9cbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLlxuICAgKi9cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICAgKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAgICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgICB2YXIgZ2VuZXJhdGVkTGluZSA9IDE7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICAgIHZhciBzdHIgPSBhU3RyO1xuICAgICAgdmFyIHRlbXAgPSB7fTtcbiAgICAgIHZhciBtYXBwaW5nO1xuXG4gICAgICB3aGlsZSAoc3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICc7Jykge1xuICAgICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICcsJykge1xuICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBtYXBwaW5nID0ge307XG4gICAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW4uXG4gICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gKyB0ZW1wLnZhbHVlO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuXG4gICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAwICYmICF0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBzb3VyY2UuXG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQocHJldmlvdXNTb3VyY2UgKyB0ZW1wLnZhbHVlKTtcbiAgICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UsIGJ1dCBubyBsaW5lIGFuZCBjb2x1bW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgcHJldmlvdXNPcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcbiAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwIHx8IHRoaXMuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKHN0cikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHRlbXAudmFsdWU7XG4gICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcbiAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcblxuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAwICYmICF0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAgIC8vIE9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gdGhpcy5fbmFtZXMuYXQocHJldmlvdXNOYW1lICsgdGVtcC52YWx1ZSk7XG4gICAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKTtcbiAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnNvcnQodXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgfTtcblxuICAvKipcbiAgICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gICAqIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGluIHRoZSBnaXZlbiBcImhheXN0YWNrXCIgb2YgbWFwcGluZ3MuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2ZpbmRNYXBwaW5nKGFOZWVkbGUsIGFNYXBwaW5ncywgYUxpbmVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvcikge1xuICAgICAgLy8gVG8gcmV0dXJuIHRoZSBwb3NpdGlvbiB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgd2UgbXVzdCBmaXJzdCBmaW5kIHRoZVxuICAgICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgICAvLyBmaW5kIHRoZSBiZXN0IG1hcHBpbmcuXG5cbiAgICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhTmVlZGxlW2FMaW5lTmFtZV0pO1xuICAgICAgfVxuICAgICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb2x1bW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJpbmFyeVNlYXJjaC5zZWFyY2goYU5lZWRsZSwgYU1hcHBpbmdzLCBhQ29tcGFyYXRvcik7XG4gICAgfTtcblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICAgKiBpbmNsdXNpdmUuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAgIC8vIGNhbiBjb21lIHVwIHdpdGggYW4gb3B0aW1pc3RpYyBlc3RpbWF0ZSwgaG93ZXZlciwgYnkgYXNzdW1pbmcgdGhhdFxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqXG4gICAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgICB9O1xuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZXJhdGVkTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5lcmF0ZWRDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKTtcblxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ3NvdXJjZScsIG51bGwpO1xuICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiB0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlID0gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIG5hbWU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICAgKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gICAqIGF2YWlsaWJsZS5cbiAgICovXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgYVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBhU291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3NvdXJjZXMuaGFzKGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihhU291cmNlKV07XG4gICAgICB9XG5cbiAgICAgIHZhciB1cmw7XG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSBhU291cmNlLnJlcGxhY2UoL15maWxlOlxcL1xcLy8sIFwiXCIpO1xuICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGZpbGVVcmlBYnNQYXRoKV1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoXCIvXCIgKyBhU291cmNlKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICAgKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICovXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgICB9O1xuICAgIH07XG5cbiAgZXhwb3J0cy5CYXNpY1NvdXJjZU1hcENvbnN1bWVyID0gQmFzaWNTb3VyY2VNYXBDb25zdW1lcjtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaC5cbiAgICpcbiAgICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICAgKiBAcGFyYW0gYUhpZ2ggSW5kaWNlcyBoZXJlIGFuZCBoaWdoZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAgICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICAgKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gICAqIEBwYXJhbSBhQ29tcGFyZSBGdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gZWxlbWVudHMgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEuXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgIC8vXG4gICAgLy8gICAxLiBXZSBmaW5kIHRoZSBleGFjdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICAvL1xuICAgIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgICAvLyAgICAgIHRoZSBuZXh0IGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIGxlc3MgdGhhbiB0aGF0IGVsZW1lbnQuXG4gICAgLy9cbiAgICAvLyAgIDMuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYW5kIHRoZXJlIGlzIG5vIG5leHQtY2xvc2VzdFxuICAgIC8vICAgICAgZWxlbWVudCB3aGljaCBpcyBsZXNzIHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgc28gd2VcbiAgICAvLyAgICAgIHJldHVybiAtMS5cbiAgICB2YXIgbWlkID0gTWF0aC5mbG9vcigoYUhpZ2ggLSBhTG93KSAvIDIpICsgYUxvdztcbiAgICB2YXIgY21wID0gYUNvbXBhcmUoYU5lZWRsZSwgYUhheXN0YWNrW21pZF0sIHRydWUpO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIC8vIEZvdW5kIHRoZSBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIC8vIGFIYXlzdGFja1ttaWRdIGlzIGdyZWF0ZXIgdGhhbiBvdXIgbmVlZGxlLlxuICAgICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChtaWQsIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpZCBub3QgZmluZCBhbiBleGFjdCBtYXRjaCwgcmV0dXJuIHRoZSBuZXh0IGNsb3Nlc3Qgb25lXG4gICAgICAvLyAodGVybWluYXRpb24gY2FzZSAyKS5cbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gYUhheXN0YWNrW21pZF0gaXMgbGVzcyB0aGFuIG91ciBuZWVkbGUuXG4gICAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBleGFjdCBuZWVkbGUgZWxlbWVudCB3YXMgbm90IGZvdW5kIGluIHRoaXMgaGF5c3RhY2suIERldGVybWluZSBpZlxuICAgICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDIpIG9yICgzKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICAgIHJldHVybiBhTG93IDwgMCA/IC0xIDogYUxvdztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoIHdoaWNoIHdpbGwgYWx3YXlzIHRyeSBhbmQgcmV0dXJuXG4gICAqIHRoZSBpbmRleCBvZiBuZXh0IGxvd2VzdCB2YWx1ZSBjaGVja2VkIGlmIHRoZXJlIGlzIG5vIGV4YWN0IGhpdC4gVGhpcyBpc1xuICAgKiBiZWNhdXNlIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlXG4gICAqIHBvaW50cywgYW5kIHRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZ2lvbiBiZXR3ZWVuIGVhY2ggb2YgdGhlbSwgc28gYSBtaXNzXG4gICAqIGp1c3QgbWVhbnMgdGhhdCB5b3UgYXJlbid0IG9uIHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgcmVnaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCB5b3UgYXJlIGxvb2tpbmcgZm9yLlxuICAgKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkLlxuICAgKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICAgKiAgICAgYXJyYXkgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5lZWRsZSBpcyBsZXNzXG4gICAqICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50LCByZXNwZWN0aXZlbHkuXG4gICAqL1xuICBleHBvcnRzLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKSB7XG4gICAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaCgtMSwgYUhheXN0YWNrLmxlbmd0aCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSlcbiAgfTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4gIHZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbiAgdmFyIFNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG4gIHZhciBCYXNpY1NvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9iYXNpYy1zb3VyY2UtbWFwLWNvbnN1bWVyJykuQmFzaWNTb3VyY2VNYXBDb25zdW1lcjtcblxuICAvKipcbiAgICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICAgKiB3ZSBjYW4gcXVlcnkgZm9yIGluZm9ybWF0aW9uLiBJdCBkaWZmZXJzIGZyb20gQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpblxuICAgKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAgICogaW5wdXQuXG4gICAqXG4gICAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICAgKiBwYXJzZWQgdG8gYW4gb2JqZWN0KS4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIGZvciBpbmRleGVkIHNvdXJjZSBtYXBzLCB0aGV5XG4gICAqIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICAgKlxuICAgKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAgICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAgICpcbiAgICogRWFjaCB2YWx1ZSB1bmRlciB0aGUgXCJzZWN0aW9uc1wiIGZpZWxkIGhhcyB0d28gZmllbGRzOlxuICAgKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAgICogICAgICAgYmVnaW5zIHRvIGFwcGx5LCBkZWZpbmVkIGFzIGFuIG9iamVjdCB3aXRoIGEgXCJsaW5lXCIgYW5kIFwiY29sdW1uXCJcbiAgICogICAgICAgZmllbGQuXG4gICAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICAgKiAgICAgICBidXQgZG9lc24ndCBoYXZlIHRvIGJlLlxuICAgKlxuICAgKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAgICogc3BlY2lmeWluZyBhIFVSTCB0byByZXRyaWV2ZSBhIHNvdXJjZSBtYXAgZnJvbSwgYnV0IHRoYXQncyBjdXJyZW50bHlcbiAgICogdW5zdXBwb3J0ZWQuXG4gICAqXG4gICAqIEhlcmUncyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXSwgYnV0XG4gICAqIG1vZGlmaWVkIHRvIG9taXQgYSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIFwidXJsXCIgZmllbGQuXG4gICAqXG4gICAqICB7XG4gICAqICAgIHZlcnNpb24gOiAzLFxuICAgKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICAgKiAgICBzZWN0aW9uczogW3tcbiAgICogICAgICBvZmZzZXQ6IHtsaW5lOjEwMCwgY29sdW1uOjEwfSxcbiAgICogICAgICBtYXA6IHtcbiAgICogICAgICAgIHZlcnNpb24gOiAzLFxuICAgKiAgICAgICAgZmlsZTogXCJzZWN0aW9uLmpzXCIsXG4gICAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gICAqICAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAgICogICAgICAgIG1hcHBpbmdzOiBcIkFBQUEsRTs7QUJDREU7XCJcbiAgICogICAgICB9XG4gICAqICAgIH1dLFxuICAgKiAgfVxuICAgKlxuICAgKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCNoZWFkaW5nPWguNTM1ZXMzeGVwcmd0XG4gICAqL1xuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICAgIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICAgIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gICAgfVxuXG4gICAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gICAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICAgIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgICAgbGluZTogLTEsXG4gICAgICBjb2x1bW46IDBcbiAgICB9O1xuICAgIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICBpZiAocy51cmwpIHtcbiAgICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIHVybCBmaWVsZCBpbiBzZWN0aW9ucyBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgICB9XG4gICAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgICAgdmFyIG9mZnNldExpbmUgPSB1dGlsLmdldEFyZyhvZmZzZXQsICdsaW5lJyk7XG4gICAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgICAgKG9mZnNldExpbmUgPT09IGxhc3RPZmZzZXQubGluZSAmJiBvZmZzZXRDb2x1bW4gPCBsYXN0T2Zmc2V0LmNvbHVtbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgICB9XG4gICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGZpZWxkcyBhcmUgMC1iYXNlZCwgYnV0IHdlIHVzZSAxLWJhc2VkIGluZGljZXMgd2hlblxuICAgICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogb2Zmc2V0Q29sdW1uICsgMVxuICAgICAgICB9LFxuICAgICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICAgKi9cbiAgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gICAqL1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gc291cmNlcztcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAgICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAgICovXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbkZvciA9XG4gICAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpbmQgdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uIHdlJ3JlIHRyeWluZyB0byBtYXBcbiAgICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgICAgZnVuY3Rpb24obmVlZGxlLCBzZWN0aW9uKSB7XG4gICAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgICByZXR1cm4gY21wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICB9KTtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgICAgaWYgKCFzZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICAgIG5hbWU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgIGxpbmU6IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC1cbiAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBuZWVkbGUuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgOiAwKVxuICAgICAgfSk7XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gICAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAgICogYXZhaWxhYmxlLlxuICAgKi9cbiAgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgICAgdmFyIGNvbnRlbnQgPSBzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICAgKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICovXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICAgIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgICBpZiAoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VzLmluZGV4T2YodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICAgIGlmIChnZW5lcmF0ZWRQb3NpdGlvbikge1xuICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfTtcblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICAgKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAgICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICAgIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG4gICAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgbWFwcGluZyA9IHNlY3Rpb25NYXBwaW5nc1tpXTtcblxuICAgICAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgICB2YXIgc291cmNlUm9vdCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdDtcblxuICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgICAvLyBnZW5lcmF0ZWQgcG9zaXRpb25zIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIG9mZnNldCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW5hdGVkXG4gICAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgICAgdmFyIGFkanVzdGVkTWFwcGluZyA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5jb2x1bW4gK1xuICAgICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lKVxuICAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MucHVzaChhZGp1c3RlZE1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyk7XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgfTtcblxuICBleHBvcnRzLkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciA9IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcjtcbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBtYXBwaW5nQiBpcyBhZnRlciBtYXBwaW5nQSB3aXRoIHJlc3BlY3QgdG8gZ2VuZXJhdGVkXG4gICAqIHBvc2l0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVkUG9zaXRpb25BZnRlcihtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICAgIHZhciBsaW5lQiA9IG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gICAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gICAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gICAgcmV0dXJuIGxpbmVCID4gbGluZUEgfHwgbGluZUIgPT0gbGluZUEgJiYgY29sdW1uQiA+PSBjb2x1bW5BIHx8XG4gICAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQikgPD0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRhdGEgc3RydWN0dXJlIHRvIHByb3ZpZGUgYSBzb3J0ZWQgdmlldyBvZiBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiBhXG4gICAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICAgKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAgICovXG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICAgIHRoaXMuX2FycmF5ID0gW107XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICAgIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICAgKiBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIHRha2VzLlxuICAgKlxuICAgKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICAgKi9cbiAgTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gICAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgICB0aGlzLl9hcnJheS5mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgICB2YXIgbWFwcGluZztcbiAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICAgIHRoaXMuX2xhc3QgPSBhTWFwcGluZztcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zb3J0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICAgKiBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gICAqXG4gICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICAgKiBwZXJmb3JtYW5jZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IE5PVCBiZSBtdXRhdGVkLCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXNcbiAgICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAgICogY29weS5cbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyk7XG4gICAgICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXJyYXk7XG4gIH07XG5cbiAgZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwKSB7XG4gICAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgc291cmNlTWFwID0gSlNPTi5wYXJzZShhU291cmNlTWFwLnJlcGxhY2UoL15cXClcXF1cXH0nLywgJycpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBkbyBsYXRlIHJlcXVpcmVzIGJlY2F1c2UgdGhlIHN1YmNsYXNzZXMgcmVxdWlyZSgpIHRoaXMgZmlsZS5cbiAgICBpZiAoc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGwpIHtcbiAgICAgIHZhciBpbmRleGVkU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2luZGV4ZWQtc291cmNlLW1hcC1jb25zdW1lcicpO1xuICAgICAgcmV0dXJuIG5ldyBpbmRleGVkU291cmNlTWFwQ29uc3VtZXIuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBiYXNpY1NvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9iYXNpYy1zb3VyY2UtbWFwLWNvbnN1bWVyJyk7XG4gICAgICByZXR1cm4gbmV3IGJhc2ljU291cmNlTWFwQ29uc3VtZXIuQmFzaWNTb3VyY2VNYXBDb25zdW1lcihzb3VyY2VNYXApO1xuICAgIH1cbiAgfVxuXG4gIFNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwKSB7XG4gICAgdmFyIGJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2Jhc2ljLXNvdXJjZS1tYXAtY29uc3VtZXInKTtcbiAgICByZXR1cm4gYmFzaWNTb3VyY2VNYXBDb25zdW1lci5CYXNpY1NvdXJjZU1hcENvbnN1bWVyXG4gICAgICAgICAgICAuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG5cbiAgLy8gYF9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZCBgX19vcmlnaW5hbE1hcHBpbmdzYCBhcmUgYXJyYXlzIHRoYXQgaG9sZCB0aGVcbiAgLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbiAgLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gIC8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgZ2V0dGVycyByZXNwZWN0aXZlbHksIGFuZCB3ZSBvbmx5IHBhcnNlIHRoZSBtYXBwaW5nc1xuICAvLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbiAgLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4gIC8vIHRoZW0gaXMgZXhwZW5zaXZlLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgaWYgd2UgbXVzdC5cbiAgLy9cbiAgLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbiAgLy9cbiAgLy8gICAgIHtcbiAgLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbiAgLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4gIC8vICAgICAgICAgICAgIGNvZGUuXG4gIC8vICAgICB9XG4gIC8vXG4gIC8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbiAgLy8gYG51bGxgLlxuICAvL1xuICAvLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuICAvL1xuICAvLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfZ2VuZXJhdGVkTWFwcGluZ3MnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICB9XG4gIH0pO1xuXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgfVxuICB9KTtcblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyKSB7XG4gICAgICB2YXIgYyA9IGFTdHIuY2hhckF0KDApO1xuICAgICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAgICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gICAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3BhcnNlTWFwcGluZ3MoYVN0ciwgYVNvdXJjZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgX3BhcnNlTWFwcGluZ3NcIik7XG4gICAgfTtcblxuICBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVIgPSAxO1xuICBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAgICogZ2VuZXJhdGVkIGxpbmUvY29sdW1uIGluIHRoaXMgc291cmNlIG1hcC5cbiAgICpcbiAgICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggZWFjaCBtYXBwaW5nLlxuICAgKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gICAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAgICogICAgICAgIHRpbWUgdGhhdCBgYUNhbGxiYWNrYCBpcyBjYWxsZWQuXG4gICAqIEBwYXJhbSBhT3JkZXJcbiAgICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICAgKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSYC4gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdG9cbiAgICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gICAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAgICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9lYWNoTWFwcGluZyhhQ2FsbGJhY2ssIGFDb250ZXh0LCBhT3JkZXIpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICAgIHZhciBtYXBwaW5ncztcbiAgICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgICBtYXBwaW5ncyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICAgIG1hcHBpbmdzID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5ncztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9yZGVyIG9mIGl0ZXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgICAgbWFwcGluZ3MubWFwKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pLmZvckVhY2goYUNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlXG4gICAqIGFuZCBsaW5lIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqXG4gICAqIGFuZCBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHJldHVybmVkLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gSW5maW5pdHksIHdlIHRodXMgZmluZCB0aGUgbGFzdFxuICAgICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IEluZmluaXR5XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgbmVlZGxlLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBuZWVkbGUuc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBuZWVkbGUub3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1stLWluZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGluZ3MucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuICB2YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xuICB2YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU291cmNlTWFwR2VuZXJhdG9yIHJlcHJlc2VudHMgYSBzb3VyY2UgbWFwIHdoaWNoIGlzXG4gICAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAgICovXG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICAgIGlmICghYUFyZ3MpIHtcbiAgICAgIGFBcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgICB0aGlzLl9zb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2VSb290JywgbnVsbCk7XG4gICAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbiAgfVxuXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNvdXJjZU1hcEdlbmVyYXRvciBiYXNlZCBvbiBhIFNvdXJjZU1hcENvbnN1bWVyXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICAgIHZhciBzb3VyY2VSb290ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZVJvb3Q7XG4gICAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgICBzb3VyY2VSb290OiBzb3VyY2VSb290XG4gICAgICB9KTtcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICB2YXIgbmV3TWFwcGluZyA9IHtcbiAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBuZXdNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgICAgfSk7XG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBnZW5lcmF0b3Iuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSBtYXBwaW5nIGZyb20gb3JpZ2luYWwgc291cmNlIGxpbmUgYW5kIGNvbHVtbiB0byB0aGUgZ2VuZXJhdGVkXG4gICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gICAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAgICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAgICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIChyZWxhdGl2ZSB0byB0aGUgc291cmNlUm9vdCkuXG4gICAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFkZE1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICAgIHZhciBvcmlnaW5hbCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnb3JpZ2luYWwnLCBudWxsKTtcbiAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgICAgaWYgKCF0aGlzLl9za2lwVmFsaWRhdGlvbikge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIXRoaXMuX25hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICAgIGdlbmVyYXRlZExpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5jb2x1bW4sXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9KTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLl9zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAvLyBBZGQgdGhlIHNvdXJjZSBjb250ZW50IHRvIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHNvdXJjZSBmaWxlIGZyb20gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc291cmNlc0NvbnRlbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgbWFwcGluZ3Mgb2YgYSBzdWItc291cmNlLW1hcCBmb3IgYSBzcGVjaWZpYyBzb3VyY2UgZmlsZSB0byB0aGVcbiAgICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAgICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gICAqIHJlc3VsdGluZyBtYXBwaW5ncyBpcyB0aGUgbWluaW1pdW0gb2YgdGhpcyBtYXAgYW5kIHRoZSBzdXBwbGllZCBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAgICogQHBhcmFtIGFTb3VyY2VGaWxlIE9wdGlvbmFsLiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLlxuICAgKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICAgKiAgICAgICAgdG8gYmUgYXBwbGllZC4gSWYgcmVsYXRpdmUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBDb25zdW1lci5cbiAgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gICAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICAgKiAgICAgICAgcGF0aHMuIElmIHNvLCB0aG9zZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbmVlZCB0byBiZSByZXdyaXR0ZW5cbiAgICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgICAvLyBJZiBhU291cmNlRmlsZSBpcyBvbWl0dGVkLCB3ZSB3aWxsIHVzZSB0aGUgZmlsZSBwcm9wZXJ0eSBvZiB0aGUgU291cmNlTWFwXG4gICAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgICB9XG4gICAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHlpbmcgdGhlIFNvdXJjZU1hcCBjYW4gYWRkIGFuZCByZW1vdmUgaXRlbXMgZnJvbSB0aGUgc291cmNlcyBhbmRcbiAgICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgICB2YXIgbmV3TmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcblxuICAgICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBzb3VyY2VGaWxlICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgICBuZXdTb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5ld05hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICB9LCB0aGlzKTtcbiAgICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgICAgLy8gQ29weSBzb3VyY2VzQ29udGVudHMgb2YgYXBwbGllZCBtYXAuXG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBjYW4gaGF2ZSBvbmUgb2YgdGhlIHRocmVlIGxldmVscyBvZiBkYXRhOlxuICAgKlxuICAgKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAgICogICAyLiBUaGUgR2VuZXJhdGVkIHBvc2l0aW9uLCBvcmlnaW5hbCBwb3NpdGlvbiwgYW5kIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gICAqICAgICAgdG9rZW4uXG4gICAqXG4gICAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICAgKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTmFtZSkge1xuICAgICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAgIC8vIENhc2UgMS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgICAmJiBhT3JpZ2luYWwgJiYgJ2xpbmUnIGluIGFPcmlnaW5hbCAmJiAnY29sdW1uJyBpbiBhT3JpZ2luYWxcbiAgICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICAgJiYgYVNvdXJjZSkge1xuICAgICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZ2VuZXJhdGVkOiBhR2VuZXJhdGVkLFxuICAgICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICAgIG5hbWU6IGFOYW1lXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gICAqIHNwZWNpZmllZCBieSB0aGUgc291cmNlIG1hcCBmb3JtYXQuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NlcmlhbGl6ZU1hcHBpbmdzKCkge1xuICAgICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIHZhciBtYXBwaW5nO1xuXG4gICAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICc7JztcbiAgICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGlmICghdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZSh0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c1NvdXJjZSk7XG4gICAgICAgICAgcHJldmlvdXNTb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuXG4gICAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKHRoaXMuX25hbWVzLmluZGV4T2YobWFwcGluZy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgICAgcHJldmlvdXNOYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2dlbmVyYXRlU291cmNlc0NvbnRlbnQoYVNvdXJjZXMsIGFTb3VyY2VSb290KSB7XG4gICAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUoYVNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zb3VyY2VzQ29udGVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KVxuICAgICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgICA6IG51bGw7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9KU09OID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgICAgdmFyIG1hcCA9IHtcbiAgICAgICAgdmVyc2lvbjogdGhpcy5fdmVyc2lvbixcbiAgICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICAgIG1hcHBpbmdzOiB0aGlzLl9zZXJpYWxpemVNYXBwaW5ncygpXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgICBtYXAuZmlsZSA9IHRoaXMuX2ZpbGU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIG1hcC5zb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgbWFwLnNvdXJjZXNDb250ZW50ID0gdGhpcy5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChtYXAuc291cmNlcywgbWFwLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfTtcblxuICBleHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8vIE1hdGNoZXMgYSBXaW5kb3dzLXN0eWxlIGBcXHJcXG5gIG5ld2xpbmUgb3IgYSBgXFxuYCBuZXdsaW5lIHVzZWQgYnkgYWxsIG90aGVyXG4gIC8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbiAgdmFyIFJFR0VYX05FV0xJTkUgPSAvKFxccj9cXG4pLztcblxuICAvLyBOZXdsaW5lIGNoYXJhY3RlciBjb2RlIGZvciBjaGFyQ29kZUF0KCkgY29tcGFyaXNvbnNcbiAgdmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4gIC8vIFByaXZhdGUgc3ltYm9sIGZvciBpZGVudGlmeWluZyBgU291cmNlTm9kZWBzIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgb2ZcbiAgLy8gdGhlIHNvdXJjZS1tYXAgbGlicmFyeSBhcmUgbG9hZGVkLiBUaGlzIE1VU1QgTk9UIENIQU5HRSBhY3Jvc3NcbiAgLy8gdmVyc2lvbnMhXG4gIHZhciBpc1NvdXJjZU5vZGUgPSBcIiQkJGlzU291cmNlTm9kZSQkJFwiO1xuXG4gIC8qKlxuICAgKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gICAqIHNuaXBwZXRzIG9mIGdlbmVyYXRlZCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIHdoaWxlIG1haW50YWluaW5nIHRoZSBsaW5lIGFuZFxuICAgKiBjb2x1bW4gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGFMaW5lIFRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci5cbiAgICogQHBhcmFtIGFDb2x1bW4gVGhlIG9yaWdpbmFsIGNvbHVtbiBudW1iZXIuXG4gICAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAgICogQHBhcmFtIGFDaHVua3MgT3B0aW9uYWwuIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIHNuaXBwZXRzIG9mXG4gICAqICAgICAgICBnZW5lcmF0ZWQgSlMsIG9yIG90aGVyIFNvdXJjZU5vZGVzLlxuICAgKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gICAqL1xuICBmdW5jdGlvbiBTb3VyY2VOb2RlKGFMaW5lLCBhQ29sdW1uLCBhU291cmNlLCBhQ2h1bmtzLCBhTmFtZSkge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLnNvdXJjZUNvbnRlbnRzID0ge307XG4gICAgdGhpcy5saW5lID0gYUxpbmUgPT0gbnVsbCA/IG51bGwgOiBhTGluZTtcbiAgICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICAgIHRoaXMuc291cmNlID0gYVNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGFTb3VyY2U7XG4gICAgdGhpcy5uYW1lID0gYU5hbWUgPT0gbnVsbCA/IG51bGwgOiBhTmFtZTtcbiAgICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICAgIGlmIChhQ2h1bmtzICE9IG51bGwpIHRoaXMuYWRkKGFDaHVua3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAgICogQHBhcmFtIGFSZWxhdGl2ZVBhdGggT3B0aW9uYWwuIFRoZSBwYXRoIHRoYXQgcmVsYXRpdmUgc291cmNlcyBpbiB0aGVcbiAgICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAgICovXG4gIFNvdXJjZU5vZGUuZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgICAgLy8gVGhlIFNvdXJjZU5vZGUgd2Ugd2FudCB0byBmaWxsIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAgICAvLyBhbmQgdGhlIFNvdXJjZU1hcFxuICAgICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgICAvLyBBbGwgZXZlbiBpbmRpY2VzIG9mIHRoaXMgYXJyYXkgYXJlIG9uZSBsaW5lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgICAgIC8vIHdoaWxlIGFsbCBvZGQgaW5kaWNlcyBhcmUgdGhlIG5ld2xpbmVzIGJldHdlZW4gdHdvIGFkamFjZW50IGxpbmVzXG4gICAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgICAvLyBQcm9jZXNzZWQgZnJhZ21lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhpcyBhcnJheSwgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBhR2VuZXJhdGVkQ29kZS5zcGxpdChSRUdFWF9ORVdMSU5FKTtcbiAgICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsaW5lQ29udGVudHMgPSByZW1haW5pbmdMaW5lcy5zaGlmdCgpO1xuICAgICAgICAvLyBUaGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBtaWdodCBub3QgaGF2ZSBhIG5ld2xpbmUuXG4gICAgICAgIHZhciBuZXdMaW5lID0gcmVtYWluaW5nTGluZXMuc2hpZnQoKSB8fCBcIlwiO1xuICAgICAgICByZXR1cm4gbGluZUNvbnRlbnRzICsgbmV3TGluZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIFwicmVtYWluaW5nTGluZXNcIlxuICAgICAgdmFyIGxhc3RHZW5lcmF0ZWRMaW5lID0gMSwgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG5cbiAgICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAgIC8vIFRvIGV4dHJhY3QgaXQgY3VycmVudCBhbmQgbGFzdCBtYXBwaW5nIGlzIHVzZWQuXG4gICAgICAvLyBIZXJlIHdlIHN0b3JlIHRoZSBsYXN0IG1hcHBpbmcuXG4gICAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKGxhc3RNYXBwaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICBpZiAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gXCJcIjtcbiAgICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgYWRkZWQgd2l0aG91dCBtYXBwaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIGNvZGUgYmV0d2VlbiBcImxhc3RHZW5lcmF0ZWRDb2x1bW5cIiBhbmRcbiAgICAgICAgICAgIC8vIFwibWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cIiB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbMF07XG4gICAgICAgICAgICB2YXIgY29kZSA9IG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzWzBdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAgIC8vIE5vIG1vcmUgcmVtYWluaW5nIGNvZGUsIGNvbnRpbnVlXG4gICAgICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgICAgLy8gdG8gdGhlIFNvdXJjZU5vZGUgd2l0aG91dCBhbnkgbWFwcGluZy5cbiAgICAgICAgLy8gRWFjaCBsaW5lIGlzIGFkZGVkIGFzIHNlcGFyYXRlIHN0cmluZy5cbiAgICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHtcbiAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1swXTtcbiAgICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgICByZW1haW5pbmdMaW5lc1swXSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgIH0sIHRoaXMpO1xuICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgICAgaWYgKHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGxhc3RNYXBwaW5nKSB7XG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICAgIG5vZGUuYWRkKHJlbWFpbmluZ0xpbmVzLmpvaW4oXCJcIikpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50IGludG8gU291cmNlTm9kZVxuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGFSZWxhdGl2ZVBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5vZGU7XG5cbiAgICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICAgIGlmIChtYXBwaW5nID09PSBudWxsIHx8IG1hcHBpbmcuc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBub2RlLmFkZChjb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gYVJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgPyB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICAgIG5vZGUuYWRkKG5ldyBTb3VyY2VOb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5uYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhpcyBzb3VyY2Ugbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gICAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgICAgYUNodW5rLmZvckVhY2goZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoYUNodW5rKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChhQ2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAgICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICAgIGZvciAodmFyIGkgPSBhQ2h1bmsubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYUNodW5rKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIEpTIHNuaXBwZXRzIGluIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLiBUaGVcbiAgICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICAgKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGsoYUZuKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjaHVuayA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgICBjaHVuay53YWxrKGFGbik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICAgIGFGbihjaHVuaywgeyBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTGlrZSBgU3RyaW5nLnByb3RvdHlwZS5qb2luYCBleGNlcHQgZm9yIFNvdXJjZU5vZGVzLiBJbnNlcnRzIGBhU3RyYCBiZXR3ZWVuXG4gICAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICAgKlxuICAgKiBAcGFyYW0gYVNlcCBUaGUgc2VwYXJhdG9yLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfam9pbihhU2VwKSB7XG4gICAgdmFyIG5ld0NoaWxkcmVuO1xuICAgIHZhciBpO1xuICAgIHZhciBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4tMTsgaSsrKSB7XG4gICAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgICB9XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Ugb24gdGhlIHZlcnkgcmlnaHQtbW9zdCBzb3VyY2Ugc25pcHBldC4gVXNlZnVsXG4gICAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gICAqXG4gICAqIEBwYXJhbSBhUGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5yZXBsYWNlUmlnaHQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3JlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KSB7XG4gICAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdENoaWxkW2lzU291cmNlTm9kZV0pIHtcbiAgICAgIGxhc3RDaGlsZC5yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPSBsYXN0Q2hpbGQucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goJycucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvclxuICAgKiBpbiB0aGUgc291cmNlc0NvbnRlbnQgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlRmlsZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlXG4gICAqIEBwYXJhbSBhU291cmNlQ29udGVudCBUaGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGVcbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfTtcblxuICAvKipcbiAgICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAgICogc291cmNlIGZpbGUgY29udGVudCBhbmQgaXMgcGFzc2VkIHRoZSBmaWxlbmFtZSBhbmQgc291cmNlIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLndhbGtTb3VyY2VDb250ZW50cyA9XG4gICAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXVtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgYUZuKHV0aWwuZnJvbVNldFN0cmluZyhzb3VyY2VzW2ldKSwgdGhpcy5zb3VyY2VDb250ZW50c1tzb3VyY2VzW2ldXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICAgKiBhbmQgY29uY2F0ZW5hdGVzIGFsbCB0aGUgdmFyaW91cyBzbmlwcGV0cyB0b2dldGhlciB0byBvbmUgc3RyaW5nLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHN0ciArPSBjaHVuaztcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZSBhbG9uZyB3aXRoIGEgc291cmNlXG4gICAqIG1hcC5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmdXaXRoU291cmNlTWFwKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICAgIGNvZGU6IFwiXCIsXG4gICAgICBsaW5lOiAxLFxuICAgICAgY29sdW1uOiAwXG4gICAgfTtcbiAgICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncyk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB2YXIgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICB2YXIgbGFzdE9yaWdpbmFsTGluZSA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsO1xuICAgIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmssIG9yaWdpbmFsKSB7XG4gICAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT09IG51bGxcbiAgICAgICAgICAmJiBvcmlnaW5hbC5saW5lICE9PSBudWxsXG4gICAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICAgIGlmKGxhc3RPcmlnaW5hbFNvdXJjZSAhPT0gb3JpZ2luYWwuc291cmNlXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbExpbmUgIT09IG9yaWdpbmFsLmxpbmVcbiAgICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTmFtZSAhPT0gb3JpZ2luYWwubmFtZSkge1xuICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgIGxhc3RPcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICBsYXN0T3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBpZiAoY2h1bmsuY2hhckNvZGVBdChpZHgpID09PSBORVdMSU5FX0NPREUpIHtcbiAgICAgICAgICBnZW5lcmF0ZWQubGluZSsrO1xuICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAgIC8vIE1hcHBpbmdzIGVuZCBhdCBlb2xcbiAgICAgICAgICBpZiAoaWR4ICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG4gIH07XG5cbiAgZXhwb3J0cy5Tb3VyY2VOb2RlID0gU291cmNlTm9kZTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gICAqIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICAgKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gICAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gICAgfVxuICB9XG4gIGV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG4gIHZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Ll0qKSg/OjooXFxkKykpPyhcXFMqKSQvO1xuICB2YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbiAgZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICAgIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgICBwYXRoOiBtYXRjaFs1XVxuICAgIH07XG4gIH1cbiAgZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG4gIGZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgICB2YXIgdXJsID0gJyc7XG4gICAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gICAgfVxuICAgIHVybCArPSAnLy8nO1xuICAgIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICAgIH1cbiAgICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gICAqXG4gICAqIC0gUmVwbGFjZXMgY29uc2VxdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gICAqXG4gICAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICAgIHZhciBwYXRoID0gYVBhdGg7XG4gICAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICAgIHJldHVybiBhUGF0aDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSB1cmwucGF0aDtcbiAgICB9XG4gICAgdmFyIGlzQWJzb2x1dGUgPSAocGF0aC5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gICAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgIHVwKys7XG4gICAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgICB1cCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICAgIHVwLS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gICAgfVxuXG4gICAgaWYgKHVybCkge1xuICAgICAgdXJsLnBhdGggPSBwYXRoO1xuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIGV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4gIC8qKlxuICAgKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAgICpcbiAgICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICAgKlxuICAgKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICAgKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAgICogICBmaXJzdC5cbiAgICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gICAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICAgKiAgIGlzIHJldHVybmVkLlxuICAgKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gICAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAgICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICAgIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgICAgYVJvb3QgPSBcIi5cIjtcbiAgICB9XG4gICAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgICBhUGF0aCA9IFwiLlwiO1xuICAgIH1cbiAgICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gICAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgICB9XG5cbiAgICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICAgIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgICB9XG5cbiAgICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICA/IGFQYXRoXG4gICAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuICAgIHJldHVybiBqb2luZWQ7XG4gIH1cbiAgZXhwb3J0cy5qb2luID0gam9pbjtcblxuICAvKipcbiAgICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gICAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlbGF0aXZlKGFSb290LCBhUGF0aCkge1xuICAgIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgICAgYVJvb3QgPSBcIi5cIjtcbiAgICB9XG5cbiAgICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgICAvLyBYWFg6IEl0IGlzIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGlzIGJsb2NrLCBhbmQgdGhlIHRlc3RzIHN0aWxsIHBhc3MhXG4gICAgdmFyIHVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgICBpZiAoYVBhdGguY2hhckF0KDApID09IFwiL1wiICYmIHVybCAmJiB1cmwucGF0aCA9PSBcIi9cIikge1xuICAgICAgcmV0dXJuIGFQYXRoLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiBhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSA9PT0gMFxuICAgICAgPyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSlcbiAgICAgIDogYVBhdGg7XG4gIH1cbiAgZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG4gIC8qKlxuICAgKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gICAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBmdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cbiAgZXhwb3J0cy50b1NldFN0cmluZyA9IHRvU2V0U3RyaW5nO1xuXG4gIGZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICAgIHJldHVybiBhU3RyLnN1YnN0cigxKTtcbiAgfVxuICBleHBvcnRzLmZyb21TZXRTdHJpbmcgPSBmcm9tU2V0U3RyaW5nO1xuXG4gIGZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgICB2YXIgczEgPSBhU3RyMSB8fCBcIlwiO1xuICAgIHZhciBzMiA9IGFTdHIyIHx8IFwiXCI7XG4gICAgcmV0dXJuIChzMSA+IHMyKSAtIChzMSA8IHMyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gICAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICAgKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICAgKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgdmFyIGNtcDtcblxuICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICAgIGlmIChjbXAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIH07XG4gIGV4cG9ydHMuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucztcblxuICAvKipcbiAgICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmVcbiAgICogY29tcGFyZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAgICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gICAqIHNvdXJjZS9uYW1lL29yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhXG4gICAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHZhciBjbXA7XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgICBpZiAoY21wIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbiAgfTtcbiAgZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnM7XG5cbn0pO1xuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIl9hcmdzXCI6IFtcbiAgICBbXG4gICAgICBcImVzY29kZWdlbkBeMS43LjBcIixcbiAgICAgIFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZXNjb2RlZ2VuQD49MS43LjAgPDIuMC4wXCIsXG4gIFwiX2lkXCI6IFwiZXNjb2RlZ2VuQDEuOC4wXCIsXG4gIFwiX2luQ2FjaGVcIjogdHJ1ZSxcbiAgXCJfaW5zdGFsbGFibGVcIjogdHJ1ZSxcbiAgXCJfbG9jYXRpb25cIjogXCIvZXNjb2RlZ2VuXCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNC4xLjFcIixcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcInV0YXRhbmUudGVhQGdtYWlsLmNvbVwiLFxuICAgIFwibmFtZVwiOiBcImNvbnN0ZWxsYXRpb25cIlxuICB9LFxuICBcIl9ucG1WZXJzaW9uXCI6IFwiMi4xNC40XCIsXG4gIFwiX3BoYW50b21DaGlsZHJlblwiOiB7XG4gICAgXCJhbWRlZmluZVwiOiBcIjEuMC4wXCJcbiAgfSxcbiAgXCJfcmVxdWVzdGVkXCI6IHtcbiAgICBcIm5hbWVcIjogXCJlc2NvZGVnZW5cIixcbiAgICBcInJhd1wiOiBcImVzY29kZWdlbkBeMS43LjBcIixcbiAgICBcInJhd1NwZWNcIjogXCJeMS43LjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj0xLjcuMCA8Mi4wLjBcIixcbiAgICBcInR5cGVcIjogXCJyYW5nZVwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL1wiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjb2RlZ2VuLy0vZXNjb2RlZ2VuLTEuOC4wLnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCJiMjQ2YWFlODI5Y2U3M2Q1OWUyYzU1NzI3MzU5ZWRkMWMxMzBhODFiXCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcImVzY29kZWdlbkBeMS43LjBcIixcbiAgXCJfd2hlcmVcIjogXCIvVXNlcnMvYWpvL3dvcmtzcGFjZS9oeWRyb2x5c2lzXCIsXG4gIFwiYmluXCI6IHtcbiAgICBcImVzY29kZWdlblwiOiBcIi4vYmluL2VzY29kZWdlbi5qc1wiLFxuICAgIFwiZXNnZW5lcmF0ZVwiOiBcIi4vYmluL2VzZ2VuZXJhdGUuanNcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VzdG9vbHMvZXNjb2RlZ2VuL2lzc3Vlc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImVzcHJpbWFcIjogXCJeMi43LjFcIixcbiAgICBcImVzdHJhdmVyc2VcIjogXCJeMS45LjFcIixcbiAgICBcImVzdXRpbHNcIjogXCJeMi4wLjJcIixcbiAgICBcIm9wdGlvbmF0b3JcIjogXCJeMC44LjFcIixcbiAgICBcInNvdXJjZS1tYXBcIjogXCJ+MC4yLjBcIlxuICB9LFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRUNNQVNjcmlwdCBjb2RlIGdlbmVyYXRvclwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhY29ybi02dG81XCI6IFwiXjAuMTEuMS0yNVwiLFxuICAgIFwiYmx1ZWJpcmRcIjogXCJeMi4zLjExXCIsXG4gICAgXCJib3dlci1yZWdpc3RyeS1jbGllbnRcIjogXCJeMC4yLjFcIixcbiAgICBcImNoYWlcIjogXCJeMS4xMC4wXCIsXG4gICAgXCJjb21tb25qcy1ldmVyeXdoZXJlXCI6IFwiXjAuOS43XCIsXG4gICAgXCJndWxwXCI6IFwiXjMuOC4xMFwiLFxuICAgIFwiZ3VscC1lc2xpbnRcIjogXCJeMC4yLjBcIixcbiAgICBcImd1bHAtbW9jaGFcIjogXCJeMi4wLjBcIixcbiAgICBcInNlbXZlclwiOiBcIl41LjEuMFwiXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge30sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCJiMjQ2YWFlODI5Y2U3M2Q1OWUyYzU1NzI3MzU5ZWRkMWMxMzBhODFiXCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjb2RlZ2VuLy0vZXNjb2RlZ2VuLTEuOC4wLnRnelwiXG4gIH0sXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0wLjEyLjBcIlxuICB9LFxuICBcImZpbGVzXCI6IFtcbiAgICBcIkxJQ0VOU0UuQlNEXCIsXG4gICAgXCJMSUNFTlNFLnNvdXJjZS1tYXBcIixcbiAgICBcIlJFQURNRS5tZFwiLFxuICAgIFwiYmluXCIsXG4gICAgXCJlc2NvZGVnZW4uanNcIixcbiAgICBcInBhY2thZ2UuanNvblwiXG4gIF0sXG4gIFwiZ2l0SGVhZFwiOiBcIjBlODI4MGFhMDYxYTBkYmVmYjMyZDI3N2EwNTAxNWJhYTdmM2U3ZjJcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHA6Ly9naXRodWIuY29tL2VzdG9vbHMvZXNjb2RlZ2VuXCIsXG4gIFwibGljZW5zZVwiOiBcIkJTRC0yLUNsYXVzZVwiLFxuICBcIm1haW5cIjogXCJlc2NvZGVnZW4uanNcIixcbiAgXCJtYWludGFpbmVyc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiY29uc3RlbGxhdGlvblwiLFxuICAgICAgXCJlbWFpbFwiOiBcInV0YXRhbmUudGVhQGdtYWlsLmNvbVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJtaWNoYWVsZmljYXJyYVwiLFxuICAgICAgXCJlbWFpbFwiOiBcIm5wbUBtaWNoYWVsLmZpY2FycmEubWVcIlxuICAgIH1cbiAgXSxcbiAgXCJuYW1lXCI6IFwiZXNjb2RlZ2VuXCIsXG4gIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwic291cmNlLW1hcFwiOiBcIn4wLjIuMFwiXG4gIH0sXG4gIFwicmVhZG1lXCI6IFwiRVJST1I6IE5vIFJFQURNRSBkYXRhIGZvdW5kIVwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K3NzaDovL2dpdEBnaXRodWIuY29tL2VzdG9vbHMvZXNjb2RlZ2VuLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcImNqc2lmeSAtYSBwYXRoOiB0b29scy9lbnRyeS1wb2ludC5qcyA+IGVzY29kZWdlbi5icm93c2VyLmpzXCIsXG4gICAgXCJidWlsZC1taW5cIjogXCJjanNpZnkgLW1hIHBhdGg6IHRvb2xzL2VudHJ5LXBvaW50LmpzID4gZXNjb2RlZ2VuLmJyb3dzZXIubWluLmpzXCIsXG4gICAgXCJsaW50XCI6IFwiZ3VscCBsaW50XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwibm9kZSB0b29scy9yZWxlYXNlLmpzXCIsXG4gICAgXCJ0ZXN0XCI6IFwiZ3VscCB0cmF2aXNcIixcbiAgICBcInVuaXQtdGVzdFwiOiBcImd1bHAgdGVzdFwiXG4gIH0sXG4gIFwidmVyc2lvblwiOiBcIjEuOC4wXCJcbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIEVzcHJlZSBmaWxlIHRoYXQgY29udmVydHMgQWNvcm4gaW50byBFc3ByaW1hIG91dHB1dC5cbiAqIENvcHlyaWdodCAyMDE1IE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBNSVQtbGljZW5zZWQgcHJvamVjdHM6XG4gKiAxLiBBY29yblxuICogMi4gQmFieWxvblxuICogMy4gQmFiZWwtRVNMaW50XG4gKlxuICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgY29kZSBmcm9tIEVzcHJpbWEsIHdoaWNoIGlzIEJTRCBsaWNlbnNlZC5cbiAqXG4gKiBBY29ybiBpcyBDb3B5cmlnaHQgMjAxMi0yMDE1IEFjb3JuIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvYWNvcm4vYmxvYi9tYXN0ZXIvQVVUSE9SUylcbiAqIEJhYnlsb24gaXMgQ29weXJpZ2h0IDIwMTQtMjAxNSB2YXJpb3VzIGNvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2JhYnlsb24vQVVUSE9SUylcbiAqIEJhYmVsLUVTTGludCBpcyBDb3B5cmlnaHQgMjAxNC0yMDE1IFNlYmFzdGlhbiBNY0tlbnppZSA8c2VibWNrQGdtYWlsLmNvbT5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIEVzcHJpbWEgaXMgQ29weXJpZ2h0IChjKSBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgQ29udHJpYnV0b3JzLCBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG4vKiBlc2xpbnQgbm8tdW5kZWZpbmVkOjAsIG5vLXVzZS1iZWZvcmUtZGVmaW5lOiAwICovXG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXN0Tm9kZVR5cGVzID0gcmVxdWlyZShcIi4vbGliL2FzdC1ub2RlLXR5cGVzXCIpLFxuICAgIGNvbW1lbnRBdHRhY2htZW50ID0gcmVxdWlyZShcIi4vbGliL2NvbW1lbnQtYXR0YWNobWVudFwiKSxcbiAgICBUb2tlblRyYW5zbGF0b3IgPSByZXF1aXJlKFwiLi9saWIvdG9rZW4tdHJhbnNsYXRvclwiKSxcbiAgICBhY29ybkpTWCA9IHJlcXVpcmUoXCJhY29ybi1qc3gvaW5qZWN0XCIpLFxuICAgIHJhd0Fjb3JuID0gcmVxdWlyZShcImFjb3JuXCIpO1xuXG5cbnZhciBhY29ybiA9IGFjb3JuSlNYKHJhd0Fjb3JuKTtcblxudmFyIGxvb2thaGVhZCxcbiAgICBleHRyYSxcbiAgICBsYXN0VG9rZW47XG5cbi8qKlxuICogUmVzZXRzIHRoZSBleHRyYSBvYmplY3QgdG8gaXRzIGRlZmF1bHQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc2V0RXh0cmEoKSB7XG4gICAgZXh0cmEgPSB7XG4gICAgICAgIHRva2VuczogbnVsbCxcbiAgICAgICAgcmFuZ2U6IGZhbHNlLFxuICAgICAgICBsb2M6IGZhbHNlLFxuICAgICAgICBjb21tZW50OiBmYWxzZSxcbiAgICAgICAgY29tbWVudHM6IFtdLFxuICAgICAgICB0b2xlcmFudDogZmFsc2UsXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICAgIGVjbWFGZWF0dXJlczoge30sXG4gICAgICAgIGVjbWFWZXJzaW9uOiA1LFxuICAgICAgICBpc01vZHVsZTogZmFsc2VcbiAgICB9O1xufVxuXG5cblxudmFyIHR0ID0gYWNvcm4udG9rVHlwZXMsXG4gICAgZ2V0TGluZUluZm8gPSBhY29ybi5nZXRMaW5lSW5mbztcblxuLy8gY3VzdG9tIHR5cGUgZm9yIEpTWCBhdHRyaWJ1dGUgdmFsdWVzXG50dC5qc3hBdHRyVmFsdWVUb2tlbiA9IHt9O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIGlzIHZhbGlkIGdpdmVuIHRoZSBzZXQgb2YgZWNtYUZlYXR1cmVzLlxuICogQHBhcmFtIHtBU1ROb2RlfSBub2RlIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG5vZGUgaXMgYWxsb3dlZCwgZmFsc2UgaWYgbm90LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE5vZGUobm9kZSkge1xuICAgIHZhciBlY21hID0gZXh0cmEuZWNtYUZlYXR1cmVzO1xuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgIGNhc2UgXCJFeHBlcmltZW50YWxSZXN0UHJvcGVydHlcIjpcbiAgICAgICAgICAgIHJldHVybiBlY21hLmV4cGVyaW1lbnRhbE9iamVjdFJlc3RTcHJlYWQ7XG5cbiAgICAgICAgY2FzZSBcIkltcG9ydERlY2xhcmF0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjpcbiAgICAgICAgY2FzZSBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gZXh0cmEuaXNNb2R1bGU7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBsYXN0LW1pbnV0ZSBFc3ByaW1hLXNwZWNpZmljIGNvbXBhdGliaWxpdHkgY2hlY2tzIGFuZCBmaXhlcy5cbiAqIEBwYXJhbSB7QVNUTm9kZX0gcmVzdWx0IFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMge0FTVE5vZGV9IFRoZSBmaW5pc2hlZCBub2RlLlxuICogQHByaXZhdGVcbiAqIEB0aGlzIGFjb3JuLlBhcnNlclxuICovXG5mdW5jdGlvbiBlc3ByaW1hRmluaXNoTm9kZShyZXN1bHQpIHtcbiAgICAvLyBlbnN1cmUgdGhhdCBwYXJzZWQgbm9kZSB3YXMgYWxsb3dlZCB0aHJvdWdoIGVjbWFGZWF0dXJlc1xuICAgIGlmICghaXNWYWxpZE5vZGUocmVzdWx0KSkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQocmVzdWx0LnN0YXJ0KTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi9pc3N1ZXMvMzIzXG4gICAgaWYgKHJlc3VsdC50eXBlID09PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQuZ3VhcmRlZEhhbmRsZXJzO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT09IFwiQ2F0Y2hDbGF1c2VcIikge1xuICAgICAgICBkZWxldGUgcmVzdWx0Lmd1YXJkO1xuICAgIH1cblxuICAgIC8vIEFjb3JuIGRvZXNuJ3QgY291bnQgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgYmFja3RpY2tzIGFzIHBhcnQgb2YgdGVtcGxhdGVzXG4gICAgLy8gc28gd2UgaGF2ZSB0byBhZGp1c3QgcmFuZ2VzL2xvY2F0aW9ucyBhcHByb3ByaWF0ZWx5LlxuICAgIGlmIChyZXN1bHQudHlwZSA9PT0gXCJUZW1wbGF0ZUVsZW1lbnRcIikge1xuXG4gICAgICAgIC8vIGFkZGl0aW9uYWwgYWRqdXN0bWVudCBuZWVkZWQgaWYgJHsgaXMgdGhlIGxhc3QgdG9rZW5cbiAgICAgICAgdmFyIHRlcm1pbmFsRG9sbGFyQnJhY2VMID0gdGhpcy5pbnB1dC5zbGljZShyZXN1bHQuZW5kLCByZXN1bHQuZW5kICsgMikgPT09IFwiJHtcIjtcblxuICAgICAgICBpZiAocmVzdWx0LnJhbmdlKSB7XG4gICAgICAgICAgICByZXN1bHQucmFuZ2VbMF0tLTtcbiAgICAgICAgICAgIHJlc3VsdC5yYW5nZVsxXSArPSAodGVybWluYWxEb2xsYXJCcmFjZUwgPyAyIDogMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmxvYykge1xuICAgICAgICAgICAgcmVzdWx0LmxvYy5zdGFydC5jb2x1bW4tLTtcbiAgICAgICAgICAgIHJlc3VsdC5sb2MuZW5kLmNvbHVtbiArPSAodGVybWluYWxEb2xsYXJCcmFjZUwgPyAyIDogMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBY29ybiBjdXJyZW50bHkgdXNlcyBleHByZXNzaW9ucyBpbnN0ZWFkIG9mIGRlY2xhcmF0aW9ucyBpbiBkZWZhdWx0IGV4cG9ydHNcbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgaWYgKC9eKENsYXNzfEZ1bmN0aW9uKUV4cHJlc3Npb24kLy50ZXN0KHJlc3VsdC5kZWNsYXJhdGlvbi50eXBlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRlY2xhcmF0aW9uLnR5cGUgPSByZXN1bHQuZGVjbGFyYXRpb24udHlwZS5yZXBsYWNlKFwiRXhwcmVzc2lvblwiLCBcIkRlY2xhcmF0aW9uXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWNvcm4gdXNlcyB1bmRlZmluZWQgaW5zdGVhZCBvZiBudWxsLCB3aGljaCBhZmZlY3RzIHNlcmlhbGl6YXRpb25cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmIHJlc3VsdC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdC52YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGV4dHJhLmF0dGFjaENvbW1lbnQpIHtcbiAgICAgICAgY29tbWVudEF0dGFjaG1lbnQucHJvY2Vzc0NvbW1lbnQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnR5cGUuaW5kZXhPZihcIkZ1bmN0aW9uXCIpID4gLTEgJiYgIXJlc3VsdC5nZW5lcmF0b3IpIHtcbiAgICAgICAgcmVzdWx0LmdlbmVyYXRvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHRva2VuIGlzIHZhbGlkIGdpdmVuIHRoZSBzZXQgb2YgZWNtYUZlYXR1cmVzLlxuICogQHBhcmFtIHthY29ybi5QYXJzZXJ9IHBhcnNlciBUaGUgcGFyc2VyIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRva2VuIGlzIGFsbG93ZWQsIGZhbHNlIGlmIG5vdC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRUb2tlbihwYXJzZXIpIHtcbiAgICB2YXIgZWNtYSA9IGV4dHJhLmVjbWFGZWF0dXJlcztcbiAgICB2YXIgdHlwZSA9IHBhcnNlci50eXBlO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgdHQuanN4TmFtZTpcbiAgICAgICAgY2FzZSB0dC5qc3hUZXh0OlxuICAgICAgICBjYXNlIHR0LmpzeFRhZ1N0YXJ0OlxuICAgICAgICBjYXNlIHR0LmpzeFRhZ0VuZDpcbiAgICAgICAgICAgIHJldHVybiBlY21hLmpzeDtcblxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVybmpzL2Fjb3JuL2lzc3Vlcy8zNjNcbiAgICAgICAgY2FzZSB0dC5yZWdleHA6XG4gICAgICAgICAgICBpZiAoZXh0cmEuZWNtYVZlcnNpb24gPCA2ICYmIHBhcnNlci52YWx1ZS5mbGFncyAmJiBwYXJzZXIudmFsdWUuZmxhZ3MuaW5kZXhPZihcInlcIikgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmplY3RzIGVzcHJpbWFGaW5pc2hOb2RlIGludG8gdGhlIGZpbmlzaE5vZGUgcHJvY2Vzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmlzaE5vZGUgT3JpZ2luYWwgZmluaXNoTm9kZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBU1ROb2RlfSBUaGUgZmluaXNoZWQgbm9kZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHdyYXBGaW5pc2hOb2RlKGZpbmlzaE5vZGUpIHtcbiAgICByZXR1cm4gLyoqIEB0aGlzIGFjb3JuLlBhcnNlciAqLyBmdW5jdGlvbihub2RlLCB0eXBlLCBwb3MsIGxvYykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZmluaXNoTm9kZS5jYWxsKHRoaXMsIG5vZGUsIHR5cGUsIHBvcywgbG9jKTtcbiAgICAgICAgcmV0dXJuIGVzcHJpbWFGaW5pc2hOb2RlLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICB9O1xufVxuXG5hY29ybi5wbHVnaW5zLmVzcHJlZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG5cbiAgICBpbnN0YW5jZS5leHRlbmQoXCJmaW5pc2hOb2RlXCIsIHdyYXBGaW5pc2hOb2RlKTtcblxuICAgIGluc3RhbmNlLmV4dGVuZChcImZpbmlzaE5vZGVBdFwiLCB3cmFwRmluaXNoTm9kZSk7XG5cbiAgICBpbnN0YW5jZS5leHRlbmQoXCJuZXh0XCIsIGZ1bmN0aW9uKG5leHQpIHtcbiAgICAgICAgcmV0dXJuIC8qKiBAdGhpcyBhY29ybi5QYXJzZXIgKi8gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRUb2tlbih0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHQuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIG5lZWRlZCBmb3IgZXhwZXJpbWVudGFsIG9iamVjdCByZXN0L3NwcmVhZFxuICAgIGluc3RhbmNlLmV4dGVuZChcImNoZWNrTFZhbFwiLCBmdW5jdGlvbihjaGVja0xWYWwpIHtcblxuICAgICAgICByZXR1cm4gLyoqIEB0aGlzIGFjb3JuLlBhcnNlciAqLyBmdW5jdGlvbihleHByLCBpc0JpbmRpbmcsIGNoZWNrQ2xhc2hlcykge1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEuZWNtYUZlYXR1cmVzLmV4cGVyaW1lbnRhbE9iamVjdFJlc3RTcHJlYWQgJiYgZXhwci50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHByLnByb3BlcnRpZXNbaV0udHlwZS5pbmRleE9mKFwiRXhwZXJpbWVudGFsXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5wcm9wZXJ0aWVzW2ldLnZhbHVlLCBpc0JpbmRpbmcsIGNoZWNrQ2xhc2hlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrTFZhbC5jYWxsKHRoaXMsIGV4cHIsIGlzQmluZGluZywgY2hlY2tDbGFzaGVzKTtcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGluc3RhbmNlLmV4dGVuZChcInBhcnNlVG9wTGV2ZWxcIiwgZnVuY3Rpb24ocGFyc2VUb3BMZXZlbCkge1xuICAgICAgICByZXR1cm4gLyoqIEB0aGlzIGFjb3JuLlBhcnNlciAqLyBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmEuZWNtYUZlYXR1cmVzLmltcGxpZWRTdHJpY3QgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmljdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbC5jYWxsKHRoaXMsIG5vZGUpO1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgaW5zdGFuY2UuZXh0ZW5kKFwidG9Bc3NpZ25hYmxlXCIsIGZ1bmN0aW9uKHRvQXNzaWduYWJsZSkge1xuXG4gICAgICAgIHJldHVybiAvKiogQHRoaXMgYWNvcm4uUGFyc2VyICovIGZ1bmN0aW9uKG5vZGUsIGlzQmluZGluZykge1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEuZWNtYUZlYXR1cmVzLmV4cGVyaW1lbnRhbE9iamVjdFJlc3RTcHJlYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbm9kZS50eXBlID0gXCJPYmplY3RQYXR0ZXJuXCI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IG5vZGUucHJvcGVydGllc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSBcIkV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3AudHlwZSA9IFwiRXhwZXJpbWVudGFsUmVzdFByb3BlcnR5XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcC5raW5kICE9PSBcImluaXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWlzZShwcm9wLmtleS5zdGFydCwgXCJPYmplY3QgcGF0dGVybiBjYW4ndCBjb250YWluIGdldHRlciBvciBzZXR0ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShwcm9wLnZhbHVlLCBpc0JpbmRpbmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b0Fzc2lnbmFibGUuY2FsbCh0aGlzLCBub2RlLCBpc0JpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gcGFyc2UgYW4gb2JqZWN0IHJlc3Qgb3Igb2JqZWN0IHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7QVNUTm9kZX0gVGhlIG5vZGUgcmVwcmVzZW50aW5nIG9iamVjdCByZXN0IG9yIG9iamVjdCBzcHJlYWQuXG4gICAgICogQHRoaXMgYWNvcm4uUGFyc2VyXG4gICAgICovXG4gICAgaW5zdGFuY2UucGFyc2VPYmplY3RSZXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cGVyaW1lbnRhbFJlc3RQcm9wZXJ0eVwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRvIHBhcnNlIGFuIG9iamVjdCB3aXRoIG9iamVjdCByZXN0IG9yIG9iamVjdCBzcHJlYWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1BhdHRlcm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZTaG9ydGhhbmREZWZhdWx0UG9zID9cbiAgICAgKiBAcmV0dXJucyB7QVNUTm9kZX0gVGhlIG5vZGUgcmVwcmVzZW50aW5nIG9iamVjdCByZXN0IG9yIG9iamVjdCBzcHJlYWQuXG4gICAgICogQHRoaXMgYWNvcm4uUGFyc2VyXG4gICAgICovXG4gICAgaW5zdGFuY2UucGFyc2VPYmogPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZlNob3J0aGFuZERlZmF1bHRQb3MpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLFxuICAgICAgICAgICAgZmlyc3QgPSB0cnVlLFxuICAgICAgICAgICAgcHJvcEhhc2ggPSB7fTtcbiAgICAgICAgbm9kZS5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuZWF0KHR0LmJyYWNlUikpIHtcblxuICAgICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0dC5icmFjZVIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcHJvcCA9IHRoaXMuc3RhcnROb2RlKCksXG4gICAgICAgICAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MsXG4gICAgICAgICAgICAgICAgc3RhcnRMb2M7XG5cbiAgICAgICAgICAgIGlmIChleHRyYS5lY21hRmVhdHVyZXMuZXhwZXJpbWVudGFsT2JqZWN0UmVzdFNwcmVhZCAmJiB0aGlzLnR5cGUgPT09IHR0LmVsbGlwc2lzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUGF0dGVybikge1xuICAgICAgICAgICAgICAgICAgICBwcm9wID0gdGhpcy5wYXJzZU9iamVjdFJlc3QoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9wID0gdGhpcy5wYXJzZVNwcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wLnR5cGUgPSBcIkV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgICAgICAgICAgIHByb3AubWV0aG9kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcHJvcC5zaG9ydGhhbmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmIChpc1BhdHRlcm4gfHwgcmVmU2hvcnRoYW5kRGVmYXVsdFBvcykge1xuICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzUGF0dGVybikge1xuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR0LnN0YXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VQcm9wZXJ0eVZhbHVlKHByb3AsIGlzUGF0dGVybiwgaXNHZW5lcmF0b3IsIHN0YXJ0UG9zLCBzdGFydExvYywgcmVmU2hvcnRoYW5kRGVmYXVsdFBvcyk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUHJvcENsYXNoKHByb3AsIHByb3BIYXNoKTtcbiAgICAgICAgICAgIG5vZGUucHJvcGVydGllcy5wdXNoKHRoaXMuZmluaXNoTm9kZShwcm9wLCBcIlByb3BlcnR5XCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgaXNQYXR0ZXJuID8gXCJPYmplY3RQYXR0ZXJuXCIgOiBcIk9iamVjdEV4cHJlc3Npb25cIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgcmFpc2UgbWV0aG9kIHRvIHRocm93IEVzcHJpbWEtc3R5bGUgZXJyb3JzLlxuICAgICAqIEBwYXJhbSB7aW50fSBwb3MgVGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAdGhyb3dzIHtTeW50YXhFcnJvcn0gQSBzeW50YXggZXJyb3IuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgaW5zdGFuY2UucmFpc2UgPSBpbnN0YW5jZS5yYWlzZVJlY292ZXJhYmxlID0gZnVuY3Rpb24ocG9zLCBtZXNzYWdlKSB7XG4gICAgICAgIHZhciBsb2MgPSBnZXRMaW5lSW5mbyh0aGlzLmlucHV0LCBwb3MpO1xuICAgICAgICB2YXIgZXJyID0gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnIuaW5kZXggPSBwb3M7XG4gICAgICAgIGVyci5saW5lTnVtYmVyID0gbG9jLmxpbmU7XG4gICAgICAgIGVyci5jb2x1bW4gPSBsb2MuY29sdW1uICsgMTsgLy8gYWNvcm4gdXNlcyAwLWJhc2VkIGNvbHVtbnNcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IHVuZXhwZWN0ZWQgbWV0aG9kIHRvIHRocm93IEVzcHJpbWEtc3R5bGUgZXJyb3JzLlxuICAgICAqIEBwYXJhbSB7aW50fSBwb3MgVGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdGhyb3dzIHtTeW50YXhFcnJvcn0gQSBzeW50YXggZXJyb3IuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgaW5zdGFuY2UudW5leHBlY3RlZCA9IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9IFwiVW5leHBlY3RlZCB0b2tlblwiO1xuXG4gICAgICAgIGlmIChwb3MgIT09IG51bGwgJiYgcG9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucG9zID0gcG9zO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMubGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbnB1dC5sYXN0SW5kZXhPZihcIlxcblwiLCB0aGlzLmxpbmVTdGFydCAtIDIpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgLS10aGlzLmN1ckxpbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZW5kID4gdGhpcy5zdGFydCkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBcIiBcIiArIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBtZXNzYWdlKTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqIEVzcHJpbWEtRkIgcmVwcmVzZW50cyBKU1ggc3RyaW5ncyBhcyB0b2tlbnMgY2FsbGVkIFwiSlNYVGV4dFwiLCBidXQgQWNvcm4tSlNYXG4gICAgKiB1c2VzIHJlZ3VsYXIgdHQuc3RyaW5nIHdpdGhvdXQgYW55IGRpc3RpbmN0aW9uIGJldHdlZW4gdGhpcyBhbmQgcmVndWxhciBKU1xuICAgICogc3RyaW5ncy4gQXMgc3VjaCwgd2UgaW50ZXJjZXB0IGFuIGF0dGVtcHQgdG8gcmVhZCBhIEpTWCBzdHJpbmcgYW5kIHNldCBhIGZsYWdcbiAgICAqIG9uIGV4dHJhIHNvIHRoYXQgd2hlbiB0b2tlbnMgYXJlIGNvbnZlcnRlZCwgdGhlIG5leHQgdG9rZW4gd2lsbCBiZSBzd2l0Y2hlZFxuICAgICogdG8gSlNYVGV4dCB2aWEgb25Ub2tlbi5cbiAgICAqL1xuICAgIGluc3RhbmNlLmV4dGVuZChcImpzeF9yZWFkU3RyaW5nXCIsIGZ1bmN0aW9uKGpzeFJlYWRTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIC8qKiBAdGhpcyBhY29ybi5QYXJzZXIgKi8gZnVuY3Rpb24ocXVvdGUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqc3hSZWFkU3RyaW5nLmNhbGwodGhpcywgcXVvdGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHQuc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgZXh0cmEuanN4QXR0clZhbHVlVG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH0pO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRva2VuaXplclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUb2tlbml6ZXMgdGhlIGdpdmVuIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29kZSBUaGUgY29kZSB0byB0b2tlbml6ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVmaW5pbmcgaG93IHRvIHRva2VuaXplLlxuICogQHJldHVybnMge1Rva2VuW119IEFuIGFycmF5IG9mIHRva2Vucy5cbiAqIEB0aHJvd3Mge1N5bnRheEVycm9yfSBJZiB0aGUgaW5wdXQgY29kZSBpcyBpbnZhbGlkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdG9rZW5pemUoY29kZSwgb3B0aW9ucykge1xuICAgIHZhciB0b1N0cmluZyxcbiAgICAgICAgdG9rZW5zLFxuICAgICAgICBpbXBsaWVkU3RyaWN0LFxuICAgICAgICB0cmFuc2xhdG9yID0gbmV3IFRva2VuVHJhbnNsYXRvcih0dCwgY29kZSk7XG5cbiAgICB0b1N0cmluZyA9IFN0cmluZztcbiAgICBpZiAodHlwZW9mIGNvZGUgIT09IFwic3RyaW5nXCIgJiYgIShjb2RlIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgICBjb2RlID0gdG9TdHJpbmcoY29kZSk7XG4gICAgfVxuXG4gICAgbG9va2FoZWFkID0gbnVsbDtcblxuICAgIC8vIE9wdGlvbnMgbWF0Y2hpbmcuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB2YXIgYWNvcm5PcHRpb25zID0ge1xuICAgICAgICBlY21hVmVyc2lvbjogNSxcbiAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgZXNwcmVlOiB0cnVlXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVzZXRFeHRyYSgpO1xuXG4gICAgLy8gT2YgY291cnNlIHdlIGNvbGxlY3QgdG9rZW5zIGhlcmUuXG4gICAgb3B0aW9ucy50b2tlbnMgPSB0cnVlO1xuICAgIGV4dHJhLnRva2VucyA9IFtdO1xuXG4gICAgZXh0cmEucmFuZ2UgPSAodHlwZW9mIG9wdGlvbnMucmFuZ2UgPT09IFwiYm9vbGVhblwiKSAmJiBvcHRpb25zLnJhbmdlO1xuICAgIGFjb3JuT3B0aW9ucy5yYW5nZXMgPSBleHRyYS5yYW5nZTtcblxuICAgIGV4dHJhLmxvYyA9ICh0eXBlb2Ygb3B0aW9ucy5sb2MgPT09IFwiYm9vbGVhblwiKSAmJiBvcHRpb25zLmxvYztcbiAgICBhY29ybk9wdGlvbnMubG9jYXRpb25zID0gZXh0cmEubG9jO1xuXG4gICAgZXh0cmEuY29tbWVudCA9IHR5cGVvZiBvcHRpb25zLmNvbW1lbnQgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbnMuY29tbWVudDtcblxuICAgIGlmIChleHRyYS5jb21tZW50KSB7XG4gICAgICAgIGFjb3JuT3B0aW9ucy5vbkNvbW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjb21tZW50ID0gY29udmVydEFjb3JuQ29tbWVudFRvRXNwcmltYUNvbW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGV4dHJhLmNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZXh0cmEudG9sZXJhbnQgPSB0eXBlb2Ygb3B0aW9ucy50b2xlcmFudCA9PT0gXCJib29sZWFuXCIgJiYgb3B0aW9ucy50b2xlcmFudDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lY21hVmVyc2lvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuZWNtYVZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICBhY29ybk9wdGlvbnMuZWNtYVZlcnNpb24gPSBvcHRpb25zLmVjbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgIGV4dHJhLmVjbWFWZXJzaW9uID0gb3B0aW9ucy5lY21hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlY21hVmVyc2lvbiBtdXN0IGJlIDMsIDUsIDYsIG9yIDcuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgcGFyc2luZyBmbGFnc1xuICAgIGlmIChvcHRpb25zLmVjbWFGZWF0dXJlcyAmJiB0eXBlb2Ygb3B0aW9ucy5lY21hRmVhdHVyZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZXh0cmEuZWNtYUZlYXR1cmVzID0gb3B0aW9ucy5lY21hRmVhdHVyZXM7XG4gICAgICAgIGltcGxpZWRTdHJpY3QgPSBleHRyYS5lY21hRmVhdHVyZXMuaW1wbGllZFN0cmljdDtcbiAgICAgICAgZXh0cmEuZWNtYUZlYXR1cmVzLmltcGxpZWRTdHJpY3QgPSB0eXBlb2YgaW1wbGllZFN0cmljdCA9PT0gXCJib29sZWFuXCIgJiYgaW1wbGllZFN0cmljdDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdG9rZW5pemVyID0gYWNvcm4udG9rZW5pemVyKGNvZGUsIGFjb3JuT3B0aW9ucyk7XG4gICAgICAgIHdoaWxlICgobG9va2FoZWFkID0gdG9rZW5pemVyLmdldFRva2VuKCkpLnR5cGUgIT09IHR0LmVvZikge1xuICAgICAgICAgICAgdHJhbnNsYXRvci5vblRva2VuKGxvb2thaGVhZCwgZXh0cmEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlsdGVyVG9rZW5Mb2NhdGlvbigpO1xuICAgICAgICB0b2tlbnMgPSBleHRyYS50b2tlbnM7XG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHRva2Vucy5jb21tZW50cyA9IGV4dHJhLmNvbW1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHRyYS50b2xlcmFudCkge1xuICAgICAgICAgICAgdG9rZW5zLmVycm9ycyA9IGV4dHJhLmVycm9ycztcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vucztcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNlclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5cbi8qKlxuICogQ29udmVydHMgYW4gQWNvcm4gY29tbWVudCB0byBhIEVzcHJpbWEgY29tbWVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYmxvY2sgVHJ1ZSBpZiBpdCdzIGEgYmxvY2sgY29tbWVudCwgZmFsc2UgaWYgbm90LlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgb2YgdGhlIGNvbW1lbnQuXG4gKiBAcGFyYW0ge2ludH0gc3RhcnQgVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjb21tZW50IHN0YXJ0cy5cbiAqIEBwYXJhbSB7aW50fSBlbmQgVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjb21tZW50IGVuZHMuXG4gKiBAcGFyYW0ge0xvY2F0aW9ufSBzdGFydExvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGNvbW1lbnQgc3RhcnRzLlxuICogQHBhcmFtIHtMb2NhdGlvbn0gZW5kTG9jIFRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUgY29tbWVudCBlbmRzLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGNvbW1lbnQgb2JqZWN0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29udmVydEFjb3JuQ29tbWVudFRvRXNwcmltYUNvbW1lbnQoYmxvY2ssIHRleHQsIHN0YXJ0LCBlbmQsIHN0YXJ0TG9jLCBlbmRMb2MpIHtcbiAgICB2YXIgY29tbWVudCA9IHtcbiAgICAgICAgdHlwZTogYmxvY2sgPyBcIkJsb2NrXCIgOiBcIkxpbmVcIixcbiAgICAgICAgdmFsdWU6IHRleHRcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb21tZW50LnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIGNvbW1lbnQuZW5kID0gZW5kO1xuICAgICAgICBjb21tZW50LnJhbmdlID0gW3N0YXJ0LCBlbmRdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RhcnRMb2MgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29tbWVudC5sb2MgPSB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRMb2MsXG4gICAgICAgICAgICBlbmQ6IGVuZExvY1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21tZW50O1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgZ2l2ZW4gY29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIFRoZSBjb2RlIHRvIHRva2VuaXplLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBkZWZpbmluZyBob3cgdG8gdG9rZW5pemUuXG4gKiBAcmV0dXJucyB7QVNUTm9kZX0gVGhlIFwiUHJvZ3JhbVwiIEFTVCBub2RlLlxuICogQHRocm93cyB7U3ludGF4RXJyb3J9IElmIHRoZSBpbnB1dCBjb2RlIGlzIGludmFsaWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwYXJzZShjb2RlLCBvcHRpb25zKSB7XG4gICAgdmFyIHByb2dyYW0sXG4gICAgICAgIHRvU3RyaW5nID0gU3RyaW5nLFxuICAgICAgICB0cmFuc2xhdG9yLFxuICAgICAgICBpbXBsaWVkU3RyaWN0LFxuICAgICAgICBhY29ybk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBlY21hVmVyc2lvbjogNSxcbiAgICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgICAgICBlc3ByZWU6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIGxhc3RUb2tlbiA9IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIGNvZGUgIT09IFwic3RyaW5nXCIgJiYgIShjb2RlIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgICBjb2RlID0gdG9TdHJpbmcoY29kZSk7XG4gICAgfVxuXG4gICAgcmVzZXRFeHRyYSgpO1xuICAgIGNvbW1lbnRBdHRhY2htZW50LnJlc2V0KCk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZXh0cmEucmFuZ2UgPSAodHlwZW9mIG9wdGlvbnMucmFuZ2UgPT09IFwiYm9vbGVhblwiKSAmJiBvcHRpb25zLnJhbmdlO1xuICAgICAgICBleHRyYS5sb2MgPSAodHlwZW9mIG9wdGlvbnMubG9jID09PSBcImJvb2xlYW5cIikgJiYgb3B0aW9ucy5sb2M7XG4gICAgICAgIGV4dHJhLmF0dGFjaENvbW1lbnQgPSAodHlwZW9mIG9wdGlvbnMuYXR0YWNoQ29tbWVudCA9PT0gXCJib29sZWFuXCIpICYmIG9wdGlvbnMuYXR0YWNoQ29tbWVudDtcblxuICAgICAgICBpZiAoZXh0cmEubG9jICYmIG9wdGlvbnMuc291cmNlICE9PSBudWxsICYmIG9wdGlvbnMuc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4dHJhLnNvdXJjZSA9IHRvU3RyaW5nKG9wdGlvbnMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50b2tlbnMgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbnMudG9rZW5zKSB7XG4gICAgICAgICAgICBleHRyYS50b2tlbnMgPSBbXTtcbiAgICAgICAgICAgIHRyYW5zbGF0b3IgPSBuZXcgVG9rZW5UcmFuc2xhdG9yKHR0LCBjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29tbWVudCA9PT0gXCJib29sZWFuXCIgJiYgb3B0aW9ucy5jb21tZW50KSB7XG4gICAgICAgICAgICBleHRyYS5jb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIGV4dHJhLmNvbW1lbnRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRvbGVyYW50ID09PSBcImJvb2xlYW5cIiAmJiBvcHRpb25zLnRvbGVyYW50KSB7XG4gICAgICAgICAgICBleHRyYS5lcnJvcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmEuYXR0YWNoQ29tbWVudCkge1xuICAgICAgICAgICAgZXh0cmEucmFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgZXh0cmEuY29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbW1lbnRBdHRhY2htZW50LnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZWNtYVZlcnNpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5lY21hVmVyc2lvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgYWNvcm5PcHRpb25zLmVjbWFWZXJzaW9uID0gb3B0aW9ucy5lY21hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEuZWNtYVZlcnNpb24gPSBvcHRpb25zLmVjbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImVjbWFWZXJzaW9uIG11c3QgYmUgMywgNSwgNiwgb3IgNy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiKSB7XG4gICAgICAgICAgICBleHRyYS5pc01vZHVsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIG1vZHVsZXMgbXVzdCBiZSBpbiA2IGF0IGxlYXN0XG4gICAgICAgICAgICBpZiAoYWNvcm5PcHRpb25zLmVjbWFWZXJzaW9uIDwgNikge1xuICAgICAgICAgICAgICAgIGFjb3JuT3B0aW9ucy5lY21hVmVyc2lvbiA9IDY7XG4gICAgICAgICAgICAgICAgZXh0cmEuZWNtYVZlcnNpb24gPSA2O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhY29ybk9wdGlvbnMuc291cmNlVHlwZSA9IFwibW9kdWxlXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBseSBwYXJzaW5nIGZsYWdzIGFmdGVyIHNvdXJjZVR5cGUgdG8gYWxsb3cgb3ZlcnJpZGluZ1xuICAgICAgICBpZiAob3B0aW9ucy5lY21hRmVhdHVyZXMgJiYgdHlwZW9mIG9wdGlvbnMuZWNtYUZlYXR1cmVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBleHRyYS5lY21hRmVhdHVyZXMgPSBvcHRpb25zLmVjbWFGZWF0dXJlcztcbiAgICAgICAgICAgIGltcGxpZWRTdHJpY3QgPSBleHRyYS5lY21hRmVhdHVyZXMuaW1wbGllZFN0cmljdDtcbiAgICAgICAgICAgIGV4dHJhLmVjbWFGZWF0dXJlcy5pbXBsaWVkU3RyaWN0ID0gdHlwZW9mIGltcGxpZWRTdHJpY3QgPT09IFwiYm9vbGVhblwiICYmIGltcGxpZWRTdHJpY3Q7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lY21hRmVhdHVyZXMuZ2xvYmFsUmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgYWNvcm5PcHRpb25zLmFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgYWNvcm5PcHRpb25zLm9uVG9rZW4gPSBmdW5jdGlvbih0b2tlbikge1xuICAgICAgICAgICAgaWYgKGV4dHJhLnRva2Vucykge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0b3Iub25Ub2tlbih0b2tlbiwgZXh0cmEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IHR0LmVvZikge1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChleHRyYS5hdHRhY2hDb21tZW50IHx8IGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGFjb3JuT3B0aW9ucy5vbkNvbW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IGNvbnZlcnRBY29ybkNvbW1lbnRUb0VzcHJpbWFDb21tZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgZXh0cmEuY29tbWVudHMucHVzaChjb21tZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChleHRyYS5hdHRhY2hDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRBdHRhY2htZW50LmFkZENvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHRyYS5yYW5nZSkge1xuICAgICAgICAgICAgYWNvcm5PcHRpb25zLnJhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXh0cmEubG9jKSB7XG4gICAgICAgICAgICBhY29ybk9wdGlvbnMubG9jYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHRyYS5lY21hRmVhdHVyZXMuanN4KSB7XG4gICAgICAgICAgICAvLyBTaG91bGQgcHJvY2VzcyBqc3ggcGx1Z2luIGJlZm9yZSBlc3ByZWUgcGx1Z2luLlxuICAgICAgICAgICAgYWNvcm5PcHRpb25zLnBsdWdpbnMgPSB7XG4gICAgICAgICAgICAgICAganN4OiB0cnVlLFxuICAgICAgICAgICAgICAgIGVzcHJlZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2dyYW0gPSBhY29ybi5wYXJzZShjb2RlLCBhY29ybk9wdGlvbnMpO1xuICAgIHByb2dyYW0uc291cmNlVHlwZSA9IGV4dHJhLmlzTW9kdWxlID8gXCJtb2R1bGVcIiA6IFwic2NyaXB0XCI7XG5cbiAgICBpZiAoZXh0cmEuY29tbWVudCB8fCBleHRyYS5hdHRhY2hDb21tZW50KSB7XG4gICAgICAgIHByb2dyYW0uY29tbWVudHMgPSBleHRyYS5jb21tZW50cztcbiAgICB9XG5cbiAgICBpZiAoZXh0cmEudG9rZW5zKSB7XG4gICAgICAgIHByb2dyYW0udG9rZW5zID0gZXh0cmEudG9rZW5zO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQWRqdXN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgcG9zaXRpb24gb2YgcHJvZ3JhbSB0byBtYXRjaCBFc3ByaW1hLlxuICAgICAqIEFjb3JuIGFsd2F5cyBzdGFydHMgcHJvZ3JhbXMgYXQgcmFuZ2UgMCB3aGVyZWFzIEVzcHJpbWEgc3RhcnRzIGF0IHRoZVxuICAgICAqIGZpcnN0IEFTVCBub2RlJ3Mgc3RhcnQgKHRoZSBvbmx5IHJlYWwgZGlmZmVyZW5jZSBpcyB3aGVuIHRoZXJlJ3MgbGVhZGluZ1xuICAgICAqIHdoaXRlc3BhY2Ugb3IgbGVhZGluZyBjb21tZW50cykuIEFjb3JuIGFsc28gY291bnRzIHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgKiBhcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHdoZXJlYXMgRXNwcmltYSBvbmx5IGNvdW50cyB1cCB0byB0aGUgbGFzdCB0b2tlbi5cbiAgICAgKi9cbiAgICBpZiAocHJvZ3JhbS5yYW5nZSkge1xuICAgICAgICBwcm9ncmFtLnJhbmdlWzBdID0gcHJvZ3JhbS5ib2R5Lmxlbmd0aCA/IHByb2dyYW0uYm9keVswXS5yYW5nZVswXSA6IHByb2dyYW0ucmFuZ2VbMF07XG4gICAgICAgIHByb2dyYW0ucmFuZ2VbMV0gPSBsYXN0VG9rZW4gPyBsYXN0VG9rZW4ucmFuZ2VbMV0gOiBwcm9ncmFtLnJhbmdlWzFdO1xuICAgIH1cblxuICAgIGlmIChwcm9ncmFtLmxvYykge1xuICAgICAgICBwcm9ncmFtLmxvYy5zdGFydCA9IHByb2dyYW0uYm9keS5sZW5ndGggPyBwcm9ncmFtLmJvZHlbMF0ubG9jLnN0YXJ0IDogcHJvZ3JhbS5sb2Muc3RhcnQ7XG4gICAgICAgIHByb2dyYW0ubG9jLmVuZCA9IGxhc3RUb2tlbiA/IGxhc3RUb2tlbi5sb2MuZW5kIDogcHJvZ3JhbS5sb2MuZW5kO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ncmFtO1xufVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnRzLnZlcnNpb24gPSByZXF1aXJlKFwiLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbjtcblxuZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplO1xuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cbi8vIERlZXAgY29weS5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnRzLlN5bnRheCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgbmFtZSwgdHlwZXMgPSB7fTtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHR5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG5cbiAgICBmb3IgKG5hbWUgaW4gYXN0Tm9kZVR5cGVzKSB7XG4gICAgICAgIGlmIChhc3ROb2RlVHlwZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHR5cGVzW25hbWVdID0gYXN0Tm9kZVR5cGVzW25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZnJlZXplID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0eXBlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzO1xufSgpKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydHMuVmlzaXRvcktleXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZpc2l0b3JLZXlzID0gcmVxdWlyZShcIi4vbGliL3Zpc2l0b3Ita2V5c1wiKTtcbiAgICB2YXIgbmFtZSxcbiAgICAgICAga2V5cyA9IHt9O1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG4gICAgZm9yIChuYW1lIGluIHZpc2l0b3JLZXlzKSB7XG4gICAgICAgIGlmICh2aXNpdG9yS2V5cy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAga2V5c1tuYW1lXSA9IHZpc2l0b3JLZXlzW25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZnJlZXplID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShrZXlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5cztcbn0oKSk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlIEFTVCBub2RlIHR5cGVzIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIuXG4gKiBAYXV0aG9yIE5pY2hvbGFzIEMuIFpha2FzXG4gKiBAY29weXJpZ2h0IDIwMTQgTmljaG9sYXMgQy4gWmFrYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAY29weXJpZ2h0IDIwMTEtMjAxMyBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOb25lIVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLFxuICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIsXG4gICAgQXJyYXlFeHByZXNzaW9uOiBcIkFycmF5RXhwcmVzc2lvblwiLFxuICAgIEFycmF5UGF0dGVybjogXCJBcnJheVBhdHRlcm5cIixcbiAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiLFxuICAgIEJsb2NrU3RhdGVtZW50OiBcIkJsb2NrU3RhdGVtZW50XCIsXG4gICAgQmluYXJ5RXhwcmVzc2lvbjogXCJCaW5hcnlFeHByZXNzaW9uXCIsXG4gICAgQnJlYWtTdGF0ZW1lbnQ6IFwiQnJlYWtTdGF0ZW1lbnRcIixcbiAgICBDYWxsRXhwcmVzc2lvbjogXCJDYWxsRXhwcmVzc2lvblwiLFxuICAgIENhdGNoQ2xhdXNlOiBcIkNhdGNoQ2xhdXNlXCIsXG4gICAgQ2xhc3NCb2R5OiBcIkNsYXNzQm9keVwiLFxuICAgIENsYXNzRGVjbGFyYXRpb246IFwiQ2xhc3NEZWNsYXJhdGlvblwiLFxuICAgIENsYXNzRXhwcmVzc2lvbjogXCJDbGFzc0V4cHJlc3Npb25cIixcbiAgICBDb25kaXRpb25hbEV4cHJlc3Npb246IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsXG4gICAgQ29udGludWVTdGF0ZW1lbnQ6IFwiQ29udGludWVTdGF0ZW1lbnRcIixcbiAgICBEb1doaWxlU3RhdGVtZW50OiBcIkRvV2hpbGVTdGF0ZW1lbnRcIixcbiAgICBEZWJ1Z2dlclN0YXRlbWVudDogXCJEZWJ1Z2dlclN0YXRlbWVudFwiLFxuICAgIEVtcHR5U3RhdGVtZW50OiBcIkVtcHR5U3RhdGVtZW50XCIsXG4gICAgRXhwZXJpbWVudGFsUmVzdFByb3BlcnR5OiBcIkV4cGVyaW1lbnRhbFJlc3RQcm9wZXJ0eVwiLFxuICAgIEV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5OiBcIkV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5XCIsXG4gICAgRXhwcmVzc2lvblN0YXRlbWVudDogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsXG4gICAgRm9yU3RhdGVtZW50OiBcIkZvclN0YXRlbWVudFwiLFxuICAgIEZvckluU3RhdGVtZW50OiBcIkZvckluU3RhdGVtZW50XCIsXG4gICAgRm9yT2ZTdGF0ZW1lbnQ6IFwiRm9yT2ZTdGF0ZW1lbnRcIixcbiAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIixcbiAgICBGdW5jdGlvbkV4cHJlc3Npb246IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIsXG4gICAgSWRlbnRpZmllcjogXCJJZGVudGlmaWVyXCIsXG4gICAgSWZTdGF0ZW1lbnQ6IFwiSWZTdGF0ZW1lbnRcIixcbiAgICBMaXRlcmFsOiBcIkxpdGVyYWxcIixcbiAgICBMYWJlbGVkU3RhdGVtZW50OiBcIkxhYmVsZWRTdGF0ZW1lbnRcIixcbiAgICBMb2dpY2FsRXhwcmVzc2lvbjogXCJMb2dpY2FsRXhwcmVzc2lvblwiLFxuICAgIE1lbWJlckV4cHJlc3Npb246IFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgIE1ldGFQcm9wZXJ0eTogXCJNZXRhUHJvcGVydHlcIixcbiAgICBNZXRob2REZWZpbml0aW9uOiBcIk1ldGhvZERlZmluaXRpb25cIixcbiAgICBOZXdFeHByZXNzaW9uOiBcIk5ld0V4cHJlc3Npb25cIixcbiAgICBPYmplY3RFeHByZXNzaW9uOiBcIk9iamVjdEV4cHJlc3Npb25cIixcbiAgICBPYmplY3RQYXR0ZXJuOiBcIk9iamVjdFBhdHRlcm5cIixcbiAgICBQcm9ncmFtOiBcIlByb2dyYW1cIixcbiAgICBQcm9wZXJ0eTogXCJQcm9wZXJ0eVwiLFxuICAgIFJlc3RFbGVtZW50OiBcIlJlc3RFbGVtZW50XCIsXG4gICAgUmV0dXJuU3RhdGVtZW50OiBcIlJldHVyblN0YXRlbWVudFwiLFxuICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogXCJTZXF1ZW5jZUV4cHJlc3Npb25cIixcbiAgICBTcHJlYWRFbGVtZW50OiBcIlNwcmVhZEVsZW1lbnRcIixcbiAgICBTdXBlcjogXCJTdXBlclwiLFxuICAgIFN3aXRjaENhc2U6IFwiU3dpdGNoQ2FzZVwiLFxuICAgIFN3aXRjaFN0YXRlbWVudDogXCJTd2l0Y2hTdGF0ZW1lbnRcIixcbiAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIsXG4gICAgVGVtcGxhdGVFbGVtZW50OiBcIlRlbXBsYXRlRWxlbWVudFwiLFxuICAgIFRlbXBsYXRlTGl0ZXJhbDogXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICBUaGlzRXhwcmVzc2lvbjogXCJUaGlzRXhwcmVzc2lvblwiLFxuICAgIFRocm93U3RhdGVtZW50OiBcIlRocm93U3RhdGVtZW50XCIsXG4gICAgVHJ5U3RhdGVtZW50OiBcIlRyeVN0YXRlbWVudFwiLFxuICAgIFVuYXJ5RXhwcmVzc2lvbjogXCJVbmFyeUV4cHJlc3Npb25cIixcbiAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlVwZGF0ZUV4cHJlc3Npb25cIixcbiAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIixcbiAgICBWYXJpYWJsZURlY2xhcmF0b3I6IFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsXG4gICAgV2hpbGVTdGF0ZW1lbnQ6IFwiV2hpbGVTdGF0ZW1lbnRcIixcbiAgICBXaXRoU3RhdGVtZW50OiBcIldpdGhTdGF0ZW1lbnRcIixcbiAgICBZaWVsZEV4cHJlc3Npb246IFwiWWllbGRFeHByZXNzaW9uXCIsXG4gICAgSlNYSWRlbnRpZmllcjogXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgSlNYTmFtZXNwYWNlZE5hbWU6IFwiSlNYTmFtZXNwYWNlZE5hbWVcIixcbiAgICBKU1hNZW1iZXJFeHByZXNzaW9uOiBcIkpTWE1lbWJlckV4cHJlc3Npb25cIixcbiAgICBKU1hFbXB0eUV4cHJlc3Npb246IFwiSlNYRW1wdHlFeHByZXNzaW9uXCIsXG4gICAgSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjogXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIsXG4gICAgSlNYRWxlbWVudDogXCJKU1hFbGVtZW50XCIsXG4gICAgSlNYQ2xvc2luZ0VsZW1lbnQ6IFwiSlNYQ2xvc2luZ0VsZW1lbnRcIixcbiAgICBKU1hPcGVuaW5nRWxlbWVudDogXCJKU1hPcGVuaW5nRWxlbWVudFwiLFxuICAgIEpTWEF0dHJpYnV0ZTogXCJKU1hBdHRyaWJ1dGVcIixcbiAgICBKU1hTcHJlYWRBdHRyaWJ1dGU6IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIsXG4gICAgSlNYVGV4dDogXCJKU1hUZXh0XCIsXG4gICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLFxuICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLFxuICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIsXG4gICAgRXhwb3J0U3BlY2lmaWVyOiBcIkV4cG9ydFNwZWNpZmllclwiLFxuICAgIEltcG9ydERlY2xhcmF0aW9uOiBcIkltcG9ydERlY2xhcmF0aW9uXCIsXG4gICAgSW1wb3J0U3BlY2lmaWVyOiBcIkltcG9ydFNwZWNpZmllclwiLFxuICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiLFxuICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIlxufTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBBdHRhY2hlcyBjb21tZW50cyB0byB0aGUgQVNULlxuICogQGF1dGhvciBOaWNob2xhcyBDLiBaYWthc1xuICogQGNvcHlyaWdodCAyMDE1IE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGNvcHlyaWdodCAyMDExLTIwMTMgQXJpeWEgSGlkYXlhdCA8YXJpeWEuaGlkYXlhdEBnbWFpbC5jb20+XG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlcXVpcmVtZW50c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGFzdE5vZGVUeXBlcyA9IHJlcXVpcmUoXCIuL2FzdC1ub2RlLXR5cGVzXCIpO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHJpdmF0ZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGV4dHJhID0ge1xuICAgIHRyYWlsaW5nQ29tbWVudHM6IFtdLFxuICAgIGxlYWRpbmdDb21tZW50czogW10sXG4gICAgYm90dG9tUmlnaHRTdGFjazogW11cbn07XG5cbi8qKiBSZWN1cnNpdmVseSByZW1vdmUgbGVhZGluZyBjb21tZW50cyB0aGF0IGFyZSBpbmNvcnJlY3RseSBhZGRlZCB3aGVuIG5vXG4gKiBleHByZXNzaW9uIGV4aXN0cyBiZXR3ZWVuIGNvbW1lbnQgYW5kIHRoZSBjdXJyZW50IG5vZGVcbiAqIEBwYXJhbSB7bm9kZX0gbm9kZSB0byByZWN1cnNpdmVseSBjaGVja1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV4dHJhTGVhZGluZ0NvbW1lbnRzKG5vZGUpIHtcbiAgICB2YXIgaSwgajtcblxuICAgIGlmICghbm9kZS5ib2R5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLmJvZHkpKSB7XG4gICAgICAgIC8vIGkgbXVzdCBzdGFydCBhdCAwIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGFsbCBpbmRpY2VzIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLmJvZHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCB0byBwZXJmb3JtIHRoZSBjaGVjayBvbiB0aGUgcHJldmlvdXMgbm9kZVxuICAgICAgICAgICAgaWYgKGkgPiAwICYmIG5vZGUuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9kZS5ib2R5W2ldLmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ib2R5W2ldLmxlYWRpbmdDb21tZW50c1tqXS5yYW5nZVsxXSA8IG5vZGUuYm9keVtpIC0gMV0ucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbW92ZUV4dHJhTGVhZGluZ0NvbW1lbnRzKG5vZGUuYm9keVtpXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVFeHRyYUxlYWRpbmdDb21tZW50cyhub2RlLmJvZHkpO1xuICAgIH1cbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4dHJhLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgZXh0cmEubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgIGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2sgPSBbXTtcbiAgICB9LFxuXG4gICAgYWRkQ29tbWVudDogZnVuY3Rpb24oY29tbWVudCkge1xuICAgICAgICBleHRyYS50cmFpbGluZ0NvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgIGV4dHJhLmxlYWRpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgIH0sXG5cbiAgICBwcm9jZXNzQ29tbWVudDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgbGFzdENoaWxkLFxuICAgICAgICAgICAgdHJhaWxpbmdDb21tZW50cyxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gYXN0Tm9kZVR5cGVzLlByb2dyYW0pIHtcbiAgICAgICAgICAgIHJlbW92ZUV4dHJhTGVhZGluZ0NvbW1lbnRzKG5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXh0cmEudHJhaWxpbmdDb21tZW50cy5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBJZiB0aGUgZmlyc3QgY29tbWVudCBpbiB0cmFpbGluZ0NvbW1lbnRzIGNvbWVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICogY3VycmVudCBub2RlLCB0aGVuIHdlJ3JlIGdvb2QgLSBhbGwgY29tbWVudHMgaW4gdGhlIGFycmF5IHdpbGxcbiAgICAgICAgICAgICAqIGNvbWUgYWZ0ZXIgdGhlIG5vZGUgYW5kIHNvIGl0J3Mgc2FmZSB0byBhZGQgdGhlbiBhcyBvZmZpY2lhbFxuICAgICAgICAgICAgICogdHJhaWxpbmdDb21tZW50cy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGV4dHJhLnRyYWlsaW5nQ29tbWVudHNbMF0ucmFuZ2VbMF0gPj0gbm9kZS5yYW5nZVsxXSkge1xuICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSBleHRyYS50cmFpbGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgIGV4dHJhLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIGZpcnN0IGNvbW1lbnQgZG9lc24ndCBjb21lIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAqIGN1cnJlbnQgbm9kZSwgdGhhdCBtZWFucyB3ZSBoYXZlIGEgbWl4IG9mIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICAgICAgICAgICAgICAgICogY29tbWVudHMgaW4gdGhlIGFycmF5IGFuZCB0aGF0IGxlYWRpbmdDb21tZW50cyBjb250YWlucyB0aGVcbiAgICAgICAgICAgICAgICAgKiBzYW1lIGl0ZW1zIGFzIHRyYWlsaW5nQ29tbWVudHMuIFJlc2V0IHRyYWlsaW5nQ29tbWVudHMgdG9cbiAgICAgICAgICAgICAgICAgKiB6ZXJvIGl0ZW1zIGFuZCB3ZSdsbCBoYW5kbGUgdGhpcyBieSBldmFsdWF0aW5nIGxlYWRpbmdDb21tZW50c1xuICAgICAgICAgICAgICAgICAqIGxhdGVyLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGV4dHJhLnRyYWlsaW5nQ29tbWVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEuYm90dG9tUmlnaHRTdGFja1tleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCAtIDFdLnRyYWlsaW5nQ29tbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEuYm90dG9tUmlnaHRTdGFja1tleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCAtIDFdLnRyYWlsaW5nQ29tbWVudHNbMF0ucmFuZ2VbMF0gPj0gbm9kZS5yYW5nZVsxXSkge1xuICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSBleHRyYS5ib3R0b21SaWdodFN0YWNrW2V4dHJhLmJvdHRvbVJpZ2h0U3RhY2subGVuZ3RoIC0gMV0udHJhaWxpbmdDb21tZW50cztcbiAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmEuYm90dG9tUmlnaHRTdGFja1tleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCAtIDFdLnRyYWlsaW5nQ29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXRpbmcgdGhlIHN0YWNrLlxuICAgICAgICB3aGlsZSAoZXh0cmEuYm90dG9tUmlnaHRTdGFjay5sZW5ndGggPiAwICYmIGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2tbZXh0cmEuYm90dG9tUmlnaHRTdGFjay5sZW5ndGggLSAxXS5yYW5nZVswXSA+PSBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSBleHRyYS5ib3R0b21SaWdodFN0YWNrLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RDaGlsZCkge1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZC5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoaWxkLmxlYWRpbmdDb21tZW50c1tsYXN0Q2hpbGQubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCAtIDFdLnJhbmdlWzFdIDw9IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBsYXN0Q2hpbGQubGVhZGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbGFzdENoaWxkLmxlYWRpbmdDb21tZW50cztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGxlYWRpbmcgY29tbWVudCBmb3IgYW4gYW5vbnltb3VzIGNsYXNzIGhhZCBiZWVuIHN0b2xlbiBieSBpdHMgZmlyc3QgTWV0aG9kRGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhpcyB0YWtlcyBiYWNrIHRoZSBsZWFkaW5nIGNvbW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBbHNvOiBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzcHJlZS9pc3N1ZXMvMTU4XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGxhc3RDaGlsZC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoIC0gMjsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQubGVhZGluZ0NvbW1lbnRzW2ldLnJhbmdlWzFdIDw9IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IGxhc3RDaGlsZC5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHRyYS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEubGVhZGluZ0NvbW1lbnRzW2V4dHJhLmxlYWRpbmdDb21tZW50cy5sZW5ndGggLSAxXS5yYW5nZVsxXSA8PSBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBleHRyYS5sZWFkaW5nQ29tbWVudHM7XG4gICAgICAgICAgICAgICAgZXh0cmEubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc3ByZWUvaXNzdWVzLzJcblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogSW4gc3BlY2lhbCBjYXNlcywgc3VjaCBhcyByZXR1cm4gKHdpdGhvdXQgYSB2YWx1ZSkgYW5kXG4gICAgICAgICAgICAgICAgICogZGVidWdnZXIsIGFsbCBjb21tZW50cyB3aWxsIGVuZCB1cCBhcyBsZWFkaW5nQ29tbWVudHMgYW5kXG4gICAgICAgICAgICAgICAgICogd2lsbCBvdGhlcndpc2UgYmUgZWxpbWluYXRlZC4gVGhpcyBleHRyYSBzdGVwIHJ1bnMgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgKiBib3R0b21SaWdodFN0YWNrIGlzIGVtcHR5IGFuZCB0aGVyZSBhcmUgY29tbWVudHMgbGVmdFxuICAgICAgICAgICAgICAgICAqIGluIGxlYWRpbmdDb21tZW50cy5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIFRoaXMgbG9vcCBmaWd1cmVzIG91dCB0aGUgc3RvcHBpbmcgcG9pbnQgYmV0d2VlbiB0aGUgYWN0dWFsXG4gICAgICAgICAgICAgICAgICogbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgYnkgZmluZGluZyB0aGUgbG9jYXRpb24gb2YgdGhlXG4gICAgICAgICAgICAgICAgICogZmlyc3QgY29tbWVudCB0aGF0IGNvbWVzIGFmdGVyIHRoZSBnaXZlbiBub2RlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhLmxlYWRpbmdDb21tZW50c1tpXS5yYW5nZVsxXSA+IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBTcGxpdCB0aGUgYXJyYXkgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBjb21tZW50XG4gICAgICAgICAgICAgICAgICogdGhhdCBjb21lcyBhZnRlciB0aGUgbm9kZS4gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBjb3VsZFxuICAgICAgICAgICAgICAgICAqIHJlc3VsdCBpbiBhbiBlbXB0eSBhcnJheSwgYW5kIGlmIHNvLCB0aGUgYXJyYXkgbXVzdCBiZVxuICAgICAgICAgICAgICAgICAqIGRlbGV0ZWQuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBleHRyYS5sZWFkaW5nQ29tbWVudHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5sZWFkaW5nQ29tbWVudHM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBTaW1pbGFybHksIHRyYWlsaW5nIGNvbW1lbnRzIGFyZSBhdHRhY2hlZCBsYXRlci4gVGhlIHZhcmlhYmxlXG4gICAgICAgICAgICAgICAgICogbXVzdCBiZSByZXNldCB0byBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFpbGluZyBjb21tZW50cy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzID0gZXh0cmEubGVhZGluZ0NvbW1lbnRzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFpbGluZ0NvbW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaWxpbmdDb21tZW50cykge1xuICAgICAgICAgICAgbm9kZS50cmFpbGluZ0NvbW1lbnRzID0gdHJhaWxpbmdDb21tZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2sucHVzaChub2RlKTtcbiAgICB9XG5cbn07XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVHJhbnNsYXRlcyB0b2tlbnMgYmV0d2VlbiBBY29ybiBmb3JtYXQgYW5kIEVzcHJpbWEgZm9ybWF0LlxuICogQGF1dGhvciBOaWNob2xhcyBDLiBaYWthc1xuICogQGNvcHlyaWdodCAyMDE1IE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbi8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlcXVpcmVtZW50c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gbm9uZSFcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByaXZhdGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gRXNwcmltYSBUb2tlbiBUeXBlc1xudmFyIFRva2VuID0ge1xuICAgIEJvb2xlYW46IFwiQm9vbGVhblwiLFxuICAgIEVPRjogXCI8ZW5kPlwiLFxuICAgIElkZW50aWZpZXI6IFwiSWRlbnRpZmllclwiLFxuICAgIEtleXdvcmQ6IFwiS2V5d29yZFwiLFxuICAgIE51bGw6IFwiTnVsbFwiLFxuICAgIE51bWVyaWM6IFwiTnVtZXJpY1wiLFxuICAgIFB1bmN0dWF0b3I6IFwiUHVuY3R1YXRvclwiLFxuICAgIFN0cmluZzogXCJTdHJpbmdcIixcbiAgICBSZWd1bGFyRXhwcmVzc2lvbjogXCJSZWd1bGFyRXhwcmVzc2lvblwiLFxuICAgIFRlbXBsYXRlOiBcIlRlbXBsYXRlXCIsXG4gICAgSlNYSWRlbnRpZmllcjogXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgSlNYVGV4dDogXCJKU1hUZXh0XCJcbn07XG5cbi8qKlxuICogQ29udmVydHMgcGFydCBvZiBhIHRlbXBsYXRlIGludG8gYW4gRXNwcmltYSB0b2tlbi5cbiAqIEBwYXJhbSB7QWNvcm5Ub2tlbltdfSB0b2tlbnMgVGhlIEFjb3JuIHRva2VucyByZXByZXNlbnRpbmcgdGhlIHRlbXBsYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgVGhlIHNvdXJjZSBjb2RlLlxuICogQHJldHVybnMge0VzcHJpbWFUb2tlbn0gVGhlIEVzcHJpbWEgZXF1aXZhbGVudCBvZiB0aGUgdGVtcGxhdGUgdG9rZW4uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0VGVtcGxhdGVQYXJ0KHRva2VucywgY29kZSkge1xuICAgIHZhciBmaXJzdFRva2VuID0gdG9rZW5zWzBdLFxuICAgICAgICBsYXN0VGVtcGxhdGVUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG5cbiAgICB2YXIgdG9rZW4gPSB7XG4gICAgICAgIHR5cGU6IFRva2VuLlRlbXBsYXRlLFxuICAgICAgICB2YWx1ZTogY29kZS5zbGljZShmaXJzdFRva2VuLnN0YXJ0LCBsYXN0VGVtcGxhdGVUb2tlbi5lbmQpXG4gICAgfTtcblxuICAgIGlmIChmaXJzdFRva2VuLmxvYykge1xuICAgICAgICB0b2tlbi5sb2MgPSB7XG4gICAgICAgICAgICBzdGFydDogZmlyc3RUb2tlbi5sb2Muc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGxhc3RUZW1wbGF0ZVRva2VuLmxvYy5lbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZmlyc3RUb2tlbi5yYW5nZSkge1xuICAgICAgICB0b2tlbi5yYW5nZSA9IFtmaXJzdFRva2VuLnJhbmdlWzBdLCBsYXN0VGVtcGxhdGVUb2tlbi5yYW5nZVsxXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvZ2ljIHRvIHRyYW5zbGF0ZSBBY29ybiB0b2tlbnMgaW50byBFc3ByaW1hIHRva2Vucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY29yblRva1R5cGVzIFRoZSBBY29ybiB0b2tlbiB0eXBlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIFRoZSBzb3VyY2UgY29kZSBBY29ybiBpcyBwYXJzaW5nLiBUaGlzIGlzIG5lY2Vzc2FyeVxuICogICAgICB0byBjb3JyZWN0IHRoZSBcInZhbHVlXCIgcHJvcGVydHkgb2Ygc29tZSB0b2tlbnMuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVG9rZW5UcmFuc2xhdG9yKGFjb3JuVG9rVHlwZXMsIGNvZGUpIHtcblxuICAgIC8vIHRva2VuIHR5cGVzXG4gICAgdGhpcy5fYWNvcm5Ub2tUeXBlcyA9IGFjb3JuVG9rVHlwZXM7XG5cbiAgICAvLyB0b2tlbiBidWZmZXIgZm9yIHRlbXBsYXRlc1xuICAgIHRoaXMuX3Rva2VucyA9IFtdO1xuXG4gICAgLy8gdHJhY2sgdGhlIGxhc3QgY3VybHkgYnJhY2VcbiAgICB0aGlzLl9jdXJseUJyYWNlID0gbnVsbDtcblxuICAgIC8vIHRoZSBzb3VyY2UgY29kZVxuICAgIHRoaXMuX2NvZGUgPSBjb2RlO1xuXG59XG5cblRva2VuVHJhbnNsYXRvci5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IFRva2VuVHJhbnNsYXRvcixcblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgYSBzaW5nbGUgRXNwcmltYSB0b2tlbiB0byBhIHNpbmdsZSBBY29ybiB0b2tlbi4gVGhpcyBtYXkgYmVcbiAgICAgKiBpbmFjY3VyYXRlIGR1ZSB0byBob3cgdGVtcGxhdGVzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGluIEVzcHJpbWEgYW5kXG4gICAgICogQWNvcm4sIGJ1dCBzaG91bGQgYmUgYWNjdXJhdGUgZm9yIGFsbCBvdGhlciB0b2tlbnMuXG4gICAgICogQHBhcmFtIHtBY29yblRva2VufSB0b2tlbiBUaGUgQWNvcm4gdG9rZW4gdG8gdHJhbnNsYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYSBFc3ByZWUgZXh0cmEgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtFc3ByaW1hVG9rZW59IFRoZSBFc3ByaW1hIHZlcnNpb24gb2YgdGhlIHRva2VuLlxuICAgICAqL1xuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24odG9rZW4sIGV4dHJhKSB7XG5cbiAgICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlLFxuICAgICAgICAgICAgdHQgPSB0aGlzLl9hY29yblRva1R5cGVzO1xuXG4gICAgICAgIGlmICh0eXBlID09PSB0dC5uYW1lKSB7XG4gICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uSWRlbnRpZmllcjtcblxuICAgICAgICAgICAgLy8gVE9ETzogU2VlIGlmIHRoaXMgaXMgYW4gQWNvcm4gYnVnXG4gICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09IFwic3RhdGljXCIpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uS2V5d29yZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhLmVjbWFWZXJzaW9uID4gNSAmJiAodG9rZW4udmFsdWUgPT09IFwieWllbGRcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCJsZXRcIikpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uS2V5d29yZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LnNlbWkgfHwgdHlwZSA9PT0gdHQuY29tbWEgfHxcbiAgICAgICAgICAgICAgICAgdHlwZSA9PT0gdHQucGFyZW5MIHx8IHR5cGUgPT09IHR0LnBhcmVuUiB8fFxuICAgICAgICAgICAgICAgICB0eXBlID09PSB0dC5icmFjZUwgfHwgdHlwZSA9PT0gdHQuYnJhY2VSIHx8XG4gICAgICAgICAgICAgICAgIHR5cGUgPT09IHR0LmRvdCB8fCB0eXBlID09PSB0dC5icmFja2V0TCB8fFxuICAgICAgICAgICAgICAgICB0eXBlID09PSB0dC5jb2xvbiB8fCB0eXBlID09PSB0dC5xdWVzdGlvbiB8fFxuICAgICAgICAgICAgICAgICB0eXBlID09PSB0dC5icmFja2V0UiB8fCB0eXBlID09PSB0dC5lbGxpcHNpcyB8fFxuICAgICAgICAgICAgICAgICB0eXBlID09PSB0dC5hcnJvdyB8fCB0eXBlID09PSB0dC5qc3hUYWdTdGFydCB8fFxuICAgICAgICAgICAgICAgICB0eXBlID09PSB0dC5pbmNEZWMgfHwgdHlwZSA9PT0gdHQuc3RhcnN0YXIgfHxcbiAgICAgICAgICAgICAgICAgdHlwZSA9PT0gdHQuanN4VGFnRW5kIHx8ICh0eXBlLmJpbm9wICYmICF0eXBlLmtleXdvcmQpIHx8XG4gICAgICAgICAgICAgICAgIHR5cGUuaXNBc3NpZ24pIHtcblxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlB1bmN0dWF0b3I7XG4gICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRoaXMuX2NvZGUuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQuanN4TmFtZSkge1xuICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLkpTWElkZW50aWZpZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZS5sYWJlbCA9PT0gXCJqc3hUZXh0XCIgfHwgdHlwZSA9PT0gdHQuanN4QXR0clZhbHVlVG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5KU1hUZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUua2V5d29yZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2V5d29yZCA9PT0gXCJ0cnVlXCIgfHwgdHlwZS5rZXl3b3JkID09PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uQm9vbGVhbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5rZXl3b3JkID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5OdWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uS2V5d29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSB0dC5udW0pIHtcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5OdW1lcmljO1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0aGlzLl9jb2RlLnNsaWNlKHRva2VuLnN0YXJ0LCB0b2tlbi5lbmQpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LnN0cmluZykge1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEuanN4QXR0clZhbHVlVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBleHRyYS5qc3hBdHRyVmFsdWVUb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5KU1hUZXh0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uU3RyaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRoaXMuX2NvZGUuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQucmVnZXhwKSB7XG4gICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uUmVndWxhckV4cHJlc3Npb247XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICAgIHRva2VuLnJlZ2V4ID0ge1xuICAgICAgICAgICAgICAgIGZsYWdzOiB2YWx1ZS5mbGFncyxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiB2YWx1ZS5wYXR0ZXJuXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBcIi9cIiArIHZhbHVlLnBhdHRlcm4gKyBcIi9cIiArIHZhbHVlLmZsYWdzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBjYWxsIGR1cmluZyBBY29ybidzIG9uVG9rZW4gaGFuZGxlci5cbiAgICAgKiBAcGFyYW0ge0Fjb3JuVG9rZW59IHRva2VuIFRoZSBBY29ybiB0b2tlbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXh0cmEgVGhlIEVzcHJlZSBleHRyYSBvYmplY3QuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgb25Ub2tlbjogZnVuY3Rpb24odG9rZW4sIGV4dHJhKSB7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgdHQgPSB0aGlzLl9hY29yblRva1R5cGVzLFxuICAgICAgICAgICAgdG9rZW5zID0gZXh0cmEudG9rZW5zLFxuICAgICAgICAgICAgdGVtcGxhdGVUb2tlbnMgPSB0aGlzLl90b2tlbnM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsdXNoZXMgdGhlIGJ1ZmZlcmVkIHRlbXBsYXRlIHRva2VucyBhbmQgcmVzZXRzIHRoZSB0ZW1wbGF0ZVxuICAgICAgICAgKiB0cmFja2luZy5cbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVUZW1wbGF0ZVRva2VucygpIHtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKGNvbnZlcnRUZW1wbGF0ZVBhcnQodGhhdC5fdG9rZW5zLCB0aGF0Ll9jb2RlKSk7XG4gICAgICAgICAgICB0aGF0Ll90b2tlbnMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSB0dC5lb2YpIHtcblxuICAgICAgICAgICAgLy8gbWlnaHQgYmUgb25lIGxhc3QgY3VybHlCcmFjZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cmx5QnJhY2UpIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0aGlzLnRyYW5zbGF0ZSh0aGlzLl9jdXJseUJyYWNlLCBleHRyYSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gdHQuYmFja1F1b3RlKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgLy8gaXQncyB0aGUgZW5kXG4gICAgICAgICAgICBpZiAodGVtcGxhdGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVRlbXBsYXRlVG9rZW5zKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSB0dC5kb2xsYXJCcmFjZUwpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgdHJhbnNsYXRlVGVtcGxhdGVUb2tlbnMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSB0dC5icmFjZVIpIHtcblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhbHJlYWR5IGEgY3VybHksIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHRlbXBsYXRlXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VybHlCcmFjZSkge1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godGhpcy50cmFuc2xhdGUodGhpcy5fY3VybHlCcmFjZSwgZXh0cmEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3RvcmUgbmV3IGN1cmx5IGZvciBsYXRlclxuICAgICAgICAgICAgdGhpcy5fY3VybHlCcmFjZSA9IHRva2VuO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IHR0LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VybHlCcmFjZSkge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlVG9rZW5zLnB1c2godGhpcy5fY3VybHlCcmFjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VybHlCcmFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlbXBsYXRlVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2N1cmx5QnJhY2UpIHtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRoaXMudHJhbnNsYXRlKHRoaXMuX2N1cmx5QnJhY2UsIGV4dHJhKSk7XG4gICAgICAgICAgICB0aGlzLl9jdXJseUJyYWNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRva2Vucy5wdXNoKHRoaXMudHJhbnNsYXRlKHRva2VuLCBleHRyYSkpO1xuICAgIH1cbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5UcmFuc2xhdG9yO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoZSB2aXNpdG9yIGtleXMgZm9yIHRoZSBub2RlIHR5cGVzIEVzcHJlZSBzdXBwb3J0c1xuICogQGF1dGhvciBOaWNob2xhcyBDLiBaYWthc1xuICogQGNvcHlyaWdodCAyMDE1IE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGNvcHlyaWdodCAyMDEyLTIwMTMgWXVzdWtlIFN1enVraSAodHdpdHRlcjogQENvbnN0ZWxsYXRpb24pIGFuZCBvdGhlciBjb250cmlidXRvcnMuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBDb250YWlucyBjb2RlIGZyb20gZXN0cmF2ZXJzZS1mYi5cbiAqXG4gKiBUaGUgTUlUIGxpY2Vuc2UuIENvcHlyaWdodCAoYykgMjAxNCBJbmd2YXIgU3RlcGFueWFuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXF1aXJlbWVudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE5vbmUhXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgLy8gRUNNQVNjcmlwdFxuICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBbXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gICAgQXNzaWdubWVudFBhdHRlcm46IFtcImxlZnRcIiwgXCJyaWdodFwiXSxcbiAgICBBcnJheUV4cHJlc3Npb246IFtcImVsZW1lbnRzXCJdLFxuICAgIEFycmF5UGF0dGVybjogW1wiZWxlbWVudHNcIl0sXG4gICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFtcInBhcmFtc1wiLCBcImJvZHlcIl0sXG4gICAgQmxvY2tTdGF0ZW1lbnQ6IFtcImJvZHlcIl0sXG4gICAgQmluYXJ5RXhwcmVzc2lvbjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICAgIEJyZWFrU3RhdGVtZW50OiBbXCJsYWJlbFwiXSxcbiAgICBDYWxsRXhwcmVzc2lvbjogW1wiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCJdLFxuICAgIENhdGNoQ2xhdXNlOiBbXCJwYXJhbVwiLCBcImJvZHlcIl0sXG4gICAgQ2xhc3NCb2R5OiBbXCJib2R5XCJdLFxuICAgIENsYXNzRGVjbGFyYXRpb246IFtcImlkXCIsIFwic3VwZXJDbGFzc1wiLCBcImJvZHlcIl0sXG4gICAgQ2xhc3NFeHByZXNzaW9uOiBbXCJpZFwiLCBcInN1cGVyQ2xhc3NcIiwgXCJib2R5XCJdLFxuICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gICAgQ29udGludWVTdGF0ZW1lbnQ6IFtcImxhYmVsXCJdLFxuICAgIERlYnVnZ2VyU3RhdGVtZW50OiBbXSxcbiAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6IFtdLFxuICAgIERvV2hpbGVTdGF0ZW1lbnQ6IFtcImJvZHlcIiwgXCJ0ZXN0XCJdLFxuICAgIEVtcHR5U3RhdGVtZW50OiBbXSxcbiAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogW1wic291cmNlXCJdLFxuICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogW1wiZGVjbGFyYXRpb25cIl0sXG4gICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogW1wiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCJdLFxuICAgIEV4cG9ydFNwZWNpZmllcjogW1wiZXhwb3J0ZWRcIiwgXCJsb2NhbFwiXSxcbiAgICBFeHByZXNzaW9uU3RhdGVtZW50OiBbXCJleHByZXNzaW9uXCJdLFxuICAgIEZvclN0YXRlbWVudDogW1wiaW5pdFwiLCBcInRlc3RcIiwgXCJ1cGRhdGVcIiwgXCJib2R5XCJdLFxuICAgIEZvckluU3RhdGVtZW50OiBbXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCJdLFxuICAgIEZvck9mU3RhdGVtZW50OiBbXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCJdLFxuICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246IFtcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiXSxcbiAgICBGdW5jdGlvbkV4cHJlc3Npb246IFtcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiXSxcbiAgICBJZGVudGlmaWVyOiBbXSxcbiAgICBJZlN0YXRlbWVudDogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gICAgSW1wb3J0RGVjbGFyYXRpb246IFtcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIl0sXG4gICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogW1wibG9jYWxcIl0sXG4gICAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiBbXCJsb2NhbFwiXSxcbiAgICBJbXBvcnRTcGVjaWZpZXI6IFtcImltcG9ydGVkXCIsIFwibG9jYWxcIl0sXG4gICAgTGl0ZXJhbDogW10sXG4gICAgTGFiZWxlZFN0YXRlbWVudDogW1wibGFiZWxcIiwgXCJib2R5XCJdLFxuICAgIExvZ2ljYWxFeHByZXNzaW9uOiBbXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gICAgTWVtYmVyRXhwcmVzc2lvbjogW1wib2JqZWN0XCIsIFwicHJvcGVydHlcIl0sXG4gICAgTWV0YVByb3BlcnR5OiBbXCJtZXRhXCIsIFwicHJvcGVydHlcIl0sXG4gICAgTWV0aG9kRGVmaW5pdGlvbjogW1wia2V5XCIsIFwidmFsdWVcIl0sXG4gICAgTW9kdWxlU3BlY2lmaWVyOiBbXSxcbiAgICBOZXdFeHByZXNzaW9uOiBbXCJjYWxsZWVcIiwgXCJhcmd1bWVudHNcIl0sXG4gICAgT2JqZWN0RXhwcmVzc2lvbjogW1wicHJvcGVydGllc1wiXSxcbiAgICBPYmplY3RQYXR0ZXJuOiBbXCJwcm9wZXJ0aWVzXCJdLFxuICAgIFByb2dyYW06IFtcImJvZHlcIl0sXG4gICAgUHJvcGVydHk6IFtcImtleVwiLCBcInZhbHVlXCJdLFxuICAgIFJlc3RFbGVtZW50OiBbIFwiYXJndW1lbnRcIiBdLFxuICAgIFJldHVyblN0YXRlbWVudDogW1wiYXJndW1lbnRcIl0sXG4gICAgU2VxdWVuY2VFeHByZXNzaW9uOiBbXCJleHByZXNzaW9uc1wiXSxcbiAgICBTcHJlYWRFbGVtZW50OiBbXCJhcmd1bWVudFwiXSxcbiAgICBTdXBlcjogW10sXG4gICAgU3dpdGNoU3RhdGVtZW50OiBbXCJkaXNjcmltaW5hbnRcIiwgXCJjYXNlc1wiXSxcbiAgICBTd2l0Y2hDYXNlOiBbXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiXSxcbiAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IFtcInRhZ1wiLCBcInF1YXNpXCJdLFxuICAgIFRlbXBsYXRlRWxlbWVudDogW10sXG4gICAgVGVtcGxhdGVMaXRlcmFsOiBbXCJxdWFzaXNcIiwgXCJleHByZXNzaW9uc1wiXSxcbiAgICBUaGlzRXhwcmVzc2lvbjogW10sXG4gICAgVGhyb3dTdGF0ZW1lbnQ6IFtcImFyZ3VtZW50XCJdLFxuICAgIFRyeVN0YXRlbWVudDogW1wiYmxvY2tcIiwgXCJoYW5kbGVyXCIsIFwiZmluYWxpemVyXCJdLFxuICAgIFVuYXJ5RXhwcmVzc2lvbjogW1wiYXJndW1lbnRcIl0sXG4gICAgVXBkYXRlRXhwcmVzc2lvbjogW1wiYXJndW1lbnRcIl0sXG4gICAgVmFyaWFibGVEZWNsYXJhdGlvbjogW1wiZGVjbGFyYXRpb25zXCJdLFxuICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogW1wiaWRcIiwgXCJpbml0XCJdLFxuICAgIFdoaWxlU3RhdGVtZW50OiBbXCJ0ZXN0XCIsIFwiYm9keVwiXSxcbiAgICBXaXRoU3RhdGVtZW50OiBbXCJvYmplY3RcIiwgXCJib2R5XCJdLFxuICAgIFlpZWxkRXhwcmVzc2lvbjogW1wiYXJndW1lbnRcIl0sXG5cbiAgICAvLyBKU1hcbiAgICBKU1hJZGVudGlmaWVyOiBbXSxcbiAgICBKU1hOYW1lc3BhY2VkTmFtZTogW1wibmFtZXNwYWNlXCIsIFwibmFtZVwiXSxcbiAgICBKU1hNZW1iZXJFeHByZXNzaW9uOiBbXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiXSxcbiAgICBKU1hFbXB0eUV4cHJlc3Npb246IFtdLFxuICAgIEpTWEV4cHJlc3Npb25Db250YWluZXI6IFtcImV4cHJlc3Npb25cIl0sXG4gICAgSlNYRWxlbWVudDogW1wib3BlbmluZ0VsZW1lbnRcIiwgXCJjbG9zaW5nRWxlbWVudFwiLCBcImNoaWxkcmVuXCJdLFxuICAgIEpTWENsb3NpbmdFbGVtZW50OiBbXCJuYW1lXCJdLFxuICAgIEpTWE9wZW5pbmdFbGVtZW50OiBbXCJuYW1lXCIsIFwiYXR0cmlidXRlc1wiXSxcbiAgICBKU1hBdHRyaWJ1dGU6IFtcIm5hbWVcIiwgXCJ2YWx1ZVwiXSxcbiAgICBKU1hUZXh0OiBudWxsLFxuICAgIEpTWFNwcmVhZEF0dHJpYnV0ZTogW1wiYXJndW1lbnRcIl0sXG5cbiAgICAvLyBFeHBlcmltZW50YWwgZmVhdHVyZXNcbiAgICBFeHBlcmltZW50YWxSZXN0UHJvcGVydHk6IFtcImFyZ3VtZW50XCJdLFxuICAgIEV4cGVyaW1lbnRhbFNwcmVhZFByb3BlcnR5OiBbXCJhcmd1bWVudFwiXVxufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLmFjb3JuID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gQSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgb3BlcmF0ZXMgYnkgZGVmaW5pbmcgZnVuY3Rpb25zIGZvciBhbGxcbi8vIHN5bnRhY3RpYyBlbGVtZW50cywgYW5kIHJlY3Vyc2l2ZWx5IGNhbGxpbmcgdGhvc2UsIGVhY2ggZnVuY3Rpb25cbi8vIGFkdmFuY2luZyB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm5pbmcgYW4gQVNUIG5vZGUuIFByZWNlZGVuY2Vcbi8vIG9mIGNvbnN0cnVjdHMgKGZvciBleGFtcGxlLCB0aGUgZmFjdCB0aGF0IGAheFsxXWAgbWVhbnMgYCEoeFsxXSlgXG4vLyBpbnN0ZWFkIG9mIGAoIXgpWzFdYCBpcyBoYW5kbGVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBhcnNlclxuLy8gZnVuY3Rpb24gdGhhdCBwYXJzZXMgdW5hcnkgcHJlZml4IG9wZXJhdG9ycyBpcyBjYWxsZWQgZmlyc3QsIGFuZFxuLy8gaW4gdHVybiBjYWxscyB0aGUgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYFtdYCBzdWJzY3JpcHRzIOKAlCB0aGF0XG4vLyB3YXksIGl0J2xsIHJlY2VpdmUgdGhlIG5vZGUgZm9yIGB4WzFdYCBhbHJlYWR5IHBhcnNlZCwgYW5kIHdyYXBzXG4vLyAqdGhhdCogaW4gdGhlIHVuYXJ5IG9wZXJhdG9yIG5vZGUuXG4vL1xuLy8gQWNvcm4gdXNlcyBhbiBbb3BlcmF0b3IgcHJlY2VkZW5jZSBwYXJzZXJdW29wcF0gdG8gaGFuZGxlIGJpbmFyeVxuLy8gb3BlcmF0b3IgcHJlY2VkZW5jZSwgYmVjYXVzZSBpdCBpcyBtdWNoIG1vcmUgY29tcGFjdCB0aGFuIHVzaW5nXG4vLyB0aGUgdGVjaG5pcXVlIG91dGxpbmVkIGFib3ZlLCB3aGljaCB1c2VzIGRpZmZlcmVudCwgbmVzdGluZ1xuLy8gZnVuY3Rpb25zIHRvIHNwZWNpZnkgcHJlY2VkZW5jZSwgZm9yIGFsbCBvZiB0aGUgdGVuIGJpbmFyeVxuLy8gcHJlY2VkZW5jZSBsZXZlbHMgdGhhdCBKYXZhU2NyaXB0IGRlZmluZXMuXG4vL1xuLy8gW29wcF06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3BlcmF0b3ItcHJlY2VkZW5jZV9wYXJzZXJcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfdG9rZW50eXBlID0gX2RlcmVxXyhcIi4vdG9rZW50eXBlXCIpO1xuXG52YXIgX3N0YXRlID0gX2RlcmVxXyhcIi4vc3RhdGVcIik7XG5cbnZhciBwcCA9IF9zdGF0ZS5QYXJzZXIucHJvdG90eXBlO1xuXG4vLyBDaGVjayBpZiBwcm9wZXJ0eSBuYW1lIGNsYXNoZXMgd2l0aCBhbHJlYWR5IGFkZGVkLlxuLy8gT2JqZWN0L2NsYXNzIGdldHRlcnMgYW5kIHNldHRlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGNsYXNoIOKAlFxuLy8gZWl0aGVyIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGFuIGluaXQgcHJvcGVydHkg4oCUIGFuZCBpblxuLy8gc3RyaWN0IG1vZGUsIGluaXQgcHJvcGVydGllcyBhcmUgYWxzbyBub3QgYWxsb3dlZCB0byBiZSByZXBlYXRlZC5cblxucHAuY2hlY2tQcm9wQ2xhc2ggPSBmdW5jdGlvbiAocHJvcCwgcHJvcEhhc2gpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIChwcm9wLmNvbXB1dGVkIHx8IHByb3AubWV0aG9kIHx8IHByb3Auc2hvcnRoYW5kKSkgcmV0dXJuO1xuICB2YXIga2V5ID0gcHJvcC5rZXk7dmFyIG5hbWUgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoa2V5LnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgbmFtZSA9IGtleS5uYW1lO2JyZWFrO1xuICAgIGNhc2UgXCJMaXRlcmFsXCI6XG4gICAgICBuYW1lID0gU3RyaW5nKGtleS52YWx1ZSk7YnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybjtcbiAgfVxuICB2YXIga2luZCA9IHByb3Aua2luZDtcblxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICBpZiAobmFtZSA9PT0gXCJfX3Byb3RvX19cIiAmJiBraW5kID09PSBcImluaXRcIikge1xuICAgICAgaWYgKHByb3BIYXNoLnByb3RvKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCBcIlJlZGVmaW5pdGlvbiBvZiBfX3Byb3RvX18gcHJvcGVydHlcIik7XG4gICAgICBwcm9wSGFzaC5wcm90byA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBuYW1lID0gXCIkXCIgKyBuYW1lO1xuICB2YXIgb3RoZXIgPSBwcm9wSGFzaFtuYW1lXTtcbiAgaWYgKG90aGVyKSB7XG4gICAgdmFyIGlzR2V0U2V0ID0ga2luZCAhPT0gXCJpbml0XCI7XG4gICAgaWYgKCh0aGlzLnN0cmljdCB8fCBpc0dldFNldCkgJiYgb3RoZXJba2luZF0gfHwgIShpc0dldFNldCBeIG90aGVyLmluaXQpKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCBcIlJlZGVmaW5pdGlvbiBvZiBwcm9wZXJ0eVwiKTtcbiAgfSBlbHNlIHtcbiAgICBvdGhlciA9IHByb3BIYXNoW25hbWVdID0ge1xuICAgICAgaW5pdDogZmFsc2UsXG4gICAgICBnZXQ6IGZhbHNlLFxuICAgICAgc2V0OiBmYWxzZVxuICAgIH07XG4gIH1cbiAgb3RoZXJba2luZF0gPSB0cnVlO1xufTtcblxuLy8gIyMjIEV4cHJlc3Npb24gcGFyc2luZ1xuXG4vLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbi8vICdhdG9taWMnLCBub25kaXZpc2libGUgZXhwcmVzc2lvbiB0eXBlcyBhdCB0aGUgYm90dG9tLiBNb3N0IG9mXG4vLyB0aGUgZnVuY3Rpb25zIHdpbGwgc2ltcGx5IGxldCB0aGUgZnVuY3Rpb24ocykgYmVsb3cgdGhlbSBwYXJzZSxcbi8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwXG4vLyB0aGUgQVNUIG5vZGUgdGhhdCB0aGUgaW5uZXIgcGFyc2VyIGdhdmUgdGhlbSBpbiBhbm90aGVyIG5vZGUuXG5cbi8vIFBhcnNlIGEgZnVsbCBleHByZXNzaW9uLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSB1c2VkIHRvXG4vLyBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0YWxpemF0aW9uIGV4cHJlc3Npb25zKVxuLy8gYW5kIHByb3ZpZGUgcmVmZXJlbmNlIGZvciBzdG9yaW5nICc9JyBvcGVyYXRvciBpbnNpZGUgc2hvcnRoYW5kXG4vLyBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIGNvbnRleHRzIHdoZXJlIGJvdGggb2JqZWN0IGV4cHJlc3Npb25cbi8vIGFuZCBvYmplY3QgcGF0dGVybiBtaWdodCBhcHBlYXIgKHNvIGl0J3MgcG9zc2libGUgdG8gcmFpc2Vcbi8vIGRlbGF5ZWQgc3ludGF4IGVycm9yIGF0IGNvcnJlY3QgcG9zaXRpb24pLlxuXG5wcC5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAobm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LFxuICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICB2YXIgZXhwciA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5jb21tYSkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbZXhwcl07XG4gICAgd2hpbGUgKHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuY29tbWEpKSBub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU2VxdWVuY2VFeHByZXNzaW9uXCIpO1xuICB9XG4gIHJldHVybiBleHByO1xufTtcblxuLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZlxuLy8gb3BlcmF0b3JzIGxpa2UgYCs9YC5cblxucHAucGFyc2VNYXliZUFzc2lnbiA9IGZ1bmN0aW9uIChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBhZnRlckxlZnRQYXJzZSkge1xuICBpZiAodGhpcy5pbkdlbmVyYXRvciAmJiB0aGlzLmlzQ29udGV4dHVhbChcInlpZWxkXCIpKSByZXR1cm4gdGhpcy5wYXJzZVlpZWxkKCk7XG5cbiAgdmFyIHZhbGlkYXRlRGVzdHJ1Y3R1cmluZyA9IGZhbHNlO1xuICBpZiAoIXJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0geyBzaG9ydGhhbmRBc3NpZ246IDAsIHRyYWlsaW5nQ29tbWE6IDAgfTtcbiAgICB2YWxpZGF0ZURlc3RydWN0dXJpbmcgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIGlmICh0aGlzLnR5cGUgPT0gX3Rva2VudHlwZS50eXBlcy5wYXJlbkwgfHwgdGhpcy50eXBlID09IF90b2tlbnR5cGUudHlwZXMubmFtZSkgdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGFydDtcbiAgdmFyIGxlZnQgPSB0aGlzLnBhcnNlTWF5YmVDb25kaXRpb25hbChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKGFmdGVyTGVmdFBhcnNlKSBsZWZ0ID0gYWZ0ZXJMZWZ0UGFyc2UuY2FsbCh0aGlzLCBsZWZ0LCBzdGFydFBvcywgc3RhcnRMb2MpO1xuICBpZiAodGhpcy50eXBlLmlzQXNzaWduKSB7XG4gICAgaWYgKHZhbGlkYXRlRGVzdHJ1Y3R1cmluZykgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgbm9kZS5sZWZ0ID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmVxID8gdGhpcy50b0Fzc2lnbmFibGUobGVmdCkgOiBsZWZ0O1xuICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gMDsgLy8gcmVzZXQgYmVjYXVzZSBzaG9ydGhhbmQgZGVmYXVsdCB3YXMgdXNlZCBjb3JyZWN0bHlcbiAgICB0aGlzLmNoZWNrTFZhbChsZWZ0KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLnJpZ2h0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsaWRhdGVEZXN0cnVjdHVyaW5nKSB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gbGVmdDtcbn07XG5cbi8vIFBhcnNlIGEgdGVybmFyeSBjb25kaXRpb25hbCAoYD86YCkgb3BlcmF0b3IuXG5cbnBwLnBhcnNlTWF5YmVDb25kaXRpb25hbCA9IGZ1bmN0aW9uIChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJPcHMobm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgcmV0dXJuIGV4cHI7XG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnF1ZXN0aW9uKSkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUudGVzdCA9IGV4cHI7XG4gICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5jb2xvbik7XG4gICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9Jbik7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKTtcbiAgfVxuICByZXR1cm4gZXhwcjtcbn07XG5cbi8vIFN0YXJ0IHRoZSBwcmVjZWRlbmNlIHBhcnNlci5cblxucHAucGFyc2VFeHByT3BzID0gZnVuY3Rpb24gKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCxcbiAgICAgIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBmYWxzZSk7XG4gIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgcmV0dXJuIGV4cHI7XG4gIHJldHVybiB0aGlzLnBhcnNlRXhwck9wKGV4cHIsIHN0YXJ0UG9zLCBzdGFydExvYywgLTEsIG5vSW4pO1xufTtcblxuLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmdcbi8vIGFsZ29yaXRobS4gYGxlZnRgIGlzIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IuXG4vLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmRcbi8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW5cbi8vIG9wZXJhdG9yIHRoYXQgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBzZXQgaXQgaXMgcGFyc2luZy5cblxucHAucGFyc2VFeHByT3AgPSBmdW5jdGlvbiAobGVmdCwgbGVmdFN0YXJ0UG9zLCBsZWZ0U3RhcnRMb2MsIG1pblByZWMsIG5vSW4pIHtcbiAgdmFyIHByZWMgPSB0aGlzLnR5cGUuYmlub3A7XG4gIGlmIChwcmVjICE9IG51bGwgJiYgKCFub0luIHx8IHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5faW4pKSB7XG4gICAgaWYgKHByZWMgPiBtaW5QcmVjKSB7XG4gICAgICB2YXIgbG9naWNhbCA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5sb2dpY2FsT1IgfHwgdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmxvZ2ljYWxBTkQ7XG4gICAgICB2YXIgb3AgPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LFxuICAgICAgICAgIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICAgIHZhciByaWdodCA9IHRoaXMucGFyc2VFeHByT3AodGhpcy5wYXJzZU1heWJlVW5hcnkobnVsbCwgZmFsc2UpLCBzdGFydFBvcywgc3RhcnRMb2MsIHByZWMsIG5vSW4pO1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmJ1aWxkQmluYXJ5KGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBsZWZ0LCByaWdodCwgb3AsIGxvZ2ljYWwpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VFeHByT3Aobm9kZSwgbGVmdFN0YXJ0UG9zLCBsZWZ0U3RhcnRMb2MsIG1pblByZWMsIG5vSW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGVmdDtcbn07XG5cbnBwLmJ1aWxkQmluYXJ5ID0gZnVuY3Rpb24gKHN0YXJ0UG9zLCBzdGFydExvYywgbGVmdCwgcmlnaHQsIG9wLCBsb2dpY2FsKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICBub2RlLmxlZnQgPSBsZWZ0O1xuICBub2RlLm9wZXJhdG9yID0gb3A7XG4gIG5vZGUucmlnaHQgPSByaWdodDtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBsb2dpY2FsID8gXCJMb2dpY2FsRXhwcmVzc2lvblwiIDogXCJCaW5hcnlFeHByZXNzaW9uXCIpO1xufTtcblxuLy8gUGFyc2UgdW5hcnkgb3BlcmF0b3JzLCBib3RoIHByZWZpeCBhbmQgcG9zdGZpeC5cblxucHAucGFyc2VNYXliZVVuYXJ5ID0gZnVuY3Rpb24gKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHNhd1VuYXJ5KSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsXG4gICAgICBleHByID0gdW5kZWZpbmVkO1xuICBpZiAodGhpcy50eXBlLnByZWZpeCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKSxcbiAgICAgICAgdXBkYXRlID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmluY0RlYztcbiAgICBub2RlLm9wZXJhdG9yID0gdGhpcy52YWx1ZTtcbiAgICBub2RlLnByZWZpeCA9IHRydWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIHRydWUpO1xuICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuICAgIGlmICh1cGRhdGUpIHRoaXMuY2hlY2tMVmFsKG5vZGUuYXJndW1lbnQpO2Vsc2UgaWYgKHRoaXMuc3RyaWN0ICYmIG5vZGUub3BlcmF0b3IgPT09IFwiZGVsZXRlXCIgJiYgbm9kZS5hcmd1bWVudC50eXBlID09PSBcIklkZW50aWZpZXJcIikgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGVcIik7ZWxzZSBzYXdVbmFyeSA9IHRydWU7XG4gICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCB1cGRhdGUgPyBcIlVwZGF0ZUV4cHJlc3Npb25cIiA6IFwiVW5hcnlFeHByZXNzaW9uXCIpO1xuICB9IGVsc2Uge1xuICAgIGV4cHIgPSB0aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgaWYgKHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKSByZXR1cm4gZXhwcjtcbiAgICB3aGlsZSAodGhpcy50eXBlLnBvc3RmaXggJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlLnByZWZpeCA9IGZhbHNlO1xuICAgICAgbm9kZS5hcmd1bWVudCA9IGV4cHI7XG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlVwZGF0ZUV4cHJlc3Npb25cIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzYXdVbmFyeSAmJiB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnN0YXJzdGFyKSkgcmV0dXJuIHRoaXMuYnVpbGRCaW5hcnkoc3RhcnRQb3MsIHN0YXJ0TG9jLCBleHByLCB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIFwiKipcIiwgZmFsc2UpO2Vsc2UgcmV0dXJuIGV4cHI7XG59O1xuXG4vLyBQYXJzZSBjYWxsLCBkb3QsIGFuZCBgW11gLXN1YnNjcmlwdCBleHByZXNzaW9ucy5cblxucHAucGFyc2VFeHByU3Vic2NyaXB0cyA9IGZ1bmN0aW9uIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJBdG9tKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICB2YXIgc2tpcEFycm93U3Vic2NyaXB0cyA9IGV4cHIudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rU3RhcnQsIHRoaXMubGFzdFRva0VuZCkgIT09IFwiKVwiO1xuICBpZiAodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgfHwgc2tpcEFycm93U3Vic2NyaXB0cykgcmV0dXJuIGV4cHI7XG4gIHJldHVybiB0aGlzLnBhcnNlU3Vic2NyaXB0cyhleHByLCBzdGFydFBvcywgc3RhcnRMb2MpO1xufTtcblxucHAucGFyc2VTdWJzY3JpcHRzID0gZnVuY3Rpb24gKGJhc2UsIHN0YXJ0UG9zLCBzdGFydExvYywgbm9DYWxscykge1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuZG90KSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLm9iamVjdCA9IGJhc2U7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50KHRydWUpO1xuICAgICAgbm9kZS5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgYmFzZSA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLmJyYWNrZXRMKSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLm9iamVjdCA9IGJhc2U7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIG5vZGUuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5icmFja2V0Uik7XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTWVtYmVyRXhwcmVzc2lvblwiKTtcbiAgICB9IGVsc2UgaWYgKCFub0NhbGxzICYmIHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMucGFyZW5MKSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLmNhbGxlZSA9IGJhc2U7XG4gICAgICBub2RlLmFyZ3VtZW50cyA9IHRoaXMucGFyc2VFeHByTGlzdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuUiwgZmFsc2UpO1xuICAgICAgYmFzZSA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkNhbGxFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmJhY2tRdW90ZSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLnRhZyA9IGJhc2U7XG4gICAgICBub2RlLnF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlKCk7XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIFBhcnNlIGFuIGF0b21pYyBleHByZXNzaW9uIOKAlCBlaXRoZXIgYSBzaW5nbGUgdG9rZW4gdGhhdCBpcyBhblxuLy8gZXhwcmVzc2lvbiwgYW4gZXhwcmVzc2lvbiBzdGFydGVkIGJ5IGEga2V5d29yZCBsaWtlIGBmdW5jdGlvbmAgb3Jcbi8vIGBuZXdgLCBvciBhbiBleHByZXNzaW9uIHdyYXBwZWQgaW4gcHVuY3R1YXRpb24gbGlrZSBgKClgLCBgW11gLFxuLy8gb3IgYHt9YC5cblxucHAucGFyc2VFeHByQXRvbSA9IGZ1bmN0aW9uIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBub2RlID0gdW5kZWZpbmVkLFxuICAgICAgY2FuQmVBcnJvdyA9IHRoaXMucG90ZW50aWFsQXJyb3dBdCA9PSB0aGlzLnN0YXJ0O1xuICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fc3VwZXI6XG4gICAgICBpZiAoIXRoaXMuaW5GdW5jdGlvbikgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIidzdXBlcicgb3V0c2lkZSBvZiBmdW5jdGlvbiBvciBjbGFzc1wiKTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fdGhpczpcbiAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLl90aGlzID8gXCJUaGlzRXhwcmVzc2lvblwiIDogXCJTdXBlclwiO1xuICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgdHlwZSk7XG5cbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMubmFtZTpcbiAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZUlkZW50KHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5uYW1lKTtcbiAgICAgIGlmIChjYW5CZUFycm93ICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpICYmIHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuYXJyb3cpKSByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyksIFtpZF0pO1xuICAgICAgcmV0dXJuIGlkO1xuXG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLnJlZ2V4cDpcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlID0gdGhpcy5wYXJzZUxpdGVyYWwodmFsdWUudmFsdWUpO1xuICAgICAgbm9kZS5yZWdleCA9IHsgcGF0dGVybjogdmFsdWUucGF0dGVybiwgZmxhZ3M6IHZhbHVlLmZsYWdzIH07XG4gICAgICByZXR1cm4gbm9kZTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5udW06Y2FzZSBfdG9rZW50eXBlLnR5cGVzLnN0cmluZzpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnZhbHVlKTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fbnVsbDpjYXNlIF90b2tlbnR5cGUudHlwZXMuX3RydWU6Y2FzZSBfdG9rZW50eXBlLnR5cGVzLl9mYWxzZTpcbiAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgbm9kZS52YWx1ZSA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5fbnVsbCA/IG51bGwgOiB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX3RydWU7XG4gICAgICBub2RlLnJhdyA9IHRoaXMudHlwZS5rZXl3b3JkO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGl0ZXJhbFwiKTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5wYXJlbkw6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uKGNhbkJlQXJyb3cpO1xuXG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLmJyYWNrZXRMOlxuICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwckxpc3QoX3Rva2VudHlwZS50eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyYXlFeHByZXNzaW9uXCIpO1xuXG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlTDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fZnVuY3Rpb246XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLCBmYWxzZSk7XG5cbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX2NsYXNzOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyh0aGlzLnN0YXJ0Tm9kZSgpLCBmYWxzZSk7XG5cbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX25ldzpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTmV3KCk7XG5cbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuYmFja1F1b3RlOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VUZW1wbGF0ZSgpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICB9XG59O1xuXG5wcC5wYXJzZUxpdGVyYWwgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICBub2RlLnZhbHVlID0gdmFsdWU7XG4gIG5vZGUucmF3ID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGl0ZXJhbFwiKTtcbn07XG5cbnBwLnBhcnNlUGFyZW5FeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCk7XG4gIHZhciB2YWwgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuUik7XG4gIHJldHVybiB2YWw7XG59O1xuXG5wcC5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uID0gZnVuY3Rpb24gKGNhbkJlQXJyb3cpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCxcbiAgICAgIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYyxcbiAgICAgIHZhbCA9IHVuZGVmaW5lZDtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICB2YXIgaW5uZXJTdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICAgIGlubmVyU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByTGlzdCA9IFtdLFxuICAgICAgICBmaXJzdCA9IHRydWU7XG4gICAgdmFyIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSB7IHNob3J0aGFuZEFzc2lnbjogMCwgdHJhaWxpbmdDb21tYTogMCB9LFxuICAgICAgICBzcHJlYWRTdGFydCA9IHVuZGVmaW5lZCxcbiAgICAgICAgaW5uZXJQYXJlblN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IF90b2tlbnR5cGUudHlwZXMucGFyZW5SKSB7XG4gICAgICBmaXJzdCA/IGZpcnN0ID0gZmFsc2UgOiB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLmNvbW1hKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuZWxsaXBzaXMpIHtcbiAgICAgICAgc3ByZWFkU3RhcnQgPSB0aGlzLnN0YXJ0O1xuICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMucGFyc2VQYXJlbkl0ZW0odGhpcy5wYXJzZVJlc3QoKSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMucGFyZW5MICYmICFpbm5lclBhcmVuU3RhcnQpIHtcbiAgICAgICAgICBpbm5lclBhcmVuU3RhcnQgPSB0aGlzLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGV4cHJMaXN0LnB1c2godGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0aGlzLnBhcnNlUGFyZW5JdGVtKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBpbm5lckVuZFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICAgIGlubmVyRW5kTG9jID0gdGhpcy5zdGFydExvYztcbiAgICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuUik7XG5cbiAgICBpZiAoY2FuQmVBcnJvdyAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLmFycm93KSkge1xuICAgICAgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgICBpZiAoaW5uZXJQYXJlblN0YXJ0KSB0aGlzLnVuZXhwZWN0ZWQoaW5uZXJQYXJlblN0YXJ0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlUGFyZW5BcnJvd0xpc3Qoc3RhcnRQb3MsIHN0YXJ0TG9jLCBleHByTGlzdCk7XG4gICAgfVxuXG4gICAgaWYgKCFleHByTGlzdC5sZW5ndGgpIHRoaXMudW5leHBlY3RlZCh0aGlzLmxhc3RUb2tTdGFydCk7XG4gICAgaWYgKHNwcmVhZFN0YXJ0KSB0aGlzLnVuZXhwZWN0ZWQoc3ByZWFkU3RhcnQpO1xuICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuXG4gICAgaWYgKGV4cHJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhbCA9IHRoaXMuc3RhcnROb2RlQXQoaW5uZXJTdGFydFBvcywgaW5uZXJTdGFydExvYyk7XG4gICAgICB2YWwuZXhwcmVzc2lvbnMgPSBleHByTGlzdDtcbiAgICAgIHRoaXMuZmluaXNoTm9kZUF0KHZhbCwgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIiwgaW5uZXJFbmRQb3MsIGlubmVyRW5kTG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsID0gZXhwckxpc3RbMF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgfVxuXG4gIGlmICh0aGlzLm9wdGlvbnMucHJlc2VydmVQYXJlbnMpIHtcbiAgICB2YXIgcGFyID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIHBhci5leHByZXNzaW9uID0gdmFsO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocGFyLCBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn07XG5cbnBwLnBhcnNlUGFyZW5JdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgcmV0dXJuIGl0ZW07XG59O1xuXG5wcC5wYXJzZVBhcmVuQXJyb3dMaXN0ID0gZnVuY3Rpb24gKHN0YXJ0UG9zLCBzdGFydExvYywgZXhwckxpc3QpIHtcbiAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBleHByTGlzdCk7XG59O1xuXG4vLyBOZXcncyBwcmVjZWRlbmNlIGlzIHNsaWdodGx5IHRyaWNreS4gSXQgbXVzdCBhbGxvdyBpdHMgYXJndW1lbnQgdG9cbi8vIGJlIGEgYFtdYCBvciBkb3Qgc3Vic2NyaXB0IGV4cHJlc3Npb24sIGJ1dCBub3QgYSBjYWxsIOKAlCBhdCBsZWFzdCxcbi8vIG5vdCB3aXRob3V0IHdyYXBwaW5nIGl0IGluIHBhcmVudGhlc2VzLiBUaHVzLCBpdCB1c2VzIHRoZSBub0NhbGxzXG4vLyBhcmd1bWVudCB0byBwYXJzZVN1YnNjcmlwdHMgdG8gcHJldmVudCBpdCBmcm9tIGNvbnN1bWluZyB0aGVcbi8vIGFyZ3VtZW50IGxpc3QuXG5cbnZhciBlbXB0eSA9IFtdO1xuXG5wcC5wYXJzZU5ldyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB2YXIgbWV0YSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuZG90KSkge1xuICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgICBpZiAobm9kZS5wcm9wZXJ0eS5uYW1lICE9PSBcInRhcmdldFwiKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5wcm9wZXJ0eS5zdGFydCwgXCJUaGUgb25seSB2YWxpZCBtZXRhIHByb3BlcnR5IGZvciBuZXcgaXMgbmV3LnRhcmdldFwiKTtcbiAgICBpZiAoIXRoaXMuaW5GdW5jdGlvbikgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwibmV3LnRhcmdldCBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9uc1wiKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTWV0YVByb3BlcnR5XCIpO1xuICB9XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsXG4gICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZVN1YnNjcmlwdHModGhpcy5wYXJzZUV4cHJBdG9tKCksIHN0YXJ0UG9zLCBzdGFydExvYywgdHJ1ZSk7XG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCkpIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUV4cHJMaXN0KF90b2tlbnR5cGUudHlwZXMucGFyZW5SLCBmYWxzZSk7ZWxzZSBub2RlLmFyZ3VtZW50cyA9IGVtcHR5O1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTmV3RXhwcmVzc2lvblwiKTtcbn07XG5cbi8vIFBhcnNlIHRlbXBsYXRlIGV4cHJlc3Npb24uXG5cbnBwLnBhcnNlVGVtcGxhdGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlbSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIGVsZW0udmFsdWUgPSB7XG4gICAgcmF3OiB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMuZW5kKS5yZXBsYWNlKC9cXHJcXG4/L2csICdcXG4nKSxcbiAgICBjb29rZWQ6IHRoaXMudmFsdWVcbiAgfTtcbiAgdGhpcy5uZXh0KCk7XG4gIGVsZW0udGFpbCA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5iYWNrUXVvdGU7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoZWxlbSwgXCJUZW1wbGF0ZUVsZW1lbnRcIik7XG59O1xuXG5wcC5wYXJzZVRlbXBsYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIHRoaXMubmV4dCgpO1xuICBub2RlLmV4cHJlc3Npb25zID0gW107XG4gIHZhciBjdXJFbHQgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KCk7XG4gIG5vZGUucXVhc2lzID0gW2N1ckVsdF07XG4gIHdoaWxlICghY3VyRWx0LnRhaWwpIHtcbiAgICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLmRvbGxhckJyYWNlTCk7XG4gICAgbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMuYnJhY2VSKTtcbiAgICBub2RlLnF1YXNpcy5wdXNoKGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoKSk7XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIik7XG59O1xuXG4vLyBQYXJzZSBhbiBvYmplY3QgbGl0ZXJhbCBvciBiaW5kaW5nIHBhdHRlcm4uXG5cbnBwLnBhcnNlT2JqID0gZnVuY3Rpb24gKGlzUGF0dGVybiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksXG4gICAgICBmaXJzdCA9IHRydWUsXG4gICAgICBwcm9wSGFzaCA9IHt9O1xuICBub2RlLnByb3BlcnRpZXMgPSBbXTtcbiAgdGhpcy5uZXh0KCk7XG4gIHdoaWxlICghdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5icmFjZVIpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5jb21tYSk7XG4gICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEoX3Rva2VudHlwZS50eXBlcy5icmFjZVIpKSBicmVhaztcbiAgICB9IGVsc2UgZmlyc3QgPSBmYWxzZTtcblxuICAgIHZhciBwcm9wID0gdGhpcy5zdGFydE5vZGUoKSxcbiAgICAgICAgaXNHZW5lcmF0b3IgPSB1bmRlZmluZWQsXG4gICAgICAgIHN0YXJ0UG9zID0gdW5kZWZpbmVkLFxuICAgICAgICBzdGFydExvYyA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICAgIHByb3AubWV0aG9kID0gZmFsc2U7XG4gICAgICBwcm9wLnNob3J0aGFuZCA9IGZhbHNlO1xuICAgICAgaWYgKGlzUGF0dGVybiB8fCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgICAgIHN0YXJ0UG9zID0gdGhpcy5zdGFydDtcbiAgICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1BhdHRlcm4pIGlzR2VuZXJhdG9yID0gdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5zdGFyKTtcbiAgICB9XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICB0aGlzLnBhcnNlUHJvcGVydHlWYWx1ZShwcm9wLCBpc1BhdHRlcm4sIGlzR2VuZXJhdG9yLCBzdGFydFBvcywgc3RhcnRMb2MsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIHRoaXMuY2hlY2tQcm9wQ2xhc2gocHJvcCwgcHJvcEhhc2gpO1xuICAgIG5vZGUucHJvcGVydGllcy5wdXNoKHRoaXMuZmluaXNoTm9kZShwcm9wLCBcIlByb3BlcnR5XCIpKTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzUGF0dGVybiA/IFwiT2JqZWN0UGF0dGVyblwiIDogXCJPYmplY3RFeHByZXNzaW9uXCIpO1xufTtcblxucHAucGFyc2VQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24gKHByb3AsIGlzUGF0dGVybiwgaXNHZW5lcmF0b3IsIHN0YXJ0UG9zLCBzdGFydExvYywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICBpZiAodGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5jb2xvbikpIHtcbiAgICBwcm9wLnZhbHVlID0gaXNQYXR0ZXJuID8gdGhpcy5wYXJzZU1heWJlRGVmYXVsdCh0aGlzLnN0YXJ0LCB0aGlzLnN0YXJ0TG9jKSA6IHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCkge1xuICAgIGlmIChpc1BhdHRlcm4pIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIHByb3Aua2luZCA9IFwiaW5pdFwiO1xuICAgIHByb3AubWV0aG9kID0gdHJ1ZTtcbiAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChpc0dlbmVyYXRvcik7XG4gIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgKHByb3Aua2V5Lm5hbWUgPT09IFwiZ2V0XCIgfHwgcHJvcC5rZXkubmFtZSA9PT0gXCJzZXRcIikgJiYgdGhpcy50eXBlICE9IF90b2tlbnR5cGUudHlwZXMuY29tbWEgJiYgdGhpcy50eXBlICE9IF90b2tlbnR5cGUudHlwZXMuYnJhY2VSKSB7XG4gICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzUGF0dGVybikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgcHJvcC5raW5kID0gcHJvcC5rZXkubmFtZTtcbiAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO1xuICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWV0aG9kKGZhbHNlKTtcbiAgICB2YXIgcGFyYW1Db3VudCA9IHByb3Aua2luZCA9PT0gXCJnZXRcIiA/IDAgOiAxO1xuICAgIGlmIChwcm9wLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IHBhcmFtQ291bnQpIHtcbiAgICAgIHZhciBzdGFydCA9IHByb3AudmFsdWUuc3RhcnQ7XG4gICAgICBpZiAocHJvcC5raW5kID09PSBcImdldFwiKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiZ2V0dGVyIHNob3VsZCBoYXZlIG5vIHBhcmFtc1wiKTtlbHNlIHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJzZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1cIik7XG4gICAgfVxuICAgIGlmIChwcm9wLmtpbmQgPT09IFwic2V0XCIgJiYgcHJvcC52YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocHJvcC52YWx1ZS5wYXJhbXNbMF0uc3RhcnQsIFwiU2V0dGVyIGNhbm5vdCB1c2UgcmVzdCBwYXJhbXNcIik7XG4gIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICBwcm9wLmtpbmQgPSBcImluaXRcIjtcbiAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICBpZiAodGhpcy5rZXl3b3Jkcy50ZXN0KHByb3Aua2V5Lm5hbWUpIHx8ICh0aGlzLnN0cmljdCA/IHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmQgOiB0aGlzLnJlc2VydmVkV29yZHMpLnRlc3QocHJvcC5rZXkubmFtZSkgfHwgdGhpcy5pbkdlbmVyYXRvciAmJiBwcm9wLmtleS5uYW1lID09IFwieWllbGRcIikgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHByb3Aua2V5LnN0YXJ0LCBcIkJpbmRpbmcgXCIgKyBwcm9wLmtleS5uYW1lKTtcbiAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLCBzdGFydExvYywgcHJvcC5rZXkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmVxICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgIGlmICghcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ24pIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gdGhpcy5zdGFydDtcbiAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLCBzdGFydExvYywgcHJvcC5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wLnZhbHVlID0gcHJvcC5rZXk7XG4gICAgfVxuICAgIHByb3Auc2hvcnRoYW5kID0gdHJ1ZTtcbiAgfSBlbHNlIHRoaXMudW5leHBlY3RlZCgpO1xufTtcblxucHAucGFyc2VQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbiAocHJvcCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICBpZiAodGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5icmFja2V0TCkpIHtcbiAgICAgIHByb3AuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgcHJvcC5rZXkgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMuYnJhY2tldFIpO1xuICAgICAgcmV0dXJuIHByb3Aua2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wLmtleSA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5udW0gfHwgdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy5wYXJzZUlkZW50KHRydWUpO1xufTtcblxuLy8gSW5pdGlhbGl6ZSBlbXB0eSBmdW5jdGlvbiBub2RlLlxuXG5wcC5pbml0RnVuY3Rpb24gPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlLmlkID0gbnVsbDtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgbm9kZS5nZW5lcmF0b3IgPSBmYWxzZTtcbiAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gUGFyc2Ugb2JqZWN0IG9yIGNsYXNzIG1ldGhvZC5cblxucHAucGFyc2VNZXRob2QgPSBmdW5jdGlvbiAoaXNHZW5lcmF0b3IpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLFxuICAgICAgb2xkSW5HZW4gPSB0aGlzLmluR2VuZXJhdG9yO1xuICB0aGlzLmluR2VuZXJhdG9yID0gaXNHZW5lcmF0b3I7XG4gIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCk7XG4gIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KF90b2tlbnR5cGUudHlwZXMucGFyZW5SLCBmYWxzZSwgZmFsc2UpO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIG5vZGUuZ2VuZXJhdG9yID0gaXNHZW5lcmF0b3I7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgZmFsc2UpO1xuICB0aGlzLmluR2VuZXJhdG9yID0gb2xkSW5HZW47XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvbkV4cHJlc3Npb25cIik7XG59O1xuXG4vLyBQYXJzZSBhcnJvdyBmdW5jdGlvbiBleHByZXNzaW9uIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cblxucHAucGFyc2VBcnJvd0V4cHJlc3Npb24gPSBmdW5jdGlvbiAobm9kZSwgcGFyYW1zKSB7XG4gIHZhciBvbGRJbkdlbiA9IHRoaXMuaW5HZW5lcmF0b3I7XG4gIHRoaXMuaW5HZW5lcmF0b3IgPSBmYWxzZTtcbiAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSk7XG4gIG5vZGUucGFyYW1zID0gdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJ1ZSk7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgdHJ1ZSk7XG4gIHRoaXMuaW5HZW5lcmF0b3IgPSBvbGRJbkdlbjtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpO1xufTtcblxuLy8gUGFyc2UgZnVuY3Rpb24gYm9keSBhbmQgY2hlY2sgcGFyYW1ldGVycy5cblxucHAucGFyc2VGdW5jdGlvbkJvZHkgPSBmdW5jdGlvbiAobm9kZSwgaXNBcnJvd0Z1bmN0aW9uKSB7XG4gIHZhciBpc0V4cHJlc3Npb24gPSBpc0Fycm93RnVuY3Rpb24gJiYgdGhpcy50eXBlICE9PSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlTDtcblxuICBpZiAoaXNFeHByZXNzaW9uKSB7XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgbm9kZS5leHByZXNzaW9uID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmBcbiAgICAvLyBmbGFnIChyZXN0b3JlIHRoZW0gdG8gdGhlaXIgb2xkIHZhbHVlIGFmdGVyd2FyZHMpLlxuICAgIHZhciBvbGRJbkZ1bmMgPSB0aGlzLmluRnVuY3Rpb24sXG4gICAgICAgIG9sZExhYmVscyA9IHRoaXMubGFiZWxzO1xuICAgIHRoaXMuaW5GdW5jdGlvbiA9IHRydWU7dGhpcy5sYWJlbHMgPSBbXTtcbiAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2sodHJ1ZSk7XG4gICAgbm9kZS5leHByZXNzaW9uID0gZmFsc2U7XG4gICAgdGhpcy5pbkZ1bmN0aW9uID0gb2xkSW5GdW5jO3RoaXMubGFiZWxzID0gb2xkTGFiZWxzO1xuICB9XG5cbiAgLy8gSWYgdGhpcyBpcyBhIHN0cmljdCBtb2RlIGZ1bmN0aW9uLCB2ZXJpZnkgdGhhdCBhcmd1bWVudCBuYW1lc1xuICAvLyBhcmUgbm90IHJlcGVhdGVkLCBhbmQgaXQgZG9lcyBub3QgdHJ5IHRvIGJpbmQgdGhlIHdvcmRzIGBldmFsYFxuICAvLyBvciBgYXJndW1lbnRzYC5cbiAgaWYgKHRoaXMuc3RyaWN0IHx8ICFpc0V4cHJlc3Npb24gJiYgbm9kZS5ib2R5LmJvZHkubGVuZ3RoICYmIHRoaXMuaXNVc2VTdHJpY3Qobm9kZS5ib2R5LmJvZHlbMF0pKSB7XG4gICAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0O1xuICAgIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcbiAgICBpZiAobm9kZS5pZCkgdGhpcy5jaGVja0xWYWwobm9kZS5pZCwgdHJ1ZSk7XG4gICAgdGhpcy5jaGVja1BhcmFtcyhub2RlKTtcbiAgICB0aGlzLnN0cmljdCA9IG9sZFN0cmljdDtcbiAgfSBlbHNlIGlmIChpc0Fycm93RnVuY3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUGFyYW1zKG5vZGUpO1xuICB9XG59O1xuXG4vLyBDaGVja3MgZnVuY3Rpb24gcGFyYW1zIGZvciB2YXJpb3VzIGRpc2FsbG93ZWQgcGF0dGVybnMgc3VjaCBhcyB1c2luZyBcImV2YWxcIlxuLy8gb3IgXCJhcmd1bWVudHNcIiBhbmQgZHVwbGljYXRlIHBhcmFtZXRlcnMuXG5cbnBwLmNoZWNrUGFyYW1zID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG5hbWVIYXNoID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5wYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLmNoZWNrTFZhbChub2RlLnBhcmFtc1tpXSwgdHJ1ZSwgbmFtZUhhc2gpO1xuICB9XG59O1xuXG4vLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucywgYW5kIHJldHVybnMgdGhlbSBhc1xuLy8gYW4gYXJyYXkuIGBjbG9zZWAgaXMgdGhlIHRva2VuIHR5cGUgdGhhdCBlbmRzIHRoZSBsaXN0LCBhbmRcbi8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGhcbi8vIG5vdGhpbmcgaW4gYmV0d2VlbiB0aGVtIHRvIGJlIHBhcnNlZCBhcyBgbnVsbGAgKHdoaWNoIGlzIG5lZWRlZFxuLy8gZm9yIGFycmF5IGxpdGVyYWxzKS5cblxucHAucGFyc2VFeHByTGlzdCA9IGZ1bmN0aW9uIChjbG9zZSwgYWxsb3dUcmFpbGluZ0NvbW1hLCBhbGxvd0VtcHR5LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBlbHRzID0gW10sXG4gICAgICBmaXJzdCA9IHRydWU7XG4gIHdoaWxlICghdGhpcy5lYXQoY2xvc2UpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5jb21tYSk7XG4gICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkgYnJlYWs7XG4gICAgfSBlbHNlIGZpcnN0ID0gZmFsc2U7XG5cbiAgICB2YXIgZWx0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChhbGxvd0VtcHR5ICYmIHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5jb21tYSkgZWx0ID0gbnVsbDtlbHNlIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuZWxsaXBzaXMpIHtcbiAgICAgIGVsdCA9IHRoaXMucGFyc2VTcHJlYWQocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmNvbW1hICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgJiYgIXJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSkge1xuICAgICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSB0aGlzLmxhc3RUb2tTdGFydDtcbiAgICAgIH1cbiAgICB9IGVsc2UgZWx0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBlbHRzLnB1c2goZWx0KTtcbiAgfVxuICByZXR1cm4gZWx0cztcbn07XG5cbi8vIFBhcnNlIHRoZSBuZXh0IHRva2VuIGFzIGFuIGlkZW50aWZpZXIuIElmIGBsaWJlcmFsYCBpcyB0cnVlICh1c2VkXG4vLyB3aGVuIHBhcnNpbmcgcHJvcGVydGllcyksIGl0IHdpbGwgYWxzbyBjb252ZXJ0IGtleXdvcmRzIGludG9cbi8vIGlkZW50aWZpZXJzLlxuXG5wcC5wYXJzZUlkZW50ID0gZnVuY3Rpb24gKGxpYmVyYWwpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICBpZiAobGliZXJhbCAmJiB0aGlzLm9wdGlvbnMuYWxsb3dSZXNlcnZlZCA9PSBcIm5ldmVyXCIpIGxpYmVyYWwgPSBmYWxzZTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5uYW1lKSB7XG4gICAgaWYgKCFsaWJlcmFsICYmICh0aGlzLnN0cmljdCA/IHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdCA6IHRoaXMucmVzZXJ2ZWRXb3JkcykudGVzdCh0aGlzLnZhbHVlKSAmJiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgfHwgdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkuaW5kZXhPZihcIlxcXFxcIikgPT0gLTEpKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJUaGUga2V5d29yZCAnXCIgKyB0aGlzLnZhbHVlICsgXCInIGlzIHJlc2VydmVkXCIpO1xuICAgIGlmICghbGliZXJhbCAmJiB0aGlzLmluR2VuZXJhdG9yICYmIHRoaXMudmFsdWUgPT09IFwieWllbGRcIikgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIFwiQ2FuIG5vdCB1c2UgJ3lpZWxkJyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIGdlbmVyYXRvclwiKTtcbiAgICBub2RlLm5hbWUgPSB0aGlzLnZhbHVlO1xuICB9IGVsc2UgaWYgKGxpYmVyYWwgJiYgdGhpcy50eXBlLmtleXdvcmQpIHtcbiAgICBub2RlLm5hbWUgPSB0aGlzLnR5cGUua2V5d29yZDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgfVxuICB0aGlzLm5leHQoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklkZW50aWZpZXJcIik7XG59O1xuXG4vLyBQYXJzZXMgeWllbGQgZXhwcmVzc2lvbiBpbnNpZGUgZ2VuZXJhdG9yLlxuXG5wcC5wYXJzZVlpZWxkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIHRoaXMubmV4dCgpO1xuICBpZiAodGhpcy50eXBlID09IF90b2tlbnR5cGUudHlwZXMuc2VtaSB8fCB0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8IHRoaXMudHlwZSAhPSBfdG9rZW50eXBlLnR5cGVzLnN0YXIgJiYgIXRoaXMudHlwZS5zdGFydHNFeHByKSB7XG4gICAgbm9kZS5kZWxlZ2F0ZSA9IGZhbHNlO1xuICAgIG5vZGUuYXJndW1lbnQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIG5vZGUuZGVsZWdhdGUgPSB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnN0YXIpO1xuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpO1xufTtcblxufSx7XCIuL3N0YXRlXCI6MTAsXCIuL3Rva2VudHlwZVwiOjE0fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBSZXNlcnZlZCB3b3JkIGxpc3RzIGZvciB2YXJpb3VzIGRpYWxlY3RzIG9mIHRoZSBsYW5ndWFnZVxuXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuaXNJZGVudGlmaWVyU3RhcnQgPSBpc0lkZW50aWZpZXJTdGFydDtcbmV4cG9ydHMuaXNJZGVudGlmaWVyQ2hhciA9IGlzSWRlbnRpZmllckNoYXI7XG52YXIgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgMzogXCJhYnN0cmFjdCBib29sZWFuIGJ5dGUgY2hhciBjbGFzcyBkb3VibGUgZW51bSBleHBvcnQgZXh0ZW5kcyBmaW5hbCBmbG9hdCBnb3RvIGltcGxlbWVudHMgaW1wb3J0IGludCBpbnRlcmZhY2UgbG9uZyBuYXRpdmUgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc2hvcnQgc3RhdGljIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgdHJhbnNpZW50IHZvbGF0aWxlXCIsXG4gIDU6IFwiY2xhc3MgZW51bSBleHRlbmRzIHN1cGVyIGNvbnN0IGV4cG9ydCBpbXBvcnRcIixcbiAgNjogXCJlbnVtXCIsXG4gIDc6IFwiZW51bVwiLFxuICBzdHJpY3Q6IFwiaW1wbGVtZW50cyBpbnRlcmZhY2UgbGV0IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHN0YXRpYyB5aWVsZFwiLFxuICBzdHJpY3RCaW5kOiBcImV2YWwgYXJndW1lbnRzXCJcbn07XG5cbmV4cG9ydHMucmVzZXJ2ZWRXb3JkcyA9IHJlc2VydmVkV29yZHM7XG4vLyBBbmQgdGhlIGtleXdvcmRzXG5cbnZhciBlY21hNUFuZExlc3NLZXl3b3JkcyA9IFwiYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBkZWJ1Z2dlciBkZWZhdWx0IGRvIGVsc2UgZmluYWxseSBmb3IgZnVuY3Rpb24gaWYgcmV0dXJuIHN3aXRjaCB0aHJvdyB0cnkgdmFyIHdoaWxlIHdpdGggbnVsbCB0cnVlIGZhbHNlIGluc3RhbmNlb2YgdHlwZW9mIHZvaWQgZGVsZXRlIG5ldyBpbiB0aGlzXCI7XG5cbnZhciBrZXl3b3JkcyA9IHtcbiAgNTogZWNtYTVBbmRMZXNzS2V5d29yZHMsXG4gIDY6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgY29uc3QgY2xhc3MgZXh0ZW5kcyBleHBvcnQgaW1wb3J0IHN1cGVyXCJcbn07XG5cbmV4cG9ydHMua2V5d29yZHMgPSBrZXl3b3Jkcztcbi8vICMjIENoYXJhY3RlciBjYXRlZ29yaWVzXG5cbi8vIEJpZyB1Z2x5IHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBtYXRjaCBjaGFyYWN0ZXJzIGluIHRoZVxuLy8gd2hpdGVzcGFjZSwgaWRlbnRpZmllciwgYW5kIGlkZW50aWZpZXItc3RhcnQgY2F0ZWdvcmllcy4gVGhlc2Vcbi8vIGFyZSBvbmx5IGFwcGxpZWQgd2hlbiBhIGNoYXJhY3RlciBpcyBmb3VuZCB0byBhY3R1YWxseSBoYXZlIGFcbi8vIGNvZGUgcG9pbnQgYWJvdmUgMTI4LlxuLy8gR2VuZXJhdGVkIGJ5IGBiaW4vZ2VuZXJhdGUtaWRlbnRpZmllci1yZWdleC5qc2AuXG5cbnZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gXCLCqsK1wrrDgC3DlsOYLcO2w7gty4HLhi3LkcugLcuky6zLrs2wLc20zbbNt826Lc29zb/Ohs6ILc6KzozOji3Ooc6jLc+1z7ct0oHSii3Ur9SxLdWW1ZnVoS3Wh9eQLdeq17At17LYoC3Zitmu2a/ZsS3bk9uV26Xbptuu26/bui3bvNu/3JDcki3cr92NLd6l3rHfii3fqt+037XfuuCggC3goJXgoJrgoKTgoKjgoYAt4KGY4KKgLeCitOCkhC3gpLngpL3gpZDgpZgt4KWh4KWxLeCmgOCmhS3gpozgpo/gppDgppMt4Kao4KaqLeCmsOCmsuCmti3gprngpr3gp47gp5zgp53gp58t4Keh4Kew4Kex4KiFLeCoiuCoj+CokOCoky3gqKjgqKot4Kiw4Kiy4Kiz4Ki14Ki24Ki44Ki54KmZLeCpnOCpnuCpsi3gqbTgqoUt4KqN4KqPLeCqkeCqky3gqqjgqqot4Kqw4Kqy4Kqz4Kq1LeCqueCqveCrkOCroOCroeCrueCshS3grIzgrI/grJDgrJMt4Kyo4KyqLeCssOCssuCss+CstS3grLngrL3grZzgrZ3grZ8t4K2h4K2x4K6D4K6FLeCuiuCuji3grpDgrpIt4K6V4K6Z4K6a4K6c4K6e4K6f4K6j4K6k4K6oLeCuquCuri3grrngr5DgsIUt4LCM4LCOLeCwkOCwki3gsKjgsKot4LC54LC94LGYLeCxmuCxoOCxoeCyhS3gsozgso4t4LKQ4LKSLeCyqOCyqi3gsrPgsrUt4LK54LK94LOe4LOg4LOh4LOx4LOy4LSFLeC0jOC0ji3gtJDgtJIt4LS64LS94LWO4LWfLeC1oeC1ui3gtb/gtoUt4LaW4LaaLeC2seC2sy3gtrvgtr3gt4At4LeG4LiBLeC4sOC4suC4s+C5gC3guYbguoHguoLguoTguofguojguorguo3gupQt4LqX4LqZLeC6n+C6oS3guqPguqXguqfguqrguqvguq0t4Lqw4Lqy4Lqz4Lq94LuALeC7hOC7huC7nC3gu5/gvIDgvYAt4L2H4L2JLeC9rOC+iC3gvozhgIAt4YCq4YC/4YGQLeGBleGBmi3hgZ3hgaHhgaXhgabhga4t4YGw4YG1LeGCgeGCjuGCoC3hg4Xhg4fhg43hg5At4YO64YO8LeGJiOGJii3hiY3hiZAt4YmW4YmY4YmaLeGJneGJoC3hiojhioot4YqN4YqQLeGKsOGKsi3hirXhirgt4Yq+4YuA4YuCLeGLheGLiC3hi5bhi5gt4YyQ4YySLeGMleGMmC3hjZrhjoAt4Y6P4Y6gLeGPteGPuC3hj73hkIEt4Zms4ZmvLeGZv+GagS3hmprhmqAt4Zuq4ZuuLeGbuOGcgC3hnIzhnI4t4ZyR4ZygLeGcseGdgC3hnZHhnaAt4Z2s4Z2uLeGdsOGegC3hnrPhn5fhn5zhoKAt4aG34aKALeGiqOGiquGisC3ho7XhpIAt4aSe4aWQLeGlreGlsC3hpbThpoAt4aar4aawLeGnieGogC3hqJbhqKAt4amU4aqn4ayFLeGss+GthS3hrYvhroMt4a6g4a6u4a6v4a66LeGvpeGwgC3hsKPhsY0t4bGP4bGaLeGxveGzqS3hs6zhs64t4bOx4bO14bO24bSALeG2v+G4gC3hvJXhvJgt4byd4bygLeG9heG9iC3hvY3hvZAt4b2X4b2Z4b2b4b2d4b2fLeG9veG+gC3hvrThvrYt4b684b6+4b+CLeG/hOG/hi3hv4zhv5At4b+T4b+WLeG/m+G/oC3hv6zhv7It4b+04b+2LeG/vOKBseKBv+KCkC3igpzihILihIfihIot4oST4oSV4oSYLeKEneKEpOKEpuKEqOKEqi3ihLnihLwt4oS/4oWFLeKFieKFjuKFoC3ihojisIAt4rCu4rCwLeKxnuKxoC3is6Tis6st4rOu4rOy4rOz4rSALeK0peK0p+K0reK0sC3itafita/itoAt4raW4ragLeK2puK2qC3itq7itrAt4ra24ra4LeK2vuK3gC3it4bit4gt4reO4reQLeK3luK3mC3it57jgIUt44CH44ChLeOAqeOAsS3jgLXjgLgt44C844GBLeOCluOCmy3jgp/jgqEt44O644O8LeODv+OEhS3jhK3jhLEt44aO44agLeOGuuOHsC3jh7/jkIAt5La15LiALem/leqAgC3qkozqk5At6pO96pSALeqYjOqYkC3qmJ/qmKrqmKvqmYAt6pmu6pm/LeqaneqaoC3qm6/qnJct6pyf6pyiLeqeiOqeiy3qnq3qnrAt6p636p+3Leqggeqggy3qoIXqoIct6qCK6qCMLeqgouqhgC3qobPqooIt6qKz6qOyLeqjt+qju+qjveqkii3qpKXqpLAt6qWG6qWgLeqlvOqmhC3qprLqp4/qp6At6qek6qemLeqnr+qnui3qp77qqIAt6qio6qmALeqpguqphC3qqYvqqaAt6qm26qm66qm+Leqqr+qqseqqteqqtuqquS3qqr3qq4Dqq4Lqq5st6qud6qugLeqrquqrsi3qq7TqrIEt6qyG6qyJLeqsjuqskS3qrJbqrKAt6qym6qyoLeqsruqssC3qrZrqrZwt6q2l6q2wLeqvouqwgC3tnqPtnrAt7Z+G7Z+LLe2fu++kgC3vqa3vqbAt76uZ76yALe+shu+sky3vrJfvrJ3vrJ8t76yo76yqLe+stu+suC3vrLzvrL7vrYDvrYHvrYPvrYTvrYYt766x76+TLe+0ve+1kC3vto/vtpIt77eH77ewLe+3u++5sC3vubTvubYt77u877yhLe+8uu+9gS3vvZrvvaYt776+77+CLe+/h++/ii3vv4/vv5It77+X77+aLe+/nFwiO1xudmFyIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gXCLigIzigI3Ct8yALc2vzofSgy3Sh9aRLda91r/XgdeC14TXhdeH2JAt2JrZiy3Zqdmw25Yt25zbny3bpNun26jbqi3brduwLdu53JHcsC3dit6mLd6w34At34nfqy3fs+Cgli3goJngoJst4KCj4KClLeCgp+CgqS3goK3goZkt4KGb4KOjLeCkg+Ckui3gpLzgpL4t4KWP4KWRLeCll+ClouClo+Clpi3gpa/gpoEt4KaD4Ka84Ka+LeCnhOCnh+CniOCniy3gp43gp5fgp6Lgp6Pgp6Yt4Kev4KiBLeCog+CovOCovi3gqYLgqYfgqYjgqYst4KmN4KmR4KmmLeCpseCpteCqgS3gqoPgqrzgqr4t4KuF4KuHLeCrieCriy3gq43gq6Lgq6Pgq6Yt4Kuv4KyBLeCsg+CsvOCsvi3grYTgrYfgrYjgrYst4K2N4K2W4K2X4K2i4K2j4K2mLeCtr+CuguCuvi3gr4Lgr4Yt4K+I4K+KLeCvjeCvl+Cvpi3gr6/gsIAt4LCD4LC+LeCxhOCxhi3gsYjgsYot4LGN4LGV4LGW4LGi4LGj4LGmLeCxr+CygS3gsoPgsrzgsr4t4LOE4LOGLeCziOCzii3gs43gs5Xgs5bgs6Lgs6Pgs6Yt4LOv4LSBLeC0g+C0vi3gtYTgtYYt4LWI4LWKLeC1jeC1l+C1ouC1o+C1pi3gta/gtoLgtoPgt4rgt48t4LeU4LeW4LeYLeC3n+C3pi3gt6/gt7Lgt7PguLHguLQt4Li64LmHLeC5juC5kC3guZngurHgurQt4Lq54Lq74Lq84LuILeC7jeC7kC3gu5ngvJjgvJngvKAt4Lyp4Ly14Ly34Ly54Ly+4Ly/4L2xLeC+hOC+huC+h+C+jS3gvpfgvpkt4L684L+G4YCrLeGAvuGBgC3hgYnhgZYt4YGZ4YGeLeGBoOGBoi3hgaThgact4YGt4YGxLeGBtOGCgi3hgo3hgo8t4YKd4Y2dLeGNn+GNqS3hjbHhnJIt4ZyU4ZyyLeGctOGdkuGdk+GdsuGds+GetC3hn5Phn53hn6At4Z+p4aCLLeGgjeGgkC3hoJnhoqnhpKAt4aSr4aSwLeGku+Glhi3hpY/hp5At4aea4aiXLeGom+GplS3hqZ7hqaAt4am84am/LeGqieGqkC3hqpnhqrAt4aq94ayALeGshOGstC3hrYThrZAt4a2Z4a2rLeGts+GugC3hroLhrqEt4a6t4a6wLeGuueGvpi3hr7PhsKQt4bC34bGALeGxieGxkC3hsZnhs5At4bOS4bOULeGzqOGzreGzsi3hs7Ths7jhs7nht4At4be14be8LeG3v+KAv+KBgOKBlOKDkC3ig5zig6Hig6Ut4oOw4rOvLeKzseK1v+K3oC3it7/jgKot44Cv44KZ44Ka6pigLeqYqeqZr+qZtC3qmb3qmp7qmp/qm7Dqm7HqoILqoIbqoIvqoKMt6qCn6qKA6qKB6qK0LeqjhOqjkC3qo5nqo6At6qOx6qSALeqkieqkpi3qpK3qpYct6qWT6qaALeqmg+qmsy3qp4Dqp5At6qeZ6qel6qewLeqnueqoqS3qqLbqqYPqqYzqqY3qqZAt6qmZ6qm7LeqpveqqsOqqsi3qqrTqqrfqqrjqqr7qqr/qq4Hqq6st6quv6qu16qu26q+jLeqvquqvrOqvreqvsC3qr7nvrJ7vuIAt77iP77igLe+4r++4s++4tO+5jS3vuY/vvJAt77yZ77y/XCI7XG5cbnZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydCA9IG5ldyBSZWdFeHAoXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgXCJdXCIpO1xudmFyIG5vbkFTQ0lJaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgKyBcIl1cIik7XG5cbm5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgPSBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IG51bGw7XG5cbi8vIFRoZXNlIGFyZSBhIHJ1bi1sZW5ndGggYW5kIG9mZnNldCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuLy8gPjB4ZmZmZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBhIHZhbGlkIHBhcnQgb2YgaWRlbnRpZmllcnMuIFRoZVxuLy8gb2Zmc2V0IHN0YXJ0cyBhdCAweDEwMDAwLCBhbmQgZWFjaCBwYWlyIG9mIG51bWJlcnMgcmVwcmVzZW50cyBhblxuLy8gb2Zmc2V0IHRvIHRoZSBuZXh0IHJhbmdlLCBhbmQgdGhlbiBhIHNpemUgb2YgdGhlIHJhbmdlLiBUaGV5IHdlcmVcbi8vIGdlbmVyYXRlZCBieSBiaW4vZ2VuZXJhdGUtaWRlbnRpZmllci1yZWdleC5qc1xudmFyIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzID0gWzAsIDExLCAyLCAyNSwgMiwgMTgsIDIsIDEsIDIsIDE0LCAzLCAxMywgMzUsIDEyMiwgNzAsIDUyLCAyNjgsIDI4LCA0LCA0OCwgNDgsIDMxLCAxNywgMjYsIDYsIDM3LCAxMSwgMjksIDMsIDM1LCA1LCA3LCAyLCA0LCA0MywgMTU3LCA5OSwgMzksIDksIDUxLCAxNTcsIDMxMCwgMTAsIDIxLCAxMSwgNywgMTUzLCA1LCAzLCAwLCAyLCA0MywgMiwgMSwgNCwgMCwgMywgMjIsIDExLCAyMiwgMTAsIDMwLCA2NiwgMTgsIDIsIDEsIDExLCAyMSwgMTEsIDI1LCA3MSwgNTUsIDcsIDEsIDY1LCAwLCAxNiwgMywgMiwgMiwgMiwgMjYsIDQ1LCAyOCwgNCwgMjgsIDM2LCA3LCAyLCAyNywgMjgsIDUzLCAxMSwgMjEsIDExLCAxOCwgMTQsIDE3LCAxMTEsIDcyLCA1NiwgNTAsIDE0LCA1MCwgNzg1LCA1MiwgNzYsIDQ0LCAzMywgMjQsIDI3LCAzNSwgNDIsIDM0LCA0LCAwLCAxMywgNDcsIDE1LCAzLCAyMiwgMCwgMiwgMCwgMzYsIDE3LCAyLCAyNCwgODUsIDYsIDIsIDAsIDIsIDMsIDIsIDE0LCAyLCA5LCA4LCA0NiwgMzksIDcsIDMsIDEsIDMsIDIxLCAyLCA2LCAyLCAxLCAyLCA0LCA0LCAwLCAxOSwgMCwgMTMsIDQsIDI4NywgNDcsIDIxLCAxLCAyLCAwLCAxODUsIDQ2LCA0MiwgMywgMzcsIDQ3LCAyMSwgMCwgNjAsIDQyLCA4NiwgMjUsIDM5MSwgNjMsIDMyLCAwLCA0NDksIDU2LCAxMjg4LCA5MjEsIDEwMywgMTEwLCAxOCwgMTk1LCAyNzQ5LCAxMDcwLCA0MDUwLCA1ODIsIDg2MzQsIDU2OCwgOCwgMzAsIDExNCwgMjksIDE5LCA0NywgMTcsIDMsIDMyLCAyMCwgNiwgMTgsIDg4MSwgNjgsIDEyLCAwLCA2NywgMTIsIDE2NDgxLCAxLCAzMDcxLCAxMDYsIDYsIDEyLCA0LCA4LCA4LCA5LCA1OTkxLCA4NCwgMiwgNzAsIDIsIDEsIDMsIDAsIDMsIDEsIDMsIDMsIDIsIDExLCAyLCAwLCAyLCA2LCAyLCA2NCwgMiwgMywgMywgNywgMiwgNiwgMiwgMjcsIDIsIDMsIDIsIDQsIDIsIDAsIDQsIDYsIDIsIDMzOSwgMywgMjQsIDIsIDI0LCAyLCAzMCwgMiwgMjQsIDIsIDMwLCAyLCAyNCwgMiwgMzAsIDIsIDI0LCAyLCAzMCwgMiwgMjQsIDIsIDcsIDQxNDksIDE5NiwgMTM0MCwgMywgMiwgMjYsIDIsIDEsIDIsIDAsIDMsIDAsIDIsIDksIDIsIDMsIDIsIDAsIDIsIDAsIDcsIDAsIDUsIDAsIDIsIDAsIDIsIDAsIDIsIDIsIDIsIDEsIDIsIDAsIDMsIDAsIDIsIDAsIDIsIDAsIDIsIDAsIDIsIDAsIDIsIDEsIDIsIDAsIDMsIDMsIDIsIDYsIDIsIDMsIDIsIDMsIDIsIDAsIDIsIDksIDIsIDE2LCA2LCAyLCAyLCA0LCAyLCAxNiwgNDQyMSwgNDI3MTAsIDQyLCA0MTQ4LCAxMiwgMjIxLCAzLCA1NzYxLCAxMDU5MSwgNTQxXTtcbnZhciBhc3RyYWxJZGVudGlmaWVyQ29kZXMgPSBbNTA5LCAwLCAyMjcsIDAsIDE1MCwgNCwgMjk0LCA5LCAxMzY4LCAyLCAyLCAxLCA2LCAzLCA0MSwgMiwgNSwgMCwgMTY2LCAxLCAxMzA2LCAyLCA1NCwgMTQsIDMyLCA5LCAxNiwgMywgNDYsIDEwLCA1NCwgOSwgNywgMiwgMzcsIDEzLCAyLCA5LCA1MiwgMCwgMTMsIDIsIDQ5LCAxMywgMTAsIDIsIDQsIDksIDgzLCAxMSwgMTY4LCAxMSwgNiwgOSwgNywgMywgNTcsIDAsIDIsIDYsIDMsIDEsIDMsIDIsIDEwLCAwLCAxMSwgMSwgMywgNiwgNCwgNCwgMzE2LCAxOSwgMTMsIDksIDIxNCwgNiwgMywgOCwgMjgsIDEsIDgzLCAxNiwgMTYsIDksIDgyLCAxMiwgOSwgOSwgODQsIDE0LCA1LCA5LCA0MjMsIDksIDIwODU1LCA5LCAxMzUsIDQsIDYwLCA2LCAyNiwgOSwgMTAxNiwgNDUsIDE3LCAzLCAxOTcyMywgMSwgNTMxOSwgNCwgNCwgNSwgOSwgNywgMywgNiwgMzEsIDMsIDE0OSwgMiwgMTQxOCwgNDksIDUxMywgNTQsIDUsIDQ5LCA5LCAwLCAxNSwgMCwgMjMsIDQsIDIsIDE0LCAzNjE3LCA2LCA3OTI2MTgsIDIzOV07XG5cbi8vIFRoaXMgaGFzIGEgY29tcGxleGl0eSBsaW5lYXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlLiBUaGVcbi8vIGFzc3VtcHRpb24gaXMgdGhhdCBsb29raW5nIHVwIGFzdHJhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgaXNcbi8vIHJhcmUuXG5mdW5jdGlvbiBpc0luQXN0cmFsU2V0KGNvZGUsIHNldCkge1xuICB2YXIgcG9zID0gMHgxMDAwMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBwb3MgKz0gc2V0W2ldO1xuICAgIGlmIChwb3MgPiBjb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcG9zICs9IHNldFtpICsgMV07XG4gICAgaWYgKHBvcyA+PSBjb2RlKSByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBzdGFydHMgYW4gaWRlbnRpZmllci5cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZSwgYXN0cmFsKSB7XG4gIGlmIChjb2RlIDwgNjUpIHJldHVybiBjb2RlID09PSAzNjtcbiAgaWYgKGNvZGUgPCA5MSkgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDwgOTcpIHJldHVybiBjb2RlID09PSA5NTtcbiAgaWYgKGNvZGUgPCAxMjMpIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8PSAweGZmZmYpIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgaWYgKGFzdHJhbCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG5mdW5jdGlvbiBpc0lkZW50aWZpZXJDaGFyKGNvZGUsIGFzdHJhbCkge1xuICBpZiAoY29kZSA8IDQ4KSByZXR1cm4gY29kZSA9PT0gMzY7XG4gIGlmIChjb2RlIDwgNTgpIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IDY1KSByZXR1cm4gZmFsc2U7XG4gIGlmIChjb2RlIDwgOTEpIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7XG4gIGlmIChjb2RlIDwgMTIzKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPD0gMHhmZmZmKSByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpO1xuICBpZiAoYXN0cmFsID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcykgfHwgaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyQ29kZXMpO1xufVxuXG59LHt9XSwzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIEFjb3JuIGlzIGEgdGlueSwgZmFzdCBKYXZhU2NyaXB0IHBhcnNlciB3cml0dGVuIGluIEphdmFTY3JpcHQuXG4vL1xuLy8gQWNvcm4gd2FzIHdyaXR0ZW4gYnkgTWFyaWpuIEhhdmVyYmVrZSwgSW5ndmFyIFN0ZXBhbnlhbiwgYW5kXG4vLyB2YXJpb3VzIGNvbnRyaWJ1dG9ycyBhbmQgcmVsZWFzZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2UuXG4vL1xuLy8gR2l0IHJlcG9zaXRvcmllcyBmb3IgQWNvcm4gYXJlIGF2YWlsYWJsZSBhdFxuLy9cbi8vICAgICBodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9hY29yblxuLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJuanMvYWNvcm4uZ2l0XG4vL1xuLy8gUGxlYXNlIHVzZSB0aGUgW2dpdGh1YiBidWcgdHJhY2tlcl1bZ2hidF0gdG8gcmVwb3J0IGlzc3Vlcy5cbi8vXG4vLyBbZ2hidF06IGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJuanMvYWNvcm4vaXNzdWVzXG4vL1xuLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIG1haW4gcGFyc2VyIGludGVyZmFjZS4gVGhlIGxpYnJhcnkgYWxzbyBjb21lc1xuLy8gd2l0aCBhIFtlcnJvci10b2xlcmFudCBwYXJzZXJdW2RhbW1pdF0gYW5kIGFuXG4vLyBbYWJzdHJhY3Qgc3ludGF4IHRyZWUgd2Fsa2VyXVt3YWxrXSwgZGVmaW5lZCBpbiBvdGhlciBmaWxlcy5cbi8vXG4vLyBbZGFtbWl0XTogYWNvcm5fbG9vc2UuanNcbi8vIFt3YWxrXTogdXRpbC93YWxrLmpzXG5cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5wYXJzZUV4cHJlc3Npb25BdCA9IHBhcnNlRXhwcmVzc2lvbkF0O1xuZXhwb3J0cy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7XG5cbnZhciBfc3RhdGUgPSBfZGVyZXFfKFwiLi9zdGF0ZVwiKTtcblxuX2RlcmVxXyhcIi4vcGFyc2V1dGlsXCIpO1xuXG5fZGVyZXFfKFwiLi9zdGF0ZW1lbnRcIik7XG5cbl9kZXJlcV8oXCIuL2x2YWxcIik7XG5cbl9kZXJlcV8oXCIuL2V4cHJlc3Npb25cIik7XG5cbl9kZXJlcV8oXCIuL2xvY2F0aW9uXCIpO1xuXG5leHBvcnRzLlBhcnNlciA9IF9zdGF0ZS5QYXJzZXI7XG5leHBvcnRzLnBsdWdpbnMgPSBfc3RhdGUucGx1Z2lucztcblxudmFyIF9vcHRpb25zID0gX2RlcmVxXyhcIi4vb3B0aW9uc1wiKTtcblxuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IF9vcHRpb25zLmRlZmF1bHRPcHRpb25zO1xuXG52YXIgX2xvY3V0aWwgPSBfZGVyZXFfKFwiLi9sb2N1dGlsXCIpO1xuXG5leHBvcnRzLlBvc2l0aW9uID0gX2xvY3V0aWwuUG9zaXRpb247XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gX2xvY3V0aWwuU291cmNlTG9jYXRpb247XG5leHBvcnRzLmdldExpbmVJbmZvID0gX2xvY3V0aWwuZ2V0TGluZUluZm87XG5cbnZhciBfbm9kZSA9IF9kZXJlcV8oXCIuL25vZGVcIik7XG5cbmV4cG9ydHMuTm9kZSA9IF9ub2RlLk5vZGU7XG5cbnZhciBfdG9rZW50eXBlID0gX2RlcmVxXyhcIi4vdG9rZW50eXBlXCIpO1xuXG5leHBvcnRzLlRva2VuVHlwZSA9IF90b2tlbnR5cGUuVG9rZW5UeXBlO1xuZXhwb3J0cy50b2tUeXBlcyA9IF90b2tlbnR5cGUudHlwZXM7XG5cbnZhciBfdG9rZW5jb250ZXh0ID0gX2RlcmVxXyhcIi4vdG9rZW5jb250ZXh0XCIpO1xuXG5leHBvcnRzLlRva0NvbnRleHQgPSBfdG9rZW5jb250ZXh0LlRva0NvbnRleHQ7XG5leHBvcnRzLnRva0NvbnRleHRzID0gX3Rva2VuY29udGV4dC50eXBlcztcblxudmFyIF9pZGVudGlmaWVyID0gX2RlcmVxXyhcIi4vaWRlbnRpZmllclwiKTtcblxuZXhwb3J0cy5pc0lkZW50aWZpZXJDaGFyID0gX2lkZW50aWZpZXIuaXNJZGVudGlmaWVyQ2hhcjtcbmV4cG9ydHMuaXNJZGVudGlmaWVyU3RhcnQgPSBfaWRlbnRpZmllci5pc0lkZW50aWZpZXJTdGFydDtcblxudmFyIF90b2tlbml6ZSA9IF9kZXJlcV8oXCIuL3Rva2VuaXplXCIpO1xuXG5leHBvcnRzLlRva2VuID0gX3Rva2VuaXplLlRva2VuO1xuXG52YXIgX3doaXRlc3BhY2UgPSBfZGVyZXFfKFwiLi93aGl0ZXNwYWNlXCIpO1xuXG5leHBvcnRzLmlzTmV3TGluZSA9IF93aGl0ZXNwYWNlLmlzTmV3TGluZTtcbmV4cG9ydHMubGluZUJyZWFrID0gX3doaXRlc3BhY2UubGluZUJyZWFrO1xuZXhwb3J0cy5saW5lQnJlYWtHID0gX3doaXRlc3BhY2UubGluZUJyZWFrRztcbnZhciB2ZXJzaW9uID0gXCIzLjEuMFwiO1xuXG5leHBvcnRzLnZlcnNpb24gPSB2ZXJzaW9uO1xuLy8gVGhlIG1haW4gZXhwb3J0ZWQgaW50ZXJmYWNlICh1bmRlciBgc2VsZi5hY29ybmAgd2hlbiBpbiB0aGVcbi8vIGJyb3dzZXIpIGlzIGEgYHBhcnNlYCBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29kZSBzdHJpbmcgYW5kXG4vLyByZXR1cm5zIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGFzIHNwZWNpZmllZCBieSBbTW96aWxsYSBwYXJzZXJcbi8vIEFQSV1bYXBpXS5cbi8vXG4vLyBbYXBpXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9TcGlkZXJNb25rZXkvUGFyc2VyX0FQSVxuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IF9zdGF0ZS5QYXJzZXIob3B0aW9ucywgaW5wdXQpLnBhcnNlKCk7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gcGFyc2UgYSBzaW5nbGUgZXhwcmVzc2lvbiBhdCBhIGdpdmVuXG4vLyBvZmZzZXQgaW4gYSBzdHJpbmcuIFVzZWZ1bCBmb3IgcGFyc2luZyBtaXhlZC1sYW5ndWFnZSBmb3JtYXRzXG4vLyB0aGF0IGVtYmVkIEphdmFTY3JpcHQgZXhwcmVzc2lvbnMuXG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbkF0KGlucHV0LCBwb3MsIG9wdGlvbnMpIHtcbiAgdmFyIHAgPSBuZXcgX3N0YXRlLlBhcnNlcihvcHRpb25zLCBpbnB1dCwgcG9zKTtcbiAgcC5uZXh0VG9rZW4oKTtcbiAgcmV0dXJuIHAucGFyc2VFeHByZXNzaW9uKCk7XG59XG5cbi8vIEFjb3JuIGlzIG9yZ2FuaXplZCBhcyBhIHRva2VuaXplciBhbmQgYSByZWN1cnNpdmUtZGVzY2VudCBwYXJzZXIuXG4vLyBUaGUgYHRva2VuaXplcmAgZXhwb3J0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgdG9rZW5pemVyLlxuXG5mdW5jdGlvbiB0b2tlbml6ZXIoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBfc3RhdGUuUGFyc2VyKG9wdGlvbnMsIGlucHV0KTtcbn1cblxufSx7XCIuL2V4cHJlc3Npb25cIjoxLFwiLi9pZGVudGlmaWVyXCI6MixcIi4vbG9jYXRpb25cIjo0LFwiLi9sb2N1dGlsXCI6NSxcIi4vbHZhbFwiOjYsXCIuL25vZGVcIjo3LFwiLi9vcHRpb25zXCI6OCxcIi4vcGFyc2V1dGlsXCI6OSxcIi4vc3RhdGVcIjoxMCxcIi4vc3RhdGVtZW50XCI6MTEsXCIuL3Rva2VuY29udGV4dFwiOjEyLFwiLi90b2tlbml6ZVwiOjEzLFwiLi90b2tlbnR5cGVcIjoxNCxcIi4vd2hpdGVzcGFjZVwiOjE2fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF9zdGF0ZSA9IF9kZXJlcV8oXCIuL3N0YXRlXCIpO1xuXG52YXIgX2xvY3V0aWwgPSBfZGVyZXFfKFwiLi9sb2N1dGlsXCIpO1xuXG52YXIgcHAgPSBfc3RhdGUuUGFyc2VyLnByb3RvdHlwZTtcblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJhaXNlIGV4Y2VwdGlvbnMgb24gcGFyc2UgZXJyb3JzLiBJdFxuLy8gdGFrZXMgYW4gb2Zmc2V0IGludGVnZXIgKGludG8gdGhlIGN1cnJlbnQgYGlucHV0YCkgdG8gaW5kaWNhdGVcbi8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IsIGF0dGFjaGVzIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kXG4vLyBvZiB0aGUgZXJyb3IgbWVzc2FnZSwgYW5kIHRoZW4gcmFpc2VzIGEgYFN5bnRheEVycm9yYCB3aXRoIHRoYXRcbi8vIG1lc3NhZ2UuXG5cbnBwLnJhaXNlID0gZnVuY3Rpb24gKHBvcywgbWVzc2FnZSkge1xuICB2YXIgbG9jID0gX2xvY3V0aWwuZ2V0TGluZUluZm8odGhpcy5pbnB1dCwgcG9zKTtcbiAgbWVzc2FnZSArPSBcIiAoXCIgKyBsb2MubGluZSArIFwiOlwiICsgbG9jLmNvbHVtbiArIFwiKVwiO1xuICB2YXIgZXJyID0gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICBlcnIucG9zID0gcG9zO2Vyci5sb2MgPSBsb2M7ZXJyLnJhaXNlZEF0ID0gdGhpcy5wb3M7XG4gIHRocm93IGVycjtcbn07XG5cbnBwLnJhaXNlUmVjb3ZlcmFibGUgPSBwcC5yYWlzZTtcblxucHAuY3VyUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBfbG9jdXRpbC5Qb3NpdGlvbih0aGlzLmN1ckxpbmUsIHRoaXMucG9zIC0gdGhpcy5saW5lU3RhcnQpO1xuICB9XG59O1xuXG59LHtcIi4vbG9jdXRpbFwiOjUsXCIuL3N0YXRlXCI6MTB9XSw1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5nZXRMaW5lSW5mbyA9IGdldExpbmVJbmZvO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3doaXRlc3BhY2UgPSBfZGVyZXFfKFwiLi93aGl0ZXNwYWNlXCIpO1xuXG4vLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGZvciB0aGVcbi8vIGBzdGFydExvY2AgYW5kIGBlbmRMb2NgIHByb3BlcnRpZXMuXG5cbnZhciBQb3NpdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvc2l0aW9uKGxpbmUsIGNvbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3NpdGlvbik7XG5cbiAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIHRoaXMuY29sdW1uID0gY29sO1xuICB9XG5cbiAgUG9zaXRpb24ucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldChuKSB7XG4gICAgcmV0dXJuIG5ldyBQb3NpdGlvbih0aGlzLmxpbmUsIHRoaXMuY29sdW1uICsgbik7XG4gIH07XG5cbiAgcmV0dXJuIFBvc2l0aW9uO1xufSkoKTtcblxuZXhwb3J0cy5Qb3NpdGlvbiA9IFBvc2l0aW9uO1xuXG52YXIgU291cmNlTG9jYXRpb24gPSBmdW5jdGlvbiBTb3VyY2VMb2NhdGlvbihwLCBzdGFydCwgZW5kKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTb3VyY2VMb2NhdGlvbik7XG5cbiAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICB0aGlzLmVuZCA9IGVuZDtcbiAgaWYgKHAuc291cmNlRmlsZSAhPT0gbnVsbCkgdGhpcy5zb3VyY2UgPSBwLnNvdXJjZUZpbGU7XG59XG5cbi8vIFRoZSBgZ2V0TGluZUluZm9gIGZ1bmN0aW9uIGlzIG1vc3RseSB1c2VmdWwgd2hlbiB0aGVcbi8vIGBsb2NhdGlvbnNgIG9wdGlvbiBpcyBvZmYgKGZvciBwZXJmb3JtYW5jZSByZWFzb25zKSBhbmQgeW91XG4vLyB3YW50IHRvIGZpbmQgdGhlIGxpbmUvY29sdW1uIHBvc2l0aW9uIGZvciBhIGdpdmVuIGNoYXJhY3RlclxuLy8gb2Zmc2V0LiBgaW5wdXRgIHNob3VsZCBiZSB0aGUgY29kZSBzdHJpbmcgdGhhdCB0aGUgb2Zmc2V0IHJlZmVyc1xuLy8gaW50by5cblxuO1xuXG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG5cbmZ1bmN0aW9uIGdldExpbmVJbmZvKGlucHV0LCBvZmZzZXQpIHtcbiAgZm9yICh2YXIgbGluZSA9IDEsIGN1ciA9IDA7Oykge1xuICAgIF93aGl0ZXNwYWNlLmxpbmVCcmVha0cubGFzdEluZGV4ID0gY3VyO1xuICAgIHZhciBtYXRjaCA9IF93aGl0ZXNwYWNlLmxpbmVCcmVha0cuZXhlYyhpbnB1dCk7XG4gICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4IDwgb2Zmc2V0KSB7XG4gICAgICArK2xpbmU7XG4gICAgICBjdXIgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihsaW5lLCBvZmZzZXQgLSBjdXIpO1xuICAgIH1cbiAgfVxufVxuXG59LHtcIi4vd2hpdGVzcGFjZVwiOjE2fV0sNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF90b2tlbnR5cGUgPSBfZGVyZXFfKFwiLi90b2tlbnR5cGVcIik7XG5cbnZhciBfc3RhdGUgPSBfZGVyZXFfKFwiLi9zdGF0ZVwiKTtcblxudmFyIF91dGlsID0gX2RlcmVxXyhcIi4vdXRpbFwiKTtcblxudmFyIHBwID0gX3N0YXRlLlBhcnNlci5wcm90b3R5cGU7XG5cbi8vIENvbnZlcnQgZXhpc3RpbmcgZXhwcmVzc2lvbiBhdG9tIHRvIGFzc2lnbmFibGUgcGF0dGVyblxuLy8gaWYgcG9zc2libGUuXG5cbnBwLnRvQXNzaWduYWJsZSA9IGZ1bmN0aW9uIChub2RlLCBpc0JpbmRpbmcpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIG5vZGUpIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcHJvcCA9IG5vZGUucHJvcGVydGllc1tpXTtcbiAgICAgICAgICBpZiAocHJvcC5raW5kICE9PSBcImluaXRcIikgdGhpcy5yYWlzZShwcm9wLmtleS5zdGFydCwgXCJPYmplY3QgcGF0dGVybiBjYW4ndCBjb250YWluIGdldHRlciBvciBzZXR0ZXJcIik7XG4gICAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUocHJvcC52YWx1ZSwgaXNCaW5kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkFycmF5RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIkFycmF5UGF0dGVyblwiO1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3Qobm9kZS5lbGVtZW50cywgaXNCaW5kaW5nKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobm9kZS5vcGVyYXRvciA9PT0gXCI9XCIpIHtcbiAgICAgICAgICBub2RlLnR5cGUgPSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI7XG4gICAgICAgICAgZGVsZXRlIG5vZGUub3BlcmF0b3I7XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaCB0byBBc3NpZ25tZW50UGF0dGVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShub2RlLmxlZnQuZW5kLCBcIk9ubHkgJz0nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWUuXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICAgICAgaWYgKG5vZGUucmlnaHQudHlwZSA9PT0gXCJZaWVsZEV4cHJlc3Npb25cIikgdGhpcy5yYWlzZShub2RlLnJpZ2h0LnN0YXJ0LCBcIllpZWxkIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzQmluZGluZyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAoIWlzQmluZGluZykgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJBc3NpZ25pbmcgdG8gcnZhbHVlXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9kZTtcbn07XG5cbi8vIENvbnZlcnQgbGlzdCBvZiBleHByZXNzaW9uIGF0b21zIHRvIGJpbmRpbmcgbGlzdC5cblxucHAudG9Bc3NpZ25hYmxlTGlzdCA9IGZ1bmN0aW9uIChleHByTGlzdCwgaXNCaW5kaW5nKSB7XG4gIHZhciBlbmQgPSBleHByTGlzdC5sZW5ndGg7XG4gIGlmIChlbmQpIHtcbiAgICB2YXIgbGFzdCA9IGV4cHJMaXN0W2VuZCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QudHlwZSA9PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgIC0tZW5kO1xuICAgIH0gZWxzZSBpZiAobGFzdCAmJiBsYXN0LnR5cGUgPT0gXCJTcHJlYWRFbGVtZW50XCIpIHtcbiAgICAgIGxhc3QudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgIHZhciBhcmcgPSBsYXN0LmFyZ3VtZW50O1xuICAgICAgdGhpcy50b0Fzc2lnbmFibGUoYXJnLCBpc0JpbmRpbmcpO1xuICAgICAgaWYgKGFyZy50eXBlICE9PSBcIklkZW50aWZpZXJcIiAmJiBhcmcudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgYXJnLnR5cGUgIT09IFwiQXJyYXlQYXR0ZXJuXCIpIHRoaXMudW5leHBlY3RlZChhcmcuc3RhcnQpO1xuICAgICAgLS1lbmQ7XG4gICAgfVxuXG4gICAgaWYgKGlzQmluZGluZyAmJiBsYXN0LnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIiAmJiBsYXN0LmFyZ3VtZW50LnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSB0aGlzLnVuZXhwZWN0ZWQobGFzdC5hcmd1bWVudC5zdGFydCk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciBlbHQgPSBleHByTGlzdFtpXTtcbiAgICBpZiAoZWx0KSB0aGlzLnRvQXNzaWduYWJsZShlbHQsIGlzQmluZGluZyk7XG4gIH1cbiAgcmV0dXJuIGV4cHJMaXN0O1xufTtcblxuLy8gUGFyc2VzIHNwcmVhZCBlbGVtZW50LlxuXG5wcC5wYXJzZVNwcmVhZCA9IGZ1bmN0aW9uIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTcHJlYWRFbGVtZW50XCIpO1xufTtcblxucHAucGFyc2VSZXN0ID0gZnVuY3Rpb24gKGFsbG93Tm9uSWRlbnQpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHQoKTtcblxuICAvLyBSZXN0RWxlbWVudCBpbnNpZGUgb2YgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpZGVudGlmaWVyXG4gIGlmIChhbGxvd05vbklkZW50KSBub2RlLmFyZ3VtZW50ID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLm5hbWUgPyB0aGlzLnBhcnNlSWRlbnQoKSA6IHRoaXMudW5leHBlY3RlZCgpO2Vsc2Ugbm9kZS5hcmd1bWVudCA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5uYW1lIHx8IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5icmFja2V0TCA/IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG5cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlJlc3RFbGVtZW50XCIpO1xufTtcblxuLy8gUGFyc2VzIGx2YWx1ZSAoYXNzaWduYWJsZSkgYXRvbS5cblxucHAucGFyc2VCaW5kaW5nQXRvbSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYpIHJldHVybiB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMubmFtZTpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnQoKTtcblxuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5icmFja2V0TDpcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChfdG9rZW50eXBlLnR5cGVzLmJyYWNrZXRSLCB0cnVlLCB0cnVlKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVBhdHRlcm5cIik7XG5cbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuYnJhY2VMOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VPYmoodHJ1ZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbn07XG5cbnBwLnBhcnNlQmluZGluZ0xpc3QgPSBmdW5jdGlvbiAoY2xvc2UsIGFsbG93RW1wdHksIGFsbG93VHJhaWxpbmdDb21tYSwgYWxsb3dOb25JZGVudCkge1xuICB2YXIgZWx0cyA9IFtdLFxuICAgICAgZmlyc3QgPSB0cnVlO1xuICB3aGlsZSAoIXRoaXMuZWF0KGNsb3NlKSkge1xuICAgIGlmIChmaXJzdCkgZmlyc3QgPSBmYWxzZTtlbHNlIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMuY29tbWEpO1xuICAgIGlmIChhbGxvd0VtcHR5ICYmIHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5jb21tYSkge1xuICAgICAgZWx0cy5wdXNoKG51bGwpO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuZWxsaXBzaXMpIHtcbiAgICAgIHZhciByZXN0ID0gdGhpcy5wYXJzZVJlc3QoYWxsb3dOb25JZGVudCk7XG4gICAgICB0aGlzLnBhcnNlQmluZGluZ0xpc3RJdGVtKHJlc3QpO1xuICAgICAgZWx0cy5wdXNoKHJlc3QpO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5jb21tYSkgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTtcbiAgICAgIHRoaXMuZXhwZWN0KGNsb3NlKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWxlbSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCwgdGhpcy5zdGFydExvYyk7XG4gICAgICB0aGlzLnBhcnNlQmluZGluZ0xpc3RJdGVtKGVsZW0pO1xuICAgICAgZWx0cy5wdXNoKGVsZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWx0cztcbn07XG5cbnBwLnBhcnNlQmluZGluZ0xpc3RJdGVtID0gZnVuY3Rpb24gKHBhcmFtKSB7XG4gIHJldHVybiBwYXJhbTtcbn07XG5cbi8vIFBhcnNlcyBhc3NpZ25tZW50IHBhdHRlcm4gYXJvdW5kIGdpdmVuIGF0b20gaWYgcG9zc2libGUuXG5cbnBwLnBhcnNlTWF5YmVEZWZhdWx0ID0gZnVuY3Rpb24gKHN0YXJ0UG9zLCBzdGFydExvYywgbGVmdCkge1xuICBsZWZ0ID0gbGVmdCB8fCB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYgfHwgIXRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuZXEpKSByZXR1cm4gbGVmdDtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gIG5vZGUubGVmdCA9IGxlZnQ7XG4gIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpO1xufTtcblxuLy8gVmVyaWZ5IHRoYXQgYSBub2RlIGlzIGFuIGx2YWwg4oCUIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBhc3NpZ25lZFxuLy8gdG8uXG5cbnBwLmNoZWNrTFZhbCA9IGZ1bmN0aW9uIChleHByLCBpc0JpbmRpbmcsIGNoZWNrQ2xhc2hlcykge1xuICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICBpZiAodGhpcy5zdHJpY3QgJiYgdGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0QmluZC50ZXN0KGV4cHIubmFtZSkpIHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCAoaXNCaW5kaW5nID8gXCJCaW5kaW5nIFwiIDogXCJBc3NpZ25pbmcgdG8gXCIpICsgZXhwci5uYW1lICsgXCIgaW4gc3RyaWN0IG1vZGVcIik7XG4gICAgICBpZiAoY2hlY2tDbGFzaGVzKSB7XG4gICAgICAgIGlmIChfdXRpbC5oYXMoY2hlY2tDbGFzaGVzLCBleHByLm5hbWUpKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoZXhwci5zdGFydCwgXCJBcmd1bWVudCBuYW1lIGNsYXNoXCIpO1xuICAgICAgICBjaGVja0NsYXNoZXNbZXhwci5uYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBpZiAoaXNCaW5kaW5nKSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoZXhwci5zdGFydCwgKGlzQmluZGluZyA/IFwiQmluZGluZ1wiIDogXCJBc3NpZ25pbmcgdG9cIikgKyBcIiBtZW1iZXIgZXhwcmVzc2lvblwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIucHJvcGVydGllc1tpXS52YWx1ZSwgaXNCaW5kaW5nLCBjaGVja0NsYXNoZXMpO1xuICAgICAgfWJyZWFrO1xuXG4gICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtID0gZXhwci5lbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKGVsZW0pIHRoaXMuY2hlY2tMVmFsKGVsZW0sIGlzQmluZGluZywgY2hlY2tDbGFzaGVzKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLmxlZnQsIGlzQmluZGluZywgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLmFyZ3VtZW50LCBpc0JpbmRpbmcsIGNoZWNrQ2xhc2hlcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5leHByZXNzaW9uLCBpc0JpbmRpbmcsIGNoZWNrQ2xhc2hlcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLnJhaXNlKGV4cHIuc3RhcnQsIChpc0JpbmRpbmcgPyBcIkJpbmRpbmdcIiA6IFwiQXNzaWduaW5nIHRvXCIpICsgXCIgcnZhbHVlXCIpO1xuICB9XG59O1xuXG59LHtcIi4vc3RhdGVcIjoxMCxcIi4vdG9rZW50eXBlXCI6MTQsXCIuL3V0aWxcIjoxNX1dLDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfc3RhdGUgPSBfZGVyZXFfKFwiLi9zdGF0ZVwiKTtcblxudmFyIF9sb2N1dGlsID0gX2RlcmVxXyhcIi4vbG9jdXRpbFwiKTtcblxudmFyIE5vZGUgPSBmdW5jdGlvbiBOb2RlKHBhcnNlciwgcG9zLCBsb2MpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuXG4gIHRoaXMudHlwZSA9IFwiXCI7XG4gIHRoaXMuc3RhcnQgPSBwb3M7XG4gIHRoaXMuZW5kID0gMDtcbiAgaWYgKHBhcnNlci5vcHRpb25zLmxvY2F0aW9ucykgdGhpcy5sb2MgPSBuZXcgX2xvY3V0aWwuU291cmNlTG9jYXRpb24ocGFyc2VyLCBsb2MpO1xuICBpZiAocGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZSkgdGhpcy5zb3VyY2VGaWxlID0gcGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZTtcbiAgaWYgKHBhcnNlci5vcHRpb25zLnJhbmdlcykgdGhpcy5yYW5nZSA9IFtwb3MsIDBdO1xufVxuXG4vLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0LlxuXG47XG5cbmV4cG9ydHMuTm9kZSA9IE5vZGU7XG52YXIgcHAgPSBfc3RhdGUuUGFyc2VyLnByb3RvdHlwZTtcblxucHAuc3RhcnROb2RlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5zdGFydCwgdGhpcy5zdGFydExvYyk7XG59O1xuXG5wcC5zdGFydE5vZGVBdCA9IGZ1bmN0aW9uIChwb3MsIGxvYykge1xuICByZXR1cm4gbmV3IE5vZGUodGhpcywgcG9zLCBsb2MpO1xufTtcblxuLy8gRmluaXNoIGFuIEFTVCBub2RlLCBhZGRpbmcgYHR5cGVgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzLlxuXG5mdW5jdGlvbiBmaW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgbm9kZS50eXBlID0gdHlwZTtcbiAgbm9kZS5lbmQgPSBwb3M7XG4gIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSBub2RlLmxvYy5lbmQgPSBsb2M7XG4gIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSBub2RlLnJhbmdlWzFdID0gcG9zO1xuICByZXR1cm4gbm9kZTtcbn1cblxucHAuZmluaXNoTm9kZSA9IGZ1bmN0aW9uIChub2RlLCB0eXBlKSB7XG4gIHJldHVybiBmaW5pc2hOb2RlQXQuY2FsbCh0aGlzLCBub2RlLCB0eXBlLCB0aGlzLmxhc3RUb2tFbmQsIHRoaXMubGFzdFRva0VuZExvYyk7XG59O1xuXG4vLyBGaW5pc2ggbm9kZSBhdCBnaXZlbiBwb3NpdGlvblxuXG5wcC5maW5pc2hOb2RlQXQgPSBmdW5jdGlvbiAobm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgcmV0dXJuIGZpbmlzaE5vZGVBdC5jYWxsKHRoaXMsIG5vZGUsIHR5cGUsIHBvcywgbG9jKTtcbn07XG5cbn0se1wiLi9sb2N1dGlsXCI6NSxcIi4vc3RhdGVcIjoxMH1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmdldE9wdGlvbnMgPSBnZXRPcHRpb25zO1xuXG52YXIgX3V0aWwgPSBfZGVyZXFfKFwiLi91dGlsXCIpO1xuXG52YXIgX2xvY3V0aWwgPSBfZGVyZXFfKFwiLi9sb2N1dGlsXCIpO1xuXG4vLyBBIHNlY29uZCBvcHRpb25hbCBhcmd1bWVudCBjYW4gYmUgZ2l2ZW4gdG8gZnVydGhlciBjb25maWd1cmVcbi8vIHRoZSBwYXJzZXIgcHJvY2Vzcy4gVGhlc2Ugb3B0aW9ucyBhcmUgcmVjb2duaXplZDpcblxudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAvLyBgZWNtYVZlcnNpb25gIGluZGljYXRlcyB0aGUgRUNNQVNjcmlwdCB2ZXJzaW9uIHRvIHBhcnNlLiBNdXN0XG4gIC8vIGJlIGVpdGhlciAzLCBvciA1LCBvciA2LiBUaGlzIGluZmx1ZW5jZXMgc3VwcG9ydCBmb3Igc3RyaWN0XG4gIC8vIG1vZGUsIHRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMsIHN1cHBvcnQgZm9yIGdldHRlcnMgYW5kXG4gIC8vIHNldHRlcnMgYW5kIG90aGVyIGZlYXR1cmVzLiBUaGUgZGVmYXVsdCBpcyA2LlxuICBlY21hVmVyc2lvbjogNixcbiAgLy8gU291cmNlIHR5cGUgKFwic2NyaXB0XCIgb3IgXCJtb2R1bGVcIikgZm9yIGRpZmZlcmVudCBzZW1hbnRpY3NcbiAgc291cmNlVHlwZTogXCJzY3JpcHRcIixcbiAgLy8gYG9uSW5zZXJ0ZWRTZW1pY29sb25gIGNhbiBiZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWRcbiAgLy8gd2hlbiBhIHNlbWljb2xvbiBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkLiBJdCB3aWxsIGJlIHBhc3NlZFxuICAvLyB0aCBwb3NpdGlvbiBvZiB0aGUgY29tbWEgYXMgYW4gb2Zmc2V0LCBhbmQgaWYgYGxvY2F0aW9uc2AgaXNcbiAgLy8gZW5hYmxlZCwgaXQgaXMgZ2l2ZW4gdGhlIGxvY2F0aW9uIGFzIGEgYHtsaW5lLCBjb2x1bW59YCBvYmplY3RcbiAgLy8gYXMgc2Vjb25kIGFyZ3VtZW50LlxuICBvbkluc2VydGVkU2VtaWNvbG9uOiBudWxsLFxuICAvLyBgb25UcmFpbGluZ0NvbW1hYCBpcyBzaW1pbGFyIHRvIGBvbkluc2VydGVkU2VtaWNvbG9uYCwgYnV0IGZvclxuICAvLyB0cmFpbGluZyBjb21tYXMuXG4gIG9uVHJhaWxpbmdDb21tYTogbnVsbCxcbiAgLy8gQnkgZGVmYXVsdCwgcmVzZXJ2ZWQgd29yZHMgYXJlIG9ubHkgZW5mb3JjZWQgaWYgZWNtYVZlcnNpb24gPj0gNS5cbiAgLy8gU2V0IGBhbGxvd1Jlc2VydmVkYCB0byBhIGJvb2xlYW4gdmFsdWUgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb25cbiAgLy8gYW4gb2ZmLiBXaGVuIHRoaXMgb3B0aW9uIGhhcyB0aGUgdmFsdWUgXCJuZXZlclwiLCByZXNlcnZlZCB3b3Jkc1xuICAvLyBhbmQga2V5d29yZHMgY2FuIGFsc28gbm90IGJlIHVzZWQgYXMgcHJvcGVydHkgbmFtZXMuXG4gIGFsbG93UmVzZXJ2ZWQ6IG51bGwsXG4gIC8vIFdoZW4gZW5hYmxlZCwgYSByZXR1cm4gYXQgdGhlIHRvcCBsZXZlbCBpcyBub3QgY29uc2lkZXJlZCBhblxuICAvLyBlcnJvci5cbiAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGltcG9ydC9leHBvcnQgc3RhdGVtZW50cyBhcmUgbm90IGNvbnN0cmFpbmVkIHRvXG4gIC8vIGFwcGVhcmluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtLlxuICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGhhc2hiYW5nIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIGZpbGVcbiAgLy8gaXMgYWxsb3dlZCBhbmQgdHJlYXRlZCBhcyBhIGxpbmUgY29tbWVudC5cbiAgYWxsb3dIYXNoQmFuZzogZmFsc2UsXG4gIC8vIFdoZW4gYGxvY2F0aW9uc2AgaXMgb24sIGBsb2NgIHByb3BlcnRpZXMgaG9sZGluZyBvYmplY3RzIHdpdGhcbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBpbiBge2xpbmUsIGNvbHVtbn1gIGZvcm0gKHdpdGhcbiAgLy8gbGluZSBiZWluZyAxLWJhc2VkIGFuZCBjb2x1bW4gMC1iYXNlZCkgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGVcbiAgLy8gbm9kZXMuXG4gIGxvY2F0aW9uczogZmFsc2UsXG4gIC8vIEEgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBhcyBgb25Ub2tlbmAgb3B0aW9uLCB3aGljaCB3aWxsXG4gIC8vIGNhdXNlIEFjb3JuIHRvIGNhbGwgdGhhdCBmdW5jdGlvbiB3aXRoIG9iamVjdCBpbiB0aGUgc2FtZVxuICAvLyBmb3JtYXQgYXMgdG9rZW5zIHJldHVybmVkIGZyb20gYHRva2VuaXplcigpLmdldFRva2VuKClgLiBOb3RlXG4gIC8vIHRoYXQgeW91IGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIHRoZSBwYXJzZXIgZnJvbSB0aGVcbiAgLy8gY2FsbGJhY2vigJR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuXG4gIG9uVG9rZW46IG51bGwsXG4gIC8vIEEgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBhcyBgb25Db21tZW50YCBvcHRpb24sIHdoaWNoIHdpbGxcbiAgLy8gY2F1c2UgQWNvcm4gdG8gY2FsbCB0aGF0IGZ1bmN0aW9uIHdpdGggYChibG9jaywgdGV4dCwgc3RhcnQsXG4gIC8vIGVuZClgIHBhcmFtZXRlcnMgd2hlbmV2ZXIgYSBjb21tZW50IGlzIHNraXBwZWQuIGBibG9ja2AgaXMgYVxuICAvLyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGEgYmxvY2sgKGAvKiAqL2ApIGNvbW1lbnQsXG4gIC8vIGB0ZXh0YCBpcyB0aGUgY29udGVudCBvZiB0aGUgY29tbWVudCwgYW5kIGBzdGFydGAgYW5kIGBlbmRgIGFyZVxuICAvLyBjaGFyYWN0ZXIgb2Zmc2V0cyB0aGF0IGRlbm90ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tbWVudC5cbiAgLy8gV2hlbiB0aGUgYGxvY2F0aW9uc2Agb3B0aW9uIGlzIG9uLCB0d28gbW9yZSBwYXJhbWV0ZXJzIGFyZVxuICAvLyBwYXNzZWQsIHRoZSBmdWxsIGB7bGluZSwgY29sdW1ufWAgbG9jYXRpb25zIG9mIHRoZSBzdGFydCBhbmRcbiAgLy8gZW5kIG9mIHRoZSBjb21tZW50cy4gTm90ZSB0aGF0IHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCB0aGVcbiAgLy8gcGFyc2VyIGZyb20gdGhlIGNhbGxiYWNr4oCUdGhhdCB3aWxsIGNvcnJ1cHQgaXRzIGludGVybmFsIHN0YXRlLlxuICBvbkNvbW1lbnQ6IG51bGwsXG4gIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyAoZGlyZWN0bHkgb24gdGhlIG5vZGUsIHJhdGhlciB0aGFuXG4gIC8vIHRoZSBgbG9jYCBvYmplY3QsIHdoaWNoIGhvbGRzIGxpbmUvY29sdW1uIGRhdGEuIFRvIGFsc28gYWRkIGFcbiAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgLy8gZW5kXWAgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXJzLCBzZXQgdGhlIGByYW5nZXNgIG9wdGlvbiB0b1xuICAvLyBgdHJ1ZWAuXG4gIC8vXG4gIC8vIFtyYW5nZV06IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTY3OFxuICByYW5nZXM6IGZhbHNlLFxuICAvLyBJdCBpcyBwb3NzaWJsZSB0byBwYXJzZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIEFTVCBieVxuICAvLyBwYXNzaW5nIHRoZSB0cmVlIHByb2R1Y2VkIGJ5IHBhcnNpbmcgdGhlIGZpcnN0IGZpbGUgYXNcbiAgLy8gYHByb2dyYW1gIG9wdGlvbiBpbiBzdWJzZXF1ZW50IHBhcnNlcy4gVGhpcyB3aWxsIGFkZCB0aGVcbiAgLy8gdG9wbGV2ZWwgZm9ybXMgb2YgdGhlIHBhcnNlZCBmaWxlIHRvIHRoZSBgUHJvZ3JhbWAgKHRvcCkgbm9kZVxuICAvLyBvZiBhbiBleGlzdGluZyBwYXJzZSB0cmVlLlxuICBwcm9ncmFtOiBudWxsLFxuICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCB5b3UgY2FuIHBhc3MgdGhpcyB0byByZWNvcmQgdGhlIHNvdXJjZVxuICAvLyBmaWxlIGluIGV2ZXJ5IG5vZGUncyBgbG9jYCBvYmplY3QuXG4gIHNvdXJjZUZpbGU6IG51bGwsXG4gIC8vIFRoaXMgdmFsdWUsIGlmIGdpdmVuLCBpcyBzdG9yZWQgaW4gZXZlcnkgbm9kZSwgd2hldGhlclxuICAvLyBgbG9jYXRpb25zYCBpcyBvbiBvciBvZmYuXG4gIGRpcmVjdFNvdXJjZUZpbGU6IG51bGwsXG4gIC8vIFdoZW4gZW5hYmxlZCwgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucyBhcmUgcmVwcmVzZW50ZWQgYnlcbiAgLy8gKG5vbi1zdGFuZGFyZCkgUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZXNcbiAgcHJlc2VydmVQYXJlbnM6IGZhbHNlLFxuICBwbHVnaW5zOiB7fVxufTtcblxuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuLy8gSW50ZXJwcmV0IGFuZCBkZWZhdWx0IGFuIG9wdGlvbnMgb2JqZWN0XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMob3B0cykge1xuICB2YXIgb3B0aW9ucyA9IHt9O1xuICBmb3IgKHZhciBvcHQgaW4gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICBvcHRpb25zW29wdF0gPSBvcHRzICYmIF91dGlsLmhhcyhvcHRzLCBvcHQpID8gb3B0c1tvcHRdIDogZGVmYXVsdE9wdGlvbnNbb3B0XTtcbiAgfWlmIChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgPT0gbnVsbCkgb3B0aW9ucy5hbGxvd1Jlc2VydmVkID0gb3B0aW9ucy5lY21hVmVyc2lvbiA8IDU7XG5cbiAgaWYgKF91dGlsLmlzQXJyYXkob3B0aW9ucy5vblRva2VuKSkge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdG9rZW5zID0gb3B0aW9ucy5vblRva2VuO1xuICAgICAgb3B0aW9ucy5vblRva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB9O1xuICAgIH0pKCk7XG4gIH1cbiAgaWYgKF91dGlsLmlzQXJyYXkob3B0aW9ucy5vbkNvbW1lbnQpKSBvcHRpb25zLm9uQ29tbWVudCA9IHB1c2hDb21tZW50KG9wdGlvbnMsIG9wdGlvbnMub25Db21tZW50KTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcHVzaENvbW1lbnQob3B0aW9ucywgYXJyYXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChibG9jaywgdGV4dCwgc3RhcnQsIGVuZCwgc3RhcnRMb2MsIGVuZExvYykge1xuICAgIHZhciBjb21tZW50ID0ge1xuICAgICAgdHlwZTogYmxvY2sgPyAnQmxvY2snIDogJ0xpbmUnLFxuICAgICAgdmFsdWU6IHRleHQsXG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKSBjb21tZW50LmxvYyA9IG5ldyBfbG9jdXRpbC5Tb3VyY2VMb2NhdGlvbih0aGlzLCBzdGFydExvYywgZW5kTG9jKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZXMpIGNvbW1lbnQucmFuZ2UgPSBbc3RhcnQsIGVuZF07XG4gICAgYXJyYXkucHVzaChjb21tZW50KTtcbiAgfTtcbn1cblxufSx7XCIuL2xvY3V0aWxcIjo1LFwiLi91dGlsXCI6MTV9XSw5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO1xuXG52YXIgX3Rva2VudHlwZSA9IF9kZXJlcV8oXCIuL3Rva2VudHlwZVwiKTtcblxudmFyIF9zdGF0ZSA9IF9kZXJlcV8oXCIuL3N0YXRlXCIpO1xuXG52YXIgX3doaXRlc3BhY2UgPSBfZGVyZXFfKFwiLi93aGl0ZXNwYWNlXCIpO1xuXG52YXIgcHAgPSBfc3RhdGUuUGFyc2VyLnByb3RvdHlwZTtcblxuLy8gIyMgUGFyc2VyIHV0aWxpdGllc1xuXG4vLyBUZXN0IHdoZXRoZXIgYSBzdGF0ZW1lbnQgbm9kZSBpcyB0aGUgc3RyaW5nIGxpdGVyYWwgYFwidXNlIHN0cmljdFwiYC5cblxucHAuaXNVc2VTdHJpY3QgPSBmdW5jdGlvbiAoc3RtdCkge1xuICByZXR1cm4gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgc3RtdC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiAmJiBzdG10LmV4cHJlc3Npb24udHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYgc3RtdC5leHByZXNzaW9uLnJhdy5zbGljZSgxLCAtMSkgPT09IFwidXNlIHN0cmljdFwiO1xufTtcblxuLy8gUHJlZGljYXRlIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW5cbi8vIHR5cGUsIGFuZCBpZiB5ZXMsIGNvbnN1bWVzIGl0IGFzIGEgc2lkZSBlZmZlY3QuXG5cbnBwLmVhdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8vIFRlc3RzIHdoZXRoZXIgcGFyc2VkIHRva2VuIGlzIGEgY29udGV4dHVhbCBrZXl3b3JkLlxuXG5wcC5pc0NvbnRleHR1YWwgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLm5hbWUgJiYgdGhpcy52YWx1ZSA9PT0gbmFtZTtcbn07XG5cbi8vIENvbnN1bWVzIGNvbnRleHR1YWwga2V5d29yZCBpZiBwb3NzaWJsZS5cblxucHAuZWF0Q29udGV4dHVhbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlID09PSBuYW1lICYmIHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMubmFtZSk7XG59O1xuXG4vLyBBc3NlcnRzIHRoYXQgZm9sbG93aW5nIHRva2VuIGlzIGdpdmVuIGNvbnRleHR1YWwga2V5d29yZC5cblxucHAuZXhwZWN0Q29udGV4dHVhbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghdGhpcy5lYXRDb250ZXh0dWFsKG5hbWUpKSB0aGlzLnVuZXhwZWN0ZWQoKTtcbn07XG5cbi8vIFRlc3Qgd2hldGhlciBhIHNlbWljb2xvbiBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG5cbnBwLmNhbkluc2VydFNlbWljb2xvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5lb2YgfHwgdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlUiB8fCBfd2hpdGVzcGFjZS5saW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpO1xufTtcblxucHAuaW5zZXJ0U2VtaWNvbG9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMub25JbnNlcnRlZFNlbWljb2xvbikgdGhpcy5vcHRpb25zLm9uSW5zZXJ0ZWRTZW1pY29sb24odGhpcy5sYXN0VG9rRW5kLCB0aGlzLmxhc3RUb2tFbmRMb2MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBDb25zdW1lIGEgc2VtaWNvbG9uLCBvciwgZmFpbGluZyB0aGF0LCBzZWUgaWYgd2UgYXJlIGFsbG93ZWQgdG9cbi8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG5wcC5zZW1pY29sb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5zZW1pKSAmJiAhdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgdGhpcy51bmV4cGVjdGVkKCk7XG59O1xuXG5wcC5hZnRlclRyYWlsaW5nQ29tbWEgPSBmdW5jdGlvbiAodG9rVHlwZSkge1xuICBpZiAodGhpcy50eXBlID09IHRva1R5cGUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSkgdGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSh0aGlzLmxhc3RUb2tTdGFydCwgdGhpcy5sYXN0VG9rU3RhcnRMb2MpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBFeHBlY3QgYSB0b2tlbiBvZiBhIGdpdmVuIHR5cGUuIElmIGZvdW5kLCBjb25zdW1lIGl0LCBvdGhlcndpc2UsXG4vLyByYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLlxuXG5wcC5leHBlY3QgPSBmdW5jdGlvbiAodHlwZSkge1xuICB0aGlzLmVhdCh0eXBlKSB8fCB0aGlzLnVuZXhwZWN0ZWQoKTtcbn07XG5cbi8vIFJhaXNlIGFuIHVuZXhwZWN0ZWQgdG9rZW4gZXJyb3IuXG5cbnBwLnVuZXhwZWN0ZWQgPSBmdW5jdGlvbiAocG9zKSB7XG4gIHRoaXMucmFpc2UocG9zICE9IG51bGwgPyBwb3MgOiB0aGlzLnN0YXJ0LCBcIlVuZXhwZWN0ZWQgdG9rZW5cIik7XG59O1xuXG5wcC5jaGVja1BhdHRlcm5FcnJvcnMgPSBmdW5jdGlvbiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgYW5kVGhyb3cpIHtcbiAgdmFyIHBvcyA9IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hO1xuICBpZiAoIWFuZFRocm93KSByZXR1cm4gISFwb3M7XG4gIGlmIChwb3MpIHRoaXMucmFpc2UocG9zLCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTtcbn07XG5cbnBwLmNoZWNrRXhwcmVzc2lvbkVycm9ycyA9IGZ1bmN0aW9uIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBhbmRUaHJvdykge1xuICB2YXIgcG9zID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbjtcbiAgaWYgKCFhbmRUaHJvdykgcmV0dXJuICEhcG9zO1xuICBpZiAocG9zKSB0aGlzLnJhaXNlKHBvcywgXCJTaG9ydGhhbmQgcHJvcGVydHkgYXNzaWdubWVudHMgYXJlIHZhbGlkIG9ubHkgaW4gZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuc1wiKTtcbn07XG5cbn0se1wiLi9zdGF0ZVwiOjEwLFwiLi90b2tlbnR5cGVcIjoxNCxcIi4vd2hpdGVzcGFjZVwiOjE2fV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfaWRlbnRpZmllciA9IF9kZXJlcV8oXCIuL2lkZW50aWZpZXJcIik7XG5cbnZhciBfdG9rZW50eXBlID0gX2RlcmVxXyhcIi4vdG9rZW50eXBlXCIpO1xuXG52YXIgX3doaXRlc3BhY2UgPSBfZGVyZXFfKFwiLi93aGl0ZXNwYWNlXCIpO1xuXG52YXIgX29wdGlvbnMgPSBfZGVyZXFfKFwiLi9vcHRpb25zXCIpO1xuXG4vLyBSZWdpc3RlcmVkIHBsdWdpbnNcbnZhciBwbHVnaW5zID0ge307XG5cbmV4cG9ydHMucGx1Z2lucyA9IHBsdWdpbnM7XG5mdW5jdGlvbiBrZXl3b3JkUmVnZXhwKHdvcmRzKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKFwiXihcIiArIHdvcmRzLnJlcGxhY2UoLyAvZywgXCJ8XCIpICsgXCIpJFwiKTtcbn1cblxudmFyIFBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBhcnNlcihvcHRpb25zLCBpbnB1dCwgc3RhcnRQb3MpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFyc2VyKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBfb3B0aW9ucy5nZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHRoaXMuc291cmNlRmlsZSA9IG9wdGlvbnMuc291cmNlRmlsZTtcbiAgICB0aGlzLmtleXdvcmRzID0ga2V5d29yZFJlZ2V4cChfaWRlbnRpZmllci5rZXl3b3Jkc1tvcHRpb25zLmVjbWFWZXJzaW9uID49IDYgPyA2IDogNV0pO1xuICAgIHZhciByZXNlcnZlZCA9IG9wdGlvbnMuYWxsb3dSZXNlcnZlZCA/IFwiXCIgOiBfaWRlbnRpZmllci5yZXNlcnZlZFdvcmRzW29wdGlvbnMuZWNtYVZlcnNpb25dICsgKG9wdGlvbnMuc291cmNlVHlwZSA9PSBcIm1vZHVsZVwiID8gXCIgYXdhaXRcIiA6IFwiXCIpO1xuICAgIHRoaXMucmVzZXJ2ZWRXb3JkcyA9IGtleXdvcmRSZWdleHAocmVzZXJ2ZWQpO1xuICAgIHZhciByZXNlcnZlZFN0cmljdCA9IChyZXNlcnZlZCA/IHJlc2VydmVkICsgXCIgXCIgOiBcIlwiKSArIF9pZGVudGlmaWVyLnJlc2VydmVkV29yZHMuc3RyaWN0O1xuICAgIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdCA9IGtleXdvcmRSZWdleHAocmVzZXJ2ZWRTdHJpY3QpO1xuICAgIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmQgPSBrZXl3b3JkUmVnZXhwKHJlc2VydmVkU3RyaWN0ICsgXCIgXCIgKyBfaWRlbnRpZmllci5yZXNlcnZlZFdvcmRzLnN0cmljdEJpbmQpO1xuICAgIHRoaXMuaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuXG4gICAgLy8gVXNlZCB0byBzaWduYWwgdG8gY2FsbGVycyBvZiBgcmVhZFdvcmQxYCB3aGV0aGVyIHRoZSB3b3JkXG4gICAgLy8gY29udGFpbmVkIGFueSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdvcmRzIHdpdGhcbiAgICAvLyBlc2NhcGUgc2VxdWVuY2VzIG11c3Qgbm90IGJlIGludGVycHJldGVkIGFzIGtleXdvcmRzLlxuICAgIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcblxuICAgIC8vIExvYWQgcGx1Z2luc1xuICAgIHRoaXMubG9hZFBsdWdpbnMob3B0aW9ucy5wbHVnaW5zKTtcblxuICAgIC8vIFNldCB1cCB0b2tlbiBzdGF0ZVxuXG4gICAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHRva2VuaXplciBpbiB0aGUgaW5wdXQuXG4gICAgaWYgKHN0YXJ0UG9zKSB7XG4gICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zO1xuICAgICAgdGhpcy5saW5lU3RhcnQgPSBNYXRoLm1heCgwLCB0aGlzLmlucHV0Lmxhc3RJbmRleE9mKFwiXFxuXCIsIHN0YXJ0UG9zKSk7XG4gICAgICB0aGlzLmN1ckxpbmUgPSB0aGlzLmlucHV0LnNsaWNlKDAsIHRoaXMubGluZVN0YXJ0KS5zcGxpdChfd2hpdGVzcGFjZS5saW5lQnJlYWspLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLmxpbmVTdGFydCA9IDA7XG4gICAgICB0aGlzLmN1ckxpbmUgPSAxO1xuICAgIH1cblxuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gICAgLy8gSXRzIHR5cGVcbiAgICB0aGlzLnR5cGUgPSBfdG9rZW50eXBlLnR5cGVzLmVvZjtcbiAgICAvLyBGb3IgdG9rZW5zIHRoYXQgaW5jbHVkZSBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlaXIgdHlwZSwgdGhlIHZhbHVlXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgLy8gSXRzIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0XG4gICAgdGhpcy5zdGFydCA9IHRoaXMuZW5kID0gdGhpcy5wb3M7XG4gICAgLy8gQW5kLCBpZiBsb2NhdGlvbnMgYXJlIHVzZWQsIHRoZSB7bGluZSwgY29sdW1ufSBvYmplY3RcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIG9mZnNldHNcbiAgICB0aGlzLnN0YXJ0TG9jID0gdGhpcy5lbmRMb2MgPSB0aGlzLmN1clBvc2l0aW9uKCk7XG5cbiAgICAvLyBQb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByZXZpb3VzIHRva2VuXG4gICAgdGhpcy5sYXN0VG9rRW5kTG9jID0gdGhpcy5sYXN0VG9rU3RhcnRMb2MgPSBudWxsO1xuICAgIHRoaXMubGFzdFRva1N0YXJ0ID0gdGhpcy5sYXN0VG9rRW5kID0gdGhpcy5wb3M7XG5cbiAgICAvLyBUaGUgY29udGV4dCBzdGFjayBpcyB1c2VkIHRvIHN1cGVyZmljaWFsbHkgdHJhY2sgc3ludGFjdGljXG4gICAgLy8gY29udGV4dCB0byBwcmVkaWN0IHdoZXRoZXIgYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgYWxsb3dlZCBpbiBhXG4gICAgLy8gZ2l2ZW4gcG9zaXRpb24uXG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5pbml0aWFsQ29udGV4dCgpO1xuICAgIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xuXG4gICAgLy8gRmlndXJlIG91dCBpZiBpdCdzIGEgbW9kdWxlIGNvZGUuXG4gICAgdGhpcy5zdHJpY3QgPSB0aGlzLmluTW9kdWxlID0gb3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiO1xuXG4gICAgLy8gVXNlZCB0byBzaWduaWZ5IHRoZSBzdGFydCBvZiBhIHBvdGVudGlhbCBhcnJvdyBmdW5jdGlvblxuICAgIHRoaXMucG90ZW50aWFsQXJyb3dBdCA9IC0xO1xuXG4gICAgLy8gRmxhZ3MgdG8gdHJhY2sgd2hldGhlciB3ZSBhcmUgaW4gYSBmdW5jdGlvbiwgYSBnZW5lcmF0b3IuXG4gICAgdGhpcy5pbkZ1bmN0aW9uID0gdGhpcy5pbkdlbmVyYXRvciA9IGZhbHNlO1xuICAgIC8vIExhYmVscyBpbiBzY29wZS5cbiAgICB0aGlzLmxhYmVscyA9IFtdO1xuXG4gICAgLy8gSWYgZW5hYmxlZCwgc2tpcCBsZWFkaW5nIGhhc2hiYW5nIGxpbmUuXG4gICAgaWYgKHRoaXMucG9zID09PSAwICYmIG9wdGlvbnMuYWxsb3dIYXNoQmFuZyAmJiB0aGlzLmlucHV0LnNsaWNlKDAsIDIpID09PSAnIyEnKSB0aGlzLnNraXBMaW5lQ29tbWVudCgyKTtcbiAgfVxuXG4gIC8vIERFUFJFQ0FURUQgS2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdW50aWwgMy4wIGluIGNhc2UgYSBwbHVnaW4gdXNlcyB0aGVtXG5cbiAgUGFyc2VyLnByb3RvdHlwZS5pc0tleXdvcmQgPSBmdW5jdGlvbiBpc0tleXdvcmQod29yZCkge1xuICAgIHJldHVybiB0aGlzLmtleXdvcmRzLnRlc3Qod29yZCk7XG4gIH07XG5cbiAgUGFyc2VyLnByb3RvdHlwZS5pc1Jlc2VydmVkV29yZCA9IGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkKHdvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNlcnZlZFdvcmRzLnRlc3Qod29yZCk7XG4gIH07XG5cbiAgUGFyc2VyLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQobmFtZSwgZikge1xuICAgIHRoaXNbbmFtZV0gPSBmKHRoaXNbbmFtZV0pO1xuICB9O1xuXG4gIFBhcnNlci5wcm90b3R5cGUubG9hZFBsdWdpbnMgPSBmdW5jdGlvbiBsb2FkUGx1Z2lucyhwbHVnaW5Db25maWdzKSB7XG4gICAgZm9yICh2YXIgX25hbWUgaW4gcGx1Z2luQ29uZmlncykge1xuICAgICAgdmFyIHBsdWdpbiA9IHBsdWdpbnNbX25hbWVdO1xuICAgICAgaWYgKCFwbHVnaW4pIHRocm93IG5ldyBFcnJvcihcIlBsdWdpbiAnXCIgKyBfbmFtZSArIFwiJyBub3QgZm91bmRcIik7XG4gICAgICBwbHVnaW4odGhpcywgcGx1Z2luQ29uZmlnc1tfbmFtZV0pO1xuICAgIH1cbiAgfTtcblxuICBQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm9wdGlvbnMucHJvZ3JhbSB8fCB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUb3BMZXZlbChub2RlKTtcbiAgfTtcblxuICByZXR1cm4gUGFyc2VyO1xufSkoKTtcblxuZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG5cbn0se1wiLi9pZGVudGlmaWVyXCI6MixcIi4vb3B0aW9uc1wiOjgsXCIuL3Rva2VudHlwZVwiOjE0LFwiLi93aGl0ZXNwYWNlXCI6MTZ9XSwxMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF90b2tlbnR5cGUgPSBfZGVyZXFfKFwiLi90b2tlbnR5cGVcIik7XG5cbnZhciBfc3RhdGUgPSBfZGVyZXFfKFwiLi9zdGF0ZVwiKTtcblxudmFyIF93aGl0ZXNwYWNlID0gX2RlcmVxXyhcIi4vd2hpdGVzcGFjZVwiKTtcblxudmFyIF9pZGVudGlmaWVyID0gX2RlcmVxXyhcIi4vaWRlbnRpZmllclwiKTtcblxudmFyIHBwID0gX3N0YXRlLlBhcnNlci5wcm90b3R5cGU7XG5cbi8vICMjIyBTdGF0ZW1lbnQgcGFyc2luZ1xuXG4vLyBQYXJzZSBhIHByb2dyYW0uIEluaXRpYWxpemVzIHRoZSBwYXJzZXIsIHJlYWRzIGFueSBudW1iZXIgb2Zcbi8vIHN0YXRlbWVudHMsIGFuZCB3cmFwcyB0aGVtIGluIGEgUHJvZ3JhbSBub2RlLiAgT3B0aW9uYWxseSB0YWtlcyBhXG4vLyBgcHJvZ3JhbWAgYXJndW1lbnQuICBJZiBwcmVzZW50LCB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIGFwcGVuZGVkXG4vLyB0byBpdHMgYm9keSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuXG5cbnBwLnBhcnNlVG9wTGV2ZWwgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgZmlyc3QgPSB0cnVlO1xuICBpZiAoIW5vZGUuYm9keSkgbm9kZS5ib2R5ID0gW107XG4gIHdoaWxlICh0aGlzLnR5cGUgIT09IF90b2tlbnR5cGUudHlwZXMuZW9mKSB7XG4gICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KHRydWUsIHRydWUpO1xuICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpO1xuICAgIGlmIChmaXJzdCkge1xuICAgICAgaWYgKHRoaXMuaXNVc2VTdHJpY3Qoc3RtdCkpIHRoaXMuc2V0U3RyaWN0KHRydWUpO1xuICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIG5vZGUuc291cmNlVHlwZSA9IHRoaXMub3B0aW9ucy5zb3VyY2VUeXBlO1xuICB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJQcm9ncmFtXCIpO1xufTtcblxudmFyIGxvb3BMYWJlbCA9IHsga2luZDogXCJsb29wXCIgfSxcbiAgICBzd2l0Y2hMYWJlbCA9IHsga2luZDogXCJzd2l0Y2hcIiB9O1xuXG5wcC5pc0xldCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5uYW1lIHx8IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYgfHwgdGhpcy52YWx1ZSAhPSBcImxldFwiKSByZXR1cm4gZmFsc2U7XG4gIF93aGl0ZXNwYWNlLnNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHRoaXMucG9zO1xuICB2YXIgc2tpcCA9IF93aGl0ZXNwYWNlLnNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7XG4gIHZhciBuZXh0ID0gdGhpcy5wb3MgKyBza2lwWzBdLmxlbmd0aCxcbiAgICAgIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgaWYgKG5leHRDaCA9PT0gOTEgfHwgbmV4dENoID09IDEyMykgcmV0dXJuIHRydWU7IC8vICd7JyBhbmQgJ1snXG4gIGlmIChfaWRlbnRpZmllci5pc0lkZW50aWZpZXJTdGFydChuZXh0Q2gsIHRydWUpKSB7XG4gICAgZm9yICh2YXIgcG9zID0gbmV4dCArIDE7IF9pZGVudGlmaWVyLmlzSWRlbnRpZmllckNoYXIodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcywgdHJ1ZSkpOyArK3Bvcykge31cbiAgICB2YXIgaWRlbnQgPSB0aGlzLmlucHV0LnNsaWNlKG5leHQsIHBvcyk7XG4gICAgaWYgKCF0aGlzLmlzS2V5d29yZChpZGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIFBhcnNlIGEgc2luZ2xlIHN0YXRlbWVudC5cbi8vXG4vLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuLy8gcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwuIFRoaXMgaXMgdG8gaGFuZGxlIGNhc2VzIGxpa2Vcbi8vIGBpZiAoZm9vKSAvYmxhaC8uZXhlYyhmb28pYCwgd2hlcmUgbG9va2luZyBhdCB0aGUgcHJldmlvdXMgdG9rZW5cbi8vIGRvZXMgbm90IGhlbHAuXG5cbnBwLnBhcnNlU3RhdGVtZW50ID0gZnVuY3Rpb24gKGRlY2xhcmF0aW9uLCB0b3BMZXZlbCkge1xuICB2YXIgc3RhcnR0eXBlID0gdGhpcy50eXBlLFxuICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksXG4gICAgICBraW5kID0gdW5kZWZpbmVkO1xuXG4gIGlmICh0aGlzLmlzTGV0KCkpIHtcbiAgICBzdGFydHR5cGUgPSBfdG9rZW50eXBlLnR5cGVzLl92YXI7XG4gICAga2luZCA9IFwibGV0XCI7XG4gIH1cblxuICAvLyBNb3N0IHR5cGVzIG9mIHN0YXRlbWVudHMgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGtleXdvcmQgdGhleVxuICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2ZcbiAgLy8gY29tcGxleGl0eS5cblxuICBzd2l0Y2ggKHN0YXJ0dHlwZSkge1xuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fYnJlYWs6Y2FzZSBfdG9rZW50eXBlLnR5cGVzLl9jb250aW51ZTpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChub2RlLCBzdGFydHR5cGUua2V5d29yZCk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9kZWJ1Z2dlcjpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9kbzpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRG9TdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9mb3I6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvclN0YXRlbWVudChub2RlKTtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX2Z1bmN0aW9uOlxuICAgICAgaWYgKCFkZWNsYXJhdGlvbiAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KG5vZGUpO1xuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fY2xhc3M6XG4gICAgICBpZiAoIWRlY2xhcmF0aW9uKSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3Mobm9kZSwgdHJ1ZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9pZjpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSWZTdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9yZXR1cm46XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVJldHVyblN0YXRlbWVudChub2RlKTtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX3N3aXRjaDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUpO1xuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fdGhyb3c6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVRocm93U3RhdGVtZW50KG5vZGUpO1xuICAgIGNhc2UgX3Rva2VudHlwZS50eXBlcy5fdHJ5OlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VUcnlTdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9jb25zdDpjYXNlIF90b2tlbnR5cGUudHlwZXMuX3ZhcjpcbiAgICAgIGtpbmQgPSBraW5kIHx8IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIWRlY2xhcmF0aW9uICYmIGtpbmQgIT0gXCJ2YXJcIikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVZhclN0YXRlbWVudChub2RlLCBraW5kKTtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX3doaWxlOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VXaGlsZVN0YXRlbWVudChub2RlKTtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuX3dpdGg6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVdpdGhTdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlTDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBjYXNlIF90b2tlbnR5cGUudHlwZXMuc2VtaTpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZSk7XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9leHBvcnQ6XG4gICAgY2FzZSBfdG9rZW50eXBlLnR5cGVzLl9pbXBvcnQ6XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmUpIHtcbiAgICAgICAgaWYgKCF0b3BMZXZlbCkgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIidpbXBvcnQnIGFuZCAnZXhwb3J0JyBtYXkgb25seSBhcHBlYXIgYXQgdGhlIHRvcCBsZXZlbFwiKTtcbiAgICAgICAgaWYgKCF0aGlzLmluTW9kdWxlKSB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBhcHBlYXIgb25seSB3aXRoICdzb3VyY2VUeXBlOiBtb2R1bGUnXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXJ0dHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5faW1wb3J0ID8gdGhpcy5wYXJzZUltcG9ydChub2RlKSA6IHRoaXMucGFyc2VFeHBvcnQobm9kZSk7XG5cbiAgICAvLyBJZiB0aGUgc3RhdGVtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGF0ZW1lbnQga2V5d29yZCBvciBhXG4gICAgLy8gYnJhY2UsIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudCBvciBMYWJlbGVkU3RhdGVtZW50LiBXZVxuICAgIC8vIHNpbXBseSBzdGFydCBwYXJzaW5nIGFuIGV4cHJlc3Npb24sIGFuZCBhZnRlcndhcmRzLCBpZiB0aGVcbiAgICAvLyBuZXh0IHRva2VuIGlzIGEgY29sb24gYW5kIHRoZSBleHByZXNzaW9uIHdhcyBhIHNpbXBsZVxuICAgIC8vIElkZW50aWZpZXIgbm9kZSwgd2Ugc3dpdGNoIHRvIGludGVycHJldGluZyBpdCBhcyBhIGxhYmVsLlxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbWF5YmVOYW1lID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIGlmIChzdGFydHR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMubmFtZSAmJiBleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuY29sb24pKSByZXR1cm4gdGhpcy5wYXJzZUxhYmVsZWRTdGF0ZW1lbnQobm9kZSwgbWF5YmVOYW1lLCBleHByKTtlbHNlIHJldHVybiB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBleHByKTtcbiAgfVxufTtcblxucHAucGFyc2VCcmVha0NvbnRpbnVlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIGtleXdvcmQpIHtcbiAgdmFyIGlzQnJlYWsgPSBrZXl3b3JkID09IFwiYnJlYWtcIjtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnNlbWkpIHx8IHRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIG5vZGUubGFiZWwgPSBudWxsO2Vsc2UgaWYgKHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5uYW1lKSB0aGlzLnVuZXhwZWN0ZWQoKTtlbHNlIHtcbiAgICBub2RlLmxhYmVsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgfVxuXG4gIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGFuIGFjdHVhbCBkZXN0aW5hdGlvbiB0byBicmVhayBvclxuICAvLyBjb250aW51ZSB0by5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBsYWIgPSB0aGlzLmxhYmVsc1tpXTtcbiAgICBpZiAobm9kZS5sYWJlbCA9PSBudWxsIHx8IGxhYi5uYW1lID09PSBub2RlLmxhYmVsLm5hbWUpIHtcbiAgICAgIGlmIChsYWIua2luZCAhPSBudWxsICYmIChpc0JyZWFrIHx8IGxhYi5raW5kID09PSBcImxvb3BcIikpIGJyZWFrO1xuICAgICAgaWYgKG5vZGUubGFiZWwgJiYgaXNCcmVhaykgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChpID09PSB0aGlzLmxhYmVscy5sZW5ndGgpIHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJVbnN5bnRhY3RpYyBcIiArIGtleXdvcmQpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIpO1xufTtcblxucHAucGFyc2VEZWJ1Z2dlclN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIik7XG59O1xuXG5wcC5wYXJzZURvU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChmYWxzZSk7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLl93aGlsZSk7XG4gIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnNlbWkpO2Vsc2UgdGhpcy5zZW1pY29sb24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRvV2hpbGVTdGF0ZW1lbnRcIik7XG59O1xuXG4vLyBEaXNhbWJpZ3VhdGluZyBiZXR3ZWVuIGEgYGZvcmAgYW5kIGEgYGZvcmAvYGluYCBvciBgZm9yYC9gb2ZgXG4vLyBsb29wIGlzIG5vbi10cml2aWFsLiBCYXNpY2FsbHksIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGluaXQgYHZhcmBcbi8vIHN0YXRlbWVudCBvciBleHByZXNzaW9uLCBkaXNhbGxvd2luZyB0aGUgYGluYCBvcGVyYXRvciAoc2VlXG4vLyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgcGFyc2VFeHByZXNzaW9uYCksIGFuZCB0aGVuIGNoZWNrXG4vLyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAgb3IgYG9mYC4gV2hlbiB0aGVyZSBpcyBubyBpbml0XG4vLyBwYXJ0IChzZW1pY29sb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMpLCBpdFxuLy8gaXMgYSByZWd1bGFyIGBmb3JgIGxvb3AuXG5cbnBwLnBhcnNlRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcbiAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5wYXJlbkwpO1xuICBpZiAodGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnNlbWkpIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIG51bGwpO1xuICB2YXIgaXNMZXQgPSB0aGlzLmlzTGV0KCk7XG4gIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX3ZhciB8fCB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2NvbnN0IHx8IGlzTGV0KSB7XG4gICAgdmFyIF9pbml0ID0gdGhpcy5zdGFydE5vZGUoKSxcbiAgICAgICAga2luZCA9IGlzTGV0ID8gXCJsZXRcIiA6IHRoaXMudmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5wYXJzZVZhcihfaW5pdCwgdHJ1ZSwga2luZCk7XG4gICAgdGhpcy5maW5pc2hOb2RlKF9pbml0LCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIik7XG4gICAgaWYgKCh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2luIHx8IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpICYmIF9pbml0LmRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgIShraW5kICE9PSBcInZhclwiICYmIF9pbml0LmRlY2xhcmF0aW9uc1swXS5pbml0KSkgcmV0dXJuIHRoaXMucGFyc2VGb3JJbihub2RlLCBfaW5pdCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgX2luaXQpO1xuICB9XG4gIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0geyBzaG9ydGhhbmRBc3NpZ246IDAsIHRyYWlsaW5nQ29tbWE6IDAgfTtcbiAgdmFyIGluaXQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbih0cnVlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5faW4gfHwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkge1xuICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuICAgIHRoaXMudG9Bc3NpZ25hYmxlKGluaXQpO1xuICAgIHRoaXMuY2hlY2tMVmFsKGluaXQpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlRm9ySW4obm9kZSwgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgaW5pdCk7XG59O1xuXG5wcC5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSwgdHJ1ZSk7XG59O1xuXG5wcC5wYXJzZUlmU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudChmYWxzZSk7XG4gIG5vZGUuYWx0ZXJuYXRlID0gdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5fZWxzZSkgPyB0aGlzLnBhcnNlU3RhdGVtZW50KGZhbHNlKSA6IG51bGw7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJZlN0YXRlbWVudFwiKTtcbn07XG5cbnBwLnBhcnNlUmV0dXJuU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKCF0aGlzLmluRnVuY3Rpb24gJiYgIXRoaXMub3B0aW9ucy5hbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbikgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb25cIik7XG4gIHRoaXMubmV4dCgpO1xuXG4gIC8vIEluIGByZXR1cm5gIChhbmQgYGJyZWFrYC9gY29udGludWVgKSwgdGhlIGtleXdvcmRzIHdpdGhcbiAgLy8gb3B0aW9uYWwgYXJndW1lbnRzLCB3ZSBlYWdlcmx5IGxvb2sgZm9yIGEgc2VtaWNvbG9uIG9yIHRoZVxuICAvLyBwb3NzaWJpbGl0eSB0byBpbnNlcnQgb25lLlxuXG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnNlbWkpIHx8IHRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIG5vZGUuYXJndW1lbnQgPSBudWxsO2Vsc2Uge1xuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO3RoaXMuc2VtaWNvbG9uKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlJldHVyblN0YXRlbWVudFwiKTtcbn07XG5cbnBwLnBhcnNlU3dpdGNoU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICBub2RlLmNhc2VzID0gW107XG4gIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMuYnJhY2VMKTtcbiAgdGhpcy5sYWJlbHMucHVzaChzd2l0Y2hMYWJlbCk7XG5cbiAgLy8gU3RhdGVtZW50cyB1bmRlciBtdXN0IGJlIGdyb3VwZWQgKGJ5IGxhYmVsKSBpbiBTd2l0Y2hDYXNlXG4gIC8vIG5vZGVzLiBgY3VyYCBpcyB1c2VkIHRvIGtlZXAgdGhlIG5vZGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5XG4gIC8vIGFkZGluZyBzdGF0ZW1lbnRzIHRvLlxuXG4gIGZvciAodmFyIGN1ciwgc2F3RGVmYXVsdCA9IGZhbHNlOyB0aGlzLnR5cGUgIT0gX3Rva2VudHlwZS50eXBlcy5icmFjZVI7KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5fY2FzZSB8fCB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2RlZmF1bHQpIHtcbiAgICAgIHZhciBpc0Nhc2UgPSB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2Nhc2U7XG4gICAgICBpZiAoY3VyKSB0aGlzLmZpbmlzaE5vZGUoY3VyLCBcIlN3aXRjaENhc2VcIik7XG4gICAgICBub2RlLmNhc2VzLnB1c2goY3VyID0gdGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICBjdXIuY29uc2VxdWVudCA9IFtdO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoaXNDYXNlKSB7XG4gICAgICAgIGN1ci50ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzYXdEZWZhdWx0KSB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5sYXN0VG9rU3RhcnQsIFwiTXVsdGlwbGUgZGVmYXVsdCBjbGF1c2VzXCIpO1xuICAgICAgICBzYXdEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgY3VyLnRlc3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5jb2xvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY3VyKSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIGN1ci5jb25zZXF1ZW50LnB1c2godGhpcy5wYXJzZVN0YXRlbWVudCh0cnVlKSk7XG4gICAgfVxuICB9XG4gIGlmIChjdXIpIHRoaXMuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTtcbiAgdGhpcy5uZXh0KCk7IC8vIENsb3NpbmcgYnJhY2VcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTd2l0Y2hTdGF0ZW1lbnRcIik7XG59O1xuXG5wcC5wYXJzZVRocm93U3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmIChfd2hpdGVzcGFjZS5saW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpKSB0aGlzLnJhaXNlKHRoaXMubGFzdFRva0VuZCwgXCJJbGxlZ2FsIG5ld2xpbmUgYWZ0ZXIgdGhyb3dcIik7XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhyb3dTdGF0ZW1lbnRcIik7XG59O1xuXG4vLyBSZXVzZWQgZW1wdHkgYXJyYXkgYWRkZWQgZm9yIG5vZGUgZmllbGRzIHRoYXQgYXJlIGFsd2F5cyBlbXB0eS5cblxudmFyIGVtcHR5ID0gW107XG5cbnBwLnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgbm9kZS5oYW5kbGVyID0gbnVsbDtcbiAgaWYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5fY2F0Y2gpIHtcbiAgICB2YXIgY2xhdXNlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCk7XG4gICAgY2xhdXNlLnBhcmFtID0gdGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7XG4gICAgdGhpcy5jaGVja0xWYWwoY2xhdXNlLnBhcmFtLCB0cnVlKTtcbiAgICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuUik7XG4gICAgY2xhdXNlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICB9XG4gIG5vZGUuZmluYWxpemVyID0gdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5fZmluYWxseSkgPyB0aGlzLnBhcnNlQmxvY2soKSA6IG51bGw7XG4gIGlmICghbm9kZS5oYW5kbGVyICYmICFub2RlLmZpbmFsaXplcikgdGhpcy5yYWlzZShub2RlLnN0YXJ0LCBcIk1pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2VcIik7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUcnlTdGF0ZW1lbnRcIik7XG59O1xuXG5wcC5wYXJzZVZhclN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBraW5kKSB7XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLnBhcnNlVmFyKG5vZGUsIGZhbHNlLCBraW5kKTtcbiAgdGhpcy5zZW1pY29sb24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIik7XG59O1xuXG5wcC5wYXJzZVdoaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KGZhbHNlKTtcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJXaGlsZVN0YXRlbWVudFwiKTtcbn07XG5cbnBwLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIGlmICh0aGlzLnN0cmljdCkgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZVwiKTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUub2JqZWN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KGZhbHNlKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIldpdGhTdGF0ZW1lbnRcIik7XG59O1xuXG5wcC5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVN0YXRlbWVudFwiKTtcbn07XG5cbnBwLnBhcnNlTGFiZWxlZFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBtYXliZU5hbWUsIGV4cHIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLmxhYmVsc1tpXS5uYW1lID09PSBtYXliZU5hbWUpIHRoaXMucmFpc2UoZXhwci5zdGFydCwgXCJMYWJlbCAnXCIgKyBtYXliZU5hbWUgKyBcIicgaXMgYWxyZWFkeSBkZWNsYXJlZFwiKTtcbiAgfXZhciBraW5kID0gdGhpcy50eXBlLmlzTG9vcCA/IFwibG9vcFwiIDogdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLl9zd2l0Y2ggPyBcInN3aXRjaFwiIDogbnVsbDtcbiAgZm9yICh2YXIgaSA9IHRoaXMubGFiZWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhYmVsID0gdGhpcy5sYWJlbHNbaV07XG4gICAgaWYgKGxhYmVsLnN0YXRlbWVudFN0YXJ0ID09IG5vZGUuc3RhcnQpIHtcbiAgICAgIGxhYmVsLnN0YXRlbWVudFN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgIGxhYmVsLmtpbmQgPSBraW5kO1xuICAgIH0gZWxzZSBicmVhaztcbiAgfVxuICB0aGlzLmxhYmVscy5wdXNoKHsgbmFtZTogbWF5YmVOYW1lLCBraW5kOiBraW5kLCBzdGF0ZW1lbnRTdGFydDogdGhpcy5zdGFydCB9KTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCh0cnVlKTtcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIG5vZGUubGFiZWwgPSBleHByO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGFiZWxlZFN0YXRlbWVudFwiKTtcbn07XG5cbnBwLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBleHByKSB7XG4gIG5vZGUuZXhwcmVzc2lvbiA9IGV4cHI7XG4gIHRoaXMuc2VtaWNvbG9uKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpO1xufTtcblxuLy8gUGFyc2UgYSBzZW1pY29sb24tZW5jbG9zZWQgYmxvY2sgb2Ygc3RhdGVtZW50cywgaGFuZGxpbmcgYFwidXNlXG4vLyBzdHJpY3RcImAgZGVjbGFyYXRpb25zIHdoZW4gYGFsbG93U3RyaWN0YCBpcyB0cnVlICh1c2VkIGZvclxuLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxucHAucGFyc2VCbG9jayA9IGZ1bmN0aW9uIChhbGxvd1N0cmljdCkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksXG4gICAgICBmaXJzdCA9IHRydWUsXG4gICAgICBvbGRTdHJpY3QgPSB1bmRlZmluZWQ7XG4gIG5vZGUuYm9keSA9IFtdO1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLmJyYWNlTCk7XG4gIHdoaWxlICghdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5icmFjZVIpKSB7XG4gICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KHRydWUpO1xuICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpO1xuICAgIGlmIChmaXJzdCAmJiBhbGxvd1N0cmljdCAmJiB0aGlzLmlzVXNlU3RyaWN0KHN0bXQpKSB7XG4gICAgICBvbGRTdHJpY3QgPSB0aGlzLnN0cmljdDtcbiAgICAgIHRoaXMuc2V0U3RyaWN0KHRoaXMuc3RyaWN0ID0gdHJ1ZSk7XG4gICAgfVxuICAgIGZpcnN0ID0gZmFsc2U7XG4gIH1cbiAgaWYgKG9sZFN0cmljdCA9PT0gZmFsc2UpIHRoaXMuc2V0U3RyaWN0KGZhbHNlKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkJsb2NrU3RhdGVtZW50XCIpO1xufTtcblxuLy8gUGFyc2UgYSByZWd1bGFyIGBmb3JgIGxvb3AuIFRoZSBkaXNhbWJpZ3VhdGlvbiBjb2RlIGluXG4vLyBgcGFyc2VTdGF0ZW1lbnRgIHdpbGwgYWxyZWFkeSBoYXZlIHBhcnNlZCB0aGUgaW5pdCBzdGF0ZW1lbnQgb3Jcbi8vIGV4cHJlc3Npb24uXG5cbnBwLnBhcnNlRm9yID0gZnVuY3Rpb24gKG5vZGUsIGluaXQpIHtcbiAgbm9kZS5pbml0ID0gaW5pdDtcbiAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5zZW1pKTtcbiAgbm9kZS50ZXN0ID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnNlbWkgPyBudWxsIDogdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5zZW1pKTtcbiAgbm9kZS51cGRhdGUgPSB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMucGFyZW5SID8gbnVsbCA6IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMucGFyZW5SKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChmYWxzZSk7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpO1xufTtcblxuLy8gUGFyc2UgYSBgZm9yYC9gaW5gIGFuZCBgZm9yYC9gb2ZgIGxvb3AsIHdoaWNoIGFyZSBhbG1vc3Rcbi8vIHNhbWUgZnJvbSBwYXJzZXIncyBwZXJzcGVjdGl2ZS5cblxucHAucGFyc2VGb3JJbiA9IGZ1bmN0aW9uIChub2RlLCBpbml0KSB7XG4gIHZhciB0eXBlID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLl9pbiA/IFwiRm9ySW5TdGF0ZW1lbnRcIiA6IFwiRm9yT2ZTdGF0ZW1lbnRcIjtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUubGVmdCA9IGluaXQ7XG4gIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuUik7XG4gIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoZmFsc2UpO1xuICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbn07XG5cbi8vIFBhcnNlIGEgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuXG5cbnBwLnBhcnNlVmFyID0gZnVuY3Rpb24gKG5vZGUsIGlzRm9yLCBraW5kKSB7XG4gIG5vZGUuZGVjbGFyYXRpb25zID0gW107XG4gIG5vZGUua2luZCA9IGtpbmQ7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZGVjbCA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5wYXJzZVZhcklkKGRlY2wpO1xuICAgIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLmVxKSkge1xuICAgICAgZGVjbC5pbml0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGlzRm9yKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09IFwiY29uc3RcIiAmJiAhKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5faW4gfHwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH0gZWxzZSBpZiAoZGVjbC5pZC50eXBlICE9IFwiSWRlbnRpZmllclwiICYmICEoaXNGb3IgJiYgKHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5faW4gfHwgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpKSB7XG4gICAgICB0aGlzLnJhaXNlKHRoaXMubGFzdFRva0VuZCwgXCJDb21wbGV4IGJpbmRpbmcgcGF0dGVybnMgcmVxdWlyZSBhbiBpbml0aWFsaXphdGlvbiB2YWx1ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjbC5pbml0ID0gbnVsbDtcbiAgICB9XG4gICAgbm9kZS5kZWNsYXJhdGlvbnMucHVzaCh0aGlzLmZpbmlzaE5vZGUoZGVjbCwgXCJWYXJpYWJsZURlY2xhcmF0b3JcIikpO1xuICAgIGlmICghdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5jb21tYSkpIGJyZWFrO1xuICB9XG4gIHJldHVybiBub2RlO1xufTtcblxucHAucGFyc2VWYXJJZCA9IGZ1bmN0aW9uIChkZWNsKSB7XG4gIGRlY2wuaWQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgdGhpcy5jaGVja0xWYWwoZGVjbC5pZCwgdHJ1ZSk7XG59O1xuXG4vLyBQYXJzZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG9yIGxpdGVyYWwgKGRlcGVuZGluZyBvbiB0aGVcbi8vIGBpc1N0YXRlbWVudGAgcGFyYW1ldGVyKS5cblxucHAucGFyc2VGdW5jdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBpc1N0YXRlbWVudCwgYWxsb3dFeHByZXNzaW9uQm9keSkge1xuICB0aGlzLmluaXRGdW5jdGlvbihub2RlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSBub2RlLmdlbmVyYXRvciA9IHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuc3Rhcik7XG4gIHZhciBvbGRJbkdlbiA9IHRoaXMuaW5HZW5lcmF0b3I7XG4gIHRoaXMuaW5HZW5lcmF0b3IgPSBub2RlLmdlbmVyYXRvcjtcbiAgaWYgKGlzU3RhdGVtZW50IHx8IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5uYW1lKSBub2RlLmlkID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gIHRoaXMucGFyc2VGdW5jdGlvblBhcmFtcyhub2RlKTtcbiAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCBhbGxvd0V4cHJlc3Npb25Cb2R5KTtcbiAgdGhpcy5pbkdlbmVyYXRvciA9IG9sZEluR2VuO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzU3RhdGVtZW50ID8gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKTtcbn07XG5cbnBwLnBhcnNlRnVuY3Rpb25QYXJhbXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLnBhcmVuTCk7XG4gIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KF90b2tlbnR5cGUudHlwZXMucGFyZW5SLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuLy8gUGFyc2UgYSBjbGFzcyBkZWNsYXJhdGlvbiBvciBsaXRlcmFsIChkZXBlbmRpbmcgb24gdGhlXG4vLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbnBwLnBhcnNlQ2xhc3MgPSBmdW5jdGlvbiAobm9kZSwgaXNTdGF0ZW1lbnQpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMucGFyc2VDbGFzc0lkKG5vZGUsIGlzU3RhdGVtZW50KTtcbiAgdGhpcy5wYXJzZUNsYXNzU3VwZXIobm9kZSk7XG4gIHZhciBjbGFzc0JvZHkgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB2YXIgaGFkQ29uc3RydWN0b3IgPSBmYWxzZTtcbiAgY2xhc3NCb2R5LmJvZHkgPSBbXTtcbiAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5icmFjZUwpO1xuICB3aGlsZSAoIXRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuYnJhY2VSKSkge1xuICAgIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnNlbWkpKSBjb250aW51ZTtcbiAgICB2YXIgbWV0aG9kID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB2YXIgaXNHZW5lcmF0b3IgPSB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnN0YXIpO1xuICAgIHZhciBpc01heWJlU3RhdGljID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLm5hbWUgJiYgdGhpcy52YWx1ZSA9PT0gXCJzdGF0aWNcIjtcbiAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCk7XG4gICAgbWV0aG9kW1wic3RhdGljXCJdID0gaXNNYXliZVN0YXRpYyAmJiB0aGlzLnR5cGUgIT09IF90b2tlbnR5cGUudHlwZXMucGFyZW5MO1xuICAgIGlmIChtZXRob2RbXCJzdGF0aWNcIl0pIHtcbiAgICAgIGlmIChpc0dlbmVyYXRvcikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuc3Rhcik7XG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCk7XG4gICAgfVxuICAgIG1ldGhvZC5raW5kID0gXCJtZXRob2RcIjtcbiAgICB2YXIgaXNHZXRTZXQgPSBmYWxzZTtcbiAgICBpZiAoIW1ldGhvZC5jb21wdXRlZCkge1xuICAgICAgdmFyIGtleSA9IG1ldGhvZC5rZXk7XG5cbiAgICAgIGlmICghaXNHZW5lcmF0b3IgJiYga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5wYXJlbkwgJiYgKGtleS5uYW1lID09PSBcImdldFwiIHx8IGtleS5uYW1lID09PSBcInNldFwiKSkge1xuICAgICAgICBpc0dldFNldCA9IHRydWU7XG4gICAgICAgIG1ldGhvZC5raW5kID0ga2V5Lm5hbWU7XG4gICAgICAgIGtleSA9IHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUobWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWV0aG9kW1wic3RhdGljXCJdICYmIChrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYga2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCBrZXkudHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYga2V5LnZhbHVlID09PSBcImNvbnN0cnVjdG9yXCIpKSB7XG4gICAgICAgIGlmIChoYWRDb25zdHJ1Y3RvcikgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiRHVwbGljYXRlIGNvbnN0cnVjdG9yIGluIHRoZSBzYW1lIGNsYXNzXCIpO1xuICAgICAgICBpZiAoaXNHZXRTZXQpIHRoaXMucmFpc2Uoa2V5LnN0YXJ0LCBcIkNvbnN0cnVjdG9yIGNhbid0IGhhdmUgZ2V0L3NldCBtb2RpZmllclwiKTtcbiAgICAgICAgaWYgKGlzR2VuZXJhdG9yKSB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvclwiKTtcbiAgICAgICAgbWV0aG9kLmtpbmQgPSBcImNvbnN0cnVjdG9yXCI7XG4gICAgICAgIGhhZENvbnN0cnVjdG9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYXJzZUNsYXNzTWV0aG9kKGNsYXNzQm9keSwgbWV0aG9kLCBpc0dlbmVyYXRvcik7XG4gICAgaWYgKGlzR2V0U2V0KSB7XG4gICAgICB2YXIgcGFyYW1Db3VudCA9IG1ldGhvZC5raW5kID09PSBcImdldFwiID8gMCA6IDE7XG4gICAgICBpZiAobWV0aG9kLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IHBhcmFtQ291bnQpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gbWV0aG9kLnZhbHVlLnN0YXJ0O1xuICAgICAgICBpZiAobWV0aG9kLmtpbmQgPT09IFwiZ2V0XCIpIHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJnZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcGFyYW1zXCIpO2Vsc2UgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcInNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2Qua2luZCA9PT0gXCJzZXRcIiAmJiBtZXRob2QudmFsdWUucGFyYW1zWzBdLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIikgdGhpcy5yYWlzZShtZXRob2QudmFsdWUucGFyYW1zWzBdLnN0YXJ0LCBcIlNldHRlciBjYW5ub3QgdXNlIHJlc3QgcGFyYW1zXCIpO1xuICAgIH1cbiAgfVxuICBub2RlLmJvZHkgPSB0aGlzLmZpbmlzaE5vZGUoY2xhc3NCb2R5LCBcIkNsYXNzQm9keVwiKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1N0YXRlbWVudCA/IFwiQ2xhc3NEZWNsYXJhdGlvblwiIDogXCJDbGFzc0V4cHJlc3Npb25cIik7XG59O1xuXG5wcC5wYXJzZUNsYXNzTWV0aG9kID0gZnVuY3Rpb24gKGNsYXNzQm9keSwgbWV0aG9kLCBpc0dlbmVyYXRvcikge1xuICBtZXRob2QudmFsdWUgPSB0aGlzLnBhcnNlTWV0aG9kKGlzR2VuZXJhdG9yKTtcbiAgY2xhc3NCb2R5LmJvZHkucHVzaCh0aGlzLmZpbmlzaE5vZGUobWV0aG9kLCBcIk1ldGhvZERlZmluaXRpb25cIikpO1xufTtcblxucHAucGFyc2VDbGFzc0lkID0gZnVuY3Rpb24gKG5vZGUsIGlzU3RhdGVtZW50KSB7XG4gIG5vZGUuaWQgPSB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMubmFtZSA/IHRoaXMucGFyc2VJZGVudCgpIDogaXNTdGF0ZW1lbnQgPyB0aGlzLnVuZXhwZWN0ZWQoKSA6IG51bGw7XG59O1xuXG5wcC5wYXJzZUNsYXNzU3VwZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlLnN1cGVyQ2xhc3MgPSB0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLl9leHRlbmRzKSA/IHRoaXMucGFyc2VFeHByU3Vic2NyaXB0cygpIDogbnVsbDtcbn07XG5cbi8vIFBhcnNlcyBtb2R1bGUgZXhwb3J0IGRlY2xhcmF0aW9uLlxuXG5wcC5wYXJzZUV4cG9ydCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICAvLyBleHBvcnQgKiBmcm9tICcuLi4nXG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLnN0YXIpKSB7XG4gICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZnJvbVwiKTtcbiAgICBub2RlLnNvdXJjZSA9IHRoaXMudHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5zdHJpbmcgPyB0aGlzLnBhcnNlRXhwckF0b20oKSA6IHRoaXMudW5leHBlY3RlZCgpO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIpO1xuICB9XG4gIGlmICh0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLl9kZWZhdWx0KSkge1xuICAgIC8vIGV4cG9ydCBkZWZhdWx0IC4uLlxuICAgIHZhciBwYXJlbnMgPSB0aGlzLnR5cGUgPT0gX3Rva2VudHlwZS50eXBlcy5wYXJlbkw7XG4gICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICB2YXIgbmVlZHNTZW1pID0gdHJ1ZTtcbiAgICBpZiAoIXBhcmVucyAmJiAoZXhwci50eXBlID09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgZXhwci50eXBlID09IFwiQ2xhc3NFeHByZXNzaW9uXCIpKSB7XG4gICAgICBuZWVkc1NlbWkgPSBmYWxzZTtcbiAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgIGV4cHIudHlwZSA9IGV4cHIudHlwZSA9PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiID8gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgOiBcIkNsYXNzRGVjbGFyYXRpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5kZWNsYXJhdGlvbiA9IGV4cHI7XG4gICAgaWYgKG5lZWRzU2VtaSkgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpO1xuICB9XG4gIC8vIGV4cG9ydCB2YXJ8Y29uc3R8bGV0fGZ1bmN0aW9ufGNsYXNzIC4uLlxuICBpZiAodGhpcy5zaG91bGRQYXJzZUV4cG9ydFN0YXRlbWVudCgpKSB7XG4gICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VTdGF0ZW1lbnQodHJ1ZSk7XG4gICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIGV4cG9ydCB7IHgsIHkgYXMgeiB9IFtmcm9tICcuLi4nXVxuICAgIG5vZGUuZGVjbGFyYXRpb24gPSBudWxsO1xuICAgIG5vZGUuc3BlY2lmaWVycyA9IHRoaXMucGFyc2VFeHBvcnRTcGVjaWZpZXJzKCk7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbChcImZyb21cIikpIHtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoZWNrIGZvciBrZXl3b3JkcyB1c2VkIGFzIGxvY2FsIG5hbWVzXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuc3BlY2lmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5rZXl3b3Jkcy50ZXN0KG5vZGUuc3BlY2lmaWVyc1tpXS5sb2NhbC5uYW1lKSB8fCB0aGlzLnJlc2VydmVkV29yZHMudGVzdChub2RlLnNwZWNpZmllcnNbaV0ubG9jYWwubmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQobm9kZS5zcGVjaWZpZXJzW2ldLmxvY2FsLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlLnNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIik7XG59O1xuXG5wcC5zaG91bGRQYXJzZUV4cG9ydFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudHlwZS5rZXl3b3JkIHx8IHRoaXMuaXNMZXQoKTtcbn07XG5cbi8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBleHBvcnRzLlxuXG5wcC5wYXJzZUV4cG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlcyA9IFtdLFxuICAgICAgZmlyc3QgPSB0cnVlO1xuICAvLyBleHBvcnQgeyB4LCB5IGFzIHogfSBbZnJvbSAnLi4uJ11cbiAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5icmFjZUwpO1xuICB3aGlsZSAoIXRoaXMuZWF0KF90b2tlbnR5cGUudHlwZXMuYnJhY2VSKSkge1xuICAgIGlmICghZmlyc3QpIHtcbiAgICAgIHRoaXMuZXhwZWN0KF90b2tlbnR5cGUudHlwZXMuY29tbWEpO1xuICAgICAgaWYgKHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKF90b2tlbnR5cGUudHlwZXMuYnJhY2VSKSkgYnJlYWs7XG4gICAgfSBlbHNlIGZpcnN0ID0gZmFsc2U7XG5cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgbm9kZS5sb2NhbCA9IHRoaXMucGFyc2VJZGVudCh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2RlZmF1bHQpO1xuICAgIG5vZGUuZXhwb3J0ZWQgPSB0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSA/IHRoaXMucGFyc2VJZGVudCh0cnVlKSA6IG5vZGUubG9jYWw7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIikpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn07XG5cbi8vIFBhcnNlcyBpbXBvcnQgZGVjbGFyYXRpb24uXG5cbnBwLnBhcnNlSW1wb3J0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIC8vIGltcG9ydCAnLi4uJ1xuICBpZiAodGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnN0cmluZykge1xuICAgIG5vZGUuc3BlY2lmaWVycyA9IGVtcHR5O1xuICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5zcGVjaWZpZXJzID0gdGhpcy5wYXJzZUltcG9ydFNwZWNpZmllcnMoKTtcbiAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJmcm9tXCIpO1xuICAgIG5vZGUuc291cmNlID0gdGhpcy50eXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbiAgdGhpcy5zZW1pY29sb24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpO1xufTtcblxuLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGltcG9ydHMuXG5cbnBwLnBhcnNlSW1wb3J0U3BlY2lmaWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGVzID0gW10sXG4gICAgICBmaXJzdCA9IHRydWU7XG4gIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMubmFtZSkge1xuICAgIC8vIGltcG9ydCBkZWZhdWx0T2JqLCB7IHgsIHkgYXMgeiB9IGZyb20gJy4uLidcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgbm9kZS5sb2NhbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIHRoaXMuY2hlY2tMVmFsKG5vZGUubG9jYWwsIHRydWUpO1xuICAgIG5vZGVzLnB1c2godGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSk7XG4gICAgaWYgKCF0aGlzLmVhdChfdG9rZW50eXBlLnR5cGVzLmNvbW1hKSkgcmV0dXJuIG5vZGVzO1xuICB9XG4gIGlmICh0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuc3Rhcikge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJhc1wiKTtcbiAgICBub2RlLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgdGhpcy5jaGVja0xWYWwobm9kZS5sb2NhbCwgdHJ1ZSk7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIikpO1xuICAgIHJldHVybiBub2RlcztcbiAgfVxuICB0aGlzLmV4cGVjdChfdG9rZW50eXBlLnR5cGVzLmJyYWNlTCk7XG4gIHdoaWxlICghdGhpcy5lYXQoX3Rva2VudHlwZS50eXBlcy5icmFjZVIpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcy5leHBlY3QoX3Rva2VudHlwZS50eXBlcy5jb21tYSk7XG4gICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEoX3Rva2VudHlwZS50eXBlcy5icmFjZVIpKSBicmVhaztcbiAgICB9IGVsc2UgZmlyc3QgPSBmYWxzZTtcblxuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBub2RlLmltcG9ydGVkID0gdGhpcy5wYXJzZUlkZW50KHRydWUpO1xuICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSkge1xuICAgICAgbm9kZS5sb2NhbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmxvY2FsID0gbm9kZS5pbXBvcnRlZDtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZChub2RlLmxvY2FsLm5hbWUpKSB0aGlzLnVuZXhwZWN0ZWQobm9kZS5sb2NhbC5zdGFydCk7XG4gICAgICBpZiAodGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0LnRlc3Qobm9kZS5sb2NhbC5uYW1lKSkgdGhpcy5yYWlzZShub2RlLmxvY2FsLnN0YXJ0LCBcIlRoZSBrZXl3b3JkICdcIiArIG5vZGUubG9jYWwubmFtZSArIFwiJyBpcyByZXNlcnZlZFwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja0xWYWwobm9kZS5sb2NhbCwgdHJ1ZSk7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnRTcGVjaWZpZXJcIikpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn07XG5cbn0se1wiLi9pZGVudGlmaWVyXCI6MixcIi4vc3RhdGVcIjoxMCxcIi4vdG9rZW50eXBlXCI6MTQsXCIuL3doaXRlc3BhY2VcIjoxNn1dLDEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIFRoZSBhbGdvcml0aG0gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlZ2V4cCBjYW4gYXBwZWFyIGF0IGFcbi8vIGdpdmVuIHBvaW50IGluIHRoZSBwcm9ncmFtIGlzIGxvb3NlbHkgYmFzZWQgb24gc3dlZXQuanMnIGFwcHJvYWNoLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3N3ZWV0LmpzL3dpa2kvZGVzaWduXG5cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3N0YXRlID0gX2RlcmVxXyhcIi4vc3RhdGVcIik7XG5cbnZhciBfdG9rZW50eXBlID0gX2RlcmVxXyhcIi4vdG9rZW50eXBlXCIpO1xuXG52YXIgX3doaXRlc3BhY2UgPSBfZGVyZXFfKFwiLi93aGl0ZXNwYWNlXCIpO1xuXG52YXIgVG9rQ29udGV4dCA9IGZ1bmN0aW9uIFRva0NvbnRleHQodG9rZW4sIGlzRXhwciwgcHJlc2VydmVTcGFjZSwgb3ZlcnJpZGUpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRva0NvbnRleHQpO1xuXG4gIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgdGhpcy5pc0V4cHIgPSAhIWlzRXhwcjtcbiAgdGhpcy5wcmVzZXJ2ZVNwYWNlID0gISFwcmVzZXJ2ZVNwYWNlO1xuICB0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7XG59O1xuXG5leHBvcnRzLlRva0NvbnRleHQgPSBUb2tDb250ZXh0O1xudmFyIHR5cGVzID0ge1xuICBiX3N0YXQ6IG5ldyBUb2tDb250ZXh0KFwie1wiLCBmYWxzZSksXG4gIGJfZXhwcjogbmV3IFRva0NvbnRleHQoXCJ7XCIsIHRydWUpLFxuICBiX3RtcGw6IG5ldyBUb2tDb250ZXh0KFwiJHtcIiwgdHJ1ZSksXG4gIHBfc3RhdDogbmV3IFRva0NvbnRleHQoXCIoXCIsIGZhbHNlKSxcbiAgcF9leHByOiBuZXcgVG9rQ29udGV4dChcIihcIiwgdHJ1ZSksXG4gIHFfdG1wbDogbmV3IFRva0NvbnRleHQoXCJgXCIsIHRydWUsIHRydWUsIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAucmVhZFRtcGxUb2tlbigpO1xuICB9KSxcbiAgZl9leHByOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIHRydWUpXG59O1xuXG5leHBvcnRzLnR5cGVzID0gdHlwZXM7XG52YXIgcHAgPSBfc3RhdGUuUGFyc2VyLnByb3RvdHlwZTtcblxucHAuaW5pdGlhbENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdHlwZXMuYl9zdGF0XTtcbn07XG5cbnBwLmJyYWNlSXNCbG9jayA9IGZ1bmN0aW9uIChwcmV2VHlwZSkge1xuICBpZiAocHJldlR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuY29sb24pIHtcbiAgICB2YXIgX3BhcmVudCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuICAgIGlmIChfcGFyZW50ID09PSB0eXBlcy5iX3N0YXQgfHwgX3BhcmVudCA9PT0gdHlwZXMuYl9leHByKSByZXR1cm4gIV9wYXJlbnQuaXNFeHByO1xuICB9XG4gIGlmIChwcmV2VHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5fcmV0dXJuKSByZXR1cm4gX3doaXRlc3BhY2UubGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsIHRoaXMuc3RhcnQpKTtcbiAgaWYgKHByZXZUeXBlID09PSBfdG9rZW50eXBlLnR5cGVzLl9lbHNlIHx8IHByZXZUeXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnNlbWkgfHwgcHJldlR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuZW9mIHx8IHByZXZUeXBlID09PSBfdG9rZW50eXBlLnR5cGVzLnBhcmVuUikgcmV0dXJuIHRydWU7XG4gIGlmIChwcmV2VHlwZSA9PSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlTCkgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCgpID09PSB0eXBlcy5iX3N0YXQ7XG4gIHJldHVybiAhdGhpcy5leHByQWxsb3dlZDtcbn07XG5cbnBwLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbiAocHJldlR5cGUpIHtcbiAgdmFyIHVwZGF0ZSA9IHVuZGVmaW5lZCxcbiAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG4gIGlmICh0eXBlLmtleXdvcmQgJiYgcHJldlR5cGUgPT0gX3Rva2VudHlwZS50eXBlcy5kb3QpIHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTtlbHNlIGlmICh1cGRhdGUgPSB0eXBlLnVwZGF0ZUNvbnRleHQpIHVwZGF0ZS5jYWxsKHRoaXMsIHByZXZUeXBlKTtlbHNlIHRoaXMuZXhwckFsbG93ZWQgPSB0eXBlLmJlZm9yZUV4cHI7XG59O1xuXG4vLyBUb2tlbi1zcGVjaWZpYyBjb250ZXh0IHVwZGF0ZSBjb2RlXG5cbl90b2tlbnR5cGUudHlwZXMucGFyZW5SLnVwZGF0ZUNvbnRleHQgPSBfdG9rZW50eXBlLnR5cGVzLmJyYWNlUi51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jb250ZXh0Lmxlbmd0aCA9PSAxKSB7XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvdXQgPSB0aGlzLmNvbnRleHQucG9wKCk7XG4gIGlmIChvdXQgPT09IHR5cGVzLmJfc3RhdCAmJiB0aGlzLmN1ckNvbnRleHQoKSA9PT0gdHlwZXMuZl9leHByKSB7XG4gICAgdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgIHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXQgPT09IHR5cGVzLmJfdG1wbCkge1xuICAgIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZXhwckFsbG93ZWQgPSAhb3V0LmlzRXhwcjtcbiAgfVxufTtcblxuX3Rva2VudHlwZS50eXBlcy5icmFjZUwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChwcmV2VHlwZSkge1xuICB0aGlzLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayhwcmV2VHlwZSkgPyB0eXBlcy5iX3N0YXQgOiB0eXBlcy5iX2V4cHIpO1xuICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbn07XG5cbl90b2tlbnR5cGUudHlwZXMuZG9sbGFyQnJhY2VMLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29udGV4dC5wdXNoKHR5cGVzLmJfdG1wbCk7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xufTtcblxuX3Rva2VudHlwZS50eXBlcy5wYXJlbkwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChwcmV2VHlwZSkge1xuICB2YXIgc3RhdGVtZW50UGFyZW5zID0gcHJldlR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX2lmIHx8IHByZXZUeXBlID09PSBfdG9rZW50eXBlLnR5cGVzLl9mb3IgfHwgcHJldlR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX3dpdGggfHwgcHJldlR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMuX3doaWxlO1xuICB0aGlzLmNvbnRleHQucHVzaChzdGF0ZW1lbnRQYXJlbnMgPyB0eXBlcy5wX3N0YXQgOiB0eXBlcy5wX2V4cHIpO1xuICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbn07XG5cbl90b2tlbnR5cGUudHlwZXMuaW5jRGVjLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIHRva0V4cHJBbGxvd2VkIHN0YXlzIHVuY2hhbmdlZFxufTtcblxuX3Rva2VudHlwZS50eXBlcy5fZnVuY3Rpb24udXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChwcmV2VHlwZSkge1xuICBpZiAocHJldlR5cGUuYmVmb3JlRXhwciAmJiBwcmV2VHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5zZW1pICYmIHByZXZUeXBlICE9PSBfdG9rZW50eXBlLnR5cGVzLl9lbHNlICYmIChwcmV2VHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5jb2xvbiB8fCB0aGlzLmN1ckNvbnRleHQoKSAhPT0gdHlwZXMuYl9zdGF0KSkgdGhpcy5jb250ZXh0LnB1c2godHlwZXMuZl9leHByKTtcbiAgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlO1xufTtcblxuX3Rva2VudHlwZS50eXBlcy5iYWNrUXVvdGUudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY3VyQ29udGV4dCgpID09PSB0eXBlcy5xX3RtcGwpIHRoaXMuY29udGV4dC5wb3AoKTtlbHNlIHRoaXMuY29udGV4dC5wdXNoKHR5cGVzLnFfdG1wbCk7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTtcbn07XG5cbn0se1wiLi9zdGF0ZVwiOjEwLFwiLi90b2tlbnR5cGVcIjoxNCxcIi4vd2hpdGVzcGFjZVwiOjE2fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfaWRlbnRpZmllciA9IF9kZXJlcV8oXCIuL2lkZW50aWZpZXJcIik7XG5cbnZhciBfdG9rZW50eXBlID0gX2RlcmVxXyhcIi4vdG9rZW50eXBlXCIpO1xuXG52YXIgX3N0YXRlID0gX2RlcmVxXyhcIi4vc3RhdGVcIik7XG5cbnZhciBfbG9jdXRpbCA9IF9kZXJlcV8oXCIuL2xvY3V0aWxcIik7XG5cbnZhciBfd2hpdGVzcGFjZSA9IF9kZXJlcV8oXCIuL3doaXRlc3BhY2VcIik7XG5cbi8vIE9iamVjdCB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRva2Vucy4gTm90ZSB0aGF0IG5vcm1hbGx5LCB0b2tlbnNcbi8vIHNpbXBseSBleGlzdCBhcyBwcm9wZXJ0aWVzIG9uIHRoZSBwYXJzZXIgb2JqZWN0LiBUaGlzIGlzIG9ubHlcbi8vIHVzZWQgZm9yIHRoZSBvblRva2VuIGNhbGxiYWNrIGFuZCB0aGUgZXh0ZXJuYWwgdG9rZW5pemVyLlxuXG52YXIgVG9rZW4gPSBmdW5jdGlvbiBUb2tlbihwKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2tlbik7XG5cbiAgdGhpcy50eXBlID0gcC50eXBlO1xuICB0aGlzLnZhbHVlID0gcC52YWx1ZTtcbiAgdGhpcy5zdGFydCA9IHAuc3RhcnQ7XG4gIHRoaXMuZW5kID0gcC5lbmQ7XG4gIGlmIChwLm9wdGlvbnMubG9jYXRpb25zKSB0aGlzLmxvYyA9IG5ldyBfbG9jdXRpbC5Tb3VyY2VMb2NhdGlvbihwLCBwLnN0YXJ0TG9jLCBwLmVuZExvYyk7XG4gIGlmIChwLm9wdGlvbnMucmFuZ2VzKSB0aGlzLnJhbmdlID0gW3Auc3RhcnQsIHAuZW5kXTtcbn1cblxuLy8gIyMgVG9rZW5pemVyXG5cbjtcblxuZXhwb3J0cy5Ub2tlbiA9IFRva2VuO1xudmFyIHBwID0gX3N0YXRlLlBhcnNlci5wcm90b3R5cGU7XG5cbi8vIEFyZSB3ZSBydW5uaW5nIHVuZGVyIFJoaW5vP1xudmFyIGlzUmhpbm8gPSB0eXBlb2YgUGFja2FnZXMgPT0gXCJvYmplY3RcIiAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUGFja2FnZXMpID09IFwiW29iamVjdCBKYXZhUGFja2FnZV1cIjtcblxuLy8gTW92ZSB0byB0aGUgbmV4dCB0b2tlblxuXG5wcC5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vcHRpb25zLm9uVG9rZW4pIHRoaXMub3B0aW9ucy5vblRva2VuKG5ldyBUb2tlbih0aGlzKSk7XG5cbiAgdGhpcy5sYXN0VG9rRW5kID0gdGhpcy5lbmQ7XG4gIHRoaXMubGFzdFRva1N0YXJ0ID0gdGhpcy5zdGFydDtcbiAgdGhpcy5sYXN0VG9rRW5kTG9jID0gdGhpcy5lbmRMb2M7XG4gIHRoaXMubGFzdFRva1N0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgdGhpcy5uZXh0VG9rZW4oKTtcbn07XG5cbnBwLmdldFRva2VuID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLm5leHQoKTtcbiAgcmV0dXJuIG5ldyBUb2tlbih0aGlzKTtcbn07XG5cbi8vIElmIHdlJ3JlIGluIGFuIEVTNiBlbnZpcm9ubWVudCwgbWFrZSBwYXJzZXJzIGl0ZXJhYmxlXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIikgcHBbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4geyBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgdmFyIHRva2VuID0gc2VsZi5nZXRUb2tlbigpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZG9uZTogdG9rZW4udHlwZSA9PT0gX3Rva2VudHlwZS50eXBlcy5lb2YsXG4gICAgICAgIHZhbHVlOiB0b2tlblxuICAgICAgfTtcbiAgICB9IH07XG59O1xuXG4vLyBUb2dnbGUgc3RyaWN0IG1vZGUuIFJlLXJlYWRzIHRoZSBuZXh0IG51bWJlciBvciBzdHJpbmcgdG8gcGxlYXNlXG4vLyBwZWRhbnRpYyB0ZXN0cyAoYFwidXNlIHN0cmljdFwiOyAwMTA7YCBzaG91bGQgZmFpbCkuXG5cbnBwLnNldFN0cmljdCA9IGZ1bmN0aW9uIChzdHJpY3QpIHtcbiAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7XG4gIGlmICh0aGlzLnR5cGUgIT09IF90b2tlbnR5cGUudHlwZXMubnVtICYmIHRoaXMudHlwZSAhPT0gX3Rva2VudHlwZS50eXBlcy5zdHJpbmcpIHJldHVybjtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMubGluZVN0YXJ0KSB7XG4gICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5wdXQubGFzdEluZGV4T2YoXCJcXG5cIiwgdGhpcy5saW5lU3RhcnQgLSAyKSArIDE7XG4gICAgICAtLXRoaXMuY3VyTGluZTtcbiAgICB9XG4gIH1cbiAgdGhpcy5uZXh0VG9rZW4oKTtcbn07XG5cbnBwLmN1ckNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbnRleHRbdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDFdO1xufTtcblxuLy8gUmVhZCBhIHNpbmdsZSB0b2tlbiwgdXBkYXRpbmcgdGhlIHBhcnNlciBvYmplY3QncyB0b2tlbi1yZWxhdGVkXG4vLyBwcm9wZXJ0aWVzLlxuXG5wcC5uZXh0VG9rZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjdXJDb250ZXh0ID0gdGhpcy5jdXJDb250ZXh0KCk7XG4gIGlmICghY3VyQ29udGV4dCB8fCAhY3VyQ29udGV4dC5wcmVzZXJ2ZVNwYWNlKSB0aGlzLnNraXBTcGFjZSgpO1xuXG4gIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHRoaXMuc3RhcnRMb2MgPSB0aGlzLmN1clBvc2l0aW9uKCk7XG4gIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5lb2YpO1xuXG4gIGlmIChjdXJDb250ZXh0Lm92ZXJyaWRlKSByZXR1cm4gY3VyQ29udGV4dC5vdmVycmlkZSh0aGlzKTtlbHNlIHRoaXMucmVhZFRva2VuKHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSk7XG59O1xuXG5wcC5yZWFkVG9rZW4gPSBmdW5jdGlvbiAoY29kZSkge1xuICAvLyBJZGVudGlmaWVyIG9yIGtleXdvcmQuICdcXHVYWFhYJyBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgaW5cbiAgLy8gaWRlbnRpZmllcnMsIHNvICdcXCcgYWxzbyBkaXNwYXRjaGVzIHRvIHRoYXQuXG4gIGlmIChfaWRlbnRpZmllci5pc0lkZW50aWZpZXJTdGFydChjb2RlLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikgfHwgY29kZSA9PT0gOTIgLyogJ1xcJyAqLykgcmV0dXJuIHRoaXMucmVhZFdvcmQoKTtcblxuICByZXR1cm4gdGhpcy5nZXRUb2tlbkZyb21Db2RlKGNvZGUpO1xufTtcblxucHAuZnVsbENoYXJDb2RlQXRQb3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb2RlID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgaWYgKGNvZGUgPD0gMHhkN2ZmIHx8IGNvZGUgPj0gMHhlMDAwKSByZXR1cm4gY29kZTtcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgcmV0dXJuIChjb2RlIDw8IDEwKSArIG5leHQgLSAweDM1ZmRjMDA7XG59O1xuXG5wcC5za2lwQmxvY2tDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhcnRMb2MgPSB0aGlzLm9wdGlvbnMub25Db21tZW50ICYmIHRoaXMuY3VyUG9zaXRpb24oKTtcbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3MsXG4gICAgICBlbmQgPSB0aGlzLmlucHV0LmluZGV4T2YoXCIqL1wiLCB0aGlzLnBvcyArPSAyKTtcbiAgaWYgKGVuZCA9PT0gLTEpIHRoaXMucmFpc2UodGhpcy5wb3MgLSAyLCBcIlVudGVybWluYXRlZCBjb21tZW50XCIpO1xuICB0aGlzLnBvcyA9IGVuZCArIDI7XG4gIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgX3doaXRlc3BhY2UubGluZUJyZWFrRy5sYXN0SW5kZXggPSBzdGFydDtcbiAgICB2YXIgbWF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKChtYXRjaCA9IF93aGl0ZXNwYWNlLmxpbmVCcmVha0cuZXhlYyh0aGlzLmlucHV0KSkgJiYgbWF0Y2guaW5kZXggPCB0aGlzLnBvcykge1xuICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICB0aGlzLmxpbmVTdGFydCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLm9uQ29tbWVudCkgdGhpcy5vcHRpb25zLm9uQ29tbWVudCh0cnVlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgZW5kKSwgc3RhcnQsIHRoaXMucG9zLCBzdGFydExvYywgdGhpcy5jdXJQb3NpdGlvbigpKTtcbn07XG5cbnBwLnNraXBMaW5lQ29tbWVudCA9IGZ1bmN0aW9uIChzdGFydFNraXApIHtcbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gIHZhciBzdGFydExvYyA9IHRoaXMub3B0aW9ucy5vbkNvbW1lbnQgJiYgdGhpcy5jdXJQb3NpdGlvbigpO1xuICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKz0gc3RhcnRTa2lwKTtcbiAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGggJiYgY2ggIT09IDEwICYmIGNoICE9PSAxMyAmJiBjaCAhPT0gODIzMiAmJiBjaCAhPT0gODIzMykge1xuICAgICsrdGhpcy5wb3M7XG4gICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KSB0aGlzLm9wdGlvbnMub25Db21tZW50KGZhbHNlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgc3RhcnRTa2lwLCB0aGlzLnBvcyksIHN0YXJ0LCB0aGlzLnBvcywgc3RhcnRMb2MsIHRoaXMuY3VyUG9zaXRpb24oKSk7XG59O1xuXG4vLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBhbmQgYWZ0ZXIgZXZlcnkgdG9rZW4uIFNraXBzXG4vLyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgYW5kLlxuXG5wcC5za2lwU3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gIGxvb3A6IHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoKSB7XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICBjYXNlIDMyOmNhc2UgMTYwOlxuICAgICAgICAvLyAnICdcbiAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSkgPT09IDEwKSB7XG4gICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgfVxuICAgICAgY2FzZSAxMDpjYXNlIDgyMzI6Y2FzZSA4MjMzOlxuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICAgICsrdGhpcy5jdXJMaW5lO1xuICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ3OlxuICAgICAgICAvLyAnLydcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSkge1xuICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAvLyAnKidcbiAgICAgICAgICAgIHRoaXMuc2tpcEJsb2NrQ29tbWVudCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY2ggPiA4ICYmIGNoIDwgMTQgfHwgY2ggPj0gNTc2MCAmJiBfd2hpdGVzcGFjZS5ub25BU0NJSXdoaXRlc3BhY2UudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHRva2VuLiBTZXRzIGBlbmRgLCBgdmFsYCwgYW5kXG4vLyBtYWludGFpbnMgYGNvbnRleHRgIGFuZCBgZXhwckFsbG93ZWRgLCBhbmQgc2tpcHMgdGhlIHNwYWNlIGFmdGVyXG4vLyB0aGUgdG9rZW4sIHNvIHRoYXQgdGhlIG5leHQgb25lJ3MgYHN0YXJ0YCB3aWxsIHBvaW50IGF0IHRoZVxuLy8gcmlnaHQgcG9zaXRpb24uXG5cbnBwLmZpbmlzaFRva2VuID0gZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgdGhpcy5lbmRMb2MgPSB0aGlzLmN1clBvc2l0aW9uKCk7XG4gIHZhciBwcmV2VHlwZSA9IHRoaXMudHlwZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy52YWx1ZSA9IHZhbDtcblxuICB0aGlzLnVwZGF0ZUNvbnRleHQocHJldlR5cGUpO1xufTtcblxuLy8gIyMjIFRva2VuIHJlYWRpbmdcblxuLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gZmV0Y2ggdGhlIG5leHQgdG9rZW4uIEl0XG4vLyBpcyBzb21ld2hhdCBvYnNjdXJlLCBiZWNhdXNlIGl0IHdvcmtzIGluIGNoYXJhY3RlciBjb2RlcyByYXRoZXJcbi8vIHRoYW4gY2hhcmFjdGVycywgYW5kIGJlY2F1c2Ugb3BlcmF0b3IgcGFyc2luZyBoYXMgYmVlbiBpbmxpbmVkXG4vLyBpbnRvIGl0LlxuLy9cbi8vIEFsbCBpbiB0aGUgbmFtZSBvZiBzcGVlZC5cbi8vXG5wcC5yZWFkVG9rZW5fZG90ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKHRydWUpO1xuICB2YXIgbmV4dDIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIG5leHQgPT09IDQ2ICYmIG5leHQyID09PSA0Nikge1xuICAgIC8vIDQ2ID0gZG90ICcuJ1xuICAgIHRoaXMucG9zICs9IDM7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5lbGxpcHNpcyk7XG4gIH0gZWxzZSB7XG4gICAgKyt0aGlzLnBvcztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLmRvdCk7XG4gIH1cbn07XG5cbnBwLnJlYWRUb2tlbl9zbGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gJy8nXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIGlmICh0aGlzLmV4cHJBbGxvd2VkKSB7XG4gICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5yZWFkUmVnZXhwKCk7XG4gIH1cbiAgaWYgKG5leHQgPT09IDYxKSByZXR1cm4gdGhpcy5maW5pc2hPcChfdG9rZW50eXBlLnR5cGVzLmFzc2lnbiwgMik7XG4gIHJldHVybiB0aGlzLmZpbmlzaE9wKF90b2tlbnR5cGUudHlwZXMuc2xhc2gsIDEpO1xufTtcblxucHAucmVhZFRva2VuX211bHRfbW9kdWxvX2V4cCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gIC8vICclKidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgdmFyIHNpemUgPSAxO1xuICB2YXIgdG9rZW50eXBlID0gY29kZSA9PT0gNDIgPyBfdG9rZW50eXBlLnR5cGVzLnN0YXIgOiBfdG9rZW50eXBlLnR5cGVzLm1vZHVsbztcblxuICAvLyBleHBvbmVudGlhdGlvbiBvcGVyYXRvciAqKiBhbmQgKio9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNyAmJiBuZXh0ID09PSA0Mikge1xuICAgICsrc2l6ZTtcbiAgICB0b2tlbnR5cGUgPSBfdG9rZW50eXBlLnR5cGVzLnN0YXJzdGFyO1xuICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIHRoaXMuZmluaXNoT3AoX3Rva2VudHlwZS50eXBlcy5hc3NpZ24sIHNpemUgKyAxKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodG9rZW50eXBlLCBzaXplKTtcbn07XG5cbnBwLnJlYWRUb2tlbl9waXBlX2FtcCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gIC8vICd8JidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IGNvZGUpIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IF90b2tlbnR5cGUudHlwZXMubG9naWNhbE9SIDogX3Rva2VudHlwZS50eXBlcy5sb2dpY2FsQU5ELCAyKTtcbiAgaWYgKG5leHQgPT09IDYxKSByZXR1cm4gdGhpcy5maW5pc2hPcChfdG9rZW50eXBlLnR5cGVzLmFzc2lnbiwgMik7XG4gIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IF90b2tlbnR5cGUudHlwZXMuYml0d2lzZU9SIDogX3Rva2VudHlwZS50eXBlcy5iaXR3aXNlQU5ELCAxKTtcbn07XG5cbnBwLnJlYWRUb2tlbl9jYXJldCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gJ14nXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIHRoaXMuZmluaXNoT3AoX3Rva2VudHlwZS50eXBlcy5hc3NpZ24sIDIpO1xuICByZXR1cm4gdGhpcy5maW5pc2hPcChfdG9rZW50eXBlLnR5cGVzLmJpdHdpc2VYT1IsIDEpO1xufTtcblxucHAucmVhZFRva2VuX3BsdXNfbWluID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgLy8gJystJ1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgIGlmIChuZXh0ID09IDQ1ICYmIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpID09IDYyICYmIF93aGl0ZXNwYWNlLmxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnBvcykpKSB7XG4gICAgICAvLyBBIGAtLT5gIGxpbmUgY29tbWVudFxuICAgICAgdGhpcy5za2lwTGluZUNvbW1lbnQoMyk7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgcmV0dXJuIHRoaXMubmV4dFRva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKF90b2tlbnR5cGUudHlwZXMuaW5jRGVjLCAyKTtcbiAgfVxuICBpZiAobmV4dCA9PT0gNjEpIHJldHVybiB0aGlzLmZpbmlzaE9wKF90b2tlbnR5cGUudHlwZXMuYXNzaWduLCAyKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AoX3Rva2VudHlwZS50eXBlcy5wbHVzTWluLCAxKTtcbn07XG5cbnBwLnJlYWRUb2tlbl9sdF9ndCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gIC8vICc8PidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgdmFyIHNpemUgPSAxO1xuICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgIHNpemUgPSBjb2RlID09PSA2MiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjIgPyAzIDogMjtcbiAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgc2l6ZSkgPT09IDYxKSByZXR1cm4gdGhpcy5maW5pc2hPcChfdG9rZW50eXBlLnR5cGVzLmFzc2lnbiwgc2l6ZSArIDEpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKF90b2tlbnR5cGUudHlwZXMuYml0U2hpZnQsIHNpemUpO1xuICB9XG4gIGlmIChuZXh0ID09IDMzICYmIGNvZGUgPT0gNjAgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT0gNDUgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMykgPT0gNDUpIHtcbiAgICBpZiAodGhpcy5pbk1vZHVsZSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgLy8gYDwhLS1gLCBhbiBYTUwtc3R5bGUgY29tbWVudCB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpbmUgY29tbWVudFxuICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDQpO1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgcmV0dXJuIHRoaXMubmV4dFRva2VuKCk7XG4gIH1cbiAgaWYgKG5leHQgPT09IDYxKSBzaXplID0gMjtcbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AoX3Rva2VudHlwZS50eXBlcy5yZWxhdGlvbmFsLCBzaXplKTtcbn07XG5cbnBwLnJlYWRUb2tlbl9lcV9leGNsID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgLy8gJz0hJ1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA9PT0gNjEpIHJldHVybiB0aGlzLmZpbmlzaE9wKF90b2tlbnR5cGUudHlwZXMuZXF1YWxpdHksIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpID09PSA2MSA/IDMgOiAyKTtcbiAgaWYgKGNvZGUgPT09IDYxICYmIG5leHQgPT09IDYyICYmIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgLy8gJz0+J1xuICAgIHRoaXMucG9zICs9IDI7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5hcnJvdyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AoY29kZSA9PT0gNjEgPyBfdG9rZW50eXBlLnR5cGVzLmVxIDogX3Rva2VudHlwZS50eXBlcy5wcmVmaXgsIDEpO1xufTtcblxucHAuZ2V0VG9rZW5Gcm9tQ29kZSA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWRcbiAgICAvLyBieSBhIGRpZ2l0IG9yIGFub3RoZXIgdHdvIGRvdHMuXG4gICAgY2FzZSA0NjpcbiAgICAgIC8vICcuJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2RvdCgpO1xuXG4gICAgLy8gUHVuY3R1YXRpb24gdG9rZW5zLlxuICAgIGNhc2UgNDA6XG4gICAgICArK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKF90b2tlbnR5cGUudHlwZXMucGFyZW5MKTtcbiAgICBjYXNlIDQxOlxuICAgICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLnBhcmVuUik7XG4gICAgY2FzZSA1OTpcbiAgICAgICsrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5zZW1pKTtcbiAgICBjYXNlIDQ0OlxuICAgICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLmNvbW1hKTtcbiAgICBjYXNlIDkxOlxuICAgICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLmJyYWNrZXRMKTtcbiAgICBjYXNlIDkzOlxuICAgICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLmJyYWNrZXRSKTtcbiAgICBjYXNlIDEyMzpcbiAgICAgICsrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5icmFjZUwpO1xuICAgIGNhc2UgMTI1OlxuICAgICAgKyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLmJyYWNlUik7XG4gICAgY2FzZSA1ODpcbiAgICAgICsrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5jb2xvbik7XG4gICAgY2FzZSA2MzpcbiAgICAgICsrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5xdWVzdGlvbik7XG5cbiAgICBjYXNlIDk2OlxuICAgICAgLy8gJ2AnXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNikgYnJlYWs7XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5iYWNrUXVvdGUpO1xuXG4gICAgY2FzZSA0ODpcbiAgICAgIC8vICcwJ1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICAgIGlmIChuZXh0ID09PSAxMjAgfHwgbmV4dCA9PT0gODgpIHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcigxNik7IC8vICcweCcsICcwWCcgLSBoZXggbnVtYmVyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IDExMSB8fCBuZXh0ID09PSA3OSkgcmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDgpOyAvLyAnMG8nLCAnME8nIC0gb2N0YWwgbnVtYmVyXG4gICAgICAgIGlmIChuZXh0ID09PSA5OCB8fCBuZXh0ID09PSA2NikgcmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDIpOyAvLyAnMGInLCAnMEInIC0gYmluYXJ5IG51bWJlclxuICAgICAgfVxuICAgIC8vIEFueXRoaW5nIGVsc2UgYmVnaW5uaW5nIHdpdGggYSBkaWdpdCBpcyBhbiBpbnRlZ2VyLCBvY3RhbFxuICAgIC8vIG51bWJlciwgb3IgZmxvYXQuXG4gICAgY2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6XG4gICAgICAvLyAxLTlcbiAgICAgIHJldHVybiB0aGlzLnJlYWROdW1iZXIoZmFsc2UpO1xuXG4gICAgLy8gUXVvdGVzIHByb2R1Y2Ugc3RyaW5ncy5cbiAgICBjYXNlIDM0OmNhc2UgMzk6XG4gICAgICAvLyAnXCInLCBcIidcIlxuICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZyhjb2RlKTtcblxuICAgIC8vIE9wZXJhdG9ycyBhcmUgcGFyc2VkIGlubGluZSBpbiB0aW55IHN0YXRlIG1hY2hpbmVzLiAnPScgKDYxKSBpc1xuICAgIC8vIG9mdGVuIHJlZmVycmVkIHRvLiBgZmluaXNoT3BgIHNpbXBseSBza2lwcyB0aGUgYW1vdW50IG9mXG4gICAgLy8gY2hhcmFjdGVycyBpdCBpcyBnaXZlbiBhcyBzZWNvbmQgYXJndW1lbnQsIGFuZCByZXR1cm5zIGEgdG9rZW5cbiAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgICBjYXNlIDQ3OlxuICAgICAgLy8gJy8nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fc2xhc2goKTtcblxuICAgIGNhc2UgMzc6Y2FzZSA0MjpcbiAgICAgIC8vICclKidcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9tdWx0X21vZHVsb19leHAoY29kZSk7XG5cbiAgICBjYXNlIDEyNDpjYXNlIDM4OlxuICAgICAgLy8gJ3wmJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BpcGVfYW1wKGNvZGUpO1xuXG4gICAgY2FzZSA5NDpcbiAgICAgIC8vICdeJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2NhcmV0KCk7XG5cbiAgICBjYXNlIDQzOmNhc2UgNDU6XG4gICAgICAvLyAnKy0nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fcGx1c19taW4oY29kZSk7XG5cbiAgICBjYXNlIDYwOmNhc2UgNjI6XG4gICAgICAvLyAnPD4nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fbHRfZ3QoY29kZSk7XG5cbiAgICBjYXNlIDYxOmNhc2UgMzM6XG4gICAgICAvLyAnPSEnXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZXFfZXhjbChjb2RlKTtcblxuICAgIGNhc2UgMTI2OlxuICAgICAgLy8gJ34nXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hPcChfdG9rZW50eXBlLnR5cGVzLnByZWZpeCwgMSk7XG4gIH1cblxuICB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICdcIiArIGNvZGVQb2ludFRvU3RyaW5nKGNvZGUpICsgXCInXCIpO1xufTtcblxucHAuZmluaXNoT3AgPSBmdW5jdGlvbiAodHlwZSwgc2l6ZSkge1xuICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplKTtcbiAgdGhpcy5wb3MgKz0gc2l6ZTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZSwgc3RyKTtcbn07XG5cbi8vIFBhcnNlIGEgcmVndWxhciBleHByZXNzaW9uLiBTb21lIGNvbnRleHQtYXdhcmVuZXNzIGlzIG5lY2Vzc2FyeSxcbi8vIHNpbmNlIGEgJy8nIGluc2lkZSBhICdbXScgc2V0IGRvZXMgbm90IGVuZCB0aGUgZXhwcmVzc2lvbi5cblxuZnVuY3Rpb24gdHJ5Q3JlYXRlUmVnZXhwKHNyYywgZmxhZ3MsIHRocm93RXJyb3JBdCwgcGFyc2VyKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjLCBmbGFncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodGhyb3dFcnJvckF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHBhcnNlci5yYWlzZSh0aHJvd0Vycm9yQXQsIFwiRXJyb3IgcGFyc2luZyByZWd1bGFyIGV4cHJlc3Npb246IFwiICsgZS5tZXNzYWdlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cbnZhciByZWdleHBVbmljb2RlU3VwcG9ydCA9ICEhdHJ5Q3JlYXRlUmVnZXhwKFwi77+/XCIsIFwidVwiKTtcblxucHAucmVhZFJlZ2V4cCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgZXNjYXBlZCA9IHVuZGVmaW5lZCxcbiAgICAgIGluQ2xhc3MgPSB1bmRlZmluZWQsXG4gICAgICBzdGFydCA9IHRoaXMucG9zO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB0aGlzLnJhaXNlKHN0YXJ0LCBcIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb25cIik7XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuICAgIGlmIChfd2hpdGVzcGFjZS5saW5lQnJlYWsudGVzdChjaCkpIHRoaXMucmFpc2Uoc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTtcbiAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJbXCIpIGluQ2xhc3MgPSB0cnVlO2Vsc2UgaWYgKGNoID09PSBcIl1cIiAmJiBpbkNsYXNzKSBpbkNsYXNzID0gZmFsc2U7ZWxzZSBpZiAoY2ggPT09IFwiL1wiICYmICFpbkNsYXNzKSBicmVhaztcbiAgICAgIGVzY2FwZWQgPSBjaCA9PT0gXCJcXFxcXCI7XG4gICAgfSBlbHNlIGVzY2FwZWQgPSBmYWxzZTtcbiAgICArK3RoaXMucG9zO1xuICB9XG4gIHZhciBjb250ZW50ID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpO1xuICArK3RoaXMucG9zO1xuICAvLyBOZWVkIHRvIHVzZSBgcmVhZFdvcmQxYCBiZWNhdXNlICdcXHVYWFhYJyBzZXF1ZW5jZXMgYXJlIGFsbG93ZWRcbiAgLy8gaGVyZSAoZG9uJ3QgYXNrKS5cbiAgdmFyIG1vZHMgPSB0aGlzLnJlYWRXb3JkMSgpO1xuICB2YXIgdG1wID0gY29udGVudDtcbiAgaWYgKG1vZHMpIHtcbiAgICB2YXIgdmFsaWRGbGFncyA9IC9eW2dpbV0qJC87XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB2YWxpZEZsYWdzID0gL15bZ2ltdXldKiQvO1xuICAgIGlmICghdmFsaWRGbGFncy50ZXN0KG1vZHMpKSB0aGlzLnJhaXNlKHN0YXJ0LCBcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZsYWdcIik7XG4gICAgaWYgKG1vZHMuaW5kZXhPZigndScpID49IDAgJiYgIXJlZ2V4cFVuaWNvZGVTdXBwb3J0KSB7XG4gICAgICAvLyBSZXBsYWNlIGVhY2ggYXN0cmFsIHN5bWJvbCBhbmQgZXZlcnkgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgdGhhdFxuICAgICAgLy8gcG9zc2libHkgcmVwcmVzZW50cyBhbiBhc3RyYWwgc3ltYm9sIG9yIGEgcGFpcmVkIHN1cnJvZ2F0ZSB3aXRoIGFcbiAgICAgIC8vIHNpbmdsZSBBU0NJSSBzeW1ib2wgdG8gYXZvaWQgdGhyb3dpbmcgb24gcmVndWxhciBleHByZXNzaW9ucyB0aGF0XG4gICAgICAvLyBhcmUgb25seSB2YWxpZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBgL3VgIGZsYWcuXG4gICAgICAvLyBOb3RlOiByZXBsYWNpbmcgd2l0aCB0aGUgQVNDSUkgc3ltYm9sIGB4YCBtaWdodCBjYXVzZSBmYWxzZVxuICAgICAgLy8gbmVnYXRpdmVzIGluIHVubGlrZWx5IHNjZW5hcmlvcy4gRm9yIGV4YW1wbGUsIGBbXFx1ezYxfS1iXWAgaXMgYVxuICAgICAgLy8gcGVyZmVjdGx5IHZhbGlkIHBhdHRlcm4gdGhhdCBpcyBlcXVpdmFsZW50IHRvIGBbYS1iXWAsIGJ1dCBpdCB3b3VsZFxuICAgICAgLy8gYmUgcmVwbGFjZWQgYnkgYFt4LWJdYCB3aGljaCB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICB0bXAgPSB0bXAucmVwbGFjZSgvXFxcXHVcXHsoWzAtOWEtZkEtRl0rKVxcfS9nLCBmdW5jdGlvbiAoX21hdGNoLCBjb2RlLCBvZmZzZXQpIHtcbiAgICAgICAgY29kZSA9IE51bWJlcihcIjB4XCIgKyBjb2RlKTtcbiAgICAgICAgaWYgKGNvZGUgPiAweDEwRkZGRikgX3RoaXMucmFpc2Uoc3RhcnQgKyBvZmZzZXQgKyAzLCBcIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kc1wiKTtcbiAgICAgICAgcmV0dXJuIFwieFwiO1xuICAgICAgfSk7XG4gICAgICB0bXAgPSB0bXAucmVwbGFjZSgvXFxcXHUoW2EtZkEtRjAtOV17NH0pfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZywgXCJ4XCIpO1xuICAgIH1cbiAgfVxuICAvLyBEZXRlY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLlxuICB2YXIgdmFsdWUgPSBudWxsO1xuICAvLyBSaGlubydzIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzZXIgaXMgZmxha3kgYW5kIHRocm93cyB1bmNhdGNoYWJsZSBleGNlcHRpb25zLFxuICAvLyBzbyBkb24ndCBkbyBkZXRlY3Rpb24gaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgUmhpbm9cbiAgaWYgKCFpc1JoaW5vKSB7XG4gICAgdHJ5Q3JlYXRlUmVnZXhwKHRtcCwgdW5kZWZpbmVkLCBzdGFydCwgdGhpcyk7XG4gICAgLy8gR2V0IGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCBmb3IgdGhpcyBwYXR0ZXJuLWZsYWcgcGFpciwgb3IgYG51bGxgIGluXG4gICAgLy8gY2FzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsYWdzIGl0IHVzZXMuXG4gICAgdmFsdWUgPSB0cnlDcmVhdGVSZWdleHAoY29udGVudCwgbW9kcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5yZWdleHAsIHsgcGF0dGVybjogY29udGVudCwgZmxhZ3M6IG1vZHMsIHZhbHVlOiB2YWx1ZSB9KTtcbn07XG5cbi8vIFJlYWQgYW4gaW50ZWdlciBpbiB0aGUgZ2l2ZW4gcmFkaXguIFJldHVybiBudWxsIGlmIHplcm8gZGlnaXRzXG4vLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuLy8gd2lsbCByZXR1cm4gYG51bGxgIHVubGVzcyB0aGUgaW50ZWdlciBoYXMgZXhhY3RseSBgbGVuYCBkaWdpdHMuXG5cbnBwLnJlYWRJbnQgPSBmdW5jdGlvbiAocmFkaXgsIGxlbikge1xuICB2YXIgc3RhcnQgPSB0aGlzLnBvcyxcbiAgICAgIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpKSB7XG4gICAgdmFyIGNvZGUgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpLFxuICAgICAgICB2YWwgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNvZGUgPj0gOTcpIHZhbCA9IGNvZGUgLSA5NyArIDEwOyAvLyBhXG4gICAgZWxzZSBpZiAoY29kZSA+PSA2NSkgdmFsID0gY29kZSAtIDY1ICsgMTA7IC8vIEFcbiAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgdmFsID0gY29kZSAtIDQ4OyAvLyAwLTlcbiAgICAgICAgZWxzZSB2YWwgPSBJbmZpbml0eTtcbiAgICBpZiAodmFsID49IHJhZGl4KSBicmVhaztcbiAgICArK3RoaXMucG9zO1xuICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDtcbiAgfVxuICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRoaXMucG9zIC0gc3RhcnQgIT09IGxlbikgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxucHAucmVhZFJhZGl4TnVtYmVyID0gZnVuY3Rpb24gKHJhZGl4KSB7XG4gIHRoaXMucG9zICs9IDI7IC8vIDB4XG4gIHZhciB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICBpZiAodmFsID09IG51bGwpIHRoaXMucmFpc2UodGhpcy5zdGFydCArIDIsIFwiRXhwZWN0ZWQgbnVtYmVyIGluIHJhZGl4IFwiICsgcmFkaXgpO1xuICBpZiAoX2lkZW50aWZpZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5udW0sIHZhbCk7XG59O1xuXG4vLyBSZWFkIGFuIGludGVnZXIsIG9jdGFsIGludGVnZXIsIG9yIGZsb2F0aW5nLXBvaW50IG51bWJlci5cblxucHAucmVhZE51bWJlciA9IGZ1bmN0aW9uIChzdGFydHNXaXRoRG90KSB7XG4gIHZhciBzdGFydCA9IHRoaXMucG9zLFxuICAgICAgaXNGbG9hdCA9IGZhbHNlLFxuICAgICAgb2N0YWwgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpID09PSA0ODtcbiAgaWYgKCFzdGFydHNXaXRoRG90ICYmIHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7XG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgaWYgKG5leHQgPT09IDQ2KSB7XG4gICAgLy8gJy4nXG4gICAgKyt0aGlzLnBvcztcbiAgICB0aGlzLnJlYWRJbnQoMTApO1xuICAgIGlzRmxvYXQgPSB0cnVlO1xuICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICB9XG4gIGlmIChuZXh0ID09PSA2OSB8fCBuZXh0ID09PSAxMDEpIHtcbiAgICAvLyAnZUUnXG4gICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMucG9zKTtcbiAgICBpZiAobmV4dCA9PT0gNDMgfHwgbmV4dCA9PT0gNDUpICsrdGhpcy5wb3M7IC8vICcrLSdcbiAgICBpZiAodGhpcy5yZWFkSW50KDEwKSA9PT0gbnVsbCkgdGhpcy5yYWlzZShzdGFydCwgXCJJbnZhbGlkIG51bWJlclwiKTtcbiAgICBpc0Zsb2F0ID0gdHJ1ZTtcbiAgfVxuICBpZiAoX2lkZW50aWZpZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTtcblxuICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpLFxuICAgICAgdmFsID0gdW5kZWZpbmVkO1xuICBpZiAoaXNGbG9hdCkgdmFsID0gcGFyc2VGbG9hdChzdHIpO2Vsc2UgaWYgKCFvY3RhbCB8fCBzdHIubGVuZ3RoID09PSAxKSB2YWwgPSBwYXJzZUludChzdHIsIDEwKTtlbHNlIGlmICgvWzg5XS8udGVzdChzdHIpIHx8IHRoaXMuc3RyaWN0KSB0aGlzLnJhaXNlKHN0YXJ0LCBcIkludmFsaWQgbnVtYmVyXCIpO2Vsc2UgdmFsID0gcGFyc2VJbnQoc3RyLCA4KTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5udW0sIHZhbCk7XG59O1xuXG4vLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuXG5cbnBwLnJlYWRDb2RlUG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyksXG4gICAgICBjb2RlID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjaCA9PT0gMTIzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYpIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIHZhciBjb2RlUG9zID0gKyt0aGlzLnBvcztcbiAgICBjb2RlID0gdGhpcy5yZWFkSGV4Q2hhcih0aGlzLmlucHV0LmluZGV4T2YoJ30nLCB0aGlzLnBvcykgLSB0aGlzLnBvcyk7XG4gICAgKyt0aGlzLnBvcztcbiAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB0aGlzLnJhaXNlKGNvZGVQb3MsIFwiQ29kZSBwb2ludCBvdXQgb2YgYm91bmRzXCIpO1xuICB9IGVsc2Uge1xuICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKDQpO1xuICB9XG4gIHJldHVybiBjb2RlO1xufTtcblxuZnVuY3Rpb24gY29kZVBvaW50VG9TdHJpbmcoY29kZSkge1xuICAvLyBVVEYtMTYgRGVjb2RpbmdcbiAgaWYgKGNvZGUgPD0gMHhGRkZGKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgY29kZSAtPSAweDEwMDAwO1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZSA+PiAxMCkgKyAweEQ4MDAsIChjb2RlICYgMTAyMykgKyAweERDMDApO1xufVxuXG5wcC5yZWFkU3RyaW5nID0gZnVuY3Rpb24gKHF1b3RlKSB7XG4gIHZhciBvdXQgPSBcIlwiLFxuICAgICAgY2h1bmtTdGFydCA9ICsrdGhpcy5wb3M7XG4gIGZvciAoOzspIHtcbiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50XCIpO1xuICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgaWYgKGNoID09PSBxdW90ZSkgYnJlYWs7XG4gICAgaWYgKGNoID09PSA5Mikge1xuICAgICAgLy8gJ1xcJ1xuICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgb3V0ICs9IHRoaXMucmVhZEVzY2FwZWRDaGFyKGZhbHNlKTtcbiAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF93aGl0ZXNwYWNlLmlzTmV3TGluZShjaCkpIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50XCIpO1xuICAgICAgKyt0aGlzLnBvcztcbiAgICB9XG4gIH1cbiAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MrKyk7XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKF90b2tlbnR5cGUudHlwZXMuc3RyaW5nLCBvdXQpO1xufTtcblxuLy8gUmVhZHMgdGVtcGxhdGUgc3RyaW5nIHRva2Vucy5cblxucHAucmVhZFRtcGxUb2tlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG91dCA9IFwiXCIsXG4gICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gIGZvciAoOzspIHtcbiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICBpZiAoY2ggPT09IDk2IHx8IGNoID09PSAzNiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTIzKSB7XG4gICAgICAvLyAnYCcsICckeydcbiAgICAgIGlmICh0aGlzLnBvcyA9PT0gdGhpcy5zdGFydCAmJiB0aGlzLnR5cGUgPT09IF90b2tlbnR5cGUudHlwZXMudGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGNoID09PSAzNikge1xuICAgICAgICAgIHRoaXMucG9zICs9IDI7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5kb2xsYXJCcmFjZUwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4oX3Rva2VudHlwZS50eXBlcy5iYWNrUXVvdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbihfdG9rZW50eXBlLnR5cGVzLnRlbXBsYXRlLCBvdXQpO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IDkyKSB7XG4gICAgICAvLyAnXFwnXG4gICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICBvdXQgKz0gdGhpcy5yZWFkRXNjYXBlZENoYXIodHJ1ZSk7XG4gICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgfSBlbHNlIGlmIChfd2hpdGVzcGFjZS5pc05ld0xpbmUoY2gpKSB7XG4gICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpID09PSAxMCkgKyt0aGlzLnBvcztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBvdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICArK3RoaXMuY3VyTGluZTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH1cbiAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnBvcztcbiAgICB9XG4gIH1cbn07XG5cbi8vIFVzZWQgdG8gcmVhZCBlc2NhcGVkIGNoYXJhY3RlcnNcblxucHAucmVhZEVzY2FwZWRDaGFyID0gZnVuY3Rpb24gKGluVGVtcGxhdGUpIHtcbiAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpO1xuICArK3RoaXMucG9zO1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAxMTA6XG4gICAgICByZXR1cm4gXCJcXG5cIjsgLy8gJ24nIC0+ICdcXG4nXG4gICAgY2FzZSAxMTQ6XG4gICAgICByZXR1cm4gXCJcXHJcIjsgLy8gJ3InIC0+ICdcXHInXG4gICAgY2FzZSAxMjA6XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRIZXhDaGFyKDIpKTsgLy8gJ3gnXG4gICAgY2FzZSAxMTc6XG4gICAgICByZXR1cm4gY29kZVBvaW50VG9TdHJpbmcodGhpcy5yZWFkQ29kZVBvaW50KCkpOyAvLyAndSdcbiAgICBjYXNlIDExNjpcbiAgICAgIHJldHVybiBcIlxcdFwiOyAvLyAndCcgLT4gJ1xcdCdcbiAgICBjYXNlIDk4OlxuICAgICAgcmV0dXJuIFwiXFxiXCI7IC8vICdiJyAtPiAnXFxiJ1xuICAgIGNhc2UgMTE4OlxuICAgICAgcmV0dXJuIFwiXFx1MDAwYlwiOyAvLyAndicgLT4gJ1xcdTAwMGInXG4gICAgY2FzZSAxMDI6XG4gICAgICByZXR1cm4gXCJcXGZcIjsgLy8gJ2YnIC0+ICdcXGYnXG4gICAgY2FzZSAxMzpcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpID09PSAxMCkgKyt0aGlzLnBvczsgLy8gJ1xcclxcbidcbiAgICBjYXNlIDEwOlxuICAgICAgLy8gJyBcXG4nXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zOysrdGhpcy5jdXJMaW5lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaCA+PSA0OCAmJiBjaCA8PSA1NSkge1xuICAgICAgICB2YXIgb2N0YWxTdHIgPSB0aGlzLmlucHV0LnN1YnN0cih0aGlzLnBvcyAtIDEsIDMpLm1hdGNoKC9eWzAtN10rLylbMF07XG4gICAgICAgIHZhciBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgICAgaWYgKG9jdGFsID4gMjU1KSB7XG4gICAgICAgICAgb2N0YWxTdHIgPSBvY3RhbFN0ci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9jdGFsU3RyICE9PSBcIjBcIiAmJiAodGhpcy5zdHJpY3QgfHwgaW5UZW1wbGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKHRoaXMucG9zIC0gMiwgXCJPY3RhbCBsaXRlcmFsIGluIHN0cmljdCBtb2RlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zICs9IG9jdGFsU3RyLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG9jdGFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgfVxufTtcblxuLy8gVXNlZCB0byByZWFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzICgnXFx4JywgJ1xcdScsICdcXFUnKS5cblxucHAucmVhZEhleENoYXIgPSBmdW5jdGlvbiAobGVuKSB7XG4gIHZhciBjb2RlUG9zID0gdGhpcy5wb3M7XG4gIHZhciBuID0gdGhpcy5yZWFkSW50KDE2LCBsZW4pO1xuICBpZiAobiA9PT0gbnVsbCkgdGhpcy5yYWlzZShjb2RlUG9zLCBcIkJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlXCIpO1xuICByZXR1cm4gbjtcbn07XG5cbi8vIFJlYWQgYW4gaWRlbnRpZmllciwgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZy4gU2V0cyBgdGhpcy5jb250YWluc0VzY2Bcbi8vIHRvIHdoZXRoZXIgdGhlIHdvcmQgY29udGFpbmVkIGEgJ1xcdScgZXNjYXBlLlxuLy9cbi8vIEluY3JlbWVudGFsbHkgYWRkcyBvbmx5IGVzY2FwZWQgY2hhcnMsIGFkZGluZyBvdGhlciBjaHVua3MgYXMtaXNcbi8vIGFzIGEgbWljcm8tb3B0aW1pemF0aW9uLlxuXG5wcC5yZWFkV29yZDEgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgdmFyIHdvcmQgPSBcIlwiLFxuICAgICAgZmlyc3QgPSB0cnVlLFxuICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICB2YXIgYXN0cmFsID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDY7XG4gIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoKSB7XG4gICAgdmFyIGNoID0gdGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpO1xuICAgIGlmIChfaWRlbnRpZmllci5pc0lkZW50aWZpZXJDaGFyKGNoLCBhc3RyYWwpKSB7XG4gICAgICB0aGlzLnBvcyArPSBjaCA8PSAweGZmZmYgPyAxIDogMjtcbiAgICB9IGVsc2UgaWYgKGNoID09PSA5Mikge1xuICAgICAgLy8gXCJcXFwiXG4gICAgICB0aGlzLmNvbnRhaW5zRXNjID0gdHJ1ZTtcbiAgICAgIHdvcmQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICB2YXIgZXNjU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcykgIT0gMTE3KSAvLyBcInVcIlxuICAgICAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIkV4cGVjdGluZyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSBcXFxcdVhYWFhcIik7XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgdmFyIGVzYyA9IHRoaXMucmVhZENvZGVQb2ludCgpO1xuICAgICAgaWYgKCEoZmlyc3QgPyBfaWRlbnRpZmllci5pc0lkZW50aWZpZXJTdGFydCA6IF9pZGVudGlmaWVyLmlzSWRlbnRpZmllckNoYXIpKGVzYywgYXN0cmFsKSkgdGhpcy5yYWlzZShlc2NTdGFydCwgXCJJbnZhbGlkIFVuaWNvZGUgZXNjYXBlXCIpO1xuICAgICAgd29yZCArPSBjb2RlUG9pbnRUb1N0cmluZyhlc2MpO1xuICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZmlyc3QgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gd29yZCArIHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xufTtcblxuLy8gUmVhZCBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQgdG9rZW4uIFdpbGwgY2hlY2sgZm9yIHJlc2VydmVkXG4vLyB3b3JkcyB3aGVuIG5lY2Vzc2FyeS5cblxucHAucmVhZFdvcmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB3b3JkID0gdGhpcy5yZWFkV29yZDEoKTtcbiAgdmFyIHR5cGUgPSBfdG9rZW50eXBlLnR5cGVzLm5hbWU7XG4gIGlmICgodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgfHwgIXRoaXMuY29udGFpbnNFc2MpICYmIHRoaXMua2V5d29yZHMudGVzdCh3b3JkKSkgdHlwZSA9IF90b2tlbnR5cGUua2V5d29yZHNbd29yZF07XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGUsIHdvcmQpO1xufTtcblxufSx7XCIuL2lkZW50aWZpZXJcIjoyLFwiLi9sb2N1dGlsXCI6NSxcIi4vc3RhdGVcIjoxMCxcIi4vdG9rZW50eXBlXCI6MTQsXCIuL3doaXRlc3BhY2VcIjoxNn1dLDE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vICMjIFRva2VuIHR5cGVzXG5cbi8vIFRoZSBhc3NpZ25tZW50IG9mIGZpbmUtZ3JhaW5lZCwgaW5mb3JtYXRpb24tY2FycnlpbmcgdHlwZSBvYmplY3RzXG4vLyBhbGxvd3MgdGhlIHRva2VuaXplciB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGFcbi8vIHRva2VuIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjaGVhcCBmb3IgdGhlIHBhcnNlciB0byBsb29rIHVwLlxuXG4vLyBBbGwgdG9rZW4gdHlwZSB2YXJpYWJsZXMgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlLCB0byBtYWtlIHRoZW1cbi8vIGVhc3kgdG8gcmVjb2duaXplLlxuXG4vLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gcmVndWxhclxuLy8gZXhwcmVzc2lvbnMgYW5kIGRpdmlzaW9ucy4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IGNhblxuLy8gYmUgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiAodGh1cywgYSBzbGFzaCBhZnRlciB0aGVtIHdvdWxkIGJlIGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbikuXG4vL1xuLy8gVGhlIGBzdGFydHNFeHByYCBwcm9wZXJ0eSBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSB0b2tlbiBlbmRzIGFcbi8vIGB5aWVsZGAgZXhwcmVzc2lvbi4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IGVpdGhlciBjYW5cbi8vIGRpcmVjdGx5IHN0YXJ0IGFuIGV4cHJlc3Npb24gKGxpa2UgYSBxdW90YXRpb24gbWFyaykgb3IgY2FuXG4vLyBjb250aW51ZSBhbiBleHByZXNzaW9uIChsaWtlIHRoZSBib2R5IG9mIGEgc3RyaW5nKS5cbi8vXG4vLyBgaXNMb29wYCBtYXJrcyBhIGtleXdvcmQgYXMgc3RhcnRpbmcgYSBsb29wLCB3aGljaCBpcyBpbXBvcnRhbnRcbi8vIHRvIGtub3cgd2hlbiBwYXJzaW5nIGEgbGFiZWwsIGluIG9yZGVyIHRvIGFsbG93IG9yIGRpc2FsbG93XG4vLyBjb250aW51ZSBqdW1wcyB0byB0aGF0IGxhYmVsLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFRva2VuVHlwZSA9IGZ1bmN0aW9uIFRva2VuVHlwZShsYWJlbCkge1xuICB2YXIgY29uZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2tlblR5cGUpO1xuXG4gIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgdGhpcy5rZXl3b3JkID0gY29uZi5rZXl3b3JkO1xuICB0aGlzLmJlZm9yZUV4cHIgPSAhIWNvbmYuYmVmb3JlRXhwcjtcbiAgdGhpcy5zdGFydHNFeHByID0gISFjb25mLnN0YXJ0c0V4cHI7XG4gIHRoaXMuaXNMb29wID0gISFjb25mLmlzTG9vcDtcbiAgdGhpcy5pc0Fzc2lnbiA9ICEhY29uZi5pc0Fzc2lnbjtcbiAgdGhpcy5wcmVmaXggPSAhIWNvbmYucHJlZml4O1xuICB0aGlzLnBvc3RmaXggPSAhIWNvbmYucG9zdGZpeDtcbiAgdGhpcy5iaW5vcCA9IGNvbmYuYmlub3AgfHwgbnVsbDtcbiAgdGhpcy51cGRhdGVDb250ZXh0ID0gbnVsbDtcbn07XG5cbmV4cG9ydHMuVG9rZW5UeXBlID0gVG9rZW5UeXBlO1xuXG5mdW5jdGlvbiBiaW5vcChuYW1lLCBwcmVjKSB7XG4gIHJldHVybiBuZXcgVG9rZW5UeXBlKG5hbWUsIHsgYmVmb3JlRXhwcjogdHJ1ZSwgYmlub3A6IHByZWMgfSk7XG59XG52YXIgYmVmb3JlRXhwciA9IHsgYmVmb3JlRXhwcjogdHJ1ZSB9LFxuICAgIHN0YXJ0c0V4cHIgPSB7IHN0YXJ0c0V4cHI6IHRydWUgfTtcblxudmFyIHR5cGVzID0ge1xuICBudW06IG5ldyBUb2tlblR5cGUoXCJudW1cIiwgc3RhcnRzRXhwciksXG4gIHJlZ2V4cDogbmV3IFRva2VuVHlwZShcInJlZ2V4cFwiLCBzdGFydHNFeHByKSxcbiAgc3RyaW5nOiBuZXcgVG9rZW5UeXBlKFwic3RyaW5nXCIsIHN0YXJ0c0V4cHIpLFxuICBuYW1lOiBuZXcgVG9rZW5UeXBlKFwibmFtZVwiLCBzdGFydHNFeHByKSxcbiAgZW9mOiBuZXcgVG9rZW5UeXBlKFwiZW9mXCIpLFxuXG4gIC8vIFB1bmN0dWF0aW9uIHRva2VuIHR5cGVzLlxuICBicmFja2V0TDogbmV3IFRva2VuVHlwZShcIltcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlIH0pLFxuICBicmFja2V0UjogbmV3IFRva2VuVHlwZShcIl1cIiksXG4gIGJyYWNlTDogbmV3IFRva2VuVHlwZShcIntcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlIH0pLFxuICBicmFjZVI6IG5ldyBUb2tlblR5cGUoXCJ9XCIpLFxuICBwYXJlbkw6IG5ldyBUb2tlblR5cGUoXCIoXCIsIHsgYmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZSB9KSxcbiAgcGFyZW5SOiBuZXcgVG9rZW5UeXBlKFwiKVwiKSxcbiAgY29tbWE6IG5ldyBUb2tlblR5cGUoXCIsXCIsIGJlZm9yZUV4cHIpLFxuICBzZW1pOiBuZXcgVG9rZW5UeXBlKFwiO1wiLCBiZWZvcmVFeHByKSxcbiAgY29sb246IG5ldyBUb2tlblR5cGUoXCI6XCIsIGJlZm9yZUV4cHIpLFxuICBkb3Q6IG5ldyBUb2tlblR5cGUoXCIuXCIpLFxuICBxdWVzdGlvbjogbmV3IFRva2VuVHlwZShcIj9cIiwgYmVmb3JlRXhwciksXG4gIGFycm93OiBuZXcgVG9rZW5UeXBlKFwiPT5cIiwgYmVmb3JlRXhwciksXG4gIHRlbXBsYXRlOiBuZXcgVG9rZW5UeXBlKFwidGVtcGxhdGVcIiksXG4gIGVsbGlwc2lzOiBuZXcgVG9rZW5UeXBlKFwiLi4uXCIsIGJlZm9yZUV4cHIpLFxuICBiYWNrUXVvdGU6IG5ldyBUb2tlblR5cGUoXCJgXCIsIHN0YXJ0c0V4cHIpLFxuICBkb2xsYXJCcmFjZUw6IG5ldyBUb2tlblR5cGUoXCIke1wiLCB7IGJlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWUgfSksXG5cbiAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgLy8gcGFyc2VyIHVzZSB0aGVtIHByb3Blcmx5ICh0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgcHJvcGVydGllcyBpc1xuICAvLyB3aGF0IGNhdGVnb3JpemVzIHRoZW0gYXMgb3BlcmF0b3JzKS5cbiAgLy9cbiAgLy8gYGJpbm9wYCwgd2hlbiBwcmVzZW50LCBzcGVjaWZpZXMgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIGEgYmluYXJ5XG4gIC8vIG9wZXJhdG9yLCBhbmQgd2lsbCByZWZlciB0byBpdHMgcHJlY2VkZW5jZS5cbiAgLy9cbiAgLy8gYHByZWZpeGAgYW5kIGBwb3N0Zml4YCBtYXJrIHRoZSBvcGVyYXRvciBhcyBhIHByZWZpeCBvciBwb3N0Zml4XG4gIC8vIHVuYXJ5IG9wZXJhdG9yLlxuICAvL1xuICAvLyBgaXNBc3NpZ25gIG1hcmtzIGFsbCBvZiBgPWAsIGArPWAsIGAtPWAgZXRjZXRlcmEsIHdoaWNoIGFjdCBhc1xuICAvLyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYSB2ZXJ5IGxvdyBwcmVjZWRlbmNlLCB0aGF0IHNob3VsZCByZXN1bHRcbiAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgZXE6IG5ldyBUb2tlblR5cGUoXCI9XCIsIHsgYmVmb3JlRXhwcjogdHJ1ZSwgaXNBc3NpZ246IHRydWUgfSksXG4gIGFzc2lnbjogbmV3IFRva2VuVHlwZShcIl89XCIsIHsgYmVmb3JlRXhwcjogdHJ1ZSwgaXNBc3NpZ246IHRydWUgfSksXG4gIGluY0RlYzogbmV3IFRva2VuVHlwZShcIisrLy0tXCIsIHsgcHJlZml4OiB0cnVlLCBwb3N0Zml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlIH0pLFxuICBwcmVmaXg6IG5ldyBUb2tlblR5cGUoXCJwcmVmaXhcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBwcmVmaXg6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWUgfSksXG4gIGxvZ2ljYWxPUjogYmlub3AoXCJ8fFwiLCAxKSxcbiAgbG9naWNhbEFORDogYmlub3AoXCImJlwiLCAyKSxcbiAgYml0d2lzZU9SOiBiaW5vcChcInxcIiwgMyksXG4gIGJpdHdpc2VYT1I6IGJpbm9wKFwiXlwiLCA0KSxcbiAgYml0d2lzZUFORDogYmlub3AoXCImXCIsIDUpLFxuICBlcXVhbGl0eTogYmlub3AoXCI9PS8hPVwiLCA2KSxcbiAgcmVsYXRpb25hbDogYmlub3AoXCI8Lz5cIiwgNyksXG4gIGJpdFNoaWZ0OiBiaW5vcChcIjw8Lz4+XCIsIDgpLFxuICBwbHVzTWluOiBuZXcgVG9rZW5UeXBlKFwiKy8tXCIsIHsgYmVmb3JlRXhwcjogdHJ1ZSwgYmlub3A6IDksIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZSB9KSxcbiAgbW9kdWxvOiBiaW5vcChcIiVcIiwgMTApLFxuICBzdGFyOiBiaW5vcChcIipcIiwgMTApLFxuICBzbGFzaDogYmlub3AoXCIvXCIsIDEwKSxcbiAgc3RhcnN0YXI6IG5ldyBUb2tlblR5cGUoXCIqKlwiLCB7IGJlZm9yZUV4cHI6IHRydWUgfSlcbn07XG5cbmV4cG9ydHMudHlwZXMgPSB0eXBlcztcbi8vIE1hcCBrZXl3b3JkIG5hbWVzIHRvIHRva2VuIHR5cGVzLlxuXG52YXIga2V5d29yZHMgPSB7fTtcblxuZXhwb3J0cy5rZXl3b3JkcyA9IGtleXdvcmRzO1xuLy8gU3VjY2luY3QgZGVmaW5pdGlvbnMgb2Yga2V5d29yZCB0b2tlbiB0eXBlc1xuZnVuY3Rpb24ga3cobmFtZSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gIG9wdGlvbnMua2V5d29yZCA9IG5hbWU7XG4gIGtleXdvcmRzW25hbWVdID0gdHlwZXNbXCJfXCIgKyBuYW1lXSA9IG5ldyBUb2tlblR5cGUobmFtZSwgb3B0aW9ucyk7XG59XG5cbmt3KFwiYnJlYWtcIik7XG5rdyhcImNhc2VcIiwgYmVmb3JlRXhwcik7XG5rdyhcImNhdGNoXCIpO1xua3coXCJjb250aW51ZVwiKTtcbmt3KFwiZGVidWdnZXJcIik7XG5rdyhcImRlZmF1bHRcIiwgYmVmb3JlRXhwcik7XG5rdyhcImRvXCIsIHsgaXNMb29wOiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlIH0pO1xua3coXCJlbHNlXCIsIGJlZm9yZUV4cHIpO1xua3coXCJmaW5hbGx5XCIpO1xua3coXCJmb3JcIiwgeyBpc0xvb3A6IHRydWUgfSk7XG5rdyhcImZ1bmN0aW9uXCIsIHN0YXJ0c0V4cHIpO1xua3coXCJpZlwiKTtcbmt3KFwicmV0dXJuXCIsIGJlZm9yZUV4cHIpO1xua3coXCJzd2l0Y2hcIik7XG5rdyhcInRocm93XCIsIGJlZm9yZUV4cHIpO1xua3coXCJ0cnlcIik7XG5rdyhcInZhclwiKTtcbmt3KFwiY29uc3RcIik7XG5rdyhcIndoaWxlXCIsIHsgaXNMb29wOiB0cnVlIH0pO1xua3coXCJ3aXRoXCIpO1xua3coXCJuZXdcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlIH0pO1xua3coXCJ0aGlzXCIsIHN0YXJ0c0V4cHIpO1xua3coXCJzdXBlclwiLCBzdGFydHNFeHByKTtcbmt3KFwiY2xhc3NcIik7XG5rdyhcImV4dGVuZHNcIiwgYmVmb3JlRXhwcik7XG5rdyhcImV4cG9ydFwiKTtcbmt3KFwiaW1wb3J0XCIpO1xua3coXCJudWxsXCIsIHN0YXJ0c0V4cHIpO1xua3coXCJ0cnVlXCIsIHN0YXJ0c0V4cHIpO1xua3coXCJmYWxzZVwiLCBzdGFydHNFeHByKTtcbmt3KFwiaW5cIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogNyB9KTtcbmt3KFwiaW5zdGFuY2VvZlwiLCB7IGJlZm9yZUV4cHI6IHRydWUsIGJpbm9wOiA3IH0pO1xua3coXCJ0eXBlb2ZcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBwcmVmaXg6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWUgfSk7XG5rdyhcInZvaWRcIiwgeyBiZWZvcmVFeHByOiB0cnVlLCBwcmVmaXg6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWUgfSk7XG5rdyhcImRlbGV0ZVwiLCB7IGJlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZSB9KTtcblxufSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuZXhwb3J0cy5oYXMgPSBoYXM7XG5cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xufVxuXG4vLyBDaGVja3MgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LlxuXG5mdW5jdGlvbiBoYXMob2JqLCBwcm9wTmFtZSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcE5hbWUpO1xufVxuXG59LHt9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBNYXRjaGVzIGEgd2hvbGUgbGluZSBicmVhayAod2hlcmUgQ1JMRiBpcyBjb25zaWRlcmVkIGEgc2luZ2xlXG4vLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzTmV3TGluZSA9IGlzTmV3TGluZTtcbnZhciBsaW5lQnJlYWsgPSAvXFxyXFxuP3xcXG58XFx1MjAyOHxcXHUyMDI5LztcbmV4cG9ydHMubGluZUJyZWFrID0gbGluZUJyZWFrO1xudmFyIGxpbmVCcmVha0cgPSBuZXcgUmVnRXhwKGxpbmVCcmVhay5zb3VyY2UsIFwiZ1wiKTtcblxuZXhwb3J0cy5saW5lQnJlYWtHID0gbGluZUJyZWFrRztcblxuZnVuY3Rpb24gaXNOZXdMaW5lKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPT09IDEwIHx8IGNvZGUgPT09IDEzIHx8IGNvZGUgPT09IDB4MjAyOCB8fCBjb2RlID09IDB4MjAyOTtcbn1cblxudmFyIG5vbkFTQ0lJd2hpdGVzcGFjZSA9IC9bXFx1MTY4MFxcdTE4MGVcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmXS87XG5cbmV4cG9ydHMubm9uQVNDSUl3aGl0ZXNwYWNlID0gbm9uQVNDSUl3aGl0ZXNwYWNlO1xudmFyIHNraXBXaGl0ZVNwYWNlID0gLyg/Olxcc3xcXC9cXC8uKnxcXC9cXCpbXl0qP1xcKlxcLykqL2c7XG5leHBvcnRzLnNraXBXaGl0ZVNwYWNlID0gc2tpcFdoaXRlU3BhY2U7XG5cbn0se31dfSx7fSxbM10pKDMpXG59KTtcbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWxjM0J5WldVdmJtOWtaVjl0YjJSMWJHVnpMMkZqYjNKdUwyUnBjM1F2WVdOdmNtNHVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpS0daMWJtTjBhVzl1S0dZcGUybG1LSFI1Y0dWdlppQmxlSEJ2Y25SelBUMDlYQ0p2WW1wbFkzUmNJaVltZEhsd1pXOW1JRzF2WkhWc1pTRTlQVndpZFc1a1pXWnBibVZrWENJcGUyMXZaSFZzWlM1bGVIQnZjblJ6UFdZb0tYMWxiSE5sSUdsbUtIUjVjR1Z2WmlCa1pXWnBibVU5UFQxY0ltWjFibU4wYVc5dVhDSW1KbVJsWm1sdVpTNWhiV1FwZTJSbFptbHVaU2hiWFN4bUtYMWxiSE5sZTNaaGNpQm5PMmxtS0hSNWNHVnZaaUIzYVc1a2IzY2hQVDFjSW5WdVpHVm1hVzVsWkZ3aUtYdG5QWGRwYm1SdmQzMWxiSE5sSUdsbUtIUjVjR1Z2WmlCbmJHOWlZV3doUFQxY0luVnVaR1ZtYVc1bFpGd2lLWHRuUFdkc2IySmhiSDFsYkhObElHbG1LSFI1Y0dWdlppQnpaV3htSVQwOVhDSjFibVJsWm1sdVpXUmNJaWw3WnoxelpXeG1mV1ZzYzJWN1p6MTBhR2x6ZldjdVlXTnZjbTRnUFNCbUtDbDlmU2tvWm5WdVkzUnBiMjRvS1h0MllYSWdaR1ZtYVc1bExHMXZaSFZzWlN4bGVIQnZjblJ6TzNKbGRIVnliaUFvWm5WdVkzUnBiMjRnWlNoMExHNHNjaWw3Wm5WdVkzUnBiMjRnY3lodkxIVXBlMmxtS0NGdVcyOWRLWHRwWmlnaGRGdHZYU2w3ZG1GeUlHRTlkSGx3Wlc5bUlISmxjWFZwY21VOVBWd2lablZ1WTNScGIyNWNJaVltY21WeGRXbHlaVHRwWmlnaGRTWW1ZU2x5WlhSMWNtNGdZU2h2TENFd0tUdHBaaWhwS1hKbGRIVnliaUJwS0c4c0lUQXBPM1poY2lCbVBXNWxkeUJGY25KdmNpaGNJa05oYm01dmRDQm1hVzVrSUcxdlpIVnNaU0FuWENJcmJ5dGNJaWRjSWlrN2RHaHliM2NnWmk1amIyUmxQVndpVFU5RVZVeEZYMDVQVkY5R1QxVk9SRndpTEdaOWRtRnlJR3c5Ymx0dlhUMTdaWGh3YjNKMGN6cDdmWDA3ZEZ0dlhWc3dYUzVqWVd4c0tHd3VaWGh3YjNKMGN5eG1kVzVqZEdsdmJpaGxLWHQyWVhJZ2JqMTBXMjlkV3pGZFcyVmRPM0psZEhWeWJpQnpLRzQvYmpwbEtYMHNiQ3hzTG1WNGNHOXlkSE1zWlN4MExHNHNjaWw5Y21WMGRYSnVJRzViYjEwdVpYaHdiM0owYzMxMllYSWdhVDEwZVhCbGIyWWdjbVZ4ZFdseVpUMDlYQ0ptZFc1amRHbHZibHdpSmlaeVpYRjFhWEpsTzJadmNpaDJZWElnYnowd08yODhjaTVzWlc1bmRHZzdieXNyS1hNb2NsdHZYU2s3Y21WMGRYSnVJSE45S1NoN01UcGJablZ1WTNScGIyNG9YMlJsY21WeFh5eHRiMlIxYkdVc1pYaHdiM0owY3lsN1hHNHZMeUJCSUhKbFkzVnljMmwyWlNCa1pYTmpaVzUwSUhCaGNuTmxjaUJ2Y0dWeVlYUmxjeUJpZVNCa1pXWnBibWx1WnlCbWRXNWpkR2x2Ym5NZ1ptOXlJR0ZzYkZ4dUx5OGdjM2x1ZEdGamRHbGpJR1ZzWlcxbGJuUnpMQ0JoYm1RZ2NtVmpkWEp6YVhabGJIa2dZMkZzYkdsdVp5QjBhRzl6WlN3Z1pXRmphQ0JtZFc1amRHbHZibHh1THk4Z1lXUjJZVzVqYVc1bklIUm9aU0JwYm5CMWRDQnpkSEpsWVcwZ1lXNWtJSEpsZEhWeWJtbHVaeUJoYmlCQlUxUWdibTlrWlM0Z1VISmxZMlZrWlc1alpWeHVMeThnYjJZZ1kyOXVjM1J5ZFdOMGN5QW9abTl5SUdWNFlXMXdiR1VzSUhSb1pTQm1ZV04wSUhSb1lYUWdZQ0Y0V3pGZFlDQnRaV0Z1Y3lCZ0lTaDRXekZkS1dCY2JpOHZJR2x1YzNSbFlXUWdiMllnWUNnaGVDbGJNVjFnSUdseklHaGhibVJzWldRZ1lua2dkR2hsSUdaaFkzUWdkR2hoZENCMGFHVWdjR0Z5YzJWeVhHNHZMeUJtZFc1amRHbHZiaUIwYUdGMElIQmhjbk5sY3lCMWJtRnllU0J3Y21WbWFYZ2diM0JsY21GMGIzSnpJR2x6SUdOaGJHeGxaQ0JtYVhKemRDd2dZVzVrWEc0dkx5QnBiaUIwZFhKdUlHTmhiR3h6SUhSb1pTQm1kVzVqZEdsdmJpQjBhR0YwSUhCaGNuTmxjeUJnVzExZ0lITjFZbk5qY21sd2RITWc0b0NVSUhSb1lYUmNiaTh2SUhkaGVTd2dhWFFuYkd3Z2NtVmpaV2wyWlNCMGFHVWdibTlrWlNCbWIzSWdZSGhiTVYxZ0lHRnNjbVZoWkhrZ2NHRnljMlZrTENCaGJtUWdkM0poY0hOY2JpOHZJQ3AwYUdGMEtpQnBiaUIwYUdVZ2RXNWhjbmtnYjNCbGNtRjBiM0lnYm05a1pTNWNiaTh2WEc0dkx5QkJZMjl5YmlCMWMyVnpJR0Z1SUZ0dmNHVnlZWFJ2Y2lCd2NtVmpaV1JsYm1ObElIQmhjbk5sY2wxYmIzQndYU0IwYnlCb1lXNWtiR1VnWW1sdVlYSjVYRzR2THlCdmNHVnlZWFJ2Y2lCd2NtVmpaV1JsYm1ObExDQmlaV05oZFhObElHbDBJR2x6SUcxMVkyZ2diVzl5WlNCamIyMXdZV04wSUhSb1lXNGdkWE5wYm1kY2JpOHZJSFJvWlNCMFpXTm9ibWx4ZFdVZ2IzVjBiR2x1WldRZ1lXSnZkbVVzSUhkb2FXTm9JSFZ6WlhNZ1pHbG1abVZ5Wlc1MExDQnVaWE4wYVc1blhHNHZMeUJtZFc1amRHbHZibk1nZEc4Z2MzQmxZMmxtZVNCd2NtVmpaV1JsYm1ObExDQm1iM0lnWVd4c0lHOW1JSFJvWlNCMFpXNGdZbWx1WVhKNVhHNHZMeUJ3Y21WalpXUmxibU5sSUd4bGRtVnNjeUIwYUdGMElFcGhkbUZUWTNKcGNIUWdaR1ZtYVc1bGN5NWNiaTh2WEc0dkx5QmJiM0J3WFRvZ2FIUjBjRG92TDJWdUxuZHBhMmx3WldScFlTNXZjbWN2ZDJscmFTOVBjR1Z5WVhSdmNpMXdjbVZqWldSbGJtTmxYM0JoY25ObGNseHVYRzVjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1ZG1GeUlGOTBiMnRsYm5SNWNHVWdQU0JmWkdWeVpYRmZLRndpTGk5MGIydGxiblI1Y0dWY0lpazdYRzVjYm5aaGNpQmZjM1JoZEdVZ1BTQmZaR1Z5WlhGZktGd2lMaTl6ZEdGMFpWd2lLVHRjYmx4dWRtRnlJSEJ3SUQwZ1gzTjBZWFJsTGxCaGNuTmxjaTV3Y205MGIzUjVjR1U3WEc1Y2JpOHZJRU5vWldOcklHbG1JSEJ5YjNCbGNuUjVJRzVoYldVZ1kyeGhjMmhsY3lCM2FYUm9JR0ZzY21WaFpIa2dZV1JrWldRdVhHNHZMeUJQWW1wbFkzUXZZMnhoYzNNZ1oyVjBkR1Z5Y3lCaGJtUWdjMlYwZEdWeWN5QmhjbVVnYm05MElHRnNiRzkzWldRZ2RHOGdZMnhoYzJnZzRvQ1VYRzR2THlCbGFYUm9aWElnZDJsMGFDQmxZV05vSUc5MGFHVnlJRzl5SUhkcGRHZ2dZVzRnYVc1cGRDQndjbTl3WlhKMGVTRGlnSlFnWVc1a0lHbHVYRzR2THlCemRISnBZM1FnYlc5a1pTd2dhVzVwZENCd2NtOXdaWEowYVdWeklHRnlaU0JoYkhOdklHNXZkQ0JoYkd4dmQyVmtJSFJ2SUdKbElISmxjR1ZoZEdWa0xseHVYRzV3Y0M1amFHVmphMUJ5YjNCRGJHRnphQ0E5SUdaMWJtTjBhVzl1SUNod2NtOXdMQ0J3Y205d1NHRnphQ2tnZTF4dUlDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRDQ5SURZZ0ppWWdLSEJ5YjNBdVkyOXRjSFYwWldRZ2ZId2djSEp2Y0M1dFpYUm9iMlFnZkh3Z2NISnZjQzV6YUc5eWRHaGhibVFwS1NCeVpYUjFjbTQ3WEc0Z0lIWmhjaUJyWlhrZ1BTQndjbTl3TG10bGVUdDJZWElnYm1GdFpTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ2MzZHBkR05vSUNoclpYa3VkSGx3WlNrZ2UxeHVJQ0FnSUdOaGMyVWdYQ0pKWkdWdWRHbG1hV1Z5WENJNlhHNGdJQ0FnSUNCdVlXMWxJRDBnYTJWNUxtNWhiV1U3WW5KbFlXczdYRzRnSUNBZ1kyRnpaU0JjSWt4cGRHVnlZV3hjSWpwY2JpQWdJQ0FnSUc1aGJXVWdQU0JUZEhKcGJtY29hMlY1TG5aaGJIVmxLVHRpY21WaGF6dGNiaUFnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnY21WMGRYSnVPMXh1SUNCOVhHNGdJSFpoY2lCcmFXNWtJRDBnY0hKdmNDNXJhVzVrTzF4dVhHNGdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXVaV050WVZabGNuTnBiMjRnUGowZ05pa2dlMXh1SUNBZ0lHbG1JQ2h1WVcxbElEMDlQU0JjSWw5ZmNISnZkRzlmWDF3aUlDWW1JR3RwYm1RZ1BUMDlJRndpYVc1cGRGd2lLU0I3WEc0Z0lDQWdJQ0JwWmlBb2NISnZjRWhoYzJndWNISnZkRzhwSUhSb2FYTXVjbUZwYzJWU1pXTnZkbVZ5WVdKc1pTaHJaWGt1YzNSaGNuUXNJRndpVW1Wa1pXWnBibWwwYVc5dUlHOW1JRjlmY0hKdmRHOWZYeUJ3Y205d1pYSjBlVndpS1R0Y2JpQWdJQ0FnSUhCeWIzQklZWE5vTG5CeWIzUnZJRDBnZEhKMVpUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVPMXh1SUNCOVhHNGdJRzVoYldVZ1BTQmNJaVJjSWlBcklHNWhiV1U3WEc0Z0lIWmhjaUJ2ZEdobGNpQTlJSEJ5YjNCSVlYTm9XMjVoYldWZE8xeHVJQ0JwWmlBb2IzUm9aWElwSUh0Y2JpQWdJQ0IyWVhJZ2FYTkhaWFJUWlhRZ1BTQnJhVzVrSUNFOVBTQmNJbWx1YVhSY0lqdGNiaUFnSUNCcFppQW9LSFJvYVhNdWMzUnlhV04wSUh4OElHbHpSMlYwVTJWMEtTQW1KaUJ2ZEdobGNsdHJhVzVrWFNCOGZDQWhLR2x6UjJWMFUyVjBJRjRnYjNSb1pYSXVhVzVwZENrcElIUm9hWE11Y21GcGMyVlNaV052ZG1WeVlXSnNaU2hyWlhrdWMzUmhjblFzSUZ3aVVtVmtaV1pwYm1sMGFXOXVJRzltSUhCeWIzQmxjblI1WENJcE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOTBhR1Z5SUQwZ2NISnZjRWhoYzJoYmJtRnRaVjBnUFNCN1hHNGdJQ0FnSUNCcGJtbDBPaUJtWVd4elpTeGNiaUFnSUNBZ0lHZGxkRG9nWm1Gc2MyVXNYRzRnSUNBZ0lDQnpaWFE2SUdaaGJITmxYRzRnSUNBZ2ZUdGNiaUFnZlZ4dUlDQnZkR2hsY2x0cmFXNWtYU0E5SUhSeWRXVTdYRzU5TzF4dVhHNHZMeUFqSXlNZ1JYaHdjbVZ6YzJsdmJpQndZWEp6YVc1blhHNWNiaTh2SUZSb1pYTmxJRzVsYzNRc0lHWnliMjBnZEdobElHMXZjM1FnWjJWdVpYSmhiQ0JsZUhCeVpYTnphVzl1SUhSNWNHVWdZWFFnZEdobElIUnZjQ0IwYjF4dUx5OGdKMkYwYjIxcFl5Y3NJRzV2Ym1ScGRtbHphV0pzWlNCbGVIQnlaWE56YVc5dUlIUjVjR1Z6SUdGMElIUm9aU0JpYjNSMGIyMHVJRTF2YzNRZ2IyWmNiaTh2SUhSb1pTQm1kVzVqZEdsdmJuTWdkMmxzYkNCemFXMXdiSGtnYkdWMElIUm9aU0JtZFc1amRHbHZiaWh6S1NCaVpXeHZkeUIwYUdWdElIQmhjbk5sTEZ4dUx5OGdZVzVrTENBcWFXWXFJSFJvWlNCemVXNTBZV04wYVdNZ1kyOXVjM1J5ZFdOMElIUm9aWGtnYUdGdVpHeGxJR2x6SUhCeVpYTmxiblFzSUhkeVlYQmNiaTh2SUhSb1pTQkJVMVFnYm05a1pTQjBhR0YwSUhSb1pTQnBibTVsY2lCd1lYSnpaWElnWjJGMlpTQjBhR1Z0SUdsdUlHRnViM1JvWlhJZ2JtOWtaUzVjYmx4dUx5OGdVR0Z5YzJVZ1lTQm1kV3hzSUdWNGNISmxjM05wYjI0dUlGUm9aU0J2Y0hScGIyNWhiQ0JoY21kMWJXVnVkSE1nWVhKbElIVnpaV1FnZEc5Y2JpOHZJR1p2Y21KcFpDQjBhR1VnWUdsdVlDQnZjR1Z5WVhSdmNpQW9hVzRnWm05eUlHeHZiM0J6SUdsdWFYUmhiR2w2WVhScGIyNGdaWGh3Y21WemMybHZibk1wWEc0dkx5QmhibVFnY0hKdmRtbGtaU0J5WldabGNtVnVZMlVnWm05eUlITjBiM0pwYm1jZ0p6MG5JRzl3WlhKaGRHOXlJR2x1YzJsa1pTQnphRzl5ZEdoaGJtUmNiaTh2SUhCeWIzQmxjblI1SUdGemMybG5ibTFsYm5RZ2FXNGdZMjl1ZEdWNGRITWdkMmhsY21VZ1ltOTBhQ0J2WW1wbFkzUWdaWGh3Y21WemMybHZibHh1THk4Z1lXNWtJRzlpYW1WamRDQndZWFIwWlhKdUlHMXBaMmgwSUdGd2NHVmhjaUFvYzI4Z2FYUW5jeUJ3YjNOemFXSnNaU0IwYnlCeVlXbHpaVnh1THk4Z1pHVnNZWGxsWkNCemVXNTBZWGdnWlhKeWIzSWdZWFFnWTI5eWNtVmpkQ0J3YjNOcGRHbHZiaWt1WEc1Y2JuQndMbkJoY25ObFJYaHdjbVZ6YzJsdmJpQTlJR1oxYm1OMGFXOXVJQ2h1YjBsdUxDQnlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6S1NCN1hHNGdJSFpoY2lCemRHRnlkRkJ2Y3lBOUlIUm9hWE11YzNSaGNuUXNYRzRnSUNBZ0lDQnpkR0Z5ZEV4dll5QTlJSFJvYVhNdWMzUmhjblJNYjJNN1hHNGdJSFpoY2lCbGVIQnlJRDBnZEdocGN5NXdZWEp6WlUxaGVXSmxRWE56YVdkdUtHNXZTVzRzSUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBPMXh1SUNCcFppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1OdmJXMWhLU0I3WEc0Z0lDQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pVRjBLSE4wWVhKMFVHOXpMQ0J6ZEdGeWRFeHZZeWs3WEc0Z0lDQWdibTlrWlM1bGVIQnlaWE56YVc5dWN5QTlJRnRsZUhCeVhUdGNiaUFnSUNCM2FHbHNaU0FvZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVqYjIxdFlTa3BJRzV2WkdVdVpYaHdjbVZ6YzJsdmJuTXVjSFZ6YUNoMGFHbHpMbkJoY25ObFRXRjVZbVZCYzNOcFoyNG9ibTlKYml3Z2NtVm1SR1Z6ZEhKMVkzUjFjbWx1WjBWeWNtOXljeWtwTzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTV2WkdVb2JtOWtaU3dnWENKVFpYRjFaVzVqWlVWNGNISmxjM05wYjI1Y0lpazdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHVjRjSEk3WEc1OU8xeHVYRzR2THlCUVlYSnpaU0JoYmlCaGMzTnBaMjV0Wlc1MElHVjRjSEpsYzNOcGIyNHVJRlJvYVhNZ2FXNWpiSFZrWlhNZ1lYQndiR2xqWVhScGIyNXpJRzltWEc0dkx5QnZjR1Z5WVhSdmNuTWdiR2xyWlNCZ0t6MWdMbHh1WEc1d2NDNXdZWEp6WlUxaGVXSmxRWE56YVdkdUlEMGdablZ1WTNScGIyNGdLRzV2U1c0c0lISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1zSUdGbWRHVnlUR1ZtZEZCaGNuTmxLU0I3WEc0Z0lHbG1JQ2gwYUdsekxtbHVSMlZ1WlhKaGRHOXlJQ1ltSUhSb2FYTXVhWE5EYjI1MFpYaDBkV0ZzS0Z3aWVXbGxiR1JjSWlrcElISmxkSFZ5YmlCMGFHbHpMbkJoY25ObFdXbGxiR1FvS1R0Y2JseHVJQ0IyWVhJZ2RtRnNhV1JoZEdWRVpYTjBjblZqZEhWeWFXNW5JRDBnWm1Gc2MyVTdYRzRnSUdsbUlDZ2hjbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lrZ2UxeHVJQ0FnSUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTWdQU0I3SUhOb2IzSjBhR0Z1WkVGemMybG5iam9nTUN3Z2RISmhhV3hwYm1kRGIyMXRZVG9nTUNCOU8xeHVJQ0FnSUhaaGJHbGtZWFJsUkdWemRISjFZM1IxY21sdVp5QTlJSFJ5ZFdVN1hHNGdJSDFjYmlBZ2RtRnlJSE4wWVhKMFVHOXpJRDBnZEdocGN5NXpkR0Z5ZEN4Y2JpQWdJQ0FnSUhOMFlYSjBURzlqSUQwZ2RHaHBjeTV6ZEdGeWRFeHZZenRjYmlBZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG5CaGNtVnVUQ0I4ZkNCMGFHbHpMblI1Y0dVZ1BUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXVZVzFsS1NCMGFHbHpMbkJ2ZEdWdWRHbGhiRUZ5Y205M1FYUWdQU0IwYUdsekxuTjBZWEowTzF4dUlDQjJZWElnYkdWbWRDQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVTnZibVJwZEdsdmJtRnNLRzV2U1c0c0lISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1wTzF4dUlDQnBaaUFvWVdaMFpYSk1aV1owVUdGeWMyVXBJR3hsWm5RZ1BTQmhablJsY2t4bFpuUlFZWEp6WlM1allXeHNLSFJvYVhNc0lHeGxablFzSUhOMFlYSjBVRzl6TENCemRHRnlkRXh2WXlrN1hHNGdJR2xtSUNoMGFHbHpMblI1Y0dVdWFYTkJjM05wWjI0cElIdGNiaUFnSUNCcFppQW9kbUZzYVdSaGRHVkVaWE4wY25WamRIVnlhVzVuS1NCMGFHbHpMbU5vWldOclVHRjBkR1Z5YmtWeWNtOXljeWh5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKekxDQjBjblZsS1R0Y2JpQWdJQ0IyWVhJZ2JtOWtaU0E5SUhSb2FYTXVjM1JoY25ST2IyUmxRWFFvYzNSaGNuUlFiM01zSUhOMFlYSjBURzlqS1R0Y2JpQWdJQ0J1YjJSbExtOXdaWEpoZEc5eUlEMGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQnViMlJsTG14bFpuUWdQU0IwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVpYRWdQeUIwYUdsekxuUnZRWE56YVdkdVlXSnNaU2hzWldaMEtTQTZJR3hsWm5RN1hHNGdJQ0FnY21WbVJHVnpkSEoxWTNSMWNtbHVaMFZ5Y205eWN5NXphRzl5ZEdoaGJtUkJjM05wWjI0Z1BTQXdPeUF2THlCeVpYTmxkQ0JpWldOaGRYTmxJSE5vYjNKMGFHRnVaQ0JrWldaaGRXeDBJSGRoY3lCMWMyVmtJR052Y25KbFkzUnNlVnh1SUNBZ0lIUm9hWE11WTJobFkydE1WbUZzS0d4bFpuUXBPMXh1SUNBZ0lIUm9hWE11Ym1WNGRDZ3BPMXh1SUNBZ0lHNXZaR1V1Y21sbmFIUWdQU0IwYUdsekxuQmhjbk5sVFdGNVltVkJjM05wWjI0b2JtOUpiaWs3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNodWIyUmxMQ0JjSWtGemMybG5ibTFsYm5SRmVIQnlaWE56YVc5dVhDSXBPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJR2xtSUNoMllXeHBaR0YwWlVSbGMzUnlkV04wZFhKcGJtY3BJSFJvYVhNdVkyaGxZMnRGZUhCeVpYTnphVzl1UlhKeWIzSnpLSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25Nc0lIUnlkV1VwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJzWldaME8xeHVmVHRjYmx4dUx5OGdVR0Z5YzJVZ1lTQjBaWEp1WVhKNUlHTnZibVJwZEdsdmJtRnNJQ2hnUHpwZ0tTQnZjR1Z5WVhSdmNpNWNibHh1Y0hBdWNHRnljMlZOWVhsaVpVTnZibVJwZEdsdmJtRnNJRDBnWm5WdVkzUnBiMjRnS0c1dlNXNHNJSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25NcElIdGNiaUFnZG1GeUlITjBZWEowVUc5eklEMGdkR2hwY3k1emRHRnlkQ3hjYmlBZ0lDQWdJSE4wWVhKMFRHOWpJRDBnZEdocGN5NXpkR0Z5ZEV4dll6dGNiaUFnZG1GeUlHVjRjSElnUFNCMGFHbHpMbkJoY25ObFJYaHdjazl3Y3lodWIwbHVMQ0J5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKektUdGNiaUFnYVdZZ0tIUm9hWE11WTJobFkydEZlSEJ5WlhOemFXOXVSWEp5YjNKektISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1wS1NCeVpYUjFjbTRnWlhod2NqdGNiaUFnYVdZZ0tIUm9hWE11WldGMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNYVmxjM1JwYjI0cEtTQjdYRzRnSUNBZ2RtRnlJRzV2WkdVZ1BTQjBhR2x6TG5OMFlYSjBUbTlrWlVGMEtITjBZWEowVUc5ekxDQnpkR0Z5ZEV4dll5azdYRzRnSUNBZ2JtOWtaUzUwWlhOMElEMGdaWGh3Y2p0Y2JpQWdJQ0J1YjJSbExtTnZibk5sY1hWbGJuUWdQU0IwYUdsekxuQmhjbk5sVFdGNVltVkJjM05wWjI0b0tUdGNiaUFnSUNCMGFHbHpMbVY0Y0dWamRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtTnZiRzl1S1R0Y2JpQWdJQ0J1YjJSbExtRnNkR1Z5Ym1GMFpTQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVRnpjMmxuYmlodWIwbHVLVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpUTI5dVpHbDBhVzl1WVd4RmVIQnlaWE56YVc5dVhDSXBPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQmxlSEJ5TzF4dWZUdGNibHh1THk4Z1UzUmhjblFnZEdobElIQnlaV05sWkdWdVkyVWdjR0Z5YzJWeUxseHVYRzV3Y0M1d1lYSnpaVVY0Y0hKUGNITWdQU0JtZFc1amRHbHZiaUFvYm05SmJpd2djbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lrZ2UxeHVJQ0IyWVhJZ2MzUmhjblJRYjNNZ1BTQjBhR2x6TG5OMFlYSjBMRnh1SUNBZ0lDQWdjM1JoY25STWIyTWdQU0IwYUdsekxuTjBZWEowVEc5ak8xeHVJQ0IyWVhJZ1pYaHdjaUE5SUhSb2FYTXVjR0Z5YzJWTllYbGlaVlZ1WVhKNUtISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1zSUdaaGJITmxLVHRjYmlBZ2FXWWdLSFJvYVhNdVkyaGxZMnRGZUhCeVpYTnphVzl1UlhKeWIzSnpLSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25NcEtTQnlaWFIxY200Z1pYaHdjanRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWRmVIQnlUM0FvWlhod2Npd2djM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpMQ0F0TVN3Z2JtOUpiaWs3WEc1OU8xeHVYRzR2THlCUVlYSnpaU0JpYVc1aGNua2diM0JsY21GMGIzSnpJSGRwZEdnZ2RHaGxJRzl3WlhKaGRHOXlJSEJ5WldObFpHVnVZMlVnY0dGeWMybHVaMXh1THk4Z1lXeG5iM0pwZEdodExpQmdiR1ZtZEdBZ2FYTWdkR2hsSUd4bFpuUXRhR0Z1WkNCemFXUmxJRzltSUhSb1pTQnZjR1Z5WVhSdmNpNWNiaTh2SUdCdGFXNVFjbVZqWUNCd2NtOTJhV1JsY3lCamIyNTBaWGgwSUhSb1lYUWdZV3hzYjNkeklIUm9aU0JtZFc1amRHbHZiaUIwYnlCemRHOXdJR0Z1WkZ4dUx5OGdaR1ZtWlhJZ1puVnlkR2hsY2lCd1lYSnpaWElnZEc4Z2IyNWxJRzltSUdsMGN5QmpZV3hzWlhKeklIZG9aVzRnYVhRZ1pXNWpiM1Z1ZEdWeWN5QmhibHh1THk4Z2IzQmxjbUYwYjNJZ2RHaGhkQ0JvWVhNZ1lTQnNiM2RsY2lCd2NtVmpaV1JsYm1ObElIUm9ZVzRnZEdobElITmxkQ0JwZENCcGN5QndZWEp6YVc1bkxseHVYRzV3Y0M1d1lYSnpaVVY0Y0hKUGNDQTlJR1oxYm1OMGFXOXVJQ2hzWldaMExDQnNaV1owVTNSaGNuUlFiM01zSUd4bFpuUlRkR0Z5ZEV4dll5d2diV2x1VUhKbFl5d2dibTlKYmlrZ2UxeHVJQ0IyWVhJZ2NISmxZeUE5SUhSb2FYTXVkSGx3WlM1aWFXNXZjRHRjYmlBZ2FXWWdLSEJ5WldNZ0lUMGdiblZzYkNBbUppQW9JVzV2U1c0Z2ZId2dkR2hwY3k1MGVYQmxJQ0U5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5cGJpa3BJSHRjYmlBZ0lDQnBaaUFvY0hKbFl5QStJRzFwYmxCeVpXTXBJSHRjYmlBZ0lDQWdJSFpoY2lCc2IyZHBZMkZzSUQwZ2RHaHBjeTUwZVhCbElEMDlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbXh2WjJsallXeFBVaUI4ZkNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXViRzluYVdOaGJFRk9SRHRjYmlBZ0lDQWdJSFpoY2lCdmNDQTlJSFJvYVhNdWRtRnNkV1U3WEc0Z0lDQWdJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdJQ0FnSUhaaGNpQnpkR0Z5ZEZCdmN5QTlJSFJvYVhNdWMzUmhjblFzWEc0Z0lDQWdJQ0FnSUNBZ2MzUmhjblJNYjJNZ1BTQjBhR2x6TG5OMFlYSjBURzlqTzF4dUlDQWdJQ0FnZG1GeUlISnBaMmgwSUQwZ2RHaHBjeTV3WVhKelpVVjRjSEpQY0NoMGFHbHpMbkJoY25ObFRXRjVZbVZWYm1GeWVTaHVkV3hzTENCbVlXeHpaU2tzSUhOMFlYSjBVRzl6TENCemRHRnlkRXh2WXl3Z2NISmxZeXdnYm05SmJpazdYRzRnSUNBZ0lDQjJZWElnYm05a1pTQTlJSFJvYVhNdVluVnBiR1JDYVc1aGNua29iR1ZtZEZOMFlYSjBVRzl6TENCc1pXWjBVM1JoY25STWIyTXNJR3hsWm5Rc0lISnBaMmgwTENCdmNDd2diRzluYVdOaGJDazdYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WVhKelpVVjRjSEpQY0NodWIyUmxMQ0JzWldaMFUzUmhjblJRYjNNc0lHeGxablJUZEdGeWRFeHZZeXdnYldsdVVISmxZeXdnYm05SmJpazdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCc1pXWjBPMXh1ZlR0Y2JseHVjSEF1WW5WcGJHUkNhVzVoY25rZ1BTQm1kVzVqZEdsdmJpQW9jM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpMQ0JzWldaMExDQnlhV2RvZEN3Z2IzQXNJR3h2WjJsallXd3BJSHRjYmlBZ2RtRnlJRzV2WkdVZ1BTQjBhR2x6TG5OMFlYSjBUbTlrWlVGMEtITjBZWEowVUc5ekxDQnpkR0Z5ZEV4dll5azdYRzRnSUc1dlpHVXViR1ZtZENBOUlHeGxablE3WEc0Z0lHNXZaR1V1YjNCbGNtRjBiM0lnUFNCdmNEdGNiaUFnYm05a1pTNXlhV2RvZENBOUlISnBaMmgwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJR3h2WjJsallXd2dQeUJjSWt4dloybGpZV3hGZUhCeVpYTnphVzl1WENJZ09pQmNJa0pwYm1GeWVVVjRjSEpsYzNOcGIyNWNJaWs3WEc1OU8xeHVYRzR2THlCUVlYSnpaU0IxYm1GeWVTQnZjR1Z5WVhSdmNuTXNJR0p2ZEdnZ2NISmxabWw0SUdGdVpDQndiM04wWm1sNExseHVYRzV3Y0M1d1lYSnpaVTFoZVdKbFZXNWhjbmtnUFNCbWRXNWpkR2x2YmlBb2NtVm1SR1Z6ZEhKMVkzUjFjbWx1WjBWeWNtOXljeXdnYzJGM1ZXNWhjbmtwSUh0Y2JpQWdkbUZ5SUhOMFlYSjBVRzl6SUQwZ2RHaHBjeTV6ZEdGeWRDeGNiaUFnSUNBZ0lITjBZWEowVEc5aklEMGdkR2hwY3k1emRHRnlkRXh2WXl4Y2JpQWdJQ0FnSUdWNGNISWdQU0IxYm1SbFptbHVaV1E3WEc0Z0lHbG1JQ2gwYUdsekxuUjVjR1V1Y0hKbFptbDRLU0I3WEc0Z0lDQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BMRnh1SUNBZ0lDQWdJQ0IxY0dSaGRHVWdQU0IwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWFXNWpSR1ZqTzF4dUlDQWdJRzV2WkdVdWIzQmxjbUYwYjNJZ1BTQjBhR2x6TG5aaGJIVmxPMXh1SUNBZ0lHNXZaR1V1Y0hKbFptbDRJRDBnZEhKMVpUdGNiaUFnSUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnSUNCdWIyUmxMbUZ5WjNWdFpXNTBJRDBnZEdocGN5NXdZWEp6WlUxaGVXSmxWVzVoY25rb2JuVnNiQ3dnZEhKMVpTazdYRzRnSUNBZ2RHaHBjeTVqYUdWamEwVjRjSEpsYzNOcGIyNUZjbkp2Y25Nb2NtVm1SR1Z6ZEhKMVkzUjFjbWx1WjBWeWNtOXljeXdnZEhKMVpTazdYRzRnSUNBZ2FXWWdLSFZ3WkdGMFpTa2dkR2hwY3k1amFHVmphMHhXWVd3b2JtOWtaUzVoY21kMWJXVnVkQ2s3Wld4elpTQnBaaUFvZEdocGN5NXpkSEpwWTNRZ0ppWWdibTlrWlM1dmNHVnlZWFJ2Y2lBOVBUMGdYQ0prWld4bGRHVmNJaUFtSmlCdWIyUmxMbUZ5WjNWdFpXNTBMblI1Y0dVZ1BUMDlJRndpU1dSbGJuUnBabWxsY2x3aUtTQjBhR2x6TG5KaGFYTmxVbVZqYjNabGNtRmliR1VvYm05a1pTNXpkR0Z5ZEN3Z1hDSkVaV3hsZEdsdVp5QnNiMk5oYkNCMllYSnBZV0pzWlNCcGJpQnpkSEpwWTNRZ2JXOWtaVndpS1R0bGJITmxJSE5oZDFWdVlYSjVJRDBnZEhKMVpUdGNiaUFnSUNCbGVIQnlJRDBnZEdocGN5NW1hVzVwYzJoT2IyUmxLRzV2WkdVc0lIVndaR0YwWlNBL0lGd2lWWEJrWVhSbFJYaHdjbVZ6YzJsdmJsd2lJRG9nWENKVmJtRnllVVY0Y0hKbGMzTnBiMjVjSWlrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ1pYaHdjaUE5SUhSb2FYTXVjR0Z5YzJWRmVIQnlVM1ZpYzJOeWFYQjBjeWh5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKektUdGNiaUFnSUNCcFppQW9kR2hwY3k1amFHVmphMFY0Y0hKbGMzTnBiMjVGY25KdmNuTW9jbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lrcElISmxkSFZ5YmlCbGVIQnlPMXh1SUNBZ0lIZG9hV3hsSUNoMGFHbHpMblI1Y0dVdWNHOXpkR1pwZUNBbUppQWhkR2hwY3k1allXNUpibk5sY25SVFpXMXBZMjlzYjI0b0tTa2dlMXh1SUNBZ0lDQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pVRjBLSE4wWVhKMFVHOXpMQ0J6ZEdGeWRFeHZZeWs3WEc0Z0lDQWdJQ0J1YjJSbExtOXdaWEpoZEc5eUlEMGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQWdJRzV2WkdVdWNISmxabWw0SUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0J1YjJSbExtRnlaM1Z0Wlc1MElEMGdaWGh3Y2p0Y2JpQWdJQ0FnSUhSb2FYTXVZMmhsWTJ0TVZtRnNLR1Y0Y0hJcE8xeHVJQ0FnSUNBZ2RHaHBjeTV1WlhoMEtDazdYRzRnSUNBZ0lDQmxlSEJ5SUQwZ2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpVlhCa1lYUmxSWGh3Y21WemMybHZibHdpS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCcFppQW9JWE5oZDFWdVlYSjVJQ1ltSUhSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11YzNSaGNuTjBZWElwS1NCeVpYUjFjbTRnZEdocGN5NWlkV2xzWkVKcGJtRnllU2h6ZEdGeWRGQnZjeXdnYzNSaGNuUk1iMk1zSUdWNGNISXNJSFJvYVhNdWNHRnljMlZOWVhsaVpWVnVZWEo1S0c1MWJHd3NJR1poYkhObEtTd2dYQ0lxS2x3aUxDQm1ZV3h6WlNrN1pXeHpaU0J5WlhSMWNtNGdaWGh3Y2p0Y2JuMDdYRzVjYmk4dklGQmhjbk5sSUdOaGJHd3NJR1J2ZEN3Z1lXNWtJR0JiWFdBdGMzVmljMk55YVhCMElHVjRjSEpsYzNOcGIyNXpMbHh1WEc1d2NDNXdZWEp6WlVWNGNISlRkV0p6WTNKcGNIUnpJRDBnWm5WdVkzUnBiMjRnS0hKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBJSHRjYmlBZ2RtRnlJSE4wWVhKMFVHOXpJRDBnZEdocGN5NXpkR0Z5ZEN4Y2JpQWdJQ0FnSUhOMFlYSjBURzlqSUQwZ2RHaHBjeTV6ZEdGeWRFeHZZenRjYmlBZ2RtRnlJR1Y0Y0hJZ1BTQjBhR2x6TG5CaGNuTmxSWGh3Y2tGMGIyMG9jbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lrN1hHNGdJSFpoY2lCemEybHdRWEp5YjNkVGRXSnpZM0pwY0hSeklEMGdaWGh3Y2k1MGVYQmxJRDA5UFNCY0lrRnljbTkzUm5WdVkzUnBiMjVGZUhCeVpYTnphVzl1WENJZ0ppWWdkR2hwY3k1cGJuQjFkQzV6YkdsalpTaDBhR2x6TG14aGMzUlViMnRUZEdGeWRDd2dkR2hwY3k1c1lYTjBWRzlyUlc1a0tTQWhQVDBnWENJcFhDSTdYRzRnSUdsbUlDaDBhR2x6TG1Ob1pXTnJSWGh3Y21WemMybHZia1Z5Y205eWN5aHlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6S1NCOGZDQnphMmx3UVhKeWIzZFRkV0p6WTNKcGNIUnpLU0J5WlhSMWNtNGdaWGh3Y2p0Y2JpQWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVlRkV0p6WTNKcGNIUnpLR1Y0Y0hJc0lITjBZWEowVUc5ekxDQnpkR0Z5ZEV4dll5azdYRzU5TzF4dVhHNXdjQzV3WVhKelpWTjFZbk5qY21sd2RITWdQU0JtZFc1amRHbHZiaUFvWW1GelpTd2djM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpMQ0J1YjBOaGJHeHpLU0I3WEc0Z0lHWnZjaUFvT3pzcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1bFlYUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWtiM1FwS1NCN1hHNGdJQ0FnSUNCMllYSWdibTlrWlNBOUlIUm9hWE11YzNSaGNuUk9iMlJsUVhRb2MzUmhjblJRYjNNc0lITjBZWEowVEc5aktUdGNiaUFnSUNBZ0lHNXZaR1V1YjJKcVpXTjBJRDBnWW1GelpUdGNiaUFnSUNBZ0lHNXZaR1V1Y0hKdmNHVnlkSGtnUFNCMGFHbHpMbkJoY25ObFNXUmxiblFvZEhKMVpTazdYRzRnSUNBZ0lDQnViMlJsTG1OdmJYQjFkR1ZrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0JpWVhObElEMGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVRXVnRZbVZ5Ulhod2NtVnpjMmx2Ymx3aUtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUm9hWE11WldGMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVluSmhZMnRsZEV3cEtTQjdYRzRnSUNBZ0lDQjJZWElnYm05a1pTQTlJSFJvYVhNdWMzUmhjblJPYjJSbFFYUW9jM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpLVHRjYmlBZ0lDQWdJRzV2WkdVdWIySnFaV04wSUQwZ1ltRnpaVHRjYmlBZ0lDQWdJRzV2WkdVdWNISnZjR1Z5ZEhrZ1BTQjBhR2x6TG5CaGNuTmxSWGh3Y21WemMybHZiaWdwTzF4dUlDQWdJQ0FnYm05a1pTNWpiMjF3ZFhSbFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNCMGFHbHpMbVY0Y0dWamRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05yWlhSU0tUdGNiaUFnSUNBZ0lHSmhjMlVnUFNCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pOWlcxaVpYSkZlSEJ5WlhOemFXOXVYQ0lwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvSVc1dlEyRnNiSE1nSmlZZ2RHaHBjeTVsWVhRb1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1d1lYSmxia3dwS1NCN1hHNGdJQ0FnSUNCMllYSWdibTlrWlNBOUlIUm9hWE11YzNSaGNuUk9iMlJsUVhRb2MzUmhjblJRYjNNc0lITjBZWEowVEc5aktUdGNiaUFnSUNBZ0lHNXZaR1V1WTJGc2JHVmxJRDBnWW1GelpUdGNiaUFnSUNBZ0lHNXZaR1V1WVhKbmRXMWxiblJ6SUQwZ2RHaHBjeTV3WVhKelpVVjRjSEpNYVhOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNHRnlaVzVTTENCbVlXeHpaU2s3WEc0Z0lDQWdJQ0JpWVhObElEMGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVEyRnNiRVY0Y0hKbGMzTnBiMjVjSWlrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbUZqYTFGMWIzUmxLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2JtOWtaU0E5SUhSb2FYTXVjM1JoY25ST2IyUmxRWFFvYzNSaGNuUlFiM01zSUhOMFlYSjBURzlqS1R0Y2JpQWdJQ0FnSUc1dlpHVXVkR0ZuSUQwZ1ltRnpaVHRjYmlBZ0lDQWdJRzV2WkdVdWNYVmhjMmtnUFNCMGFHbHpMbkJoY25ObFZHVnRjR3hoZEdVb0tUdGNiaUFnSUNBZ0lHSmhjMlVnUFNCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pVWVdkblpXUlVaVzF3YkdGMFpVVjRjSEpsYzNOcGIyNWNJaWs3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCaVlYTmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dWZUdGNibHh1THk4Z1VHRnljMlVnWVc0Z1lYUnZiV2xqSUdWNGNISmxjM05wYjI0ZzRvQ1VJR1ZwZEdobGNpQmhJSE5wYm1kc1pTQjBiMnRsYmlCMGFHRjBJR2x6SUdGdVhHNHZMeUJsZUhCeVpYTnphVzl1TENCaGJpQmxlSEJ5WlhOemFXOXVJSE4wWVhKMFpXUWdZbmtnWVNCclpYbDNiM0prSUd4cGEyVWdZR1oxYm1OMGFXOXVZQ0J2Y2x4dUx5OGdZRzVsZDJBc0lHOXlJR0Z1SUdWNGNISmxjM05wYjI0Z2QzSmhjSEJsWkNCcGJpQndkVzVqZEhWaGRHbHZiaUJzYVd0bElHQW9LV0FzSUdCYlhXQXNYRzR2THlCdmNpQmdlMzFnTGx4dVhHNXdjQzV3WVhKelpVVjRjSEpCZEc5dElEMGdablZ1WTNScGIyNGdLSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25NcElIdGNiaUFnZG1GeUlHNXZaR1VnUFNCMWJtUmxabWx1WldRc1hHNGdJQ0FnSUNCallXNUNaVUZ5Y205M0lEMGdkR2hwY3k1d2IzUmxiblJwWVd4QmNuSnZkMEYwSUQwOUlIUm9hWE11YzNSaGNuUTdYRzRnSUhOM2FYUmphQ0FvZEdocGN5NTBlWEJsS1NCN1hHNGdJQ0FnWTJGelpTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOXpkWEJsY2pwY2JpQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1cGJrWjFibU4wYVc5dUtTQjBhR2x6TG5KaGFYTmxLSFJvYVhNdWMzUmhjblFzSUZ3aUozTjFjR1Z5SnlCdmRYUnphV1JsSUc5bUlHWjFibU4wYVc5dUlHOXlJR05zWVhOelhDSXBPMXh1WEc0Z0lDQWdZMkZ6WlNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5MGFHbHpPbHh1SUNBZ0lDQWdkbUZ5SUhSNWNHVWdQU0IwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgzUm9hWE1nUHlCY0lsUm9hWE5GZUhCeVpYTnphVzl1WENJZ09pQmNJbE4xY0dWeVhDSTdYRzRnSUNBZ0lDQnViMlJsSUQwZ2RHaHBjeTV6ZEdGeWRFNXZaR1VvS1R0Y2JpQWdJQ0FnSUhSb2FYTXVibVY0ZENncE8xeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQjBlWEJsS1R0Y2JseHVJQ0FnSUdOaGMyVWdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXVZVzFsT2x4dUlDQWdJQ0FnZG1GeUlITjBZWEowVUc5eklEMGdkR2hwY3k1emRHRnlkQ3hjYmlBZ0lDQWdJQ0FnSUNCemRHRnlkRXh2WXlBOUlIUm9hWE11YzNSaGNuUk1iMk03WEc0Z0lDQWdJQ0IyWVhJZ2FXUWdQU0IwYUdsekxuQmhjbk5sU1dSbGJuUW9kR2hwY3k1MGVYQmxJQ0U5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01aGJXVXBPMXh1SUNBZ0lDQWdhV1lnS0dOaGJrSmxRWEp5YjNjZ0ppWWdJWFJvYVhNdVkyRnVTVzV6WlhKMFUyVnRhV052Ykc5dUtDa2dKaVlnZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVoY25KdmR5a3BJSEpsZEhWeWJpQjBhR2x6TG5CaGNuTmxRWEp5YjNkRmVIQnlaWE56YVc5dUtIUm9hWE11YzNSaGNuUk9iMlJsUVhRb2MzUmhjblJRYjNNc0lITjBZWEowVEc5aktTd2dXMmxrWFNrN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYVdRN1hHNWNiaUFnSUNCallYTmxJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjbVZuWlhod09seHVJQ0FnSUNBZ2RtRnlJSFpoYkhWbElEMGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQWdJRzV2WkdVZ1BTQjBhR2x6TG5CaGNuTmxUR2wwWlhKaGJDaDJZV3gxWlM1MllXeDFaU2s3WEc0Z0lDQWdJQ0J1YjJSbExuSmxaMlY0SUQwZ2V5QndZWFIwWlhKdU9pQjJZV3gxWlM1d1lYUjBaWEp1TENCbWJHRm5jem9nZG1Gc2RXVXVabXhoWjNNZ2ZUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCdWIyUmxPMXh1WEc0Z0lDQWdZMkZ6WlNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01MWJUcGpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11YzNSeWFXNW5PbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVk1hWFJsY21Gc0tIUm9hWE11ZG1Gc2RXVXBPMXh1WEc0Z0lDQWdZMkZ6WlNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5dWRXeHNPbU5oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmRISjFaVHBqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgyWmhiSE5sT2x4dUlDQWdJQ0FnYm05a1pTQTlJSFJvYVhNdWMzUmhjblJPYjJSbEtDazdYRzRnSUNBZ0lDQnViMlJsTG5aaGJIVmxJRDBnZEdocGN5NTBlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOXVkV3hzSUQ4Z2JuVnNiQ0E2SUhSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZkSEoxWlR0Y2JpQWdJQ0FnSUc1dlpHVXVjbUYzSUQwZ2RHaHBjeTUwZVhCbExtdGxlWGR2Y21RN1hHNGdJQ0FnSUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pNYVhSbGNtRnNYQ0lwTzF4dVhHNGdJQ0FnWTJGelpTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxuQmhjbVZ1VERwY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuQmhjbk5sVUdGeVpXNUJibVJFYVhOMGFXNW5kV2x6YUVWNGNISmxjM05wYjI0b1kyRnVRbVZCY25KdmR5azdYRzVjYmlBZ0lDQmpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WW5KaFkydGxkRXc2WEc0Z0lDQWdJQ0J1YjJSbElEMGdkR2hwY3k1emRHRnlkRTV2WkdVb0tUdGNiaUFnSUNBZ0lIUm9hWE11Ym1WNGRDZ3BPMXh1SUNBZ0lDQWdibTlrWlM1bGJHVnRaVzUwY3lBOUlIUm9hWE11Y0dGeWMyVkZlSEJ5VEdsemRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05yWlhSU0xDQjBjblZsTENCMGNuVmxMQ0J5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKektUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pCY25KaGVVVjRjSEpsYzNOcGIyNWNJaWs3WEc1Y2JpQWdJQ0JqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVluSmhZMlZNT2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNHRnljMlZQWW1vb1ptRnNjMlVzSUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBPMXh1WEc0Z0lDQWdZMkZ6WlNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5bWRXNWpkR2x2YmpwY2JpQWdJQ0FnSUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1dVpYaDBLQ2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d1lYSnpaVVoxYm1OMGFXOXVLRzV2WkdVc0lHWmhiSE5sS1R0Y2JseHVJQ0FnSUdOaGMyVWdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZZMnhoYzNNNlhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXdZWEp6WlVOc1lYTnpLSFJvYVhNdWMzUmhjblJPYjJSbEtDa3NJR1poYkhObEtUdGNibHh1SUNBZ0lHTmhjMlVnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVmYm1WM09seHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWT1pYY29LVHRjYmx4dUlDQWdJR05oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aVlXTnJVWFZ2ZEdVNlhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXdZWEp6WlZSbGJYQnNZWFJsS0NrN1hHNWNiaUFnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnZEdocGN5NTFibVY0Y0dWamRHVmtLQ2s3WEc0Z0lIMWNibjA3WEc1Y2JuQndMbkJoY25ObFRHbDBaWEpoYkNBOUlHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0IyWVhJZ2JtOWtaU0E5SUhSb2FYTXVjM1JoY25ST2IyUmxLQ2s3WEc0Z0lHNXZaR1V1ZG1Gc2RXVWdQU0IyWVd4MVpUdGNiaUFnYm05a1pTNXlZWGNnUFNCMGFHbHpMbWx1Y0hWMExuTnNhV05sS0hSb2FYTXVjM1JoY25Rc0lIUm9hWE11Wlc1a0tUdGNiaUFnZEdocGN5NXVaWGgwS0NrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTV2WkdVb2JtOWtaU3dnWENKTWFYUmxjbUZzWENJcE8xeHVmVHRjYmx4dWNIQXVjR0Z5YzJWUVlYSmxia1Y0Y0hKbGMzTnBiMjRnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhSb2FYTXVaWGh3WldOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNHRnlaVzVNS1R0Y2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhNdWNHRnljMlZGZUhCeVpYTnphVzl1S0NrN1hHNGdJSFJvYVhNdVpYaHdaV04wS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11Y0dGeVpXNVNLVHRjYmlBZ2NtVjBkWEp1SUhaaGJEdGNibjA3WEc1Y2JuQndMbkJoY25ObFVHRnlaVzVCYm1SRWFYTjBhVzVuZFdsemFFVjRjSEpsYzNOcGIyNGdQU0JtZFc1amRHbHZiaUFvWTJGdVFtVkJjbkp2ZHlrZ2UxeHVJQ0IyWVhJZ2MzUmhjblJRYjNNZ1BTQjBhR2x6TG5OMFlYSjBMRnh1SUNBZ0lDQWdjM1JoY25STWIyTWdQU0IwYUdsekxuTjBZWEowVEc5akxGeHVJQ0FnSUNBZ2RtRnNJRDBnZFc1a1pXWnBibVZrTzF4dUlDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRDQ5SURZcElIdGNiaUFnSUNCMGFHbHpMbTVsZUhRb0tUdGNibHh1SUNBZ0lIWmhjaUJwYm01bGNsTjBZWEowVUc5eklEMGdkR2hwY3k1emRHRnlkQ3hjYmlBZ0lDQWdJQ0FnYVc1dVpYSlRkR0Z5ZEV4dll5QTlJSFJvYVhNdWMzUmhjblJNYjJNN1hHNGdJQ0FnZG1GeUlHVjRjSEpNYVhOMElEMGdXMTBzWEc0Z0lDQWdJQ0FnSUdacGNuTjBJRDBnZEhKMVpUdGNiaUFnSUNCMllYSWdjbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lBOUlIc2djMmh2Y25Sb1lXNWtRWE56YVdkdU9pQXdMQ0IwY21GcGJHbHVaME52YlcxaE9pQXdJSDBzWEc0Z0lDQWdJQ0FnSUhOd2NtVmhaRk4wWVhKMElEMGdkVzVrWldacGJtVmtMRnh1SUNBZ0lDQWdJQ0JwYm01bGNsQmhjbVZ1VTNSaGNuUWdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdkMmhwYkdVZ0tIUm9hWE11ZEhsd1pTQWhQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV3WVhKbGJsSXBJSHRjYmlBZ0lDQWdJR1pwY25OMElEOGdabWx5YzNRZ1BTQm1ZV3h6WlNBNklIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZMjl0YldFcE8xeHVJQ0FnSUNBZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1bGJHeHBjSE5wY3lrZ2UxeHVJQ0FnSUNBZ0lDQnpjSEpsWVdSVGRHRnlkQ0E5SUhSb2FYTXVjM1JoY25RN1hHNGdJQ0FnSUNBZ0lHVjRjSEpNYVhOMExuQjFjMmdvZEdocGN5NXdZWEp6WlZCaGNtVnVTWFJsYlNoMGFHbHpMbkJoY25ObFVtVnpkQ2dwS1NrN1hHNGdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11ZEhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV3WVhKbGJrd2dKaVlnSVdsdWJtVnlVR0Z5Wlc1VGRHRnlkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHbHVibVZ5VUdGeVpXNVRkR0Z5ZENBOUlIUm9hWE11YzNSaGNuUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWlhod2NreHBjM1F1Y0hWemFDaDBhR2x6TG5CaGNuTmxUV0Y1WW1WQmMzTnBaMjRvWm1Gc2MyVXNJSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25Nc0lIUm9hWE11Y0dGeWMyVlFZWEpsYmtsMFpXMHBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJR2x1Ym1WeVJXNWtVRzl6SUQwZ2RHaHBjeTV6ZEdGeWRDeGNiaUFnSUNBZ0lDQWdhVzV1WlhKRmJtUk1iMk1nUFNCMGFHbHpMbk4wWVhKMFRHOWpPMXh1SUNBZ0lIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjR0Z5Wlc1U0tUdGNibHh1SUNBZ0lHbG1JQ2hqWVc1Q1pVRnljbTkzSUNZbUlDRjBhR2x6TG1OaGJrbHVjMlZ5ZEZObGJXbGpiMnh2YmlncElDWW1JSFJvYVhNdVpXRjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZWEp5YjNjcEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG1Ob1pXTnJVR0YwZEdWeWJrVnljbTl5Y3loeVpXWkVaWE4wY25WamRIVnlhVzVuUlhKeWIzSnpMQ0IwY25WbEtUdGNiaUFnSUNBZ0lHbG1JQ2hwYm01bGNsQmhjbVZ1VTNSaGNuUXBJSFJvYVhNdWRXNWxlSEJsWTNSbFpDaHBibTVsY2xCaGNtVnVVM1JoY25RcE8xeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWUVlYSmxia0Z5Y205M1RHbHpkQ2h6ZEdGeWRGQnZjeXdnYzNSaGNuUk1iMk1zSUdWNGNISk1hWE4wS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb0lXVjRjSEpNYVhOMExteGxibWQwYUNrZ2RHaHBjeTUxYm1WNGNHVmpkR1ZrS0hSb2FYTXViR0Z6ZEZSdmExTjBZWEowS1R0Y2JpQWdJQ0JwWmlBb2MzQnlaV0ZrVTNSaGNuUXBJSFJvYVhNdWRXNWxlSEJsWTNSbFpDaHpjSEpsWVdSVGRHRnlkQ2s3WEc0Z0lDQWdkR2hwY3k1amFHVmphMFY0Y0hKbGMzTnBiMjVGY25KdmNuTW9jbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3l3Z2RISjFaU2s3WEc1Y2JpQWdJQ0JwWmlBb1pYaHdja3hwYzNRdWJHVnVaM1JvSUQ0Z01Ta2dlMXh1SUNBZ0lDQWdkbUZzSUQwZ2RHaHBjeTV6ZEdGeWRFNXZaR1ZCZENocGJtNWxjbE4wWVhKMFVHOXpMQ0JwYm01bGNsTjBZWEowVEc5aktUdGNiaUFnSUNBZ0lIWmhiQzVsZUhCeVpYTnphVzl1Y3lBOUlHVjRjSEpNYVhOME8xeHVJQ0FnSUNBZ2RHaHBjeTVtYVc1cGMyaE9iMlJsUVhRb2RtRnNMQ0JjSWxObGNYVmxibU5sUlhod2NtVnpjMmx2Ymx3aUxDQnBibTVsY2tWdVpGQnZjeXdnYVc1dVpYSkZibVJNYjJNcE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IyWVd3Z1BTQmxlSEJ5VEdsemRGc3dYVHRjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkbUZzSUQwZ2RHaHBjeTV3WVhKelpWQmhjbVZ1Ulhod2NtVnpjMmx2YmlncE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0hSb2FYTXViM0IwYVc5dWN5NXdjbVZ6WlhKMlpWQmhjbVZ1Y3lrZ2UxeHVJQ0FnSUhaaGNpQndZWElnUFNCMGFHbHpMbk4wWVhKMFRtOWtaVUYwS0hOMFlYSjBVRzl6TENCemRHRnlkRXh2WXlrN1hHNGdJQ0FnY0dGeUxtVjRjSEpsYzNOcGIyNGdQU0IyWVd3N1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVG05a1pTaHdZWElzSUZ3aVVHRnlaVzUwYUdWemFYcGxaRVY0Y0hKbGMzTnBiMjVjSWlrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2NtVjBkWEp1SUhaaGJEdGNiaUFnZlZ4dWZUdGNibHh1Y0hBdWNHRnljMlZRWVhKbGJrbDBaVzBnUFNCbWRXNWpkR2x2YmlBb2FYUmxiU2tnZTF4dUlDQnlaWFIxY200Z2FYUmxiVHRjYm4wN1hHNWNibkJ3TG5CaGNuTmxVR0Z5Wlc1QmNuSnZkMHhwYzNRZ1BTQm1kVzVqZEdsdmJpQW9jM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpMQ0JsZUhCeVRHbHpkQ2tnZTF4dUlDQnlaWFIxY200Z2RHaHBjeTV3WVhKelpVRnljbTkzUlhod2NtVnpjMmx2YmloMGFHbHpMbk4wWVhKMFRtOWtaVUYwS0hOMFlYSjBVRzl6TENCemRHRnlkRXh2WXlrc0lHVjRjSEpNYVhOMEtUdGNibjA3WEc1Y2JpOHZJRTVsZHlkeklIQnlaV05sWkdWdVkyVWdhWE1nYzJ4cFoyaDBiSGtnZEhKcFkydDVMaUJKZENCdGRYTjBJR0ZzYkc5M0lHbDBjeUJoY21kMWJXVnVkQ0IwYjF4dUx5OGdZbVVnWVNCZ1cxMWdJRzl5SUdSdmRDQnpkV0p6WTNKcGNIUWdaWGh3Y21WemMybHZiaXdnWW5WMElHNXZkQ0JoSUdOaGJHd2c0b0NVSUdGMElHeGxZWE4wTEZ4dUx5OGdibTkwSUhkcGRHaHZkWFFnZDNKaGNIQnBibWNnYVhRZ2FXNGdjR0Z5Wlc1MGFHVnpaWE11SUZSb2RYTXNJR2wwSUhWelpYTWdkR2hsSUc1dlEyRnNiSE5jYmk4dklHRnlaM1Z0Wlc1MElIUnZJSEJoY25ObFUzVmljMk55YVhCMGN5QjBieUJ3Y21WMlpXNTBJR2wwSUdaeWIyMGdZMjl1YzNWdGFXNW5JSFJvWlZ4dUx5OGdZWEpuZFcxbGJuUWdiR2x6ZEM1Y2JseHVkbUZ5SUdWdGNIUjVJRDBnVzEwN1hHNWNibkJ3TG5CaGNuTmxUbVYzSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCMllYSWdibTlrWlNBOUlIUm9hWE11YzNSaGNuUk9iMlJsS0NrN1hHNGdJSFpoY2lCdFpYUmhJRDBnZEdocGN5NXdZWEp6WlVsa1pXNTBLSFJ5ZFdVcE8xeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUQ0OUlEWWdKaVlnZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVrYjNRcEtTQjdYRzRnSUNBZ2JtOWtaUzV0WlhSaElEMGdiV1YwWVR0Y2JpQWdJQ0J1YjJSbExuQnliM0JsY25SNUlEMGdkR2hwY3k1d1lYSnpaVWxrWlc1MEtIUnlkV1VwTzF4dUlDQWdJR2xtSUNodWIyUmxMbkJ5YjNCbGNuUjVMbTVoYldVZ0lUMDlJRndpZEdGeVoyVjBYQ0lwSUhSb2FYTXVjbUZwYzJWU1pXTnZkbVZ5WVdKc1pTaHViMlJsTG5CeWIzQmxjblI1TG5OMFlYSjBMQ0JjSWxSb1pTQnZibXg1SUhaaGJHbGtJRzFsZEdFZ2NISnZjR1Z5ZEhrZ1ptOXlJRzVsZHlCcGN5QnVaWGN1ZEdGeVoyVjBYQ0lwTzF4dUlDQWdJR2xtSUNnaGRHaHBjeTVwYmtaMWJtTjBhVzl1S1NCMGFHbHpMbkpoYVhObFVtVmpiM1psY21GaWJHVW9ibTlrWlM1emRHRnlkQ3dnWENKdVpYY3VkR0Z5WjJWMElHTmhiaUJ2Ym14NUlHSmxJSFZ6WldRZ2FXNGdablZ1WTNScGIyNXpYQ0lwTzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTV2WkdVb2JtOWtaU3dnWENKTlpYUmhVSEp2Y0dWeWRIbGNJaWs3WEc0Z0lIMWNiaUFnZG1GeUlITjBZWEowVUc5eklEMGdkR2hwY3k1emRHRnlkQ3hjYmlBZ0lDQWdJSE4wWVhKMFRHOWpJRDBnZEdocGN5NXpkR0Z5ZEV4dll6dGNiaUFnYm05a1pTNWpZV3hzWldVZ1BTQjBhR2x6TG5CaGNuTmxVM1ZpYzJOeWFYQjBjeWgwYUdsekxuQmhjbk5sUlhod2NrRjBiMjBvS1N3Z2MzUmhjblJRYjNNc0lITjBZWEowVEc5akxDQjBjblZsS1R0Y2JpQWdhV1lnS0hSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11Y0dGeVpXNU1LU2tnYm05a1pTNWhjbWQxYldWdWRITWdQU0IwYUdsekxuQmhjbk5sUlhod2NreHBjM1FvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV3WVhKbGJsSXNJR1poYkhObEtUdGxiSE5sSUc1dlpHVXVZWEpuZFcxbGJuUnpJRDBnWlcxd2RIazdYRzRnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUU1dlpHVW9ibTlrWlN3Z1hDSk9aWGRGZUhCeVpYTnphVzl1WENJcE8xeHVmVHRjYmx4dUx5OGdVR0Z5YzJVZ2RHVnRjR3hoZEdVZ1pYaHdjbVZ6YzJsdmJpNWNibHh1Y0hBdWNHRnljMlZVWlcxd2JHRjBaVVZzWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJSFpoY2lCbGJHVnRJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ1pXeGxiUzUyWVd4MVpTQTlJSHRjYmlBZ0lDQnlZWGM2SUhSb2FYTXVhVzV3ZFhRdWMyeHBZMlVvZEdocGN5NXpkR0Z5ZEN3Z2RHaHBjeTVsYm1RcExuSmxjR3hoWTJVb0wxeGNjbHhjYmo4dlp5d2dKMXhjYmljcExGeHVJQ0FnSUdOdmIydGxaRG9nZEdocGN5NTJZV3gxWlZ4dUlDQjlPMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnWld4bGJTNTBZV2xzSUQwZ2RHaHBjeTUwZVhCbElEMDlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUpoWTJ0UmRXOTBaVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2hsYkdWdExDQmNJbFJsYlhCc1lYUmxSV3hsYldWdWRGd2lLVHRjYm4wN1hHNWNibkJ3TG5CaGNuTmxWR1Z0Y0d4aGRHVWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJSFpoY2lCdWIyUmxJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ2RHaHBjeTV1WlhoMEtDazdYRzRnSUc1dlpHVXVaWGh3Y21WemMybHZibk1nUFNCYlhUdGNiaUFnZG1GeUlHTjFja1ZzZENBOUlIUm9hWE11Y0dGeWMyVlVaVzF3YkdGMFpVVnNaVzFsYm5Rb0tUdGNiaUFnYm05a1pTNXhkV0Z6YVhNZ1BTQmJZM1Z5Uld4MFhUdGNiaUFnZDJocGJHVWdLQ0ZqZFhKRmJIUXVkR0ZwYkNrZ2UxeHVJQ0FnSUhSb2FYTXVaWGh3WldOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVpHOXNiR0Z5UW5KaFkyVk1LVHRjYmlBZ0lDQnViMlJsTG1WNGNISmxjM05wYjI1ekxuQjFjMmdvZEdocGN5NXdZWEp6WlVWNGNISmxjM05wYjI0b0tTazdYRzRnSUNBZ2RHaHBjeTVsZUhCbFkzUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWljbUZqWlZJcE8xeHVJQ0FnSUc1dlpHVXVjWFZoYzJsekxuQjFjMmdvWTNWeVJXeDBJRDBnZEdocGN5NXdZWEp6WlZSbGJYQnNZWFJsUld4bGJXVnVkQ2dwS1R0Y2JpQWdmVnh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVG05a1pTaHViMlJsTENCY0lsUmxiWEJzWVhSbFRHbDBaWEpoYkZ3aUtUdGNibjA3WEc1Y2JpOHZJRkJoY25ObElHRnVJRzlpYW1WamRDQnNhWFJsY21Gc0lHOXlJR0pwYm1ScGJtY2djR0YwZEdWeWJpNWNibHh1Y0hBdWNHRnljMlZQWW1vZ1BTQm1kVzVqZEdsdmJpQW9hWE5RWVhSMFpYSnVMQ0J5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKektTQjdYRzRnSUhaaGNpQnViMlJsSUQwZ2RHaHBjeTV6ZEdGeWRFNXZaR1VvS1N4Y2JpQWdJQ0FnSUdacGNuTjBJRDBnZEhKMVpTeGNiaUFnSUNBZ0lIQnliM0JJWVhOb0lEMGdlMzA3WEc0Z0lHNXZaR1V1Y0hKdmNHVnlkR2xsY3lBOUlGdGRPMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnZDJocGJHVWdLQ0YwYUdsekxtVmhkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUp5WVdObFVpa3BJSHRjYmlBZ0lDQnBaaUFvSVdacGNuTjBLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVjRjR1ZqZENoZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1OdmJXMWhLVHRjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbUZtZEdWeVZISmhhV3hwYm1kRGIyMXRZU2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUp5WVdObFVpa3BJR0p5WldGck8xeHVJQ0FnSUgwZ1pXeHpaU0JtYVhKemRDQTlJR1poYkhObE8xeHVYRzRnSUNBZ2RtRnlJSEJ5YjNBZ1BTQjBhR2x6TG5OMFlYSjBUbTlrWlNncExGeHVJQ0FnSUNBZ0lDQnBjMGRsYm1WeVlYUnZjaUE5SUhWdVpHVm1hVzVsWkN4Y2JpQWdJQ0FnSUNBZ2MzUmhjblJRYjNNZ1BTQjFibVJsWm1sdVpXUXNYRzRnSUNBZ0lDQWdJSE4wWVhKMFRHOWpJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXVaV050WVZabGNuTnBiMjRnUGowZ05pa2dlMXh1SUNBZ0lDQWdjSEp2Y0M1dFpYUm9iMlFnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSEJ5YjNBdWMyaHZjblJvWVc1a0lEMGdabUZzYzJVN1hHNGdJQ0FnSUNCcFppQW9hWE5RWVhSMFpYSnVJSHg4SUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBJSHRjYmlBZ0lDQWdJQ0FnYzNSaGNuUlFiM01nUFNCMGFHbHpMbk4wWVhKME8xeHVJQ0FnSUNBZ0lDQnpkR0Z5ZEV4dll5QTlJSFJvYVhNdWMzUmhjblJNYjJNN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcFppQW9JV2x6VUdGMGRHVnliaWtnYVhOSFpXNWxjbUYwYjNJZ1BTQjBhR2x6TG1WaGRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxuTjBZWElwTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG5CaGNuTmxVSEp2Y0dWeWRIbE9ZVzFsS0hCeWIzQXBPMXh1SUNBZ0lIUm9hWE11Y0dGeWMyVlFjbTl3WlhKMGVWWmhiSFZsS0hCeWIzQXNJR2x6VUdGMGRHVnliaXdnYVhOSFpXNWxjbUYwYjNJc0lITjBZWEowVUc5ekxDQnpkR0Z5ZEV4dll5d2djbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lrN1hHNGdJQ0FnZEdocGN5NWphR1ZqYTFCeWIzQkRiR0Z6YUNod2NtOXdMQ0J3Y205d1NHRnphQ2s3WEc0Z0lDQWdibTlrWlM1d2NtOXdaWEowYVdWekxuQjFjMmdvZEdocGN5NW1hVzVwYzJoT2IyUmxLSEJ5YjNBc0lGd2lVSEp2Y0dWeWRIbGNJaWtwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUU1dlpHVW9ibTlrWlN3Z2FYTlFZWFIwWlhKdUlEOGdYQ0pQWW1wbFkzUlFZWFIwWlhKdVhDSWdPaUJjSWs5aWFtVmpkRVY0Y0hKbGMzTnBiMjVjSWlrN1hHNTlPMXh1WEc1d2NDNXdZWEp6WlZCeWIzQmxjblI1Vm1Gc2RXVWdQU0JtZFc1amRHbHZiaUFvY0hKdmNDd2dhWE5RWVhSMFpYSnVMQ0JwYzBkbGJtVnlZWFJ2Y2l3Z2MzUmhjblJRYjNNc0lITjBZWEowVEc5akxDQnlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6S1NCN1hHNGdJR2xtSUNoMGFHbHpMbVZoZENoZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1OdmJHOXVLU2tnZTF4dUlDQWdJSEJ5YjNBdWRtRnNkV1VnUFNCcGMxQmhkSFJsY200Z1B5QjBhR2x6TG5CaGNuTmxUV0Y1WW1WRVpXWmhkV3gwS0hSb2FYTXVjM1JoY25Rc0lIUm9hWE11YzNSaGNuUk1iMk1wSURvZ2RHaHBjeTV3WVhKelpVMWhlV0psUVhOemFXZHVLR1poYkhObExDQnlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6S1R0Y2JpQWdJQ0J3Y205d0xtdHBibVFnUFNCY0ltbHVhWFJjSWp0Y2JpQWdmU0JsYkhObElHbG1JQ2gwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlBbUppQjBhR2x6TG5SNWNHVWdQVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11Y0dGeVpXNU1LU0I3WEc0Z0lDQWdhV1lnS0dselVHRjBkR1Z5YmlrZ2RHaHBjeTUxYm1WNGNHVmpkR1ZrS0NrN1hHNGdJQ0FnY0hKdmNDNXJhVzVrSUQwZ1hDSnBibWwwWENJN1hHNGdJQ0FnY0hKdmNDNXRaWFJvYjJRZ1BTQjBjblZsTzF4dUlDQWdJSEJ5YjNBdWRtRnNkV1VnUFNCMGFHbHpMbkJoY25ObFRXVjBhRzlrS0dselIyVnVaWEpoZEc5eUtUdGNiaUFnZlNCbGJITmxJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXVaV050WVZabGNuTnBiMjRnUGowZ05TQW1KaUFoY0hKdmNDNWpiMjF3ZFhSbFpDQW1KaUJ3Y205d0xtdGxlUzUwZVhCbElEMDlQU0JjSWtsa1pXNTBhV1pwWlhKY0lpQW1KaUFvY0hKdmNDNXJaWGt1Ym1GdFpTQTlQVDBnWENKblpYUmNJaUI4ZkNCd2NtOXdMbXRsZVM1dVlXMWxJRDA5UFNCY0luTmxkRndpS1NBbUppQjBhR2x6TG5SNWNHVWdJVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVqYjIxdFlTQW1KaUIwYUdsekxuUjVjR1VnSVQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aWNtRmpaVklwSUh0Y2JpQWdJQ0JwWmlBb2FYTkhaVzVsY21GMGIzSWdmSHdnYVhOUVlYUjBaWEp1S1NCMGFHbHpMblZ1Wlhod1pXTjBaV1FvS1R0Y2JpQWdJQ0J3Y205d0xtdHBibVFnUFNCd2NtOXdMbXRsZVM1dVlXMWxPMXh1SUNBZ0lIUm9hWE11Y0dGeWMyVlFjbTl3WlhKMGVVNWhiV1VvY0hKdmNDazdYRzRnSUNBZ2NISnZjQzUyWVd4MVpTQTlJSFJvYVhNdWNHRnljMlZOWlhSb2IyUW9abUZzYzJVcE8xeHVJQ0FnSUhaaGNpQndZWEpoYlVOdmRXNTBJRDBnY0hKdmNDNXJhVzVrSUQwOVBTQmNJbWRsZEZ3aUlEOGdNQ0E2SURFN1hHNGdJQ0FnYVdZZ0tIQnliM0F1ZG1Gc2RXVXVjR0Z5WVcxekxteGxibWQwYUNBaFBUMGdjR0Z5WVcxRGIzVnVkQ2tnZTF4dUlDQWdJQ0FnZG1GeUlITjBZWEowSUQwZ2NISnZjQzUyWVd4MVpTNXpkR0Z5ZER0Y2JpQWdJQ0FnSUdsbUlDaHdjbTl3TG10cGJtUWdQVDA5SUZ3aVoyVjBYQ0lwSUhSb2FYTXVjbUZwYzJWU1pXTnZkbVZ5WVdKc1pTaHpkR0Z5ZEN3Z1hDSm5aWFIwWlhJZ2MyaHZkV3hrSUdoaGRtVWdibThnY0dGeVlXMXpYQ0lwTzJWc2MyVWdkR2hwY3k1eVlXbHpaVkpsWTI5MlpYSmhZbXhsS0hOMFlYSjBMQ0JjSW5ObGRIUmxjaUJ6YUc5MWJHUWdhR0YyWlNCbGVHRmpkR3g1SUc5dVpTQndZWEpoYlZ3aUtUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tIQnliM0F1YTJsdVpDQTlQVDBnWENKelpYUmNJaUFtSmlCd2NtOXdMblpoYkhWbExuQmhjbUZ0YzFzd1hTNTBlWEJsSUQwOVBTQmNJbEpsYzNSRmJHVnRaVzUwWENJcElIUm9hWE11Y21GcGMyVlNaV052ZG1WeVlXSnNaU2h3Y205d0xuWmhiSFZsTG5CaGNtRnRjMXN3WFM1emRHRnlkQ3dnWENKVFpYUjBaWElnWTJGdWJtOTBJSFZ6WlNCeVpYTjBJSEJoY21GdGMxd2lLVHRjYmlBZ2ZTQmxiSE5sSUdsbUlDaDBhR2x6TG05d2RHbHZibk11WldOdFlWWmxjbk5wYjI0Z1BqMGdOaUFtSmlBaGNISnZjQzVqYjIxd2RYUmxaQ0FtSmlCd2NtOXdMbXRsZVM1MGVYQmxJRDA5UFNCY0lrbGtaVzUwYVdacFpYSmNJaWtnZTF4dUlDQWdJSEJ5YjNBdWEybHVaQ0E5SUZ3aWFXNXBkRndpTzF4dUlDQWdJR2xtSUNocGMxQmhkSFJsY200cElIdGNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxtdGxlWGR2Y21SekxuUmxjM1FvY0hKdmNDNXJaWGt1Ym1GdFpTa2dmSHdnS0hSb2FYTXVjM1J5YVdOMElEOGdkR2hwY3k1eVpYTmxjblpsWkZkdmNtUnpVM1J5YVdOMFFtbHVaQ0E2SUhSb2FYTXVjbVZ6WlhKMlpXUlhiM0prY3lrdWRHVnpkQ2h3Y205d0xtdGxlUzV1WVcxbEtTQjhmQ0IwYUdsekxtbHVSMlZ1WlhKaGRHOXlJQ1ltSUhCeWIzQXVhMlY1TG01aGJXVWdQVDBnWENKNWFXVnNaRndpS1NCMGFHbHpMbkpoYVhObFVtVmpiM1psY21GaWJHVW9jSEp2Y0M1clpYa3VjM1JoY25Rc0lGd2lRbWx1WkdsdVp5QmNJaUFySUhCeWIzQXVhMlY1TG01aGJXVXBPMXh1SUNBZ0lDQWdjSEp2Y0M1MllXeDFaU0E5SUhSb2FYTXVjR0Z5YzJWTllYbGlaVVJsWm1GMWJIUW9jM1JoY25SUWIzTXNJSE4wWVhKMFRHOWpMQ0J3Y205d0xtdGxlU2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVpYRWdKaVlnY21WbVJHVnpkSEoxWTNSMWNtbHVaMFZ5Y205eWN5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGeVpXWkVaWE4wY25WamRIVnlhVzVuUlhKeWIzSnpMbk5vYjNKMGFHRnVaRUZ6YzJsbmJpa2djbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3k1emFHOXlkR2hoYm1SQmMzTnBaMjRnUFNCMGFHbHpMbk4wWVhKME8xeHVJQ0FnSUNBZ2NISnZjQzUyWVd4MVpTQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVUmxabUYxYkhRb2MzUmhjblJRYjNNc0lITjBZWEowVEc5akxDQndjbTl3TG10bGVTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhCeWIzQXVkbUZzZFdVZ1BTQndjbTl3TG10bGVUdGNiaUFnSUNCOVhHNGdJQ0FnY0hKdmNDNXphRzl5ZEdoaGJtUWdQU0IwY25WbE8xeHVJQ0I5SUdWc2MyVWdkR2hwY3k1MWJtVjRjR1ZqZEdWa0tDazdYRzU5TzF4dVhHNXdjQzV3WVhKelpWQnliM0JsY25SNVRtRnRaU0E5SUdaMWJtTjBhVzl1SUNod2NtOXdLU0I3WEc0Z0lHbG1JQ2gwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TG1WaGRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05yWlhSTUtTa2dlMXh1SUNBZ0lDQWdjSEp2Y0M1amIyMXdkWFJsWkNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0J3Y205d0xtdGxlU0E5SUhSb2FYTXVjR0Z5YzJWTllYbGlaVUZ6YzJsbmJpZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1bGVIQmxZM1FvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVpY21GamEyVjBVaWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEp2Y0M1clpYazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhCeWIzQXVZMjl0Y0hWMFpXUWdQU0JtWVd4elpUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhCeWIzQXVhMlY1SUQwZ2RHaHBjeTUwZVhCbElEMDlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbTUxYlNCOGZDQjBhR2x6TG5SNWNHVWdQVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11YzNSeWFXNW5JRDhnZEdocGN5NXdZWEp6WlVWNGNISkJkRzl0S0NrZ09pQjBhR2x6TG5CaGNuTmxTV1JsYm5Rb2RISjFaU2s3WEc1OU8xeHVYRzR2THlCSmJtbDBhV0ZzYVhwbElHVnRjSFI1SUdaMWJtTjBhVzl1SUc1dlpHVXVYRzVjYm5Cd0xtbHVhWFJHZFc1amRHbHZiaUE5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc0Z0lHNXZaR1V1YVdRZ1BTQnVkV3hzTzF4dUlDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRDQ5SURZcElIdGNiaUFnSUNCdWIyUmxMbWRsYm1WeVlYUnZjaUE5SUdaaGJITmxPMXh1SUNBZ0lHNXZaR1V1Wlhod2NtVnpjMmx2YmlBOUlHWmhiSE5sTzF4dUlDQjlYRzU5TzF4dVhHNHZMeUJRWVhKelpTQnZZbXBsWTNRZ2IzSWdZMnhoYzNNZ2JXVjBhRzlrTGx4dVhHNXdjQzV3WVhKelpVMWxkR2h2WkNBOUlHWjFibU4wYVc5dUlDaHBjMGRsYm1WeVlYUnZjaWtnZTF4dUlDQjJZWElnYm05a1pTQTlJSFJvYVhNdWMzUmhjblJPYjJSbEtDa3NYRzRnSUNBZ0lDQnZiR1JKYmtkbGJpQTlJSFJvYVhNdWFXNUhaVzVsY21GMGIzSTdYRzRnSUhSb2FYTXVhVzVIWlc1bGNtRjBiM0lnUFNCcGMwZGxibVZ5WVhSdmNqdGNiaUFnZEdocGN5NXBibWwwUm5WdVkzUnBiMjRvYm05a1pTazdYRzRnSUhSb2FYTXVaWGh3WldOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNHRnlaVzVNS1R0Y2JpQWdibTlrWlM1d1lYSmhiWE1nUFNCMGFHbHpMbkJoY25ObFFtbHVaR2x1WjB4cGMzUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXdZWEpsYmxJc0lHWmhiSE5sTENCbVlXeHpaU2s3WEc0Z0lHbG1JQ2gwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlrZ2JtOWtaUzVuWlc1bGNtRjBiM0lnUFNCcGMwZGxibVZ5WVhSdmNqdGNiaUFnZEdocGN5NXdZWEp6WlVaMWJtTjBhVzl1UW05a2VTaHViMlJsTENCbVlXeHpaU2s3WEc0Z0lIUm9hWE11YVc1SFpXNWxjbUYwYjNJZ1BTQnZiR1JKYmtkbGJqdGNiaUFnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVG05a1pTaHViMlJsTENCY0lrWjFibU4wYVc5dVJYaHdjbVZ6YzJsdmJsd2lLVHRjYm4wN1hHNWNiaTh2SUZCaGNuTmxJR0Z5Y205M0lHWjFibU4wYVc5dUlHVjRjSEpsYzNOcGIyNGdkMmwwYUNCbmFYWmxiaUJ3WVhKaGJXVjBaWEp6TGx4dVhHNXdjQzV3WVhKelpVRnljbTkzUlhod2NtVnpjMmx2YmlBOUlHWjFibU4wYVc5dUlDaHViMlJsTENCd1lYSmhiWE1wSUh0Y2JpQWdkbUZ5SUc5c1pFbHVSMlZ1SUQwZ2RHaHBjeTVwYmtkbGJtVnlZWFJ2Y2p0Y2JpQWdkR2hwY3k1cGJrZGxibVZ5WVhSdmNpQTlJR1poYkhObE8xeHVJQ0IwYUdsekxtbHVhWFJHZFc1amRHbHZiaWh1YjJSbEtUdGNiaUFnYm05a1pTNXdZWEpoYlhNZ1BTQjBhR2x6TG5SdlFYTnphV2R1WVdKc1pVeHBjM1FvY0dGeVlXMXpMQ0IwY25WbEtUdGNiaUFnZEdocGN5NXdZWEp6WlVaMWJtTjBhVzl1UW05a2VTaHViMlJsTENCMGNuVmxLVHRjYmlBZ2RHaHBjeTVwYmtkbGJtVnlZWFJ2Y2lBOUlHOXNaRWx1UjJWdU8xeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVFYSnliM2RHZFc1amRHbHZia1Y0Y0hKbGMzTnBiMjVjSWlrN1hHNTlPMXh1WEc0dkx5QlFZWEp6WlNCbWRXNWpkR2x2YmlCaWIyUjVJR0Z1WkNCamFHVmpheUJ3WVhKaGJXVjBaWEp6TGx4dVhHNXdjQzV3WVhKelpVWjFibU4wYVc5dVFtOWtlU0E5SUdaMWJtTjBhVzl1SUNodWIyUmxMQ0JwYzBGeWNtOTNSblZ1WTNScGIyNHBJSHRjYmlBZ2RtRnlJR2x6Ulhod2NtVnpjMmx2YmlBOUlHbHpRWEp5YjNkR2RXNWpkR2x2YmlBbUppQjBhR2x6TG5SNWNHVWdJVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WW5KaFkyVk1PMXh1WEc0Z0lHbG1JQ2hwYzBWNGNISmxjM05wYjI0cElIdGNiaUFnSUNCdWIyUmxMbUp2WkhrZ1BTQjBhR2x6TG5CaGNuTmxUV0Y1WW1WQmMzTnBaMjRvS1R0Y2JpQWdJQ0J1YjJSbExtVjRjSEpsYzNOcGIyNGdQU0IwY25WbE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDOHZJRk4wWVhKMElHRWdibVYzSUhOamIzQmxJSGRwZEdnZ2NtVm5ZWEprSUhSdklHeGhZbVZzY3lCaGJtUWdkR2hsSUdCcGJrWjFibU4wYVc5dVlGeHVJQ0FnSUM4dklHWnNZV2NnS0hKbGMzUnZjbVVnZEdobGJTQjBieUIwYUdWcGNpQnZiR1FnZG1Gc2RXVWdZV1owWlhKM1lYSmtjeWt1WEc0Z0lDQWdkbUZ5SUc5c1pFbHVSblZ1WXlBOUlIUm9hWE11YVc1R2RXNWpkR2x2Yml4Y2JpQWdJQ0FnSUNBZ2IyeGtUR0ZpWld4eklEMGdkR2hwY3k1c1lXSmxiSE03WEc0Z0lDQWdkR2hwY3k1cGJrWjFibU4wYVc5dUlEMGdkSEoxWlR0MGFHbHpMbXhoWW1Wc2N5QTlJRnRkTzF4dUlDQWdJRzV2WkdVdVltOWtlU0E5SUhSb2FYTXVjR0Z5YzJWQ2JHOWpheWgwY25WbEtUdGNiaUFnSUNCdWIyUmxMbVY0Y0hKbGMzTnBiMjRnUFNCbVlXeHpaVHRjYmlBZ0lDQjBhR2x6TG1sdVJuVnVZM1JwYjI0Z1BTQnZiR1JKYmtaMWJtTTdkR2hwY3k1c1lXSmxiSE1nUFNCdmJHUk1ZV0psYkhNN1hHNGdJSDFjYmx4dUlDQXZMeUJKWmlCMGFHbHpJR2x6SUdFZ2MzUnlhV04wSUcxdlpHVWdablZ1WTNScGIyNHNJSFpsY21sbWVTQjBhR0YwSUdGeVozVnRaVzUwSUc1aGJXVnpYRzRnSUM4dklHRnlaU0J1YjNRZ2NtVndaV0YwWldRc0lHRnVaQ0JwZENCa2IyVnpJRzV2ZENCMGNua2dkRzhnWW1sdVpDQjBhR1VnZDI5eVpITWdZR1YyWVd4Z1hHNGdJQzh2SUc5eUlHQmhjbWQxYldWdWRITmdMbHh1SUNCcFppQW9kR2hwY3k1emRISnBZM1FnZkh3Z0lXbHpSWGh3Y21WemMybHZiaUFtSmlCdWIyUmxMbUp2WkhrdVltOWtlUzVzWlc1bmRHZ2dKaVlnZEdocGN5NXBjMVZ6WlZOMGNtbGpkQ2h1YjJSbExtSnZaSGt1WW05a2VWc3dYU2twSUh0Y2JpQWdJQ0IyWVhJZ2IyeGtVM1J5YVdOMElEMGdkR2hwY3k1emRISnBZM1E3WEc0Z0lDQWdkR2hwY3k1emRISnBZM1FnUFNCMGNuVmxPMXh1SUNBZ0lHbG1JQ2h1YjJSbExtbGtLU0IwYUdsekxtTm9aV05yVEZaaGJDaHViMlJsTG1sa0xDQjBjblZsS1R0Y2JpQWdJQ0IwYUdsekxtTm9aV05yVUdGeVlXMXpLRzV2WkdVcE8xeHVJQ0FnSUhSb2FYTXVjM1J5YVdOMElEMGdiMnhrVTNSeWFXTjBPMXh1SUNCOUlHVnNjMlVnYVdZZ0tHbHpRWEp5YjNkR2RXNWpkR2x2YmlrZ2UxeHVJQ0FnSUhSb2FYTXVZMmhsWTJ0UVlYSmhiWE1vYm05a1pTazdYRzRnSUgxY2JuMDdYRzVjYmk4dklFTm9aV05yY3lCbWRXNWpkR2x2YmlCd1lYSmhiWE1nWm05eUlIWmhjbWx2ZFhNZ1pHbHpZV3hzYjNkbFpDQndZWFIwWlhKdWN5QnpkV05vSUdGeklIVnphVzVuSUZ3aVpYWmhiRndpWEc0dkx5QnZjaUJjSW1GeVozVnRaVzUwYzF3aUlHRnVaQ0JrZFhCc2FXTmhkR1VnY0dGeVlXMWxkR1Z5Y3k1Y2JseHVjSEF1WTJobFkydFFZWEpoYlhNZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0IyWVhJZ2JtRnRaVWhoYzJnZ1BTQjdmVHRjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnViMlJsTG5CaGNtRnRjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUhSb2FYTXVZMmhsWTJ0TVZtRnNLRzV2WkdVdWNHRnlZVzF6VzJsZExDQjBjblZsTENCdVlXMWxTR0Z6YUNrN1hHNGdJSDFjYm4wN1hHNWNiaTh2SUZCaGNuTmxjeUJoSUdOdmJXMWhMWE5sY0dGeVlYUmxaQ0JzYVhOMElHOW1JR1Y0Y0hKbGMzTnBiMjV6TENCaGJtUWdjbVYwZFhKdWN5QjBhR1Z0SUdGelhHNHZMeUJoYmlCaGNuSmhlUzRnWUdOc2IzTmxZQ0JwY3lCMGFHVWdkRzlyWlc0Z2RIbHdaU0IwYUdGMElHVnVaSE1nZEdobElHeHBjM1FzSUdGdVpGeHVMeThnWUdGc2JHOTNSVzF3ZEhsZ0lHTmhiaUJpWlNCMGRYSnVaV1FnYjI0Z2RHOGdZV3hzYjNjZ2MzVmljMlZ4ZFdWdWRDQmpiMjF0WVhNZ2QybDBhRnh1THk4Z2JtOTBhR2x1WnlCcGJpQmlaWFIzWldWdUlIUm9aVzBnZEc4Z1ltVWdjR0Z5YzJWa0lHRnpJR0J1ZFd4c1lDQW9kMmhwWTJnZ2FYTWdibVZsWkdWa1hHNHZMeUJtYjNJZ1lYSnlZWGtnYkdsMFpYSmhiSE1wTGx4dVhHNXdjQzV3WVhKelpVVjRjSEpNYVhOMElEMGdablZ1WTNScGIyNGdLR05zYjNObExDQmhiR3h2ZDFSeVlXbHNhVzVuUTI5dGJXRXNJR0ZzYkc5M1JXMXdkSGtzSUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBJSHRjYmlBZ2RtRnlJR1ZzZEhNZ1BTQmJYU3hjYmlBZ0lDQWdJR1pwY25OMElEMGdkSEoxWlR0Y2JpQWdkMmhwYkdVZ0tDRjBhR2x6TG1WaGRDaGpiRzl6WlNrcElIdGNiaUFnSUNCcFppQW9JV1pwY25OMEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG1WNGNHVmpkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52YlcxaEtUdGNiaUFnSUNBZ0lHbG1JQ2hoYkd4dmQxUnlZV2xzYVc1blEyOXRiV0VnSmlZZ2RHaHBjeTVoWm5SbGNsUnlZV2xzYVc1blEyOXRiV0VvWTJ4dmMyVXBLU0JpY21WaGF6dGNiaUFnSUNCOUlHVnNjMlVnWm1seWMzUWdQU0JtWVd4elpUdGNibHh1SUNBZ0lIWmhjaUJsYkhRZ1BTQjFibVJsWm1sdVpXUTdYRzRnSUNBZ2FXWWdLR0ZzYkc5M1JXMXdkSGtnSmlZZ2RHaHBjeTUwZVhCbElEMDlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52YlcxaEtTQmxiSFFnUFNCdWRXeHNPMlZzYzJVZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1bGJHeHBjSE5wY3lrZ2UxeHVJQ0FnSUNBZ1pXeDBJRDBnZEdocGN5NXdZWEp6WlZOd2NtVmhaQ2h5WldaRVpYTjBjblZqZEhWeWFXNW5SWEp5YjNKektUdGNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVkyOXRiV0VnSmlZZ2NtVm1SR1Z6ZEhKMVkzUjFjbWx1WjBWeWNtOXljeUFtSmlBaGNtVm1SR1Z6ZEhKMVkzUjFjbWx1WjBWeWNtOXljeTUwY21GcGJHbHVaME52YlcxaEtTQjdYRzRnSUNBZ0lDQWdJSEpsWmtSbGMzUnlkV04wZFhKcGJtZEZjbkp2Y25NdWRISmhhV3hwYm1kRGIyMXRZU0E5SUhSb2FYTXViR0Z6ZEZSdmExTjBZWEowTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQmxiSFFnUFNCMGFHbHpMbkJoY25ObFRXRjVZbVZCYzNOcFoyNG9abUZzYzJVc0lISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1wTzF4dUlDQWdJR1ZzZEhNdWNIVnphQ2hsYkhRcE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCbGJIUnpPMXh1ZlR0Y2JseHVMeThnVUdGeWMyVWdkR2hsSUc1bGVIUWdkRzlyWlc0Z1lYTWdZVzRnYVdSbGJuUnBabWxsY2k0Z1NXWWdZR3hwWW1WeVlXeGdJR2x6SUhSeWRXVWdLSFZ6WldSY2JpOHZJSGRvWlc0Z2NHRnljMmx1WnlCd2NtOXdaWEowYVdWektTd2dhWFFnZDJsc2JDQmhiSE52SUdOdmJuWmxjblFnYTJWNWQyOXlaSE1nYVc1MGIxeHVMeThnYVdSbGJuUnBabWxsY25NdVhHNWNibkJ3TG5CaGNuTmxTV1JsYm5RZ1BTQm1kVzVqZEdsdmJpQW9iR2xpWlhKaGJDa2dlMXh1SUNCMllYSWdibTlrWlNBOUlIUm9hWE11YzNSaGNuUk9iMlJsS0NrN1hHNGdJR2xtSUNoc2FXSmxjbUZzSUNZbUlIUm9hWE11YjNCMGFXOXVjeTVoYkd4dmQxSmxjMlZ5ZG1Wa0lEMDlJRndpYm1WMlpYSmNJaWtnYkdsaVpYSmhiQ0E5SUdaaGJITmxPMXh1SUNCcFppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01aGJXVXBJSHRjYmlBZ0lDQnBaaUFvSVd4cFltVnlZV3dnSmlZZ0tIUm9hWE11YzNSeWFXTjBJRDhnZEdocGN5NXlaWE5sY25abFpGZHZjbVJ6VTNSeWFXTjBJRG9nZEdocGN5NXlaWE5sY25abFpGZHZjbVJ6S1M1MFpYTjBLSFJvYVhNdWRtRnNkV1VwSUNZbUlDaDBhR2x6TG05d2RHbHZibk11WldOdFlWWmxjbk5wYjI0Z1BqMGdOaUI4ZkNCMGFHbHpMbWx1Y0hWMExuTnNhV05sS0hSb2FYTXVjM1JoY25Rc0lIUm9hWE11Wlc1a0tTNXBibVJsZUU5bUtGd2lYRnhjWEZ3aUtTQTlQU0F0TVNrcElIUm9hWE11Y21GcGMyVlNaV052ZG1WeVlXSnNaU2gwYUdsekxuTjBZWEowTENCY0lsUm9aU0JyWlhsM2IzSmtJQ2RjSWlBcklIUm9hWE11ZG1Gc2RXVWdLeUJjSWljZ2FYTWdjbVZ6WlhKMlpXUmNJaWs3WEc0Z0lDQWdhV1lnS0NGc2FXSmxjbUZzSUNZbUlIUm9hWE11YVc1SFpXNWxjbUYwYjNJZ0ppWWdkR2hwY3k1MllXeDFaU0E5UFQwZ1hDSjVhV1ZzWkZ3aUtTQjBhR2x6TG5KaGFYTmxVbVZqYjNabGNtRmliR1VvZEdocGN5NXpkR0Z5ZEN3Z1hDSkRZVzRnYm05MElIVnpaU0FuZVdsbGJHUW5JR0Z6SUdsa1pXNTBhV1pwWlhJZ2FXNXphV1JsSUdFZ1oyVnVaWEpoZEc5eVhDSXBPMXh1SUNBZ0lHNXZaR1V1Ym1GdFpTQTlJSFJvYVhNdWRtRnNkV1U3WEc0Z0lIMGdaV3h6WlNCcFppQW9iR2xpWlhKaGJDQW1KaUIwYUdsekxuUjVjR1V1YTJWNWQyOXlaQ2tnZTF4dUlDQWdJRzV2WkdVdWJtRnRaU0E5SUhSb2FYTXVkSGx3WlM1clpYbDNiM0prTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhSb2FYTXVkVzVsZUhCbFkzUmxaQ2dwTzF4dUlDQjlYRzRnSUhSb2FYTXVibVY0ZENncE8xeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVNXUmxiblJwWm1sbGNsd2lLVHRjYm4wN1hHNWNiaTh2SUZCaGNuTmxjeUI1YVdWc1pDQmxlSEJ5WlhOemFXOXVJR2x1YzJsa1pTQm5aVzVsY21GMGIzSXVYRzVjYm5Cd0xuQmhjbk5sV1dsbGJHUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJSFpoY2lCdWIyUmxJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ2RHaHBjeTV1WlhoMEtDazdYRzRnSUdsbUlDaDBhR2x6TG5SNWNHVWdQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV6WlcxcElIeDhJSFJvYVhNdVkyRnVTVzV6WlhKMFUyVnRhV052Ykc5dUtDa2dmSHdnZEdocGN5NTBlWEJsSUNFOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWMzUmhjaUFtSmlBaGRHaHBjeTUwZVhCbExuTjBZWEowYzBWNGNISXBJSHRjYmlBZ0lDQnViMlJsTG1SbGJHVm5ZWFJsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdibTlrWlM1aGNtZDFiV1Z1ZENBOUlHNTFiR3c3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnYm05a1pTNWtaV3hsWjJGMFpTQTlJSFJvYVhNdVpXRjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjM1JoY2lrN1hHNGdJQ0FnYm05a1pTNWhjbWQxYldWdWRDQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVRnpjMmxuYmlncE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0paYVdWc1pFVjRjSEpsYzNOcGIyNWNJaWs3WEc1OU8xeHVYRzU5TEh0Y0lpNHZjM1JoZEdWY0lqb3hNQ3hjSWk0dmRHOXJaVzUwZVhCbFhDSTZNVFI5WFN3eU9sdG1kVzVqZEdsdmJpaGZaR1Z5WlhGZkxHMXZaSFZzWlN4bGVIQnZjblJ6S1h0Y2JpOHZJRkpsYzJWeWRtVmtJSGR2Y21RZ2JHbHpkSE1nWm05eUlIWmhjbWx2ZFhNZ1pHbGhiR1ZqZEhNZ2IyWWdkR2hsSUd4aGJtZDFZV2RsWEc1Y2Jsd2lkWE5sSUhOMGNtbGpkRndpTzF4dVhHNWxlSEJ2Y25SekxsOWZaWE5OYjJSMWJHVWdQU0IwY25WbE8xeHVaWGh3YjNKMGN5NXBjMGxrWlc1MGFXWnBaWEpUZEdGeWRDQTlJR2x6U1dSbGJuUnBabWxsY2xOMFlYSjBPMXh1Wlhod2IzSjBjeTVwYzBsa1pXNTBhV1pwWlhKRGFHRnlJRDBnYVhOSlpHVnVkR2xtYVdWeVEyaGhjanRjYm5aaGNpQnlaWE5sY25abFpGZHZjbVJ6SUQwZ2UxeHVJQ0F6T2lCY0ltRmljM1J5WVdOMElHSnZiMnhsWVc0Z1lubDBaU0JqYUdGeUlHTnNZWE56SUdSdmRXSnNaU0JsYm5WdElHVjRjRzl5ZENCbGVIUmxibVJ6SUdacGJtRnNJR1pzYjJGMElHZHZkRzhnYVcxd2JHVnRaVzUwY3lCcGJYQnZjblFnYVc1MElHbHVkR1Z5Wm1GalpTQnNiMjVuSUc1aGRHbDJaU0J3WVdOcllXZGxJSEJ5YVhaaGRHVWdjSEp2ZEdWamRHVmtJSEIxWW14cFl5QnphRzl5ZENCemRHRjBhV01nYzNWd1pYSWdjM2x1WTJoeWIyNXBlbVZrSUhSb2NtOTNjeUIwY21GdWMybGxiblFnZG05c1lYUnBiR1ZjSWl4Y2JpQWdOVG9nWENKamJHRnpjeUJsYm5WdElHVjRkR1Z1WkhNZ2MzVndaWElnWTI5dWMzUWdaWGh3YjNKMElHbHRjRzl5ZEZ3aUxGeHVJQ0EyT2lCY0ltVnVkVzFjSWl4Y2JpQWdOem9nWENKbGJuVnRYQ0lzWEc0Z0lITjBjbWxqZERvZ1hDSnBiWEJzWlcxbGJuUnpJR2x1ZEdWeVptRmpaU0JzWlhRZ2NHRmphMkZuWlNCd2NtbDJZWFJsSUhCeWIzUmxZM1JsWkNCd2RXSnNhV01nYzNSaGRHbGpJSGxwWld4a1hDSXNYRzRnSUhOMGNtbGpkRUpwYm1RNklGd2laWFpoYkNCaGNtZDFiV1Z1ZEhOY0lseHVmVHRjYmx4dVpYaHdiM0owY3k1eVpYTmxjblpsWkZkdmNtUnpJRDBnY21WelpYSjJaV1JYYjNKa2N6dGNiaTh2SUVGdVpDQjBhR1VnYTJWNWQyOXlaSE5jYmx4dWRtRnlJR1ZqYldFMVFXNWtUR1Z6YzB0bGVYZHZjbVJ6SUQwZ1hDSmljbVZoYXlCallYTmxJR05oZEdOb0lHTnZiblJwYm5WbElHUmxZblZuWjJWeUlHUmxabUYxYkhRZ1pHOGdaV3h6WlNCbWFXNWhiR3g1SUdadmNpQm1kVzVqZEdsdmJpQnBaaUJ5WlhSMWNtNGdjM2RwZEdOb0lIUm9jbTkzSUhSeWVTQjJZWElnZDJocGJHVWdkMmwwYUNCdWRXeHNJSFJ5ZFdVZ1ptRnNjMlVnYVc1emRHRnVZMlZ2WmlCMGVYQmxiMllnZG05cFpDQmtaV3hsZEdVZ2JtVjNJR2x1SUhSb2FYTmNJanRjYmx4dWRtRnlJR3RsZVhkdmNtUnpJRDBnZTF4dUlDQTFPaUJsWTIxaE5VRnVaRXhsYzNOTFpYbDNiM0prY3l4Y2JpQWdOam9nWldOdFlUVkJibVJNWlhOelMyVjVkMjl5WkhNZ0t5QmNJaUJqYjI1emRDQmpiR0Z6Y3lCbGVIUmxibVJ6SUdWNGNHOXlkQ0JwYlhCdmNuUWdjM1Z3WlhKY0lseHVmVHRjYmx4dVpYaHdiM0owY3k1clpYbDNiM0prY3lBOUlHdGxlWGR2Y21Sek8xeHVMeThnSXlNZ1EyaGhjbUZqZEdWeUlHTmhkR1ZuYjNKcFpYTmNibHh1THk4Z1FtbG5JSFZuYkhrZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dWN5QjBhR0YwSUcxaGRHTm9JR05vWVhKaFkzUmxjbk1nYVc0Z2RHaGxYRzR2THlCM2FHbDBaWE53WVdObExDQnBaR1Z1ZEdsbWFXVnlMQ0JoYm1RZ2FXUmxiblJwWm1sbGNpMXpkR0Z5ZENCallYUmxaMjl5YVdWekxpQlVhR1Z6WlZ4dUx5OGdZWEpsSUc5dWJIa2dZWEJ3YkdsbFpDQjNhR1Z1SUdFZ1kyaGhjbUZqZEdWeUlHbHpJR1p2ZFc1a0lIUnZJR0ZqZEhWaGJHeDVJR2hoZG1VZ1lWeHVMeThnWTI5a1pTQndiMmx1ZENCaFltOTJaU0F4TWpndVhHNHZMeUJIWlc1bGNtRjBaV1FnWW5rZ1lHSnBiaTluWlc1bGNtRjBaUzFwWkdWdWRHbG1hV1Z5TFhKbFoyVjRMbXB6WUM1Y2JseHVkbUZ5SUc1dmJrRlRRMGxKYVdSbGJuUnBabWxsY2xOMFlYSjBRMmhoY25NZ1BTQmNJc0txd3JYQ3VzT0FMY09XdzVndHc3YkR1QzNMZ2N1R0xjdVJ5NkF0eTZUTHJNdXV6YkF0emJUTnRzMjN6Ym90emIzTnY4Nkd6b2d0em9yT2pNNk9MYzZoenFNdHo3WFB0eTNTZ2RLS0xkU3YxTEV0MVpiVm1kV2hMZGFIMTVBdDE2clhzQzNYc3RpZ0xkbUsyYTdacjlteExkdVQyNVhicGR1bTI2N2JyOXU2TGR1ODI3L2NrTnlTTGR5djNZMHQzcVhlc2QrS0xkK3EzN1RmdGQrNjRLQ0FMZUNnbGVDZ211Q2dwT0NncU9DaGdDM2dvWmpnb3FBdDRLSzA0S1NFTGVDa3VlQ2t2ZUNsa09DbG1DM2dwYUhncGJFdDRLYUE0S2FGTGVDbWpPQ21qK0Nta09DbWt5M2dwcWpncHFvdDRLYXc0S2F5NEthMkxlQ211ZUNtdmVDbmp1Q25uT0NubmVDbm55M2dwNkhncDdEZ3A3SGdxSVV0NEtpSzRLaVA0S2lRNEtpVExlQ29xT0NvcWkzZ3FMRGdxTExncUxQZ3FMWGdxTGJncUxqZ3FMbmdxWmt0NEttYzRLbWU0S215TGVDcHRPQ3FoUzNncW8zZ3FvOHQ0S3FSNEtxVExlQ3FxT0NxcWkzZ3FyRGdxckxncXJQZ3FyVXQ0S3E1NEtxOTRLdVE0S3VnNEt1aDRLdTU0S3lGTGVDc2pPQ3NqK0Nza09Dc2t5M2dyS2pncktvdDRLeXc0S3l5NEt5ejRLeTFMZUNzdWVDc3ZlQ3RuT0N0bmVDdG55M2dyYUhncmJIZ3JvUGdyb1V0NEs2SzRLNk9MZUN1a09DdWtpM2dycFhncnBuZ3JwcmdycHpncnA3Z3JwL2dycVBncnFUZ3JxZ3Q0SzZxNEs2dUxlQ3V1ZUN2a09Dd2hTM2dzSXpnc0k0dDRMQ1E0TENTTGVDd3FPQ3dxaTNnc0xuZ3NMM2dzWmd0NExHYTRMR2c0TEdoNExLRkxlQ3lqT0N5amkzZ3NwRGdzcEl0NExLbzRMS3FMZUN5cytDeXRTM2dzcm5nc3IzZ3M1N2dzNkRnczZIZ3M3SGdzN0xndElVdDRMU000TFNPTGVDMGtPQzBraTNndExyZ3RMM2d0WTdndFo4dDRMV2g0TFc2TGVDMXYrQzJoUzNndHBiZ3Rwb3Q0TGF4NExhekxlQzJ1K0MydmVDM2dDM2d0NGJndUlFdDRMaXc0TGl5NExpejRMbUFMZUM1aHVDNmdlQzZndUM2aE9DNmgrQzZpT0M2aXVDNmplQzZsQzNndXBmZ3Vwa3Q0THFmNExxaExlQzZvK0M2cGVDNnArQzZxdUM2cStDNnJTM2d1ckRndXJMZ3VyUGd1cjNndTRBdDRMdUU0THVHNEx1Y0xlQzduK0M4Z09DOWdDM2d2WWZndllrdDRMMnM0TDZJTGVDK2pPR0FnQzNoZ0tyaGdML2hnWkF0NFlHVjRZR2FMZUdCbmVHQm9lR0JwZUdCcHVHQnJpM2hnYkRoZ2JVdDRZS0I0WUtPNFlLZ0xlR0RoZUdEaCtHRGplR0RrQzNoZzdyaGc3d3Q0WW1JNFltS0xlR0pqZUdKa0MzaGlaYmhpWmpoaVpvdDRZbWQ0WW1nTGVHS2lPR0tpaTNoaW8zaGlwQXQ0WXF3NFlxeUxlR0t0ZUdLdUMzaGlyN2hpNERoaTRJdDRZdUY0WXVJTGVHTGx1R0xtQzNoakpEaGpKSXQ0WXlWNFl5WUxlR05tdUdPZ0MzaGpvL2hqcUF0NFkrMTRZKzRMZUdQdmVHUWdTM2htYXpobWE4dDRabS80WnFCTGVHYW11R2FvQzNobTZyaG02NHQ0WnU0NFp5QUxlR2NqT0djamkzaG5KSGhuS0F0NFp5eDRaMkFMZUdka2VHZG9DM2huYXpobmE0dDRaMnc0WjZBTGVHZXMrR2ZsK0dmbk9HZ29DM2hvYmZob29BdDRhS280YUtxNGFLd0xlR2p0ZUdrZ0MzaHBKN2hwWkF0NGFXdDRhV3dMZUdsdE9HbWdDM2hwcXZocHJBdDRhZUo0YWlBTGVHb2x1R29vQzNocVpUaHFxZmhySVV0NGF5ejRhMkZMZUd0aStHdWd5M2hycURocnE3aHJxL2hycm90NGErbDRiQ0FMZUd3bytHeGpTM2hzWS9oc1pvdDRiRzk0Yk9wTGVHenJPR3pyaTNoczdIaHM3WGhzN2JodElBdDRiYS80YmlBTGVHOGxlRzhtQzNodkozaHZLQXQ0YjJGNGIySUxlRzlqZUc5a0MzaHZaZmh2Wm5odlp2aHZaM2h2Wjh0NGIyOTRiNkFMZUcrdE9HK3RpM2h2cnpodnI3aHY0SXQ0YitFNGIrR0xlRy9qT0cva0MzaHY1UGh2NVl0NGIrYjRiK2dMZUcvck9HL3NpM2h2N1RodjdZdDRiKzg0b0d4NG9HLzRvS1FMZUtDbk9LRWd1S0VoK0tFaWkzaWhKUGloSlhpaEpndDRvU2Q0b1NrNG9TbTRvU280b1NxTGVLRXVlS0V2QzNpaEwvaWhZVXQ0b1dKNG9XTzRvV2dMZUtHaU9Ld2dDM2lzSzdpc0xBdDRyR2U0ckdnTGVLenBPS3pxeTNpczY3aXM3TGlzN1BpdElBdDRyU2w0clNuNHJTdDRyU3dMZUsxcCtLMXIrSzJnQzNpdHBiaXRxQXQ0cmFtNHJhb0xlSzJydUsyc0MzaXRyYml0cmd0NHJhKzRyZUFMZUszaHVLM2lDM2l0NDdpdDVBdDRyZVc0cmVZTGVLM251T0FoUzNqZ0lmamdLRXQ0NENwNDRDeExlT0F0ZU9BdUMzamdMempnWUV0NDRLVzQ0S2JMZU9DbitPQ29TM2pnN3JqZzd3dDQ0Ty80NFNGTGVPRXJlT0VzUzNqaG83amhxQXQ0NGE2NDRld0xlT0h2K09RZ0Mza3RyWGt1SUF0NmIrVjZvQ0FMZXFTak9xVGtDM3FrNzNxbElBdDZwaU02cGlRTGVxWW4rcVlxdXFZcStxWmdDM3FtYTdxbWI4dDZwcWQ2cHFnTGVxYnIrcWNseTNxbkovcW5LSXQ2cDZJNnA2TExlcWVyZXFlc0MzcW5yZnFuN2N0NnFDQjZxQ0RMZXFnaGVxZ2h5M3FvSXJxb0l3dDZxQ2k2cUdBTGVxaHMrcWlnaTNxb3JQcW83SXQ2cU8zNnFPNzZxTzk2cVNLTGVxa3BlcWtzQzNxcFlicXBhQXQ2cVc4NnFhRUxlcW1zdXFuaitxbm9DM3FwNlRxcDZZdDZxZXY2cWU2TGVxbnZ1cW9nQzNxcUtqcXFZQXQ2cW1DNnFtRUxlcXBpK3Fwb0MzcXFiYnFxYnJxcWI0dDZxcXY2cXF4NnFxMTZxcTI2cXE1TGVxcXZlcXJnT3FyZ3Vxcm15M3FxNTNxcTZBdDZxdXE2cXV5TGVxcnRPcXNnUzNxcklicXJJa3Q2cXlPNnF5UkxlcXNsdXFzb0MzcXJLYnFyS2d0NnF5dTZxeXdMZXF0bXVxdG5DM3FyYVhxcmJBdDZxK2k2ckNBTGUyZW8rMmVzQzN0bjRidG40c3Q3Wis3NzZTQUxlK3ByZStwc0MzdnE1bnZySUF0NzZ5Rzc2eVRMZStzbCsrc25lK3NueTN2cktqdnJLb3Q3NnkyNzZ5NExlK3N2TytzdnUrdGdPK3RnZSt0ZysrdGhPK3RoaTN2cnJIdnI1TXQ3N1M5NzdXUUxlKzJqKysya2kzdnQ0ZnZ0N0F0NzdlNzc3bXdMZSs1dE8rNXRpM3Z1N3p2dktFdDc3eTY3NzJCTGUrOW11KzlwaTN2dnI3dnY0SXQ3NytINzcrS0xlKy9qKysva2kzdnY1ZnZ2NW90NzcrY1hDSTdYRzUyWVhJZ2JtOXVRVk5EU1VscFpHVnVkR2xtYVdWeVEyaGhjbk1nUFNCY0l1S0FqT0tBamNLM3pJQXR6YS9PaDlLRExkS0gxcEV0MXIzV3Y5ZUIxNExYaE5lRjE0ZllrQzNZbXRtTExkbXAyYkRibGkzYm5OdWZMZHVrMjZmYnFOdXFMZHV0MjdBdDI3bmNrZHl3TGQySzNxWXQzckRmZ0MzZmlkK3JMZCt6NEtDV0xlQ2dtZUNnbXkzZ29LUGdvS1V0NEtDbjRLQ3BMZUNncmVDaG1TM2dvWnZnbzZNdDRLU0Q0S1M2TGVDa3ZPQ2t2aTNncFkvZ3BaRXQ0S1dYNEtXaTRLV2o0S1dtTGVDbHIrQ21nUzNncG9QZ3ByemdwcjR0NEtlRTRLZUg0S2VJNEtlTExlQ25qZUNubCtDbm91Q25vK0NucGkzZ3A2L2dxSUV0NEtpRDRLaTg0S2krTGVDcGd1Q3BoK0NwaU9DcGl5M2dxWTNncVpIZ3FhWXQ0S214NEttMTRLcUJMZUNxZytDcXZPQ3F2aTNncTRYZ3E0Y3Q0S3VKNEt1TExlQ3JqZUNyb3VDcm8rQ3JwaTNncTYvZ3JJRXQ0S3lENEt5ODRLeStMZUN0aE9DdGgrQ3RpT0N0aXkzZ3JZM2dyWmJnclpmZ3JhTGdyYVBncmFZdDRLMnY0SzZDNEs2K0xlQ3ZndUN2aGkzZ3I0amdyNG90NEsrTjRLK1g0SyttTGVDdnIrQ3dnQzNnc0lQZ3NMNHQ0TEdFNExHR0xlQ3hpT0N4aWkzZ3NZM2dzWlhnc1piZ3NhTGdzYVBnc2FZdDRMR3Y0TEtCTGVDeWcrQ3l2T0N5dmkzZ3M0VGdzNFl0NExPSTRMT0tMZUN6amVDemxlQ3psdUN6b3VDem8rQ3pwaTNnczYvZ3RJRXQ0TFNENExTK0xlQzFoT0MxaGkzZ3RZamd0WW90NExXTjRMV1g0TFdpNExXajRMV21MZUMxcitDMmd1QzJnK0MzaXVDM2p5M2d0NVRndDViZ3Q1Z3Q0TGVmNExlbUxlQzNyK0Mzc3VDM3MrQzRzZUM0dEMzZ3VMcmd1WWN0NExtTzRMbVFMZUM1bWVDNnNlQzZ0QzNndXJuZ3Vydmd1cnpndTRndDRMdU40THVRTGVDN21lQzhtT0M4bWVDOG9DM2d2S25ndkxYZ3ZMZmd2TG5ndkw3Z3ZML2d2YkV0NEw2RTRMNkc0TDZINEw2TkxlQytsK0MrbVMzZ3Zyemd2NGJoZ0tzdDRZQys0WUdBTGVHQmllR0JsaTNoZ1puaGdaNHQ0WUdnNFlHaUxlR0JwT0dCcHkzaGdhM2hnYkV0NFlHMDRZS0NMZUdDamVHQ2p5M2hncDNoalowdDRZMmY0WTJwTGVHTnNlR2NraTNobkpUaG5MSXQ0WnkwNFoyUzRaMlQ0WjJ5NFoyejRaNjBMZUdmaytHZm5lR2ZvQzNobjZuaG9Jc3Q0YUNONGFDUUxlR2dtZUdpcWVHa29DM2hwS3ZocExBdDRhUzc0YVdHTGVHbGorR25rQzNocDVyaHFKY3Q0YWliNGFtVkxlR3BudUdwb0MzaHFiemhxYjh0NGFxSjRhcVFMZUdxbWVHcXNDM2hxcjNocklBdDRheUU0YXkwTGVHdGhPR3RrQzNoclpuaHJhc3Q0YTJ6NGE2QUxlR3VndUd1b1MzaHJxM2hyckF0NGE2NTRhK21MZUd2cytHd3BDM2hzTGZoc1lBdDRiR0o0YkdRTGVHeG1lR3prQzNoczVMaHM1UXQ0Yk9vNGJPdDRiT3lMZUd6dE9HenVPR3p1ZUczZ0MzaHQ3WGh0N3d0NGJlLzRvQy80b0dBNG9HVTRvT1FMZUtEbk9LRG9lS0RwUzNpZzdEaXM2OHQ0ck94NHJXLzRyZWdMZUszditPQXFpM2pnSy9qZ3BuamdwcnFtS0F0NnBpcDZwbXY2cG0wTGVxWnZlcWFudXFhbitxYnNPcWJzZXFnZ3VxZ2h1cWdpK3Fnb3kzcW9LZnFvb0Rxb29IcW9yUXQ2cU9FNnFPUUxlcWptZXFqb0MzcW83SHFwSUF0NnFTSjZxU21MZXFrcmVxbGh5M3FwWlBxcG9BdDZxYUQ2cWF6TGVxbmdPcW5rQzNxcDVucXA2WHFwN0F0NnFlNTZxaXBMZXFvdHVxcGcrcXBqT3FwamVxcGtDM3FxWm5xcWJzdDZxbTk2cXF3NnFxeUxlcXF0T3FxdCtxcXVPcXF2dXFxditxcmdlcXJxeTNxcTYvcXE3WHFxN2JxcjZNdDZxK3E2cStzNnErdDZxK3dMZXF2dWUrc251KzRnQzN2dUkvdnVLQXQ3N2l2Nzdpejc3aTA3N21OTGUrNWorKzhrQzN2dkpudnZMOWNJanRjYmx4dWRtRnlJRzV2YmtGVFEwbEphV1JsYm5ScFptbGxjbE4wWVhKMElEMGdibVYzSUZKbFowVjRjQ2hjSWx0Y0lpQXJJRzV2YmtGVFEwbEphV1JsYm5ScFptbGxjbE4wWVhKMFEyaGhjbk1nS3lCY0lsMWNJaWs3WEc1MllYSWdibTl1UVZORFNVbHBaR1Z1ZEdsbWFXVnlJRDBnYm1WM0lGSmxaMFY0Y0NoY0lsdGNJaUFySUc1dmJrRlRRMGxKYVdSbGJuUnBabWxsY2xOMFlYSjBRMmhoY25NZ0t5QnViMjVCVTBOSlNXbGtaVzUwYVdacFpYSkRhR0Z5Y3lBcklGd2lYVndpS1R0Y2JseHVibTl1UVZORFNVbHBaR1Z1ZEdsbWFXVnlVM1JoY25SRGFHRnljeUE5SUc1dmJrRlRRMGxKYVdSbGJuUnBabWxsY2tOb1lYSnpJRDBnYm5Wc2JEdGNibHh1THk4Z1ZHaGxjMlVnWVhKbElHRWdjblZ1TFd4bGJtZDBhQ0JoYm1RZ2IyWm1jMlYwSUdWdVkyOWtaV1FnY21Wd2NtVnpaVzUwWVhScGIyNGdiMllnZEdobFhHNHZMeUErTUhobVptWm1JR052WkdVZ2NHOXBiblJ6SUhSb1lYUWdZWEpsSUdFZ2RtRnNhV1FnY0dGeWRDQnZaaUJwWkdWdWRHbG1hV1Z5Y3k0Z1ZHaGxYRzR2THlCdlptWnpaWFFnYzNSaGNuUnpJR0YwSURCNE1UQXdNREFzSUdGdVpDQmxZV05vSUhCaGFYSWdiMllnYm5WdFltVnljeUJ5WlhCeVpYTmxiblJ6SUdGdVhHNHZMeUJ2Wm1aelpYUWdkRzhnZEdobElHNWxlSFFnY21GdVoyVXNJR0Z1WkNCMGFHVnVJR0VnYzJsNlpTQnZaaUIwYUdVZ2NtRnVaMlV1SUZSb1pYa2dkMlZ5WlZ4dUx5OGdaMlZ1WlhKaGRHVmtJR0o1SUdKcGJpOW5aVzVsY21GMFpTMXBaR1Z1ZEdsbWFXVnlMWEpsWjJWNExtcHpYRzUyWVhJZ1lYTjBjbUZzU1dSbGJuUnBabWxsY2xOMFlYSjBRMjlrWlhNZ1BTQmJNQ3dnTVRFc0lESXNJREkxTENBeUxDQXhPQ3dnTWl3Z01Td2dNaXdnTVRRc0lETXNJREV6TENBek5Td2dNVEl5TENBM01Dd2dOVElzSURJMk9Dd2dNamdzSURRc0lEUTRMQ0EwT0N3Z016RXNJREUzTENBeU5pd2dOaXdnTXpjc0lERXhMQ0F5T1N3Z015d2dNelVzSURVc0lEY3NJRElzSURRc0lEUXpMQ0F4TlRjc0lEazVMQ0F6T1N3Z09Td2dOVEVzSURFMU55d2dNekV3TENBeE1Dd2dNakVzSURFeExDQTNMQ0F4TlRNc0lEVXNJRE1zSURBc0lESXNJRFF6TENBeUxDQXhMQ0EwTENBd0xDQXpMQ0F5TWl3Z01URXNJREl5TENBeE1Dd2dNekFzSURZMkxDQXhPQ3dnTWl3Z01Td2dNVEVzSURJeExDQXhNU3dnTWpVc0lEY3hMQ0ExTlN3Z055d2dNU3dnTmpVc0lEQXNJREUyTENBekxDQXlMQ0F5TENBeUxDQXlOaXdnTkRVc0lESTRMQ0EwTENBeU9Dd2dNellzSURjc0lESXNJREkzTENBeU9Dd2dOVE1zSURFeExDQXlNU3dnTVRFc0lERTRMQ0F4TkN3Z01UY3NJREV4TVN3Z056SXNJRFUyTENBMU1Dd2dNVFFzSURVd0xDQTNPRFVzSURVeUxDQTNOaXdnTkRRc0lETXpMQ0F5TkN3Z01qY3NJRE0xTENBME1pd2dNelFzSURRc0lEQXNJREV6TENBME55d2dNVFVzSURNc0lESXlMQ0F3TENBeUxDQXdMQ0F6Tml3Z01UY3NJRElzSURJMExDQTROU3dnTml3Z01pd2dNQ3dnTWl3Z015d2dNaXdnTVRRc0lESXNJRGtzSURnc0lEUTJMQ0F6T1N3Z055d2dNeXdnTVN3Z015d2dNakVzSURJc0lEWXNJRElzSURFc0lESXNJRFFzSURRc0lEQXNJREU1TENBd0xDQXhNeXdnTkN3Z01qZzNMQ0EwTnl3Z01qRXNJREVzSURJc0lEQXNJREU0TlN3Z05EWXNJRFF5TENBekxDQXpOeXdnTkRjc0lESXhMQ0F3TENBMk1Dd2dORElzSURnMkxDQXlOU3dnTXpreExDQTJNeXdnTXpJc0lEQXNJRFEwT1N3Z05UWXNJREV5T0Rnc0lEa3lNU3dnTVRBekxDQXhNVEFzSURFNExDQXhPVFVzSURJM05Ea3NJREV3TnpBc0lEUXdOVEFzSURVNE1pd2dPRFl6TkN3Z05UWTRMQ0E0TENBek1Dd2dNVEUwTENBeU9Td2dNVGtzSURRM0xDQXhOeXdnTXl3Z016SXNJREl3TENBMkxDQXhPQ3dnT0RneExDQTJPQ3dnTVRJc0lEQXNJRFkzTENBeE1pd2dNVFkwT0RFc0lERXNJRE13TnpFc0lERXdOaXdnTml3Z01USXNJRFFzSURnc0lEZ3NJRGtzSURVNU9URXNJRGcwTENBeUxDQTNNQ3dnTWl3Z01Td2dNeXdnTUN3Z015d2dNU3dnTXl3Z015d2dNaXdnTVRFc0lESXNJREFzSURJc0lEWXNJRElzSURZMExDQXlMQ0F6TENBekxDQTNMQ0F5TENBMkxDQXlMQ0F5Tnl3Z01pd2dNeXdnTWl3Z05Dd2dNaXdnTUN3Z05Dd2dOaXdnTWl3Z016TTVMQ0F6TENBeU5Dd2dNaXdnTWpRc0lESXNJRE13TENBeUxDQXlOQ3dnTWl3Z016QXNJRElzSURJMExDQXlMQ0F6TUN3Z01pd2dNalFzSURJc0lETXdMQ0F5TENBeU5Dd2dNaXdnTnl3Z05ERTBPU3dnTVRrMkxDQXhNelF3TENBekxDQXlMQ0F5Tml3Z01pd2dNU3dnTWl3Z01Dd2dNeXdnTUN3Z01pd2dPU3dnTWl3Z015d2dNaXdnTUN3Z01pd2dNQ3dnTnl3Z01Dd2dOU3dnTUN3Z01pd2dNQ3dnTWl3Z01Dd2dNaXdnTWl3Z01pd2dNU3dnTWl3Z01Dd2dNeXdnTUN3Z01pd2dNQ3dnTWl3Z01Dd2dNaXdnTUN3Z01pd2dNQ3dnTWl3Z01Td2dNaXdnTUN3Z015d2dNeXdnTWl3Z05pd2dNaXdnTXl3Z01pd2dNeXdnTWl3Z01Dd2dNaXdnT1N3Z01pd2dNVFlzSURZc0lESXNJRElzSURRc0lESXNJREUyTENBME5ESXhMQ0EwTWpjeE1Dd2dORElzSURReE5EZ3NJREV5TENBeU1qRXNJRE1zSURVM05qRXNJREV3TlRreExDQTFOREZkTzF4dWRtRnlJR0Z6ZEhKaGJFbGtaVzUwYVdacFpYSkRiMlJsY3lBOUlGczFNRGtzSURBc0lESXlOeXdnTUN3Z01UVXdMQ0EwTENBeU9UUXNJRGtzSURFek5qZ3NJRElzSURJc0lERXNJRFlzSURNc0lEUXhMQ0F5TENBMUxDQXdMQ0F4TmpZc0lERXNJREV6TURZc0lESXNJRFUwTENBeE5Dd2dNeklzSURrc0lERTJMQ0F6TENBME5pd2dNVEFzSURVMExDQTVMQ0EzTENBeUxDQXpOeXdnTVRNc0lESXNJRGtzSURVeUxDQXdMQ0F4TXl3Z01pd2dORGtzSURFekxDQXhNQ3dnTWl3Z05Dd2dPU3dnT0RNc0lERXhMQ0F4Tmpnc0lERXhMQ0EyTENBNUxDQTNMQ0F6TENBMU55d2dNQ3dnTWl3Z05pd2dNeXdnTVN3Z015d2dNaXdnTVRBc0lEQXNJREV4TENBeExDQXpMQ0EyTENBMExDQTBMQ0F6TVRZc0lERTVMQ0F4TXl3Z09Td2dNakUwTENBMkxDQXpMQ0E0TENBeU9Dd2dNU3dnT0RNc0lERTJMQ0F4Tml3Z09Td2dPRElzSURFeUxDQTVMQ0E1TENBNE5Dd2dNVFFzSURVc0lEa3NJRFF5TXl3Z09Td2dNakE0TlRVc0lEa3NJREV6TlN3Z05Dd2dOakFzSURZc0lESTJMQ0E1TENBeE1ERTJMQ0EwTlN3Z01UY3NJRE1zSURFNU56SXpMQ0F4TENBMU16RTVMQ0EwTENBMExDQTFMQ0E1TENBM0xDQXpMQ0EyTENBek1Td2dNeXdnTVRRNUxDQXlMQ0F4TkRFNExDQTBPU3dnTlRFekxDQTFOQ3dnTlN3Z05Ea3NJRGtzSURBc0lERTFMQ0F3TENBeU15d2dOQ3dnTWl3Z01UUXNJRE0yTVRjc0lEWXNJRGM1TWpZeE9Dd2dNak01WFR0Y2JseHVMeThnVkdocGN5Qm9ZWE1nWVNCamIyMXdiR1Y0YVhSNUlHeHBibVZoY2lCMGJ5QjBhR1VnZG1Gc2RXVWdiMllnZEdobElHTnZaR1V1SUZSb1pWeHVMeThnWVhOemRXMXdkR2x2YmlCcGN5QjBhR0YwSUd4dmIydHBibWNnZFhBZ1lYTjBjbUZzSUdsa1pXNTBhV1pwWlhJZ1kyaGhjbUZqZEdWeWN5QnBjMXh1THk4Z2NtRnlaUzVjYm1aMWJtTjBhVzl1SUdselNXNUJjM1J5WVd4VFpYUW9ZMjlrWlN3Z2MyVjBLU0I3WEc0Z0lIWmhjaUJ3YjNNZ1BTQXdlREV3TURBd08xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUhObGRDNXNaVzVuZEdnN0lHa2dLejBnTWlrZ2UxeHVJQ0FnSUhCdmN5QXJQU0J6WlhSYmFWMDdYRzRnSUNBZ2FXWWdLSEJ2Y3lBK0lHTnZaR1VwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCd2IzTWdLejBnYzJWMFcya2dLeUF4WFR0Y2JpQWdJQ0JwWmlBb2NHOXpJRDQ5SUdOdlpHVXBJSEpsZEhWeWJpQjBjblZsTzF4dUlDQjlYRzU5WEc1Y2JpOHZJRlJsYzNRZ2QyaGxkR2hsY2lCaElHZHBkbVZ1SUdOb1lYSmhZM1JsY2lCamIyUmxJSE4wWVhKMGN5QmhiaUJwWkdWdWRHbG1hV1Z5TGx4dVhHNW1kVzVqZEdsdmJpQnBjMGxrWlc1MGFXWnBaWEpUZEdGeWRDaGpiMlJsTENCaGMzUnlZV3dwSUh0Y2JpQWdhV1lnS0dOdlpHVWdQQ0EyTlNrZ2NtVjBkWEp1SUdOdlpHVWdQVDA5SURNMk8xeHVJQ0JwWmlBb1kyOWtaU0E4SURreEtTQnlaWFIxY200Z2RISjFaVHRjYmlBZ2FXWWdLR052WkdVZ1BDQTVOeWtnY21WMGRYSnVJR052WkdVZ1BUMDlJRGsxTzF4dUlDQnBaaUFvWTI5a1pTQThJREV5TXlrZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUdsbUlDaGpiMlJsSUR3OUlEQjRabVptWmlrZ2NtVjBkWEp1SUdOdlpHVWdQajBnTUhoaFlTQW1KaUJ1YjI1QlUwTkpTV2xrWlc1MGFXWnBaWEpUZEdGeWRDNTBaWE4wS0ZOMGNtbHVaeTVtY205dFEyaGhja052WkdVb1kyOWtaU2twTzF4dUlDQnBaaUFvWVhOMGNtRnNJRDA5UFNCbVlXeHpaU2tnY21WMGRYSnVJR1poYkhObE8xeHVJQ0J5WlhSMWNtNGdhWE5KYmtGemRISmhiRk5sZENoamIyUmxMQ0JoYzNSeVlXeEpaR1Z1ZEdsbWFXVnlVM1JoY25SRGIyUmxjeWs3WEc1OVhHNWNiaTh2SUZSbGMzUWdkMmhsZEdobGNpQmhJR2RwZG1WdUlHTm9ZWEpoWTNSbGNpQnBjeUJ3WVhKMElHOW1JR0Z1SUdsa1pXNTBhV1pwWlhJdVhHNWNibVoxYm1OMGFXOXVJR2x6U1dSbGJuUnBabWxsY2tOb1lYSW9ZMjlrWlN3Z1lYTjBjbUZzS1NCN1hHNGdJR2xtSUNoamIyUmxJRHdnTkRncElISmxkSFZ5YmlCamIyUmxJRDA5UFNBek5qdGNiaUFnYVdZZ0tHTnZaR1VnUENBMU9Da2djbVYwZFhKdUlIUnlkV1U3WEc0Z0lHbG1JQ2hqYjJSbElEd2dOalVwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnYVdZZ0tHTnZaR1VnUENBNU1Ta2djbVYwZFhKdUlIUnlkV1U3WEc0Z0lHbG1JQ2hqYjJSbElEd2dPVGNwSUhKbGRIVnliaUJqYjJSbElEMDlQU0E1TlR0Y2JpQWdhV1lnS0dOdlpHVWdQQ0F4TWpNcElISmxkSFZ5YmlCMGNuVmxPMXh1SUNCcFppQW9ZMjlrWlNBOFBTQXdlR1ptWm1ZcElISmxkSFZ5YmlCamIyUmxJRDQ5SURCNFlXRWdKaVlnYm05dVFWTkRTVWxwWkdWdWRHbG1hV1Z5TG5SbGMzUW9VM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2hqYjJSbEtTazdYRzRnSUdsbUlDaGhjM1J5WVd3Z1BUMDlJR1poYkhObEtTQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lISmxkSFZ5YmlCcGMwbHVRWE4wY21Gc1UyVjBLR052WkdVc0lHRnpkSEpoYkVsa1pXNTBhV1pwWlhKVGRHRnlkRU52WkdWektTQjhmQ0JwYzBsdVFYTjBjbUZzVTJWMEtHTnZaR1VzSUdGemRISmhiRWxrWlc1MGFXWnBaWEpEYjJSbGN5azdYRzU5WEc1Y2JuMHNlMzFkTERNNlcyWjFibU4wYVc5dUtGOWtaWEpsY1Y4c2JXOWtkV3hsTEdWNGNHOXlkSE1wZTF4dUx5OGdRV052Y200Z2FYTWdZU0IwYVc1NUxDQm1ZWE4wSUVwaGRtRlRZM0pwY0hRZ2NHRnljMlZ5SUhkeWFYUjBaVzRnYVc0Z1NtRjJZVk5qY21sd2RDNWNiaTh2WEc0dkx5QkJZMjl5YmlCM1lYTWdkM0pwZEhSbGJpQmllU0JOWVhKcGFtNGdTR0YyWlhKaVpXdGxMQ0JKYm1kMllYSWdVM1JsY0dGdWVXRnVMQ0JoYm1SY2JpOHZJSFpoY21sdmRYTWdZMjl1ZEhKcFluVjBiM0p6SUdGdVpDQnlaV3hsWVhObFpDQjFibVJsY2lCaGJpQk5TVlFnYkdsalpXNXpaUzVjYmk4dlhHNHZMeUJIYVhRZ2NtVndiM05wZEc5eWFXVnpJR1p2Y2lCQlkyOXliaUJoY21VZ1lYWmhhV3hoWW14bElHRjBYRzR2TDF4dUx5OGdJQ0FnSUdoMGRIQTZMeTl0WVhKcGFtNW9ZWFpsY21KbGEyVXVibXd2WjJsMEwyRmpiM0p1WEc0dkx5QWdJQ0FnYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDNSbGNtNXFjeTloWTI5eWJpNW5hWFJjYmk4dlhHNHZMeUJRYkdWaGMyVWdkWE5sSUhSb1pTQmJaMmwwYUhWaUlHSjFaeUIwY21GamEyVnlYVnRuYUdKMFhTQjBieUJ5WlhCdmNuUWdhWE56ZFdWekxseHVMeTljYmk4dklGdG5hR0owWFRvZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwzUmxjbTVxY3k5aFkyOXliaTlwYzNOMVpYTmNiaTh2WEc0dkx5QlVhR2x6SUdacGJHVWdaR1ZtYVc1bGN5QjBhR1VnYldGcGJpQndZWEp6WlhJZ2FXNTBaWEptWVdObExpQlVhR1VnYkdsaWNtRnllU0JoYkhOdklHTnZiV1Z6WEc0dkx5QjNhWFJvSUdFZ1cyVnljbTl5TFhSdmJHVnlZVzUwSUhCaGNuTmxjbDFiWkdGdGJXbDBYU0JoYm1RZ1lXNWNiaTh2SUZ0aFluTjBjbUZqZENCemVXNTBZWGdnZEhKbFpTQjNZV3hyWlhKZFczZGhiR3RkTENCa1pXWnBibVZrSUdsdUlHOTBhR1Z5SUdacGJHVnpMbHh1THk5Y2JpOHZJRnRrWVcxdGFYUmRPaUJoWTI5eWJsOXNiMjl6WlM1cWMxeHVMeThnVzNkaGJHdGRPaUIxZEdsc0wzZGhiR3N1YW5OY2JseHVYQ0oxYzJVZ2MzUnlhV04wWENJN1hHNWNibVY0Y0c5eWRITXVYMTlsYzAxdlpIVnNaU0E5SUhSeWRXVTdYRzVsZUhCdmNuUnpMbkJoY25ObElEMGdjR0Z5YzJVN1hHNWxlSEJ2Y25SekxuQmhjbk5sUlhod2NtVnpjMmx2YmtGMElEMGdjR0Z5YzJWRmVIQnlaWE56YVc5dVFYUTdYRzVsZUhCdmNuUnpMblJ2YTJWdWFYcGxjaUE5SUhSdmEyVnVhWHBsY2p0Y2JseHVkbUZ5SUY5emRHRjBaU0E5SUY5a1pYSmxjVjhvWENJdUwzTjBZWFJsWENJcE8xeHVYRzVmWkdWeVpYRmZLRndpTGk5d1lYSnpaWFYwYVd4Y0lpazdYRzVjYmw5a1pYSmxjVjhvWENJdUwzTjBZWFJsYldWdWRGd2lLVHRjYmx4dVgyUmxjbVZ4WHloY0lpNHZiSFpoYkZ3aUtUdGNibHh1WDJSbGNtVnhYeWhjSWk0dlpYaHdjbVZ6YzJsdmJsd2lLVHRjYmx4dVgyUmxjbVZ4WHloY0lpNHZiRzlqWVhScGIyNWNJaWs3WEc1Y2JtVjRjRzl5ZEhNdVVHRnljMlZ5SUQwZ1gzTjBZWFJsTGxCaGNuTmxjanRjYm1WNGNHOXlkSE11Y0d4MVoybHVjeUE5SUY5emRHRjBaUzV3YkhWbmFXNXpPMXh1WEc1MllYSWdYMjl3ZEdsdmJuTWdQU0JmWkdWeVpYRmZLRndpTGk5dmNIUnBiMjV6WENJcE8xeHVYRzVsZUhCdmNuUnpMbVJsWm1GMWJIUlBjSFJwYjI1eklEMGdYMjl3ZEdsdmJuTXVaR1ZtWVhWc2RFOXdkR2x2Ym5NN1hHNWNiblpoY2lCZmJHOWpkWFJwYkNBOUlGOWtaWEpsY1Y4b1hDSXVMMnh2WTNWMGFXeGNJaWs3WEc1Y2JtVjRjRzl5ZEhNdVVHOXphWFJwYjI0Z1BTQmZiRzlqZFhScGJDNVFiM05wZEdsdmJqdGNibVY0Y0c5eWRITXVVMjkxY21ObFRHOWpZWFJwYjI0Z1BTQmZiRzlqZFhScGJDNVRiM1Z5WTJWTWIyTmhkR2x2Ymp0Y2JtVjRjRzl5ZEhNdVoyVjBUR2x1WlVsdVptOGdQU0JmYkc5amRYUnBiQzVuWlhSTWFXNWxTVzVtYnp0Y2JseHVkbUZ5SUY5dWIyUmxJRDBnWDJSbGNtVnhYeWhjSWk0dmJtOWtaVndpS1R0Y2JseHVaWGh3YjNKMGN5NU9iMlJsSUQwZ1gyNXZaR1V1VG05a1pUdGNibHh1ZG1GeUlGOTBiMnRsYm5SNWNHVWdQU0JmWkdWeVpYRmZLRndpTGk5MGIydGxiblI1Y0dWY0lpazdYRzVjYm1WNGNHOXlkSE11Vkc5clpXNVVlWEJsSUQwZ1gzUnZhMlZ1ZEhsd1pTNVViMnRsYmxSNWNHVTdYRzVsZUhCdmNuUnpMblJ2YTFSNWNHVnpJRDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjenRjYmx4dWRtRnlJRjkwYjJ0bGJtTnZiblJsZUhRZ1BTQmZaR1Z5WlhGZktGd2lMaTkwYjJ0bGJtTnZiblJsZUhSY0lpazdYRzVjYm1WNGNHOXlkSE11Vkc5clEyOXVkR1Y0ZENBOUlGOTBiMnRsYm1OdmJuUmxlSFF1Vkc5clEyOXVkR1Y0ZER0Y2JtVjRjRzl5ZEhNdWRHOXJRMjl1ZEdWNGRITWdQU0JmZEc5clpXNWpiMjUwWlhoMExuUjVjR1Z6TzF4dVhHNTJZWElnWDJsa1pXNTBhV1pwWlhJZ1BTQmZaR1Z5WlhGZktGd2lMaTlwWkdWdWRHbG1hV1Z5WENJcE8xeHVYRzVsZUhCdmNuUnpMbWx6U1dSbGJuUnBabWxsY2tOb1lYSWdQU0JmYVdSbGJuUnBabWxsY2k1cGMwbGtaVzUwYVdacFpYSkRhR0Z5TzF4dVpYaHdiM0owY3k1cGMwbGtaVzUwYVdacFpYSlRkR0Z5ZENBOUlGOXBaR1Z1ZEdsbWFXVnlMbWx6U1dSbGJuUnBabWxsY2xOMFlYSjBPMXh1WEc1MllYSWdYM1J2YTJWdWFYcGxJRDBnWDJSbGNtVnhYeWhjSWk0dmRHOXJaVzVwZW1WY0lpazdYRzVjYm1WNGNHOXlkSE11Vkc5clpXNGdQU0JmZEc5clpXNXBlbVV1Vkc5clpXNDdYRzVjYm5aaGNpQmZkMmhwZEdWemNHRmpaU0E5SUY5a1pYSmxjVjhvWENJdUwzZG9hWFJsYzNCaFkyVmNJaWs3WEc1Y2JtVjRjRzl5ZEhNdWFYTk9aWGRNYVc1bElEMGdYM2RvYVhSbGMzQmhZMlV1YVhOT1pYZE1hVzVsTzF4dVpYaHdiM0owY3k1c2FXNWxRbkpsWVdzZ1BTQmZkMmhwZEdWemNHRmpaUzVzYVc1bFFuSmxZV3M3WEc1bGVIQnZjblJ6TG14cGJtVkNjbVZoYTBjZ1BTQmZkMmhwZEdWemNHRmpaUzVzYVc1bFFuSmxZV3RITzF4dWRtRnlJSFpsY25OcGIyNGdQU0JjSWpNdU1TNHdYQ0k3WEc1Y2JtVjRjRzl5ZEhNdWRtVnljMmx2YmlBOUlIWmxjbk5wYjI0N1hHNHZMeUJVYUdVZ2JXRnBiaUJsZUhCdmNuUmxaQ0JwYm5SbGNtWmhZMlVnS0hWdVpHVnlJR0J6Wld4bUxtRmpiM0p1WUNCM2FHVnVJR2x1SUhSb1pWeHVMeThnWW5KdmQzTmxjaWtnYVhNZ1lTQmdjR0Z5YzJWZ0lHWjFibU4wYVc5dUlIUm9ZWFFnZEdGclpYTWdZU0JqYjJSbElITjBjbWx1WnlCaGJtUmNiaTh2SUhKbGRIVnlibk1nWVc0Z1lXSnpkSEpoWTNRZ2MzbHVkR0Y0SUhSeVpXVWdZWE1nYzNCbFkybG1hV1ZrSUdKNUlGdE5iM3BwYkd4aElIQmhjbk5sY2x4dUx5OGdRVkJKWFZ0aGNHbGRMbHh1THk5Y2JpOHZJRnRoY0dsZE9pQm9kSFJ3Y3pvdkwyUmxkbVZzYjNCbGNpNXRiM3BwYkd4aExtOXlaeTlsYmkxVlV5OWtiMk56TDFOd2FXUmxjazF2Ym10bGVTOVFZWEp6WlhKZlFWQkpYRzVjYm1aMWJtTjBhVzl1SUhCaGNuTmxLR2x1Y0hWMExDQnZjSFJwYjI1ektTQjdYRzRnSUhKbGRIVnliaUJ1WlhjZ1gzTjBZWFJsTGxCaGNuTmxjaWh2Y0hScGIyNXpMQ0JwYm5CMWRDa3VjR0Z5YzJVb0tUdGNibjFjYmx4dUx5OGdWR2hwY3lCbWRXNWpkR2x2YmlCMGNtbGxjeUIwYnlCd1lYSnpaU0JoSUhOcGJtZHNaU0JsZUhCeVpYTnphVzl1SUdGMElHRWdaMmwyWlc1Y2JpOHZJRzltWm5ObGRDQnBiaUJoSUhOMGNtbHVaeTRnVlhObFpuVnNJR1p2Y2lCd1lYSnphVzVuSUcxcGVHVmtMV3hoYm1kMVlXZGxJR1p2Y20xaGRITmNiaTh2SUhSb1lYUWdaVzFpWldRZ1NtRjJZVk5qY21sd2RDQmxlSEJ5WlhOemFXOXVjeTVjYmx4dVpuVnVZM1JwYjI0Z2NHRnljMlZGZUhCeVpYTnphVzl1UVhRb2FXNXdkWFFzSUhCdmN5d2diM0IwYVc5dWN5a2dlMXh1SUNCMllYSWdjQ0E5SUc1bGR5QmZjM1JoZEdVdVVHRnljMlZ5S0c5d2RHbHZibk1zSUdsdWNIVjBMQ0J3YjNNcE8xeHVJQ0J3TG01bGVIUlViMnRsYmlncE8xeHVJQ0J5WlhSMWNtNGdjQzV3WVhKelpVVjRjSEpsYzNOcGIyNG9LVHRjYm4xY2JseHVMeThnUVdOdmNtNGdhWE1nYjNKbllXNXBlbVZrSUdGeklHRWdkRzlyWlc1cGVtVnlJR0Z1WkNCaElISmxZM1Z5YzJsMlpTMWtaWE5qWlc1MElIQmhjbk5sY2k1Y2JpOHZJRlJvWlNCZ2RHOXJaVzVwZW1WeVlDQmxlSEJ2Y25RZ2NISnZkbWxrWlhNZ1lXNGdhVzUwWlhKbVlXTmxJSFJ2SUhSb1pTQjBiMnRsYm1sNlpYSXVYRzVjYm1aMWJtTjBhVzl1SUhSdmEyVnVhWHBsY2locGJuQjFkQ3dnYjNCMGFXOXVjeWtnZTF4dUlDQnlaWFIxY200Z2JtVjNJRjl6ZEdGMFpTNVFZWEp6WlhJb2IzQjBhVzl1Y3l3Z2FXNXdkWFFwTzF4dWZWeHVYRzU5TEh0Y0lpNHZaWGh3Y21WemMybHZibHdpT2pFc1hDSXVMMmxrWlc1MGFXWnBaWEpjSWpveUxGd2lMaTlzYjJOaGRHbHZibHdpT2pRc1hDSXVMMnh2WTNWMGFXeGNJam8xTEZ3aUxpOXNkbUZzWENJNk5peGNJaTR2Ym05a1pWd2lPamNzWENJdUwyOXdkR2x2Ym5OY0lqbzRMRndpTGk5d1lYSnpaWFYwYVd4Y0lqbzVMRndpTGk5emRHRjBaVndpT2pFd0xGd2lMaTl6ZEdGMFpXMWxiblJjSWpveE1TeGNJaTR2ZEc5clpXNWpiMjUwWlhoMFhDSTZNVElzWENJdUwzUnZhMlZ1YVhwbFhDSTZNVE1zWENJdUwzUnZhMlZ1ZEhsd1pWd2lPakUwTEZ3aUxpOTNhR2wwWlhOd1lXTmxYQ0k2TVRaOVhTdzBPbHRtZFc1amRHbHZiaWhmWkdWeVpYRmZMRzF2WkhWc1pTeGxlSEJ2Y25SektYdGNibHdpZFhObElITjBjbWxqZEZ3aU8xeHVYRzUyWVhJZ1gzTjBZWFJsSUQwZ1gyUmxjbVZ4WHloY0lpNHZjM1JoZEdWY0lpazdYRzVjYm5aaGNpQmZiRzlqZFhScGJDQTlJRjlrWlhKbGNWOG9YQ0l1TDJ4dlkzVjBhV3hjSWlrN1hHNWNiblpoY2lCd2NDQTlJRjl6ZEdGMFpTNVFZWEp6WlhJdWNISnZkRzkwZVhCbE8xeHVYRzR2THlCVWFHbHpJR1oxYm1OMGFXOXVJR2x6SUhWelpXUWdkRzhnY21GcGMyVWdaWGhqWlhCMGFXOXVjeUJ2YmlCd1lYSnpaU0JsY25KdmNuTXVJRWwwWEc0dkx5QjBZV3RsY3lCaGJpQnZabVp6WlhRZ2FXNTBaV2RsY2lBb2FXNTBieUIwYUdVZ1kzVnljbVZ1ZENCZ2FXNXdkWFJnS1NCMGJ5QnBibVJwWTJGMFpWeHVMeThnZEdobElHeHZZMkYwYVc5dUlHOW1JSFJvWlNCbGNuSnZjaXdnWVhSMFlXTm9aWE1nZEdobElIQnZjMmwwYVc5dUlIUnZJSFJvWlNCbGJtUmNiaTh2SUc5bUlIUm9aU0JsY25KdmNpQnRaWE56WVdkbExDQmhibVFnZEdobGJpQnlZV2x6WlhNZ1lTQmdVM2x1ZEdGNFJYSnliM0pnSUhkcGRHZ2dkR2hoZEZ4dUx5OGdiV1Z6YzJGblpTNWNibHh1Y0hBdWNtRnBjMlVnUFNCbWRXNWpkR2x2YmlBb2NHOXpMQ0J0WlhOellXZGxLU0I3WEc0Z0lIWmhjaUJzYjJNZ1BTQmZiRzlqZFhScGJDNW5aWFJNYVc1bFNXNW1ieWgwYUdsekxtbHVjSFYwTENCd2IzTXBPMXh1SUNCdFpYTnpZV2RsSUNzOUlGd2lJQ2hjSWlBcklHeHZZeTVzYVc1bElDc2dYQ0k2WENJZ0t5QnNiMk11WTI5c2RXMXVJQ3NnWENJcFhDSTdYRzRnSUhaaGNpQmxjbklnUFNCdVpYY2dVM2x1ZEdGNFJYSnliM0lvYldWemMyRm5aU2s3WEc0Z0lHVnljaTV3YjNNZ1BTQndiM003WlhKeUxteHZZeUE5SUd4dll6dGxjbkl1Y21GcGMyVmtRWFFnUFNCMGFHbHpMbkJ2Y3p0Y2JpQWdkR2h5YjNjZ1pYSnlPMXh1ZlR0Y2JseHVjSEF1Y21GcGMyVlNaV052ZG1WeVlXSnNaU0E5SUhCd0xuSmhhWE5sTzF4dVhHNXdjQzVqZFhKUWIzTnBkR2x2YmlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2FXWWdLSFJvYVhNdWIzQjBhVzl1Y3k1c2IyTmhkR2x2Ym5NcElIdGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lGOXNiMk4xZEdsc0xsQnZjMmwwYVc5dUtIUm9hWE11WTNWeVRHbHVaU3dnZEdocGN5NXdiM01nTFNCMGFHbHpMbXhwYm1WVGRHRnlkQ2s3WEc0Z0lIMWNibjA3WEc1Y2JuMHNlMXdpTGk5c2IyTjFkR2xzWENJNk5TeGNJaTR2YzNSaGRHVmNJam94TUgxZExEVTZXMloxYm1OMGFXOXVLRjlrWlhKbGNWOHNiVzlrZFd4bExHVjRjRzl5ZEhNcGUxeHVYQ0oxYzJVZ2MzUnlhV04wWENJN1hHNWNibVY0Y0c5eWRITXVYMTlsYzAxdlpIVnNaU0E5SUhSeWRXVTdYRzVsZUhCdmNuUnpMbWRsZEV4cGJtVkpibVp2SUQwZ1oyVjBUR2x1WlVsdVptODdYRzVjYm1aMWJtTjBhVzl1SUY5amJHRnpjME5oYkd4RGFHVmpheWhwYm5OMFlXNWpaU3dnUTI5dWMzUnlkV04wYjNJcElIc2dhV1lnS0NFb2FXNXpkR0Z1WTJVZ2FXNXpkR0Z1WTJWdlppQkRiMjV6ZEhKMVkzUnZjaWtwSUhzZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpaGNJa05oYm01dmRDQmpZV3hzSUdFZ1kyeGhjM01nWVhNZ1lTQm1kVzVqZEdsdmJsd2lLVHNnZlNCOVhHNWNiblpoY2lCZmQyaHBkR1Z6Y0dGalpTQTlJRjlrWlhKbGNWOG9YQ0l1TDNkb2FYUmxjM0JoWTJWY0lpazdYRzVjYmk4dklGUm9aWE5sSUdGeVpTQjFjMlZrSUhkb1pXNGdZRzl3ZEdsdmJuTXViRzlqWVhScGIyNXpZQ0JwY3lCdmJpd2dabTl5SUhSb1pWeHVMeThnWUhOMFlYSjBURzlqWUNCaGJtUWdZR1Z1WkV4dlkyQWdjSEp2Y0dWeWRHbGxjeTVjYmx4dWRtRnlJRkJ2YzJsMGFXOXVJRDBnS0daMWJtTjBhVzl1SUNncElIdGNiaUFnWm5WdVkzUnBiMjRnVUc5emFYUnBiMjRvYkdsdVpTd2dZMjlzS1NCN1hHNGdJQ0FnWDJOc1lYTnpRMkZzYkVOb1pXTnJLSFJvYVhNc0lGQnZjMmwwYVc5dUtUdGNibHh1SUNBZ0lIUm9hWE11YkdsdVpTQTlJR3hwYm1VN1hHNGdJQ0FnZEdocGN5NWpiMngxYlc0Z1BTQmpiMnc3WEc0Z0lIMWNibHh1SUNCUWIzTnBkR2x2Ymk1d2NtOTBiM1I1Y0dVdWIyWm1jMlYwSUQwZ1puVnVZM1JwYjI0Z2IyWm1jMlYwS0c0cElIdGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lGQnZjMmwwYVc5dUtIUm9hWE11YkdsdVpTd2dkR2hwY3k1amIyeDFiVzRnS3lCdUtUdGNiaUFnZlR0Y2JseHVJQ0J5WlhSMWNtNGdVRzl6YVhScGIyNDdYRzU5S1NncE8xeHVYRzVsZUhCdmNuUnpMbEJ2YzJsMGFXOXVJRDBnVUc5emFYUnBiMjQ3WEc1Y2JuWmhjaUJUYjNWeVkyVk1iMk5oZEdsdmJpQTlJR1oxYm1OMGFXOXVJRk52ZFhKalpVeHZZMkYwYVc5dUtIQXNJSE4wWVhKMExDQmxibVFwSUh0Y2JpQWdYMk5zWVhOelEyRnNiRU5vWldOcktIUm9hWE1zSUZOdmRYSmpaVXh2WTJGMGFXOXVLVHRjYmx4dUlDQjBhR2x6TG5OMFlYSjBJRDBnYzNSaGNuUTdYRzRnSUhSb2FYTXVaVzVrSUQwZ1pXNWtPMXh1SUNCcFppQW9jQzV6YjNWeVkyVkdhV3hsSUNFOVBTQnVkV3hzS1NCMGFHbHpMbk52ZFhKalpTQTlJSEF1YzI5MWNtTmxSbWxzWlR0Y2JuMWNibHh1THk4Z1ZHaGxJR0JuWlhSTWFXNWxTVzVtYjJBZ1puVnVZM1JwYjI0Z2FYTWdiVzl6ZEd4NUlIVnpaV1oxYkNCM2FHVnVJSFJvWlZ4dUx5OGdZR3h2WTJGMGFXOXVjMkFnYjNCMGFXOXVJR2x6SUc5bVppQW9abTl5SUhCbGNtWnZjbTFoYm1ObElISmxZWE52Ym5NcElHRnVaQ0I1YjNWY2JpOHZJSGRoYm5RZ2RHOGdabWx1WkNCMGFHVWdiR2x1WlM5amIyeDFiVzRnY0c5emFYUnBiMjRnWm05eUlHRWdaMmwyWlc0Z1kyaGhjbUZqZEdWeVhHNHZMeUJ2Wm1aelpYUXVJR0JwYm5CMWRHQWdjMmh2ZFd4a0lHSmxJSFJvWlNCamIyUmxJSE4wY21sdVp5QjBhR0YwSUhSb1pTQnZabVp6WlhRZ2NtVm1aWEp6WEc0dkx5QnBiblJ2TGx4dVhHNDdYRzVjYm1WNGNHOXlkSE11VTI5MWNtTmxURzlqWVhScGIyNGdQU0JUYjNWeVkyVk1iMk5oZEdsdmJqdGNibHh1Wm5WdVkzUnBiMjRnWjJWMFRHbHVaVWx1Wm04b2FXNXdkWFFzSUc5bVpuTmxkQ2tnZTF4dUlDQm1iM0lnS0haaGNpQnNhVzVsSUQwZ01Td2dZM1Z5SUQwZ01EczdLU0I3WEc0Z0lDQWdYM2RvYVhSbGMzQmhZMlV1YkdsdVpVSnlaV0ZyUnk1c1lYTjBTVzVrWlhnZ1BTQmpkWEk3WEc0Z0lDQWdkbUZ5SUcxaGRHTm9JRDBnWDNkb2FYUmxjM0JoWTJVdWJHbHVaVUp5WldGclJ5NWxlR1ZqS0dsdWNIVjBLVHRjYmlBZ0lDQnBaaUFvYldGMFkyZ2dKaVlnYldGMFkyZ3VhVzVrWlhnZ1BDQnZabVp6WlhRcElIdGNiaUFnSUNBZ0lDc3JiR2x1WlR0Y2JpQWdJQ0FnSUdOMWNpQTlJRzFoZEdOb0xtbHVaR1Y0SUNzZ2JXRjBZMmhiTUYwdWJHVnVaM1JvTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRkJ2YzJsMGFXOXVLR3hwYm1Vc0lHOW1abk5sZENBdElHTjFjaWs3WEc0Z0lDQWdmVnh1SUNCOVhHNTlYRzVjYm4wc2Uxd2lMaTkzYUdsMFpYTndZV05sWENJNk1UWjlYU3cyT2x0bWRXNWpkR2x2YmloZlpHVnlaWEZmTEcxdlpIVnNaU3hsZUhCdmNuUnpLWHRjYmx3aWRYTmxJSE4wY21samRGd2lPMXh1WEc1MllYSWdYM1J2YTJWdWRIbHdaU0E5SUY5a1pYSmxjVjhvWENJdUwzUnZhMlZ1ZEhsd1pWd2lLVHRjYmx4dWRtRnlJRjl6ZEdGMFpTQTlJRjlrWlhKbGNWOG9YQ0l1TDNOMFlYUmxYQ0lwTzF4dVhHNTJZWElnWDNWMGFXd2dQU0JmWkdWeVpYRmZLRndpTGk5MWRHbHNYQ0lwTzF4dVhHNTJZWElnY0hBZ1BTQmZjM1JoZEdVdVVHRnljMlZ5TG5CeWIzUnZkSGx3WlR0Y2JseHVMeThnUTI5dWRtVnlkQ0JsZUdsemRHbHVaeUJsZUhCeVpYTnphVzl1SUdGMGIyMGdkRzhnWVhOemFXZHVZV0pzWlNCd1lYUjBaWEp1WEc0dkx5QnBaaUJ3YjNOemFXSnNaUzVjYmx4dWNIQXVkRzlCYzNOcFoyNWhZbXhsSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUdselFtbHVaR2x1WnlrZ2UxeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUQ0OUlEWWdKaVlnYm05a1pTa2dlMXh1SUNBZ0lITjNhWFJqYUNBb2JtOWtaUzUwZVhCbEtTQjdYRzRnSUNBZ0lDQmpZWE5sSUZ3aVNXUmxiblJwWm1sbGNsd2lPbHh1SUNBZ0lDQWdZMkZ6WlNCY0lrOWlhbVZqZEZCaGRIUmxjbTVjSWpwY2JpQWdJQ0FnSUdOaGMyVWdYQ0pCY25KaGVWQmhkSFJsY201Y0lqcGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNWNiaUFnSUNBZ0lHTmhjMlVnWENKUFltcGxZM1JGZUhCeVpYTnphVzl1WENJNlhHNGdJQ0FnSUNBZ0lHNXZaR1V1ZEhsd1pTQTlJRndpVDJKcVpXTjBVR0YwZEdWeWJsd2lPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUc1dlpHVXVjSEp2Y0dWeWRHbGxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCd2NtOXdJRDBnYm05a1pTNXdjbTl3WlhKMGFXVnpXMmxkTzF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2h3Y205d0xtdHBibVFnSVQwOUlGd2lhVzVwZEZ3aUtTQjBhR2x6TG5KaGFYTmxLSEJ5YjNBdWEyVjVMbk4wWVhKMExDQmNJazlpYW1WamRDQndZWFIwWlhKdUlHTmhiaWQwSUdOdmJuUmhhVzRnWjJWMGRHVnlJRzl5SUhObGRIUmxjbHdpS1R0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG5SdlFYTnphV2R1WVdKc1pTaHdjbTl3TG5aaGJIVmxMQ0JwYzBKcGJtUnBibWNwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dVhHNGdJQ0FnSUNCallYTmxJRndpUVhKeVlYbEZlSEJ5WlhOemFXOXVYQ0k2WEc0Z0lDQWdJQ0FnSUc1dlpHVXVkSGx3WlNBOUlGd2lRWEp5WVhsUVlYUjBaWEp1WENJN1hHNGdJQ0FnSUNBZ0lIUm9hWE11ZEc5QmMzTnBaMjVoWW14bFRHbHpkQ2h1YjJSbExtVnNaVzFsYm5SekxDQnBjMEpwYm1ScGJtY3BPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNibHh1SUNBZ0lDQWdZMkZ6WlNCY0lrRnpjMmxuYm0xbGJuUkZlSEJ5WlhOemFXOXVYQ0k2WEc0Z0lDQWdJQ0FnSUdsbUlDaHViMlJsTG05d1pYSmhkRzl5SUQwOVBTQmNJajFjSWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJRzV2WkdVdWRIbHdaU0E5SUZ3aVFYTnphV2R1YldWdWRGQmhkSFJsY201Y0lqdGNiaUFnSUNBZ0lDQWdJQ0JrWld4bGRHVWdibTlrWlM1dmNHVnlZWFJ2Y2p0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJtWVd4c2N5QjBhSEp2ZFdkb0lIUnZJRUZ6YzJsbmJtMWxiblJRWVhSMFpYSnVYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkpoYVhObEtHNXZaR1V1YkdWbWRDNWxibVFzSUZ3aVQyNXNlU0FuUFNjZ2IzQmxjbUYwYjNJZ1kyRnVJR0psSUhWelpXUWdabTl5SUhOd1pXTnBabmxwYm1jZ1pHVm1ZWFZzZENCMllXeDFaUzVjSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdOaGMyVWdYQ0pCYzNOcFoyNXRaVzUwVUdGMGRHVnlibHdpT2x4dUlDQWdJQ0FnSUNCcFppQW9ibTlrWlM1eWFXZG9kQzUwZVhCbElEMDlQU0JjSWxscFpXeGtSWGh3Y21WemMybHZibHdpS1NCMGFHbHpMbkpoYVhObEtHNXZaR1V1Y21sbmFIUXVjM1JoY25Rc0lGd2lXV2xsYkdRZ1pYaHdjbVZ6YzJsdmJpQmpZVzV1YjNRZ1ltVWdZU0JrWldaaGRXeDBJSFpoYkhWbFhDSXBPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNibHh1SUNBZ0lDQWdZMkZ6WlNCY0lsQmhjbVZ1ZEdobGMybDZaV1JGZUhCeVpYTnphVzl1WENJNlhHNGdJQ0FnSUNBZ0lHNXZaR1V1Wlhod2NtVnpjMmx2YmlBOUlIUm9hWE11ZEc5QmMzTnBaMjVoWW14bEtHNXZaR1V1Wlhod2NtVnpjMmx2Yml3Z2FYTkNhVzVrYVc1bktUdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNWNiaUFnSUNBZ0lHTmhjMlVnWENKTlpXMWlaWEpGZUhCeVpYTnphVzl1WENJNlhHNGdJQ0FnSUNBZ0lHbG1JQ2doYVhOQ2FXNWthVzVuS1NCaWNtVmhhenRjYmx4dUlDQWdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJQ0FnZEdocGN5NXlZV2x6WlNodWIyUmxMbk4wWVhKMExDQmNJa0Z6YzJsbmJtbHVaeUIwYnlCeWRtRnNkV1ZjSWlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUhKbGRIVnliaUJ1YjJSbE8xeHVmVHRjYmx4dUx5OGdRMjl1ZG1WeWRDQnNhWE4wSUc5bUlHVjRjSEpsYzNOcGIyNGdZWFJ2YlhNZ2RHOGdZbWx1WkdsdVp5QnNhWE4wTGx4dVhHNXdjQzUwYjBGemMybG5ibUZpYkdWTWFYTjBJRDBnWm5WdVkzUnBiMjRnS0dWNGNISk1hWE4wTENCcGMwSnBibVJwYm1jcElIdGNiaUFnZG1GeUlHVnVaQ0E5SUdWNGNISk1hWE4wTG14bGJtZDBhRHRjYmlBZ2FXWWdLR1Z1WkNrZ2UxeHVJQ0FnSUhaaGNpQnNZWE4wSUQwZ1pYaHdja3hwYzNSYlpXNWtJQzBnTVYwN1hHNGdJQ0FnYVdZZ0tHeGhjM1FnSmlZZ2JHRnpkQzUwZVhCbElEMDlJRndpVW1WemRFVnNaVzFsYm5SY0lpa2dlMXh1SUNBZ0lDQWdMUzFsYm1RN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoc1lYTjBJQ1ltSUd4aGMzUXVkSGx3WlNBOVBTQmNJbE53Y21WaFpFVnNaVzFsYm5SY0lpa2dlMXh1SUNBZ0lDQWdiR0Z6ZEM1MGVYQmxJRDBnWENKU1pYTjBSV3hsYldWdWRGd2lPMXh1SUNBZ0lDQWdkbUZ5SUdGeVp5QTlJR3hoYzNRdVlYSm5kVzFsYm5RN1hHNGdJQ0FnSUNCMGFHbHpMblJ2UVhOemFXZHVZV0pzWlNoaGNtY3NJR2x6UW1sdVpHbHVaeWs3WEc0Z0lDQWdJQ0JwWmlBb1lYSm5MblI1Y0dVZ0lUMDlJRndpU1dSbGJuUnBabWxsY2x3aUlDWW1JR0Z5Wnk1MGVYQmxJQ0U5UFNCY0lrMWxiV0psY2tWNGNISmxjM05wYjI1Y0lpQW1KaUJoY21jdWRIbHdaU0FoUFQwZ1hDSkJjbkpoZVZCaGRIUmxjbTVjSWlrZ2RHaHBjeTUxYm1WNGNHVmpkR1ZrS0dGeVp5NXpkR0Z5ZENrN1hHNGdJQ0FnSUNBdExXVnVaRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvYVhOQ2FXNWthVzVuSUNZbUlHeGhjM1F1ZEhsd1pTQTlQVDBnWENKU1pYTjBSV3hsYldWdWRGd2lJQ1ltSUd4aGMzUXVZWEpuZFcxbGJuUXVkSGx3WlNBaFBUMGdYQ0pKWkdWdWRHbG1hV1Z5WENJcElIUm9hWE11ZFc1bGVIQmxZM1JsWkNoc1lYTjBMbUZ5WjNWdFpXNTBMbk4wWVhKMEtUdGNiaUFnZlZ4dUlDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR1Z1WkRzZ2FTc3JLU0I3WEc0Z0lDQWdkbUZ5SUdWc2RDQTlJR1Y0Y0hKTWFYTjBXMmxkTzF4dUlDQWdJR2xtSUNobGJIUXBJSFJvYVhNdWRHOUJjM05wWjI1aFlteGxLR1ZzZEN3Z2FYTkNhVzVrYVc1bktUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z1pYaHdja3hwYzNRN1hHNTlPMXh1WEc0dkx5QlFZWEp6WlhNZ2MzQnlaV0ZrSUdWc1pXMWxiblF1WEc1Y2JuQndMbkJoY25ObFUzQnlaV0ZrSUQwZ1puVnVZM1JwYjI0Z0tISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk1wSUh0Y2JpQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BPMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNWhjbWQxYldWdWRDQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVRnpjMmxuYmloeVpXWkVaWE4wY25WamRIVnlhVzVuUlhKeWIzSnpLVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJbE53Y21WaFpFVnNaVzFsYm5SY0lpazdYRzU5TzF4dVhHNXdjQzV3WVhKelpWSmxjM1FnUFNCbWRXNWpkR2x2YmlBb1lXeHNiM2RPYjI1SlpHVnVkQ2tnZTF4dUlDQjJZWElnYm05a1pTQTlJSFJvYVhNdWMzUmhjblJPYjJSbEtDazdYRzRnSUhSb2FYTXVibVY0ZENncE8xeHVYRzRnSUM4dklGSmxjM1JGYkdWdFpXNTBJR2x1YzJsa1pTQnZaaUJoSUdaMWJtTjBhVzl1SUhCaGNtRnRaWFJsY2lCdGRYTjBJR0psSUdGdUlHbGtaVzUwYVdacFpYSmNiaUFnYVdZZ0tHRnNiRzkzVG05dVNXUmxiblFwSUc1dlpHVXVZWEpuZFcxbGJuUWdQU0IwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWJtRnRaU0EvSUhSb2FYTXVjR0Z5YzJWSlpHVnVkQ2dwSURvZ2RHaHBjeTUxYm1WNGNHVmpkR1ZrS0NrN1pXeHpaU0J1YjJSbExtRnlaM1Z0Wlc1MElEMGdkR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01aGJXVWdmSHdnZEdocGN5NTBlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05yWlhSTUlEOGdkR2hwY3k1d1lYSnpaVUpwYm1ScGJtZEJkRzl0S0NrZ09pQjBhR2x6TG5WdVpYaHdaV04wWldRb0tUdGNibHh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoT2IyUmxLRzV2WkdVc0lGd2lVbVZ6ZEVWc1pXMWxiblJjSWlrN1hHNTlPMXh1WEc0dkx5QlFZWEp6WlhNZ2JIWmhiSFZsSUNoaGMzTnBaMjVoWW14bEtTQmhkRzl0TGx4dVhHNXdjQzV3WVhKelpVSnBibVJwYm1kQmRHOXRJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUR3Z05pa2djbVYwZFhKdUlIUm9hWE11Y0dGeWMyVkpaR1Z1ZENncE8xeHVJQ0J6ZDJsMFkyZ2dLSFJvYVhNdWRIbHdaU2tnZTF4dUlDQWdJR05oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1dVlXMWxPbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVkpaR1Z1ZENncE8xeHVYRzRnSUNBZ1kyRnpaU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUp5WVdOclpYUk1PbHh1SUNBZ0lDQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1dVpYaDBLQ2s3WEc0Z0lDQWdJQ0J1YjJSbExtVnNaVzFsYm5SeklEMGdkR2hwY3k1d1lYSnpaVUpwYm1ScGJtZE1hWE4wS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WW5KaFkydGxkRklzSUhSeWRXVXNJSFJ5ZFdVcE8xeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJa0Z5Y21GNVVHRjBkR1Z5Ymx3aUtUdGNibHh1SUNBZ0lHTmhjMlVnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVpY21GalpVdzZYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WVhKelpVOWlhaWgwY25WbEtUdGNibHh1SUNBZ0lHUmxabUYxYkhRNlhHNGdJQ0FnSUNCMGFHbHpMblZ1Wlhod1pXTjBaV1FvS1R0Y2JpQWdmVnh1ZlR0Y2JseHVjSEF1Y0dGeWMyVkNhVzVrYVc1blRHbHpkQ0E5SUdaMWJtTjBhVzl1SUNoamJHOXpaU3dnWVd4c2IzZEZiWEIwZVN3Z1lXeHNiM2RVY21GcGJHbHVaME52YlcxaExDQmhiR3h2ZDA1dmJrbGtaVzUwS1NCN1hHNGdJSFpoY2lCbGJIUnpJRDBnVzEwc1hHNGdJQ0FnSUNCbWFYSnpkQ0E5SUhSeWRXVTdYRzRnSUhkb2FXeGxJQ2doZEdocGN5NWxZWFFvWTJ4dmMyVXBLU0I3WEc0Z0lDQWdhV1lnS0dacGNuTjBLU0JtYVhKemRDQTlJR1poYkhObE8yVnNjMlVnZEdocGN5NWxlSEJsWTNRb1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1amIyMXRZU2s3WEc0Z0lDQWdhV1lnS0dGc2JHOTNSVzF3ZEhrZ0ppWWdkR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1OdmJXMWhLU0I3WEc0Z0lDQWdJQ0JsYkhSekxuQjFjMmdvYm5Wc2JDazdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGhiR3h2ZDFSeVlXbHNhVzVuUTI5dGJXRWdKaVlnZEdocGN5NWhablJsY2xSeVlXbHNhVzVuUTI5dGJXRW9ZMnh2YzJVcEtTQjdYRzRnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWxiR3hwY0hOcGN5a2dlMXh1SUNBZ0lDQWdkbUZ5SUhKbGMzUWdQU0IwYUdsekxuQmhjbk5sVW1WemRDaGhiR3h2ZDA1dmJrbGtaVzUwS1R0Y2JpQWdJQ0FnSUhSb2FYTXVjR0Z5YzJWQ2FXNWthVzVuVEdsemRFbDBaVzBvY21WemRDazdYRzRnSUNBZ0lDQmxiSFJ6TG5CMWMyZ29jbVZ6ZENrN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1OdmJXMWhLU0IwYUdsekxuSmhhWE5sS0hSb2FYTXVjM1JoY25Rc0lGd2lRMjl0YldFZ2FYTWdibTkwSUhCbGNtMXBkSFJsWkNCaFpuUmxjaUIwYUdVZ2NtVnpkQ0JsYkdWdFpXNTBYQ0lwTzF4dUlDQWdJQ0FnZEdocGN5NWxlSEJsWTNRb1kyeHZjMlVwTzF4dUlDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhaaGNpQmxiR1Z0SUQwZ2RHaHBjeTV3WVhKelpVMWhlV0psUkdWbVlYVnNkQ2gwYUdsekxuTjBZWEowTENCMGFHbHpMbk4wWVhKMFRHOWpLVHRjYmlBZ0lDQWdJSFJvYVhNdWNHRnljMlZDYVc1a2FXNW5UR2x6ZEVsMFpXMG9aV3hsYlNrN1hHNGdJQ0FnSUNCbGJIUnpMbkIxYzJnb1pXeGxiU2s3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJSEpsZEhWeWJpQmxiSFJ6TzF4dWZUdGNibHh1Y0hBdWNHRnljMlZDYVc1a2FXNW5UR2x6ZEVsMFpXMGdQU0JtZFc1amRHbHZiaUFvY0dGeVlXMHBJSHRjYmlBZ2NtVjBkWEp1SUhCaGNtRnRPMXh1ZlR0Y2JseHVMeThnVUdGeWMyVnpJR0Z6YzJsbmJtMWxiblFnY0dGMGRHVnliaUJoY205MWJtUWdaMmwyWlc0Z1lYUnZiU0JwWmlCd2IzTnphV0pzWlM1Y2JseHVjSEF1Y0dGeWMyVk5ZWGxpWlVSbFptRjFiSFFnUFNCbWRXNWpkR2x2YmlBb2MzUmhjblJRYjNNc0lITjBZWEowVEc5akxDQnNaV1owS1NCN1hHNGdJR3hsWm5RZ1BTQnNaV1owSUh4OElIUm9hWE11Y0dGeWMyVkNhVzVrYVc1blFYUnZiU2dwTzF4dUlDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRHdnTmlCOGZDQWhkR2hwY3k1bFlYUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWxjU2twSUhKbGRIVnliaUJzWldaME8xeHVJQ0IyWVhJZ2JtOWtaU0E5SUhSb2FYTXVjM1JoY25ST2IyUmxRWFFvYzNSaGNuUlFiM01zSUhOMFlYSjBURzlqS1R0Y2JpQWdibTlrWlM1c1pXWjBJRDBnYkdWbWREdGNiaUFnYm05a1pTNXlhV2RvZENBOUlIUm9hWE11Y0dGeWMyVk5ZWGxpWlVGemMybG5iaWdwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpUVhOemFXZHViV1Z1ZEZCaGRIUmxjbTVjSWlrN1hHNTlPMXh1WEc0dkx5QldaWEpwWm5rZ2RHaGhkQ0JoSUc1dlpHVWdhWE1nWVc0Z2JIWmhiQ0RpZ0pRZ2MyOXRaWFJvYVc1bklIUm9ZWFFnWTJGdUlHSmxJR0Z6YzJsbmJtVmtYRzR2THlCMGJ5NWNibHh1Y0hBdVkyaGxZMnRNVm1Gc0lEMGdablZ1WTNScGIyNGdLR1Y0Y0hJc0lHbHpRbWx1WkdsdVp5d2dZMmhsWTJ0RGJHRnphR1Z6S1NCN1hHNGdJSE4zYVhSamFDQW9aWGh3Y2k1MGVYQmxLU0I3WEc0Z0lDQWdZMkZ6WlNCY0lrbGtaVzUwYVdacFpYSmNJanBjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbk4wY21samRDQW1KaUIwYUdsekxuSmxjMlZ5ZG1Wa1YyOXlaSE5UZEhKcFkzUkNhVzVrTG5SbGMzUW9aWGh3Y2k1dVlXMWxLU2tnZEdocGN5NXlZV2x6WlZKbFkyOTJaWEpoWW14bEtHVjRjSEl1YzNSaGNuUXNJQ2hwYzBKcGJtUnBibWNnUHlCY0lrSnBibVJwYm1jZ1hDSWdPaUJjSWtGemMybG5ibWx1WnlCMGJ5QmNJaWtnS3lCbGVIQnlMbTVoYldVZ0t5QmNJaUJwYmlCemRISnBZM1FnYlc5a1pWd2lLVHRjYmlBZ0lDQWdJR2xtSUNoamFHVmphME5zWVhOb1pYTXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tGOTFkR2xzTG1oaGN5aGphR1ZqYTBOc1lYTm9aWE1zSUdWNGNISXVibUZ0WlNrcElIUm9hWE11Y21GcGMyVlNaV052ZG1WeVlXSnNaU2hsZUhCeUxuTjBZWEowTENCY0lrRnlaM1Z0Wlc1MElHNWhiV1VnWTJ4aGMyaGNJaWs3WEc0Z0lDQWdJQ0FnSUdOb1pXTnJRMnhoYzJobGMxdGxlSEJ5TG01aGJXVmRJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHSnlaV0ZyTzF4dVhHNGdJQ0FnWTJGelpTQmNJazFsYldKbGNrVjRjSEpsYzNOcGIyNWNJanBjYmlBZ0lDQWdJR2xtSUNocGMwSnBibVJwYm1jcElIUm9hWE11Y21GcGMyVlNaV052ZG1WeVlXSnNaU2hsZUhCeUxuTjBZWEowTENBb2FYTkNhVzVrYVc1bklEOGdYQ0pDYVc1a2FXNW5YQ0lnT2lCY0lrRnpjMmxuYm1sdVp5QjBiMXdpS1NBcklGd2lJRzFsYldKbGNpQmxlSEJ5WlhOemFXOXVYQ0lwTzF4dUlDQWdJQ0FnWW5KbFlXczdYRzVjYmlBZ0lDQmpZWE5sSUZ3aVQySnFaV04wVUdGMGRHVnlibHdpT2x4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCbGVIQnlMbkJ5YjNCbGNuUnBaWE11YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1amFHVmphMHhXWVd3b1pYaHdjaTV3Y205d1pYSjBhV1Z6VzJsZExuWmhiSFZsTENCcGMwSnBibVJwYm1jc0lHTm9aV05yUTJ4aGMyaGxjeWs3WEc0Z0lDQWdJQ0I5WW5KbFlXczdYRzVjYmlBZ0lDQmpZWE5sSUZ3aVFYSnlZWGxRWVhSMFpYSnVYQ0k2WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUdWNGNISXVaV3hsYldWdWRITXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR1ZzWlcwZ1BTQmxlSEJ5TG1Wc1pXMWxiblJ6VzJsZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWld4bGJTa2dkR2hwY3k1amFHVmphMHhXWVd3b1pXeGxiU3dnYVhOQ2FXNWthVzVuTENCamFHVmphME5zWVhOb1pYTXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdZbkpsWVdzN1hHNWNiaUFnSUNCallYTmxJRndpUVhOemFXZHViV1Z1ZEZCaGRIUmxjbTVjSWpwY2JpQWdJQ0FnSUhSb2FYTXVZMmhsWTJ0TVZtRnNLR1Y0Y0hJdWJHVm1kQ3dnYVhOQ2FXNWthVzVuTENCamFHVmphME5zWVhOb1pYTXBPMXh1SUNBZ0lDQWdZbkpsWVdzN1hHNWNiaUFnSUNCallYTmxJRndpVW1WemRFVnNaVzFsYm5SY0lqcGNiaUFnSUNBZ0lIUm9hWE11WTJobFkydE1WbUZzS0dWNGNISXVZWEpuZFcxbGJuUXNJR2x6UW1sdVpHbHVaeXdnWTJobFkydERiR0Z6YUdWektUdGNiaUFnSUNBZ0lHSnlaV0ZyTzF4dVhHNGdJQ0FnWTJGelpTQmNJbEJoY21WdWRHaGxjMmw2WldSRmVIQnlaWE56YVc5dVhDSTZYRzRnSUNBZ0lDQjBhR2x6TG1Ob1pXTnJURlpoYkNobGVIQnlMbVY0Y0hKbGMzTnBiMjRzSUdselFtbHVaR2x1Wnl3Z1kyaGxZMnREYkdGemFHVnpLVHRjYmlBZ0lDQWdJR0p5WldGck8xeHVYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhSb2FYTXVjbUZwYzJVb1pYaHdjaTV6ZEdGeWRDd2dLR2x6UW1sdVpHbHVaeUEvSUZ3aVFtbHVaR2x1WjF3aUlEb2dYQ0pCYzNOcFoyNXBibWNnZEc5Y0lpa2dLeUJjSWlCeWRtRnNkV1ZjSWlrN1hHNGdJSDFjYm4wN1hHNWNibjBzZTF3aUxpOXpkR0YwWlZ3aU9qRXdMRndpTGk5MGIydGxiblI1Y0dWY0lqb3hOQ3hjSWk0dmRYUnBiRndpT2pFMWZWMHNOenBiWm5WdVkzUnBiMjRvWDJSbGNtVnhYeXh0YjJSMWJHVXNaWGh3YjNKMGN5bDdYRzVjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1Wlhod2IzSjBjeTVmWDJWelRXOWtkV3hsSUQwZ2RISjFaVHRjYmx4dVpuVnVZM1JwYjI0Z1gyTnNZWE56UTJGc2JFTm9aV05yS0dsdWMzUmhibU5sTENCRGIyNXpkSEoxWTNSdmNpa2dleUJwWmlBb0lTaHBibk4wWVc1alpTQnBibk4wWVc1alpXOW1JRU52Ym5OMGNuVmpkRzl5S1NrZ2V5QjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLRndpUTJGdWJtOTBJR05oYkd3Z1lTQmpiR0Z6Y3lCaGN5QmhJR1oxYm1OMGFXOXVYQ0lwT3lCOUlIMWNibHh1ZG1GeUlGOXpkR0YwWlNBOUlGOWtaWEpsY1Y4b1hDSXVMM04wWVhSbFhDSXBPMXh1WEc1MllYSWdYMnh2WTNWMGFXd2dQU0JmWkdWeVpYRmZLRndpTGk5c2IyTjFkR2xzWENJcE8xeHVYRzUyWVhJZ1RtOWtaU0E5SUdaMWJtTjBhVzl1SUU1dlpHVW9jR0Z5YzJWeUxDQndiM01zSUd4dll5a2dlMXh1SUNCZlkyeGhjM05EWVd4c1EyaGxZMnNvZEdocGN5d2dUbTlrWlNrN1hHNWNiaUFnZEdocGN5NTBlWEJsSUQwZ1hDSmNJanRjYmlBZ2RHaHBjeTV6ZEdGeWRDQTlJSEJ2Y3p0Y2JpQWdkR2hwY3k1bGJtUWdQU0F3TzF4dUlDQnBaaUFvY0dGeWMyVnlMbTl3ZEdsdmJuTXViRzlqWVhScGIyNXpLU0IwYUdsekxteHZZeUE5SUc1bGR5QmZiRzlqZFhScGJDNVRiM1Z5WTJWTWIyTmhkR2x2Ymlod1lYSnpaWElzSUd4dll5azdYRzRnSUdsbUlDaHdZWEp6WlhJdWIzQjBhVzl1Y3k1a2FYSmxZM1JUYjNWeVkyVkdhV3hsS1NCMGFHbHpMbk52ZFhKalpVWnBiR1VnUFNCd1lYSnpaWEl1YjNCMGFXOXVjeTVrYVhKbFkzUlRiM1Z5WTJWR2FXeGxPMXh1SUNCcFppQW9jR0Z5YzJWeUxtOXdkR2x2Ym5NdWNtRnVaMlZ6S1NCMGFHbHpMbkpoYm1kbElEMGdXM0J2Y3l3Z01GMDdYRzU5WEc1Y2JpOHZJRk4wWVhKMElHRnVJRUZUVkNCdWIyUmxMQ0JoZEhSaFkyaHBibWNnWVNCemRHRnlkQ0J2Wm1aelpYUXVYRzVjYmp0Y2JseHVaWGh3YjNKMGN5NU9iMlJsSUQwZ1RtOWtaVHRjYm5aaGNpQndjQ0E5SUY5emRHRjBaUzVRWVhKelpYSXVjSEp2ZEc5MGVYQmxPMXh1WEc1d2NDNXpkR0Z5ZEU1dlpHVWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJSEpsZEhWeWJpQnVaWGNnVG05a1pTaDBhR2x6TENCMGFHbHpMbk4wWVhKMExDQjBhR2x6TG5OMFlYSjBURzlqS1R0Y2JuMDdYRzVjYm5Cd0xuTjBZWEowVG05a1pVRjBJRDBnWm5WdVkzUnBiMjRnS0hCdmN5d2diRzlqS1NCN1hHNGdJSEpsZEhWeWJpQnVaWGNnVG05a1pTaDBhR2x6TENCd2IzTXNJR3h2WXlrN1hHNTlPMXh1WEc0dkx5QkdhVzVwYzJnZ1lXNGdRVk5VSUc1dlpHVXNJR0ZrWkdsdVp5QmdkSGx3WldBZ1lXNWtJR0JsYm1SZ0lIQnliM0JsY25ScFpYTXVYRzVjYm1aMWJtTjBhVzl1SUdacGJtbHphRTV2WkdWQmRDaHViMlJsTENCMGVYQmxMQ0J3YjNNc0lHeHZZeWtnZTF4dUlDQnViMlJsTG5SNWNHVWdQU0IwZVhCbE8xeHVJQ0J1YjJSbExtVnVaQ0E5SUhCdmN6dGNiaUFnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVzYjJOaGRHbHZibk1wSUc1dlpHVXViRzlqTG1WdVpDQTlJR3h2WXp0Y2JpQWdhV1lnS0hSb2FYTXViM0IwYVc5dWN5NXlZVzVuWlhNcElHNXZaR1V1Y21GdVoyVmJNVjBnUFNCd2IzTTdYRzRnSUhKbGRIVnliaUJ1YjJSbE8xeHVmVnh1WEc1d2NDNW1hVzVwYzJoT2IyUmxJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJSFI1Y0dVcElIdGNiaUFnY21WMGRYSnVJR1pwYm1semFFNXZaR1ZCZEM1allXeHNLSFJvYVhNc0lHNXZaR1VzSUhSNWNHVXNJSFJvYVhNdWJHRnpkRlJ2YTBWdVpDd2dkR2hwY3k1c1lYTjBWRzlyUlc1a1RHOWpLVHRjYm4wN1hHNWNiaTh2SUVacGJtbHphQ0J1YjJSbElHRjBJR2RwZG1WdUlIQnZjMmwwYVc5dVhHNWNibkJ3TG1acGJtbHphRTV2WkdWQmRDQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQjBlWEJsTENCd2IzTXNJR3h2WXlrZ2UxeHVJQ0J5WlhSMWNtNGdabWx1YVhOb1RtOWtaVUYwTG1OaGJHd29kR2hwY3l3Z2JtOWtaU3dnZEhsd1pTd2djRzl6TENCc2IyTXBPMXh1ZlR0Y2JseHVmU3g3WENJdUwyeHZZM1YwYVd4Y0lqbzFMRndpTGk5emRHRjBaVndpT2pFd2ZWMHNPRHBiWm5WdVkzUnBiMjRvWDJSbGNtVnhYeXh0YjJSMWJHVXNaWGh3YjNKMGN5bDdYRzVjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1Wlhod2IzSjBjeTVmWDJWelRXOWtkV3hsSUQwZ2RISjFaVHRjYm1WNGNHOXlkSE11WjJWMFQzQjBhVzl1Y3lBOUlHZGxkRTl3ZEdsdmJuTTdYRzVjYm5aaGNpQmZkWFJwYkNBOUlGOWtaWEpsY1Y4b1hDSXVMM1YwYVd4Y0lpazdYRzVjYm5aaGNpQmZiRzlqZFhScGJDQTlJRjlrWlhKbGNWOG9YQ0l1TDJ4dlkzVjBhV3hjSWlrN1hHNWNiaTh2SUVFZ2MyVmpiMjVrSUc5d2RHbHZibUZzSUdGeVozVnRaVzUwSUdOaGJpQmlaU0JuYVhabGJpQjBieUJtZFhKMGFHVnlJR052Ym1acFozVnlaVnh1THk4Z2RHaGxJSEJoY25ObGNpQndjbTlqWlhOekxpQlVhR1Z6WlNCdmNIUnBiMjV6SUdGeVpTQnlaV052WjI1cGVtVmtPbHh1WEc1MllYSWdaR1ZtWVhWc2RFOXdkR2x2Ym5NZ1BTQjdYRzRnSUM4dklHQmxZMjFoVm1WeWMybHZibUFnYVc1a2FXTmhkR1Z6SUhSb1pTQkZRMDFCVTJOeWFYQjBJSFpsY25OcGIyNGdkRzhnY0dGeWMyVXVJRTExYzNSY2JpQWdMeThnWW1VZ1pXbDBhR1Z5SURNc0lHOXlJRFVzSUc5eUlEWXVJRlJvYVhNZ2FXNW1iSFZsYm1ObGN5QnpkWEJ3YjNKMElHWnZjaUJ6ZEhKcFkzUmNiaUFnTHk4Z2JXOWtaU3dnZEdobElITmxkQ0J2WmlCeVpYTmxjblpsWkNCM2IzSmtjeXdnYzNWd2NHOXlkQ0JtYjNJZ1oyVjBkR1Z5Y3lCaGJtUmNiaUFnTHk4Z2MyVjBkR1Z5Y3lCaGJtUWdiM1JvWlhJZ1ptVmhkSFZ5WlhNdUlGUm9aU0JrWldaaGRXeDBJR2x6SURZdVhHNGdJR1ZqYldGV1pYSnphVzl1T2lBMkxGeHVJQ0F2THlCVGIzVnlZMlVnZEhsd1pTQW9YQ0p6WTNKcGNIUmNJaUJ2Y2lCY0ltMXZaSFZzWlZ3aUtTQm1iM0lnWkdsbVptVnlaVzUwSUhObGJXRnVkR2xqYzF4dUlDQnpiM1Z5WTJWVWVYQmxPaUJjSW5OamNtbHdkRndpTEZ4dUlDQXZMeUJnYjI1SmJuTmxjblJsWkZObGJXbGpiMnh2Ym1BZ1kyRnVJR0psSUdFZ1kyRnNiR0poWTJzZ2RHaGhkQ0IzYVd4c0lHSmxJR05oYkd4bFpGeHVJQ0F2THlCM2FHVnVJR0VnYzJWdGFXTnZiRzl1SUdseklHRjFkRzl0WVhScFkyRnNiSGtnYVc1elpYSjBaV1F1SUVsMElIZHBiR3dnWW1VZ2NHRnpjMlZrWEc0Z0lDOHZJSFJvSUhCdmMybDBhVzl1SUc5bUlIUm9aU0JqYjIxdFlTQmhjeUJoYmlCdlptWnpaWFFzSUdGdVpDQnBaaUJnYkc5allYUnBiMjV6WUNCcGMxeHVJQ0F2THlCbGJtRmliR1ZrTENCcGRDQnBjeUJuYVhabGJpQjBhR1VnYkc5allYUnBiMjRnWVhNZ1lTQmdlMnhwYm1Vc0lHTnZiSFZ0Ym4xZ0lHOWlhbVZqZEZ4dUlDQXZMeUJoY3lCelpXTnZibVFnWVhKbmRXMWxiblF1WEc0Z0lHOXVTVzV6WlhKMFpXUlRaVzFwWTI5c2IyNDZJRzUxYkd3c1hHNGdJQzh2SUdCdmJsUnlZV2xzYVc1blEyOXRiV0ZnSUdseklITnBiV2xzWVhJZ2RHOGdZRzl1U1c1elpYSjBaV1JUWlcxcFkyOXNiMjVnTENCaWRYUWdabTl5WEc0Z0lDOHZJSFJ5WVdsc2FXNW5JR052YlcxaGN5NWNiaUFnYjI1VWNtRnBiR2x1WjBOdmJXMWhPaUJ1ZFd4c0xGeHVJQ0F2THlCQ2VTQmtaV1poZFd4MExDQnlaWE5sY25abFpDQjNiM0prY3lCaGNtVWdiMjVzZVNCbGJtWnZjbU5sWkNCcFppQmxZMjFoVm1WeWMybHZiaUErUFNBMUxseHVJQ0F2THlCVFpYUWdZR0ZzYkc5M1VtVnpaWEoyWldSZ0lIUnZJR0VnWW05dmJHVmhiaUIyWVd4MVpTQjBieUJsZUhCc2FXTnBkR3g1SUhSMWNtNGdkR2hwY3lCdmJseHVJQ0F2THlCaGJpQnZabVl1SUZkb1pXNGdkR2hwY3lCdmNIUnBiMjRnYUdGeklIUm9aU0IyWVd4MVpTQmNJbTVsZG1WeVhDSXNJSEpsYzJWeWRtVmtJSGR2Y21SelhHNGdJQzh2SUdGdVpDQnJaWGwzYjNKa2N5QmpZVzRnWVd4emJ5QnViM1FnWW1VZ2RYTmxaQ0JoY3lCd2NtOXdaWEowZVNCdVlXMWxjeTVjYmlBZ1lXeHNiM2RTWlhObGNuWmxaRG9nYm5Wc2JDeGNiaUFnTHk4Z1YyaGxiaUJsYm1GaWJHVmtMQ0JoSUhKbGRIVnliaUJoZENCMGFHVWdkRzl3SUd4bGRtVnNJR2x6SUc1dmRDQmpiMjV6YVdSbGNtVmtJR0Z1WEc0Z0lDOHZJR1Z5Y205eUxseHVJQ0JoYkd4dmQxSmxkSFZ5Yms5MWRITnBaR1ZHZFc1amRHbHZiam9nWm1Gc2MyVXNYRzRnSUM4dklGZG9aVzRnWlc1aFlteGxaQ3dnYVcxd2IzSjBMMlY0Y0c5eWRDQnpkR0YwWlcxbGJuUnpJR0Z5WlNCdWIzUWdZMjl1YzNSeVlXbHVaV1FnZEc5Y2JpQWdMeThnWVhCd1pXRnlhVzVuSUdGMElIUm9aU0IwYjNBZ2IyWWdkR2hsSUhCeWIyZHlZVzB1WEc0Z0lHRnNiRzkzU1cxd2IzSjBSWGh3YjNKMFJYWmxjbmwzYUdWeVpUb2dabUZzYzJVc1hHNGdJQzh2SUZkb1pXNGdaVzVoWW14bFpDd2dhR0Z6YUdKaGJtY2daR2x5WldOMGFYWmxJR2x1SUhSb1pTQmlaV2RwYm01cGJtY2diMllnWm1sc1pWeHVJQ0F2THlCcGN5QmhiR3h2ZDJWa0lHRnVaQ0IwY21WaGRHVmtJR0Z6SUdFZ2JHbHVaU0JqYjIxdFpXNTBMbHh1SUNCaGJHeHZkMGhoYzJoQ1lXNW5PaUJtWVd4elpTeGNiaUFnTHk4Z1YyaGxiaUJnYkc5allYUnBiMjV6WUNCcGN5QnZiaXdnWUd4dlkyQWdjSEp2Y0dWeWRHbGxjeUJvYjJ4a2FXNW5JRzlpYW1WamRITWdkMmwwYUZ4dUlDQXZMeUJnYzNSaGNuUmdJR0Z1WkNCZ1pXNWtZQ0J3Y205d1pYSjBhV1Z6SUdsdUlHQjdiR2x1WlN3Z1kyOXNkVzF1ZldBZ1ptOXliU0FvZDJsMGFGeHVJQ0F2THlCc2FXNWxJR0psYVc1bklERXRZbUZ6WldRZ1lXNWtJR052YkhWdGJpQXdMV0poYzJWa0tTQjNhV3hzSUdKbElHRjBkR0ZqYUdWa0lIUnZJSFJvWlZ4dUlDQXZMeUJ1YjJSbGN5NWNiaUFnYkc5allYUnBiMjV6T2lCbVlXeHpaU3hjYmlBZ0x5OGdRU0JtZFc1amRHbHZiaUJqWVc0Z1ltVWdjR0Z6YzJWa0lHRnpJR0J2YmxSdmEyVnVZQ0J2Y0hScGIyNHNJSGRvYVdOb0lIZHBiR3hjYmlBZ0x5OGdZMkYxYzJVZ1FXTnZjbTRnZEc4Z1kyRnNiQ0IwYUdGMElHWjFibU4wYVc5dUlIZHBkR2dnYjJKcVpXTjBJR2x1SUhSb1pTQnpZVzFsWEc0Z0lDOHZJR1p2Y20xaGRDQmhjeUIwYjJ0bGJuTWdjbVYwZFhKdVpXUWdabkp2YlNCZ2RHOXJaVzVwZW1WeUtDa3VaMlYwVkc5clpXNG9LV0F1SUU1dmRHVmNiaUFnTHk4Z2RHaGhkQ0I1YjNVZ1lYSmxJRzV2ZENCaGJHeHZkMlZrSUhSdklHTmhiR3dnZEdobElIQmhjbk5sY2lCbWNtOXRJSFJvWlZ4dUlDQXZMeUJqWVd4c1ltRmphK0tBbEhSb1lYUWdkMmxzYkNCamIzSnlkWEIwSUdsMGN5QnBiblJsY201aGJDQnpkR0YwWlM1Y2JpQWdiMjVVYjJ0bGJqb2diblZzYkN4Y2JpQWdMeThnUVNCbWRXNWpkR2x2YmlCallXNGdZbVVnY0dGemMyVmtJR0Z6SUdCdmJrTnZiVzFsYm5SZ0lHOXdkR2x2Yml3Z2QyaHBZMmdnZDJsc2JGeHVJQ0F2THlCallYVnpaU0JCWTI5eWJpQjBieUJqWVd4c0lIUm9ZWFFnWm5WdVkzUnBiMjRnZDJsMGFDQmdLR0pzYjJOckxDQjBaWGgwTENCemRHRnlkQ3hjYmlBZ0x5OGdaVzVrS1dBZ2NHRnlZVzFsZEdWeWN5QjNhR1Z1WlhabGNpQmhJR052YlcxbGJuUWdhWE1nYzJ0cGNIQmxaQzRnWUdKc2IyTnJZQ0JwY3lCaFhHNGdJQzh2SUdKdmIyeGxZVzRnYVc1a2FXTmhkR2x1WnlCM2FHVjBhR1Z5SUhSb2FYTWdhWE1nWVNCaWJHOWpheUFvWUM4cUlDb3ZZQ2tnWTI5dGJXVnVkQ3hjYmlBZ0x5OGdZSFJsZUhSZ0lHbHpJSFJvWlNCamIyNTBaVzUwSUc5bUlIUm9aU0JqYjIxdFpXNTBMQ0JoYm1RZ1lITjBZWEowWUNCaGJtUWdZR1Z1WkdBZ1lYSmxYRzRnSUM4dklHTm9ZWEpoWTNSbGNpQnZabVp6WlhSeklIUm9ZWFFnWkdWdWIzUmxJSFJvWlNCemRHRnlkQ0JoYm1RZ1pXNWtJRzltSUhSb1pTQmpiMjF0Wlc1MExseHVJQ0F2THlCWGFHVnVJSFJvWlNCZ2JHOWpZWFJwYjI1ellDQnZjSFJwYjI0Z2FYTWdiMjRzSUhSM2J5QnRiM0psSUhCaGNtRnRaWFJsY25NZ1lYSmxYRzRnSUM4dklIQmhjM05sWkN3Z2RHaGxJR1oxYkd3Z1lIdHNhVzVsTENCamIyeDFiVzU5WUNCc2IyTmhkR2x2Ym5NZ2IyWWdkR2hsSUhOMFlYSjBJR0Z1WkZ4dUlDQXZMeUJsYm1RZ2IyWWdkR2hsSUdOdmJXMWxiblJ6TGlCT2IzUmxJSFJvWVhRZ2VXOTFJR0Z5WlNCdWIzUWdZV3hzYjNkbFpDQjBieUJqWVd4c0lIUm9aVnh1SUNBdkx5QndZWEp6WlhJZ1puSnZiU0IwYUdVZ1kyRnNiR0poWTJ2aWdKUjBhR0YwSUhkcGJHd2dZMjl5Y25Wd2RDQnBkSE1nYVc1MFpYSnVZV3dnYzNSaGRHVXVYRzRnSUc5dVEyOXRiV1Z1ZERvZ2JuVnNiQ3hjYmlBZ0x5OGdUbTlrWlhNZ2FHRjJaU0IwYUdWcGNpQnpkR0Z5ZENCaGJtUWdaVzVrSUdOb1lYSmhZM1JsY25NZ2IyWm1jMlYwY3lCeVpXTnZjbVJsWkNCcGJseHVJQ0F2THlCZ2MzUmhjblJnSUdGdVpDQmdaVzVrWUNCd2NtOXdaWEowYVdWeklDaGthWEpsWTNSc2VTQnZiaUIwYUdVZ2JtOWtaU3dnY21GMGFHVnlJSFJvWVc1Y2JpQWdMeThnZEdobElHQnNiMk5nSUc5aWFtVmpkQ3dnZDJocFkyZ2dhRzlzWkhNZ2JHbHVaUzlqYjJ4MWJXNGdaR0YwWVM0Z1ZHOGdZV3h6YnlCaFpHUWdZVnh1SUNBdkx5QmJjMlZ0YVMxemRHRnVaR0Z5WkdsNlpXUmRXM0poYm1kbFhTQmdjbUZ1WjJWZ0lIQnliM0JsY25SNUlHaHZiR1JwYm1jZ1lTQmdXM04wWVhKMExGeHVJQ0F2THlCbGJtUmRZQ0JoY25KaGVTQjNhWFJvSUhSb1pTQnpZVzFsSUc1MWJXSmxjbk1zSUhObGRDQjBhR1VnWUhKaGJtZGxjMkFnYjNCMGFXOXVJSFJ2WEc0Z0lDOHZJR0IwY25WbFlDNWNiaUFnTHk5Y2JpQWdMeThnVzNKaGJtZGxYVG9nYUhSMGNITTZMeTlpZFdkNmFXeHNZUzV0YjNwcGJHeGhMbTl5Wnk5emFHOTNYMkoxWnk1aloyay9hV1E5TnpRMU5qYzRYRzRnSUhKaGJtZGxjem9nWm1Gc2MyVXNYRzRnSUM4dklFbDBJR2x6SUhCdmMzTnBZbXhsSUhSdklIQmhjbk5sSUcxMWJIUnBjR3hsSUdacGJHVnpJR2x1ZEc4Z1lTQnphVzVuYkdVZ1FWTlVJR0o1WEc0Z0lDOHZJSEJoYzNOcGJtY2dkR2hsSUhSeVpXVWdjSEp2WkhWalpXUWdZbmtnY0dGeWMybHVaeUIwYUdVZ1ptbHljM1FnWm1sc1pTQmhjMXh1SUNBdkx5QmdjSEp2WjNKaGJXQWdiM0IwYVc5dUlHbHVJSE4xWW5ObGNYVmxiblFnY0dGeWMyVnpMaUJVYUdseklIZHBiR3dnWVdSa0lIUm9aVnh1SUNBdkx5QjBiM0JzWlhabGJDQm1iM0p0Y3lCdlppQjBhR1VnY0dGeWMyVmtJR1pwYkdVZ2RHOGdkR2hsSUdCUWNtOW5jbUZ0WUNBb2RHOXdLU0J1YjJSbFhHNGdJQzh2SUc5bUlHRnVJR1Y0YVhOMGFXNW5JSEJoY25ObElIUnlaV1V1WEc0Z0lIQnliMmR5WVcwNklHNTFiR3dzWEc0Z0lDOHZJRmRvWlc0Z1lHeHZZMkYwYVc5dWMyQWdhWE1nYjI0c0lIbHZkU0JqWVc0Z2NHRnpjeUIwYUdseklIUnZJSEpsWTI5eVpDQjBhR1VnYzI5MWNtTmxYRzRnSUM4dklHWnBiR1VnYVc0Z1pYWmxjbmtnYm05a1pTZHpJR0JzYjJOZ0lHOWlhbVZqZEM1Y2JpQWdjMjkxY21ObFJtbHNaVG9nYm5Wc2JDeGNiaUFnTHk4Z1ZHaHBjeUIyWVd4MVpTd2dhV1lnWjJsMlpXNHNJR2x6SUhOMGIzSmxaQ0JwYmlCbGRtVnllU0J1YjJSbExDQjNhR1YwYUdWeVhHNGdJQzh2SUdCc2IyTmhkR2x2Ym5OZ0lHbHpJRzl1SUc5eUlHOW1aaTVjYmlBZ1pHbHlaV04wVTI5MWNtTmxSbWxzWlRvZ2JuVnNiQ3hjYmlBZ0x5OGdWMmhsYmlCbGJtRmliR1ZrTENCd1lYSmxiblJvWlhOcGVtVmtJR1Y0Y0hKbGMzTnBiMjV6SUdGeVpTQnlaWEJ5WlhObGJuUmxaQ0JpZVZ4dUlDQXZMeUFvYm05dUxYTjBZVzVrWVhKa0tTQlFZWEpsYm5Sb1pYTnBlbVZrUlhod2NtVnpjMmx2YmlCdWIyUmxjMXh1SUNCd2NtVnpaWEoyWlZCaGNtVnVjem9nWm1Gc2MyVXNYRzRnSUhCc2RXZHBibk02SUh0OVhHNTlPMXh1WEc1bGVIQnZjblJ6TG1SbFptRjFiSFJQY0hScGIyNXpJRDBnWkdWbVlYVnNkRTl3ZEdsdmJuTTdYRzR2THlCSmJuUmxjbkJ5WlhRZ1lXNWtJR1JsWm1GMWJIUWdZVzRnYjNCMGFXOXVjeUJ2WW1wbFkzUmNibHh1Wm5WdVkzUnBiMjRnWjJWMFQzQjBhVzl1Y3lodmNIUnpLU0I3WEc0Z0lIWmhjaUJ2Y0hScGIyNXpJRDBnZTMwN1hHNGdJR1p2Y2lBb2RtRnlJRzl3ZENCcGJpQmtaV1poZFd4MFQzQjBhVzl1Y3lrZ2UxeHVJQ0FnSUc5d2RHbHZibk5iYjNCMFhTQTlJRzl3ZEhNZ0ppWWdYM1YwYVd3dWFHRnpLRzl3ZEhNc0lHOXdkQ2tnUHlCdmNIUnpXMjl3ZEYwZ09pQmtaV1poZFd4MFQzQjBhVzl1YzF0dmNIUmRPMXh1SUNCOWFXWWdLRzl3ZEdsdmJuTXVZV3hzYjNkU1pYTmxjblpsWkNBOVBTQnVkV3hzS1NCdmNIUnBiMjV6TG1Gc2JHOTNVbVZ6WlhKMlpXUWdQU0J2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUR3Z05UdGNibHh1SUNCcFppQW9YM1YwYVd3dWFYTkJjbkpoZVNodmNIUnBiMjV6TG05dVZHOXJaVzRwS1NCN1hHNGdJQ0FnS0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lIWmhjaUIwYjJ0bGJuTWdQU0J2Y0hScGIyNXpMbTl1Vkc5clpXNDdYRzRnSUNBZ0lDQnZjSFJwYjI1ekxtOXVWRzlyWlc0Z1BTQm1kVzVqZEdsdmJpQW9kRzlyWlc0cElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUnZhMlZ1Y3k1d2RYTm9LSFJ2YTJWdUtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZTa29LVHRjYmlBZ2ZWeHVJQ0JwWmlBb1gzVjBhV3d1YVhOQmNuSmhlU2h2Y0hScGIyNXpMbTl1UTI5dGJXVnVkQ2twSUc5d2RHbHZibk11YjI1RGIyMXRaVzUwSUQwZ2NIVnphRU52YlcxbGJuUW9iM0IwYVc5dWN5d2diM0IwYVc5dWN5NXZia052YlcxbGJuUXBPMXh1WEc0Z0lISmxkSFZ5YmlCdmNIUnBiMjV6TzF4dWZWeHVYRzVtZFc1amRHbHZiaUJ3ZFhOb1EyOXRiV1Z1ZENodmNIUnBiMjV6TENCaGNuSmhlU2tnZTF4dUlDQnlaWFIxY200Z1puVnVZM1JwYjI0Z0tHSnNiMk5yTENCMFpYaDBMQ0J6ZEdGeWRDd2daVzVrTENCemRHRnlkRXh2WXl3Z1pXNWtURzlqS1NCN1hHNGdJQ0FnZG1GeUlHTnZiVzFsYm5RZ1BTQjdYRzRnSUNBZ0lDQjBlWEJsT2lCaWJHOWpheUEvSUNkQ2JHOWpheWNnT2lBblRHbHVaU2NzWEc0Z0lDQWdJQ0IyWVd4MVpUb2dkR1Y0ZEN4Y2JpQWdJQ0FnSUhOMFlYSjBPaUJ6ZEdGeWRDeGNiaUFnSUNBZ0lHVnVaRG9nWlc1a1hHNGdJQ0FnZlR0Y2JpQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1c2IyTmhkR2x2Ym5NcElHTnZiVzFsYm5RdWJHOWpJRDBnYm1WM0lGOXNiMk4xZEdsc0xsTnZkWEpqWlV4dlkyRjBhVzl1S0hSb2FYTXNJSE4wWVhKMFRHOWpMQ0JsYm1STWIyTXBPMXh1SUNBZ0lHbG1JQ2h2Y0hScGIyNXpMbkpoYm1kbGN5a2dZMjl0YldWdWRDNXlZVzVuWlNBOUlGdHpkR0Z5ZEN3Z1pXNWtYVHRjYmlBZ0lDQmhjbkpoZVM1d2RYTm9LR052YlcxbGJuUXBPMXh1SUNCOU8xeHVmVnh1WEc1OUxIdGNJaTR2Ykc5amRYUnBiRndpT2pVc1hDSXVMM1YwYVd4Y0lqb3hOWDFkTERrNlcyWjFibU4wYVc5dUtGOWtaWEpsY1Y4c2JXOWtkV3hsTEdWNGNHOXlkSE1wZTF4dVhDSjFjMlVnYzNSeWFXTjBYQ0k3WEc1Y2JuWmhjaUJmZEc5clpXNTBlWEJsSUQwZ1gyUmxjbVZ4WHloY0lpNHZkRzlyWlc1MGVYQmxYQ0lwTzF4dVhHNTJZWElnWDNOMFlYUmxJRDBnWDJSbGNtVnhYeWhjSWk0dmMzUmhkR1ZjSWlrN1hHNWNiblpoY2lCZmQyaHBkR1Z6Y0dGalpTQTlJRjlrWlhKbGNWOG9YQ0l1TDNkb2FYUmxjM0JoWTJWY0lpazdYRzVjYm5aaGNpQndjQ0E5SUY5emRHRjBaUzVRWVhKelpYSXVjSEp2ZEc5MGVYQmxPMXh1WEc0dkx5QWpJeUJRWVhKelpYSWdkWFJwYkdsMGFXVnpYRzVjYmk4dklGUmxjM1FnZDJobGRHaGxjaUJoSUhOMFlYUmxiV1Z1ZENCdWIyUmxJR2x6SUhSb1pTQnpkSEpwYm1jZ2JHbDBaWEpoYkNCZ1hDSjFjMlVnYzNSeWFXTjBYQ0pnTGx4dVhHNXdjQzVwYzFWelpWTjBjbWxqZENBOUlHWjFibU4wYVc5dUlDaHpkRzEwS1NCN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG05d2RHbHZibk11WldOdFlWWmxjbk5wYjI0Z1BqMGdOU0FtSmlCemRHMTBMblI1Y0dVZ1BUMDlJRndpUlhod2NtVnpjMmx2YmxOMFlYUmxiV1Z1ZEZ3aUlDWW1JSE4wYlhRdVpYaHdjbVZ6YzJsdmJpNTBlWEJsSUQwOVBTQmNJa3hwZEdWeVlXeGNJaUFtSmlCemRHMTBMbVY0Y0hKbGMzTnBiMjR1Y21GM0xuTnNhV05sS0RFc0lDMHhLU0E5UFQwZ1hDSjFjMlVnYzNSeWFXTjBYQ0k3WEc1OU8xeHVYRzR2THlCUWNtVmthV05oZEdVZ2RHaGhkQ0IwWlhOMGN5QjNhR1YwYUdWeUlIUm9aU0J1WlhoMElIUnZhMlZ1SUdseklHOW1JSFJvWlNCbmFYWmxibHh1THk4Z2RIbHdaU3dnWVc1a0lHbG1JSGxsY3l3Z1kyOXVjM1Z0WlhNZ2FYUWdZWE1nWVNCemFXUmxJR1ZtWm1WamRDNWNibHh1Y0hBdVpXRjBJRDBnWm5WdVkzUnBiMjRnS0hSNWNHVXBJSHRjYmlBZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ2RIbHdaU2tnZTF4dUlDQWdJSFJvYVhNdWJtVjRkQ2dwTzF4dUlDQWdJSEpsZEhWeWJpQjBjblZsTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnZlZ4dWZUdGNibHh1THk4Z1ZHVnpkSE1nZDJobGRHaGxjaUJ3WVhKelpXUWdkRzlyWlc0Z2FYTWdZU0JqYjI1MFpYaDBkV0ZzSUd0bGVYZHZjbVF1WEc1Y2JuQndMbWx6UTI5dWRHVjRkSFZoYkNBOUlHWjFibU4wYVc5dUlDaHVZVzFsS1NCN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG5SNWNHVWdQVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11Ym1GdFpTQW1KaUIwYUdsekxuWmhiSFZsSUQwOVBTQnVZVzFsTzF4dWZUdGNibHh1THk4Z1EyOXVjM1Z0WlhNZ1kyOXVkR1Y0ZEhWaGJDQnJaWGwzYjNKa0lHbG1JSEJ2YzNOcFlteGxMbHh1WEc1d2NDNWxZWFJEYjI1MFpYaDBkV0ZzSUQwZ1puVnVZM1JwYjI0Z0tHNWhiV1VwSUh0Y2JpQWdjbVYwZFhKdUlIUm9hWE11ZG1Gc2RXVWdQVDA5SUc1aGJXVWdKaVlnZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV1WVcxbEtUdGNibjA3WEc1Y2JpOHZJRUZ6YzJWeWRITWdkR2hoZENCbWIyeHNiM2RwYm1jZ2RHOXJaVzRnYVhNZ1oybDJaVzRnWTI5dWRHVjRkSFZoYkNCclpYbDNiM0prTGx4dVhHNXdjQzVsZUhCbFkzUkRiMjUwWlhoMGRXRnNJRDBnWm5WdVkzUnBiMjRnS0c1aGJXVXBJSHRjYmlBZ2FXWWdLQ0YwYUdsekxtVmhkRU52Ym5SbGVIUjFZV3dvYm1GdFpTa3BJSFJvYVhNdWRXNWxlSEJsWTNSbFpDZ3BPMXh1ZlR0Y2JseHVMeThnVkdWemRDQjNhR1YwYUdWeUlHRWdjMlZ0YVdOdmJHOXVJR05oYmlCaVpTQnBibk5sY25SbFpDQmhkQ0IwYUdVZ1kzVnljbVZ1ZENCd2IzTnBkR2x2Ymk1Y2JseHVjSEF1WTJGdVNXNXpaWEowVTJWdGFXTnZiRzl1SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCeVpYUjFjbTRnZEdocGN5NTBlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtVnZaaUI4ZkNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbkpoWTJWU0lIeDhJRjkzYUdsMFpYTndZV05sTG14cGJtVkNjbVZoYXk1MFpYTjBLSFJvYVhNdWFXNXdkWFF1YzJ4cFkyVW9kR2hwY3k1c1lYTjBWRzlyUlc1a0xDQjBhR2x6TG5OMFlYSjBLU2s3WEc1OU8xeHVYRzV3Y0M1cGJuTmxjblJUWlcxcFkyOXNiMjRnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUdsbUlDaDBhR2x6TG1OaGJrbHVjMlZ5ZEZObGJXbGpiMnh2YmlncEtTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdWIzQjBhVzl1Y3k1dmJrbHVjMlZ5ZEdWa1UyVnRhV052Ykc5dUtTQjBhR2x6TG05d2RHbHZibk11YjI1SmJuTmxjblJsWkZObGJXbGpiMnh2YmloMGFHbHpMbXhoYzNSVWIydEZibVFzSUhSb2FYTXViR0Z6ZEZSdmEwVnVaRXh2WXlrN1hHNGdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJSDFjYm4wN1hHNWNiaTh2SUVOdmJuTjFiV1VnWVNCelpXMXBZMjlzYjI0c0lHOXlMQ0JtWVdsc2FXNW5JSFJvWVhRc0lITmxaU0JwWmlCM1pTQmhjbVVnWVd4c2IzZGxaQ0IwYjF4dUx5OGdjSEpsZEdWdVpDQjBhR0YwSUhSb1pYSmxJR2x6SUdFZ2MyVnRhV052Ykc5dUlHRjBJSFJvYVhNZ2NHOXphWFJwYjI0dVhHNWNibkJ3TG5ObGJXbGpiMnh2YmlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2FXWWdLQ0YwYUdsekxtVmhkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbk5sYldrcElDWW1JQ0YwYUdsekxtbHVjMlZ5ZEZObGJXbGpiMnh2YmlncEtTQjBhR2x6TG5WdVpYaHdaV04wWldRb0tUdGNibjA3WEc1Y2JuQndMbUZtZEdWeVZISmhhV3hwYm1kRGIyMXRZU0E5SUdaMWJtTjBhVzl1SUNoMGIydFVlWEJsS1NCN1hHNGdJR2xtSUNoMGFHbHpMblI1Y0dVZ1BUMGdkRzlyVkhsd1pTa2dlMXh1SUNBZ0lHbG1JQ2gwYUdsekxtOXdkR2x2Ym5NdWIyNVVjbUZwYkdsdVowTnZiVzFoS1NCMGFHbHpMbTl3ZEdsdmJuTXViMjVVY21GcGJHbHVaME52YlcxaEtIUm9hWE11YkdGemRGUnZhMU4wWVhKMExDQjBhR2x6TG14aGMzUlViMnRUZEdGeWRFeHZZeWs3WEc0Z0lDQWdkR2hwY3k1dVpYaDBLQ2s3WEc0Z0lDQWdjbVYwZFhKdUlIUnlkV1U3WEc0Z0lIMWNibjA3WEc1Y2JpOHZJRVY0Y0dWamRDQmhJSFJ2YTJWdUlHOW1JR0VnWjJsMlpXNGdkSGx3WlM0Z1NXWWdabTkxYm1Rc0lHTnZibk4xYldVZ2FYUXNJRzkwYUdWeWQybHpaU3hjYmk4dklISmhhWE5sSUdGdUlIVnVaWGh3WldOMFpXUWdkRzlyWlc0Z1pYSnliM0l1WEc1Y2JuQndMbVY0Y0dWamRDQTlJR1oxYm1OMGFXOXVJQ2gwZVhCbEtTQjdYRzRnSUhSb2FYTXVaV0YwS0hSNWNHVXBJSHg4SUhSb2FYTXVkVzVsZUhCbFkzUmxaQ2dwTzF4dWZUdGNibHh1THk4Z1VtRnBjMlVnWVc0Z2RXNWxlSEJsWTNSbFpDQjBiMnRsYmlCbGNuSnZjaTVjYmx4dWNIQXVkVzVsZUhCbFkzUmxaQ0E5SUdaMWJtTjBhVzl1SUNod2IzTXBJSHRjYmlBZ2RHaHBjeTV5WVdselpTaHdiM01nSVQwZ2JuVnNiQ0EvSUhCdmN5QTZJSFJvYVhNdWMzUmhjblFzSUZ3aVZXNWxlSEJsWTNSbFpDQjBiMnRsYmx3aUtUdGNibjA3WEc1Y2JuQndMbU5vWldOclVHRjBkR1Z5YmtWeWNtOXljeUE5SUdaMWJtTjBhVzl1SUNoeVpXWkVaWE4wY25WamRIVnlhVzVuUlhKeWIzSnpMQ0JoYm1SVWFISnZkeWtnZTF4dUlDQjJZWElnY0c5eklEMGdjbVZtUkdWemRISjFZM1IxY21sdVowVnljbTl5Y3lBbUppQnlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6TG5SeVlXbHNhVzVuUTI5dGJXRTdYRzRnSUdsbUlDZ2hZVzVrVkdoeWIzY3BJSEpsZEhWeWJpQWhJWEJ2Y3p0Y2JpQWdhV1lnS0hCdmN5a2dkR2hwY3k1eVlXbHpaU2h3YjNNc0lGd2lRMjl0YldFZ2FYTWdibTkwSUhCbGNtMXBkSFJsWkNCaFpuUmxjaUIwYUdVZ2NtVnpkQ0JsYkdWdFpXNTBYQ0lwTzF4dWZUdGNibHh1Y0hBdVkyaGxZMnRGZUhCeVpYTnphVzl1UlhKeWIzSnpJRDBnWm5WdVkzUnBiMjRnS0hKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXNJR0Z1WkZSb2NtOTNLU0I3WEc0Z0lIWmhjaUJ3YjNNZ1BTQnlaV1pFWlhOMGNuVmpkSFZ5YVc1blJYSnliM0p6SUNZbUlISmxaa1JsYzNSeWRXTjBkWEpwYm1kRmNuSnZjbk11YzJodmNuUm9ZVzVrUVhOemFXZHVPMXh1SUNCcFppQW9JV0Z1WkZSb2NtOTNLU0J5WlhSMWNtNGdJU0Z3YjNNN1hHNGdJR2xtSUNod2IzTXBJSFJvYVhNdWNtRnBjMlVvY0c5ekxDQmNJbE5vYjNKMGFHRnVaQ0J3Y205d1pYSjBlU0JoYzNOcFoyNXRaVzUwY3lCaGNtVWdkbUZzYVdRZ2IyNXNlU0JwYmlCa1pYTjBjblZqZEhWeWFXNW5JSEJoZEhSbGNtNXpYQ0lwTzF4dWZUdGNibHh1ZlN4N1hDSXVMM04wWVhSbFhDSTZNVEFzWENJdUwzUnZhMlZ1ZEhsd1pWd2lPakUwTEZ3aUxpOTNhR2wwWlhOd1lXTmxYQ0k2TVRaOVhTd3hNRHBiWm5WdVkzUnBiMjRvWDJSbGNtVnhYeXh0YjJSMWJHVXNaWGh3YjNKMGN5bDdYRzVjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1Wlhod2IzSjBjeTVmWDJWelRXOWtkV3hsSUQwZ2RISjFaVHRjYmx4dVpuVnVZM1JwYjI0Z1gyTnNZWE56UTJGc2JFTm9aV05yS0dsdWMzUmhibU5sTENCRGIyNXpkSEoxWTNSdmNpa2dleUJwWmlBb0lTaHBibk4wWVc1alpTQnBibk4wWVc1alpXOW1JRU52Ym5OMGNuVmpkRzl5S1NrZ2V5QjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLRndpUTJGdWJtOTBJR05oYkd3Z1lTQmpiR0Z6Y3lCaGN5QmhJR1oxYm1OMGFXOXVYQ0lwT3lCOUlIMWNibHh1ZG1GeUlGOXBaR1Z1ZEdsbWFXVnlJRDBnWDJSbGNtVnhYeWhjSWk0dmFXUmxiblJwWm1sbGNsd2lLVHRjYmx4dWRtRnlJRjkwYjJ0bGJuUjVjR1VnUFNCZlpHVnlaWEZmS0Z3aUxpOTBiMnRsYm5SNWNHVmNJaWs3WEc1Y2JuWmhjaUJmZDJocGRHVnpjR0ZqWlNBOUlGOWtaWEpsY1Y4b1hDSXVMM2RvYVhSbGMzQmhZMlZjSWlrN1hHNWNiblpoY2lCZmIzQjBhVzl1Y3lBOUlGOWtaWEpsY1Y4b1hDSXVMMjl3ZEdsdmJuTmNJaWs3WEc1Y2JpOHZJRkpsWjJsemRHVnlaV1FnY0d4MVoybHVjMXh1ZG1GeUlIQnNkV2RwYm5NZ1BTQjdmVHRjYmx4dVpYaHdiM0owY3k1d2JIVm5hVzV6SUQwZ2NHeDFaMmx1Y3p0Y2JtWjFibU4wYVc5dUlHdGxlWGR2Y21SU1pXZGxlSEFvZDI5eVpITXBJSHRjYmlBZ2NtVjBkWEp1SUc1bGR5QlNaV2RGZUhBb1hDSmVLRndpSUNzZ2QyOXlaSE11Y21Wd2JHRmpaU2d2SUM5bkxDQmNJbnhjSWlrZ0t5QmNJaWtrWENJcE8xeHVmVnh1WEc1MllYSWdVR0Z5YzJWeUlEMGdLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdablZ1WTNScGIyNGdVR0Z5YzJWeUtHOXdkR2x2Ym5Nc0lHbHVjSFYwTENCemRHRnlkRkJ2Y3lrZ2UxeHVJQ0FnSUY5amJHRnpjME5oYkd4RGFHVmpheWgwYUdsekxDQlFZWEp6WlhJcE8xeHVYRzRnSUNBZ2RHaHBjeTV2Y0hScGIyNXpJRDBnYjNCMGFXOXVjeUE5SUY5dmNIUnBiMjV6TG1kbGRFOXdkR2x2Ym5Nb2IzQjBhVzl1Y3lrN1hHNGdJQ0FnZEdocGN5NXpiM1Z5WTJWR2FXeGxJRDBnYjNCMGFXOXVjeTV6YjNWeVkyVkdhV3hsTzF4dUlDQWdJSFJvYVhNdWEyVjVkMjl5WkhNZ1BTQnJaWGwzYjNKa1VtVm5aWGh3S0Y5cFpHVnVkR2xtYVdWeUxtdGxlWGR2Y21SelcyOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlBL0lEWWdPaUExWFNrN1hHNGdJQ0FnZG1GeUlISmxjMlZ5ZG1Wa0lEMGdiM0IwYVc5dWN5NWhiR3h2ZDFKbGMyVnlkbVZrSUQ4Z1hDSmNJaUE2SUY5cFpHVnVkR2xtYVdWeUxuSmxjMlZ5ZG1Wa1YyOXlaSE5iYjNCMGFXOXVjeTVsWTIxaFZtVnljMmx2YmwwZ0t5QW9iM0IwYVc5dWN5NXpiM1Z5WTJWVWVYQmxJRDA5SUZ3aWJXOWtkV3hsWENJZ1B5QmNJaUJoZDJGcGRGd2lJRG9nWENKY0lpazdYRzRnSUNBZ2RHaHBjeTV5WlhObGNuWmxaRmR2Y21SeklEMGdhMlY1ZDI5eVpGSmxaMlY0Y0NoeVpYTmxjblpsWkNrN1hHNGdJQ0FnZG1GeUlISmxjMlZ5ZG1Wa1UzUnlhV04wSUQwZ0tISmxjMlZ5ZG1Wa0lEOGdjbVZ6WlhKMlpXUWdLeUJjSWlCY0lpQTZJRndpWENJcElDc2dYMmxrWlc1MGFXWnBaWEl1Y21WelpYSjJaV1JYYjNKa2N5NXpkSEpwWTNRN1hHNGdJQ0FnZEdocGN5NXlaWE5sY25abFpGZHZjbVJ6VTNSeWFXTjBJRDBnYTJWNWQyOXlaRkpsWjJWNGNDaHlaWE5sY25abFpGTjBjbWxqZENrN1hHNGdJQ0FnZEdocGN5NXlaWE5sY25abFpGZHZjbVJ6VTNSeWFXTjBRbWx1WkNBOUlHdGxlWGR2Y21SU1pXZGxlSEFvY21WelpYSjJaV1JUZEhKcFkzUWdLeUJjSWlCY0lpQXJJRjlwWkdWdWRHbG1hV1Z5TG5KbGMyVnlkbVZrVjI5eVpITXVjM1J5YVdOMFFtbHVaQ2s3WEc0Z0lDQWdkR2hwY3k1cGJuQjFkQ0E5SUZOMGNtbHVaeWhwYm5CMWRDazdYRzVjYmlBZ0lDQXZMeUJWYzJWa0lIUnZJSE5wWjI1aGJDQjBieUJqWVd4c1pYSnpJRzltSUdCeVpXRmtWMjl5WkRGZ0lIZG9aWFJvWlhJZ2RHaGxJSGR2Y21SY2JpQWdJQ0F2THlCamIyNTBZV2x1WldRZ1lXNTVJR1Z6WTJGd1pTQnpaWEYxWlc1alpYTXVJRlJvYVhNZ2FYTWdibVZsWkdWa0lHSmxZMkYxYzJVZ2QyOXlaSE1nZDJsMGFGeHVJQ0FnSUM4dklHVnpZMkZ3WlNCelpYRjFaVzVqWlhNZ2JYVnpkQ0J1YjNRZ1ltVWdhVzUwWlhKd2NtVjBaV1FnWVhNZ2EyVjVkMjl5WkhNdVhHNGdJQ0FnZEdocGN5NWpiMjUwWVdsdWMwVnpZeUE5SUdaaGJITmxPMXh1WEc0Z0lDQWdMeThnVEc5aFpDQndiSFZuYVc1elhHNGdJQ0FnZEdocGN5NXNiMkZrVUd4MVoybHVjeWh2Y0hScGIyNXpMbkJzZFdkcGJuTXBPMXh1WEc0Z0lDQWdMeThnVTJWMElIVndJSFJ2YTJWdUlITjBZWFJsWEc1Y2JpQWdJQ0F2THlCVWFHVWdZM1Z5Y21WdWRDQndiM05wZEdsdmJpQnZaaUIwYUdVZ2RHOXJaVzVwZW1WeUlHbHVJSFJvWlNCcGJuQjFkQzVjYmlBZ0lDQnBaaUFvYzNSaGNuUlFiM01wSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjRzl6SUQwZ2MzUmhjblJRYjNNN1hHNGdJQ0FnSUNCMGFHbHpMbXhwYm1WVGRHRnlkQ0E5SUUxaGRHZ3ViV0Y0S0RBc0lIUm9hWE11YVc1d2RYUXViR0Z6ZEVsdVpHVjRUMllvWENKY1hHNWNJaXdnYzNSaGNuUlFiM01wS1R0Y2JpQWdJQ0FnSUhSb2FYTXVZM1Z5VEdsdVpTQTlJSFJvYVhNdWFXNXdkWFF1YzJ4cFkyVW9NQ3dnZEdocGN5NXNhVzVsVTNSaGNuUXBMbk53YkdsMEtGOTNhR2wwWlhOd1lXTmxMbXhwYm1WQ2NtVmhheWt1YkdWdVozUm9PMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbkJ2Y3lBOUlIUm9hWE11YkdsdVpWTjBZWEowSUQwZ01EdGNiaUFnSUNBZ0lIUm9hWE11WTNWeVRHbHVaU0E5SURFN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHk4Z1VISnZjR1Z5ZEdsbGN5QnZaaUIwYUdVZ1kzVnljbVZ1ZENCMGIydGxianBjYmlBZ0lDQXZMeUJKZEhNZ2RIbHdaVnh1SUNBZ0lIUm9hWE11ZEhsd1pTQTlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVaVzltTzF4dUlDQWdJQzh2SUVadmNpQjBiMnRsYm5NZ2RHaGhkQ0JwYm1Oc2RXUmxJRzF2Y21VZ2FXNW1iM0p0WVhScGIyNGdkR2hoYmlCMGFHVnBjaUIwZVhCbExDQjBhR1VnZG1Gc2RXVmNiaUFnSUNCMGFHbHpMblpoYkhWbElEMGdiblZzYkR0Y2JpQWdJQ0F2THlCSmRITWdjM1JoY25RZ1lXNWtJR1Z1WkNCdlptWnpaWFJjYmlBZ0lDQjBhR2x6TG5OMFlYSjBJRDBnZEdocGN5NWxibVFnUFNCMGFHbHpMbkJ2Y3p0Y2JpQWdJQ0F2THlCQmJtUXNJR2xtSUd4dlkyRjBhVzl1Y3lCaGNtVWdkWE5sWkN3Z2RHaGxJSHRzYVc1bExDQmpiMngxYlc1OUlHOWlhbVZqZEZ4dUlDQWdJQzh2SUdOdmNuSmxjM0J2Ym1ScGJtY2dkRzhnZEdodmMyVWdiMlptYzJWMGMxeHVJQ0FnSUhSb2FYTXVjM1JoY25STWIyTWdQU0IwYUdsekxtVnVaRXh2WXlBOUlIUm9hWE11WTNWeVVHOXphWFJwYjI0b0tUdGNibHh1SUNBZ0lDOHZJRkJ2YzJsMGFXOXVJR2x1Wm05eWJXRjBhVzl1SUdadmNpQjBhR1VnY0hKbGRtbHZkWE1nZEc5clpXNWNiaUFnSUNCMGFHbHpMbXhoYzNSVWIydEZibVJNYjJNZ1BTQjBhR2x6TG14aGMzUlViMnRUZEdGeWRFeHZZeUE5SUc1MWJHdzdYRzRnSUNBZ2RHaHBjeTVzWVhOMFZHOXJVM1JoY25RZ1BTQjBhR2x6TG14aGMzUlViMnRGYm1RZ1BTQjBhR2x6TG5CdmN6dGNibHh1SUNBZ0lDOHZJRlJvWlNCamIyNTBaWGgwSUhOMFlXTnJJR2x6SUhWelpXUWdkRzhnYzNWd1pYSm1hV05wWVd4c2VTQjBjbUZqYXlCemVXNTBZV04wYVdOY2JpQWdJQ0F2THlCamIyNTBaWGgwSUhSdklIQnlaV1JwWTNRZ2QyaGxkR2hsY2lCaElISmxaM1ZzWVhJZ1pYaHdjbVZ6YzJsdmJpQnBjeUJoYkd4dmQyVmtJR2x1SUdGY2JpQWdJQ0F2THlCbmFYWmxiaUJ3YjNOcGRHbHZiaTVjYmlBZ0lDQjBhR2x6TG1OdmJuUmxlSFFnUFNCMGFHbHpMbWx1YVhScFlXeERiMjUwWlhoMEtDazdYRzRnSUNBZ2RHaHBjeTVsZUhCeVFXeHNiM2RsWkNBOUlIUnlkV1U3WEc1Y2JpQWdJQ0F2THlCR2FXZDFjbVVnYjNWMElHbG1JR2wwSjNNZ1lTQnRiMlIxYkdVZ1kyOWtaUzVjYmlBZ0lDQjBhR2x6TG5OMGNtbGpkQ0E5SUhSb2FYTXVhVzVOYjJSMWJHVWdQU0J2Y0hScGIyNXpMbk52ZFhKalpWUjVjR1VnUFQwOUlGd2liVzlrZFd4bFhDSTdYRzVjYmlBZ0lDQXZMeUJWYzJWa0lIUnZJSE5wWjI1cFpua2dkR2hsSUhOMFlYSjBJRzltSUdFZ2NHOTBaVzUwYVdGc0lHRnljbTkzSUdaMWJtTjBhVzl1WEc0Z0lDQWdkR2hwY3k1d2IzUmxiblJwWVd4QmNuSnZkMEYwSUQwZ0xURTdYRzVjYmlBZ0lDQXZMeUJHYkdGbmN5QjBieUIwY21GamF5QjNhR1YwYUdWeUlIZGxJR0Z5WlNCcGJpQmhJR1oxYm1OMGFXOXVMQ0JoSUdkbGJtVnlZWFJ2Y2k1Y2JpQWdJQ0IwYUdsekxtbHVSblZ1WTNScGIyNGdQU0IwYUdsekxtbHVSMlZ1WlhKaGRHOXlJRDBnWm1Gc2MyVTdYRzRnSUNBZ0x5OGdUR0ZpWld4eklHbHVJSE5qYjNCbExseHVJQ0FnSUhSb2FYTXViR0ZpWld4eklEMGdXMTA3WEc1Y2JpQWdJQ0F2THlCSlppQmxibUZpYkdWa0xDQnphMmx3SUd4bFlXUnBibWNnYUdGemFHSmhibWNnYkdsdVpTNWNiaUFnSUNCcFppQW9kR2hwY3k1d2IzTWdQVDA5SURBZ0ppWWdiM0IwYVc5dWN5NWhiR3h2ZDBoaGMyaENZVzVuSUNZbUlIUm9hWE11YVc1d2RYUXVjMnhwWTJVb01Dd2dNaWtnUFQwOUlDY2pJU2NwSUhSb2FYTXVjMnRwY0V4cGJtVkRiMjF0Wlc1MEtESXBPMXh1SUNCOVhHNWNiaUFnTHk4Z1JFVlFVa1ZEUVZSRlJDQkxaWEIwSUdadmNpQmlZV05yZDJGeVpITWdZMjl0Y0dGMGFXSnBiR2wwZVNCMWJuUnBiQ0F6TGpBZ2FXNGdZMkZ6WlNCaElIQnNkV2RwYmlCMWMyVnpJSFJvWlcxY2JseHVJQ0JRWVhKelpYSXVjSEp2ZEc5MGVYQmxMbWx6UzJWNWQyOXlaQ0E5SUdaMWJtTjBhVzl1SUdselMyVjVkMjl5WkNoM2IzSmtLU0I3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11YTJWNWQyOXlaSE11ZEdWemRDaDNiM0prS1R0Y2JpQWdmVHRjYmx4dUlDQlFZWEp6WlhJdWNISnZkRzkwZVhCbExtbHpVbVZ6WlhKMlpXUlhiM0prSUQwZ1puVnVZM1JwYjI0Z2FYTlNaWE5sY25abFpGZHZjbVFvZDI5eVpDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbkpsYzJWeWRtVmtWMjl5WkhNdWRHVnpkQ2gzYjNKa0tUdGNiaUFnZlR0Y2JseHVJQ0JRWVhKelpYSXVjSEp2ZEc5MGVYQmxMbVY0ZEdWdVpDQTlJR1oxYm1OMGFXOXVJR1Y0ZEdWdVpDaHVZVzFsTENCbUtTQjdYRzRnSUNBZ2RHaHBjMXR1WVcxbFhTQTlJR1lvZEdocGMxdHVZVzFsWFNrN1hHNGdJSDA3WEc1Y2JpQWdVR0Z5YzJWeUxuQnliM1J2ZEhsd1pTNXNiMkZrVUd4MVoybHVjeUE5SUdaMWJtTjBhVzl1SUd4dllXUlFiSFZuYVc1ektIQnNkV2RwYmtOdmJtWnBaM01wSUh0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJmYm1GdFpTQnBiaUJ3YkhWbmFXNURiMjVtYVdkektTQjdYRzRnSUNBZ0lDQjJZWElnY0d4MVoybHVJRDBnY0d4MVoybHVjMXRmYm1GdFpWMDdYRzRnSUNBZ0lDQnBaaUFvSVhCc2RXZHBiaWtnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpVUd4MVoybHVJQ2RjSWlBcklGOXVZVzFsSUNzZ1hDSW5JRzV2ZENCbWIzVnVaRndpS1R0Y2JpQWdJQ0FnSUhCc2RXZHBiaWgwYUdsekxDQndiSFZuYVc1RGIyNW1hV2R6VzE5dVlXMWxYU2s3WEc0Z0lDQWdmVnh1SUNCOU8xeHVYRzRnSUZCaGNuTmxjaTV3Y205MGIzUjVjR1V1Y0dGeWMyVWdQU0JtZFc1amRHbHZiaUJ3WVhKelpTZ3BJSHRjYmlBZ0lDQjJZWElnYm05a1pTQTlJSFJvYVhNdWIzQjBhVzl1Y3k1d2NtOW5jbUZ0SUh4OElIUm9hWE11YzNSaGNuUk9iMlJsS0NrN1hHNGdJQ0FnZEdocGN5NXVaWGgwVkc5clpXNG9LVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WVhKelpWUnZjRXhsZG1Wc0tHNXZaR1VwTzF4dUlDQjlPMXh1WEc0Z0lISmxkSFZ5YmlCUVlYSnpaWEk3WEc1OUtTZ3BPMXh1WEc1bGVIQnZjblJ6TGxCaGNuTmxjaUE5SUZCaGNuTmxjanRjYmx4dWZTeDdYQ0l1TDJsa1pXNTBhV1pwWlhKY0lqb3lMRndpTGk5dmNIUnBiMjV6WENJNk9DeGNJaTR2ZEc5clpXNTBlWEJsWENJNk1UUXNYQ0l1TDNkb2FYUmxjM0JoWTJWY0lqb3hObjFkTERFeE9sdG1kVzVqZEdsdmJpaGZaR1Z5WlhGZkxHMXZaSFZzWlN4bGVIQnZjblJ6S1h0Y2Jsd2lkWE5sSUhOMGNtbGpkRndpTzF4dVhHNTJZWElnWDNSdmEyVnVkSGx3WlNBOUlGOWtaWEpsY1Y4b1hDSXVMM1J2YTJWdWRIbHdaVndpS1R0Y2JseHVkbUZ5SUY5emRHRjBaU0E5SUY5a1pYSmxjVjhvWENJdUwzTjBZWFJsWENJcE8xeHVYRzUyWVhJZ1gzZG9hWFJsYzNCaFkyVWdQU0JmWkdWeVpYRmZLRndpTGk5M2FHbDBaWE53WVdObFhDSXBPMXh1WEc1MllYSWdYMmxrWlc1MGFXWnBaWElnUFNCZlpHVnlaWEZmS0Z3aUxpOXBaR1Z1ZEdsbWFXVnlYQ0lwTzF4dVhHNTJZWElnY0hBZ1BTQmZjM1JoZEdVdVVHRnljMlZ5TG5CeWIzUnZkSGx3WlR0Y2JseHVMeThnSXlNaklGTjBZWFJsYldWdWRDQndZWEp6YVc1blhHNWNiaTh2SUZCaGNuTmxJR0VnY0hKdlozSmhiUzRnU1c1cGRHbGhiR2w2WlhNZ2RHaGxJSEJoY25ObGNpd2djbVZoWkhNZ1lXNTVJRzUxYldKbGNpQnZabHh1THk4Z2MzUmhkR1Z0Wlc1MGN5d2dZVzVrSUhkeVlYQnpJSFJvWlcwZ2FXNGdZU0JRY205bmNtRnRJRzV2WkdVdUlDQlBjSFJwYjI1aGJHeDVJSFJoYTJWeklHRmNiaTh2SUdCd2NtOW5jbUZ0WUNCaGNtZDFiV1Z1ZEM0Z0lFbG1JSEJ5WlhObGJuUXNJSFJvWlNCemRHRjBaVzFsYm5SeklIZHBiR3dnWW1VZ1lYQndaVzVrWldSY2JpOHZJSFJ2SUdsMGN5QmliMlI1SUdsdWMzUmxZV1FnYjJZZ1kzSmxZWFJwYm1jZ1lTQnVaWGNnYm05a1pTNWNibHh1Y0hBdWNHRnljMlZVYjNCTVpYWmxiQ0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc0Z0lIWmhjaUJtYVhKemRDQTlJSFJ5ZFdVN1hHNGdJR2xtSUNnaGJtOWtaUzVpYjJSNUtTQnViMlJsTG1KdlpIa2dQU0JiWFR0Y2JpQWdkMmhwYkdVZ0tIUm9hWE11ZEhsd1pTQWhQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVsYjJZcElIdGNiaUFnSUNCMllYSWdjM1J0ZENBOUlIUm9hWE11Y0dGeWMyVlRkR0YwWlcxbGJuUW9kSEoxWlN3Z2RISjFaU2s3WEc0Z0lDQWdibTlrWlM1aWIyUjVMbkIxYzJnb2MzUnRkQ2s3WEc0Z0lDQWdhV1lnS0dacGNuTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzFWelpWTjBjbWxqZENoemRHMTBLU2tnZEdocGN5NXpaWFJUZEhKcFkzUW9kSEoxWlNrN1hHNGdJQ0FnSUNCbWFYSnpkQ0E5SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQjBhR2x6TG01bGVIUW9LVHRjYmlBZ2FXWWdLSFJvYVhNdWIzQjBhVzl1Y3k1bFkyMWhWbVZ5YzJsdmJpQStQU0EyS1NCN1hHNGdJQ0FnYm05a1pTNXpiM1Z5WTJWVWVYQmxJRDBnZEdocGN5NXZjSFJwYjI1ekxuTnZkWEpqWlZSNWNHVTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNodWIyUmxMQ0JjSWxCeWIyZHlZVzFjSWlrN1hHNTlPMXh1WEc1MllYSWdiRzl2Y0V4aFltVnNJRDBnZXlCcmFXNWtPaUJjSW14dmIzQmNJaUI5TEZ4dUlDQWdJSE4zYVhSamFFeGhZbVZzSUQwZ2V5QnJhVzVrT2lCY0luTjNhWFJqYUZ3aUlIMDdYRzVjYm5Cd0xtbHpUR1YwSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCcFppQW9kR2hwY3k1MGVYQmxJQ0U5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01aGJXVWdmSHdnZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRHdnTmlCOGZDQjBhR2x6TG5aaGJIVmxJQ0U5SUZ3aWJHVjBYQ0lwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnWDNkb2FYUmxjM0JoWTJVdWMydHBjRmRvYVhSbFUzQmhZMlV1YkdGemRFbHVaR1Y0SUQwZ2RHaHBjeTV3YjNNN1hHNGdJSFpoY2lCemEybHdJRDBnWDNkb2FYUmxjM0JoWTJVdWMydHBjRmRvYVhSbFUzQmhZMlV1WlhobFl5aDBhR2x6TG1sdWNIVjBLVHRjYmlBZ2RtRnlJRzVsZUhRZ1BTQjBhR2x6TG5CdmN5QXJJSE5yYVhCYk1GMHViR1Z1WjNSb0xGeHVJQ0FnSUNBZ2JtVjRkRU5vSUQwZ2RHaHBjeTVwYm5CMWRDNWphR0Z5UTI5a1pVRjBLRzVsZUhRcE8xeHVJQ0JwWmlBb2JtVjRkRU5vSUQwOVBTQTVNU0I4ZkNCdVpYaDBRMmdnUFQwZ01USXpLU0J5WlhSMWNtNGdkSEoxWlRzZ0x5OGdKM3NuSUdGdVpDQW5XeWRjYmlBZ2FXWWdLRjlwWkdWdWRHbG1hV1Z5TG1selNXUmxiblJwWm1sbGNsTjBZWEowS0c1bGVIUkRhQ3dnZEhKMVpTa3BJSHRjYmlBZ0lDQm1iM0lnS0haaGNpQndiM01nUFNCdVpYaDBJQ3NnTVRzZ1gybGtaVzUwYVdacFpYSXVhWE5KWkdWdWRHbG1hV1Z5UTJoaGNpaDBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvY0c5ekxDQjBjblZsS1NrN0lDc3JjRzl6S1NCN2ZWeHVJQ0FnSUhaaGNpQnBaR1Z1ZENBOUlIUm9hWE11YVc1d2RYUXVjMnhwWTJVb2JtVjRkQ3dnY0c5ektUdGNiaUFnSUNCcFppQW9JWFJvYVhNdWFYTkxaWGwzYjNKa0tHbGtaVzUwS1NrZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHWmhiSE5sTzF4dWZUdGNibHh1THk4Z1VHRnljMlVnWVNCemFXNW5iR1VnYzNSaGRHVnRaVzUwTGx4dUx5OWNiaTh2SUVsbUlHVjRjR1ZqZEdsdVp5QmhJSE4wWVhSbGJXVnVkQ0JoYm1RZ1ptbHVaR2x1WnlCaElITnNZWE5vSUc5d1pYSmhkRzl5TENCd1lYSnpaU0JoWEc0dkx5QnlaV2QxYkdGeUlHVjRjSEpsYzNOcGIyNGdiR2wwWlhKaGJDNGdWR2hwY3lCcGN5QjBieUJvWVc1a2JHVWdZMkZ6WlhNZ2JHbHJaVnh1THk4Z1lHbG1JQ2htYjI4cElDOWliR0ZvTHk1bGVHVmpLR1p2YnlsZ0xDQjNhR1Z5WlNCc2IyOXJhVzVuSUdGMElIUm9aU0J3Y21WMmFXOTFjeUIwYjJ0bGJseHVMeThnWkc5bGN5QnViM1FnYUdWc2NDNWNibHh1Y0hBdWNHRnljMlZUZEdGMFpXMWxiblFnUFNCbWRXNWpkR2x2YmlBb1pHVmpiR0Z5WVhScGIyNHNJSFJ2Y0V4bGRtVnNLU0I3WEc0Z0lIWmhjaUJ6ZEdGeWRIUjVjR1VnUFNCMGFHbHpMblI1Y0dVc1hHNGdJQ0FnSUNCdWIyUmxJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LU3hjYmlBZ0lDQWdJR3RwYm1RZ1BTQjFibVJsWm1sdVpXUTdYRzVjYmlBZ2FXWWdLSFJvYVhNdWFYTk1aWFFvS1NrZ2UxeHVJQ0FnSUhOMFlYSjBkSGx3WlNBOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgzWmhjanRjYmlBZ0lDQnJhVzVrSUQwZ1hDSnNaWFJjSWp0Y2JpQWdmVnh1WEc0Z0lDOHZJRTF2YzNRZ2RIbHdaWE1nYjJZZ2MzUmhkR1Z0Wlc1MGN5QmhjbVVnY21WamIyZHVhWHBsWkNCaWVTQjBhR1VnYTJWNWQyOXlaQ0IwYUdWNVhHNGdJQzh2SUhOMFlYSjBJSGRwZEdndUlFMWhibmtnWVhKbElIUnlhWFpwWVd3Z2RHOGdjR0Z5YzJVc0lITnZiV1VnY21WeGRXbHlaU0JoSUdKcGRDQnZabHh1SUNBdkx5QmpiMjF3YkdWNGFYUjVMbHh1WEc0Z0lITjNhWFJqYUNBb2MzUmhjblIwZVhCbEtTQjdYRzRnSUNBZ1kyRnpaU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbDlpY21WaGF6cGpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDJOdmJuUnBiblZsT2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNHRnljMlZDY21WaGEwTnZiblJwYm5WbFUzUmhkR1Z0Wlc1MEtHNXZaR1VzSUhOMFlYSjBkSGx3WlM1clpYbDNiM0prS1R0Y2JpQWdJQ0JqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgyUmxZblZuWjJWeU9seHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWRVpXSjFaMmRsY2xOMFlYUmxiV1Z1ZENodWIyUmxLVHRjYmlBZ0lDQmpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDJSdk9seHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWRWIxTjBZWFJsYldWdWRDaHViMlJsS1R0Y2JpQWdJQ0JqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgyWnZjanBjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5CaGNuTmxSbTl5VTNSaGRHVnRaVzUwS0c1dlpHVXBPMXh1SUNBZ0lHTmhjMlVnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVmWm5WdVkzUnBiMjQ2WEc0Z0lDQWdJQ0JwWmlBb0lXUmxZMnhoY21GMGFXOXVJQ1ltSUhSb2FYTXViM0IwYVc5dWN5NWxZMjFoVm1WeWMybHZiaUErUFNBMktTQjBhR2x6TG5WdVpYaHdaV04wWldRb0tUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbkJoY25ObFJuVnVZM1JwYjI1VGRHRjBaVzFsYm5Rb2JtOWtaU2s3WEc0Z0lDQWdZMkZ6WlNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5amJHRnpjenBjYmlBZ0lDQWdJR2xtSUNnaFpHVmpiR0Z5WVhScGIyNHBJSFJvYVhNdWRXNWxlSEJsWTNSbFpDZ3BPMXh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVkRiR0Z6Y3lodWIyUmxMQ0IwY25WbEtUdGNiaUFnSUNCallYTmxJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVYMmxtT2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNHRnljMlZKWmxOMFlYUmxiV1Z1ZENodWIyUmxLVHRjYmlBZ0lDQmpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDNKbGRIVnlianBjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5CaGNuTmxVbVYwZFhKdVUzUmhkR1Z0Wlc1MEtHNXZaR1VwTzF4dUlDQWdJR05oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmMzZHBkR05vT2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNHRnljMlZUZDJsMFkyaFRkR0YwWlcxbGJuUW9ibTlrWlNrN1hHNGdJQ0FnWTJGelpTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOTBhSEp2ZHpwY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuQmhjbk5sVkdoeWIzZFRkR0YwWlcxbGJuUW9ibTlrWlNrN1hHNGdJQ0FnWTJGelpTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOTBjbms2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d1lYSnpaVlJ5ZVZOMFlYUmxiV1Z1ZENodWIyUmxLVHRjYmlBZ0lDQmpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDJOdmJuTjBPbU5oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmRtRnlPbHh1SUNBZ0lDQWdhMmx1WkNBOUlHdHBibVFnZkh3Z2RHaHBjeTUyWVd4MVpUdGNiaUFnSUNBZ0lHbG1JQ2doWkdWamJHRnlZWFJwYjI0Z0ppWWdhMmx1WkNBaFBTQmNJblpoY2x3aUtTQjBhR2x6TG5WdVpYaHdaV04wWldRb0tUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbkJoY25ObFZtRnlVM1JoZEdWdFpXNTBLRzV2WkdVc0lHdHBibVFwTzF4dUlDQWdJR05oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmQyaHBiR1U2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d1lYSnpaVmRvYVd4bFUzUmhkR1Z0Wlc1MEtHNXZaR1VwTzF4dUlDQWdJR05oYzJVZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmQybDBhRHBjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5CaGNuTmxWMmwwYUZOMFlYUmxiV1Z1ZENodWIyUmxLVHRjYmlBZ0lDQmpZWE5sSUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WW5KaFkyVk1PbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVkNiRzlqYXlncE8xeHVJQ0FnSUdOaGMyVWdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXpaVzFwT2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNHRnljMlZGYlhCMGVWTjBZWFJsYldWdWRDaHViMlJsS1R0Y2JpQWdJQ0JqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgyVjRjRzl5ZERwY2JpQWdJQ0JqWVhObElGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgybHRjRzl5ZERwY2JpQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1dmNIUnBiMjV6TG1Gc2JHOTNTVzF3YjNKMFJYaHdiM0owUlhabGNubDNhR1Z5WlNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVhSdmNFeGxkbVZzS1NCMGFHbHpMbkpoYVhObEtIUm9hWE11YzNSaGNuUXNJRndpSjJsdGNHOXlkQ2NnWVc1a0lDZGxlSEJ2Y25RbklHMWhlU0J2Ym14NUlHRndjR1ZoY2lCaGRDQjBhR1VnZEc5d0lHeGxkbVZzWENJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhVzVOYjJSMWJHVXBJSFJvYVhNdWNtRnBjMlVvZEdocGN5NXpkR0Z5ZEN3Z1hDSW5hVzF3YjNKMEp5QmhibVFnSjJWNGNHOXlkQ2NnYldGNUlHRndjR1ZoY2lCdmJteDVJSGRwZEdnZ0ozTnZkWEpqWlZSNWNHVTZJRzF2WkhWc1pTZGNJaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjM1JoY25SMGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5cGJYQnZjblFnUHlCMGFHbHpMbkJoY25ObFNXMXdiM0owS0c1dlpHVXBJRG9nZEdocGN5NXdZWEp6WlVWNGNHOXlkQ2h1YjJSbEtUdGNibHh1SUNBZ0lDOHZJRWxtSUhSb1pTQnpkR0YwWlcxbGJuUWdaRzlsY3lCdWIzUWdjM1JoY25RZ2QybDBhQ0JoSUhOMFlYUmxiV1Z1ZENCclpYbDNiM0prSUc5eUlHRmNiaUFnSUNBdkx5QmljbUZqWlN3Z2FYUW5jeUJoYmlCRmVIQnlaWE56YVc5dVUzUmhkR1Z0Wlc1MElHOXlJRXhoWW1Wc1pXUlRkR0YwWlcxbGJuUXVJRmRsWEc0Z0lDQWdMeThnYzJsdGNHeDVJSE4wWVhKMElIQmhjbk5wYm1jZ1lXNGdaWGh3Y21WemMybHZiaXdnWVc1a0lHRm1kR1Z5ZDJGeVpITXNJR2xtSUhSb1pWeHVJQ0FnSUM4dklHNWxlSFFnZEc5clpXNGdhWE1nWVNCamIyeHZiaUJoYm1RZ2RHaGxJR1Y0Y0hKbGMzTnBiMjRnZDJGeklHRWdjMmx0Y0d4bFhHNGdJQ0FnTHk4Z1NXUmxiblJwWm1sbGNpQnViMlJsTENCM1pTQnpkMmwwWTJnZ2RHOGdhVzUwWlhKd2NtVjBhVzVuSUdsMElHRnpJR0VnYkdGaVpXd3VYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhaaGNpQnRZWGxpWlU1aGJXVWdQU0IwYUdsekxuWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lHVjRjSElnUFNCMGFHbHpMbkJoY25ObFJYaHdjbVZ6YzJsdmJpZ3BPMXh1SUNBZ0lDQWdhV1lnS0hOMFlYSjBkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXVZVzFsSUNZbUlHVjRjSEl1ZEhsd1pTQTlQVDBnWENKSlpHVnVkR2xtYVdWeVhDSWdKaVlnZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVqYjJ4dmJpa3BJSEpsZEhWeWJpQjBhR2x6TG5CaGNuTmxUR0ZpWld4bFpGTjBZWFJsYldWdWRDaHViMlJsTENCdFlYbGlaVTVoYldVc0lHVjRjSElwTzJWc2MyVWdjbVYwZFhKdUlIUm9hWE11Y0dGeWMyVkZlSEJ5WlhOemFXOXVVM1JoZEdWdFpXNTBLRzV2WkdVc0lHVjRjSElwTzF4dUlDQjlYRzU5TzF4dVhHNXdjQzV3WVhKelpVSnlaV0ZyUTI5dWRHbHVkV1ZUZEdGMFpXMWxiblFnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU3dnYTJWNWQyOXlaQ2tnZTF4dUlDQjJZWElnYVhOQ2NtVmhheUE5SUd0bGVYZHZjbVFnUFQwZ1hDSmljbVZoYTF3aU8xeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdhV1lnS0hSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11YzJWdGFTa2dmSHdnZEdocGN5NXBibk5sY25SVFpXMXBZMjlzYjI0b0tTa2dibTlrWlM1c1lXSmxiQ0E5SUc1MWJHdzdaV3h6WlNCcFppQW9kR2hwY3k1MGVYQmxJQ0U5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG01aGJXVXBJSFJvYVhNdWRXNWxlSEJsWTNSbFpDZ3BPMlZzYzJVZ2UxeHVJQ0FnSUc1dlpHVXViR0ZpWld3Z1BTQjBhR2x6TG5CaGNuTmxTV1JsYm5Rb0tUdGNiaUFnSUNCMGFHbHpMbk5sYldsamIyeHZiaWdwTzF4dUlDQjlYRzVjYmlBZ0x5OGdWbVZ5YVdaNUlIUm9ZWFFnZEdobGNtVWdhWE1nWVc0Z1lXTjBkV0ZzSUdSbGMzUnBibUYwYVc5dUlIUnZJR0p5WldGcklHOXlYRzRnSUM4dklHTnZiblJwYm5WbElIUnZMbHh1SUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElIUm9hWE11YkdGaVpXeHpMbXhsYm1kMGFEc2dLeXRwS1NCN1hHNGdJQ0FnZG1GeUlHeGhZaUE5SUhSb2FYTXViR0ZpWld4elcybGRPMXh1SUNBZ0lHbG1JQ2h1YjJSbExteGhZbVZzSUQwOUlHNTFiR3dnZkh3Z2JHRmlMbTVoYldVZ1BUMDlJRzV2WkdVdWJHRmlaV3d1Ym1GdFpTa2dlMXh1SUNBZ0lDQWdhV1lnS0d4aFlpNXJhVzVrSUNFOUlHNTFiR3dnSmlZZ0tHbHpRbkpsWVdzZ2ZId2diR0ZpTG10cGJtUWdQVDA5SUZ3aWJHOXZjRndpS1NrZ1luSmxZV3M3WEc0Z0lDQWdJQ0JwWmlBb2JtOWtaUzVzWVdKbGJDQW1KaUJwYzBKeVpXRnJLU0JpY21WaGF6dGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2FXWWdLR2tnUFQwOUlIUm9hWE11YkdGaVpXeHpMbXhsYm1kMGFDa2dkR2hwY3k1eVlXbHpaU2h1YjJSbExuTjBZWEowTENCY0lsVnVjM2x1ZEdGamRHbGpJRndpSUNzZ2EyVjVkMjl5WkNrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTV2WkdVb2JtOWtaU3dnYVhOQ2NtVmhheUEvSUZ3aVFuSmxZV3RUZEdGMFpXMWxiblJjSWlBNklGd2lRMjl1ZEdsdWRXVlRkR0YwWlcxbGJuUmNJaWs3WEc1OU8xeHVYRzV3Y0M1d1lYSnpaVVJsWW5WbloyVnlVM1JoZEdWdFpXNTBJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXBJSHRjYmlBZ2RHaHBjeTV1WlhoMEtDazdYRzRnSUhSb2FYTXVjMlZ0YVdOdmJHOXVLQ2s3WEc0Z0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pFWldKMVoyZGxjbE4wWVhSbGJXVnVkRndpS1R0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sUkc5VGRHRjBaVzFsYm5RZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdkR2hwY3k1c1lXSmxiSE11Y0hWemFDaHNiMjl3VEdGaVpXd3BPMXh1SUNCdWIyUmxMbUp2WkhrZ1BTQjBhR2x6TG5CaGNuTmxVM1JoZEdWdFpXNTBLR1poYkhObEtUdGNiaUFnZEdocGN5NXNZV0psYkhNdWNHOXdLQ2s3WEc0Z0lIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVYM2RvYVd4bEtUdGNiaUFnYm05a1pTNTBaWE4wSUQwZ2RHaHBjeTV3WVhKelpWQmhjbVZ1Ulhod2NtVnpjMmx2YmlncE8xeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUQ0OUlEWXBJSFJvYVhNdVpXRjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjMlZ0YVNrN1pXeHpaU0IwYUdsekxuTmxiV2xqYjJ4dmJpZ3BPMXh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoT2IyUmxLRzV2WkdVc0lGd2lSRzlYYUdsc1pWTjBZWFJsYldWdWRGd2lLVHRjYm4wN1hHNWNiaTh2SUVScGMyRnRZbWxuZFdGMGFXNW5JR0psZEhkbFpXNGdZU0JnWm05eVlDQmhibVFnWVNCZ1ptOXlZQzlnYVc1Z0lHOXlJR0JtYjNKZ0wyQnZabUJjYmk4dklHeHZiM0FnYVhNZ2JtOXVMWFJ5YVhacFlXd3VJRUpoYzJsallXeHNlU3dnZDJVZ2FHRjJaU0IwYnlCd1lYSnpaU0IwYUdVZ2FXNXBkQ0JnZG1GeVlGeHVMeThnYzNSaGRHVnRaVzUwSUc5eUlHVjRjSEpsYzNOcGIyNHNJR1JwYzJGc2JHOTNhVzVuSUhSb1pTQmdhVzVnSUc5d1pYSmhkRzl5SUNoelpXVmNiaTh2SUhSb1pTQnpaV052Ym1RZ2NHRnlZVzFsZEdWeUlIUnZJR0J3WVhKelpVVjRjSEpsYzNOcGIyNWdLU3dnWVc1a0lIUm9aVzRnWTJobFkydGNiaTh2SUhkb1pYUm9aWElnZEdobElHNWxlSFFnZEc5clpXNGdhWE1nWUdsdVlDQnZjaUJnYjJaZ0xpQlhhR1Z1SUhSb1pYSmxJR2x6SUc1dklHbHVhWFJjYmk4dklIQmhjblFnS0hObGJXbGpiMnh2YmlCcGJXMWxaR2xoZEdWc2VTQmhablJsY2lCMGFHVWdiM0JsYm1sdVp5QndZWEpsYm5Sb1pYTnBjeWtzSUdsMFhHNHZMeUJwY3lCaElISmxaM1ZzWVhJZ1lHWnZjbUFnYkc5dmNDNWNibHh1Y0hBdWNHRnljMlZHYjNKVGRHRjBaVzFsYm5RZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdkR2hwY3k1c1lXSmxiSE11Y0hWemFDaHNiMjl3VEdGaVpXd3BPMXh1SUNCMGFHbHpMbVY0Y0dWamRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxuQmhjbVZ1VENrN1hHNGdJR2xtSUNoMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjMlZ0YVNrZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWR2IzSW9ibTlrWlN3Z2JuVnNiQ2s3WEc0Z0lIWmhjaUJwYzB4bGRDQTlJSFJvYVhNdWFYTk1aWFFvS1R0Y2JpQWdhV1lnS0hSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZkbUZ5SUh4OElIUm9hWE11ZEhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVmWTI5dWMzUWdmSHdnYVhOTVpYUXBJSHRjYmlBZ0lDQjJZWElnWDJsdWFYUWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BMRnh1SUNBZ0lDQWdJQ0JyYVc1a0lEMGdhWE5NWlhRZ1B5QmNJbXhsZEZ3aUlEb2dkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQjBhR2x6TG01bGVIUW9LVHRjYmlBZ0lDQjBhR2x6TG5CaGNuTmxWbUZ5S0Y5cGJtbDBMQ0IwY25WbExDQnJhVzVrS1R0Y2JpQWdJQ0IwYUdsekxtWnBibWx6YUU1dlpHVW9YMmx1YVhRc0lGd2lWbUZ5YVdGaWJHVkVaV05zWVhKaGRHbHZibHdpS1R0Y2JpQWdJQ0JwWmlBb0tIUm9hWE11ZEhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVmYVc0Z2ZId2dkR2hwY3k1dmNIUnBiMjV6TG1WamJXRldaWEp6YVc5dUlENDlJRFlnSmlZZ2RHaHBjeTVwYzBOdmJuUmxlSFIxWVd3b1hDSnZabHdpS1NrZ0ppWWdYMmx1YVhRdVpHVmpiR0Z5WVhScGIyNXpMbXhsYm1kMGFDQTlQVDBnTVNBbUppQWhLR3RwYm1RZ0lUMDlJRndpZG1GeVhDSWdKaVlnWDJsdWFYUXVaR1ZqYkdGeVlYUnBiMjV6V3pCZExtbHVhWFFwS1NCeVpYUjFjbTRnZEdocGN5NXdZWEp6WlVadmNrbHVLRzV2WkdVc0lGOXBibWwwS1R0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d1lYSnpaVVp2Y2lodWIyUmxMQ0JmYVc1cGRDazdYRzRnSUgxY2JpQWdkbUZ5SUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTWdQU0I3SUhOb2IzSjBhR0Z1WkVGemMybG5iam9nTUN3Z2RISmhhV3hwYm1kRGIyMXRZVG9nTUNCOU8xeHVJQ0IyWVhJZ2FXNXBkQ0E5SUhSb2FYTXVjR0Z5YzJWRmVIQnlaWE56YVc5dUtIUnlkV1VzSUhKbFprUmxjM1J5ZFdOMGRYSnBibWRGY25KdmNuTXBPMXh1SUNCcFppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5cGJpQjhmQ0IwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlBbUppQjBhR2x6TG1selEyOXVkR1Y0ZEhWaGJDaGNJbTltWENJcEtTQjdYRzRnSUNBZ2RHaHBjeTVqYUdWamExQmhkSFJsY201RmNuSnZjbk1vY21WbVJHVnpkSEoxWTNSMWNtbHVaMFZ5Y205eWN5d2dkSEoxWlNrN1hHNGdJQ0FnZEdocGN5NTBiMEZ6YzJsbmJtRmliR1VvYVc1cGRDazdYRzRnSUNBZ2RHaHBjeTVqYUdWamEweFdZV3dvYVc1cGRDazdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWR2IzSkpiaWh1YjJSbExDQnBibWwwS1R0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCMGFHbHpMbU5vWldOclJYaHdjbVZ6YzJsdmJrVnljbTl5Y3loeVpXWkVaWE4wY25WamRIVnlhVzVuUlhKeWIzSnpMQ0IwY25WbEtUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2RHaHBjeTV3WVhKelpVWnZjaWh1YjJSbExDQnBibWwwS1R0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sUm5WdVkzUnBiMjVUZEdGMFpXMWxiblFnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dUlDQjBhR2x6TG01bGVIUW9LVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVjR0Z5YzJWR2RXNWpkR2x2YmlodWIyUmxMQ0IwY25WbEtUdGNibjA3WEc1Y2JuQndMbkJoY25ObFNXWlRkR0YwWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNTBaWE4wSUQwZ2RHaHBjeTV3WVhKelpWQmhjbVZ1Ulhod2NtVnpjMmx2YmlncE8xeHVJQ0J1YjJSbExtTnZibk5sY1hWbGJuUWdQU0IwYUdsekxuQmhjbk5sVTNSaGRHVnRaVzUwS0daaGJITmxLVHRjYmlBZ2JtOWtaUzVoYkhSbGNtNWhkR1VnUFNCMGFHbHpMbVZoZENoZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5bGJITmxLU0EvSUhSb2FYTXVjR0Z5YzJWVGRHRjBaVzFsYm5Rb1ptRnNjMlVwSURvZ2JuVnNiRHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJa2xtVTNSaGRHVnRaVzUwWENJcE8xeHVmVHRjYmx4dWNIQXVjR0Z5YzJWU1pYUjFjbTVUZEdGMFpXMWxiblFnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dUlDQnBaaUFvSVhSb2FYTXVhVzVHZFc1amRHbHZiaUFtSmlBaGRHaHBjeTV2Y0hScGIyNXpMbUZzYkc5M1VtVjBkWEp1VDNWMGMybGtaVVoxYm1OMGFXOXVLU0IwYUdsekxuSmhhWE5sS0hSb2FYTXVjM1JoY25Rc0lGd2lKM0psZEhWeWJpY2diM1YwYzJsa1pTQnZaaUJtZFc1amRHbHZibHdpS1R0Y2JpQWdkR2hwY3k1dVpYaDBLQ2s3WEc1Y2JpQWdMeThnU1c0Z1lISmxkSFZ5Ym1BZ0tHRnVaQ0JnWW5KbFlXdGdMMkJqYjI1MGFXNTFaV0FwTENCMGFHVWdhMlY1ZDI5eVpITWdkMmwwYUZ4dUlDQXZMeUJ2Y0hScGIyNWhiQ0JoY21kMWJXVnVkSE1zSUhkbElHVmhaMlZ5YkhrZ2JHOXZheUJtYjNJZ1lTQnpaVzFwWTI5c2IyNGdiM0lnZEdobFhHNGdJQzh2SUhCdmMzTnBZbWxzYVhSNUlIUnZJR2x1YzJWeWRDQnZibVV1WEc1Y2JpQWdhV1lnS0hSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11YzJWdGFTa2dmSHdnZEdocGN5NXBibk5sY25SVFpXMXBZMjlzYjI0b0tTa2dibTlrWlM1aGNtZDFiV1Z1ZENBOUlHNTFiR3c3Wld4elpTQjdYRzRnSUNBZ2JtOWtaUzVoY21kMWJXVnVkQ0E5SUhSb2FYTXVjR0Z5YzJWRmVIQnlaWE56YVc5dUtDazdkR2hwY3k1elpXMXBZMjlzYjI0b0tUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpVW1WMGRYSnVVM1JoZEdWdFpXNTBYQ0lwTzF4dWZUdGNibHh1Y0hBdWNHRnljMlZUZDJsMFkyaFRkR0YwWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNWthWE5qY21sdGFXNWhiblFnUFNCMGFHbHpMbkJoY25ObFVHRnlaVzVGZUhCeVpYTnphVzl1S0NrN1hHNGdJRzV2WkdVdVkyRnpaWE1nUFNCYlhUdGNiaUFnZEdocGN5NWxlSEJsWTNRb1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aWNtRmpaVXdwTzF4dUlDQjBhR2x6TG14aFltVnNjeTV3ZFhOb0tITjNhWFJqYUV4aFltVnNLVHRjYmx4dUlDQXZMeUJUZEdGMFpXMWxiblJ6SUhWdVpHVnlJRzExYzNRZ1ltVWdaM0p2ZFhCbFpDQW9ZbmtnYkdGaVpXd3BJR2x1SUZOM2FYUmphRU5oYzJWY2JpQWdMeThnYm05a1pYTXVJR0JqZFhKZ0lHbHpJSFZ6WldRZ2RHOGdhMlZsY0NCMGFHVWdibTlrWlNCMGFHRjBJSGRsSUdGeVpTQmpkWEp5Wlc1MGJIbGNiaUFnTHk4Z1lXUmthVzVuSUhOMFlYUmxiV1Z1ZEhNZ2RHOHVYRzVjYmlBZ1ptOXlJQ2gyWVhJZ1kzVnlMQ0J6WVhkRVpXWmhkV3gwSUQwZ1ptRnNjMlU3SUhSb2FYTXVkSGx3WlNBaFBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05sVWpzcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5allYTmxJSHg4SUhSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZaR1ZtWVhWc2RDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdselEyRnpaU0E5SUhSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZZMkZ6WlR0Y2JpQWdJQ0FnSUdsbUlDaGpkWElwSUhSb2FYTXVabWx1YVhOb1RtOWtaU2hqZFhJc0lGd2lVM2RwZEdOb1EyRnpaVndpS1R0Y2JpQWdJQ0FnSUc1dlpHVXVZMkZ6WlhNdWNIVnphQ2hqZFhJZ1BTQjBhR2x6TG5OMFlYSjBUbTlrWlNncEtUdGNiaUFnSUNBZ0lHTjFjaTVqYjI1elpYRjFaVzUwSUQwZ1cxMDdYRzRnSUNBZ0lDQjBhR2x6TG01bGVIUW9LVHRjYmlBZ0lDQWdJR2xtSUNocGMwTmhjMlVwSUh0Y2JpQWdJQ0FnSUNBZ1kzVnlMblJsYzNRZ1BTQjBhR2x6TG5CaGNuTmxSWGh3Y21WemMybHZiaWdwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tITmhkMFJsWm1GMWJIUXBJSFJvYVhNdWNtRnBjMlZTWldOdmRtVnlZV0pzWlNoMGFHbHpMbXhoYzNSVWIydFRkR0Z5ZEN3Z1hDSk5kV3gwYVhCc1pTQmtaV1poZFd4MElHTnNZWFZ6WlhOY0lpazdYRzRnSUNBZ0lDQWdJSE5oZDBSbFptRjFiSFFnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0JqZFhJdWRHVnpkQ0E5SUc1MWJHdzdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQjBhR2x6TG1WNGNHVmpkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52Ykc5dUtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYVdZZ0tDRmpkWElwSUhSb2FYTXVkVzVsZUhCbFkzUmxaQ2dwTzF4dUlDQWdJQ0FnWTNWeUxtTnZibk5sY1hWbGJuUXVjSFZ6YUNoMGFHbHpMbkJoY25ObFUzUmhkR1Z0Wlc1MEtIUnlkV1VwS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnYVdZZ0tHTjFjaWtnZEdocGN5NW1hVzVwYzJoT2IyUmxLR04xY2l3Z1hDSlRkMmwwWTJoRFlYTmxYQ0lwTzF4dUlDQjBhR2x6TG01bGVIUW9LVHNnTHk4Z1EyeHZjMmx1WnlCaWNtRmpaVnh1SUNCMGFHbHpMbXhoWW1Wc2N5NXdiM0FvS1R0Y2JpQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNodWIyUmxMQ0JjSWxOM2FYUmphRk4wWVhSbGJXVnVkRndpS1R0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sVkdoeWIzZFRkR0YwWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYVdZZ0tGOTNhR2wwWlhOd1lXTmxMbXhwYm1WQ2NtVmhheTUwWlhOMEtIUm9hWE11YVc1d2RYUXVjMnhwWTJVb2RHaHBjeTVzWVhOMFZHOXJSVzVrTENCMGFHbHpMbk4wWVhKMEtTa3BJSFJvYVhNdWNtRnBjMlVvZEdocGN5NXNZWE4wVkc5clJXNWtMQ0JjSWtsc2JHVm5ZV3dnYm1WM2JHbHVaU0JoWm5SbGNpQjBhSEp2ZDF3aUtUdGNiaUFnYm05a1pTNWhjbWQxYldWdWRDQTlJSFJvYVhNdWNHRnljMlZGZUhCeVpYTnphVzl1S0NrN1hHNGdJSFJvYVhNdWMyVnRhV052Ykc5dUtDazdYRzRnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUU1dlpHVW9ibTlrWlN3Z1hDSlVhSEp2ZDFOMFlYUmxiV1Z1ZEZ3aUtUdGNibjA3WEc1Y2JpOHZJRkpsZFhObFpDQmxiWEIwZVNCaGNuSmhlU0JoWkdSbFpDQm1iM0lnYm05a1pTQm1hV1ZzWkhNZ2RHaGhkQ0JoY21VZ1lXeDNZWGx6SUdWdGNIUjVMbHh1WEc1MllYSWdaVzF3ZEhrZ1BTQmJYVHRjYmx4dWNIQXVjR0Z5YzJWVWNubFRkR0YwWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNWliRzlqYXlBOUlIUm9hWE11Y0dGeWMyVkNiRzlqYXlncE8xeHVJQ0J1YjJSbExtaGhibVJzWlhJZ1BTQnVkV3hzTzF4dUlDQnBaaUFvZEdocGN5NTBlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOWpZWFJqYUNrZ2UxeHVJQ0FnSUhaaGNpQmpiR0YxYzJVZ1BTQjBhR2x6TG5OMFlYSjBUbTlrWlNncE8xeHVJQ0FnSUhSb2FYTXVibVY0ZENncE8xeHVJQ0FnSUhSb2FYTXVaWGh3WldOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNHRnlaVzVNS1R0Y2JpQWdJQ0JqYkdGMWMyVXVjR0Z5WVcwZ1BTQjBhR2x6TG5CaGNuTmxRbWx1WkdsdVowRjBiMjBvS1R0Y2JpQWdJQ0IwYUdsekxtTm9aV05yVEZaaGJDaGpiR0YxYzJVdWNHRnlZVzBzSUhSeWRXVXBPMXh1SUNBZ0lIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjR0Z5Wlc1U0tUdGNiaUFnSUNCamJHRjFjMlV1WW05a2VTQTlJSFJvYVhNdWNHRnljMlZDYkc5amF5Z3BPMXh1SUNBZ0lHNXZaR1V1YUdGdVpHeGxjaUE5SUhSb2FYTXVabWx1YVhOb1RtOWtaU2hqYkdGMWMyVXNJRndpUTJGMFkyaERiR0YxYzJWY0lpazdYRzRnSUgxY2JpQWdibTlrWlM1bWFXNWhiR2w2WlhJZ1BTQjBhR2x6TG1WaGRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOW1hVzVoYkd4NUtTQS9JSFJvYVhNdWNHRnljMlZDYkc5amF5Z3BJRG9nYm5Wc2JEdGNiaUFnYVdZZ0tDRnViMlJsTG1oaGJtUnNaWElnSmlZZ0lXNXZaR1V1Wm1sdVlXeHBlbVZ5S1NCMGFHbHpMbkpoYVhObEtHNXZaR1V1YzNSaGNuUXNJRndpVFdsemMybHVaeUJqWVhSamFDQnZjaUJtYVc1aGJHeDVJR05zWVhWelpWd2lLVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJbFJ5ZVZOMFlYUmxiV1Z1ZEZ3aUtUdGNibjA3WEc1Y2JuQndMbkJoY25ObFZtRnlVM1JoZEdWdFpXNTBJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJR3RwYm1RcElIdGNiaUFnZEdocGN5NXVaWGgwS0NrN1hHNGdJSFJvYVhNdWNHRnljMlZXWVhJb2JtOWtaU3dnWm1Gc2MyVXNJR3RwYm1RcE8xeHVJQ0IwYUdsekxuTmxiV2xqYjJ4dmJpZ3BPMXh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoT2IyUmxLRzV2WkdVc0lGd2lWbUZ5YVdGaWJHVkVaV05zWVhKaGRHbHZibHdpS1R0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sVjJocGJHVlRkR0YwWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNTBaWE4wSUQwZ2RHaHBjeTV3WVhKelpWQmhjbVZ1Ulhod2NtVnpjMmx2YmlncE8xeHVJQ0IwYUdsekxteGhZbVZzY3k1d2RYTm9LR3h2YjNCTVlXSmxiQ2s3WEc0Z0lHNXZaR1V1WW05a2VTQTlJSFJvYVhNdWNHRnljMlZUZEdGMFpXMWxiblFvWm1Gc2MyVXBPMXh1SUNCMGFHbHpMbXhoWW1Wc2N5NXdiM0FvS1R0Y2JpQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNodWIyUmxMQ0JjSWxkb2FXeGxVM1JoZEdWdFpXNTBYQ0lwTzF4dWZUdGNibHh1Y0hBdWNHRnljMlZYYVhSb1UzUmhkR1Z0Wlc1MElEMGdablZ1WTNScGIyNGdLRzV2WkdVcElIdGNiaUFnYVdZZ0tIUm9hWE11YzNSeWFXTjBLU0IwYUdsekxuSmhhWE5sS0hSb2FYTXVjM1JoY25Rc0lGd2lKM2RwZEdnbklHbHVJSE4wY21samRDQnRiMlJsWENJcE8xeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdibTlrWlM1dlltcGxZM1FnUFNCMGFHbHpMbkJoY25ObFVHRnlaVzVGZUhCeVpYTnphVzl1S0NrN1hHNGdJRzV2WkdVdVltOWtlU0E5SUhSb2FYTXVjR0Z5YzJWVGRHRjBaVzFsYm5Rb1ptRnNjMlVwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpVjJsMGFGTjBZWFJsYldWdWRGd2lLVHRjYm4wN1hHNWNibkJ3TG5CaGNuTmxSVzF3ZEhsVGRHRjBaVzFsYm5RZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNodWIyUmxMQ0JjSWtWdGNIUjVVM1JoZEdWdFpXNTBYQ0lwTzF4dWZUdGNibHh1Y0hBdWNHRnljMlZNWVdKbGJHVmtVM1JoZEdWdFpXNTBJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJRzFoZVdKbFRtRnRaU3dnWlhod2Npa2dlMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElIUm9hWE11YkdGaVpXeHpMbXhsYm1kMGFEc2dLeXRwS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11YkdGaVpXeHpXMmxkTG01aGJXVWdQVDA5SUcxaGVXSmxUbUZ0WlNrZ2RHaHBjeTV5WVdselpTaGxlSEJ5TG5OMFlYSjBMQ0JjSWt4aFltVnNJQ2RjSWlBcklHMWhlV0psVG1GdFpTQXJJRndpSnlCcGN5QmhiSEpsWVdSNUlHUmxZMnhoY21Wa1hDSXBPMXh1SUNCOWRtRnlJR3RwYm1RZ1BTQjBhR2x6TG5SNWNHVXVhWE5NYjI5d0lEOGdYQ0pzYjI5d1hDSWdPaUIwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgzTjNhWFJqYUNBL0lGd2ljM2RwZEdOb1hDSWdPaUJ1ZFd4c08xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ2RHaHBjeTVzWVdKbGJITXViR1Z1WjNSb0lDMGdNVHNnYVNBK1BTQXdPeUJwTFMwcElIdGNiaUFnSUNCMllYSWdiR0ZpWld3Z1BTQjBhR2x6TG14aFltVnNjMXRwWFR0Y2JpQWdJQ0JwWmlBb2JHRmlaV3d1YzNSaGRHVnRaVzUwVTNSaGNuUWdQVDBnYm05a1pTNXpkR0Z5ZENrZ2UxeHVJQ0FnSUNBZ2JHRmlaV3d1YzNSaGRHVnRaVzUwVTNSaGNuUWdQU0IwYUdsekxuTjBZWEowTzF4dUlDQWdJQ0FnYkdGaVpXd3VhMmx1WkNBOUlHdHBibVE3WEc0Z0lDQWdmU0JsYkhObElHSnlaV0ZyTzF4dUlDQjlYRzRnSUhSb2FYTXViR0ZpWld4ekxuQjFjMmdvZXlCdVlXMWxPaUJ0WVhsaVpVNWhiV1VzSUd0cGJtUTZJR3RwYm1Rc0lITjBZWFJsYldWdWRGTjBZWEowT2lCMGFHbHpMbk4wWVhKMElIMHBPMXh1SUNCdWIyUmxMbUp2WkhrZ1BTQjBhR2x6TG5CaGNuTmxVM1JoZEdWdFpXNTBLSFJ5ZFdVcE8xeHVJQ0IwYUdsekxteGhZbVZzY3k1d2IzQW9LVHRjYmlBZ2JtOWtaUzVzWVdKbGJDQTlJR1Y0Y0hJN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTV2WkdVb2JtOWtaU3dnWENKTVlXSmxiR1ZrVTNSaGRHVnRaVzUwWENJcE8xeHVmVHRjYmx4dWNIQXVjR0Z5YzJWRmVIQnlaWE56YVc5dVUzUmhkR1Z0Wlc1MElEMGdablZ1WTNScGIyNGdLRzV2WkdVc0lHVjRjSElwSUh0Y2JpQWdibTlrWlM1bGVIQnlaWE56YVc5dUlEMGdaWGh3Y2p0Y2JpQWdkR2hwY3k1elpXMXBZMjlzYjI0b0tUdGNiaUFnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVG05a1pTaHViMlJsTENCY0lrVjRjSEpsYzNOcGIyNVRkR0YwWlcxbGJuUmNJaWs3WEc1OU8xeHVYRzR2THlCUVlYSnpaU0JoSUhObGJXbGpiMnh2YmkxbGJtTnNiM05sWkNCaWJHOWpheUJ2WmlCemRHRjBaVzFsYm5SekxDQm9ZVzVrYkdsdVp5QmdYQ0oxYzJWY2JpOHZJSE4wY21samRGd2lZQ0JrWldOc1lYSmhkR2x2Ym5NZ2QyaGxiaUJnWVd4c2IzZFRkSEpwWTNSZ0lHbHpJSFJ5ZFdVZ0tIVnpaV1FnWm05eVhHNHZMeUJtZFc1amRHbHZiaUJpYjJScFpYTXBMbHh1WEc1d2NDNXdZWEp6WlVKc2IyTnJJRDBnWm5WdVkzUnBiMjRnS0dGc2JHOTNVM1J5YVdOMEtTQjdYRzRnSUhaaGNpQnViMlJsSUQwZ2RHaHBjeTV6ZEdGeWRFNXZaR1VvS1N4Y2JpQWdJQ0FnSUdacGNuTjBJRDBnZEhKMVpTeGNiaUFnSUNBZ0lHOXNaRk4wY21samRDQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ2JtOWtaUzVpYjJSNUlEMGdXMTA3WEc0Z0lIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbkpoWTJWTUtUdGNiaUFnZDJocGJHVWdLQ0YwYUdsekxtVmhkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUp5WVdObFVpa3BJSHRjYmlBZ0lDQjJZWElnYzNSdGRDQTlJSFJvYVhNdWNHRnljMlZUZEdGMFpXMWxiblFvZEhKMVpTazdYRzRnSUNBZ2JtOWtaUzVpYjJSNUxuQjFjMmdvYzNSdGRDazdYRzRnSUNBZ2FXWWdLR1pwY25OMElDWW1JR0ZzYkc5M1UzUnlhV04wSUNZbUlIUm9hWE11YVhOVmMyVlRkSEpwWTNRb2MzUnRkQ2twSUh0Y2JpQWdJQ0FnSUc5c1pGTjBjbWxqZENBOUlIUm9hWE11YzNSeWFXTjBPMXh1SUNBZ0lDQWdkR2hwY3k1elpYUlRkSEpwWTNRb2RHaHBjeTV6ZEhKcFkzUWdQU0IwY25WbEtUdGNiaUFnSUNCOVhHNGdJQ0FnWm1seWMzUWdQU0JtWVd4elpUdGNiaUFnZlZ4dUlDQnBaaUFvYjJ4a1UzUnlhV04wSUQwOVBTQm1ZV3h6WlNrZ2RHaHBjeTV6WlhSVGRISnBZM1FvWm1Gc2MyVXBPMXh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoT2IyUmxLRzV2WkdVc0lGd2lRbXh2WTJ0VGRHRjBaVzFsYm5SY0lpazdYRzU5TzF4dVhHNHZMeUJRWVhKelpTQmhJSEpsWjNWc1lYSWdZR1p2Y21BZ2JHOXZjQzRnVkdobElHUnBjMkZ0WW1sbmRXRjBhVzl1SUdOdlpHVWdhVzVjYmk4dklHQndZWEp6WlZOMFlYUmxiV1Z1ZEdBZ2QybHNiQ0JoYkhKbFlXUjVJR2hoZG1VZ2NHRnljMlZrSUhSb1pTQnBibWwwSUhOMFlYUmxiV1Z1ZENCdmNseHVMeThnWlhod2NtVnpjMmx2Ymk1Y2JseHVjSEF1Y0dGeWMyVkdiM0lnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU3dnYVc1cGRDa2dlMXh1SUNCdWIyUmxMbWx1YVhRZ1BTQnBibWwwTzF4dUlDQjBhR2x6TG1WNGNHVmpkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbk5sYldrcE8xeHVJQ0J1YjJSbExuUmxjM1FnUFNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjMlZ0YVNBL0lHNTFiR3dnT2lCMGFHbHpMbkJoY25ObFJYaHdjbVZ6YzJsdmJpZ3BPMXh1SUNCMGFHbHpMbVY0Y0dWamRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxuTmxiV2twTzF4dUlDQnViMlJsTG5Wd1pHRjBaU0E5SUhSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXdZWEpsYmxJZ1B5QnVkV3hzSURvZ2RHaHBjeTV3WVhKelpVVjRjSEpsYzNOcGIyNG9LVHRjYmlBZ2RHaHBjeTVsZUhCbFkzUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXdZWEpsYmxJcE8xeHVJQ0J1YjJSbExtSnZaSGtnUFNCMGFHbHpMbkJoY25ObFUzUmhkR1Z0Wlc1MEtHWmhiSE5sS1R0Y2JpQWdkR2hwY3k1c1lXSmxiSE11Y0c5d0tDazdYRzRnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUU1dlpHVW9ibTlrWlN3Z1hDSkdiM0pUZEdGMFpXMWxiblJjSWlrN1hHNTlPMXh1WEc0dkx5QlFZWEp6WlNCaElHQm1iM0pnTDJCcGJtQWdZVzVrSUdCbWIzSmdMMkJ2Wm1BZ2JHOXZjQ3dnZDJocFkyZ2dZWEpsSUdGc2JXOXpkRnh1THk4Z2MyRnRaU0JtY205dElIQmhjbk5sY2lkeklIQmxjbk53WldOMGFYWmxMbHh1WEc1d2NDNXdZWEp6WlVadmNrbHVJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJR2x1YVhRcElIdGNiaUFnZG1GeUlIUjVjR1VnUFNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVYMmx1SUQ4Z1hDSkdiM0pKYmxOMFlYUmxiV1Z1ZEZ3aUlEb2dYQ0pHYjNKUFpsTjBZWFJsYldWdWRGd2lPMXh1SUNCMGFHbHpMbTVsZUhRb0tUdGNiaUFnYm05a1pTNXNaV1owSUQwZ2FXNXBkRHRjYmlBZ2JtOWtaUzV5YVdkb2RDQTlJSFJvYVhNdWNHRnljMlZGZUhCeVpYTnphVzl1S0NrN1hHNGdJSFJvYVhNdVpYaHdaV04wS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11Y0dGeVpXNVNLVHRjYmlBZ2JtOWtaUzVpYjJSNUlEMGdkR2hwY3k1d1lYSnpaVk4wWVhSbGJXVnVkQ2htWVd4elpTazdYRzRnSUhSb2FYTXViR0ZpWld4ekxuQnZjQ2dwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJSFI1Y0dVcE8xeHVmVHRjYmx4dUx5OGdVR0Z5YzJVZ1lTQnNhWE4wSUc5bUlIWmhjbWxoWW14bElHUmxZMnhoY21GMGFXOXVjeTVjYmx4dWNIQXVjR0Z5YzJWV1lYSWdQU0JtZFc1amRHbHZiaUFvYm05a1pTd2dhWE5HYjNJc0lHdHBibVFwSUh0Y2JpQWdibTlrWlM1a1pXTnNZWEpoZEdsdmJuTWdQU0JiWFR0Y2JpQWdibTlrWlM1cmFXNWtJRDBnYTJsdVpEdGNiaUFnWm05eUlDZzdPeWtnZTF4dUlDQWdJSFpoY2lCa1pXTnNJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ0lDQjBhR2x6TG5CaGNuTmxWbUZ5U1dRb1pHVmpiQ2s3WEc0Z0lDQWdhV1lnS0hSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WlhFcEtTQjdYRzRnSUNBZ0lDQmtaV05zTG1sdWFYUWdQU0IwYUdsekxuQmhjbk5sVFdGNVltVkJjM05wWjI0b2FYTkdiM0lwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYTJsdVpDQTlQVDBnWENKamIyNXpkRndpSUNZbUlDRW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5cGJpQjhmQ0IwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlBbUppQjBhR2x6TG1selEyOXVkR1Y0ZEhWaGJDaGNJbTltWENJcEtTa2dlMXh1SUNBZ0lDQWdkR2hwY3k1MWJtVjRjR1ZqZEdWa0tDazdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV05zTG1sa0xuUjVjR1VnSVQwZ1hDSkpaR1Z1ZEdsbWFXVnlYQ0lnSmlZZ0lTaHBjMFp2Y2lBbUppQW9kR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TGw5cGJpQjhmQ0IwYUdsekxtbHpRMjl1ZEdWNGRIVmhiQ2hjSW05bVhDSXBLU2twSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjbUZwYzJVb2RHaHBjeTVzWVhOMFZHOXJSVzVrTENCY0lrTnZiWEJzWlhnZ1ltbHVaR2x1WnlCd1lYUjBaWEp1Y3lCeVpYRjFhWEpsSUdGdUlHbHVhWFJwWVd4cGVtRjBhVzl1SUhaaGJIVmxYQ0lwTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQmtaV05zTG1sdWFYUWdQU0J1ZFd4c08xeHVJQ0FnSUgxY2JpQWdJQ0J1YjJSbExtUmxZMnhoY21GMGFXOXVjeTV3ZFhOb0tIUm9hWE11Wm1sdWFYTm9UbTlrWlNoa1pXTnNMQ0JjSWxaaGNtbGhZbXhsUkdWamJHRnlZWFJ2Y2x3aUtTazdYRzRnSUNBZ2FXWWdLQ0YwYUdsekxtVmhkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52YlcxaEtTa2dZbkpsWVdzN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUc1dlpHVTdYRzU5TzF4dVhHNXdjQzV3WVhKelpWWmhja2xrSUQwZ1puVnVZM1JwYjI0Z0tHUmxZMndwSUh0Y2JpQWdaR1ZqYkM1cFpDQTlJSFJvYVhNdWNHRnljMlZDYVc1a2FXNW5RWFJ2YlNncE8xeHVJQ0IwYUdsekxtTm9aV05yVEZaaGJDaGtaV05zTG1sa0xDQjBjblZsS1R0Y2JuMDdYRzVjYmk4dklGQmhjbk5sSUdFZ1puVnVZM1JwYjI0Z1pHVmpiR0Z5WVhScGIyNGdiM0lnYkdsMFpYSmhiQ0FvWkdWd1pXNWthVzVuSUc5dUlIUm9aVnh1THk4Z1lHbHpVM1JoZEdWdFpXNTBZQ0J3WVhKaGJXVjBaWElwTGx4dVhHNXdjQzV3WVhKelpVWjFibU4wYVc5dUlEMGdablZ1WTNScGIyNGdLRzV2WkdVc0lHbHpVM1JoZEdWdFpXNTBMQ0JoYkd4dmQwVjRjSEpsYzNOcGIyNUNiMlI1S1NCN1hHNGdJSFJvYVhNdWFXNXBkRVoxYm1OMGFXOXVLRzV2WkdVcE8xeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUQ0OUlEWXBJRzV2WkdVdVoyVnVaWEpoZEc5eUlEMGdkR2hwY3k1bFlYUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXpkR0Z5S1R0Y2JpQWdkbUZ5SUc5c1pFbHVSMlZ1SUQwZ2RHaHBjeTVwYmtkbGJtVnlZWFJ2Y2p0Y2JpQWdkR2hwY3k1cGJrZGxibVZ5WVhSdmNpQTlJRzV2WkdVdVoyVnVaWEpoZEc5eU8xeHVJQ0JwWmlBb2FYTlRkR0YwWlcxbGJuUWdmSHdnZEdocGN5NTBlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtNWhiV1VwSUc1dlpHVXVhV1FnUFNCMGFHbHpMbkJoY25ObFNXUmxiblFvS1R0Y2JpQWdkR2hwY3k1d1lYSnpaVVoxYm1OMGFXOXVVR0Z5WVcxektHNXZaR1VwTzF4dUlDQjBhR2x6TG5CaGNuTmxSblZ1WTNScGIyNUNiMlI1S0c1dlpHVXNJR0ZzYkc5M1JYaHdjbVZ6YzJsdmJrSnZaSGtwTzF4dUlDQjBhR2x6TG1sdVIyVnVaWEpoZEc5eUlEMGdiMnhrU1c1SFpXNDdYRzRnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUU1dlpHVW9ibTlrWlN3Z2FYTlRkR0YwWlcxbGJuUWdQeUJjSWtaMWJtTjBhVzl1UkdWamJHRnlZWFJwYjI1Y0lpQTZJRndpUm5WdVkzUnBiMjVGZUhCeVpYTnphVzl1WENJcE8xeHVmVHRjYmx4dWNIQXVjR0Z5YzJWR2RXNWpkR2x2YmxCaGNtRnRjeUE5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc0Z0lIUm9hWE11Wlhod1pXTjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjR0Z5Wlc1TUtUdGNiaUFnYm05a1pTNXdZWEpoYlhNZ1BTQjBhR2x6TG5CaGNuTmxRbWx1WkdsdVoweHBjM1FvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV3WVhKbGJsSXNJR1poYkhObExDQm1ZV3h6WlN3Z2RISjFaU2s3WEc1OU8xeHVYRzR2THlCUVlYSnpaU0JoSUdOc1lYTnpJR1JsWTJ4aGNtRjBhVzl1SUc5eUlHeHBkR1Z5WVd3Z0tHUmxjR1Z1WkdsdVp5QnZiaUIwYUdWY2JpOHZJR0JwYzFOMFlYUmxiV1Z1ZEdBZ2NHRnlZVzFsZEdWeUtTNWNibHh1Y0hBdWNHRnljMlZEYkdGemN5QTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQnBjMU4wWVhSbGJXVnVkQ2tnZTF4dUlDQjBhR2x6TG01bGVIUW9LVHRjYmlBZ2RHaHBjeTV3WVhKelpVTnNZWE56U1dRb2JtOWtaU3dnYVhOVGRHRjBaVzFsYm5RcE8xeHVJQ0IwYUdsekxuQmhjbk5sUTJ4aGMzTlRkWEJsY2lodWIyUmxLVHRjYmlBZ2RtRnlJR05zWVhOelFtOWtlU0E5SUhSb2FYTXVjM1JoY25ST2IyUmxLQ2s3WEc0Z0lIWmhjaUJvWVdSRGIyNXpkSEoxWTNSdmNpQTlJR1poYkhObE8xeHVJQ0JqYkdGemMwSnZaSGt1WW05a2VTQTlJRnRkTzF4dUlDQjBhR2x6TG1WNGNHVmpkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUp5WVdObFRDazdYRzRnSUhkb2FXeGxJQ2doZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVpY21GalpWSXBLU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11YzJWdGFTa3BJR052Ym5ScGJuVmxPMXh1SUNBZ0lIWmhjaUJ0WlhSb2IyUWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BPMXh1SUNBZ0lIWmhjaUJwYzBkbGJtVnlZWFJ2Y2lBOUlIUm9hWE11WldGMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWMzUmhjaWs3WEc0Z0lDQWdkbUZ5SUdselRXRjVZbVZUZEdGMGFXTWdQU0IwYUdsekxuUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWJtRnRaU0FtSmlCMGFHbHpMblpoYkhWbElEMDlQU0JjSW5OMFlYUnBZMXdpTzF4dUlDQWdJSFJvYVhNdWNHRnljMlZRY205d1pYSjBlVTVoYldVb2JXVjBhRzlrS1R0Y2JpQWdJQ0J0WlhSb2IyUmJYQ0p6ZEdGMGFXTmNJbDBnUFNCcGMwMWhlV0psVTNSaGRHbGpJQ1ltSUhSb2FYTXVkSGx3WlNBaFBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXdZWEpsYmt3N1hHNGdJQ0FnYVdZZ0tHMWxkR2h2WkZ0Y0luTjBZWFJwWTF3aVhTa2dlMXh1SUNBZ0lDQWdhV1lnS0dselIyVnVaWEpoZEc5eUtTQjBhR2x6TG5WdVpYaHdaV04wWldRb0tUdGNiaUFnSUNBZ0lHbHpSMlZ1WlhKaGRHOXlJRDBnZEdocGN5NWxZWFFvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV6ZEdGeUtUdGNiaUFnSUNBZ0lIUm9hWE11Y0dGeWMyVlFjbTl3WlhKMGVVNWhiV1VvYldWMGFHOWtLVHRjYmlBZ0lDQjlYRzRnSUNBZ2JXVjBhRzlrTG10cGJtUWdQU0JjSW0xbGRHaHZaRndpTzF4dUlDQWdJSFpoY2lCcGMwZGxkRk5sZENBOUlHWmhiSE5sTzF4dUlDQWdJR2xtSUNnaGJXVjBhRzlrTG1OdmJYQjFkR1ZrS1NCN1hHNGdJQ0FnSUNCMllYSWdhMlY1SUQwZ2JXVjBhRzlrTG10bGVUdGNibHh1SUNBZ0lDQWdhV1lnS0NGcGMwZGxibVZ5WVhSdmNpQW1KaUJyWlhrdWRIbHdaU0E5UFQwZ1hDSkpaR1Z1ZEdsbWFXVnlYQ0lnSmlZZ2RHaHBjeTUwZVhCbElDRTlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkJoY21WdVRDQW1KaUFvYTJWNUxtNWhiV1VnUFQwOUlGd2laMlYwWENJZ2ZId2dhMlY1TG01aGJXVWdQVDA5SUZ3aWMyVjBYQ0lwS1NCN1hHNGdJQ0FnSUNBZ0lHbHpSMlYwVTJWMElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ2JXVjBhRzlrTG10cGJtUWdQU0JyWlhrdWJtRnRaVHRjYmlBZ0lDQWdJQ0FnYTJWNUlEMGdkR2hwY3k1d1lYSnpaVkJ5YjNCbGNuUjVUbUZ0WlNodFpYUm9iMlFwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYVdZZ0tDRnRaWFJvYjJSYlhDSnpkR0YwYVdOY0lsMGdKaVlnS0d0bGVTNTBlWEJsSUQwOVBTQmNJa2xrWlc1MGFXWnBaWEpjSWlBbUppQnJaWGt1Ym1GdFpTQTlQVDBnWENKamIyNXpkSEoxWTNSdmNsd2lJSHg4SUd0bGVTNTBlWEJsSUQwOVBTQmNJa3hwZEdWeVlXeGNJaUFtSmlCclpYa3VkbUZzZFdVZ1BUMDlJRndpWTI5dWMzUnlkV04wYjNKY0lpa3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHaGhaRU52Ym5OMGNuVmpkRzl5S1NCMGFHbHpMbkpoYVhObEtHdGxlUzV6ZEdGeWRDd2dYQ0pFZFhCc2FXTmhkR1VnWTI5dWMzUnlkV04wYjNJZ2FXNGdkR2hsSUhOaGJXVWdZMnhoYzNOY0lpazdYRzRnSUNBZ0lDQWdJR2xtSUNocGMwZGxkRk5sZENrZ2RHaHBjeTV5WVdselpTaHJaWGt1YzNSaGNuUXNJRndpUTI5dWMzUnlkV04wYjNJZ1kyRnVKM1FnYUdGMlpTQm5aWFF2YzJWMElHMXZaR2xtYVdWeVhDSXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FYTkhaVzVsY21GMGIzSXBJSFJvYVhNdWNtRnBjMlVvYTJWNUxuTjBZWEowTENCY0lrTnZibk4wY25WamRHOXlJR05oYmlkMElHSmxJR0VnWjJWdVpYSmhkRzl5WENJcE8xeHVJQ0FnSUNBZ0lDQnRaWFJvYjJRdWEybHVaQ0E5SUZ3aVkyOXVjM1J5ZFdOMGIzSmNJanRjYmlBZ0lDQWdJQ0FnYUdGa1EyOXVjM1J5ZFdOMGIzSWdQU0IwY25WbE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxuQmhjbk5sUTJ4aGMzTk5aWFJvYjJRb1kyeGhjM05DYjJSNUxDQnRaWFJvYjJRc0lHbHpSMlZ1WlhKaGRHOXlLVHRjYmlBZ0lDQnBaaUFvYVhOSFpYUlRaWFFwSUh0Y2JpQWdJQ0FnSUhaaGNpQndZWEpoYlVOdmRXNTBJRDBnYldWMGFHOWtMbXRwYm1RZ1BUMDlJRndpWjJWMFhDSWdQeUF3SURvZ01UdGNiaUFnSUNBZ0lHbG1JQ2h0WlhSb2IyUXVkbUZzZFdVdWNHRnlZVzF6TG14bGJtZDBhQ0FoUFQwZ2NHRnlZVzFEYjNWdWRDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2MzUmhjblFnUFNCdFpYUm9iMlF1ZG1Gc2RXVXVjM1JoY25RN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h0WlhSb2IyUXVhMmx1WkNBOVBUMGdYQ0puWlhSY0lpa2dkR2hwY3k1eVlXbHpaVkpsWTI5MlpYSmhZbXhsS0hOMFlYSjBMQ0JjSW1kbGRIUmxjaUJ6YUc5MWJHUWdhR0YyWlNCdWJ5QndZWEpoYlhOY0lpazdaV3h6WlNCMGFHbHpMbkpoYVhObFVtVmpiM1psY21GaWJHVW9jM1JoY25Rc0lGd2ljMlYwZEdWeUlITm9iM1ZzWkNCb1lYWmxJR1Y0WVdOMGJIa2diMjVsSUhCaGNtRnRYQ0lwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYVdZZ0tHMWxkR2h2WkM1cmFXNWtJRDA5UFNCY0luTmxkRndpSUNZbUlHMWxkR2h2WkM1MllXeDFaUzV3WVhKaGJYTmJNRjB1ZEhsd1pTQTlQVDBnWENKU1pYTjBSV3hsYldWdWRGd2lLU0IwYUdsekxuSmhhWE5sS0cxbGRHaHZaQzUyWVd4MVpTNXdZWEpoYlhOYk1GMHVjM1JoY25Rc0lGd2lVMlYwZEdWeUlHTmhibTV2ZENCMWMyVWdjbVZ6ZENCd1lYSmhiWE5jSWlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUc1dlpHVXVZbTlrZVNBOUlIUm9hWE11Wm1sdWFYTm9UbTlrWlNoamJHRnpjMEp2Wkhrc0lGd2lRMnhoYzNOQ2IyUjVYQ0lwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJR2x6VTNSaGRHVnRaVzUwSUQ4Z1hDSkRiR0Z6YzBSbFkyeGhjbUYwYVc5dVhDSWdPaUJjSWtOc1lYTnpSWGh3Y21WemMybHZibHdpS1R0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sUTJ4aGMzTk5aWFJvYjJRZ1BTQm1kVzVqZEdsdmJpQW9ZMnhoYzNOQ2IyUjVMQ0J0WlhSb2IyUXNJR2x6UjJWdVpYSmhkRzl5S1NCN1hHNGdJRzFsZEdodlpDNTJZV3gxWlNBOUlIUm9hWE11Y0dGeWMyVk5aWFJvYjJRb2FYTkhaVzVsY21GMGIzSXBPMXh1SUNCamJHRnpjMEp2WkhrdVltOWtlUzV3ZFhOb0tIUm9hWE11Wm1sdWFYTm9UbTlrWlNodFpYUm9iMlFzSUZ3aVRXVjBhRzlrUkdWbWFXNXBkR2x2Ymx3aUtTazdYRzU5TzF4dVhHNXdjQzV3WVhKelpVTnNZWE56U1dRZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlN3Z2FYTlRkR0YwWlcxbGJuUXBJSHRjYmlBZ2JtOWtaUzVwWkNBOUlIUm9hWE11ZEhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV1WVcxbElEOGdkR2hwY3k1d1lYSnpaVWxrWlc1MEtDa2dPaUJwYzFOMFlYUmxiV1Z1ZENBL0lIUm9hWE11ZFc1bGVIQmxZM1JsWkNncElEb2diblZzYkR0Y2JuMDdYRzVjYm5Cd0xuQmhjbk5sUTJ4aGMzTlRkWEJsY2lBOUlHWjFibU4wYVc5dUlDaHViMlJsS1NCN1hHNGdJRzV2WkdVdWMzVndaWEpEYkdGemN5QTlJSFJvYVhNdVpXRjBLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVYMlY0ZEdWdVpITXBJRDhnZEdocGN5NXdZWEp6WlVWNGNISlRkV0p6WTNKcGNIUnpLQ2tnT2lCdWRXeHNPMXh1ZlR0Y2JseHVMeThnVUdGeWMyVnpJRzF2WkhWc1pTQmxlSEJ2Y25RZ1pHVmpiR0Z5WVhScGIyNHVYRzVjYm5Cd0xuQmhjbk5sUlhod2IzSjBJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXBJSHRjYmlBZ2RHaHBjeTV1WlhoMEtDazdYRzRnSUM4dklHVjRjRzl5ZENBcUlHWnliMjBnSnk0dUxpZGNiaUFnYVdZZ0tIUm9hWE11WldGMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWMzUmhjaWtwSUh0Y2JpQWdJQ0IwYUdsekxtVjRjR1ZqZEVOdmJuUmxlSFIxWVd3b1hDSm1jbTl0WENJcE8xeHVJQ0FnSUc1dlpHVXVjMjkxY21ObElEMGdkR2hwY3k1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG5OMGNtbHVaeUEvSUhSb2FYTXVjR0Z5YzJWRmVIQnlRWFJ2YlNncElEb2dkR2hwY3k1MWJtVjRjR1ZqZEdWa0tDazdYRzRnSUNBZ2RHaHBjeTV6WlcxcFkyOXNiMjRvS1R0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVJYaHdiM0owUVd4c1JHVmpiR0Z5WVhScGIyNWNJaWs3WEc0Z0lIMWNiaUFnYVdZZ0tIUm9hWE11WldGMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVgyUmxabUYxYkhRcEtTQjdYRzRnSUNBZ0x5OGdaWGh3YjNKMElHUmxabUYxYkhRZ0xpNHVYRzRnSUNBZ2RtRnlJSEJoY21WdWN5QTlJSFJvYVhNdWRIbHdaU0E5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG5CaGNtVnVURHRjYmlBZ0lDQjJZWElnWlhod2NpQTlJSFJvYVhNdWNHRnljMlZOWVhsaVpVRnpjMmxuYmlncE8xeHVJQ0FnSUhaaGNpQnVaV1ZrYzFObGJXa2dQU0IwY25WbE8xeHVJQ0FnSUdsbUlDZ2hjR0Z5Wlc1eklDWW1JQ2hsZUhCeUxuUjVjR1VnUFQwZ1hDSkdkVzVqZEdsdmJrVjRjSEpsYzNOcGIyNWNJaUI4ZkNCbGVIQnlMblI1Y0dVZ1BUMGdYQ0pEYkdGemMwVjRjSEpsYzNOcGIyNWNJaWtwSUh0Y2JpQWdJQ0FnSUc1bFpXUnpVMlZ0YVNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnYVdZZ0tHVjRjSEl1YVdRcElIdGNiaUFnSUNBZ0lDQWdaWGh3Y2k1MGVYQmxJRDBnWlhod2NpNTBlWEJsSUQwOUlGd2lSblZ1WTNScGIyNUZlSEJ5WlhOemFXOXVYQ0lnUHlCY0lrWjFibU4wYVc5dVJHVmpiR0Z5WVhScGIyNWNJaUE2SUZ3aVEyeGhjM05FWldOc1lYSmhkR2x2Ymx3aU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J1YjJSbExtUmxZMnhoY21GMGFXOXVJRDBnWlhod2NqdGNiaUFnSUNCcFppQW9ibVZsWkhOVFpXMXBLU0IwYUdsekxuTmxiV2xqYjJ4dmJpZ3BPMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pGZUhCdmNuUkVaV1poZFd4MFJHVmpiR0Z5WVhScGIyNWNJaWs3WEc0Z0lIMWNiaUFnTHk4Z1pYaHdiM0owSUhaaGNueGpiMjV6ZEh4c1pYUjhablZ1WTNScGIyNThZMnhoYzNNZ0xpNHVYRzRnSUdsbUlDaDBhR2x6TG5Ob2IzVnNaRkJoY25ObFJYaHdiM0owVTNSaGRHVnRaVzUwS0NrcElIdGNiaUFnSUNCdWIyUmxMbVJsWTJ4aGNtRjBhVzl1SUQwZ2RHaHBjeTV3WVhKelpWTjBZWFJsYldWdWRDaDBjblZsS1R0Y2JpQWdJQ0J1YjJSbExuTndaV05wWm1sbGNuTWdQU0JiWFR0Y2JpQWdJQ0J1YjJSbExuTnZkWEpqWlNBOUlHNTFiR3c3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnTHk4Z1pYaHdiM0owSUhzZ2VDd2dlU0JoY3lCNklIMGdXMlp5YjIwZ0p5NHVMaWRkWEc0Z0lDQWdibTlrWlM1a1pXTnNZWEpoZEdsdmJpQTlJRzUxYkd3N1hHNGdJQ0FnYm05a1pTNXpjR1ZqYVdacFpYSnpJRDBnZEdocGN5NXdZWEp6WlVWNGNHOXlkRk53WldOcFptbGxjbk1vS1R0Y2JpQWdJQ0JwWmlBb2RHaHBjeTVsWVhSRGIyNTBaWGgwZFdGc0tGd2labkp2YlZ3aUtTa2dlMXh1SUNBZ0lDQWdibTlrWlM1emIzVnlZMlVnUFNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjM1J5YVc1bklEOGdkR2hwY3k1d1lYSnpaVVY0Y0hKQmRHOXRLQ2tnT2lCMGFHbHpMblZ1Wlhod1pXTjBaV1FvS1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnWTJobFkyc2dabTl5SUd0bGVYZHZjbVJ6SUhWelpXUWdZWE1nYkc5allXd2dibUZ0WlhOY2JpQWdJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2JtOWtaUzV6Y0dWamFXWnBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbXRsZVhkdmNtUnpMblJsYzNRb2JtOWtaUzV6Y0dWamFXWnBaWEp6VzJsZExteHZZMkZzTG01aGJXVXBJSHg4SUhSb2FYTXVjbVZ6WlhKMlpXUlhiM0prY3k1MFpYTjBLRzV2WkdVdWMzQmxZMmxtYVdWeWMxdHBYUzVzYjJOaGJDNXVZVzFsS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdWRXNWxlSEJsWTNSbFpDaHViMlJsTG5Od1pXTnBabWxsY25OYmFWMHViRzlqWVd3dWMzUmhjblFwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHNXZaR1V1YzI5MWNtTmxJRDBnYm5Wc2JEdGNiaUFnSUNCOVhHNGdJQ0FnZEdocGN5NXpaVzFwWTI5c2IyNG9LVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhPYjJSbEtHNXZaR1VzSUZ3aVJYaHdiM0owVG1GdFpXUkVaV05zWVhKaGRHbHZibHdpS1R0Y2JuMDdYRzVjYm5Cd0xuTm9iM1ZzWkZCaGNuTmxSWGh3YjNKMFUzUmhkR1Z0Wlc1MElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQnlaWFIxY200Z2RHaHBjeTUwZVhCbExtdGxlWGR2Y21RZ2ZId2dkR2hwY3k1cGMweGxkQ2dwTzF4dWZUdGNibHh1THk4Z1VHRnljMlZ6SUdFZ1kyOXRiV0V0YzJWd1lYSmhkR1ZrSUd4cGMzUWdiMllnYlc5a2RXeGxJR1Y0Y0c5eWRITXVYRzVjYm5Cd0xuQmhjbk5sUlhod2IzSjBVM0JsWTJsbWFXVnljeUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnZG1GeUlHNXZaR1Z6SUQwZ1cxMHNYRzRnSUNBZ0lDQm1hWEp6ZENBOUlIUnlkV1U3WEc0Z0lDOHZJR1Y0Y0c5eWRDQjdJSGdzSUhrZ1lYTWdlaUI5SUZ0bWNtOXRJQ2N1TGk0blhWeHVJQ0IwYUdsekxtVjRjR1ZqZENoZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1KeVlXTmxUQ2s3WEc0Z0lIZG9hV3hsSUNnaGRHaHBjeTVsWVhRb1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aWNtRmpaVklwS1NCN1hHNGdJQ0FnYVdZZ0tDRm1hWEp6ZENrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVsZUhCbFkzUW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWpiMjF0WVNrN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1aFpuUmxjbFJ5WVdsc2FXNW5RMjl0YldFb1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aWNtRmpaVklwS1NCaWNtVmhhenRjYmlBZ0lDQjlJR1ZzYzJVZ1ptbHljM1FnUFNCbVlXeHpaVHRjYmx4dUlDQWdJSFpoY2lCdWIyUmxJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ0lDQnViMlJsTG14dlkyRnNJRDBnZEdocGN5NXdZWEp6WlVsa1pXNTBLSFJvYVhNdWRIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZlpHVm1ZWFZzZENrN1hHNGdJQ0FnYm05a1pTNWxlSEJ2Y25SbFpDQTlJSFJvYVhNdVpXRjBRMjl1ZEdWNGRIVmhiQ2hjSW1GelhDSXBJRDhnZEdocGN5NXdZWEp6WlVsa1pXNTBLSFJ5ZFdVcElEb2dibTlrWlM1c2IyTmhiRHRjYmlBZ0lDQnViMlJsY3k1d2RYTm9LSFJvYVhNdVptbHVhWE5vVG05a1pTaHViMlJsTENCY0lrVjRjRzl5ZEZOd1pXTnBabWxsY2x3aUtTazdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHNXZaR1Z6TzF4dWZUdGNibHh1THk4Z1VHRnljMlZ6SUdsdGNHOXlkQ0JrWldOc1lYSmhkR2x2Ymk1Y2JseHVjSEF1Y0dGeWMyVkpiWEJ2Y25RZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVJQ0IwYUdsekxtNWxlSFFvS1R0Y2JpQWdMeThnYVcxd2IzSjBJQ2N1TGk0blhHNGdJR2xtSUNoMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjM1J5YVc1bktTQjdYRzRnSUNBZ2JtOWtaUzV6Y0dWamFXWnBaWEp6SUQwZ1pXMXdkSGs3WEc0Z0lDQWdibTlrWlM1emIzVnlZMlVnUFNCMGFHbHpMbkJoY25ObFJYaHdja0YwYjIwb0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnViMlJsTG5Od1pXTnBabWxsY25NZ1BTQjBhR2x6TG5CaGNuTmxTVzF3YjNKMFUzQmxZMmxtYVdWeWN5Z3BPMXh1SUNBZ0lIUm9hWE11Wlhod1pXTjBRMjl1ZEdWNGRIVmhiQ2hjSW1aeWIyMWNJaWs3WEc0Z0lDQWdibTlrWlM1emIzVnlZMlVnUFNCMGFHbHpMblI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjM1J5YVc1bklEOGdkR2hwY3k1d1lYSnpaVVY0Y0hKQmRHOXRLQ2tnT2lCMGFHbHpMblZ1Wlhod1pXTjBaV1FvS1R0Y2JpQWdmVnh1SUNCMGFHbHpMbk5sYldsamIyeHZiaWdwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaE9iMlJsS0c1dlpHVXNJRndpU1cxd2IzSjBSR1ZqYkdGeVlYUnBiMjVjSWlrN1hHNTlPMXh1WEc0dkx5QlFZWEp6WlhNZ1lTQmpiMjF0WVMxelpYQmhjbUYwWldRZ2JHbHpkQ0J2WmlCdGIyUjFiR1VnYVcxd2IzSjBjeTVjYmx4dWNIQXVjR0Z5YzJWSmJYQnZjblJUY0dWamFXWnBaWEp6SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCMllYSWdibTlrWlhNZ1BTQmJYU3hjYmlBZ0lDQWdJR1pwY25OMElEMGdkSEoxWlR0Y2JpQWdhV1lnS0hSb2FYTXVkSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXVZVzFsS1NCN1hHNGdJQ0FnTHk4Z2FXMXdiM0owSUdSbFptRjFiSFJQWW1vc0lIc2dlQ3dnZVNCaGN5QjZJSDBnWm5KdmJTQW5MaTR1SjF4dUlDQWdJSFpoY2lCdWIyUmxJRDBnZEdocGN5NXpkR0Z5ZEU1dlpHVW9LVHRjYmlBZ0lDQnViMlJsTG14dlkyRnNJRDBnZEdocGN5NXdZWEp6WlVsa1pXNTBLQ2s3WEc0Z0lDQWdkR2hwY3k1amFHVmphMHhXWVd3b2JtOWtaUzVzYjJOaGJDd2dkSEoxWlNrN1hHNGdJQ0FnYm05a1pYTXVjSFZ6YUNoMGFHbHpMbVpwYm1semFFNXZaR1VvYm05a1pTd2dYQ0pKYlhCdmNuUkVaV1poZFd4MFUzQmxZMmxtYVdWeVhDSXBLVHRjYmlBZ0lDQnBaaUFvSVhSb2FYTXVaV0YwS0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WTI5dGJXRXBLU0J5WlhSMWNtNGdibTlrWlhNN1hHNGdJSDFjYmlBZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1emRHRnlLU0I3WEc0Z0lDQWdkbUZ5SUc1dlpHVWdQU0IwYUdsekxuTjBZWEowVG05a1pTZ3BPMXh1SUNBZ0lIUm9hWE11Ym1WNGRDZ3BPMXh1SUNBZ0lIUm9hWE11Wlhod1pXTjBRMjl1ZEdWNGRIVmhiQ2hjSW1GelhDSXBPMXh1SUNBZ0lHNXZaR1V1Ykc5allXd2dQU0IwYUdsekxuQmhjbk5sU1dSbGJuUW9LVHRjYmlBZ0lDQjBhR2x6TG1Ob1pXTnJURlpoYkNodWIyUmxMbXh2WTJGc0xDQjBjblZsS1R0Y2JpQWdJQ0J1YjJSbGN5NXdkWE5vS0hSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJa2x0Y0c5eWRFNWhiV1Z6Y0dGalpWTndaV05wWm1sbGNsd2lLU2s3WEc0Z0lDQWdjbVYwZFhKdUlHNXZaR1Z6TzF4dUlDQjlYRzRnSUhSb2FYTXVaWGh3WldOMEtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVluSmhZMlZNS1R0Y2JpQWdkMmhwYkdVZ0tDRjBhR2x6TG1WaGRDaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05sVWlrcElIdGNiaUFnSUNCcFppQW9JV1pwY25OMEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG1WNGNHVmpkQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52YlcxaEtUdGNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxtRm1kR1Z5VkhKaGFXeHBibWREYjIxdFlTaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05sVWlrcElHSnlaV0ZyTzF4dUlDQWdJSDBnWld4elpTQm1hWEp6ZENBOUlHWmhiSE5sTzF4dVhHNGdJQ0FnZG1GeUlHNXZaR1VnUFNCMGFHbHpMbk4wWVhKMFRtOWtaU2dwTzF4dUlDQWdJRzV2WkdVdWFXMXdiM0owWldRZ1BTQjBhR2x6TG5CaGNuTmxTV1JsYm5Rb2RISjFaU2s3WEc0Z0lDQWdhV1lnS0hSb2FYTXVaV0YwUTI5dWRHVjRkSFZoYkNoY0ltRnpYQ0lwS1NCN1hHNGdJQ0FnSUNCdWIyUmxMbXh2WTJGc0lEMGdkR2hwY3k1d1lYSnpaVWxrWlc1MEtDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUc1dlpHVXViRzlqWVd3Z1BTQnViMlJsTG1sdGNHOXlkR1ZrTzF4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11YVhOTFpYbDNiM0prS0c1dlpHVXViRzlqWVd3dWJtRnRaU2twSUhSb2FYTXVkVzVsZUhCbFkzUmxaQ2h1YjJSbExteHZZMkZzTG5OMFlYSjBLVHRjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbkpsYzJWeWRtVmtWMjl5WkhOVGRISnBZM1F1ZEdWemRDaHViMlJsTG14dlkyRnNMbTVoYldVcEtTQjBhR2x6TG5KaGFYTmxLRzV2WkdVdWJHOWpZV3d1YzNSaGNuUXNJRndpVkdobElHdGxlWGR2Y21RZ0oxd2lJQ3NnYm05a1pTNXNiMk5oYkM1dVlXMWxJQ3NnWENJbklHbHpJSEpsYzJWeWRtVmtYQ0lwTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG1Ob1pXTnJURlpoYkNodWIyUmxMbXh2WTJGc0xDQjBjblZsS1R0Y2JpQWdJQ0J1YjJSbGN5NXdkWE5vS0hSb2FYTXVabWx1YVhOb1RtOWtaU2h1YjJSbExDQmNJa2x0Y0c5eWRGTndaV05wWm1sbGNsd2lLU2s3WEc0Z0lIMWNiaUFnY21WMGRYSnVJRzV2WkdWek8xeHVmVHRjYmx4dWZTeDdYQ0l1TDJsa1pXNTBhV1pwWlhKY0lqb3lMRndpTGk5emRHRjBaVndpT2pFd0xGd2lMaTkwYjJ0bGJuUjVjR1ZjSWpveE5DeGNJaTR2ZDJocGRHVnpjR0ZqWlZ3aU9qRTJmVjBzTVRJNlcyWjFibU4wYVc5dUtGOWtaWEpsY1Y4c2JXOWtkV3hsTEdWNGNHOXlkSE1wZTF4dUx5OGdWR2hsSUdGc1oyOXlhWFJvYlNCMWMyVmtJSFJ2SUdSbGRHVnliV2x1WlNCM2FHVjBhR1Z5SUdFZ2NtVm5aWGh3SUdOaGJpQmhjSEJsWVhJZ1lYUWdZVnh1THk4Z1oybDJaVzRnY0c5cGJuUWdhVzRnZEdobElIQnliMmR5WVcwZ2FYTWdiRzl2YzJWc2VTQmlZWE5sWkNCdmJpQnpkMlZsZEM1cWN5Y2dZWEJ3Y205aFkyZ3VYRzR2THlCVFpXVWdhSFIwY0hNNkx5OW5hWFJvZFdJdVkyOXRMMjF2ZW1sc2JHRXZjM2RsWlhRdWFuTXZkMmxyYVM5a1pYTnBaMjVjYmx4dVhDSjFjMlVnYzNSeWFXTjBYQ0k3WEc1Y2JtVjRjRzl5ZEhNdVgxOWxjMDF2WkhWc1pTQTlJSFJ5ZFdVN1hHNWNibVoxYm1OMGFXOXVJRjlqYkdGemMwTmhiR3hEYUdWamF5aHBibk4wWVc1alpTd2dRMjl1YzNSeWRXTjBiM0lwSUhzZ2FXWWdLQ0VvYVc1emRHRnVZMlVnYVc1emRHRnVZMlZ2WmlCRGIyNXpkSEoxWTNSdmNpa3BJSHNnZEdoeWIzY2dibVYzSUZSNWNHVkZjbkp2Y2loY0lrTmhibTV2ZENCallXeHNJR0VnWTJ4aGMzTWdZWE1nWVNCbWRXNWpkR2x2Ymx3aUtUc2dmU0I5WEc1Y2JuWmhjaUJmYzNSaGRHVWdQU0JmWkdWeVpYRmZLRndpTGk5emRHRjBaVndpS1R0Y2JseHVkbUZ5SUY5MGIydGxiblI1Y0dVZ1BTQmZaR1Z5WlhGZktGd2lMaTkwYjJ0bGJuUjVjR1ZjSWlrN1hHNWNiblpoY2lCZmQyaHBkR1Z6Y0dGalpTQTlJRjlrWlhKbGNWOG9YQ0l1TDNkb2FYUmxjM0JoWTJWY0lpazdYRzVjYm5aaGNpQlViMnREYjI1MFpYaDBJRDBnWm5WdVkzUnBiMjRnVkc5clEyOXVkR1Y0ZENoMGIydGxiaXdnYVhORmVIQnlMQ0J3Y21WelpYSjJaVk53WVdObExDQnZkbVZ5Y21sa1pTa2dlMXh1SUNCZlkyeGhjM05EWVd4c1EyaGxZMnNvZEdocGN5d2dWRzlyUTI5dWRHVjRkQ2s3WEc1Y2JpQWdkR2hwY3k1MGIydGxiaUE5SUhSdmEyVnVPMXh1SUNCMGFHbHpMbWx6Ulhod2NpQTlJQ0VoYVhORmVIQnlPMXh1SUNCMGFHbHpMbkJ5WlhObGNuWmxVM0JoWTJVZ1BTQWhJWEJ5WlhObGNuWmxVM0JoWTJVN1hHNGdJSFJvYVhNdWIzWmxjbkpwWkdVZ1BTQnZkbVZ5Y21sa1pUdGNibjA3WEc1Y2JtVjRjRzl5ZEhNdVZHOXJRMjl1ZEdWNGRDQTlJRlJ2YTBOdmJuUmxlSFE3WEc1MllYSWdkSGx3WlhNZ1BTQjdYRzRnSUdKZmMzUmhkRG9nYm1WM0lGUnZhME52Ym5SbGVIUW9YQ0o3WENJc0lHWmhiSE5sS1N4Y2JpQWdZbDlsZUhCeU9pQnVaWGNnVkc5clEyOXVkR1Y0ZENoY0ludGNJaXdnZEhKMVpTa3NYRzRnSUdKZmRHMXdiRG9nYm1WM0lGUnZhME52Ym5SbGVIUW9YQ0lrZTF3aUxDQjBjblZsS1N4Y2JpQWdjRjl6ZEdGME9pQnVaWGNnVkc5clEyOXVkR1Y0ZENoY0lpaGNJaXdnWm1Gc2MyVXBMRnh1SUNCd1gyVjRjSEk2SUc1bGR5QlViMnREYjI1MFpYaDBLRndpS0Z3aUxDQjBjblZsS1N4Y2JpQWdjVjkwYlhCc09pQnVaWGNnVkc5clEyOXVkR1Y0ZENoY0ltQmNJaXdnZEhKMVpTd2dkSEoxWlN3Z1puVnVZM1JwYjI0Z0tIQXBJSHRjYmlBZ0lDQnlaWFIxY200Z2NDNXlaV0ZrVkcxd2JGUnZhMlZ1S0NrN1hHNGdJSDBwTEZ4dUlDQm1YMlY0Y0hJNklHNWxkeUJVYjJ0RGIyNTBaWGgwS0Z3aVpuVnVZM1JwYjI1Y0lpd2dkSEoxWlNsY2JuMDdYRzVjYm1WNGNHOXlkSE11ZEhsd1pYTWdQU0IwZVhCbGN6dGNiblpoY2lCd2NDQTlJRjl6ZEdGMFpTNVFZWEp6WlhJdWNISnZkRzkwZVhCbE8xeHVYRzV3Y0M1cGJtbDBhV0ZzUTI5dWRHVjRkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnY21WMGRYSnVJRnQwZVhCbGN5NWlYM04wWVhSZE8xeHVmVHRjYmx4dWNIQXVZbkpoWTJWSmMwSnNiMk5ySUQwZ1puVnVZM1JwYjI0Z0tIQnlaWFpVZVhCbEtTQjdYRzRnSUdsbUlDaHdjbVYyVkhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVqYjJ4dmJpa2dlMXh1SUNBZ0lIWmhjaUJmY0dGeVpXNTBJRDBnZEdocGN5NWpkWEpEYjI1MFpYaDBLQ2s3WEc0Z0lDQWdhV1lnS0Y5d1lYSmxiblFnUFQwOUlIUjVjR1Z6TG1KZmMzUmhkQ0I4ZkNCZmNHRnlaVzUwSUQwOVBTQjBlWEJsY3k1aVgyVjRjSElwSUhKbGRIVnliaUFoWDNCaGNtVnVkQzVwYzBWNGNISTdYRzRnSUgxY2JpQWdhV1lnS0hCeVpYWlVlWEJsSUQwOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxsOXlaWFIxY200cElISmxkSFZ5YmlCZmQyaHBkR1Z6Y0dGalpTNXNhVzVsUW5KbFlXc3VkR1Z6ZENoMGFHbHpMbWx1Y0hWMExuTnNhV05sS0hSb2FYTXViR0Z6ZEZSdmEwVnVaQ3dnZEdocGN5NXpkR0Z5ZENrcE8xeHVJQ0JwWmlBb2NISmxkbFI1Y0dVZ1BUMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVYMlZzYzJVZ2ZId2djSEpsZGxSNWNHVWdQVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11YzJWdGFTQjhmQ0J3Y21WMlZIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1bGIyWWdmSHdnY0hKbGRsUjVjR1VnUFQwOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWNHRnlaVzVTS1NCeVpYUjFjbTRnZEhKMVpUdGNiaUFnYVdZZ0tIQnlaWFpVZVhCbElEMDlJRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbkpoWTJWTUtTQnlaWFIxY200Z2RHaHBjeTVqZFhKRGIyNTBaWGgwS0NrZ1BUMDlJSFI1Y0dWekxtSmZjM1JoZER0Y2JpQWdjbVYwZFhKdUlDRjBhR2x6TG1WNGNISkJiR3h2ZDJWa08xeHVmVHRjYmx4dWNIQXVkWEJrWVhSbFEyOXVkR1Y0ZENBOUlHWjFibU4wYVc5dUlDaHdjbVYyVkhsd1pTa2dlMXh1SUNCMllYSWdkWEJrWVhSbElEMGdkVzVrWldacGJtVmtMRnh1SUNBZ0lDQWdkSGx3WlNBOUlIUm9hWE11ZEhsd1pUdGNiaUFnYVdZZ0tIUjVjR1V1YTJWNWQyOXlaQ0FtSmlCd2NtVjJWSGx3WlNBOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtUnZkQ2tnZEdocGN5NWxlSEJ5UVd4c2IzZGxaQ0E5SUdaaGJITmxPMlZzYzJVZ2FXWWdLSFZ3WkdGMFpTQTlJSFI1Y0dVdWRYQmtZWFJsUTI5dWRHVjRkQ2tnZFhCa1lYUmxMbU5oYkd3b2RHaHBjeXdnY0hKbGRsUjVjR1VwTzJWc2MyVWdkR2hwY3k1bGVIQnlRV3hzYjNkbFpDQTlJSFI1Y0dVdVltVm1iM0psUlhod2NqdGNibjA3WEc1Y2JpOHZJRlJ2YTJWdUxYTndaV05wWm1saklHTnZiblJsZUhRZ2RYQmtZWFJsSUdOdlpHVmNibHh1WDNSdmEyVnVkSGx3WlM1MGVYQmxjeTV3WVhKbGJsSXVkWEJrWVhSbFEyOXVkR1Y0ZENBOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVluSmhZMlZTTG5Wd1pHRjBaVU52Ym5SbGVIUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJR2xtSUNoMGFHbHpMbU52Ym5SbGVIUXViR1Z1WjNSb0lEMDlJREVwSUh0Y2JpQWdJQ0IwYUdsekxtVjRjSEpCYkd4dmQyVmtJRDBnZEhKMVpUdGNiaUFnSUNCeVpYUjFjbTQ3WEc0Z0lIMWNiaUFnZG1GeUlHOTFkQ0E5SUhSb2FYTXVZMjl1ZEdWNGRDNXdiM0FvS1R0Y2JpQWdhV1lnS0c5MWRDQTlQVDBnZEhsd1pYTXVZbDl6ZEdGMElDWW1JSFJvYVhNdVkzVnlRMjl1ZEdWNGRDZ3BJRDA5UFNCMGVYQmxjeTVtWDJWNGNISXBJSHRjYmlBZ0lDQjBhR2x6TG1OdmJuUmxlSFF1Y0c5d0tDazdYRzRnSUNBZ2RHaHBjeTVsZUhCeVFXeHNiM2RsWkNBOUlHWmhiSE5sTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLRzkxZENBOVBUMGdkSGx3WlhNdVlsOTBiWEJzS1NCN1hHNGdJQ0FnZEdocGN5NWxlSEJ5UVd4c2IzZGxaQ0E5SUhSeWRXVTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkR2hwY3k1bGVIQnlRV3hzYjNkbFpDQTlJQ0Z2ZFhRdWFYTkZlSEJ5TzF4dUlDQjlYRzU5TzF4dVhHNWZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05sVEM1MWNHUmhkR1ZEYjI1MFpYaDBJRDBnWm5WdVkzUnBiMjRnS0hCeVpYWlVlWEJsS1NCN1hHNGdJSFJvYVhNdVkyOXVkR1Y0ZEM1d2RYTm9LSFJvYVhNdVluSmhZMlZKYzBKc2IyTnJLSEJ5WlhaVWVYQmxLU0EvSUhSNWNHVnpMbUpmYzNSaGRDQTZJSFI1Y0dWekxtSmZaWGh3Y2lrN1hHNGdJSFJvYVhNdVpYaHdja0ZzYkc5M1pXUWdQU0IwY25WbE8xeHVmVHRjYmx4dVgzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1a2IyeHNZWEpDY21GalpVd3VkWEJrWVhSbFEyOXVkR1Y0ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2RHaHBjeTVqYjI1MFpYaDBMbkIxYzJnb2RIbHdaWE11WWw5MGJYQnNLVHRjYmlBZ2RHaHBjeTVsZUhCeVFXeHNiM2RsWkNBOUlIUnlkV1U3WEc1OU8xeHVYRzVmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkJoY21WdVRDNTFjR1JoZEdWRGIyNTBaWGgwSUQwZ1puVnVZM1JwYjI0Z0tIQnlaWFpVZVhCbEtTQjdYRzRnSUhaaGNpQnpkR0YwWlcxbGJuUlFZWEpsYm5NZ1BTQndjbVYyVkhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVmYVdZZ2ZId2djSEpsZGxSNWNHVWdQVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDJadmNpQjhmQ0J3Y21WMlZIbHdaU0E5UFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1ZmQybDBhQ0I4ZkNCd2NtVjJWSGx3WlNBOVBUMGdYM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWZkMmhwYkdVN1hHNGdJSFJvYVhNdVkyOXVkR1Y0ZEM1d2RYTm9LSE4wWVhSbGJXVnVkRkJoY21WdWN5QS9JSFI1Y0dWekxuQmZjM1JoZENBNklIUjVjR1Z6TG5CZlpYaHdjaWs3WEc0Z0lIUm9hWE11Wlhod2NrRnNiRzkzWldRZ1BTQjBjblZsTzF4dWZUdGNibHh1WDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVwYm1ORVpXTXVkWEJrWVhSbFEyOXVkR1Y0ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0x5OGdkRzlyUlhod2NrRnNiRzkzWldRZ2MzUmhlWE1nZFc1amFHRnVaMlZrWEc1OU8xeHVYRzVmZEc5clpXNTBlWEJsTG5SNWNHVnpMbDltZFc1amRHbHZiaTUxY0dSaGRHVkRiMjUwWlhoMElEMGdablZ1WTNScGIyNGdLSEJ5WlhaVWVYQmxLU0I3WEc0Z0lHbG1JQ2h3Y21WMlZIbHdaUzVpWldadmNtVkZlSEJ5SUNZbUlIQnlaWFpVZVhCbElDRTlQU0JmZEc5clpXNTBlWEJsTG5SNWNHVnpMbk5sYldrZ0ppWWdjSEpsZGxSNWNHVWdJVDA5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11WDJWc2MyVWdKaVlnS0hCeVpYWlVlWEJsSUNFOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtTnZiRzl1SUh4OElIUm9hWE11WTNWeVEyOXVkR1Y0ZENncElDRTlQU0IwZVhCbGN5NWlYM04wWVhRcEtTQjBhR2x6TG1OdmJuUmxlSFF1Y0hWemFDaDBlWEJsY3k1bVgyVjRjSElwTzF4dUlDQjBhR2x6TG1WNGNISkJiR3h2ZDJWa0lEMGdabUZzYzJVN1hHNTlPMXh1WEc1ZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1KaFkydFJkVzkwWlM1MWNHUmhkR1ZEYjI1MFpYaDBJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0JwWmlBb2RHaHBjeTVqZFhKRGIyNTBaWGgwS0NrZ1BUMDlJSFI1Y0dWekxuRmZkRzF3YkNrZ2RHaHBjeTVqYjI1MFpYaDBMbkJ2Y0NncE8yVnNjMlVnZEdocGN5NWpiMjUwWlhoMExuQjFjMmdvZEhsd1pYTXVjVjkwYlhCc0tUdGNiaUFnZEdocGN5NWxlSEJ5UVd4c2IzZGxaQ0E5SUdaaGJITmxPMXh1ZlR0Y2JseHVmU3g3WENJdUwzTjBZWFJsWENJNk1UQXNYQ0l1TDNSdmEyVnVkSGx3WlZ3aU9qRTBMRndpTGk5M2FHbDBaWE53WVdObFhDSTZNVFo5WFN3eE16cGJablZ1WTNScGIyNG9YMlJsY21WeFh5eHRiMlIxYkdVc1pYaHdiM0owY3lsN1hHNWNJblZ6WlNCemRISnBZM1JjSWp0Y2JseHVaWGh3YjNKMGN5NWZYMlZ6VFc5a2RXeGxJRDBnZEhKMVpUdGNibHh1Wm5WdVkzUnBiMjRnWDJOc1lYTnpRMkZzYkVOb1pXTnJLR2x1YzNSaGJtTmxMQ0JEYjI1emRISjFZM1J2Y2lrZ2V5QnBaaUFvSVNocGJuTjBZVzVqWlNCcGJuTjBZVzVqWlc5bUlFTnZibk4wY25WamRHOXlLU2tnZXlCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtGd2lRMkZ1Ym05MElHTmhiR3dnWVNCamJHRnpjeUJoY3lCaElHWjFibU4wYVc5dVhDSXBPeUI5SUgxY2JseHVkbUZ5SUY5cFpHVnVkR2xtYVdWeUlEMGdYMlJsY21WeFh5aGNJaTR2YVdSbGJuUnBabWxsY2x3aUtUdGNibHh1ZG1GeUlGOTBiMnRsYm5SNWNHVWdQU0JmWkdWeVpYRmZLRndpTGk5MGIydGxiblI1Y0dWY0lpazdYRzVjYm5aaGNpQmZjM1JoZEdVZ1BTQmZaR1Z5WlhGZktGd2lMaTl6ZEdGMFpWd2lLVHRjYmx4dWRtRnlJRjlzYjJOMWRHbHNJRDBnWDJSbGNtVnhYeWhjSWk0dmJHOWpkWFJwYkZ3aUtUdGNibHh1ZG1GeUlGOTNhR2wwWlhOd1lXTmxJRDBnWDJSbGNtVnhYeWhjSWk0dmQyaHBkR1Z6Y0dGalpWd2lLVHRjYmx4dUx5OGdUMkpxWldOMElIUjVjR1VnZFhObFpDQjBieUJ5WlhCeVpYTmxiblFnZEc5clpXNXpMaUJPYjNSbElIUm9ZWFFnYm05eWJXRnNiSGtzSUhSdmEyVnVjMXh1THk4Z2MybHRjR3g1SUdWNGFYTjBJR0Z6SUhCeWIzQmxjblJwWlhNZ2IyNGdkR2hsSUhCaGNuTmxjaUJ2WW1wbFkzUXVJRlJvYVhNZ2FYTWdiMjVzZVZ4dUx5OGdkWE5sWkNCbWIzSWdkR2hsSUc5dVZHOXJaVzRnWTJGc2JHSmhZMnNnWVc1a0lIUm9aU0JsZUhSbGNtNWhiQ0IwYjJ0bGJtbDZaWEl1WEc1Y2JuWmhjaUJVYjJ0bGJpQTlJR1oxYm1OMGFXOXVJRlJ2YTJWdUtIQXBJSHRjYmlBZ1gyTnNZWE56UTJGc2JFTm9aV05yS0hSb2FYTXNJRlJ2YTJWdUtUdGNibHh1SUNCMGFHbHpMblI1Y0dVZ1BTQndMblI1Y0dVN1hHNGdJSFJvYVhNdWRtRnNkV1VnUFNCd0xuWmhiSFZsTzF4dUlDQjBhR2x6TG5OMFlYSjBJRDBnY0M1emRHRnlkRHRjYmlBZ2RHaHBjeTVsYm1RZ1BTQndMbVZ1WkR0Y2JpQWdhV1lnS0hBdWIzQjBhVzl1Y3k1c2IyTmhkR2x2Ym5NcElIUm9hWE11Ykc5aklEMGdibVYzSUY5c2IyTjFkR2xzTGxOdmRYSmpaVXh2WTJGMGFXOXVLSEFzSUhBdWMzUmhjblJNYjJNc0lIQXVaVzVrVEc5aktUdGNiaUFnYVdZZ0tIQXViM0IwYVc5dWN5NXlZVzVuWlhNcElIUm9hWE11Y21GdVoyVWdQU0JiY0M1emRHRnlkQ3dnY0M1bGJtUmRPMXh1ZlZ4dVhHNHZMeUFqSXlCVWIydGxibWw2WlhKY2JseHVPMXh1WEc1bGVIQnZjblJ6TGxSdmEyVnVJRDBnVkc5clpXNDdYRzUyWVhJZ2NIQWdQU0JmYzNSaGRHVXVVR0Z5YzJWeUxuQnliM1J2ZEhsd1pUdGNibHh1THk4Z1FYSmxJSGRsSUhKMWJtNXBibWNnZFc1a1pYSWdVbWhwYm04L1hHNTJZWElnYVhOU2FHbHVieUE5SUhSNWNHVnZaaUJRWVdOcllXZGxjeUE5UFNCY0ltOWlhbVZqZEZ3aUlDWW1JRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNoUVlXTnJZV2RsY3lrZ1BUMGdYQ0piYjJKcVpXTjBJRXBoZG1GUVlXTnJZV2RsWFZ3aU8xeHVYRzR2THlCTmIzWmxJSFJ2SUhSb1pTQnVaWGgwSUhSdmEyVnVYRzVjYm5Cd0xtNWxlSFFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUdsbUlDaDBhR2x6TG05d2RHbHZibk11YjI1VWIydGxiaWtnZEdocGN5NXZjSFJwYjI1ekxtOXVWRzlyWlc0b2JtVjNJRlJ2YTJWdUtIUm9hWE1wS1R0Y2JseHVJQ0IwYUdsekxteGhjM1JVYjJ0RmJtUWdQU0IwYUdsekxtVnVaRHRjYmlBZ2RHaHBjeTVzWVhOMFZHOXJVM1JoY25RZ1BTQjBhR2x6TG5OMFlYSjBPMXh1SUNCMGFHbHpMbXhoYzNSVWIydEZibVJNYjJNZ1BTQjBhR2x6TG1WdVpFeHZZenRjYmlBZ2RHaHBjeTVzWVhOMFZHOXJVM1JoY25STWIyTWdQU0IwYUdsekxuTjBZWEowVEc5ak8xeHVJQ0IwYUdsekxtNWxlSFJVYjJ0bGJpZ3BPMXh1ZlR0Y2JseHVjSEF1WjJWMFZHOXJaVzRnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhSb2FYTXVibVY0ZENncE8xeHVJQ0J5WlhSMWNtNGdibVYzSUZSdmEyVnVLSFJvYVhNcE8xeHVmVHRjYmx4dUx5OGdTV1lnZDJVbmNtVWdhVzRnWVc0Z1JWTTJJR1Z1ZG1seWIyNXRaVzUwTENCdFlXdGxJSEJoY25ObGNuTWdhWFJsY21GaWJHVmNibWxtSUNoMGVYQmxiMllnVTNsdFltOXNJQ0U5UFNCY0luVnVaR1ZtYVc1bFpGd2lLU0J3Y0Z0VGVXMWliMnd1YVhSbGNtRjBiM0pkSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCMllYSWdjMlZzWmlBOUlIUm9hWE03WEc0Z0lISmxkSFZ5YmlCN0lHNWxlSFE2SUdaMWJtTjBhVzl1SUc1bGVIUW9LU0I3WEc0Z0lDQWdJQ0IyWVhJZ2RHOXJaVzRnUFNCelpXeG1MbWRsZEZSdmEyVnVLQ2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdJQ0JrYjI1bE9pQjBiMnRsYmk1MGVYQmxJRDA5UFNCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1WdlppeGNiaUFnSUNBZ0lDQWdkbUZzZFdVNklIUnZhMlZ1WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJSDBnZlR0Y2JuMDdYRzVjYmk4dklGUnZaMmRzWlNCemRISnBZM1FnYlc5a1pTNGdVbVV0Y21WaFpITWdkR2hsSUc1bGVIUWdiblZ0WW1WeUlHOXlJSE4wY21sdVp5QjBieUJ3YkdWaGMyVmNiaTh2SUhCbFpHRnVkR2xqSUhSbGMzUnpJQ2hnWENKMWMyVWdjM1J5YVdOMFhDSTdJREF4TUR0Z0lITm9iM1ZzWkNCbVlXbHNLUzVjYmx4dWNIQXVjMlYwVTNSeWFXTjBJRDBnWm5WdVkzUnBiMjRnS0hOMGNtbGpkQ2tnZTF4dUlDQjBhR2x6TG5OMGNtbGpkQ0E5SUhOMGNtbGpkRHRjYmlBZ2FXWWdLSFJvYVhNdWRIbHdaU0FoUFQwZ1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1dWRXMGdKaVlnZEdocGN5NTBlWEJsSUNFOVBTQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxuTjBjbWx1WnlrZ2NtVjBkWEp1TzF4dUlDQjBhR2x6TG5CdmN5QTlJSFJvYVhNdWMzUmhjblE3WEc0Z0lHbG1JQ2gwYUdsekxtOXdkR2x2Ym5NdWJHOWpZWFJwYjI1ektTQjdYRzRnSUNBZ2QyaHBiR1VnS0hSb2FYTXVjRzl6SUR3Z2RHaHBjeTVzYVc1bFUzUmhjblFwSUh0Y2JpQWdJQ0FnSUhSb2FYTXViR2x1WlZOMFlYSjBJRDBnZEdocGN5NXBibkIxZEM1c1lYTjBTVzVrWlhoUFppaGNJbHhjYmx3aUxDQjBhR2x6TG14cGJtVlRkR0Z5ZENBdElESXBJQ3NnTVR0Y2JpQWdJQ0FnSUMwdGRHaHBjeTVqZFhKTWFXNWxPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQjBhR2x6TG01bGVIUlViMnRsYmlncE8xeHVmVHRjYmx4dWNIQXVZM1Z5UTI5dWRHVjRkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnY21WMGRYSnVJSFJvYVhNdVkyOXVkR1Y0ZEZ0MGFHbHpMbU52Ym5SbGVIUXViR1Z1WjNSb0lDMGdNVjA3WEc1OU8xeHVYRzR2THlCU1pXRmtJR0VnYzJsdVoyeGxJSFJ2YTJWdUxDQjFjR1JoZEdsdVp5QjBhR1VnY0dGeWMyVnlJRzlpYW1WamRDZHpJSFJ2YTJWdUxYSmxiR0YwWldSY2JpOHZJSEJ5YjNCbGNuUnBaWE11WEc1Y2JuQndMbTVsZUhSVWIydGxiaUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnZG1GeUlHTjFja052Ym5SbGVIUWdQU0IwYUdsekxtTjFja052Ym5SbGVIUW9LVHRjYmlBZ2FXWWdLQ0ZqZFhKRGIyNTBaWGgwSUh4OElDRmpkWEpEYjI1MFpYaDBMbkJ5WlhObGNuWmxVM0JoWTJVcElIUm9hWE11YzJ0cGNGTndZV05sS0NrN1hHNWNiaUFnZEdocGN5NXpkR0Z5ZENBOUlIUm9hWE11Y0c5ek8xeHVJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbXh2WTJGMGFXOXVjeWtnZEdocGN5NXpkR0Z5ZEV4dll5QTlJSFJvYVhNdVkzVnlVRzl6YVhScGIyNG9LVHRjYmlBZ2FXWWdLSFJvYVhNdWNHOXpJRDQ5SUhSb2FYTXVhVzV3ZFhRdWJHVnVaM1JvS1NCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbVZ2WmlrN1hHNWNiaUFnYVdZZ0tHTjFja052Ym5SbGVIUXViM1psY25KcFpHVXBJSEpsZEhWeWJpQmpkWEpEYjI1MFpYaDBMbTkyWlhKeWFXUmxLSFJvYVhNcE8yVnNjMlVnZEdocGN5NXlaV0ZrVkc5clpXNG9kR2hwY3k1bWRXeHNRMmhoY2tOdlpHVkJkRkJ2Y3lncEtUdGNibjA3WEc1Y2JuQndMbkpsWVdSVWIydGxiaUE5SUdaMWJtTjBhVzl1SUNoamIyUmxLU0I3WEc0Z0lDOHZJRWxrWlc1MGFXWnBaWElnYjNJZ2EyVjVkMjl5WkM0Z0oxeGNkVmhZV0ZnbklITmxjWFZsYm1ObGN5QmhjbVVnWVd4c2IzZGxaQ0JwYmx4dUlDQXZMeUJwWkdWdWRHbG1hV1Z5Y3l3Z2MyOGdKMXhjSnlCaGJITnZJR1JwYzNCaGRHTm9aWE1nZEc4Z2RHaGhkQzVjYmlBZ2FXWWdLRjlwWkdWdWRHbG1hV1Z5TG1selNXUmxiblJwWm1sbGNsTjBZWEowS0dOdlpHVXNJSFJvYVhNdWIzQjBhVzl1Y3k1bFkyMWhWbVZ5YzJsdmJpQStQU0EyS1NCOGZDQmpiMlJsSUQwOVBTQTVNaUF2S2lBblhGd25JQ292S1NCeVpYUjFjbTRnZEdocGN5NXlaV0ZrVjI5eVpDZ3BPMXh1WEc0Z0lISmxkSFZ5YmlCMGFHbHpMbWRsZEZSdmEyVnVSbkp2YlVOdlpHVW9ZMjlrWlNrN1hHNTlPMXh1WEc1d2NDNW1kV3hzUTJoaGNrTnZaR1ZCZEZCdmN5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdkbUZ5SUdOdlpHVWdQU0IwYUdsekxtbHVjSFYwTG1Ob1lYSkRiMlJsUVhRb2RHaHBjeTV3YjNNcE8xeHVJQ0JwWmlBb1kyOWtaU0E4UFNBd2VHUTNabVlnZkh3Z1kyOWtaU0ErUFNBd2VHVXdNREFwSUhKbGRIVnliaUJqYjJSbE8xeHVJQ0IyWVhJZ2JtVjRkQ0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5QXJJREVwTzF4dUlDQnlaWFIxY200Z0tHTnZaR1VnUER3Z01UQXBJQ3NnYm1WNGRDQXRJREI0TXpWbVpHTXdNRHRjYm4wN1hHNWNibkJ3TG5OcmFYQkNiRzlqYTBOdmJXMWxiblFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhaaGNpQnpkR0Z5ZEV4dll5QTlJSFJvYVhNdWIzQjBhVzl1Y3k1dmJrTnZiVzFsYm5RZ0ppWWdkR2hwY3k1amRYSlFiM05wZEdsdmJpZ3BPMXh1SUNCMllYSWdjM1JoY25RZ1BTQjBhR2x6TG5CdmN5eGNiaUFnSUNBZ0lHVnVaQ0E5SUhSb2FYTXVhVzV3ZFhRdWFXNWtaWGhQWmloY0lpb3ZYQ0lzSUhSb2FYTXVjRzl6SUNzOUlESXBPMXh1SUNCcFppQW9aVzVrSUQwOVBTQXRNU2tnZEdocGN5NXlZV2x6WlNoMGFHbHpMbkJ2Y3lBdElESXNJRndpVlc1MFpYSnRhVzVoZEdWa0lHTnZiVzFsYm5SY0lpazdYRzRnSUhSb2FYTXVjRzl6SUQwZ1pXNWtJQ3NnTWp0Y2JpQWdhV1lnS0hSb2FYTXViM0IwYVc5dWN5NXNiMk5oZEdsdmJuTXBJSHRjYmlBZ0lDQmZkMmhwZEdWemNHRmpaUzVzYVc1bFFuSmxZV3RITG14aGMzUkpibVJsZUNBOUlITjBZWEowTzF4dUlDQWdJSFpoY2lCdFlYUmphQ0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0IzYUdsc1pTQW9LRzFoZEdOb0lEMGdYM2RvYVhSbGMzQmhZMlV1YkdsdVpVSnlaV0ZyUnk1bGVHVmpLSFJvYVhNdWFXNXdkWFFwS1NBbUppQnRZWFJqYUM1cGJtUmxlQ0E4SUhSb2FYTXVjRzl6S1NCN1hHNGdJQ0FnSUNBckszUm9hWE11WTNWeVRHbHVaVHRjYmlBZ0lDQWdJSFJvYVhNdWJHbHVaVk4wWVhKMElEMGdiV0YwWTJndWFXNWtaWGdnS3lCdFlYUmphRnN3WFM1c1pXNW5kR2c3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXViMjVEYjIxdFpXNTBLU0IwYUdsekxtOXdkR2x2Ym5NdWIyNURiMjF0Wlc1MEtIUnlkV1VzSUhSb2FYTXVhVzV3ZFhRdWMyeHBZMlVvYzNSaGNuUWdLeUF5TENCbGJtUXBMQ0J6ZEdGeWRDd2dkR2hwY3k1d2IzTXNJSE4wWVhKMFRHOWpMQ0IwYUdsekxtTjFjbEJ2YzJsMGFXOXVLQ2twTzF4dWZUdGNibHh1Y0hBdWMydHBjRXhwYm1WRGIyMXRaVzUwSUQwZ1puVnVZM1JwYjI0Z0tITjBZWEowVTJ0cGNDa2dlMXh1SUNCMllYSWdjM1JoY25RZ1BTQjBhR2x6TG5CdmN6dGNiaUFnZG1GeUlITjBZWEowVEc5aklEMGdkR2hwY3k1dmNIUnBiMjV6TG05dVEyOXRiV1Z1ZENBbUppQjBhR2x6TG1OMWNsQnZjMmwwYVc5dUtDazdYRzRnSUhaaGNpQmphQ0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5QXJQU0J6ZEdGeWRGTnJhWEFwTzF4dUlDQjNhR2xzWlNBb2RHaHBjeTV3YjNNZ1BDQjBhR2x6TG1sdWNIVjBMbXhsYm1kMGFDQW1KaUJqYUNBaFBUMGdNVEFnSmlZZ1kyZ2dJVDA5SURFeklDWW1JR05vSUNFOVBTQTRNak15SUNZbUlHTm9JQ0U5UFNBNE1qTXpLU0I3WEc0Z0lDQWdLeXQwYUdsekxuQnZjenRjYmlBZ0lDQmphQ0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5azdYRzRnSUgxY2JpQWdhV1lnS0hSb2FYTXViM0IwYVc5dWN5NXZia052YlcxbGJuUXBJSFJvYVhNdWIzQjBhVzl1Y3k1dmJrTnZiVzFsYm5Rb1ptRnNjMlVzSUhSb2FYTXVhVzV3ZFhRdWMyeHBZMlVvYzNSaGNuUWdLeUJ6ZEdGeWRGTnJhWEFzSUhSb2FYTXVjRzl6S1N3Z2MzUmhjblFzSUhSb2FYTXVjRzl6TENCemRHRnlkRXh2WXl3Z2RHaHBjeTVqZFhKUWIzTnBkR2x2YmlncEtUdGNibjA3WEc1Y2JpOHZJRU5oYkd4bFpDQmhkQ0IwYUdVZ2MzUmhjblFnYjJZZ2RHaGxJSEJoY25ObElHRnVaQ0JoWm5SbGNpQmxkbVZ5ZVNCMGIydGxiaTRnVTJ0cGNITmNiaTh2SUhkb2FYUmxjM0JoWTJVZ1lXNWtJR052YlcxbGJuUnpMQ0JoYm1RdVhHNWNibkJ3TG5OcmFYQlRjR0ZqWlNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2JHOXZjRG9nZDJocGJHVWdLSFJvYVhNdWNHOXpJRHdnZEdocGN5NXBibkIxZEM1c1pXNW5kR2dwSUh0Y2JpQWdJQ0IyWVhJZ1kyZ2dQU0IwYUdsekxtbHVjSFYwTG1Ob1lYSkRiMlJsUVhRb2RHaHBjeTV3YjNNcE8xeHVJQ0FnSUhOM2FYUmphQ0FvWTJncElIdGNiaUFnSUNBZ0lHTmhjMlVnTXpJNlkyRnpaU0F4TmpBNlhHNGdJQ0FnSUNBZ0lDOHZJQ2NnSjF4dUlDQWdJQ0FnSUNBckszUm9hWE11Y0c5ek8xeHVJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUdOaGMyVWdNVE02WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvZEdocGN5NXdiM01nS3lBeEtTQTlQVDBnTVRBcElIdGNiaUFnSUNBZ0lDQWdJQ0FySzNSb2FYTXVjRzl6TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCallYTmxJREV3T21OaGMyVWdPREl6TWpwallYTmxJRGd5TXpNNlhHNGdJQ0FnSUNBZ0lDc3JkR2hwY3k1d2IzTTdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXViRzlqWVhScGIyNXpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0t5dDBhR2x6TG1OMWNreHBibVU3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVzYVc1bFUzUmhjblFnUFNCMGFHbHpMbkJ2Y3p0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUdOaGMyVWdORGM2WEc0Z0lDQWdJQ0FnSUM4dklDY3ZKMXh1SUNBZ0lDQWdJQ0J6ZDJsMFkyZ2dLSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklERXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1kyRnpaU0EwTWpwY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUNjcUoxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXphMmx3UW14dlkydERiMjF0Wlc1MEtDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNCallYTmxJRFEzT2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emEybHdUR2x1WlVOdmJXMWxiblFvTWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lDQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3NnYkc5dmNEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lHUmxabUYxYkhRNlhHNGdJQ0FnSUNBZ0lHbG1JQ2hqYUNBK0lEZ2dKaVlnWTJnZ1BDQXhOQ0I4ZkNCamFDQStQU0ExTnpZd0lDWW1JRjkzYUdsMFpYTndZV05sTG01dmJrRlRRMGxKZDJocGRHVnpjR0ZqWlM1MFpYTjBLRk4wY21sdVp5NW1jbTl0UTJoaGNrTnZaR1VvWTJncEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNzcmRHaHBjeTV3YjNNN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdZbkpsWVdzZ2JHOXZjRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVmVHRjYmx4dUx5OGdRMkZzYkdWa0lHRjBJSFJvWlNCbGJtUWdiMllnWlhabGNua2dkRzlyWlc0dUlGTmxkSE1nWUdWdVpHQXNJR0IyWVd4Z0xDQmhibVJjYmk4dklHMWhhVzUwWVdsdWN5QmdZMjl1ZEdWNGRHQWdZVzVrSUdCbGVIQnlRV3hzYjNkbFpHQXNJR0Z1WkNCemEybHdjeUIwYUdVZ2MzQmhZMlVnWVdaMFpYSmNiaTh2SUhSb1pTQjBiMnRsYml3Z2MyOGdkR2hoZENCMGFHVWdibVY0ZENCdmJtVW5jeUJnYzNSaGNuUmdJSGRwYkd3Z2NHOXBiblFnWVhRZ2RHaGxYRzR2THlCeWFXZG9kQ0J3YjNOcGRHbHZiaTVjYmx4dWNIQXVabWx1YVhOb1ZHOXJaVzRnUFNCbWRXNWpkR2x2YmlBb2RIbHdaU3dnZG1Gc0tTQjdYRzRnSUhSb2FYTXVaVzVrSUQwZ2RHaHBjeTV3YjNNN1hHNGdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXViRzlqWVhScGIyNXpLU0IwYUdsekxtVnVaRXh2WXlBOUlIUm9hWE11WTNWeVVHOXphWFJwYjI0b0tUdGNiaUFnZG1GeUlIQnlaWFpVZVhCbElEMGdkR2hwY3k1MGVYQmxPMXh1SUNCMGFHbHpMblI1Y0dVZ1BTQjBlWEJsTzF4dUlDQjBhR2x6TG5aaGJIVmxJRDBnZG1Gc08xeHVYRzRnSUhSb2FYTXVkWEJrWVhSbFEyOXVkR1Y0ZENod2NtVjJWSGx3WlNrN1hHNTlPMXh1WEc0dkx5QWpJeU1nVkc5clpXNGdjbVZoWkdsdVoxeHVYRzR2THlCVWFHbHpJR2x6SUhSb1pTQm1kVzVqZEdsdmJpQjBhR0YwSUdseklHTmhiR3hsWkNCMGJ5Qm1aWFJqYUNCMGFHVWdibVY0ZENCMGIydGxiaTRnU1hSY2JpOHZJR2x6SUhOdmJXVjNhR0YwSUc5aWMyTjFjbVVzSUdKbFkyRjFjMlVnYVhRZ2QyOXlhM01nYVc0Z1kyaGhjbUZqZEdWeUlHTnZaR1Z6SUhKaGRHaGxjbHh1THk4Z2RHaGhiaUJqYUdGeVlXTjBaWEp6TENCaGJtUWdZbVZqWVhWelpTQnZjR1Z5WVhSdmNpQndZWEp6YVc1bklHaGhjeUJpWldWdUlHbHViR2x1WldSY2JpOHZJR2x1ZEc4Z2FYUXVYRzR2TDF4dUx5OGdRV3hzSUdsdUlIUm9aU0J1WVcxbElHOW1JSE53WldWa0xseHVMeTljYm5Cd0xuSmxZV1JVYjJ0bGJsOWtiM1FnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhaaGNpQnVaWGgwSUQwZ2RHaHBjeTVwYm5CMWRDNWphR0Z5UTI5a1pVRjBLSFJvYVhNdWNHOXpJQ3NnTVNrN1hHNGdJR2xtSUNodVpYaDBJRDQ5SURRNElDWW1JRzVsZUhRZ1BEMGdOVGNwSUhKbGRIVnliaUIwYUdsekxuSmxZV1JPZFcxaVpYSW9kSEoxWlNrN1hHNGdJSFpoY2lCdVpYaDBNaUE5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5QXJJRElwTzF4dUlDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtVmpiV0ZXWlhKemFXOXVJRDQ5SURZZ0ppWWdibVY0ZENBOVBUMGdORFlnSmlZZ2JtVjRkRElnUFQwOUlEUTJLU0I3WEc0Z0lDQWdMeThnTkRZZ1BTQmtiM1FnSnk0blhHNGdJQ0FnZEdocGN5NXdiM01nS3owZ016dGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbVZzYkdsd2MybHpLVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FySzNSb2FYTXVjRzl6TzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRlJ2YTJWdUtGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdVpHOTBLVHRjYmlBZ2ZWeHVmVHRjYmx4dWNIQXVjbVZoWkZSdmEyVnVYM05zWVhOb0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQXZMeUFuTHlkY2JpQWdkbUZ5SUc1bGVIUWdQU0IwYUdsekxtbHVjSFYwTG1Ob1lYSkRiMlJsUVhRb2RHaHBjeTV3YjNNZ0t5QXhLVHRjYmlBZ2FXWWdLSFJvYVhNdVpYaHdja0ZzYkc5M1pXUXBJSHRjYmlBZ0lDQXJLM1JvYVhNdWNHOXpPM0psZEhWeWJpQjBhR2x6TG5KbFlXUlNaV2RsZUhBb0tUdGNiaUFnZlZ4dUlDQnBaaUFvYm1WNGRDQTlQVDBnTmpFcElISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFOXdLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZWE56YVdkdUxDQXlLVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1QzQW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXpiR0Z6YUN3Z01TazdYRzU5TzF4dVhHNXdjQzV5WldGa1ZHOXJaVzVmYlhWc2RGOXRiMlIxYkc5ZlpYaHdJRDBnWm5WdVkzUnBiMjRnS0dOdlpHVXBJSHRjYmlBZ0x5OGdKeVVxSjF4dUlDQjJZWElnYm1WNGRDQTlJSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklERXBPMXh1SUNCMllYSWdjMmw2WlNBOUlERTdYRzRnSUhaaGNpQjBiMnRsYm5SNWNHVWdQU0JqYjJSbElEMDlQU0EwTWlBL0lGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWMzUmhjaUE2SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11Ylc5a2RXeHZPMXh1WEc0Z0lDOHZJR1Y0Y0c5dVpXNTBhV0YwYVc5dUlHOXdaWEpoZEc5eUlDb3FJR0Z1WkNBcUtqMWNiaUFnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVsWTIxaFZtVnljMmx2YmlBK1BTQTNJQ1ltSUc1bGVIUWdQVDA5SURReUtTQjdYRzRnSUNBZ0t5dHphWHBsTzF4dUlDQWdJSFJ2YTJWdWRIbHdaU0E5SUY5MGIydGxiblI1Y0dVdWRIbHdaWE11YzNSaGNuTjBZWEk3WEc0Z0lDQWdibVY0ZENBOUlIUm9hWE11YVc1d2RYUXVZMmhoY2tOdlpHVkJkQ2gwYUdsekxuQnZjeUFySURJcE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0c1bGVIUWdQVDA5SURZeEtTQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFBjQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUZ6YzJsbmJpd2djMmw2WlNBcklERXBPMXh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoUGNDaDBiMnRsYm5SNWNHVXNJSE5wZW1VcE8xeHVmVHRjYmx4dWNIQXVjbVZoWkZSdmEyVnVYM0JwY0dWZllXMXdJRDBnWm5WdVkzUnBiMjRnS0dOdlpHVXBJSHRjYmlBZ0x5OGdKM3dtSjF4dUlDQjJZWElnYm1WNGRDQTlJSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklERXBPMXh1SUNCcFppQW9ibVY0ZENBOVBUMGdZMjlrWlNrZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1QzQW9ZMjlrWlNBOVBUMGdNVEkwSUQ4Z1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1c2IyZHBZMkZzVDFJZ09pQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxteHZaMmxqWVd4QlRrUXNJRElwTzF4dUlDQnBaaUFvYm1WNGRDQTlQVDBnTmpFcElISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFOXdLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZWE56YVdkdUxDQXlLVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1QzQW9ZMjlrWlNBOVBUMGdNVEkwSUQ4Z1gzUnZhMlZ1ZEhsd1pTNTBlWEJsY3k1aWFYUjNhWE5sVDFJZ09pQmZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnBkSGRwYzJWQlRrUXNJREVwTzF4dWZUdGNibHh1Y0hBdWNtVmhaRlJ2YTJWdVgyTmhjbVYwSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBdkx5QW5YaWRjYmlBZ2RtRnlJRzVsZUhRZ1BTQjBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvZEdocGN5NXdiM01nS3lBeEtUdGNiaUFnYVdZZ0tHNWxlSFFnUFQwOUlEWXhLU0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhQY0NoZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1GemMybG5iaXdnTWlrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTl3S0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WW1sMGQybHpaVmhQVWl3Z01TazdYRzU5TzF4dVhHNXdjQzV5WldGa1ZHOXJaVzVmY0d4MWMxOXRhVzRnUFNCbWRXNWpkR2x2YmlBb1kyOWtaU2tnZTF4dUlDQXZMeUFuS3kwblhHNGdJSFpoY2lCdVpYaDBJRDBnZEdocGN5NXBibkIxZEM1amFHRnlRMjlrWlVGMEtIUm9hWE11Y0c5eklDc2dNU2s3WEc0Z0lHbG1JQ2h1WlhoMElEMDlQU0JqYjJSbEtTQjdYRzRnSUNBZ2FXWWdLRzVsZUhRZ1BUMGdORFVnSmlZZ2RHaHBjeTVwYm5CMWRDNWphR0Z5UTI5a1pVRjBLSFJvYVhNdWNHOXpJQ3NnTWlrZ1BUMGdOaklnSmlZZ1gzZG9hWFJsYzNCaFkyVXViR2x1WlVKeVpXRnJMblJsYzNRb2RHaHBjeTVwYm5CMWRDNXpiR2xqWlNoMGFHbHpMbXhoYzNSVWIydEZibVFzSUhSb2FYTXVjRzl6S1NrcElIdGNiaUFnSUNBZ0lDOHZJRUVnWUMwdFBtQWdiR2x1WlNCamIyMXRaVzUwWEc0Z0lDQWdJQ0IwYUdsekxuTnJhWEJNYVc1bFEyOXRiV1Z1ZENnektUdGNiaUFnSUNBZ0lIUm9hWE11YzJ0cGNGTndZV05sS0NrN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXVaWGgwVkc5clpXNG9LVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1QzQW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXBibU5FWldNc0lESXBPMXh1SUNCOVhHNGdJR2xtSUNodVpYaDBJRDA5UFNBMk1Ta2djbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UM0FvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVoYzNOcFoyNHNJRElwTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFBjQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkJzZFhOTmFXNHNJREVwTzF4dWZUdGNibHh1Y0hBdWNtVmhaRlJ2YTJWdVgyeDBYMmQwSUQwZ1puVnVZM1JwYjI0Z0tHTnZaR1VwSUh0Y2JpQWdMeThnSnp3K0oxeHVJQ0IyWVhJZ2JtVjRkQ0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5QXJJREVwTzF4dUlDQjJZWElnYzJsNlpTQTlJREU3WEc0Z0lHbG1JQ2h1WlhoMElEMDlQU0JqYjJSbEtTQjdYRzRnSUNBZ2MybDZaU0E5SUdOdlpHVWdQVDA5SURZeUlDWW1JSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklESXBJRDA5UFNBMk1pQS9JRE1nT2lBeU8xeHVJQ0FnSUdsbUlDaDBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvZEdocGN5NXdiM01nS3lCemFYcGxLU0E5UFQwZ05qRXBJSEpsZEhWeWJpQjBhR2x6TG1acGJtbHphRTl3S0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WVhOemFXZHVMQ0J6YVhwbElDc2dNU2s3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11Wm1sdWFYTm9UM0FvWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTVpYVhSVGFHbG1kQ3dnYzJsNlpTazdYRzRnSUgxY2JpQWdhV1lnS0c1bGVIUWdQVDBnTXpNZ0ppWWdZMjlrWlNBOVBTQTJNQ0FtSmlCMGFHbHpMbWx1Y0hWMExtTm9ZWEpEYjJSbFFYUW9kR2hwY3k1d2IzTWdLeUF5S1NBOVBTQTBOU0FtSmlCMGFHbHpMbWx1Y0hWMExtTm9ZWEpEYjJSbFFYUW9kR2hwY3k1d2IzTWdLeUF6S1NBOVBTQTBOU2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbWx1VFc5a2RXeGxLU0IwYUdsekxuVnVaWGh3WldOMFpXUW9LVHRjYmlBZ0lDQXZMeUJnUENFdExXQXNJR0Z1SUZoTlRDMXpkSGxzWlNCamIyMXRaVzUwSUhSb1lYUWdjMmh2ZFd4a0lHSmxJR2x1ZEdWeWNISmxkR1ZrSUdGeklHRWdiR2x1WlNCamIyMXRaVzUwWEc0Z0lDQWdkR2hwY3k1emEybHdUR2x1WlVOdmJXMWxiblFvTkNrN1hHNGdJQ0FnZEdocGN5NXphMmx3VTNCaFkyVW9LVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTV1WlhoMFZHOXJaVzRvS1R0Y2JpQWdmVnh1SUNCcFppQW9ibVY0ZENBOVBUMGdOakVwSUhOcGVtVWdQU0F5TzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFBjQ2hmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkpsYkdGMGFXOXVZV3dzSUhOcGVtVXBPMXh1ZlR0Y2JseHVjSEF1Y21WaFpGUnZhMlZ1WDJWeFgyVjRZMndnUFNCbWRXNWpkR2x2YmlBb1kyOWtaU2tnZTF4dUlDQXZMeUFuUFNFblhHNGdJSFpoY2lCdVpYaDBJRDBnZEdocGN5NXBibkIxZEM1amFHRnlRMjlrWlVGMEtIUm9hWE11Y0c5eklDc2dNU2s3WEc0Z0lHbG1JQ2h1WlhoMElEMDlQU0EyTVNrZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb1QzQW9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NWxjWFZoYkdsMGVTd2dkR2hwY3k1cGJuQjFkQzVqYUdGeVEyOWtaVUYwS0hSb2FYTXVjRzl6SUNzZ01pa2dQVDA5SURZeElEOGdNeUE2SURJcE8xeHVJQ0JwWmlBb1kyOWtaU0E5UFQwZ05qRWdKaVlnYm1WNGRDQTlQVDBnTmpJZ0ppWWdkR2hwY3k1dmNIUnBiMjV6TG1WamJXRldaWEp6YVc5dUlENDlJRFlwSUh0Y2JpQWdJQ0F2THlBblBUNG5YRzRnSUNBZ2RHaHBjeTV3YjNNZ0t6MGdNanRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFViMnRsYmloZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1GeWNtOTNLVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhQY0NoamIyUmxJRDA5UFNBMk1TQS9JRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVaWEVnT2lCZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG5CeVpXWnBlQ3dnTVNrN1hHNTlPMXh1WEc1d2NDNW5aWFJVYjJ0bGJrWnliMjFEYjJSbElEMGdablZ1WTNScGIyNGdLR052WkdVcElIdGNiaUFnYzNkcGRHTm9JQ2hqYjJSbEtTQjdYRzRnSUNBZ0x5OGdWR2hsSUdsdWRHVnljSEpsZEdGMGFXOXVJRzltSUdFZ1pHOTBJR1JsY0dWdVpITWdiMjRnZDJobGRHaGxjaUJwZENCcGN5Qm1iMnhzYjNkbFpGeHVJQ0FnSUM4dklHSjVJR0VnWkdsbmFYUWdiM0lnWVc1dmRHaGxjaUIwZDI4Z1pHOTBjeTVjYmlBZ0lDQmpZWE5sSURRMk9seHVJQ0FnSUNBZ0x5OGdKeTRuWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1eVpXRmtWRzlyWlc1ZlpHOTBLQ2s3WEc1Y2JpQWdJQ0F2THlCUWRXNWpkSFZoZEdsdmJpQjBiMnRsYm5NdVhHNGdJQ0FnWTJGelpTQTBNRHBjYmlBZ0lDQWdJQ3NyZEdocGN5NXdiM003Y21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVkc5clpXNG9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXdZWEpsYmt3cE8xeHVJQ0FnSUdOaGMyVWdOREU2WEc0Z0lDQWdJQ0FySzNSb2FYTXVjRzl6TzNKbGRIVnliaUIwYUdsekxtWnBibWx6YUZSdmEyVnVLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjR0Z5Wlc1U0tUdGNiaUFnSUNCallYTmxJRFU1T2x4dUlDQWdJQ0FnS3l0MGFHbHpMbkJ2Y3p0eVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbk5sYldrcE8xeHVJQ0FnSUdOaGMyVWdORFE2WEc0Z0lDQWdJQ0FySzNSb2FYTXVjRzl6TzNKbGRIVnliaUIwYUdsekxtWnBibWx6YUZSdmEyVnVLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZMjl0YldFcE8xeHVJQ0FnSUdOaGMyVWdPVEU2WEc0Z0lDQWdJQ0FySzNSb2FYTXVjRzl6TzNKbGRIVnliaUIwYUdsekxtWnBibWx6YUZSdmEyVnVLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbkpoWTJ0bGRFd3BPMXh1SUNBZ0lHTmhjMlVnT1RNNlhHNGdJQ0FnSUNBckszUm9hWE11Y0c5ek8zSmxkSFZ5YmlCMGFHbHpMbVpwYm1semFGUnZhMlZ1S0Y5MGIydGxiblI1Y0dVdWRIbHdaWE11WW5KaFkydGxkRklwTzF4dUlDQWdJR05oYzJVZ01USXpPbHh1SUNBZ0lDQWdLeXQwYUdsekxuQnZjenR5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhVYjJ0bGJpaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtSnlZV05sVENrN1hHNGdJQ0FnWTJGelpTQXhNalU2WEc0Z0lDQWdJQ0FySzNSb2FYTXVjRzl6TzNKbGRIVnliaUIwYUdsekxtWnBibWx6YUZSdmEyVnVLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVZbkpoWTJWU0tUdGNiaUFnSUNCallYTmxJRFU0T2x4dUlDQWdJQ0FnS3l0MGFHbHpMbkJ2Y3p0eVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbU52Ykc5dUtUdGNiaUFnSUNCallYTmxJRFl6T2x4dUlDQWdJQ0FnS3l0MGFHbHpMbkJ2Y3p0eVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkYxWlhOMGFXOXVLVHRjYmx4dUlDQWdJR05oYzJVZ09UWTZYRzRnSUNBZ0lDQXZMeUFuWUNkY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RHbHZibk11WldOdFlWWmxjbk5wYjI0Z1BDQTJLU0JpY21WaGF6dGNiaUFnSUNBZ0lDc3JkR2hwY3k1d2IzTTdYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFViMnRsYmloZmRHOXJaVzUwZVhCbExuUjVjR1Z6TG1KaFkydFJkVzkwWlNrN1hHNWNiaUFnSUNCallYTmxJRFE0T2x4dUlDQWdJQ0FnTHk4Z0p6QW5YRzRnSUNBZ0lDQjJZWElnYm1WNGRDQTlJSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklERXBPMXh1SUNBZ0lDQWdhV1lnS0c1bGVIUWdQVDA5SURFeU1DQjhmQ0J1WlhoMElEMDlQU0E0T0NrZ2NtVjBkWEp1SUhSb2FYTXVjbVZoWkZKaFpHbDRUblZ0WW1WeUtERTJLVHNnTHk4Z0p6QjRKeXdnSnpCWUp5QXRJR2hsZUNCdWRXMWlaWEpjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXVaV050WVZabGNuTnBiMjRnUGowZ05pa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtVjRkQ0E5UFQwZ01URXhJSHg4SUc1bGVIUWdQVDA5SURjNUtTQnlaWFIxY200Z2RHaHBjeTV5WldGa1VtRmthWGhPZFcxaVpYSW9PQ2s3SUM4dklDY3dieWNzSUNjd1R5Y2dMU0J2WTNSaGJDQnVkVzFpWlhKY2JpQWdJQ0FnSUNBZ2FXWWdLRzVsZUhRZ1BUMDlJRGs0SUh4OElHNWxlSFFnUFQwOUlEWTJLU0J5WlhSMWNtNGdkR2hwY3k1eVpXRmtVbUZrYVhoT2RXMWlaWElvTWlrN0lDOHZJQ2N3WWljc0lDY3dRaWNnTFNCaWFXNWhjbmtnYm5WdFltVnlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0x5OGdRVzU1ZEdocGJtY2daV3h6WlNCaVpXZHBibTVwYm1jZ2QybDBhQ0JoSUdScFoybDBJR2x6SUdGdUlHbHVkR1ZuWlhJc0lHOWpkR0ZzWEc0Z0lDQWdMeThnYm5WdFltVnlMQ0J2Y2lCbWJHOWhkQzVjYmlBZ0lDQmpZWE5sSURRNU9tTmhjMlVnTlRBNlkyRnpaU0ExTVRwallYTmxJRFV5T21OaGMyVWdOVE02WTJGelpTQTFORHBqWVhObElEVTFPbU5oYzJVZ05UWTZZMkZ6WlNBMU56cGNiaUFnSUNBZ0lDOHZJREV0T1Z4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNtVmhaRTUxYldKbGNpaG1ZV3h6WlNrN1hHNWNiaUFnSUNBdkx5QlJkVzkwWlhNZ2NISnZaSFZqWlNCemRISnBibWR6TGx4dUlDQWdJR05oYzJVZ016UTZZMkZ6WlNBek9UcGNiaUFnSUNBZ0lDOHZJQ2RjSWljc0lGd2lKMXdpWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1eVpXRmtVM1J5YVc1bktHTnZaR1VwTzF4dVhHNGdJQ0FnTHk4Z1QzQmxjbUYwYjNKeklHRnlaU0J3WVhKelpXUWdhVzVzYVc1bElHbHVJSFJwYm5rZ2MzUmhkR1VnYldGamFHbHVaWE11SUNjOUp5QW9OakVwSUdselhHNGdJQ0FnTHk4Z2IyWjBaVzRnY21WbVpYSnlaV1FnZEc4dUlHQm1hVzVwYzJoUGNHQWdjMmx0Y0d4NUlITnJhWEJ6SUhSb1pTQmhiVzkxYm5RZ2IyWmNiaUFnSUNBdkx5QmphR0Z5WVdOMFpYSnpJR2wwSUdseklHZHBkbVZ1SUdGeklITmxZMjl1WkNCaGNtZDFiV1Z1ZEN3Z1lXNWtJSEpsZEhWeWJuTWdZU0IwYjJ0bGJseHVJQ0FnSUM4dklHOW1JSFJvWlNCMGVYQmxJR2RwZG1WdUlHSjVJR2wwY3lCbWFYSnpkQ0JoY21kMWJXVnVkQzVjYmx4dUlDQWdJR05oYzJVZ05EYzZYRzRnSUNBZ0lDQXZMeUFuTHlkY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuSmxZV1JVYjJ0bGJsOXpiR0Z6YUNncE8xeHVYRzRnSUNBZ1kyRnpaU0F6TnpwallYTmxJRFF5T2x4dUlDQWdJQ0FnTHk4Z0p5VXFKMXh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y21WaFpGUnZhMlZ1WDIxMWJIUmZiVzlrZFd4dlgyVjRjQ2hqYjJSbEtUdGNibHh1SUNBZ0lHTmhjMlVnTVRJME9tTmhjMlVnTXpnNlhHNGdJQ0FnSUNBdkx5QW5mQ1luWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1eVpXRmtWRzlyWlc1ZmNHbHdaVjloYlhBb1kyOWtaU2s3WEc1Y2JpQWdJQ0JqWVhObElEazBPbHh1SUNBZ0lDQWdMeThnSjE0blhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXlaV0ZrVkc5clpXNWZZMkZ5WlhRb0tUdGNibHh1SUNBZ0lHTmhjMlVnTkRNNlkyRnpaU0EwTlRwY2JpQWdJQ0FnSUM4dklDY3JMU2RjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5KbFlXUlViMnRsYmw5d2JIVnpYMjFwYmloamIyUmxLVHRjYmx4dUlDQWdJR05oYzJVZ05qQTZZMkZ6WlNBMk1qcGNiaUFnSUNBZ0lDOHZJQ2M4UGlkY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuSmxZV1JVYjJ0bGJsOXNkRjluZENoamIyUmxLVHRjYmx4dUlDQWdJR05oYzJVZ05qRTZZMkZ6WlNBek16cGNiaUFnSUNBZ0lDOHZJQ2M5SVNkY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuSmxZV1JVYjJ0bGJsOWxjVjlsZUdOc0tHTnZaR1VwTzF4dVhHNGdJQ0FnWTJGelpTQXhNalk2WEc0Z0lDQWdJQ0F2THlBbmZpZGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1semFFOXdLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVjSEpsWm1sNExDQXhLVHRjYmlBZ2ZWeHVYRzRnSUhSb2FYTXVjbUZwYzJVb2RHaHBjeTV3YjNNc0lGd2lWVzVsZUhCbFkzUmxaQ0JqYUdGeVlXTjBaWElnSjF3aUlDc2dZMjlrWlZCdmFXNTBWRzlUZEhKcGJtY29ZMjlrWlNrZ0t5QmNJaWRjSWlrN1hHNTlPMXh1WEc1d2NDNW1hVzVwYzJoUGNDQTlJR1oxYm1OMGFXOXVJQ2gwZVhCbExDQnphWHBsS1NCN1hHNGdJSFpoY2lCemRISWdQU0IwYUdsekxtbHVjSFYwTG5Oc2FXTmxLSFJvYVhNdWNHOXpMQ0IwYUdsekxuQnZjeUFySUhOcGVtVXBPMXh1SUNCMGFHbHpMbkJ2Y3lBclBTQnphWHBsTzF4dUlDQnlaWFIxY200Z2RHaHBjeTVtYVc1cGMyaFViMnRsYmloMGVYQmxMQ0J6ZEhJcE8xeHVmVHRjYmx4dUx5OGdVR0Z5YzJVZ1lTQnlaV2QxYkdGeUlHVjRjSEpsYzNOcGIyNHVJRk52YldVZ1kyOXVkR1Y0ZEMxaGQyRnlaVzVsYzNNZ2FYTWdibVZqWlhOellYSjVMRnh1THk4Z2MybHVZMlVnWVNBbkx5Y2dhVzV6YVdSbElHRWdKMXRkSnlCelpYUWdaRzlsY3lCdWIzUWdaVzVrSUhSb1pTQmxlSEJ5WlhOemFXOXVMbHh1WEc1bWRXNWpkR2x2YmlCMGNubERjbVZoZEdWU1pXZGxlSEFvYzNKakxDQm1iR0ZuY3l3Z2RHaHliM2RGY25KdmNrRjBMQ0J3WVhKelpYSXBJSHRjYmlBZ2RISjVJSHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRkpsWjBWNGNDaHpjbU1zSUdac1lXZHpLVHRjYmlBZ2ZTQmpZWFJqYUNBb1pTa2dlMXh1SUNBZ0lHbG1JQ2gwYUhKdmQwVnljbTl5UVhRZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tHVWdhVzV6ZEdGdVkyVnZaaUJUZVc1MFlYaEZjbkp2Y2lrZ2NHRnljMlZ5TG5KaGFYTmxLSFJvY205M1JYSnliM0pCZEN3Z1hDSkZjbkp2Y2lCd1lYSnphVzVuSUhKbFozVnNZWElnWlhod2NtVnpjMmx2YmpvZ1hDSWdLeUJsTG0xbGMzTmhaMlVwTzF4dUlDQWdJQ0FnZEdoeWIzY2daVHRjYmlBZ0lDQjlYRzRnSUgxY2JuMWNibHh1ZG1GeUlISmxaMlY0Y0ZWdWFXTnZaR1ZUZFhCd2IzSjBJRDBnSVNGMGNubERjbVZoZEdWU1pXZGxlSEFvWENMdnY3OWNJaXdnWENKMVhDSXBPMXh1WEc1d2NDNXlaV0ZrVW1WblpYaHdJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0IyWVhJZ1gzUm9hWE1nUFNCMGFHbHpPMXh1WEc0Z0lIWmhjaUJsYzJOaGNHVmtJRDBnZFc1a1pXWnBibVZrTEZ4dUlDQWdJQ0FnYVc1RGJHRnpjeUE5SUhWdVpHVm1hVzVsWkN4Y2JpQWdJQ0FnSUhOMFlYSjBJRDBnZEdocGN5NXdiM003WEc0Z0lHWnZjaUFvT3pzcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1d2IzTWdQajBnZEdocGN5NXBibkIxZEM1c1pXNW5kR2dwSUhSb2FYTXVjbUZwYzJVb2MzUmhjblFzSUZ3aVZXNTBaWEp0YVc1aGRHVmtJSEpsWjNWc1lYSWdaWGh3Y21WemMybHZibHdpS1R0Y2JpQWdJQ0IyWVhJZ1kyZ2dQU0IwYUdsekxtbHVjSFYwTG1Ob1lYSkJkQ2gwYUdsekxuQnZjeWs3WEc0Z0lDQWdhV1lnS0Y5M2FHbDBaWE53WVdObExteHBibVZDY21WaGF5NTBaWE4wS0dOb0tTa2dkR2hwY3k1eVlXbHpaU2h6ZEdGeWRDd2dYQ0pWYm5SbGNtMXBibUYwWldRZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dVhDSXBPMXh1SUNBZ0lHbG1JQ2doWlhOallYQmxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tHTm9JRDA5UFNCY0lsdGNJaWtnYVc1RGJHRnpjeUE5SUhSeWRXVTdaV3h6WlNCcFppQW9ZMmdnUFQwOUlGd2lYVndpSUNZbUlHbHVRMnhoYzNNcElHbHVRMnhoYzNNZ1BTQm1ZV3h6WlR0bGJITmxJR2xtSUNoamFDQTlQVDBnWENJdlhDSWdKaVlnSVdsdVEyeGhjM01wSUdKeVpXRnJPMXh1SUNBZ0lDQWdaWE5qWVhCbFpDQTlJR05vSUQwOVBTQmNJbHhjWEZ4Y0lqdGNiaUFnSUNCOUlHVnNjMlVnWlhOallYQmxaQ0E5SUdaaGJITmxPMXh1SUNBZ0lDc3JkR2hwY3k1d2IzTTdYRzRnSUgxY2JpQWdkbUZ5SUdOdmJuUmxiblFnUFNCMGFHbHpMbWx1Y0hWMExuTnNhV05sS0hOMFlYSjBMQ0IwYUdsekxuQnZjeWs3WEc0Z0lDc3JkR2hwY3k1d2IzTTdYRzRnSUM4dklFNWxaV1FnZEc4Z2RYTmxJR0J5WldGa1YyOXlaREZnSUdKbFkyRjFjMlVnSjF4Y2RWaFlXRmduSUhObGNYVmxibU5sY3lCaGNtVWdZV3hzYjNkbFpGeHVJQ0F2THlCb1pYSmxJQ2hrYjI0bmRDQmhjMnNwTGx4dUlDQjJZWElnYlc5a2N5QTlJSFJvYVhNdWNtVmhaRmR2Y21ReEtDazdYRzRnSUhaaGNpQjBiWEFnUFNCamIyNTBaVzUwTzF4dUlDQnBaaUFvYlc5a2N5a2dlMXh1SUNBZ0lIWmhjaUIyWVd4cFpFWnNZV2R6SUQwZ0wxNWJaMmx0WFNva0x6dGNiaUFnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1WamJXRldaWEp6YVc5dUlENDlJRFlwSUhaaGJHbGtSbXhoWjNNZ1BTQXZYbHRuYVcxMWVWMHFKQzg3WEc0Z0lDQWdhV1lnS0NGMllXeHBaRVpzWVdkekxuUmxjM1FvYlc5a2N5a3BJSFJvYVhNdWNtRnBjMlVvYzNSaGNuUXNJRndpU1c1MllXeHBaQ0J5WldkMWJHRnlJR1Y0Y0hKbGMzTnBiMjRnWm14aFoxd2lLVHRjYmlBZ0lDQnBaaUFvYlc5a2N5NXBibVJsZUU5bUtDZDFKeWtnUGowZ01DQW1KaUFoY21WblpYaHdWVzVwWTI5a1pWTjFjSEJ2Y25RcElIdGNiaUFnSUNBZ0lDOHZJRkpsY0d4aFkyVWdaV0ZqYUNCaGMzUnlZV3dnYzNsdFltOXNJR0Z1WkNCbGRtVnllU0JWYm1samIyUmxJR1Z6WTJGd1pTQnpaWEYxWlc1alpTQjBhR0YwWEc0Z0lDQWdJQ0F2THlCd2IzTnphV0pzZVNCeVpYQnlaWE5sYm5SeklHRnVJR0Z6ZEhKaGJDQnplVzFpYjJ3Z2IzSWdZU0J3WVdseVpXUWdjM1Z5Y205bllYUmxJSGRwZEdnZ1lWeHVJQ0FnSUNBZ0x5OGdjMmx1WjJ4bElFRlRRMGxKSUhONWJXSnZiQ0IwYnlCaGRtOXBaQ0IwYUhKdmQybHVaeUJ2YmlCeVpXZDFiR0Z5SUdWNGNISmxjM05wYjI1eklIUm9ZWFJjYmlBZ0lDQWdJQzh2SUdGeVpTQnZibXg1SUhaaGJHbGtJR2x1SUdOdmJXSnBibUYwYVc5dUlIZHBkR2dnZEdobElHQXZkV0FnWm14aFp5NWNiaUFnSUNBZ0lDOHZJRTV2ZEdVNklISmxjR3hoWTJsdVp5QjNhWFJvSUhSb1pTQkJVME5KU1NCemVXMWliMndnWUhoZ0lHMXBaMmgwSUdOaGRYTmxJR1poYkhObFhHNGdJQ0FnSUNBdkx5QnVaV2RoZEdsMlpYTWdhVzRnZFc1c2FXdGxiSGtnYzJObGJtRnlhVzl6TGlCR2IzSWdaWGhoYlhCc1pTd2dZRnRjWEhWN05qRjlMV0pkWUNCcGN5QmhYRzRnSUNBZ0lDQXZMeUJ3WlhKbVpXTjBiSGtnZG1Gc2FXUWdjR0YwZEdWeWJpQjBhR0YwSUdseklHVnhkV2wyWVd4bGJuUWdkRzhnWUZ0aExXSmRZQ3dnWW5WMElHbDBJSGR2ZFd4a1hHNGdJQ0FnSUNBdkx5QmlaU0J5WlhCc1lXTmxaQ0JpZVNCZ1czZ3RZbDFnSUhkb2FXTm9JSFJvY205M2N5QmhiaUJsY25KdmNpNWNiaUFnSUNBZ0lIUnRjQ0E5SUhSdGNDNXlaWEJzWVdObEtDOWNYRnhjZFZ4Y2V5aGJNQzA1WVMxbVFTMUdYU3NwWEZ4OUwyY3NJR1oxYm1OMGFXOXVJQ2hmYldGMFkyZ3NJR052WkdVc0lHOW1abk5sZENrZ2UxeHVJQ0FnSUNBZ0lDQmpiMlJsSUQwZ1RuVnRZbVZ5S0Z3aU1IaGNJaUFySUdOdlpHVXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb1kyOWtaU0ErSURCNE1UQkdSa1pHS1NCZmRHaHBjeTV5WVdselpTaHpkR0Z5ZENBcklHOW1abk5sZENBcklETXNJRndpUTI5a1pTQndiMmx1ZENCdmRYUWdiMllnWW05MWJtUnpYQ0lwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWENKNFhDSTdYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSFJ0Y0NBOUlIUnRjQzV5WlhCc1lXTmxLQzljWEZ4Y2RTaGJZUzFtUVMxR01DMDVYWHMwZlNsOFcxeGNkVVE0TURBdFhGeDFSRUpHUmwxYlhGeDFSRU13TUMxY1hIVkVSa1pHWFM5bkxDQmNJbmhjSWlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUM4dklFUmxkR1ZqZENCcGJuWmhiR2xrSUhKbFozVnNZWElnWlhod2NtVnpjMmx2Ym5NdVhHNGdJSFpoY2lCMllXeDFaU0E5SUc1MWJHdzdYRzRnSUM4dklGSm9hVzV2SjNNZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dUlIQmhjbk5sY2lCcGN5Qm1iR0ZyZVNCaGJtUWdkR2h5YjNkeklIVnVZMkYwWTJoaFlteGxJR1Y0WTJWd2RHbHZibk1zWEc0Z0lDOHZJSE52SUdSdmJpZDBJR1J2SUdSbGRHVmpkR2x2YmlCcFppQjNaU0JoY21VZ2NuVnVibWx1WnlCMWJtUmxjaUJTYUdsdWIxeHVJQ0JwWmlBb0lXbHpVbWhwYm04cElIdGNiaUFnSUNCMGNubERjbVZoZEdWU1pXZGxlSEFvZEcxd0xDQjFibVJsWm1sdVpXUXNJSE4wWVhKMExDQjBhR2x6S1R0Y2JpQWdJQ0F2THlCSFpYUWdZU0J5WldkMWJHRnlJR1Y0Y0hKbGMzTnBiMjRnYjJKcVpXTjBJR1p2Y2lCMGFHbHpJSEJoZEhSbGNtNHRabXhoWnlCd1lXbHlMQ0J2Y2lCZ2JuVnNiR0FnYVc1Y2JpQWdJQ0F2THlCallYTmxJSFJvWlNCamRYSnlaVzUwSUdWdWRtbHliMjV0Wlc1MElHUnZaWE51SjNRZ2MzVndjRzl5ZENCMGFHVWdabXhoWjNNZ2FYUWdkWE5sY3k1Y2JpQWdJQ0IyWVd4MVpTQTlJSFJ5ZVVOeVpXRjBaVkpsWjJWNGNDaGpiMjUwWlc1MExDQnRiMlJ6S1R0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbkpsWjJWNGNDd2dleUJ3WVhSMFpYSnVPaUJqYjI1MFpXNTBMQ0JtYkdGbmN6b2diVzlrY3l3Z2RtRnNkV1U2SUhaaGJIVmxJSDBwTzF4dWZUdGNibHh1THk4Z1VtVmhaQ0JoYmlCcGJuUmxaMlZ5SUdsdUlIUm9aU0JuYVhabGJpQnlZV1JwZUM0Z1VtVjBkWEp1SUc1MWJHd2dhV1lnZW1WeWJ5QmthV2RwZEhOY2JpOHZJSGRsY21VZ2NtVmhaQ3dnZEdobElHbHVkR1ZuWlhJZ2RtRnNkV1VnYjNSb1pYSjNhWE5sTGlCWGFHVnVJR0JzWlc1Z0lHbHpJR2RwZG1WdUxDQjBhR2x6WEc0dkx5QjNhV3hzSUhKbGRIVnliaUJnYm5Wc2JHQWdkVzVzWlhOeklIUm9aU0JwYm5SbFoyVnlJR2hoY3lCbGVHRmpkR3g1SUdCc1pXNWdJR1JwWjJsMGN5NWNibHh1Y0hBdWNtVmhaRWx1ZENBOUlHWjFibU4wYVc5dUlDaHlZV1JwZUN3Z2JHVnVLU0I3WEc0Z0lIWmhjaUJ6ZEdGeWRDQTlJSFJvYVhNdWNHOXpMRnh1SUNBZ0lDQWdkRzkwWVd3Z1BTQXdPMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnWlNBOUlHeGxiaUE5UFNCdWRXeHNJRDhnU1c1bWFXNXBkSGtnT2lCc1pXNDdJR2tnUENCbE95QXJLMmtwSUh0Y2JpQWdJQ0IyWVhJZ1kyOWtaU0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5a3NYRzRnSUNBZ0lDQWdJSFpoYkNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNCcFppQW9ZMjlrWlNBK1BTQTVOeWtnZG1Gc0lEMGdZMjlrWlNBdElEazNJQ3NnTVRBN0lDOHZJR0ZjYmlBZ0lDQmxiSE5sSUdsbUlDaGpiMlJsSUQ0OUlEWTFLU0IyWVd3Z1BTQmpiMlJsSUMwZ05qVWdLeUF4TURzZ0x5OGdRVnh1SUNBZ0lDQWdaV3h6WlNCcFppQW9ZMjlrWlNBK1BTQTBPQ0FtSmlCamIyUmxJRHc5SURVM0tTQjJZV3dnUFNCamIyUmxJQzBnTkRnN0lDOHZJREF0T1Z4dUlDQWdJQ0FnSUNCbGJITmxJSFpoYkNBOUlFbHVabWx1YVhSNU8xeHVJQ0FnSUdsbUlDaDJZV3dnUGowZ2NtRmthWGdwSUdKeVpXRnJPMXh1SUNBZ0lDc3JkR2hwY3k1d2IzTTdYRzRnSUNBZ2RHOTBZV3dnUFNCMGIzUmhiQ0FxSUhKaFpHbDRJQ3NnZG1Gc08xeHVJQ0I5WEc0Z0lHbG1JQ2gwYUdsekxuQnZjeUE5UFQwZ2MzUmhjblFnZkh3Z2JHVnVJQ0U5SUc1MWJHd2dKaVlnZEdocGN5NXdiM01nTFNCemRHRnlkQ0FoUFQwZ2JHVnVLU0J5WlhSMWNtNGdiblZzYkR0Y2JseHVJQ0J5WlhSMWNtNGdkRzkwWVd3N1hHNTlPMXh1WEc1d2NDNXlaV0ZrVW1Ga2FYaE9kVzFpWlhJZ1BTQm1kVzVqZEdsdmJpQW9jbUZrYVhncElIdGNiaUFnZEdocGN5NXdiM01nS3owZ01qc2dMeThnTUhoY2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhNdWNtVmhaRWx1ZENoeVlXUnBlQ2s3WEc0Z0lHbG1JQ2gyWVd3Z1BUMGdiblZzYkNrZ2RHaHBjeTV5WVdselpTaDBhR2x6TG5OMFlYSjBJQ3NnTWl3Z1hDSkZlSEJsWTNSbFpDQnVkVzFpWlhJZ2FXNGdjbUZrYVhnZ1hDSWdLeUJ5WVdScGVDazdYRzRnSUdsbUlDaGZhV1JsYm5ScFptbGxjaTVwYzBsa1pXNTBhV1pwWlhKVGRHRnlkQ2gwYUdsekxtWjFiR3hEYUdGeVEyOWtaVUYwVUc5ektDa3BLU0IwYUdsekxuSmhhWE5sS0hSb2FYTXVjRzl6TENCY0lrbGtaVzUwYVdacFpYSWdaR2x5WldOMGJIa2dZV1owWlhJZ2JuVnRZbVZ5WENJcE8xeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bWFXNXBjMmhVYjJ0bGJpaGZkRzlyWlc1MGVYQmxMblI1Y0dWekxtNTFiU3dnZG1Gc0tUdGNibjA3WEc1Y2JpOHZJRkpsWVdRZ1lXNGdhVzUwWldkbGNpd2diMk4wWVd3Z2FXNTBaV2RsY2l3Z2IzSWdabXh2WVhScGJtY3RjRzlwYm5RZ2JuVnRZbVZ5TGx4dVhHNXdjQzV5WldGa1RuVnRZbVZ5SUQwZ1puVnVZM1JwYjI0Z0tITjBZWEowYzFkcGRHaEViM1FwSUh0Y2JpQWdkbUZ5SUhOMFlYSjBJRDBnZEdocGN5NXdiM01zWEc0Z0lDQWdJQ0JwYzBac2IyRjBJRDBnWm1Gc2MyVXNYRzRnSUNBZ0lDQnZZM1JoYkNBOUlIUm9hWE11YVc1d2RYUXVZMmhoY2tOdlpHVkJkQ2gwYUdsekxuQnZjeWtnUFQwOUlEUTRPMXh1SUNCcFppQW9JWE4wWVhKMGMxZHBkR2hFYjNRZ0ppWWdkR2hwY3k1eVpXRmtTVzUwS0RFd0tTQTlQVDBnYm5Wc2JDa2dkR2hwY3k1eVlXbHpaU2h6ZEdGeWRDd2dYQ0pKYm5aaGJHbGtJRzUxYldKbGNsd2lLVHRjYmlBZ2RtRnlJRzVsZUhRZ1BTQjBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvZEdocGN5NXdiM01wTzF4dUlDQnBaaUFvYm1WNGRDQTlQVDBnTkRZcElIdGNiaUFnSUNBdkx5QW5MaWRjYmlBZ0lDQXJLM1JvYVhNdWNHOXpPMXh1SUNBZ0lIUm9hWE11Y21WaFpFbHVkQ2d4TUNrN1hHNGdJQ0FnYVhOR2JHOWhkQ0E5SUhSeWRXVTdYRzRnSUNBZ2JtVjRkQ0E5SUhSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDaDBhR2x6TG5CdmN5azdYRzRnSUgxY2JpQWdhV1lnS0c1bGVIUWdQVDA5SURZNUlIeDhJRzVsZUhRZ1BUMDlJREV3TVNrZ2UxeHVJQ0FnSUM4dklDZGxSU2RjYmlBZ0lDQnVaWGgwSUQwZ2RHaHBjeTVwYm5CMWRDNWphR0Z5UTI5a1pVRjBLQ3NyZEdocGN5NXdiM01wTzF4dUlDQWdJR2xtSUNodVpYaDBJRDA5UFNBME15QjhmQ0J1WlhoMElEMDlQU0EwTlNrZ0t5dDBhR2x6TG5CdmN6c2dMeThnSnlzdEoxeHVJQ0FnSUdsbUlDaDBhR2x6TG5KbFlXUkpiblFvTVRBcElEMDlQU0J1ZFd4c0tTQjBhR2x6TG5KaGFYTmxLSE4wWVhKMExDQmNJa2x1ZG1Gc2FXUWdiblZ0WW1WeVhDSXBPMXh1SUNBZ0lHbHpSbXh2WVhRZ1BTQjBjblZsTzF4dUlDQjlYRzRnSUdsbUlDaGZhV1JsYm5ScFptbGxjaTVwYzBsa1pXNTBhV1pwWlhKVGRHRnlkQ2gwYUdsekxtWjFiR3hEYUdGeVEyOWtaVUYwVUc5ektDa3BLU0IwYUdsekxuSmhhWE5sS0hSb2FYTXVjRzl6TENCY0lrbGtaVzUwYVdacFpYSWdaR2x5WldOMGJIa2dZV1owWlhJZ2JuVnRZbVZ5WENJcE8xeHVYRzRnSUhaaGNpQnpkSElnUFNCMGFHbHpMbWx1Y0hWMExuTnNhV05sS0hOMFlYSjBMQ0IwYUdsekxuQnZjeWtzWEc0Z0lDQWdJQ0IyWVd3Z1BTQjFibVJsWm1sdVpXUTdYRzRnSUdsbUlDaHBjMFpzYjJGMEtTQjJZV3dnUFNCd1lYSnpaVVpzYjJGMEtITjBjaWs3Wld4elpTQnBaaUFvSVc5amRHRnNJSHg4SUhOMGNpNXNaVzVuZEdnZ1BUMDlJREVwSUhaaGJDQTlJSEJoY25ObFNXNTBLSE4wY2l3Z01UQXBPMlZzYzJVZ2FXWWdLQzliT0RsZEx5NTBaWE4wS0hOMGNpa2dmSHdnZEdocGN5NXpkSEpwWTNRcElIUm9hWE11Y21GcGMyVW9jM1JoY25Rc0lGd2lTVzUyWVd4cFpDQnVkVzFpWlhKY0lpazdaV3h6WlNCMllXd2dQU0J3WVhKelpVbHVkQ2h6ZEhJc0lEZ3BPMXh1SUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbTUxYlN3Z2RtRnNLVHRjYm4wN1hHNWNiaTh2SUZKbFlXUWdZU0J6ZEhKcGJtY2dkbUZzZFdVc0lHbHVkR1Z5Y0hKbGRHbHVaeUJpWVdOcmMyeGhjMmd0WlhOallYQmxjeTVjYmx4dWNIQXVjbVZoWkVOdlpHVlFiMmx1ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2RtRnlJR05vSUQwZ2RHaHBjeTVwYm5CMWRDNWphR0Z5UTI5a1pVRjBLSFJvYVhNdWNHOXpLU3hjYmlBZ0lDQWdJR052WkdVZ1BTQjFibVJsWm1sdVpXUTdYRzVjYmlBZ2FXWWdLR05vSUQwOVBTQXhNak1wSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbVZqYldGV1pYSnphVzl1SUR3Z05pa2dkR2hwY3k1MWJtVjRjR1ZqZEdWa0tDazdYRzRnSUNBZ2RtRnlJR052WkdWUWIzTWdQU0FySzNSb2FYTXVjRzl6TzF4dUlDQWdJR052WkdVZ1BTQjBhR2x6TG5KbFlXUklaWGhEYUdGeUtIUm9hWE11YVc1d2RYUXVhVzVrWlhoUFppZ25mU2NzSUhSb2FYTXVjRzl6S1NBdElIUm9hWE11Y0c5ektUdGNiaUFnSUNBckszUm9hWE11Y0c5ek8xeHVJQ0FnSUdsbUlDaGpiMlJsSUQ0Z01IZ3hNRVpHUmtZcElIUm9hWE11Y21GcGMyVW9ZMjlrWlZCdmN5d2dYQ0pEYjJSbElIQnZhVzUwSUc5MWRDQnZaaUJpYjNWdVpITmNJaWs3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnWTI5a1pTQTlJSFJvYVhNdWNtVmhaRWhsZUVOb1lYSW9OQ2s3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR052WkdVN1hHNTlPMXh1WEc1bWRXNWpkR2x2YmlCamIyUmxVRzlwYm5SVWIxTjBjbWx1WnloamIyUmxLU0I3WEc0Z0lDOHZJRlZVUmkweE5pQkVaV052WkdsdVoxeHVJQ0JwWmlBb1kyOWtaU0E4UFNBd2VFWkdSa1lwSUhKbGRIVnliaUJUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0dOdlpHVXBPMXh1SUNCamIyUmxJQzA5SURCNE1UQXdNREE3WEc0Z0lISmxkSFZ5YmlCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbEtDaGpiMlJsSUQ0K0lERXdLU0FySURCNFJEZ3dNQ3dnS0dOdlpHVWdKaUF4TURJektTQXJJREI0UkVNd01DazdYRzU5WEc1Y2JuQndMbkpsWVdSVGRISnBibWNnUFNCbWRXNWpkR2x2YmlBb2NYVnZkR1VwSUh0Y2JpQWdkbUZ5SUc5MWRDQTlJRndpWENJc1hHNGdJQ0FnSUNCamFIVnVhMU4wWVhKMElEMGdLeXQwYUdsekxuQnZjenRjYmlBZ1ptOXlJQ2c3T3lrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TG5CdmN5QStQU0IwYUdsekxtbHVjSFYwTG14bGJtZDBhQ2tnZEdocGN5NXlZV2x6WlNoMGFHbHpMbk4wWVhKMExDQmNJbFZ1ZEdWeWJXbHVZWFJsWkNCemRISnBibWNnWTI5dWMzUmhiblJjSWlrN1hHNGdJQ0FnZG1GeUlHTm9JRDBnZEdocGN5NXBibkIxZEM1amFHRnlRMjlrWlVGMEtIUm9hWE11Y0c5ektUdGNiaUFnSUNCcFppQW9ZMmdnUFQwOUlIRjFiM1JsS1NCaWNtVmhhenRjYmlBZ0lDQnBaaUFvWTJnZ1BUMDlJRGt5S1NCN1hHNGdJQ0FnSUNBdkx5QW5YRnduWEc0Z0lDQWdJQ0J2ZFhRZ0t6MGdkR2hwY3k1cGJuQjFkQzV6YkdsalpTaGphSFZ1YTFOMFlYSjBMQ0IwYUdsekxuQnZjeWs3WEc0Z0lDQWdJQ0J2ZFhRZ0t6MGdkR2hwY3k1eVpXRmtSWE5qWVhCbFpFTm9ZWElvWm1Gc2MyVXBPMXh1SUNBZ0lDQWdZMmgxYm10VGRHRnlkQ0E5SUhSb2FYTXVjRzl6TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnBaaUFvWDNkb2FYUmxjM0JoWTJVdWFYTk9aWGRNYVc1bEtHTm9LU2tnZEdocGN5NXlZV2x6WlNoMGFHbHpMbk4wWVhKMExDQmNJbFZ1ZEdWeWJXbHVZWFJsWkNCemRISnBibWNnWTI5dWMzUmhiblJjSWlrN1hHNGdJQ0FnSUNBckszUm9hWE11Y0c5ek8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCdmRYUWdLejBnZEdocGN5NXBibkIxZEM1emJHbGpaU2hqYUhWdWExTjBZWEowTENCMGFHbHpMbkJ2Y3lzcktUdGNiaUFnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVkc5clpXNG9YM1J2YTJWdWRIbHdaUzUwZVhCbGN5NXpkSEpwYm1jc0lHOTFkQ2s3WEc1OU8xeHVYRzR2THlCU1pXRmtjeUIwWlcxd2JHRjBaU0J6ZEhKcGJtY2dkRzlyWlc1ekxseHVYRzV3Y0M1eVpXRmtWRzF3YkZSdmEyVnVJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0IyWVhJZ2IzVjBJRDBnWENKY0lpeGNiaUFnSUNBZ0lHTm9kVzVyVTNSaGNuUWdQU0IwYUdsekxuQnZjenRjYmlBZ1ptOXlJQ2c3T3lrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TG5CdmN5QStQU0IwYUdsekxtbHVjSFYwTG14bGJtZDBhQ2tnZEdocGN5NXlZV2x6WlNoMGFHbHpMbk4wWVhKMExDQmNJbFZ1ZEdWeWJXbHVZWFJsWkNCMFpXMXdiR0YwWlZ3aUtUdGNiaUFnSUNCMllYSWdZMmdnUFNCMGFHbHpMbWx1Y0hWMExtTm9ZWEpEYjJSbFFYUW9kR2hwY3k1d2IzTXBPMXh1SUNBZ0lHbG1JQ2hqYUNBOVBUMGdPVFlnZkh3Z1kyZ2dQVDA5SURNMklDWW1JSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lBcklERXBJRDA5UFNBeE1qTXBJSHRjYmlBZ0lDQWdJQzh2SUNkZ0p5d2dKeVI3SjF4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11Y0c5eklEMDlQU0IwYUdsekxuTjBZWEowSUNZbUlIUm9hWE11ZEhsd1pTQTlQVDBnWDNSdmEyVnVkSGx3WlM1MGVYQmxjeTUwWlcxd2JHRjBaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9ZMmdnUFQwOUlETTJLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV3YjNNZ0t6MGdNanRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbVJ2Ykd4aGNrSnlZV05sVENrN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdLeXQwYUdsekxuQnZjenRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NW1hVzVwYzJoVWIydGxiaWhmZEc5clpXNTBlWEJsTG5SNWNHVnpMbUpoWTJ0UmRXOTBaU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUc5MWRDQXJQU0IwYUdsekxtbHVjSFYwTG5Oc2FXTmxLR05vZFc1clUzUmhjblFzSUhSb2FYTXVjRzl6S1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtWnBibWx6YUZSdmEyVnVLRjkwYjJ0bGJuUjVjR1V1ZEhsd1pYTXVkR1Z0Y0d4aGRHVXNJRzkxZENrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNoamFDQTlQVDBnT1RJcElIdGNiaUFnSUNBZ0lDOHZJQ2RjWENkY2JpQWdJQ0FnSUc5MWRDQXJQU0IwYUdsekxtbHVjSFYwTG5Oc2FXTmxLR05vZFc1clUzUmhjblFzSUhSb2FYTXVjRzl6S1R0Y2JpQWdJQ0FnSUc5MWRDQXJQU0IwYUdsekxuSmxZV1JGYzJOaGNHVmtRMmhoY2loMGNuVmxLVHRjYmlBZ0lDQWdJR05vZFc1clUzUmhjblFnUFNCMGFHbHpMbkJ2Y3p0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0Y5M2FHbDBaWE53WVdObExtbHpUbVYzVEdsdVpTaGphQ2twSUh0Y2JpQWdJQ0FnSUc5MWRDQXJQU0IwYUdsekxtbHVjSFYwTG5Oc2FXTmxLR05vZFc1clUzUmhjblFzSUhSb2FYTXVjRzl6S1R0Y2JpQWdJQ0FnSUNzcmRHaHBjeTV3YjNNN1hHNGdJQ0FnSUNCemQybDBZMmdnS0dOb0tTQjdYRzRnSUNBZ0lDQWdJR05oYzJVZ01UTTZYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YVc1d2RYUXVZMmhoY2tOdlpHVkJkQ2gwYUdsekxuQnZjeWtnUFQwOUlERXdLU0FySzNSb2FYTXVjRzl6TzF4dUlDQWdJQ0FnSUNCallYTmxJREV3T2x4dUlDQWdJQ0FnSUNBZ0lHOTFkQ0FyUFNCY0lseGNibHdpTzF4dUlDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnSUNBZ0lHOTFkQ0FyUFNCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbEtHTm9LVHRjYmlBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEdsdmJuTXViRzlqWVhScGIyNXpLU0I3WEc0Z0lDQWdJQ0FnSUNzcmRHaHBjeTVqZFhKTWFXNWxPMXh1SUNBZ0lDQWdJQ0IwYUdsekxteHBibVZUZEdGeWRDQTlJSFJvYVhNdWNHOXpPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdZMmgxYm10VGRHRnlkQ0E5SUhSb2FYTXVjRzl6TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQXJLM1JvYVhNdWNHOXpPMXh1SUNBZ0lIMWNiaUFnZlZ4dWZUdGNibHh1THk4Z1ZYTmxaQ0IwYnlCeVpXRmtJR1Z6WTJGd1pXUWdZMmhoY21GamRHVnljMXh1WEc1d2NDNXlaV0ZrUlhOallYQmxaRU5vWVhJZ1BTQm1kVzVqZEdsdmJpQW9hVzVVWlcxd2JHRjBaU2tnZTF4dUlDQjJZWElnWTJnZ1BTQjBhR2x6TG1sdWNIVjBMbU5vWVhKRGIyUmxRWFFvS3l0MGFHbHpMbkJ2Y3lrN1hHNGdJQ3NyZEdocGN5NXdiM003WEc0Z0lITjNhWFJqYUNBb1kyZ3BJSHRjYmlBZ0lDQmpZWE5sSURFeE1EcGNiaUFnSUNBZ0lISmxkSFZ5YmlCY0lseGNibHdpT3lBdkx5QW5iaWNnTFQ0Z0oxeGNiaWRjYmlBZ0lDQmpZWE5sSURFeE5EcGNiaUFnSUNBZ0lISmxkSFZ5YmlCY0lseGNjbHdpT3lBdkx5QW5jaWNnTFQ0Z0oxeGNjaWRjYmlBZ0lDQmpZWE5sSURFeU1EcGNiaUFnSUNBZ0lISmxkSFZ5YmlCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbEtIUm9hWE11Y21WaFpFaGxlRU5vWVhJb01pa3BPeUF2THlBbmVDZGNiaUFnSUNCallYTmxJREV4TnpwY2JpQWdJQ0FnSUhKbGRIVnliaUJqYjJSbFVHOXBiblJVYjFOMGNtbHVaeWgwYUdsekxuSmxZV1JEYjJSbFVHOXBiblFvS1NrN0lDOHZJQ2QxSjF4dUlDQWdJR05oYzJVZ01URTJPbHh1SUNBZ0lDQWdjbVYwZFhKdUlGd2lYRngwWENJN0lDOHZJQ2QwSnlBdFBpQW5YRngwSjF4dUlDQWdJR05oYzJVZ09UZzZYRzRnSUNBZ0lDQnlaWFIxY200Z1hDSmNYR0pjSWpzZ0x5OGdKMkluSUMwK0lDZGNYR0luWEc0Z0lDQWdZMkZ6WlNBeE1UZzZYRzRnSUNBZ0lDQnlaWFIxY200Z1hDSmNYSFV3TURCaVhDSTdJQzh2SUNkMkp5QXRQaUFuWEZ4MU1EQXdZaWRjYmlBZ0lDQmpZWE5sSURFd01qcGNiaUFnSUNBZ0lISmxkSFZ5YmlCY0lseGNabHdpT3lBdkx5QW5aaWNnTFQ0Z0oxeGNaaWRjYmlBZ0lDQmpZWE5sSURFek9seHVJQ0FnSUNBZ2FXWWdLSFJvYVhNdWFXNXdkWFF1WTJoaGNrTnZaR1ZCZENoMGFHbHpMbkJ2Y3lrZ1BUMDlJREV3S1NBckszUm9hWE11Y0c5ek95QXZMeUFuWEZ4eVhGeHVKMXh1SUNBZ0lHTmhjMlVnTVRBNlhHNGdJQ0FnSUNBdkx5QW5JRnhjYmlkY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RHbHZibk11Ykc5allYUnBiMjV6S1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YkdsdVpWTjBZWEowSUQwZ2RHaHBjeTV3YjNNN0t5dDBhR2x6TG1OMWNreHBibVU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdYQ0pjSWp0Y2JpQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdhV1lnS0dOb0lENDlJRFE0SUNZbUlHTm9JRHc5SURVMUtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCdlkzUmhiRk4wY2lBOUlIUm9hWE11YVc1d2RYUXVjM1ZpYzNSeUtIUm9hWE11Y0c5eklDMGdNU3dnTXlrdWJXRjBZMmdvTDE1Yk1DMDNYU3N2S1Zzd1hUdGNiaUFnSUNBZ0lDQWdkbUZ5SUc5amRHRnNJRDBnY0dGeWMyVkpiblFvYjJOMFlXeFRkSElzSURncE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYjJOMFlXd2dQaUF5TlRVcElIdGNiaUFnSUNBZ0lDQWdJQ0J2WTNSaGJGTjBjaUE5SUc5amRHRnNVM1J5TG5Oc2FXTmxLREFzSUMweEtUdGNiaUFnSUNBZ0lDQWdJQ0J2WTNSaGJDQTlJSEJoY25ObFNXNTBLRzlqZEdGc1UzUnlMQ0E0S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnBaaUFvYjJOMFlXeFRkSElnSVQwOUlGd2lNRndpSUNZbUlDaDBhR2x6TG5OMGNtbGpkQ0I4ZkNCcGJsUmxiWEJzWVhSbEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbUZwYzJVb2RHaHBjeTV3YjNNZ0xTQXlMQ0JjSWs5amRHRnNJR3hwZEdWeVlXd2dhVzRnYzNSeWFXTjBJRzF2WkdWY0lpazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZEdocGN5NXdiM01nS3owZ2IyTjBZV3hUZEhJdWJHVnVaM1JvSUMwZ01UdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGTjBjbWx1Wnk1bWNtOXRRMmhoY2tOdlpHVW9iMk4wWVd3cE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBkWEp1SUZOMGNtbHVaeTVtY205dFEyaGhja052WkdVb1kyZ3BPMXh1SUNCOVhHNTlPMXh1WEc0dkx5QlZjMlZrSUhSdklISmxZV1FnWTJoaGNtRmpkR1Z5SUdWelkyRndaU0J6WlhGMVpXNWpaWE1nS0NkY1hIZ25MQ0FuWEZ4MUp5d2dKMXhjVlNjcExseHVYRzV3Y0M1eVpXRmtTR1Y0UTJoaGNpQTlJR1oxYm1OMGFXOXVJQ2hzWlc0cElIdGNiaUFnZG1GeUlHTnZaR1ZRYjNNZ1BTQjBhR2x6TG5CdmN6dGNiaUFnZG1GeUlHNGdQU0IwYUdsekxuSmxZV1JKYm5Rb01UWXNJR3hsYmlrN1hHNGdJR2xtSUNodUlEMDlQU0J1ZFd4c0tTQjBhR2x6TG5KaGFYTmxLR052WkdWUWIzTXNJRndpUW1Ga0lHTm9ZWEpoWTNSbGNpQmxjMk5oY0dVZ2MyVnhkV1Z1WTJWY0lpazdYRzRnSUhKbGRIVnliaUJ1TzF4dWZUdGNibHh1THk4Z1VtVmhaQ0JoYmlCcFpHVnVkR2xtYVdWeUxDQmhibVFnY21WMGRYSnVJR2wwSUdGeklHRWdjM1J5YVc1bkxpQlRaWFJ6SUdCMGFHbHpMbU52Ym5SaGFXNXpSWE5qWUZ4dUx5OGdkRzhnZDJobGRHaGxjaUIwYUdVZ2QyOXlaQ0JqYjI1MFlXbHVaV1FnWVNBblhGeDFKeUJsYzJOaGNHVXVYRzR2TDF4dUx5OGdTVzVqY21WdFpXNTBZV3hzZVNCaFpHUnpJRzl1YkhrZ1pYTmpZWEJsWkNCamFHRnljeXdnWVdSa2FXNW5JRzkwYUdWeUlHTm9kVzVyY3lCaGN5MXBjMXh1THk4Z1lYTWdZU0J0YVdOeWJ5MXZjSFJwYldsNllYUnBiMjR1WEc1Y2JuQndMbkpsWVdSWGIzSmtNU0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnZEdocGN5NWpiMjUwWVdsdWMwVnpZeUE5SUdaaGJITmxPMXh1SUNCMllYSWdkMjl5WkNBOUlGd2lYQ0lzWEc0Z0lDQWdJQ0JtYVhKemRDQTlJSFJ5ZFdVc1hHNGdJQ0FnSUNCamFIVnVhMU4wWVhKMElEMGdkR2hwY3k1d2IzTTdYRzRnSUhaaGNpQmhjM1J5WVd3Z1BTQjBhR2x6TG05d2RHbHZibk11WldOdFlWWmxjbk5wYjI0Z1BqMGdOanRjYmlBZ2QyaHBiR1VnS0hSb2FYTXVjRzl6SUR3Z2RHaHBjeTVwYm5CMWRDNXNaVzVuZEdncElIdGNiaUFnSUNCMllYSWdZMmdnUFNCMGFHbHpMbVoxYkd4RGFHRnlRMjlrWlVGMFVHOXpLQ2s3WEc0Z0lDQWdhV1lnS0Y5cFpHVnVkR2xtYVdWeUxtbHpTV1JsYm5ScFptbGxja05vWVhJb1kyZ3NJR0Z6ZEhKaGJDa3BJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHOXpJQ3M5SUdOb0lEdzlJREI0Wm1abVppQS9JREVnT2lBeU8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyZ2dQVDA5SURreUtTQjdYRzRnSUNBZ0lDQXZMeUJjSWx4Y1hDSmNiaUFnSUNBZ0lIUm9hWE11WTI5dWRHRnBibk5GYzJNZ1BTQjBjblZsTzF4dUlDQWdJQ0FnZDI5eVpDQXJQU0IwYUdsekxtbHVjSFYwTG5Oc2FXTmxLR05vZFc1clUzUmhjblFzSUhSb2FYTXVjRzl6S1R0Y2JpQWdJQ0FnSUhaaGNpQmxjMk5UZEdGeWRDQTlJSFJvYVhNdWNHOXpPMXh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVhVzV3ZFhRdVkyaGhja052WkdWQmRDZ3JLM1JvYVhNdWNHOXpLU0FoUFNBeE1UY3BJQzh2SUZ3aWRWd2lYRzRnSUNBZ0lDQWdJSFJvYVhNdWNtRnBjMlVvZEdocGN5NXdiM01zSUZ3aVJYaHdaV04wYVc1bklGVnVhV052WkdVZ1pYTmpZWEJsSUhObGNYVmxibU5sSUZ4Y1hGeDFXRmhZV0Z3aUtUdGNiaUFnSUNBZ0lDc3JkR2hwY3k1d2IzTTdYRzRnSUNBZ0lDQjJZWElnWlhOaklEMGdkR2hwY3k1eVpXRmtRMjlrWlZCdmFXNTBLQ2s3WEc0Z0lDQWdJQ0JwWmlBb0lTaG1hWEp6ZENBL0lGOXBaR1Z1ZEdsbWFXVnlMbWx6U1dSbGJuUnBabWxsY2xOMFlYSjBJRG9nWDJsa1pXNTBhV1pwWlhJdWFYTkpaR1Z1ZEdsbWFXVnlRMmhoY2lrb1pYTmpMQ0JoYzNSeVlXd3BLU0IwYUdsekxuSmhhWE5sS0dWelkxTjBZWEowTENCY0lrbHVkbUZzYVdRZ1ZXNXBZMjlrWlNCbGMyTmhjR1ZjSWlrN1hHNGdJQ0FnSUNCM2IzSmtJQ3M5SUdOdlpHVlFiMmx1ZEZSdlUzUnlhVzVuS0dWell5azdYRzRnSUNBZ0lDQmphSFZ1YTFOMFlYSjBJRDBnZEdocGN5NXdiM003WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJSDFjYmlBZ0lDQm1hWEp6ZENBOUlHWmhiSE5sTzF4dUlDQjlYRzRnSUhKbGRIVnliaUIzYjNKa0lDc2dkR2hwY3k1cGJuQjFkQzV6YkdsalpTaGphSFZ1YTFOMFlYSjBMQ0IwYUdsekxuQnZjeWs3WEc1OU8xeHVYRzR2THlCU1pXRmtJR0Z1SUdsa1pXNTBhV1pwWlhJZ2IzSWdhMlY1ZDI5eVpDQjBiMnRsYmk0Z1YybHNiQ0JqYUdWamF5Qm1iM0lnY21WelpYSjJaV1JjYmk4dklIZHZjbVJ6SUhkb1pXNGdibVZqWlhOellYSjVMbHh1WEc1d2NDNXlaV0ZrVjI5eVpDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdkbUZ5SUhkdmNtUWdQU0IwYUdsekxuSmxZV1JYYjNKa01TZ3BPMXh1SUNCMllYSWdkSGx3WlNBOUlGOTBiMnRsYm5SNWNHVXVkSGx3WlhNdWJtRnRaVHRjYmlBZ2FXWWdLQ2gwYUdsekxtOXdkR2x2Ym5NdVpXTnRZVlpsY25OcGIyNGdQajBnTmlCOGZDQWhkR2hwY3k1amIyNTBZV2x1YzBWell5a2dKaVlnZEdocGN5NXJaWGwzYjNKa2N5NTBaWE4wS0hkdmNtUXBLU0IwZVhCbElEMGdYM1J2YTJWdWRIbHdaUzVyWlhsM2IzSmtjMXQzYjNKa1hUdGNiaUFnY21WMGRYSnVJSFJvYVhNdVptbHVhWE5vVkc5clpXNG9kSGx3WlN3Z2QyOXlaQ2s3WEc1OU8xeHVYRzU5TEh0Y0lpNHZhV1JsYm5ScFptbGxjbHdpT2pJc1hDSXVMMnh2WTNWMGFXeGNJam8xTEZ3aUxpOXpkR0YwWlZ3aU9qRXdMRndpTGk5MGIydGxiblI1Y0dWY0lqb3hOQ3hjSWk0dmQyaHBkR1Z6Y0dGalpWd2lPakUyZlYwc01UUTZXMloxYm1OMGFXOXVLRjlrWlhKbGNWOHNiVzlrZFd4bExHVjRjRzl5ZEhNcGUxeHVMeThnSXlNZ1ZHOXJaVzRnZEhsd1pYTmNibHh1THk4Z1ZHaGxJR0Z6YzJsbmJtMWxiblFnYjJZZ1ptbHVaUzFuY21GcGJtVmtMQ0JwYm1admNtMWhkR2x2YmkxallYSnllV2x1WnlCMGVYQmxJRzlpYW1WamRITmNiaTh2SUdGc2JHOTNjeUIwYUdVZ2RHOXJaVzVwZW1WeUlIUnZJSE4wYjNKbElIUm9aU0JwYm1admNtMWhkR2x2YmlCcGRDQm9ZWE1nWVdKdmRYUWdZVnh1THk4Z2RHOXJaVzRnYVc0Z1lTQjNZWGtnZEdoaGRDQnBjeUIyWlhKNUlHTm9aV0Z3SUdadmNpQjBhR1VnY0dGeWMyVnlJSFJ2SUd4dmIyc2dkWEF1WEc1Y2JpOHZJRUZzYkNCMGIydGxiaUIwZVhCbElIWmhjbWxoWW14bGN5QnpkR0Z5ZENCM2FYUm9JR0Z1SUhWdVpHVnljMk52Y21Vc0lIUnZJRzFoYTJVZ2RHaGxiVnh1THk4Z1pXRnplU0IwYnlCeVpXTnZaMjVwZW1VdVhHNWNiaTh2SUZSb1pTQmdZbVZtYjNKbFJYaHdjbUFnY0hKdmNHVnlkSGtnYVhNZ2RYTmxaQ0IwYnlCa2FYTmhiV0pwWjNWaGRHVWdZbVYwZDJWbGJpQnlaV2QxYkdGeVhHNHZMeUJsZUhCeVpYTnphVzl1Y3lCaGJtUWdaR2wyYVhOcGIyNXpMaUJKZENCcGN5QnpaWFFnYjI0Z1lXeHNJSFJ2YTJWdUlIUjVjR1Z6SUhSb1lYUWdZMkZ1WEc0dkx5QmlaU0JtYjJ4c2IzZGxaQ0JpZVNCaGJpQmxlSEJ5WlhOemFXOXVJQ2gwYUhWekxDQmhJSE5zWVhOb0lHRm1kR1Z5SUhSb1pXMGdkMjkxYkdRZ1ltVWdZVnh1THk4Z2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dUtTNWNiaTh2WEc0dkx5QlVhR1VnWUhOMFlYSjBjMFY0Y0hKZ0lIQnliM0JsY25SNUlHbHpJSFZ6WldRZ2RHOGdZMmhsWTJzZ2FXWWdkR2hsSUhSdmEyVnVJR1Z1WkhNZ1lWeHVMeThnWUhscFpXeGtZQ0JsZUhCeVpYTnphVzl1TGlCSmRDQnBjeUJ6WlhRZ2IyNGdZV3hzSUhSdmEyVnVJSFI1Y0dWeklIUm9ZWFFnWldsMGFHVnlJR05oYmx4dUx5OGdaR2x5WldOMGJIa2djM1JoY25RZ1lXNGdaWGh3Y21WemMybHZiaUFvYkdsclpTQmhJSEYxYjNSaGRHbHZiaUJ0WVhKcktTQnZjaUJqWVc1Y2JpOHZJR052Ym5ScGJuVmxJR0Z1SUdWNGNISmxjM05wYjI0Z0tHeHBhMlVnZEdobElHSnZaSGtnYjJZZ1lTQnpkSEpwYm1jcExseHVMeTljYmk4dklHQnBjMHh2YjNCZ0lHMWhjbXR6SUdFZ2EyVjVkMjl5WkNCaGN5QnpkR0Z5ZEdsdVp5QmhJR3h2YjNBc0lIZG9hV05vSUdseklHbHRjRzl5ZEdGdWRGeHVMeThnZEc4Z2EyNXZkeUIzYUdWdUlIQmhjbk5wYm1jZ1lTQnNZV0psYkN3Z2FXNGdiM0prWlhJZ2RHOGdZV3hzYjNjZ2IzSWdaR2x6WVd4c2IzZGNiaTh2SUdOdmJuUnBiblZsSUdwMWJYQnpJSFJ2SUhSb1lYUWdiR0ZpWld3dVhHNWNibHdpZFhObElITjBjbWxqZEZ3aU8xeHVYRzVsZUhCdmNuUnpMbDlmWlhOTmIyUjFiR1VnUFNCMGNuVmxPMXh1WEc1bWRXNWpkR2x2YmlCZlkyeGhjM05EWVd4c1EyaGxZMnNvYVc1emRHRnVZMlVzSUVOdmJuTjBjblZqZEc5eUtTQjdJR2xtSUNnaEtHbHVjM1JoYm1ObElHbHVjM1JoYm1ObGIyWWdRMjl1YzNSeWRXTjBiM0lwS1NCN0lIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9YQ0pEWVc1dWIzUWdZMkZzYkNCaElHTnNZWE56SUdGeklHRWdablZ1WTNScGIyNWNJaWs3SUgwZ2ZWeHVYRzUyWVhJZ1ZHOXJaVzVVZVhCbElEMGdablZ1WTNScGIyNGdWRzlyWlc1VWVYQmxLR3hoWW1Wc0tTQjdYRzRnSUhaaGNpQmpiMjVtSUQwZ1lYSm5kVzFsYm5SekxteGxibWQwYUNBOFBTQXhJSHg4SUdGeVozVnRaVzUwYzFzeFhTQTlQVDBnZFc1a1pXWnBibVZrSUQ4Z2UzMGdPaUJoY21kMWJXVnVkSE5iTVYwN1hHNWNiaUFnWDJOc1lYTnpRMkZzYkVOb1pXTnJLSFJvYVhNc0lGUnZhMlZ1Vkhsd1pTazdYRzVjYmlBZ2RHaHBjeTVzWVdKbGJDQTlJR3hoWW1Wc08xeHVJQ0IwYUdsekxtdGxlWGR2Y21RZ1BTQmpiMjVtTG10bGVYZHZjbVE3WEc0Z0lIUm9hWE11WW1WbWIzSmxSWGh3Y2lBOUlDRWhZMjl1Wmk1aVpXWnZjbVZGZUhCeU8xeHVJQ0IwYUdsekxuTjBZWEowYzBWNGNISWdQU0FoSVdOdmJtWXVjM1JoY25SelJYaHdjanRjYmlBZ2RHaHBjeTVwYzB4dmIzQWdQU0FoSVdOdmJtWXVhWE5NYjI5d08xeHVJQ0IwYUdsekxtbHpRWE56YVdkdUlEMGdJU0ZqYjI1bUxtbHpRWE56YVdkdU8xeHVJQ0IwYUdsekxuQnlaV1pwZUNBOUlDRWhZMjl1Wmk1d2NtVm1hWGc3WEc0Z0lIUm9hWE11Y0c5emRHWnBlQ0E5SUNFaFkyOXVaaTV3YjNOMFptbDRPMXh1SUNCMGFHbHpMbUpwYm05d0lEMGdZMjl1Wmk1aWFXNXZjQ0I4ZkNCdWRXeHNPMXh1SUNCMGFHbHpMblZ3WkdGMFpVTnZiblJsZUhRZ1BTQnVkV3hzTzF4dWZUdGNibHh1Wlhod2IzSjBjeTVVYjJ0bGJsUjVjR1VnUFNCVWIydGxibFI1Y0dVN1hHNWNibVoxYm1OMGFXOXVJR0pwYm05d0tHNWhiV1VzSUhCeVpXTXBJSHRjYmlBZ2NtVjBkWEp1SUc1bGR5QlViMnRsYmxSNWNHVW9ibUZ0WlN3Z2V5QmlaV1p2Y21WRmVIQnlPaUIwY25WbExDQmlhVzV2Y0RvZ2NISmxZeUI5S1R0Y2JuMWNiblpoY2lCaVpXWnZjbVZGZUhCeUlEMGdleUJpWldadmNtVkZlSEJ5T2lCMGNuVmxJSDBzWEc0Z0lDQWdjM1JoY25SelJYaHdjaUE5SUhzZ2MzUmhjblJ6Ulhod2Nqb2dkSEoxWlNCOU8xeHVYRzUyWVhJZ2RIbHdaWE1nUFNCN1hHNGdJRzUxYlRvZ2JtVjNJRlJ2YTJWdVZIbHdaU2hjSW01MWJWd2lMQ0J6ZEdGeWRITkZlSEJ5S1N4Y2JpQWdjbVZuWlhod09pQnVaWGNnVkc5clpXNVVlWEJsS0Z3aWNtVm5aWGh3WENJc0lITjBZWEowYzBWNGNISXBMRnh1SUNCemRISnBibWM2SUc1bGR5QlViMnRsYmxSNWNHVW9YQ0p6ZEhKcGJtZGNJaXdnYzNSaGNuUnpSWGh3Y2lrc1hHNGdJRzVoYldVNklHNWxkeUJVYjJ0bGJsUjVjR1VvWENKdVlXMWxYQ0lzSUhOMFlYSjBjMFY0Y0hJcExGeHVJQ0JsYjJZNklHNWxkeUJVYjJ0bGJsUjVjR1VvWENKbGIyWmNJaWtzWEc1Y2JpQWdMeThnVUhWdVkzUjFZWFJwYjI0Z2RHOXJaVzRnZEhsd1pYTXVYRzRnSUdKeVlXTnJaWFJNT2lCdVpYY2dWRzlyWlc1VWVYQmxLRndpVzF3aUxDQjdJR0psWm05eVpVVjRjSEk2SUhSeWRXVXNJSE4wWVhKMGMwVjRjSEk2SUhSeWRXVWdmU2tzWEc0Z0lHSnlZV05yWlhSU09pQnVaWGNnVkc5clpXNVVlWEJsS0Z3aVhWd2lLU3hjYmlBZ1luSmhZMlZNT2lCdVpYY2dWRzlyWlc1VWVYQmxLRndpZTF3aUxDQjdJR0psWm05eVpVVjRjSEk2SUhSeWRXVXNJSE4wWVhKMGMwVjRjSEk2SUhSeWRXVWdmU2tzWEc0Z0lHSnlZV05sVWpvZ2JtVjNJRlJ2YTJWdVZIbHdaU2hjSW4xY0lpa3NYRzRnSUhCaGNtVnVURG9nYm1WM0lGUnZhMlZ1Vkhsd1pTaGNJaWhjSWl3Z2V5QmlaV1p2Y21WRmVIQnlPaUIwY25WbExDQnpkR0Z5ZEhORmVIQnlPaUIwY25WbElIMHBMRnh1SUNCd1lYSmxibEk2SUc1bGR5QlViMnRsYmxSNWNHVW9YQ0lwWENJcExGeHVJQ0JqYjIxdFlUb2dibVYzSUZSdmEyVnVWSGx3WlNoY0lpeGNJaXdnWW1WbWIzSmxSWGh3Y2lrc1hHNGdJSE5sYldrNklHNWxkeUJVYjJ0bGJsUjVjR1VvWENJN1hDSXNJR0psWm05eVpVVjRjSElwTEZ4dUlDQmpiMnh2YmpvZ2JtVjNJRlJ2YTJWdVZIbHdaU2hjSWpwY0lpd2dZbVZtYjNKbFJYaHdjaWtzWEc0Z0lHUnZkRG9nYm1WM0lGUnZhMlZ1Vkhsd1pTaGNJaTVjSWlrc1hHNGdJSEYxWlhOMGFXOXVPaUJ1WlhjZ1ZHOXJaVzVVZVhCbEtGd2lQMXdpTENCaVpXWnZjbVZGZUhCeUtTeGNiaUFnWVhKeWIzYzZJRzVsZHlCVWIydGxibFI1Y0dVb1hDSTlQbHdpTENCaVpXWnZjbVZGZUhCeUtTeGNiaUFnZEdWdGNHeGhkR1U2SUc1bGR5QlViMnRsYmxSNWNHVW9YQ0owWlcxd2JHRjBaVndpS1N4Y2JpQWdaV3hzYVhCemFYTTZJRzVsZHlCVWIydGxibFI1Y0dVb1hDSXVMaTVjSWl3Z1ltVm1iM0psUlhod2Npa3NYRzRnSUdKaFkydFJkVzkwWlRvZ2JtVjNJRlJ2YTJWdVZIbHdaU2hjSW1CY0lpd2djM1JoY25SelJYaHdjaWtzWEc0Z0lHUnZiR3hoY2tKeVlXTmxURG9nYm1WM0lGUnZhMlZ1Vkhsd1pTaGNJaVI3WENJc0lIc2dZbVZtYjNKbFJYaHdjam9nZEhKMVpTd2djM1JoY25SelJYaHdjam9nZEhKMVpTQjlLU3hjYmx4dUlDQXZMeUJQY0dWeVlYUnZjbk11SUZSb1pYTmxJR05oY25KNUlITmxkbVZ5WVd3Z2EybHVaSE1nYjJZZ2NISnZjR1Z5ZEdsbGN5QjBieUJvWld4d0lIUm9aVnh1SUNBdkx5QndZWEp6WlhJZ2RYTmxJSFJvWlcwZ2NISnZjR1Z5YkhrZ0tIUm9aU0J3Y21WelpXNWpaU0J2WmlCMGFHVnpaU0J3Y205d1pYSjBhV1Z6SUdselhHNGdJQzh2SUhkb1lYUWdZMkYwWldkdmNtbDZaWE1nZEdobGJTQmhjeUJ2Y0dWeVlYUnZjbk1wTGx4dUlDQXZMMXh1SUNBdkx5QmdZbWx1YjNCZ0xDQjNhR1Z1SUhCeVpYTmxiblFzSUhOd1pXTnBabWxsY3lCMGFHRjBJSFJvYVhNZ2IzQmxjbUYwYjNJZ2FYTWdZU0JpYVc1aGNubGNiaUFnTHk4Z2IzQmxjbUYwYjNJc0lHRnVaQ0IzYVd4c0lISmxabVZ5SUhSdklHbDBjeUJ3Y21WalpXUmxibU5sTGx4dUlDQXZMMXh1SUNBdkx5QmdjSEpsWm1sNFlDQmhibVFnWUhCdmMzUm1hWGhnSUcxaGNtc2dkR2hsSUc5d1pYSmhkRzl5SUdGeklHRWdjSEpsWm1sNElHOXlJSEJ2YzNSbWFYaGNiaUFnTHk4Z2RXNWhjbmtnYjNCbGNtRjBiM0l1WEc0Z0lDOHZYRzRnSUM4dklHQnBjMEZ6YzJsbmJtQWdiV0Z5YTNNZ1lXeHNJRzltSUdBOVlDd2dZQ3M5WUN3Z1lDMDlZQ0JsZEdObGRHVnlZU3dnZDJocFkyZ2dZV04wSUdGelhHNGdJQzh2SUdKcGJtRnllU0J2Y0dWeVlYUnZjbk1nZDJsMGFDQmhJSFpsY25rZ2JHOTNJSEJ5WldObFpHVnVZMlVzSUhSb1lYUWdjMmh2ZFd4a0lISmxjM1ZzZEZ4dUlDQXZMeUJwYmlCQmMzTnBaMjV0Wlc1MFJYaHdjbVZ6YzJsdmJpQnViMlJsY3k1Y2JseHVJQ0JsY1RvZ2JtVjNJRlJ2YTJWdVZIbHdaU2hjSWoxY0lpd2dleUJpWldadmNtVkZlSEJ5T2lCMGNuVmxMQ0JwYzBGemMybG5iam9nZEhKMVpTQjlLU3hjYmlBZ1lYTnphV2R1T2lCdVpYY2dWRzlyWlc1VWVYQmxLRndpWHoxY0lpd2dleUJpWldadmNtVkZlSEJ5T2lCMGNuVmxMQ0JwYzBGemMybG5iam9nZEhKMVpTQjlLU3hjYmlBZ2FXNWpSR1ZqT2lCdVpYY2dWRzlyWlc1VWVYQmxLRndpS3lzdkxTMWNJaXdnZXlCd2NtVm1hWGc2SUhSeWRXVXNJSEJ2YzNSbWFYZzZJSFJ5ZFdVc0lITjBZWEowYzBWNGNISTZJSFJ5ZFdVZ2ZTa3NYRzRnSUhCeVpXWnBlRG9nYm1WM0lGUnZhMlZ1Vkhsd1pTaGNJbkJ5WldacGVGd2lMQ0I3SUdKbFptOXlaVVY0Y0hJNklIUnlkV1VzSUhCeVpXWnBlRG9nZEhKMVpTd2djM1JoY25SelJYaHdjam9nZEhKMVpTQjlLU3hjYmlBZ2JHOW5hV05oYkU5U09pQmlhVzV2Y0NoY0lueDhYQ0lzSURFcExGeHVJQ0JzYjJkcFkyRnNRVTVFT2lCaWFXNXZjQ2hjSWlZbVhDSXNJRElwTEZ4dUlDQmlhWFIzYVhObFQxSTZJR0pwYm05d0tGd2lmRndpTENBektTeGNiaUFnWW1sMGQybHpaVmhQVWpvZ1ltbHViM0FvWENKZVhDSXNJRFFwTEZ4dUlDQmlhWFIzYVhObFFVNUVPaUJpYVc1dmNDaGNJaVpjSWl3Z05Ta3NYRzRnSUdWeGRXRnNhWFI1T2lCaWFXNXZjQ2hjSWowOUx5RTlYQ0lzSURZcExGeHVJQ0J5Wld4aGRHbHZibUZzT2lCaWFXNXZjQ2hjSWp3dlBsd2lMQ0EzS1N4Y2JpQWdZbWwwVTJocFpuUTZJR0pwYm05d0tGd2lQRHd2UGo1Y0lpd2dPQ2tzWEc0Z0lIQnNkWE5OYVc0NklHNWxkeUJVYjJ0bGJsUjVjR1VvWENJckx5MWNJaXdnZXlCaVpXWnZjbVZGZUhCeU9pQjBjblZsTENCaWFXNXZjRG9nT1N3Z2NISmxabWw0T2lCMGNuVmxMQ0J6ZEdGeWRITkZlSEJ5T2lCMGNuVmxJSDBwTEZ4dUlDQnRiMlIxYkc4NklHSnBibTl3S0Z3aUpWd2lMQ0F4TUNrc1hHNGdJSE4wWVhJNklHSnBibTl3S0Z3aUtsd2lMQ0F4TUNrc1hHNGdJSE5zWVhOb09pQmlhVzV2Y0NoY0lpOWNJaXdnTVRBcExGeHVJQ0J6ZEdGeWMzUmhjam9nYm1WM0lGUnZhMlZ1Vkhsd1pTaGNJaW9xWENJc0lIc2dZbVZtYjNKbFJYaHdjam9nZEhKMVpTQjlLVnh1ZlR0Y2JseHVaWGh3YjNKMGN5NTBlWEJsY3lBOUlIUjVjR1Z6TzF4dUx5OGdUV0Z3SUd0bGVYZHZjbVFnYm1GdFpYTWdkRzhnZEc5clpXNGdkSGx3WlhNdVhHNWNiblpoY2lCclpYbDNiM0prY3lBOUlIdDlPMXh1WEc1bGVIQnZjblJ6TG10bGVYZHZjbVJ6SUQwZ2EyVjVkMjl5WkhNN1hHNHZMeUJUZFdOamFXNWpkQ0JrWldacGJtbDBhVzl1Y3lCdlppQnJaWGwzYjNKa0lIUnZhMlZ1SUhSNWNHVnpYRzVtZFc1amRHbHZiaUJyZHlodVlXMWxLU0I3WEc0Z0lIWmhjaUJ2Y0hScGIyNXpJRDBnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E4UFNBeElIeDhJR0Z5WjNWdFpXNTBjMXN4WFNBOVBUMGdkVzVrWldacGJtVmtJRDhnZTMwZ09pQmhjbWQxYldWdWRITmJNVjA3WEc1Y2JpQWdiM0IwYVc5dWN5NXJaWGwzYjNKa0lEMGdibUZ0WlR0Y2JpQWdhMlY1ZDI5eVpITmJibUZ0WlYwZ1BTQjBlWEJsYzF0Y0lsOWNJaUFySUc1aGJXVmRJRDBnYm1WM0lGUnZhMlZ1Vkhsd1pTaHVZVzFsTENCdmNIUnBiMjV6S1R0Y2JuMWNibHh1YTNjb1hDSmljbVZoYTF3aUtUdGNibXQzS0Z3aVkyRnpaVndpTENCaVpXWnZjbVZGZUhCeUtUdGNibXQzS0Z3aVkyRjBZMmhjSWlrN1hHNXJkeWhjSW1OdmJuUnBiblZsWENJcE8xeHVhM2NvWENKa1pXSjFaMmRsY2x3aUtUdGNibXQzS0Z3aVpHVm1ZWFZzZEZ3aUxDQmlaV1p2Y21WRmVIQnlLVHRjYm10M0tGd2laRzljSWl3Z2V5QnBjMHh2YjNBNklIUnlkV1VzSUdKbFptOXlaVVY0Y0hJNklIUnlkV1VnZlNrN1hHNXJkeWhjSW1Wc2MyVmNJaXdnWW1WbWIzSmxSWGh3Y2lrN1hHNXJkeWhjSW1acGJtRnNiSGxjSWlrN1hHNXJkeWhjSW1admNsd2lMQ0I3SUdselRHOXZjRG9nZEhKMVpTQjlLVHRjYm10M0tGd2lablZ1WTNScGIyNWNJaXdnYzNSaGNuUnpSWGh3Y2lrN1hHNXJkeWhjSW1sbVhDSXBPMXh1YTNjb1hDSnlaWFIxY201Y0lpd2dZbVZtYjNKbFJYaHdjaWs3WEc1cmR5aGNJbk4zYVhSamFGd2lLVHRjYm10M0tGd2lkR2h5YjNkY0lpd2dZbVZtYjNKbFJYaHdjaWs3WEc1cmR5aGNJblJ5ZVZ3aUtUdGNibXQzS0Z3aWRtRnlYQ0lwTzF4dWEzY29YQ0pqYjI1emRGd2lLVHRjYm10M0tGd2lkMmhwYkdWY0lpd2dleUJwYzB4dmIzQTZJSFJ5ZFdVZ2ZTazdYRzVyZHloY0luZHBkR2hjSWlrN1hHNXJkeWhjSW01bGQxd2lMQ0I3SUdKbFptOXlaVVY0Y0hJNklIUnlkV1VzSUhOMFlYSjBjMFY0Y0hJNklIUnlkV1VnZlNrN1hHNXJkeWhjSW5Sb2FYTmNJaXdnYzNSaGNuUnpSWGh3Y2lrN1hHNXJkeWhjSW5OMWNHVnlYQ0lzSUhOMFlYSjBjMFY0Y0hJcE8xeHVhM2NvWENKamJHRnpjMXdpS1R0Y2JtdDNLRndpWlhoMFpXNWtjMXdpTENCaVpXWnZjbVZGZUhCeUtUdGNibXQzS0Z3aVpYaHdiM0owWENJcE8xeHVhM2NvWENKcGJYQnZjblJjSWlrN1hHNXJkeWhjSW01MWJHeGNJaXdnYzNSaGNuUnpSWGh3Y2lrN1hHNXJkeWhjSW5SeWRXVmNJaXdnYzNSaGNuUnpSWGh3Y2lrN1hHNXJkeWhjSW1aaGJITmxYQ0lzSUhOMFlYSjBjMFY0Y0hJcE8xeHVhM2NvWENKcGJsd2lMQ0I3SUdKbFptOXlaVVY0Y0hJNklIUnlkV1VzSUdKcGJtOXdPaUEzSUgwcE8xeHVhM2NvWENKcGJuTjBZVzVqWlc5bVhDSXNJSHNnWW1WbWIzSmxSWGh3Y2pvZ2RISjFaU3dnWW1sdWIzQTZJRGNnZlNrN1hHNXJkeWhjSW5SNWNHVnZabHdpTENCN0lHSmxabTl5WlVWNGNISTZJSFJ5ZFdVc0lIQnlaV1pwZURvZ2RISjFaU3dnYzNSaGNuUnpSWGh3Y2pvZ2RISjFaU0I5S1R0Y2JtdDNLRndpZG05cFpGd2lMQ0I3SUdKbFptOXlaVVY0Y0hJNklIUnlkV1VzSUhCeVpXWnBlRG9nZEhKMVpTd2djM1JoY25SelJYaHdjam9nZEhKMVpTQjlLVHRjYm10M0tGd2laR1ZzWlhSbFhDSXNJSHNnWW1WbWIzSmxSWGh3Y2pvZ2RISjFaU3dnY0hKbFptbDRPaUIwY25WbExDQnpkR0Z5ZEhORmVIQnlPaUIwY25WbElIMHBPMXh1WEc1OUxIdDlYU3d4TlRwYlpuVnVZM1JwYjI0b1gyUmxjbVZ4WHl4dGIyUjFiR1VzWlhod2IzSjBjeWw3WEc1Y0luVnpaU0J6ZEhKcFkzUmNJanRjYmx4dVpYaHdiM0owY3k1ZlgyVnpUVzlrZFd4bElEMGdkSEoxWlR0Y2JtVjRjRzl5ZEhNdWFYTkJjbkpoZVNBOUlHbHpRWEp5WVhrN1hHNWxlSEJ2Y25SekxtaGhjeUE5SUdoaGN6dGNibHh1Wm5WdVkzUnBiMjRnYVhOQmNuSmhlU2h2WW1vcElIdGNiaUFnY21WMGRYSnVJRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNodlltb3BJRDA5UFNCY0lsdHZZbXBsWTNRZ1FYSnlZWGxkWENJN1hHNTlYRzVjYmk4dklFTm9aV05yY3lCcFppQmhiaUJ2WW1wbFkzUWdhR0Z6SUdFZ2NISnZjR1Z5ZEhrdVhHNWNibVoxYm1OMGFXOXVJR2hoY3lodlltb3NJSEJ5YjNCT1lXMWxLU0I3WEc0Z0lISmxkSFZ5YmlCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2IySnFMQ0J3Y205d1RtRnRaU2s3WEc1OVhHNWNibjBzZTMxZExERTJPbHRtZFc1amRHbHZiaWhmWkdWeVpYRmZMRzF2WkhWc1pTeGxlSEJ2Y25SektYdGNiaTh2SUUxaGRHTm9aWE1nWVNCM2FHOXNaU0JzYVc1bElHSnlaV0ZySUNoM2FHVnlaU0JEVWt4R0lHbHpJR052Ym5OcFpHVnlaV1FnWVNCemFXNW5iR1ZjYmk4dklHeHBibVVnWW5KbFlXc3BMaUJWYzJWa0lIUnZJR052ZFc1MElHeHBibVZ6TGx4dVhHNWNJblZ6WlNCemRISnBZM1JjSWp0Y2JseHVaWGh3YjNKMGN5NWZYMlZ6VFc5a2RXeGxJRDBnZEhKMVpUdGNibVY0Y0c5eWRITXVhWE5PWlhkTWFXNWxJRDBnYVhOT1pYZE1hVzVsTzF4dWRtRnlJR3hwYm1WQ2NtVmhheUE5SUM5Y1hISmNYRzQvZkZ4Y2JueGNYSFV5TURJNGZGeGNkVEl3TWprdk8xeHVaWGh3YjNKMGN5NXNhVzVsUW5KbFlXc2dQU0JzYVc1bFFuSmxZV3M3WEc1MllYSWdiR2x1WlVKeVpXRnJSeUE5SUc1bGR5QlNaV2RGZUhBb2JHbHVaVUp5WldGckxuTnZkWEpqWlN3Z1hDSm5YQ0lwTzF4dVhHNWxlSEJ2Y25SekxteHBibVZDY21WaGEwY2dQU0JzYVc1bFFuSmxZV3RITzF4dVhHNW1kVzVqZEdsdmJpQnBjMDVsZDB4cGJtVW9ZMjlrWlNrZ2UxeHVJQ0J5WlhSMWNtNGdZMjlrWlNBOVBUMGdNVEFnZkh3Z1kyOWtaU0E5UFQwZ01UTWdmSHdnWTI5a1pTQTlQVDBnTUhneU1ESTRJSHg4SUdOdlpHVWdQVDBnTUhneU1ESTVPMXh1ZlZ4dVhHNTJZWElnYm05dVFWTkRTVWwzYUdsMFpYTndZV05sSUQwZ0wxdGNYSFV4Tmpnd1hGeDFNVGd3WlZ4Y2RUSXdNREF0WEZ4MU1qQXdZVnhjZFRJd01tWmNYSFV5TURWbVhGeDFNekF3TUZ4Y2RXWmxabVpkTHp0Y2JseHVaWGh3YjNKMGN5NXViMjVCVTBOSlNYZG9hWFJsYzNCaFkyVWdQU0J1YjI1QlUwTkpTWGRvYVhSbGMzQmhZMlU3WEc1MllYSWdjMnRwY0Zkb2FYUmxVM0JoWTJVZ1BTQXZLRDg2WEZ4emZGeGNMMXhjTHk0cWZGeGNMMXhjS2x0ZVhTby9YRndxWEZ3dktTb3ZaenRjYm1WNGNHOXlkSE11YzJ0cGNGZG9hWFJsVTNCaFkyVWdQU0J6YTJsd1YyaHBkR1ZUY0dGalpUdGNibHh1ZlN4N2ZWMTlMSHQ5TEZzelhTa29NeWxjYm4wcE95SmRmUT09IiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIl9hcmdzXCI6IFtcbiAgICBbXG4gICAgICBcImVzcHJlZUBeMy4xLjNcIixcbiAgICAgIFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZXNwcmVlQD49My4xLjMgPDQuMC4wXCIsXG4gIFwiX2lkXCI6IFwiZXNwcmVlQDMuMS4zXCIsXG4gIFwiX2luQ2FjaGVcIjogdHJ1ZSxcbiAgXCJfaW5zdGFsbGFibGVcIjogdHJ1ZSxcbiAgXCJfbG9jYXRpb25cIjogXCIvZXNwcmVlXCIsXG4gIFwiX25wbU9wZXJhdGlvbmFsSW50ZXJuYWxcIjoge1xuICAgIFwiaG9zdFwiOiBcInBhY2thZ2VzLTEyLXdlc3QuaW50ZXJuYWwubnBtanMuY29tXCIsXG4gICAgXCJ0bXBcIjogXCJ0bXAvZXNwcmVlLTMuMS4zLnRnel8xNDU4MzIyMTgzMDA4XzAuOTMxNjgxMTA4NjYwOTk2XCJcbiAgfSxcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcIm5pY2hvbGFzQG5jemNvbnN1bHRpbmcuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwibnpha2FzXCJcbiAgfSxcbiAgXCJfbnBtVmVyc2lvblwiOiBcIjEuNC4xMFwiLFxuICBcIl9waGFudG9tQ2hpbGRyZW5cIjoge30sXG4gIFwiX3JlcXVlc3RlZFwiOiB7XG4gICAgXCJuYW1lXCI6IFwiZXNwcmVlXCIsXG4gICAgXCJyYXdcIjogXCJlc3ByZWVAXjMuMS4zXCIsXG4gICAgXCJyYXdTcGVjXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJzY29wZVwiOiBudWxsLFxuICAgIFwic3BlY1wiOiBcIj49My4xLjMgPDQuMC4wXCIsXG4gICAgXCJ0eXBlXCI6IFwicmFuZ2VcIlxuICB9LFxuICBcIl9yZXF1aXJlZEJ5XCI6IFtcbiAgICBcIi9cIlxuICBdLFxuICBcIl9yZXNvbHZlZFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJlZS8tL2VzcHJlZS0zLjEuMy50Z3pcIixcbiAgXCJfc2hhc3VtXCI6IFwiYTc3Y2E2MzA5ODZjMTliNzRkOTU1NDFiODQ1Mjk4Y2Q2ZmFhMjI4Y1wiLFxuICBcIl9zaHJpbmt3cmFwXCI6IG51bGwsXG4gIFwiX3NwZWNcIjogXCJlc3ByZWVAXjMuMS4zXCIsXG4gIFwiX3doZXJlXCI6IFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcIm5pY2hvbGFzK25wbUBuY3pjb25zdWx0aW5nLmNvbVwiLFxuICAgIFwibmFtZVwiOiBcIk5pY2hvbGFzIEMuIFpha2FzXCJcbiAgfSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHA6Ly9naXRodWIuY29tL2VzbGludC9lc3ByZWUuZ2l0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYWNvcm5cIjogXCJeMy4wLjRcIixcbiAgICBcImFjb3JuLWpzeFwiOiBcIl4yLjAuMVwiXG4gIH0sXG4gIFwiZGVzY3JpcHRpb25cIjogXCJBbiBFc3ByaW1hLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBwYXJzZXIgYnVpbHQgb24gQWNvcm5cIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY2hhaVwiOiBcIl4xLjEwLjBcIixcbiAgICBcImVzbGludFwiOiBcIl4yLjAuMC1iZXRhLjFcIixcbiAgICBcImVzbGludC1jb25maWctZXNsaW50XCI6IFwiXjMuMC4wXCIsXG4gICAgXCJlc2xpbnQtcmVsZWFzZVwiOiBcIl4wLjMuMFwiLFxuICAgIFwiZXNwcmltYVwiOiBcImxhdGVzdFwiLFxuICAgIFwiZXNwcmltYS1mYlwiOiBcIl44MDAxLjIwMDEuMC1kZXYtaGFybW9ueS1mYlwiLFxuICAgIFwiaXN0YW5idWxcIjogXCJ+MC4yLjZcIixcbiAgICBcImpzb24tZGlmZlwiOiBcIn4wLjMuMVwiLFxuICAgIFwibGVjaGVcIjogXCJeMS4wLjFcIixcbiAgICBcIm1vY2hhXCI6IFwiXjIuMC4xXCIsXG4gICAgXCJvcHRpbWlzdFwiOiBcIn4wLjYuMFwiLFxuICAgIFwicmVnZW5lcmF0ZVwiOiBcIn4wLjUuNFwiLFxuICAgIFwic2hlbGxqc1wiOiBcIl4wLjMuMFwiLFxuICAgIFwic2hlbGxqcy1ub2RlY2xpXCI6IFwiXjAuMS4xXCIsXG4gICAgXCJ1bmljb2RlLTYuMy4wXCI6IFwifjAuMS4wXCJcbiAgfSxcbiAgXCJkaXJlY3Rvcmllc1wiOiB7fSxcbiAgXCJkaXN0XCI6IHtcbiAgICBcInNoYXN1bVwiOiBcImE3N2NhNjMwOTg2YzE5Yjc0ZDk1NTQxYjg0NTI5OGNkNmZhYTIyOGNcIixcbiAgICBcInRhcmJhbGxcIjogXCJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJlZS8tL2VzcHJlZS0zLjEuMy50Z3pcIlxuICB9LFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MC4xMC4wXCJcbiAgfSxcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJlc3ByZWUuanNcIixcbiAgICBcImxpYlwiXG4gIF0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzcHJlZVwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFjb3JuXCIsXG4gICAgXCJhc3RcIixcbiAgICBcImVjbWFzY3JpcHRcIixcbiAgICBcImphdmFzY3JpcHRcIixcbiAgICBcInBhcnNlclwiLFxuICAgIFwic3ludGF4XCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQlNELTItQ2xhdXNlXCIsXG4gIFwibWFpblwiOiBcImVzcHJlZS5qc1wiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJuemFrYXNcIixcbiAgICAgIFwiZW1haWxcIjogXCJuaWNob2xhc0BuY3pjb25zdWx0aW5nLmNvbVwiXG4gICAgfVxuICBdLFxuICBcIm5hbWVcIjogXCJlc3ByZWVcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZXNsaW50L2VzcHJlZS5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYWxwaGFyZWxlYXNlXCI6IFwiZXNsaW50LXByZWxlYXNlIGFscGhhXCIsXG4gICAgXCJiZXRhcmVsZWFzZVwiOiBcImVzbGludC1wcmVsZWFzZSBiZXRhXCIsXG4gICAgXCJicm93c2VyaWZ5XCI6IFwibm9kZSBNYWtlZmlsZS5qcyBicm93c2VyaWZ5XCIsXG4gICAgXCJnZW5lcmF0ZS1yZWdleFwiOiBcIm5vZGUgdG9vbHMvZ2VuZXJhdGUtaWRlbnRpZmllci1yZWdleC5qc1wiLFxuICAgIFwibGludFwiOiBcIm5vZGUgTWFrZWZpbGUuanMgbGludFwiLFxuICAgIFwicmVsZWFzZVwiOiBcImVzbGludC1yZWxlYXNlXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1bi1zY3JpcHQgbGludCAmJiBub2RlIE1ha2VmaWxlLmpzIHRlc3RcIlxuICB9LFxuICBcInZlcnNpb25cIjogXCIzLjEuM1wiXG59XG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuLypqc2xpbnQgdmFyczpmYWxzZSwgYml0d2lzZTp0cnVlKi9cbi8qanNoaW50IGluZGVudDo0Ki9cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSovXG4oZnVuY3Rpb24gY2xvbmUoZXhwb3J0cykge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIFZpc2l0b3JPcHRpb24sXG4gICAgICAgIFZpc2l0b3JLZXlzLFxuICAgICAgICBvYmplY3RDcmVhdGUsXG4gICAgICAgIG9iamVjdEtleXMsXG4gICAgICAgIEJSRUFLLFxuICAgICAgICBTS0lQLFxuICAgICAgICBSRU1PVkU7XG5cbiAgICBmdW5jdGlvbiBpZ25vcmVKU0hpbnRFcnJvcigpIHsgfVxuXG4gICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgaWYgKCFpc0FycmF5KSB7XG4gICAgICAgIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWVwQ29weShvYmopIHtcbiAgICAgICAgdmFyIHJldCA9IHt9LCBrZXksIHZhbDtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtrZXldID0gZGVlcENvcHkodmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaGFsbG93Q29weShvYmopIHtcbiAgICAgICAgdmFyIHJldCA9IHt9LCBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBpZ25vcmVKU0hpbnRFcnJvcihzaGFsbG93Q29weSk7XG5cbiAgICAvLyBiYXNlZCBvbiBMTFZNIGxpYmMrKyB1cHBlcl9ib3VuZCAvIGxvd2VyX2JvdW5kXG4gICAgLy8gTUlUIExpY2Vuc2VcblxuICAgIGZ1bmN0aW9uIHVwcGVyQm91bmQoYXJyYXksIGZ1bmMpIHtcbiAgICAgICAgdmFyIGRpZmYsIGxlbiwgaSwgY3VycmVudDtcblxuICAgICAgICBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgIGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgICAgICBjdXJyZW50ID0gaSArIGRpZmY7XG4gICAgICAgICAgICBpZiAoZnVuYyhhcnJheVtjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICBsZW4gPSBkaWZmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudCArIDE7XG4gICAgICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIGZ1bmMpIHtcbiAgICAgICAgdmFyIGRpZmYsIGxlbiwgaSwgY3VycmVudDtcblxuICAgICAgICBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgIGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgICAgICBjdXJyZW50ID0gaSArIGRpZmY7XG4gICAgICAgICAgICBpZiAoZnVuYyhhcnJheVtjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudCArIDE7XG4gICAgICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZW4gPSBkaWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBpZ25vcmVKU0hpbnRFcnJvcihsb3dlckJvdW5kKTtcblxuICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gRigpIHsgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGKCk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAobykge1xuICAgICAgICB2YXIga2V5cyA9IFtdLCBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG8pIHtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBleHRlbmQodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKGZyb20pLCBrZXksIGksIGxlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIHRvW2tleV0gPSBmcm9tW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cblxuICAgIFN5bnRheCA9IHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246ICdBc3NpZ25tZW50RXhwcmVzc2lvbicsXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiAnQXNzaWdubWVudFBhdHRlcm4nLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246ICdBcnJheUV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiAnQXdhaXRFeHByZXNzaW9uJywgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiAnQmxvY2tTdGF0ZW1lbnQnLFxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogJ0NhbGxFeHByZXNzaW9uJyxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG4gICAgICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246ICdDbGFzc0RlY2xhcmF0aW9uJyxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiAnQ29tcHJlaGVuc2lvbkJsb2NrJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogJ0NvbXByZWhlbnNpb25FeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246ICdDb25kaXRpb25hbEV4cHJlc3Npb24nLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50JyxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogJ0RpcmVjdGl2ZVN0YXRlbWVudCcsXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiAnRXhwb3J0QWxsRGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicsXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogJ0V4cG9ydFNwZWNpZmllcicsXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICdFeHByZXNzaW9uU3RhdGVtZW50JyxcbiAgICAgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50JyxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiAnRm9yT2ZTdGF0ZW1lbnQnLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogJ0Z1bmN0aW9uRXhwcmVzc2lvbicsXG4gICAgICAgIEdlbmVyYXRvckV4cHJlc3Npb246ICdHZW5lcmF0b3JFeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgICAgIElmU3RhdGVtZW50OiAnSWZTdGF0ZW1lbnQnLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogJ0ltcG9ydERlY2xhcmF0aW9uJyxcbiAgICAgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6ICdJbXBvcnRTcGVjaWZpZXInLFxuICAgICAgICBMaXRlcmFsOiAnTGl0ZXJhbCcsXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6ICdMYWJlbGVkU3RhdGVtZW50JyxcbiAgICAgICAgTG9naWNhbEV4cHJlc3Npb246ICdMb2dpY2FsRXhwcmVzc2lvbicsXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogJ01ldGhvZERlZmluaXRpb24nLFxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6ICdNb2R1bGVTcGVjaWZpZXInLFxuICAgICAgICBOZXdFeHByZXNzaW9uOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246ICdPYmplY3RFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0UGF0dGVybjogJ09iamVjdFBhdHRlcm4nLFxuICAgICAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG4gICAgICAgIFByb3BlcnR5OiAnUHJvcGVydHknLFxuICAgICAgICBSZXN0RWxlbWVudDogJ1Jlc3RFbGVtZW50JyxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiAnUmV0dXJuU3RhdGVtZW50JyxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiAnU2VxdWVuY2VFeHByZXNzaW9uJyxcbiAgICAgICAgU3ByZWFkRWxlbWVudDogJ1NwcmVhZEVsZW1lbnQnLFxuICAgICAgICBTdXBlckV4cHJlc3Npb246ICdTdXBlckV4cHJlc3Npb24nLFxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6ICdTd2l0Y2hTdGF0ZW1lbnQnLFxuICAgICAgICBTd2l0Y2hDYXNlOiAnU3dpdGNoQ2FzZScsXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogJ1RhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbicsXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogJ1RlbXBsYXRlRWxlbWVudCcsXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogJ1RlbXBsYXRlTGl0ZXJhbCcsXG4gICAgICAgIFRoaXNFeHByZXNzaW9uOiAnVGhpc0V4cHJlc3Npb24nLFxuICAgICAgICBUaHJvd1N0YXRlbWVudDogJ1Rocm93U3RhdGVtZW50JyxcbiAgICAgICAgVHJ5U3RhdGVtZW50OiAnVHJ5U3RhdGVtZW50JyxcbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiAnVW5hcnlFeHByZXNzaW9uJyxcbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogJ1VwZGF0ZUV4cHJlc3Npb24nLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiAnVmFyaWFibGVEZWNsYXJhdGlvbicsXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogJ1ZhcmlhYmxlRGVjbGFyYXRvcicsXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiAnV2hpbGVTdGF0ZW1lbnQnLFxuICAgICAgICBXaXRoU3RhdGVtZW50OiAnV2l0aFN0YXRlbWVudCcsXG4gICAgICAgIFlpZWxkRXhwcmVzc2lvbjogJ1lpZWxkRXhwcmVzc2lvbidcbiAgICB9O1xuXG4gICAgVmlzaXRvcktleXMgPSB7XG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246IFsnZWxlbWVudHMnXSxcbiAgICAgICAgQXJyYXlQYXR0ZXJuOiBbJ2VsZW1lbnRzJ10sXG4gICAgICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBbJ3BhcmFtcycsICdib2R5J10sXG4gICAgICAgIEF3YWl0RXhwcmVzc2lvbjogWydhcmd1bWVudCddLCAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQmxvY2tTdGF0ZW1lbnQ6IFsnYm9keSddLFxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgQnJlYWtTdGF0ZW1lbnQ6IFsnbGFiZWwnXSxcbiAgICAgICAgQ2FsbEV4cHJlc3Npb246IFsnY2FsbGVlJywgJ2FyZ3VtZW50cyddLFxuICAgICAgICBDYXRjaENsYXVzZTogWydwYXJhbScsICdib2R5J10sXG4gICAgICAgIENsYXNzQm9keTogWydib2R5J10sXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246IFsnaWQnLCAnc3VwZXJDbGFzcycsICdib2R5J10sXG4gICAgICAgIENsYXNzRXhwcmVzc2lvbjogWydpZCcsICdzdXBlckNsYXNzJywgJ2JvZHknXSxcbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiBbJ2xlZnQnLCAncmlnaHQnXSwgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogWydibG9ja3MnLCAnZmlsdGVyJywgJ2JvZHknXSwgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246IFsndGVzdCcsICdjb25zZXF1ZW50JywgJ2FsdGVybmF0ZSddLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogWydsYWJlbCddLFxuICAgICAgICBEZWJ1Z2dlclN0YXRlbWVudDogW10sXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogW10sXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6IFsnYm9keScsICd0ZXN0J10sXG4gICAgICAgIEVtcHR5U3RhdGVtZW50OiBbXSxcbiAgICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IFsnc291cmNlJ10sXG4gICAgICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogWydkZWNsYXJhdGlvbiddLFxuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9uJywgJ3NwZWNpZmllcnMnLCAnc291cmNlJ10sXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogWydleHBvcnRlZCcsICdsb2NhbCddLFxuICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiBbJ2V4cHJlc3Npb24nXSxcbiAgICAgICAgRm9yU3RhdGVtZW50OiBbJ2luaXQnLCAndGVzdCcsICd1cGRhdGUnLCAnYm9keSddLFxuICAgICAgICBGb3JJblN0YXRlbWVudDogWydsZWZ0JywgJ3JpZ2h0JywgJ2JvZHknXSxcbiAgICAgICAgRm9yT2ZTdGF0ZW1lbnQ6IFsnbGVmdCcsICdyaWdodCcsICdib2R5J10sXG4gICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246IFsnaWQnLCAncGFyYW1zJywgJ2JvZHknXSxcbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBbJ2lkJywgJ3BhcmFtcycsICdib2R5J10sXG4gICAgICAgIEdlbmVyYXRvckV4cHJlc3Npb246IFsnYmxvY2tzJywgJ2ZpbHRlcicsICdib2R5J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgSWRlbnRpZmllcjogW10sXG4gICAgICAgIElmU3RhdGVtZW50OiBbJ3Rlc3QnLCAnY29uc2VxdWVudCcsICdhbHRlcm5hdGUnXSxcbiAgICAgICAgSW1wb3J0RGVjbGFyYXRpb246IFsnc3BlY2lmaWVycycsICdzb3VyY2UnXSxcbiAgICAgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogWydsb2NhbCddLFxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IFsnbG9jYWwnXSxcbiAgICAgICAgSW1wb3J0U3BlY2lmaWVyOiBbJ2ltcG9ydGVkJywgJ2xvY2FsJ10sXG4gICAgICAgIExpdGVyYWw6IFtdLFxuICAgICAgICBMYWJlbGVkU3RhdGVtZW50OiBbJ2xhYmVsJywgJ2JvZHknXSxcbiAgICAgICAgTG9naWNhbEV4cHJlc3Npb246IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBNZW1iZXJFeHByZXNzaW9uOiBbJ29iamVjdCcsICdwcm9wZXJ0eSddLFxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiBbJ2tleScsICd2YWx1ZSddLFxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6IFtdLFxuICAgICAgICBOZXdFeHByZXNzaW9uOiBbJ2NhbGxlZScsICdhcmd1bWVudHMnXSxcbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogWydwcm9wZXJ0aWVzJ10sXG4gICAgICAgIE9iamVjdFBhdHRlcm46IFsncHJvcGVydGllcyddLFxuICAgICAgICBQcm9ncmFtOiBbJ2JvZHknXSxcbiAgICAgICAgUHJvcGVydHk6IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIFJlc3RFbGVtZW50OiBbICdhcmd1bWVudCcgXSxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogWydleHByZXNzaW9ucyddLFxuICAgICAgICBTcHJlYWRFbGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFN1cGVyRXhwcmVzc2lvbjogWydzdXBlciddLFxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6IFsnZGlzY3JpbWluYW50JywgJ2Nhc2VzJ10sXG4gICAgICAgIFN3aXRjaENhc2U6IFsndGVzdCcsICdjb25zZXF1ZW50J10sXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogWyd0YWcnLCAncXVhc2knXSxcbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBbXSxcbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiBbJ3F1YXNpcycsICdleHByZXNzaW9ucyddLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogW10sXG4gICAgICAgIFRocm93U3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFRyeVN0YXRlbWVudDogWydibG9jaycsICdoYW5kbGVyJywgJ2ZpbmFsaXplciddLFxuICAgICAgICBVbmFyeUV4cHJlc3Npb246IFsnYXJndW1lbnQnXSxcbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogWydhcmd1bWVudCddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9ucyddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IFsnaWQnLCAnaW5pdCddLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogWyd0ZXN0JywgJ2JvZHknXSxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogWydvYmplY3QnLCAnYm9keSddLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246IFsnYXJndW1lbnQnXVxuICAgIH07XG5cbiAgICAvLyB1bmlxdWUgaWRcbiAgICBCUkVBSyA9IHt9O1xuICAgIFNLSVAgPSB7fTtcbiAgICBSRU1PVkUgPSB7fTtcblxuICAgIFZpc2l0b3JPcHRpb24gPSB7XG4gICAgICAgIEJyZWFrOiBCUkVBSyxcbiAgICAgICAgU2tpcDogU0tJUCxcbiAgICAgICAgUmVtb3ZlOiBSRU1PVkVcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKHBhcmVudCwga2V5KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5rZXldID0gbm9kZTtcbiAgICB9O1xuXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRoaXMucGFyZW50KSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc3BsaWNlKHRoaXMua2V5LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEVsZW1lbnQobm9kZSwgcGF0aCwgd3JhcCwgcmVmKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoKSB7IH1cblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gcHJvcGVydHkgcGF0aCBhcnJheSBmcm9tIHJvb3QgdG8gY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gICAgICAgIHZhciBpLCBpeiwgaiwganosIHJlc3VsdCwgZWxlbWVudDtcblxuICAgICAgICBmdW5jdGlvbiBhZGRUb1BhdGgocmVzdWx0LCBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGp6ID0gcGF0aC5sZW5ndGg7IGogPCBqejsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGhbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb290IG5vZGVcbiAgICAgICAgaWYgKCF0aGlzLl9fY3VycmVudC5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IG5vZGUgaXMgc2VudGluZWwsIHNlY29uZCBub2RlIGlzIHJvb3QgZWxlbWVudFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMiwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLl9fbGVhdmVsaXN0W2ldO1xuICAgICAgICAgICAgYWRkVG9QYXRoKHJlc3VsdCwgZWxlbWVudC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb1BhdGgocmVzdWx0LCB0aGlzLl9fY3VycmVudC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiB0eXBlIG9mIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5jdXJyZW50KCk7XG4gICAgICAgIHJldHVybiBub2RlLnR5cGUgfHwgdGhpcy5fX2N1cnJlbnQud3JhcDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBhcnJheSBvZiBwYXJlbnQgZWxlbWVudHNcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5wYXJlbnRzID0gZnVuY3Rpb24gcGFyZW50cygpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG5cbiAgICAgICAgLy8gZmlyc3Qgbm9kZSBpcyBzZW50aW5lbFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMSwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuX19sZWF2ZWxpc3RbaV0ubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbiBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2N1cnJlbnQubm9kZTtcbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuX19leGVjdXRlID0gZnVuY3Rpb24gX19leGVjdXRlKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBwcmV2aW91cywgcmVzdWx0O1xuXG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBwcmV2aW91cyAgPSB0aGlzLl9fY3VycmVudDtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgZWxlbWVudC5ub2RlLCB0aGlzLl9fbGVhdmVsaXN0W3RoaXMuX19sZWF2ZWxpc3QubGVuZ3RoIC0gMV0ubm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBwcmV2aW91cztcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gbm90aWZ5IGNvbnRyb2wgc2tpcCAvIGJyZWFrXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KGZsYWcpIHtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gZmxhZztcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHNraXAgY2hpbGQgbm9kZXMgb2YgY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoU0tJUCk7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBicmVhayB0cmF2ZXJzYWxzXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGVbJ2JyZWFrJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KEJSRUFLKTtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJlbW92ZSBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShSRU1PVkUpO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fX2luaXRpYWxpemUgPSBmdW5jdGlvbihyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHRoaXMudmlzaXRvciA9IHZpc2l0b3I7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIHRoaXMuX193b3JrbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9fbGVhdmVsaXN0ID0gW107XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gdmlzaXRvci5mYWxsYmFjayA9PT0gJ2l0ZXJhdGlvbic7XG4gICAgICAgIHRoaXMuX19rZXlzID0gVmlzaXRvcktleXM7XG4gICAgICAgIGlmICh2aXNpdG9yLmtleXMpIHtcbiAgICAgICAgICAgIHRoaXMuX19rZXlzID0gZXh0ZW5kKG9iamVjdENyZWF0ZSh0aGlzLl9fa2V5cyksIHZpc2l0b3Iua2V5cyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNOb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5vZGUudHlwZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9wZXJ0eShub2RlVHlwZSwga2V5KSB7XG4gICAgICAgIHJldHVybiAobm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RFeHByZXNzaW9uIHx8IG5vZGVUeXBlID09PSBTeW50YXguT2JqZWN0UGF0dGVybikgJiYgJ3Byb3BlcnRpZXMnID09PSBrZXk7XG4gICAgfVxuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiB0cmF2ZXJzZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciB3b3JrbGlzdCxcbiAgICAgICAgICAgIGxlYXZlbGlzdCxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgY3VycmVudDIsXG4gICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICAgICAgc2VudGluZWw7XG5cbiAgICAgICAgdGhpcy5fX2luaXRpYWxpemUocm9vdCwgdmlzaXRvcik7XG5cbiAgICAgICAgc2VudGluZWwgPSB7fTtcblxuICAgICAgICAvLyByZWZlcmVuY2VcbiAgICAgICAgd29ya2xpc3QgPSB0aGlzLl9fd29ya2xpc3Q7XG4gICAgICAgIGxlYXZlbGlzdCA9IHRoaXMuX19sZWF2ZWxpc3Q7XG5cbiAgICAgICAgLy8gaW5pdGlhbGl6ZVxuICAgICAgICB3b3JrbGlzdC5wdXNoKG5ldyBFbGVtZW50KHJvb3QsIG51bGwsIG51bGwsIG51bGwpKTtcbiAgICAgICAgbGVhdmVsaXN0LnB1c2gobmV3IEVsZW1lbnQobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuXG4gICAgICAgIHdoaWxlICh3b3JrbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB3b3JrbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGxlYXZlbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IubGVhdmUsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgcmV0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlKSB7XG5cbiAgICAgICAgICAgICAgICByZXQgPSB0aGlzLl9fZXhlY3V0ZSh2aXNpdG9yLmVudGVyLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHJldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goc2VudGluZWwpO1xuICAgICAgICAgICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gU0tJUCB8fCByZXQgPT09IFNLSVApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnQubm9kZTtcbiAgICAgICAgICAgICAgICBub2RlVHlwZSA9IGVsZW1lbnQud3JhcCB8fCBub2RlLnR5cGU7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuX19rZXlzW25vZGVUeXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX19mYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IG9iamVjdEtleXMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50IC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZVtjdXJyZW50Ml0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5KG5vZGVUeXBlLCBjYW5kaWRhdGVzW2N1cnJlbnRdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlRWxlbShlbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgbmV4dEVsZW0sXG4gICAgICAgICAgICAgICAgcGFyZW50O1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5yZWYucmVtb3ZlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByZWZlcmVuY2UgaXMgYW4gZWxlbWVudCBvZiBhbiBhcnJheS5cbiAgICAgICAgICAgICAgICBrZXkgPSBlbGVtZW50LnJlZi5rZXk7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5yZWYucGFyZW50O1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgcmVtb3ZlZCBmcm9tIGFycmF5LCB0aGVuIGRlY3JlYXNlIGZvbGxvd2luZyBpdGVtcycga2V5cy5cbiAgICAgICAgICAgICAgICBpID0gd29ya2xpc3QubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW0gPSB3b3JrbGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFbGVtLnJlZiAmJiBuZXh0RWxlbS5yZWYucGFyZW50ID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICAobmV4dEVsZW0ucmVmLmtleSA8IGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLS1uZXh0RWxlbS5yZWYua2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG5vZGVUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbCxcbiAgICAgICAgICAgIG91dGVyLFxuICAgICAgICAgICAga2V5O1xuXG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKHJvb3QsIHZpc2l0b3IpO1xuXG4gICAgICAgIHNlbnRpbmVsID0ge307XG5cbiAgICAgICAgLy8gcmVmZXJlbmNlXG4gICAgICAgIHdvcmtsaXN0ID0gdGhpcy5fX3dvcmtsaXN0O1xuICAgICAgICBsZWF2ZWxpc3QgPSB0aGlzLl9fbGVhdmVsaXN0O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgICAgb3V0ZXIgPSB7XG4gICAgICAgICAgICByb290OiByb290XG4gICAgICAgIH07XG4gICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb290LCBudWxsLCBudWxsLCBuZXcgUmVmZXJlbmNlKG91dGVyLCAncm9vdCcpKTtcbiAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBub2RlIG1heSBiZSByZXBsYWNlZCB3aXRoIG51bGwsXG4gICAgICAgICAgICAgICAgLy8gc28gZGlzdGluZ3Vpc2ggYmV0d2VlbiB1bmRlZmluZWQgYW5kIG51bGwgaW4gdGhpcyBwbGFjZVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVmLnJlcGxhY2UodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCB0YXJnZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5lbnRlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIHJlcGxhY2VkIHdpdGggbnVsbCxcbiAgICAgICAgICAgIC8vIHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5kZWZpbmVkIGFuZCBudWxsIGluIHRoaXMgcGxhY2VcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlZi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5ub2RlID0gdGFyZ2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFbGVtKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHRhcmdldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIucm9vdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgbnVsbFxuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnQubm9kZTtcbiAgICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JrbGlzdC5wdXNoKHNlbnRpbmVsKTtcbiAgICAgICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHRhcmdldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlVHlwZSA9IGVsZW1lbnQud3JhcCB8fCBub2RlLnR5cGU7XG4gICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19mYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gb2JqZWN0S2V5cyhub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGtleSA9IGNhbmRpZGF0ZXNbY3VycmVudF07XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudDIgPSBjYW5kaWRhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlW2N1cnJlbnQyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkobm9kZVR5cGUsIGNhbmRpZGF0ZXNbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgJ1Byb3BlcnR5JywgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChjYW5kaWRhdGVbY3VycmVudDJdLCBba2V5LCBjdXJyZW50Ml0sIG51bGwsIG5ldyBSZWZlcmVuY2UoY2FuZGlkYXRlLCBjdXJyZW50MikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQoY2FuZGlkYXRlLCBrZXksIG51bGwsIG5ldyBSZWZlcmVuY2Uobm9kZSwga2V5KSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudHJhdmVyc2Uocm9vdCwgdmlzaXRvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIucmVwbGFjZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmRDb21tZW50UmFuZ2UoY29tbWVudCwgdG9rZW5zKSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG5cbiAgICAgICAgdGFyZ2V0ID0gdXBwZXJCb3VuZCh0b2tlbnMsIGZ1bmN0aW9uIHNlYXJjaCh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuLnJhbmdlWzBdID4gY29tbWVudC5yYW5nZVswXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gW2NvbW1lbnQucmFuZ2VbMF0sIGNvbW1lbnQucmFuZ2VbMV1dO1xuXG4gICAgICAgIGlmICh0YXJnZXQgIT09IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9IHRva2Vuc1t0YXJnZXRdLnJhbmdlWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0IC09IDE7XG4gICAgICAgIGlmICh0YXJnZXQgPj0gMCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdHRhY2hDb21tZW50cyh0cmVlLCBwcm92aWRlZENvbW1lbnRzLCB0b2tlbnMpIHtcbiAgICAgICAgLy8gQXQgZmlyc3QsIHdlIHNob3VsZCBjYWxjdWxhdGUgZXh0ZW5kZWQgY29tbWVudCByYW5nZXMuXG4gICAgICAgIHZhciBjb21tZW50cyA9IFtdLCBjb21tZW50LCBsZW4sIGksIGN1cnNvcjtcblxuICAgICAgICBpZiAoIXRyZWUucmFuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0YWNoQ29tbWVudHMgbmVlZHMgcmFuZ2UgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRva2VucyBhcnJheSBpcyBlbXB0eSwgd2UgYXR0YWNoIGNvbW1lbnRzIHRvIHRyZWUgYXMgJ2xlYWRpbmdDb21tZW50cydcbiAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZWRDb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gWzAsIHRyZWUucmFuZ2VbMF1dO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmxlYWRpbmdDb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb21tZW50cy5wdXNoKGV4dGVuZENvbW1lbnRSYW5nZShkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKSwgdG9rZW5zKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIEpvaG4gRnJlZW1hbidzIGltcGxlbWVudGF0aW9uLlxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBlbnRlcjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPiBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPT09IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBsZWF2ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdIDwgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdID09PSBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50cmFpbGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICBleHBvcnRzLnZlcnNpb24gPSByZXF1aXJlKCcuL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG4gICAgZXhwb3J0cy5TeW50YXggPSBTeW50YXg7XG4gICAgZXhwb3J0cy50cmF2ZXJzZSA9IHRyYXZlcnNlO1xuICAgIGV4cG9ydHMucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgZXhwb3J0cy5hdHRhY2hDb21tZW50cyA9IGF0dGFjaENvbW1lbnRzO1xuICAgIGV4cG9ydHMuVmlzaXRvcktleXMgPSBWaXNpdG9yS2V5cztcbiAgICBleHBvcnRzLlZpc2l0b3JPcHRpb24gPSBWaXNpdG9yT3B0aW9uO1xuICAgIGV4cG9ydHMuQ29udHJvbGxlciA9IENvbnRyb2xsZXI7XG4gICAgZXhwb3J0cy5jbG9uZUVudmlyb25tZW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY2xvbmUoe30pOyB9O1xuXG4gICAgcmV0dXJuIGV4cG9ydHM7XG59KGV4cG9ydHMpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiX2FyZ3NcIjogW1xuICAgIFtcbiAgICAgIFwiZXN0cmF2ZXJzZUBeMy4xLjBcIixcbiAgICAgIFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZXN0cmF2ZXJzZUA+PTMuMS4wIDw0LjAuMFwiLFxuICBcIl9pZFwiOiBcImVzdHJhdmVyc2VAMy4xLjBcIixcbiAgXCJfaW5DYWNoZVwiOiB0cnVlLFxuICBcIl9pbnN0YWxsYWJsZVwiOiB0cnVlLFxuICBcIl9sb2NhdGlvblwiOiBcIi9lc3RyYXZlcnNlXCIsXG4gIFwiX25wbVVzZXJcIjoge1xuICAgIFwiZW1haWxcIjogXCJ1dGF0YW5lLnRlYUBnbWFpbC5jb21cIixcbiAgICBcIm5hbWVcIjogXCJjb25zdGVsbGF0aW9uXCJcbiAgfSxcbiAgXCJfbnBtVmVyc2lvblwiOiBcIjIuMC4wLWFscGhhLTVcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHt9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImVzdHJhdmVyc2VcIixcbiAgICBcInJhd1wiOiBcImVzdHJhdmVyc2VAXjMuMS4wXCIsXG4gICAgXCJyYXdTcGVjXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJzY29wZVwiOiBudWxsLFxuICAgIFwic3BlY1wiOiBcIj49My4xLjAgPDQuMC4wXCIsXG4gICAgXCJ0eXBlXCI6IFwicmFuZ2VcIlxuICB9LFxuICBcIl9yZXF1aXJlZEJ5XCI6IFtcbiAgICBcIi9cIlxuICBdLFxuICBcIl9yZXNvbHZlZFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTMuMS4wLnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCIxNWUyOGE0NDZiOGI4MmJjNzAwY2NjOGI5NmM3OGFmNGRhMGQ2Y2JhXCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcImVzdHJhdmVyc2VAXjMuMS4wXCIsXG4gIFwiX3doZXJlXCI6IFwiL1VzZXJzL2Fqby93b3Jrc3BhY2UvaHlkcm9seXNpc1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VzdG9vbHMvZXN0cmF2ZXJzZS9pc3N1ZXNcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVDTUFTY3JpcHQgSlMgQVNUIHRyYXZlcnNhbCBmdW5jdGlvbnNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIl4yLjEuMVwiLFxuICAgIFwiY29mZmVlLXNjcmlwdFwiOiBcIl4xLjguMFwiLFxuICAgIFwiZXNwcmVlXCI6IFwiXjEuMTEuMFwiLFxuICAgIFwiZ3VscFwiOiBcIl4zLjguMTBcIixcbiAgICBcImd1bHAtYnVtcFwiOiBcIl4wLjIuMlwiLFxuICAgIFwiZ3VscC1maWx0ZXJcIjogXCJeMi4wLjBcIixcbiAgICBcImd1bHAtZ2l0XCI6IFwiXjEuMC4xXCIsXG4gICAgXCJndWxwLXRhZy12ZXJzaW9uXCI6IFwiXjEuMi4xXCIsXG4gICAgXCJqc2hpbnRcIjogXCJeMi41LjZcIixcbiAgICBcIm1vY2hhXCI6IFwiXjIuMS4wXCJcbiAgfSxcbiAgXCJkaXJlY3Rvcmllc1wiOiB7fSxcbiAgXCJkaXN0XCI6IHtcbiAgICBcInNoYXN1bVwiOiBcIjE1ZTI4YTQ0NmI4YjgyYmM3MDBjY2M4Yjk2Yzc4YWY0ZGEwZDZjYmFcIixcbiAgICBcInRhcmJhbGxcIjogXCJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTMuMS4wLnRnelwiXG4gIH0sXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0wLjEwLjBcIlxuICB9LFxuICBcImdpdEhlYWRcIjogXCIxNjZlYmJlMGE4ZDQ1Y2ViMjM5MWI2ZjVlZjVkMWJhYjZiZmIyNjdhXCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXN0b29scy9lc3RyYXZlcnNlXCIsXG4gIFwibGljZW5zZXNcIjogW1xuICAgIHtcbiAgICAgIFwidHlwZVwiOiBcIkJTRFwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwOi8vZ2l0aHViLmNvbS9lc3Rvb2xzL2VzdHJhdmVyc2UvcmF3L21hc3Rlci9MSUNFTlNFLkJTRFwiXG4gICAgfVxuICBdLFxuICBcIm1haW5cIjogXCJlc3RyYXZlcnNlLmpzXCIsXG4gIFwibWFpbnRhaW5lcnNcIjogW1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcImNvbnN0ZWxsYXRpb25cIixcbiAgICAgIFwiZW1haWxcIjogXCJ1dGF0YW5lLnRlYUBnbWFpbC5jb21cIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwibWljaGFlbGZpY2FycmFcIixcbiAgICAgIFwiZW1haWxcIjogXCJucG1AbWljaGFlbC5maWNhcnJhLm1lXCJcbiAgICB9XG4gIF0sXG4gIFwibmFtZVwiOiBcImVzdHJhdmVyc2VcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZXN0b29scy9lc3RyYXZlcnNlLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJsaW50XCI6IFwianNoaW50IGVzdHJhdmVyc2UuanNcIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuLXNjcmlwdCBsaW50ICYmIG5wbSBydW4tc2NyaXB0IHVuaXQtdGVzdFwiLFxuICAgIFwidW5pdC10ZXN0XCI6IFwibW9jaGEgLS1jb21waWxlcnMgY29mZmVlOmNvZmZlZS1zY3JpcHQvcmVnaXN0ZXJcIlxuICB9LFxuICBcInZlcnNpb25cIjogXCIzLjEuMFwiXG59XG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBJdmFuIE5pa3VsaW4gPGlmYWFhbkBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgRVM2UmVnZXgsIEVTNVJlZ2V4LCBOT05fQVNDSUlfV0hJVEVTUEFDRVMsIElERU5USUZJRVJfU1RBUlQsIElERU5USUZJRVJfUEFSVCwgY2g7XG5cbiAgICAvLyBTZWUgYHRvb2xzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuICAgIEVTNVJlZ2V4ID0ge1xuICAgICAgICAvLyBFQ01BU2NyaXB0IDUuMS9Vbmljb2RlIHY3LjAuMCBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwLVxcdTA4QjJcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNThcXHUwQzU5XFx1MEM2MFxcdTBDNjFcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JEXFx1MENERVxcdTBDRTBcXHUwQ0UxXFx1MENGMVxcdTBDRjJcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNEXFx1MEQ0RVxcdTBENjBcXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QzEtXFx1MTlDN1xcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTJEXFx1MjEyRi1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkUyRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZDQ1xcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjlEXFx1QTZBMC1cXHVBNkVGXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBNzhFXFx1QTc5MC1cXHVBN0FEXFx1QTdCMFxcdUE3QjFcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUE5RTAtXFx1QTlFNFxcdUE5RTYtXFx1QTlFRlxcdUE5RkEtXFx1QTlGRVxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTdFLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI1RlxcdUFCNjRcXHVBQjY1XFx1QUJDMC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS8sXG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNS4xL1VuaWNvZGUgdjcuMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMC1cXHUwOEIyXFx1MDhFNC1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OFxcdTBDNTlcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgxLVxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDEtXFx1MEQwM1xcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0QtXFx1MEQ0NFxcdTBENDYtXFx1MEQ0OFxcdTBENEEtXFx1MEQ0RVxcdTBENTdcXHUwRDYwLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEOVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkMtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OVxcdTMwOUFcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2OURcXHVBNjlGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3QURcXHVBN0IwXFx1QTdCMVxcdUE3RjctXFx1QTgyN1xcdUE4NDAtXFx1QTg3M1xcdUE4ODAtXFx1QThDNFxcdUE4RDAtXFx1QThEOVxcdUE4RTAtXFx1QThGN1xcdUE4RkJcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNUZcXHVBQjY0XFx1QUI2NVxcdUFCQzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkRcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdL1xuICAgIH07XG5cbiAgICBFUzZSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA2L1VuaWNvZGUgdjcuMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCMlxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OFxcdTBDNTlcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ2MFxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlDMS1cXHUxOUM3XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlCLVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5RFxcdUE2QTAtXFx1QTZFRlxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTdBRFxcdUE3QjBcXHVBN0IxXFx1QTdGNy1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNUZcXHVBQjY0XFx1QUI2NVxcdUFCQzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3NVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMkJcXHVERUIwLVxcdURFREVcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzRFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk4XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RV18W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURdfFxcdUQ4N0VbXFx1REMwMC1cXHVERTFEXS8sXG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNi9Vbmljb2RlIHY3LjAuMCBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OiAvW1xceEFBXFx4QjVcXHhCN1xceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODYtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjJcXHUwOEU0LVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQjAxLVxcdTBCMDNcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzQy1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYzXFx1MEI2Ni1cXHUwQjZGXFx1MEI3MVxcdTBCODJcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDBcXHUwQkQ3XFx1MEJFNi1cXHUwQkVGXFx1MEMwMC1cXHUwQzAzXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRC1cXHUwQzQ0XFx1MEM0Ni1cXHUwQzQ4XFx1MEM0QS1cXHUwQzREXFx1MEM1NVxcdTBDNTZcXHUwQzU4XFx1MEM1OVxcdTBDNjAtXFx1MEM2M1xcdTBDNjYtXFx1MEM2RlxcdTBDODEtXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMS1cXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1N1xcdTBENjAtXFx1MEQ2M1xcdTBENjYtXFx1MEQ2RlxcdTBEN0EtXFx1MEQ3RlxcdTBEODJcXHUwRDgzXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBEQ0FcXHUwRENGLVxcdTBERDRcXHUwREQ2XFx1MEREOC1cXHUwRERGXFx1MERFNi1cXHUwREVGXFx1MERGMlxcdTBERjNcXHUwRTAxLVxcdTBFM0FcXHUwRTQwLVxcdTBFNEVcXHUwRTUwLVxcdTBFNTlcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCOVxcdTBFQkItXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRUM4LVxcdTBFQ0RcXHUwRUQwLVxcdTBFRDlcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEYxOFxcdTBGMTlcXHUwRjIwLVxcdTBGMjlcXHUwRjM1XFx1MEYzN1xcdTBGMzlcXHUwRjNFLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjcxLVxcdTBGODRcXHUwRjg2LVxcdTBGOTdcXHUwRjk5LVxcdTBGQkNcXHUwRkM2XFx1MTAwMC1cXHUxMDQ5XFx1MTA1MC1cXHUxMDlEXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzNUQtXFx1MTM1RlxcdTEzNjktXFx1MTM3MVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxNFxcdTE3MjAtXFx1MTczNFxcdTE3NDAtXFx1MTc1M1xcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3NzJcXHUxNzczXFx1MTc4MC1cXHUxN0QzXFx1MTdEN1xcdTE3RENcXHUxN0REXFx1MTdFMC1cXHUxN0U5XFx1MTgwQi1cXHUxODBEXFx1MTgxMC1cXHUxODE5XFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTkyMC1cXHUxOTJCXFx1MTkzMC1cXHUxOTNCXFx1MTk0Ni1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MTlEMC1cXHUxOURBXFx1MUEwMC1cXHUxQTFCXFx1MUEyMC1cXHUxQTVFXFx1MUE2MC1cXHUxQTdDXFx1MUE3Ri1cXHUxQTg5XFx1MUE5MC1cXHUxQTk5XFx1MUFBN1xcdTFBQjAtXFx1MUFCRFxcdTFCMDAtXFx1MUI0QlxcdTFCNTAtXFx1MUI1OVxcdTFCNkItXFx1MUI3M1xcdTFCODAtXFx1MUJGM1xcdTFDMDAtXFx1MUMzN1xcdTFDNDAtXFx1MUM0OVxcdTFDNEQtXFx1MUM3RFxcdTFDRDAtXFx1MUNEMlxcdTFDRDQtXFx1MUNGNlxcdTFDRjhcXHUxQ0Y5XFx1MUQwMC1cXHUxREY1XFx1MURGQy1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwMENcXHUyMDBEXFx1MjAzRlxcdTIwNDBcXHUyMDU0XFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMEQwLVxcdTIwRENcXHUyMEUxXFx1MjBFNS1cXHUyMEYwXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEN0YtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJERTAtXFx1MkRGRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyRlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOTktXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZDQ1xcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYyQlxcdUE2NDAtXFx1QTY2RlxcdUE2NzQtXFx1QTY3RFxcdUE2N0YtXFx1QTY5RFxcdUE2OUYtXFx1QTZGMVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTdBRFxcdUE3QjBcXHVBN0IxXFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM0XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI1RlxcdUFCNjRcXHVBQjY1XFx1QUJDMC1cXHVBQkVBXFx1QUJFQ1xcdUFCRURcXHVBQkYwLVxcdUFCRjlcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFELVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFMDAtXFx1RkUwRlxcdUZFMjAtXFx1RkUyRFxcdUZFMzNcXHVGRTM0XFx1RkU0RC1cXHVGRTRGXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYxMC1cXHVGRjE5XFx1RkYyMS1cXHVGRjNBXFx1RkYzRlxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURERkRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERUUwXFx1REYwMC1cXHVERjFGXFx1REYzMC1cXHVERjRBXFx1REY1MC1cXHVERjdBXFx1REY4MC1cXHVERjlEXFx1REZBMC1cXHVERkMzXFx1REZDOC1cXHVERkNGXFx1REZEMS1cXHVERkQ1XXxcXHVEODAxW1xcdURDMDAtXFx1REM5RFxcdURDQTAtXFx1RENBOVxcdUREMDAtXFx1REQyN1xcdUREMzAtXFx1REQ2M1xcdURFMDAtXFx1REYzNlxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY2N118XFx1RDgwMltcXHVEQzAwLVxcdURDMDVcXHVEQzA4XFx1REMwQS1cXHVEQzM1XFx1REMzN1xcdURDMzhcXHVEQzNDXFx1REMzRi1cXHVEQzU1XFx1REM2MC1cXHVEQzc2XFx1REM4MC1cXHVEQzlFXFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwLVxcdURFMDNcXHVERTA1XFx1REUwNlxcdURFMEMtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFMzgtXFx1REUzQVxcdURFM0ZcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTZcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XXxcXHVEODA0W1xcdURDMDAtXFx1REM0NlxcdURDNjYtXFx1REM2RlxcdURDN0YtXFx1RENCQVxcdURDRDAtXFx1RENFOFxcdURDRjAtXFx1RENGOVxcdUREMDAtXFx1REQzNFxcdUREMzYtXFx1REQzRlxcdURENTAtXFx1REQ3M1xcdURENzZcXHVERDgwLVxcdUREQzRcXHVEREQwLVxcdUREREFcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMzdcXHVERUIwLVxcdURFRUFcXHVERUYwLVxcdURFRjlcXHVERjAxLVxcdURGMDNcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzQy1cXHVERjQ0XFx1REY0N1xcdURGNDhcXHVERjRCLVxcdURGNERcXHVERjU3XFx1REY1RC1cXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDODAtXFx1RENDNVxcdURDQzdcXHVEQ0QwLVxcdURDRDlcXHVERDgwLVxcdUREQjVcXHVEREI4LVxcdUREQzBcXHVERTAwLVxcdURFNDBcXHVERTQ0XFx1REU1MC1cXHVERTU5XFx1REU4MC1cXHVERUI3XFx1REVDMC1cXHVERUM5XXxcXHVEODA2W1xcdURDQTAtXFx1RENFOVxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk4XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RV18W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REU2MC1cXHVERTY5XFx1REVEMC1cXHVERUVEXFx1REVGMC1cXHVERUY0XFx1REYwMC1cXHVERjM2XFx1REY0MC1cXHVERjQzXFx1REY1MC1cXHVERjU5XFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTAtXFx1REY3RVxcdURGOEYtXFx1REY5Rl18XFx1RDgyQ1tcXHVEQzAwXFx1REMwMV18XFx1RDgyRltcXHVEQzAwLVxcdURDNkFcXHVEQzcwLVxcdURDN0NcXHVEQzgwLVxcdURDODhcXHVEQzkwLVxcdURDOTlcXHVEQzlEXFx1REM5RV18XFx1RDgzNFtcXHVERDY1LVxcdURENjlcXHVERDZELVxcdURENzJcXHVERDdCLVxcdUREODJcXHVERDg1LVxcdUREOEJcXHVEREFBLVxcdUREQURcXHVERTQyLVxcdURFNDRdfFxcdUQ4MzVbXFx1REMwMC1cXHVEQzU0XFx1REM1Ni1cXHVEQzlDXFx1REM5RVxcdURDOUZcXHVEQ0EyXFx1RENBNVxcdURDQTZcXHVEQ0E5LVxcdURDQUNcXHVEQ0FFLVxcdURDQjlcXHVEQ0JCXFx1RENCRC1cXHVEQ0MzXFx1RENDNS1cXHVERDA1XFx1REQwNy1cXHVERDBBXFx1REQwRC1cXHVERDE0XFx1REQxNi1cXHVERDFDXFx1REQxRS1cXHVERDM5XFx1REQzQi1cXHVERDNFXFx1REQ0MC1cXHVERDQ0XFx1REQ0NlxcdURENEEtXFx1REQ1MFxcdURENTItXFx1REVBNVxcdURFQTgtXFx1REVDMFxcdURFQzItXFx1REVEQVxcdURFREMtXFx1REVGQVxcdURFRkMtXFx1REYxNFxcdURGMTYtXFx1REYzNFxcdURGMzYtXFx1REY0RVxcdURGNTAtXFx1REY2RVxcdURGNzAtXFx1REY4OFxcdURGOEEtXFx1REZBOFxcdURGQUEtXFx1REZDMlxcdURGQzQtXFx1REZDQlxcdURGQ0UtXFx1REZGRl18XFx1RDgzQVtcXHVEQzAwLVxcdURDQzRcXHVEQ0QwLVxcdURDRDZdfFxcdUQ4M0JbXFx1REUwMC1cXHVERTAzXFx1REUwNS1cXHVERTFGXFx1REUyMVxcdURFMjJcXHVERTI0XFx1REUyN1xcdURFMjktXFx1REUzMlxcdURFMzQtXFx1REUzN1xcdURFMzlcXHVERTNCXFx1REU0MlxcdURFNDdcXHVERTQ5XFx1REU0QlxcdURFNEQtXFx1REU0RlxcdURFNTFcXHVERTUyXFx1REU1NFxcdURFNTdcXHVERTU5XFx1REU1QlxcdURFNURcXHVERTVGXFx1REU2MVxcdURFNjJcXHVERTY0XFx1REU2Ny1cXHVERTZBXFx1REU2Qy1cXHVERTcyXFx1REU3NC1cXHVERTc3XFx1REU3OS1cXHVERTdDXFx1REU3RVxcdURFODAtXFx1REU4OVxcdURFOEItXFx1REU5QlxcdURFQTEtXFx1REVBM1xcdURFQTUtXFx1REVBOVxcdURFQUItXFx1REVCQl18XFx1RDg2OVtcXHVEQzAwLVxcdURFRDZcXHVERjAwLVxcdURGRkZdfFxcdUQ4NkRbXFx1REMwMC1cXHVERjM0XFx1REY0MC1cXHVERkZGXXxcXHVEODZFW1xcdURDMDAtXFx1REMxRF18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS9cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNEZWNpbWFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOTsgIC8vIDAuLjlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0hleERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiAweDMwIDw9IGNoICYmIGNoIDw9IDB4MzkgfHwgIC8vIDAuLjlcbiAgICAgICAgICAgIDB4NjEgPD0gY2ggJiYgY2ggPD0gMHg2NiB8fCAgICAgLy8gYS4uZlxuICAgICAgICAgICAgMHg0MSA8PSBjaCAmJiBjaCA8PSAweDQ2OyAgICAgICAvLyBBLi5GXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA+PSAweDMwICYmIGNoIDw9IDB4Mzc7ICAvLyAwLi43XG4gICAgfVxuXG4gICAgLy8gNy4yIFdoaXRlIFNwYWNlXG5cbiAgICBOT05fQVNDSUlfV0hJVEVTUEFDRVMgPSBbXG4gICAgICAgIDB4MTY4MCwgMHgxODBFLFxuICAgICAgICAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LCAweDIwMDksIDB4MjAwQSxcbiAgICAgICAgMHgyMDJGLCAweDIwNUYsXG4gICAgICAgIDB4MzAwMCxcbiAgICAgICAgMHhGRUZGXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MEIgfHwgY2ggPT09IDB4MEMgfHwgY2ggPT09IDB4QTAgfHxcbiAgICAgICAgICAgIGNoID49IDB4MTY4MCAmJiBOT05fQVNDSUlfV0hJVEVTUEFDRVMuaW5kZXhPZihjaCkgPj0gMDtcbiAgICB9XG5cbiAgICAvLyA3LjMgTGluZSBUZXJtaW5hdG9yc1xuXG4gICAgZnVuY3Rpb24gaXNMaW5lVGVybWluYXRvcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MEEgfHwgY2ggPT09IDB4MEQgfHwgY2ggPT09IDB4MjAyOCB8fCBjaCA9PT0gMHgyMDI5O1xuICAgIH1cblxuICAgIC8vIDcuNiBJZGVudGlmaWVyIE5hbWVzIGFuZCBJZGVudGlmaWVyc1xuXG4gICAgZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjcCkge1xuICAgICAgICBpZiAoY3AgPD0gMHhGRkZGKSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKTsgfVxuICAgICAgICB2YXIgY3UxID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLmZsb29yKChjcCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhEODAwKTtcbiAgICAgICAgdmFyIGN1MiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjcCAtIDB4MTAwMDApICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICAgICAgcmV0dXJuIGN1MSArIGN1MjtcbiAgICB9XG5cbiAgICBJREVOVElGSUVSX1NUQVJUID0gbmV3IEFycmF5KDB4ODApO1xuICAgIGZvcihjaCA9IDA7IGNoIDwgMHg4MDsgKytjaCkge1xuICAgICAgICBJREVOVElGSUVSX1NUQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPT09IDB4MjQgfHwgY2ggPT09IDB4NUY7ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgIH1cblxuICAgIElERU5USUZJRVJfUEFSVCA9IG5ldyBBcnJheSgweDgwKTtcbiAgICBmb3IoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9QQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8ICAvLyAwLi45XG4gICAgICAgICAgICBjaCA9PT0gMHgyNCB8fCBjaCA9PT0gMHg1RjsgIC8vICQgKGRvbGxhcikgYW5kIF8gKHVuZGVyc2NvcmUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM1UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNVJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzYoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM2UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRGVjaW1hbERpZ2l0OiBpc0RlY2ltYWxEaWdpdCxcbiAgICAgICAgaXNIZXhEaWdpdDogaXNIZXhEaWdpdCxcbiAgICAgICAgaXNPY3RhbERpZ2l0OiBpc09jdGFsRGlnaXQsXG4gICAgICAgIGlzV2hpdGVTcGFjZTogaXNXaGl0ZVNwYWNlLFxuICAgICAgICBpc0xpbmVUZXJtaW5hdG9yOiBpc0xpbmVUZXJtaW5hdG9yLFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNTogaXNJZGVudGlmaWVyU3RhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzU6IGlzSWRlbnRpZmllclBhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclN0YXJ0RVM2OiBpc0lkZW50aWZpZXJTdGFydEVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyUGFydEVTNjogaXNJZGVudGlmaWVyUGFydEVTNlxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgY29kZSA9IHJlcXVpcmUoJy4vY29kZScpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkRVM2KGlkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgY2FzZSAnaW1wbGVtZW50cyc6XG4gICAgICAgIGNhc2UgJ2ludGVyZmFjZSc6XG4gICAgICAgIGNhc2UgJ3BhY2thZ2UnOlxuICAgICAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgICAgY2FzZSAncHJvdGVjdGVkJzpcbiAgICAgICAgY2FzZSAncHVibGljJzpcbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgY2FzZSAnbGV0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgLy8geWllbGQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGtleXdvcmQgdW5kZXIgbm9uLXN0cmljdCBtb2RlLlxuICAgICAgICBpZiAoIXN0cmljdCAmJiBpZCA9PT0gJ3lpZWxkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoaWQubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpZicpIHx8IChpZCA9PT0gJ2luJykgfHwgKGlkID09PSAnZG8nKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3ZhcicpIHx8IChpZCA9PT0gJ2ZvcicpIHx8IChpZCA9PT0gJ25ldycpIHx8IChpZCA9PT0gJ3RyeScpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZEVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ251bGwnIHx8IGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScgfHwgaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXN0cmljdGVkV29yZChpZCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdldmFsJyB8fCBpZCA9PT0gJ2FyZ3VtZW50cyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNShpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoO1xuXG4gICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGlkLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNoID0gaWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICghY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVVdGYxNihsZWFkLCB0cmFpbCkge1xuICAgICAgICByZXR1cm4gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lRVM2KGlkKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY2gsIGxvd0NoLCBjaGVjaztcblxuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJTdGFydEVTNjtcbiAgICAgICAgZm9yIChpID0gMCwgaXogPSBpZC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4REJGRikge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBpeikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICBsb3dDaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoMHhEQzAwIDw9IGxvd0NoICYmIGxvd0NoIDw9IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaCA9IGRlY29kZVV0ZjE2KGNoLCBsb3dDaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllckVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpc0lkZW50aWZpZXJOYW1lRVM1KGlkKSAmJiAhaXNSZXNlcnZlZFdvcmRFUzUoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWVFUzYoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNLZXl3b3JkRVM1OiBpc0tleXdvcmRFUzUsXG4gICAgICAgIGlzS2V5d29yZEVTNjogaXNLZXl3b3JkRVM2LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNTogaXNSZXNlcnZlZFdvcmRFUzUsXG4gICAgICAgIGlzUmVzZXJ2ZWRXb3JkRVM2OiBpc1Jlc2VydmVkV29yZEVTNixcbiAgICAgICAgaXNSZXN0cmljdGVkV29yZDogaXNSZXN0cmljdGVkV29yZCxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNTogaXNJZGVudGlmaWVyTmFtZUVTNSxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNjogaXNJZGVudGlmaWVyTmFtZUVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyRVM1OiBpc0lkZW50aWZpZXJFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNjogaXNJZGVudGlmaWVyRVM2XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydHMuUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdHJlZV9jb25zdHJ1Y3Rpb24vcGFyc2VyJyk7XHJcbmV4cG9ydHMuU2ltcGxlQXBpUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvc2ltcGxlX2FwaS9zaW1wbGVfYXBpX3BhcnNlcicpO1xyXG5leHBvcnRzLlRyZWVTZXJpYWxpemVyID1cclxuZXhwb3J0cy5TZXJpYWxpemVyID0gcmVxdWlyZSgnLi9saWIvc2VyaWFsaXphdGlvbi9zZXJpYWxpemVyJyk7XHJcbmV4cG9ydHMuSnNEb21QYXJzZXIgPSByZXF1aXJlKCcuL2xpYi9qc2RvbS9qc2RvbV9wYXJzZXInKTtcclxuXHJcbmV4cG9ydHMuVHJlZUFkYXB0ZXJzID0ge1xyXG4gICAgZGVmYXVsdDogcmVxdWlyZSgnLi9saWIvdHJlZV9hZGFwdGVycy9kZWZhdWx0JyksXHJcbiAgICBodG1scGFyc2VyMjogcmVxdWlyZSgnLi9saWIvdHJlZV9hZGFwdGVycy9odG1scGFyc2VyMicpXHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8vQ29uc3RcclxudmFyIFZBTElEX0RPQ1RZUEVfTkFNRSA9ICdodG1sJyxcclxuICAgIFFVSVJLU19NT0RFX1NZU1RFTV9JRCA9ICdodHRwOi8vd3d3LmlibS5jb20vZGF0YS9kdGQvdjExL2libXhodG1sMS10cmFuc2l0aW9uYWwuZHRkJyxcclxuICAgIFFVSVJLU19NT0RFX1BVQkxJQ19JRF9QUkVGSVhFUyA9IFtcclxuICAgICAgICBcIisvL3NpbG1hcmlsLy9kdGQgaHRtbCBwcm8gdjByMTEgMTk5NzAxMDEvL2VuXCIsXHJcbiAgICAgICAgXCItLy9hZHZhc29mdCBsdGQvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vZW5cIixcclxuICAgICAgICBcIi0vL2FzLy9kdGQgaHRtbCAzLjAgYXN3ZWRpdCArIGV4dGVuc2lvbnMvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCAyLjAgbGV2ZWwgMS8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAyLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdCBsZXZlbCAxLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdCBsZXZlbCAyLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdC8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDIuMC8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDIuMWUvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCAzLjAvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCAzLjAvL2VuLy9cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDMuMiBmaW5hbC8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDMuMi8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIDMvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAwLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMC8vZW4vLzIuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMS8vZW5cIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDEvL2VuLy8yLjBcIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDIvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAyLy9lbi8vMi4wXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAzLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMy8vZW4vLzMuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDAvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMC8vZW4vLzIuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDEvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMS8vZW4vLzIuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDIvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMi8vZW4vLzIuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDMvL2VuXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMy8vZW4vLzMuMFwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly9lbi8vMi4wXCIsXHJcbiAgICAgICAgXCItLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QvL2VuLy8zLjBcIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sLy9lblwiLFxyXG4gICAgICAgIFwiLS8vaWV0Zi8vZHRkIGh0bWwvL2VuLy8yLjBcIixcclxuICAgICAgICBcIi0vL2lldGYvL2R0ZCBodG1sLy9lbi8vMy4wXCIsXHJcbiAgICAgICAgXCItLy9tZXRyaXVzLy9kdGQgbWV0cml1cyBwcmVzZW50YXRpb25hbC8vZW5cIixcclxuICAgICAgICBcIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sIHN0cmljdC8vZW5cIixcclxuICAgICAgICBcIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sLy9lblwiLFxyXG4gICAgICAgIFwiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIHRhYmxlcy8vZW5cIixcclxuICAgICAgICBcIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sIHN0cmljdC8vZW5cIixcclxuICAgICAgICBcIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sLy9lblwiLFxyXG4gICAgICAgIFwiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIHRhYmxlcy8vZW5cIixcclxuICAgICAgICBcIi0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgaHRtbC8vZW5cIixcclxuICAgICAgICBcIi0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgc3RyaWN0IGh0bWwvL2VuXCIsXHJcbiAgICAgICAgXCItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgMi4wLy9lblwiLFxyXG4gICAgICAgIFwiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIDEuMC8vZW5cIixcclxuICAgICAgICBcIi0vL3NweWdsYXNzLy9kdGQgaHRtbCAyLjAgZXh0ZW5kZWQvL2VuXCIsXHJcbiAgICAgICAgXCItLy9zcS8vZHRkIGh0bWwgMi4wIGhvdG1ldGFsICsgZXh0ZW5zaW9ucy8vZW5cIixcclxuICAgICAgICBcIi0vL3N1biBtaWNyb3N5c3RlbXMgY29ycC4vL2R0ZCBob3RqYXZhIGh0bWwvL2VuXCIsXHJcbiAgICAgICAgXCItLy9zdW4gbWljcm9zeXN0ZW1zIGNvcnAuLy9kdGQgaG90amF2YSBzdHJpY3QgaHRtbC8vZW5cIixcclxuICAgICAgICBcIi0vL3czYy8vZHRkIGh0bWwgMyAxOTk1LTAzLTI0Ly9lblwiLFxyXG4gICAgICAgIFwiLS8vdzNjLy9kdGQgaHRtbCAzLjIgZHJhZnQvL2VuXCIsXHJcbiAgICAgICAgXCItLy93M2MvL2R0ZCBodG1sIDMuMiBmaW5hbC8vZW5cIixcclxuICAgICAgICBcIi0vL3czYy8vZHRkIGh0bWwgMy4yLy9lblwiLFxyXG4gICAgICAgIFwiLS8vdzNjLy9kdGQgaHRtbCAzLjJzIGRyYWZ0Ly9lblwiLFxyXG4gICAgICAgIFwiLS8vdzNjLy9kdGQgaHRtbCA0LjAgZnJhbWVzZXQvL2VuXCIsXHJcbiAgICAgICAgXCItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuXCIsXHJcbiAgICAgICAgXCItLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCAxOTk2MDcxMi8vZW5cIixcclxuICAgICAgICBcIi0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDk3MDQyMS8vZW5cIixcclxuICAgICAgICBcIi0vL3czYy8vZHRkIHczIGh0bWwvL2VuXCIsXHJcbiAgICAgICAgXCItLy93M28vL2R0ZCB3MyBodG1sIDMuMC8vZW5cIixcclxuICAgICAgICBcIi0vL3czby8vZHRkIHczIGh0bWwgMy4wLy9lbi8vXCIsXHJcbiAgICAgICAgXCItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbCAyLjAvL2VuXCIsXHJcbiAgICAgICAgXCItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbC8vZW5cIlxyXG4gICAgXSxcclxuICAgIFFVSVJLU19NT0RFX05PX1NZU1RFTV9JRF9QVUJMSUNfSURfUFJFRklYRVMgPSBbXHJcbiAgICAgICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wMSBmcmFtZXNldC8vJyxcclxuICAgICAgICAnLS8vdzNjLy9kdGQgaHRtbCA0LjAxIHRyYW5zaXRpb25hbC8vJ1xyXG4gICAgXSxcclxuICAgIFFVSVJLU19NT0RFX1BVQkxJQ19JRFMgPSBbXHJcbiAgICAgICAgJy0vL3czby8vZHRkIHczIGh0bWwgc3RyaWN0IDMuMC8vZW4vLycsXHJcbiAgICAgICAgJy0vdzNjL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvZW4nLFxyXG4gICAgICAgICdodG1sJ1xyXG4gICAgXTtcclxuXHJcblxyXG4vL1V0aWxzXHJcbmZ1bmN0aW9uIGVucXVvdGVEb2N0eXBlSWQoaWQpIHtcclxuICAgIHZhciBxdW90ZSA9IGlkLmluZGV4T2YoJ1wiJykgIT09IC0xID8gJ1xcJycgOiAnXCInO1xyXG5cclxuICAgIHJldHVybiBxdW90ZSArIGlkICsgcXVvdGU7XHJcbn1cclxuXHJcblxyXG4vL0FQSVxyXG5leHBvcnRzLmlzUXVpcmtzID0gZnVuY3Rpb24gKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge1xyXG4gICAgaWYgKG5hbWUgIT09IFZBTElEX0RPQ1RZUEVfTkFNRSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoc3lzdGVtSWQgJiYgc3lzdGVtSWQudG9Mb3dlckNhc2UoKSA9PT0gUVVJUktTX01PREVfU1lTVEVNX0lEKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmIChwdWJsaWNJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHB1YmxpY0lkID0gcHVibGljSWQudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKFFVSVJLU19NT0RFX1BVQkxJQ19JRFMuaW5kZXhPZihwdWJsaWNJZCkgPiAtMSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHZhciBwcmVmaXhlcyA9IFFVSVJLU19NT0RFX1BVQkxJQ19JRF9QUkVGSVhFUztcclxuXHJcbiAgICAgICAgaWYgKHN5c3RlbUlkID09PSBudWxsKVxyXG4gICAgICAgICAgICBwcmVmaXhlcyA9IHByZWZpeGVzLmNvbmNhdChRVUlSS1NfTU9ERV9OT19TWVNURU1fSURfUFVCTElDX0lEX1BSRUZJWEVTKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocHVibGljSWQuaW5kZXhPZihwcmVmaXhlc1tpXSkgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59O1xyXG5cclxuZXhwb3J0cy5zZXJpYWxpemVDb250ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge1xyXG4gICAgdmFyIHN0ciA9ICchRE9DVFlQRSAnICsgbmFtZTtcclxuXHJcbiAgICBpZiAocHVibGljSWQgIT09IG51bGwpXHJcbiAgICAgICAgc3RyICs9ICcgUFVCTElDICcgKyBlbnF1b3RlRG9jdHlwZUlkKHB1YmxpY0lkKTtcclxuXHJcbiAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPT0gbnVsbClcclxuICAgICAgICBzdHIgKz0gJyBTWVNURU0nO1xyXG5cclxuICAgIGlmIChzeXN0ZW1JZCAhPT0gbnVsbClcclxuICAgICAgICBzdHIgKz0gJyAnICsgZW5xdW90ZURvY3R5cGVJZChzeXN0ZW1JZCk7XHJcblxyXG4gICAgcmV0dXJuIHN0cjtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFRva2VuaXplciA9IHJlcXVpcmUoJy4uL3Rva2VuaXphdGlvbi90b2tlbml6ZXInKSxcclxuICAgIEhUTUwgPSByZXF1aXJlKCcuL2h0bWwnKTtcclxuXHJcbi8vQWxpYXNlc1xyXG52YXIgJCA9IEhUTUwuVEFHX05BTUVTLFxyXG4gICAgTlMgPSBIVE1MLk5BTUVTUEFDRVMsXHJcbiAgICBBVFRSUyA9IEhUTUwuQVRUUlM7XHJcblxyXG5cclxuLy9NSU1FIHR5cGVzXHJcbnZhciBNSU1FX1RZUEVTID0ge1xyXG4gICAgVEVYVF9IVE1MOiAndGV4dC9odG1sJyxcclxuICAgIEFQUExJQ0FUSU9OX1hNTDogJ2FwcGxpY2F0aW9uL3hodG1sK3htbCdcclxufTtcclxuXHJcbi8vQXR0cmlidXRlc1xyXG52YXIgREVGSU5JVElPTl9VUkxfQVRUUiA9ICdkZWZpbml0aW9udXJsJyxcclxuICAgIEFESlVTVEVEX0RFRklOSVRJT05fVVJMX0FUVFIgPSAnZGVmaW5pdGlvblVSTCcsXHJcbiAgICBTVkdfQVRUUlNfQURKVVNUTUVOVF9NQVAgPSB7XHJcbiAgICAgICAgJ2F0dHJpYnV0ZW5hbWUnOiAnYXR0cmlidXRlTmFtZScsXHJcbiAgICAgICAgJ2F0dHJpYnV0ZXR5cGUnOiAnYXR0cmlidXRlVHlwZScsXHJcbiAgICAgICAgJ2Jhc2VmcmVxdWVuY3knOiAnYmFzZUZyZXF1ZW5jeScsXHJcbiAgICAgICAgJ2Jhc2Vwcm9maWxlJzogJ2Jhc2VQcm9maWxlJyxcclxuICAgICAgICAnY2FsY21vZGUnOiAnY2FsY01vZGUnLFxyXG4gICAgICAgICdjbGlwcGF0aHVuaXRzJzogJ2NsaXBQYXRoVW5pdHMnLFxyXG4gICAgICAgICdjb250ZW50c2NyaXB0dHlwZSc6ICdjb250ZW50U2NyaXB0VHlwZScsXHJcbiAgICAgICAgJ2NvbnRlbnRzdHlsZXR5cGUnOiAnY29udGVudFN0eWxlVHlwZScsXHJcbiAgICAgICAgJ2RpZmZ1c2Vjb25zdGFudCc6ICdkaWZmdXNlQ29uc3RhbnQnLFxyXG4gICAgICAgICdlZGdlbW9kZSc6ICdlZGdlTW9kZScsXHJcbiAgICAgICAgJ2V4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQnOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXHJcbiAgICAgICAgJ2ZpbHRlcnJlcyc6ICdmaWx0ZXJSZXMnLFxyXG4gICAgICAgICdmaWx0ZXJ1bml0cyc6ICdmaWx0ZXJVbml0cycsXHJcbiAgICAgICAgJ2dseXBocmVmJzogJ2dseXBoUmVmJyxcclxuICAgICAgICAnZ3JhZGllbnR0cmFuc2Zvcm0nOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxyXG4gICAgICAgICdncmFkaWVudHVuaXRzJzogJ2dyYWRpZW50VW5pdHMnLFxyXG4gICAgICAgICdrZXJuZWxtYXRyaXgnOiAna2VybmVsTWF0cml4JyxcclxuICAgICAgICAna2VybmVsdW5pdGxlbmd0aCc6ICdrZXJuZWxVbml0TGVuZ3RoJyxcclxuICAgICAgICAna2V5cG9pbnRzJzogJ2tleVBvaW50cycsXHJcbiAgICAgICAgJ2tleXNwbGluZXMnOiAna2V5U3BsaW5lcycsXHJcbiAgICAgICAgJ2tleXRpbWVzJzogJ2tleVRpbWVzJyxcclxuICAgICAgICAnbGVuZ3RoYWRqdXN0JzogJ2xlbmd0aEFkanVzdCcsXHJcbiAgICAgICAgJ2xpbWl0aW5nY29uZWFuZ2xlJzogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcclxuICAgICAgICAnbWFya2VyaGVpZ2h0JzogJ21hcmtlckhlaWdodCcsXHJcbiAgICAgICAgJ21hcmtlcnVuaXRzJzogJ21hcmtlclVuaXRzJyxcclxuICAgICAgICAnbWFya2Vyd2lkdGgnOiAnbWFya2VyV2lkdGgnLFxyXG4gICAgICAgICdtYXNrY29udGVudHVuaXRzJzogJ21hc2tDb250ZW50VW5pdHMnLFxyXG4gICAgICAgICdtYXNrdW5pdHMnOiAnbWFza1VuaXRzJyxcclxuICAgICAgICAnbnVtb2N0YXZlcyc6ICdudW1PY3RhdmVzJyxcclxuICAgICAgICAncGF0aGxlbmd0aCc6ICdwYXRoTGVuZ3RoJyxcclxuICAgICAgICAncGF0dGVybmNvbnRlbnR1bml0cyc6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcclxuICAgICAgICAncGF0dGVybnRyYW5zZm9ybSc6ICdwYXR0ZXJuVHJhbnNmb3JtJyxcclxuICAgICAgICAncGF0dGVybnVuaXRzJzogJ3BhdHRlcm5Vbml0cycsXHJcbiAgICAgICAgJ3BvaW50c2F0eCc6ICdwb2ludHNBdFgnLFxyXG4gICAgICAgICdwb2ludHNhdHknOiAncG9pbnRzQXRZJyxcclxuICAgICAgICAncG9pbnRzYXR6JzogJ3BvaW50c0F0WicsXHJcbiAgICAgICAgJ3ByZXNlcnZlYWxwaGEnOiAncHJlc2VydmVBbHBoYScsXHJcbiAgICAgICAgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXHJcbiAgICAgICAgJ3ByaW1pdGl2ZXVuaXRzJzogJ3ByaW1pdGl2ZVVuaXRzJyxcclxuICAgICAgICAncmVmeCc6ICdyZWZYJyxcclxuICAgICAgICAncmVmeSc6ICdyZWZZJyxcclxuICAgICAgICAncmVwZWF0Y291bnQnOiAncmVwZWF0Q291bnQnLFxyXG4gICAgICAgICdyZXBlYXRkdXInOiAncmVwZWF0RHVyJyxcclxuICAgICAgICAncmVxdWlyZWRleHRlbnNpb25zJzogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXHJcbiAgICAgICAgJ3JlcXVpcmVkZmVhdHVyZXMnOiAncmVxdWlyZWRGZWF0dXJlcycsXHJcbiAgICAgICAgJ3NwZWN1bGFyY29uc3RhbnQnOiAnc3BlY3VsYXJDb25zdGFudCcsXHJcbiAgICAgICAgJ3NwZWN1bGFyZXhwb25lbnQnOiAnc3BlY3VsYXJFeHBvbmVudCcsXHJcbiAgICAgICAgJ3NwcmVhZG1ldGhvZCc6ICdzcHJlYWRNZXRob2QnLFxyXG4gICAgICAgICdzdGFydG9mZnNldCc6ICdzdGFydE9mZnNldCcsXHJcbiAgICAgICAgJ3N0ZGRldmlhdGlvbic6ICdzdGREZXZpYXRpb24nLFxyXG4gICAgICAgICdzdGl0Y2h0aWxlcyc6ICdzdGl0Y2hUaWxlcycsXHJcbiAgICAgICAgJ3N1cmZhY2VzY2FsZSc6ICdzdXJmYWNlU2NhbGUnLFxyXG4gICAgICAgICdzeXN0ZW1sYW5ndWFnZSc6ICdzeXN0ZW1MYW5ndWFnZScsXHJcbiAgICAgICAgJ3RhYmxldmFsdWVzJzogJ3RhYmxlVmFsdWVzJyxcclxuICAgICAgICAndGFyZ2V0eCc6ICd0YXJnZXRYJyxcclxuICAgICAgICAndGFyZ2V0eSc6ICd0YXJnZXRZJyxcclxuICAgICAgICAndGV4dGxlbmd0aCc6ICd0ZXh0TGVuZ3RoJyxcclxuICAgICAgICAndmlld2JveCc6ICd2aWV3Qm94JyxcclxuICAgICAgICAndmlld3RhcmdldCc6ICd2aWV3VGFyZ2V0JyxcclxuICAgICAgICAneGNoYW5uZWxzZWxlY3Rvcic6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcclxuICAgICAgICAneWNoYW5uZWxzZWxlY3Rvcic6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcclxuICAgICAgICAnem9vbWFuZHBhbic6ICd6b29tQW5kUGFuJ1xyXG4gICAgfSxcclxuICAgIFhNTF9BVFRSU19BREpVU1RNRU5UX01BUCA9IHtcclxuICAgICAgICAneGxpbms6YWN0dWF0ZSc6IHtwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdhY3R1YXRlJywgbmFtZXNwYWNlOiBOUy5YTElOS30sXHJcbiAgICAgICAgJ3hsaW5rOmFyY3JvbGUnOiB7cHJlZml4OiAneGxpbmsnLCBuYW1lOiAnYXJjcm9sZScsIG5hbWVzcGFjZTogTlMuWExJTkt9LFxyXG4gICAgICAgICd4bGluazpocmVmJzoge3ByZWZpeDogJ3hsaW5rJywgbmFtZTogJ2hyZWYnLCBuYW1lc3BhY2U6IE5TLlhMSU5LfSxcclxuICAgICAgICAneGxpbms6cm9sZSc6IHtwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdyb2xlJywgbmFtZXNwYWNlOiBOUy5YTElOS30sXHJcbiAgICAgICAgJ3hsaW5rOnNob3cnOiB7cHJlZml4OiAneGxpbmsnLCBuYW1lOiAnc2hvdycsIG5hbWVzcGFjZTogTlMuWExJTkt9LFxyXG4gICAgICAgICd4bGluazp0aXRsZSc6IHtwcmVmaXg6ICd4bGluaycsIG5hbWU6ICd0aXRsZScsIG5hbWVzcGFjZTogTlMuWExJTkt9LFxyXG4gICAgICAgICd4bGluazp0eXBlJzoge3ByZWZpeDogJ3hsaW5rJywgbmFtZTogJ3R5cGUnLCBuYW1lc3BhY2U6IE5TLlhMSU5LfSxcclxuICAgICAgICAneG1sOmJhc2UnOiB7cHJlZml4OiAneG1sJywgbmFtZTogJ2Jhc2UnLCBuYW1lc3BhY2U6IE5TLlhNTH0sXHJcbiAgICAgICAgJ3htbDpsYW5nJzoge3ByZWZpeDogJ3htbCcsIG5hbWU6ICdsYW5nJywgbmFtZXNwYWNlOiBOUy5YTUx9LFxyXG4gICAgICAgICd4bWw6c3BhY2UnOiB7cHJlZml4OiAneG1sJywgbmFtZTogJ3NwYWNlJywgbmFtZXNwYWNlOiBOUy5YTUx9LFxyXG4gICAgICAgICd4bWxucyc6IHtwcmVmaXg6ICcnLCBuYW1lOiAneG1sbnMnLCBuYW1lc3BhY2U6IE5TLlhNTE5TfSxcclxuICAgICAgICAneG1sbnM6eGxpbmsnOiB7cHJlZml4OiAneG1sbnMnLCBuYW1lOiAneGxpbmsnLCBuYW1lc3BhY2U6IE5TLlhNTE5TfVxyXG5cclxuICAgIH07XHJcblxyXG4vL1NWRyB0YWcgbmFtZXMgYWRqdXN0bWVudCBtYXBcclxudmFyIFNWR19UQUdfTkFNRVNfQURKVVNUTUVOVF9NQVAgPSB7XHJcbiAgICAnYWx0Z2x5cGgnOiAnYWx0R2x5cGgnLFxyXG4gICAgJ2FsdGdseXBoZGVmJzogJ2FsdEdseXBoRGVmJyxcclxuICAgICdhbHRnbHlwaGl0ZW0nOiAnYWx0R2x5cGhJdGVtJyxcclxuICAgICdhbmltYXRlY29sb3InOiAnYW5pbWF0ZUNvbG9yJyxcclxuICAgICdhbmltYXRlbW90aW9uJzogJ2FuaW1hdGVNb3Rpb24nLFxyXG4gICAgJ2FuaW1hdGV0cmFuc2Zvcm0nOiAnYW5pbWF0ZVRyYW5zZm9ybScsXHJcbiAgICAnY2xpcHBhdGgnOiAnY2xpcFBhdGgnLFxyXG4gICAgJ2ZlYmxlbmQnOiAnZmVCbGVuZCcsXHJcbiAgICAnZmVjb2xvcm1hdHJpeCc6ICdmZUNvbG9yTWF0cml4JyxcclxuICAgICdmZWNvbXBvbmVudHRyYW5zZmVyJzogJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxyXG4gICAgJ2ZlY29tcG9zaXRlJzogJ2ZlQ29tcG9zaXRlJyxcclxuICAgICdmZWNvbnZvbHZlbWF0cml4JzogJ2ZlQ29udm9sdmVNYXRyaXgnLFxyXG4gICAgJ2ZlZGlmZnVzZWxpZ2h0aW5nJzogJ2ZlRGlmZnVzZUxpZ2h0aW5nJyxcclxuICAgICdmZWRpc3BsYWNlbWVudG1hcCc6ICdmZURpc3BsYWNlbWVudE1hcCcsXHJcbiAgICAnZmVkaXN0YW50bGlnaHQnOiAnZmVEaXN0YW50TGlnaHQnLFxyXG4gICAgJ2ZlZmxvb2QnOiAnZmVGbG9vZCcsXHJcbiAgICAnZmVmdW5jYSc6ICdmZUZ1bmNBJyxcclxuICAgICdmZWZ1bmNiJzogJ2ZlRnVuY0InLFxyXG4gICAgJ2ZlZnVuY2cnOiAnZmVGdW5jRycsXHJcbiAgICAnZmVmdW5jcic6ICdmZUZ1bmNSJyxcclxuICAgICdmZWdhdXNzaWFuYmx1cic6ICdmZUdhdXNzaWFuQmx1cicsXHJcbiAgICAnZmVpbWFnZSc6ICdmZUltYWdlJyxcclxuICAgICdmZW1lcmdlJzogJ2ZlTWVyZ2UnLFxyXG4gICAgJ2ZlbWVyZ2Vub2RlJzogJ2ZlTWVyZ2VOb2RlJyxcclxuICAgICdmZW1vcnBob2xvZ3knOiAnZmVNb3JwaG9sb2d5JyxcclxuICAgICdmZW9mZnNldCc6ICdmZU9mZnNldCcsXHJcbiAgICAnZmVwb2ludGxpZ2h0JzogJ2ZlUG9pbnRMaWdodCcsXHJcbiAgICAnZmVzcGVjdWxhcmxpZ2h0aW5nJzogJ2ZlU3BlY3VsYXJMaWdodGluZycsXHJcbiAgICAnZmVzcG90bGlnaHQnOiAnZmVTcG90TGlnaHQnLFxyXG4gICAgJ2ZldGlsZSc6ICdmZVRpbGUnLFxyXG4gICAgJ2ZldHVyYnVsZW5jZSc6ICdmZVR1cmJ1bGVuY2UnLFxyXG4gICAgJ2ZvcmVpZ25vYmplY3QnOiAnZm9yZWlnbk9iamVjdCcsXHJcbiAgICAnZ2x5cGhyZWYnOiAnZ2x5cGhSZWYnLFxyXG4gICAgJ2xpbmVhcmdyYWRpZW50JzogJ2xpbmVhckdyYWRpZW50JyxcclxuICAgICdyYWRpYWxncmFkaWVudCc6ICdyYWRpYWxHcmFkaWVudCcsXHJcbiAgICAndGV4dHBhdGgnOiAndGV4dFBhdGgnXHJcbn07XHJcblxyXG4vL1RhZ3MgdGhhdCBjYXVzZXMgZXhpdCBmcm9tIGZvcmVpZ24gY29udGVudFxyXG52YXIgRVhJVFNfRk9SRUlHTl9DT05URU5UID0ge307XHJcblxyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5CXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkJJR10gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5CTE9DS1FVT1RFXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkJPRFldID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuQlJdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuQ0VOVEVSXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkNPREVdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuRERdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuRElWXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkRMXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkRUXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkVNXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkVNQkVEXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkgxXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkgyXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkgzXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkg0XSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkg1XSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkg2XSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLkhFQURdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuSFJdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuSV0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5JTUddID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuTEldID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuTElTVElOR10gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5NRU5VXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLk1FVEFdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuTk9CUl0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5PTF0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5QXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLlBSRV0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5SVUJZXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLlNdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuU01BTExdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuU1BBTl0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5TVFJPTkddID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuU1RSSUtFXSA9IHRydWU7XHJcbkVYSVRTX0ZPUkVJR05fQ09OVEVOVFskLlNVQl0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5TVVBdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuVEFCTEVdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuVFRdID0gdHJ1ZTtcclxuRVhJVFNfRk9SRUlHTl9DT05URU5UWyQuVV0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5VTF0gPSB0cnVlO1xyXG5FWElUU19GT1JFSUdOX0NPTlRFTlRbJC5WQVJdID0gdHJ1ZTtcclxuXHJcbi8vQ2hlY2sgZXhpdCBmcm9tIGZvcmVpZ24gY29udGVudFxyXG5leHBvcnRzLmNhdXNlc0V4aXQgPSBmdW5jdGlvbiAoc3RhcnRUYWdUb2tlbikge1xyXG4gICAgdmFyIHRuID0gc3RhcnRUYWdUb2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5GT05UICYmIChUb2tlbml6ZXIuZ2V0VG9rZW5BdHRyKHN0YXJ0VGFnVG9rZW4sIEFUVFJTLkNPTE9SKSAhPT0gbnVsbCB8fFxyXG4gICAgICAgIFRva2VuaXplci5nZXRUb2tlbkF0dHIoc3RhcnRUYWdUb2tlbiwgQVRUUlMuU0laRSkgIT09IG51bGwgfHxcclxuICAgICAgICBUb2tlbml6ZXIuZ2V0VG9rZW5BdHRyKHN0YXJ0VGFnVG9rZW4sIEFUVFJTLkZBQ0UpICE9PSBudWxsKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBFWElUU19GT1JFSUdOX0NPTlRFTlRbdG5dO1xyXG59O1xyXG5cclxuLy9Ub2tlbiBhZGp1c3RtZW50c1xyXG5leHBvcnRzLmFkanVzdFRva2VuTWF0aE1MQXR0cnMgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW4uYXR0cnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodG9rZW4uYXR0cnNbaV0ubmFtZSA9PT0gREVGSU5JVElPTl9VUkxfQVRUUikge1xyXG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lID0gQURKVVNURURfREVGSU5JVElPTl9VUkxfQVRUUjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0cy5hZGp1c3RUb2tlblNWR0F0dHJzID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2VuLmF0dHJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGFkanVzdGVkQXR0ck5hbWUgPSBTVkdfQVRUUlNfQURKVVNUTUVOVF9NQVBbdG9rZW4uYXR0cnNbaV0ubmFtZV07XHJcblxyXG4gICAgICAgIGlmIChhZGp1c3RlZEF0dHJOYW1lKVxyXG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lID0gYWRqdXN0ZWRBdHRyTmFtZTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydHMuYWRqdXN0VG9rZW5YTUxBdHRycyA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbi5hdHRycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBhZGp1c3RlZEF0dHJFbnRyeSA9IFhNTF9BVFRSU19BREpVU1RNRU5UX01BUFt0b2tlbi5hdHRyc1tpXS5uYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKGFkanVzdGVkQXR0ckVudHJ5KSB7XHJcbiAgICAgICAgICAgIHRva2VuLmF0dHJzW2ldLnByZWZpeCA9IGFkanVzdGVkQXR0ckVudHJ5LnByZWZpeDtcclxuICAgICAgICAgICAgdG9rZW4uYXR0cnNbaV0ubmFtZSA9IGFkanVzdGVkQXR0ckVudHJ5Lm5hbWU7XHJcbiAgICAgICAgICAgIHRva2VuLmF0dHJzW2ldLm5hbWVzcGFjZSA9IGFkanVzdGVkQXR0ckVudHJ5Lm5hbWVzcGFjZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnRzLmFkanVzdFRva2VuU1ZHVGFnTmFtZSA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgdmFyIGFkanVzdGVkVGFnTmFtZSA9IFNWR19UQUdfTkFNRVNfQURKVVNUTUVOVF9NQVBbdG9rZW4udGFnTmFtZV07XHJcblxyXG4gICAgaWYgKGFkanVzdGVkVGFnTmFtZSlcclxuICAgICAgICB0b2tlbi50YWdOYW1lID0gYWRqdXN0ZWRUYWdOYW1lO1xyXG59O1xyXG5cclxuLy9JbnRlZ3JhdGlvbiBwb2ludHNcclxuZXhwb3J0cy5pc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50ID0gZnVuY3Rpb24gKHRuLCBucykge1xyXG4gICAgcmV0dXJuIG5zID09PSBOUy5NQVRITUwgJiYgKHRuID09PSAkLk1JIHx8IHRuID09PSAkLk1PIHx8IHRuID09PSAkLk1OIHx8IHRuID09PSAkLk1TIHx8IHRuID09PSAkLk1URVhUKTtcclxufTtcclxuXHJcbmV4cG9ydHMuaXNIdG1sSW50ZWdyYXRpb25Qb2ludCA9IGZ1bmN0aW9uICh0biwgbnMsIGF0dHJzKSB7XHJcbiAgICBpZiAobnMgPT09IE5TLk1BVEhNTCAmJiB0biA9PT0gJC5BTk5PVEFUSU9OX1hNTCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGF0dHJzW2ldLm5hbWUgPT09IEFUVFJTLkVOQ09ESU5HKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhdHRyc1tpXS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gTUlNRV9UWVBFUy5URVhUX0hUTUwgfHwgdmFsdWUgPT09IE1JTUVfVFlQRVMuQVBQTElDQVRJT05fWE1MO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBucyA9PT0gTlMuU1ZHICYmICh0biA9PT0gJC5GT1JFSUdOX09CSkVDVCB8fCB0biA9PT0gJC5ERVNDIHx8IHRuID09PSAkLlRJVExFKTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIE5TID0gZXhwb3J0cy5OQU1FU1BBQ0VTID0ge1xyXG4gICAgSFRNTDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLFxyXG4gICAgTUFUSE1MOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcsXHJcbiAgICBTVkc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXHJcbiAgICBYTElOSzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLFxyXG4gICAgWE1MOiAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyxcclxuICAgIFhNTE5TOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nXHJcbn07XHJcblxyXG5leHBvcnRzLkFUVFJTID0ge1xyXG4gICAgVFlQRTogJ3R5cGUnLFxyXG4gICAgQUNUSU9OOiAnYWN0aW9uJyxcclxuICAgIEVOQ09ESU5HOiAnZW5jb2RpbmcnLFxyXG4gICAgUFJPTVBUOiAncHJvbXB0JyxcclxuICAgIE5BTUU6ICduYW1lJyxcclxuICAgIENPTE9SOiAnY29sb3InLFxyXG4gICAgRkFDRTogJ2ZhY2UnLFxyXG4gICAgU0laRTogJ3NpemUnXHJcbn07XHJcblxyXG52YXIgJCA9IGV4cG9ydHMuVEFHX05BTUVTID0ge1xyXG4gICAgQTogJ2EnLFxyXG4gICAgQUREUkVTUzogJ2FkZHJlc3MnLFxyXG4gICAgQU5OT1RBVElPTl9YTUw6ICdhbm5vdGF0aW9uLXhtbCcsXHJcbiAgICBBUFBMRVQ6ICdhcHBsZXQnLFxyXG4gICAgQVJFQTogJ2FyZWEnLFxyXG4gICAgQVJUSUNMRTogJ2FydGljbGUnLFxyXG4gICAgQVNJREU6ICdhc2lkZScsXHJcblxyXG4gICAgQjogJ2InLFxyXG4gICAgQkFTRTogJ2Jhc2UnLFxyXG4gICAgQkFTRUZPTlQ6ICdiYXNlZm9udCcsXHJcbiAgICBCR1NPVU5EOiAnYmdzb3VuZCcsXHJcbiAgICBCSUc6ICdiaWcnLFxyXG4gICAgQkxPQ0tRVU9URTogJ2Jsb2NrcXVvdGUnLFxyXG4gICAgQk9EWTogJ2JvZHknLFxyXG4gICAgQlI6ICdicicsXHJcbiAgICBCVVRUT046ICdidXR0b24nLFxyXG5cclxuICAgIENBUFRJT046ICdjYXB0aW9uJyxcclxuICAgIENFTlRFUjogJ2NlbnRlcicsXHJcbiAgICBDT0RFOiAnY29kZScsXHJcbiAgICBDT0w6ICdjb2wnLFxyXG4gICAgQ09MR1JPVVA6ICdjb2xncm91cCcsXHJcbiAgICBDT01NQU5EOiAnY29tbWFuZCcsXHJcblxyXG4gICAgREQ6ICdkZCcsXHJcbiAgICBERVNDOiAnZGVzYycsXHJcbiAgICBERVRBSUxTOiAnZGV0YWlscycsXHJcbiAgICBESUFMT0c6ICdkaWFsb2cnLFxyXG4gICAgRElSOiAnZGlyJyxcclxuICAgIERJVjogJ2RpdicsXHJcbiAgICBETDogJ2RsJyxcclxuICAgIERUOiAnZHQnLFxyXG5cclxuICAgIEVNOiAnZW0nLFxyXG4gICAgRU1CRUQ6ICdlbWJlZCcsXHJcblxyXG4gICAgRklFTERTRVQ6ICdmaWVsZHNldCcsXHJcbiAgICBGSUdDQVBUSU9OOiAnZmlnY2FwdGlvbicsXHJcbiAgICBGSUdVUkU6ICdmaWd1cmUnLFxyXG4gICAgRk9OVDogJ2ZvbnQnLFxyXG4gICAgRk9PVEVSOiAnZm9vdGVyJyxcclxuICAgIEZPUkVJR05fT0JKRUNUOiAnZm9yZWlnbk9iamVjdCcsXHJcbiAgICBGT1JNOiAnZm9ybScsXHJcbiAgICBGUkFNRTogJ2ZyYW1lJyxcclxuICAgIEZSQU1FU0VUOiAnZnJhbWVzZXQnLFxyXG5cclxuICAgIEgxOiAnaDEnLFxyXG4gICAgSDI6ICdoMicsXHJcbiAgICBIMzogJ2gzJyxcclxuICAgIEg0OiAnaDQnLFxyXG4gICAgSDU6ICdoNScsXHJcbiAgICBINjogJ2g2JyxcclxuICAgIEhFQUQ6ICdoZWFkJyxcclxuICAgIEhFQURFUjogJ2hlYWRlcicsXHJcbiAgICBIR1JPVVA6ICdoZ3JvdXAnLFxyXG4gICAgSFI6ICdocicsXHJcbiAgICBIVE1MOiAnaHRtbCcsXHJcblxyXG4gICAgSTogJ2knLFxyXG4gICAgSU1HOiAnaW1nJyxcclxuICAgIElNQUdFOiAnaW1hZ2UnLFxyXG4gICAgSU5QVVQ6ICdpbnB1dCcsXHJcbiAgICBJRlJBTUU6ICdpZnJhbWUnLFxyXG4gICAgSVNJTkRFWDogJ2lzaW5kZXgnLFxyXG5cclxuICAgIEtFWUdFTjogJ2tleWdlbicsXHJcblxyXG4gICAgTEFCRUw6ICdsYWJlbCcsXHJcbiAgICBMSTogJ2xpJyxcclxuICAgIExJTks6ICdsaW5rJyxcclxuICAgIExJU1RJTkc6ICdsaXN0aW5nJyxcclxuXHJcbiAgICBNQUlOOiAnbWFpbicsXHJcbiAgICBNQUxJR05NQVJLOiAnbWFsaWdubWFyaycsXHJcbiAgICBNQVJRVUVFOiAnbWFycXVlZScsXHJcbiAgICBNQVRIOiAnbWF0aCcsXHJcbiAgICBNRU5VOiAnbWVudScsXHJcbiAgICBNRU5VSVRFTTogJ21lbnVpdGVtJyxcclxuICAgIE1FVEE6ICdtZXRhJyxcclxuICAgIE1HTFlQSDogJ21nbHlwaCcsXHJcbiAgICBNSTogJ21pJyxcclxuICAgIE1POiAnbW8nLFxyXG4gICAgTU46ICdtbicsXHJcbiAgICBNUzogJ21zJyxcclxuICAgIE1URVhUOiAnbXRleHQnLFxyXG5cclxuICAgIE5BVjogJ25hdicsXHJcbiAgICBOT0JSOiAnbm9icicsXHJcbiAgICBOT0ZSQU1FUzogJ25vZnJhbWVzJyxcclxuICAgIE5PRU1CRUQ6ICdub2VtYmVkJyxcclxuICAgIE5PU0NSSVBUOiAnbm9zY3JpcHQnLFxyXG5cclxuICAgIE9CSkVDVDogJ29iamVjdCcsXHJcbiAgICBPTDogJ29sJyxcclxuICAgIE9QVEdST1VQOiAnb3B0Z3JvdXAnLFxyXG4gICAgT1BUSU9OOiAnb3B0aW9uJyxcclxuXHJcbiAgICBQOiAncCcsXHJcbiAgICBQQVJBTTogJ3BhcmFtJyxcclxuICAgIFBMQUlOVEVYVDogJ3BsYWludGV4dCcsXHJcbiAgICBQUkU6ICdwcmUnLFxyXG5cclxuICAgIFJQOiAncnAnLFxyXG4gICAgUlQ6ICdydCcsXHJcbiAgICBSVUJZOiAncnVieScsXHJcblxyXG4gICAgUzogJ3MnLFxyXG4gICAgU0NSSVBUOiAnc2NyaXB0JyxcclxuICAgIFNFQ1RJT046ICdzZWN0aW9uJyxcclxuICAgIFNFTEVDVDogJ3NlbGVjdCcsXHJcbiAgICBTT1VSQ0U6ICdzb3VyY2UnLFxyXG4gICAgU01BTEw6ICdzbWFsbCcsXHJcbiAgICBTUEFOOiAnc3BhbicsXHJcbiAgICBTVFJJS0U6ICdzdHJpa2UnLFxyXG4gICAgU1RST05HOiAnc3Ryb25nJyxcclxuICAgIFNUWUxFOiAnc3R5bGUnLFxyXG4gICAgU1VCOiAnc3ViJyxcclxuICAgIFNVTU1BUlk6ICdzdW1tYXJ5JyxcclxuICAgIFNVUDogJ3N1cCcsXHJcblxyXG4gICAgVEFCTEU6ICd0YWJsZScsXHJcbiAgICBUQk9EWTogJ3Rib2R5JyxcclxuICAgIFRFTVBMQVRFOiAndGVtcGxhdGUnLFxyXG4gICAgVEVYVEFSRUE6ICd0ZXh0YXJlYScsXHJcbiAgICBURk9PVDogJ3Rmb290JyxcclxuICAgIFREOiAndGQnLFxyXG4gICAgVEg6ICd0aCcsXHJcbiAgICBUSEVBRDogJ3RoZWFkJyxcclxuICAgIFRJVExFOiAndGl0bGUnLFxyXG4gICAgVFI6ICd0cicsXHJcbiAgICBUUkFDSzogJ3RyYWNrJyxcclxuICAgIFRUOiAndHQnLFxyXG5cclxuICAgIFU6ICd1JyxcclxuICAgIFVMOiAndWwnLFxyXG5cclxuICAgIFNWRzogJ3N2ZycsXHJcblxyXG4gICAgVkFSOiAndmFyJyxcclxuXHJcbiAgICBXQlI6ICd3YnInLFxyXG5cclxuICAgIFhNUDogJ3htcCdcclxufTtcclxuXHJcbnZhciBTUEVDSUFMX0VMRU1FTlRTID0gZXhwb3J0cy5TUEVDSUFMX0VMRU1FTlRTID0ge307XHJcblxyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdID0ge307XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5BRERSRVNTXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5BUFBMRVRdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkFSRUFdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkFSVElDTEVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkFTSURFXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5CQVNFXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5CQVNFRk9OVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQkdTT1VORF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQkxPQ0tRVU9URV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQk9EWV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQlJdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkJVVFRPTl0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQ0FQVElPTl0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuQ0VOVEVSXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5DT0xdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkNPTEdST1VQXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5ERF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuREVUQUlMU10gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuRElSXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5ESVZdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkRMXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5EVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuRU1CRURdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkZJRUxEU0VUXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5GSUdDQVBUSU9OXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5GSUdVUkVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkZPT1RFUl0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuRk9STV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuRlJBTUVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkZSQU1FU0VUXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5IMV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuSDJdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkgzXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5INF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuSDVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkg2XSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5IRUFEXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5IRUFERVJdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkhHUk9VUF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuSFJdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkhUTUxdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLklGUkFNRV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuSU1HXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5JTlBVVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuSVNJTkRFWF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuTEldID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkxJTktdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLkxJU1RJTkddID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk1BSU5dID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk1BUlFVRUVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk1FTlVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk1FTlVJVEVNXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5NRVRBXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5OQVZdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk5PRU1CRURdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLk5PRlJBTUVTXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5OT1NDUklQVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuT0JKRUNUXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5PTF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuUF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuUEFSQU1dID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlBMQUlOVEVYVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuUFJFXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5TQ1JJUFRdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlNFQ1RJT05dID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlNFTEVDVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuU09VUkNFXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5TVFlMRV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuU1VNTUFSWV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuVEFCTEVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlRCT0RZXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5URF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuVEVNUExBVEVdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlRFWFRBUkVBXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5URk9PVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuVEhdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlRIRUFEXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5USVRMRV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuVFJdID0gdHJ1ZTtcclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5IVE1MXVskLlRSQUNLXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5VTF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLkhUTUxdWyQuV0JSXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuSFRNTF1bJC5YTVBdID0gdHJ1ZTtcclxuXHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuTUFUSE1MXSA9IHt9O1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5NSV0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5NT10gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5NTl0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5NU10gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5NVEVYVF0gPSB0cnVlO1xyXG5TUEVDSUFMX0VMRU1FTlRTW05TLk1BVEhNTF1bJC5BTk5PVEFUSU9OX1hNTF0gPSB0cnVlO1xyXG5cclxuU1BFQ0lBTF9FTEVNRU5UU1tOUy5TVkddID0ge307XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuU1ZHXVskLlRJVExFXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuU1ZHXVskLkZPUkVJR05fT0JKRUNUXSA9IHRydWU7XHJcblNQRUNJQUxfRUxFTUVOVFNbTlMuU1ZHXVskLkRFU0NdID0gdHJ1ZTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuZXhwb3J0cy5SRVBMQUNFTUVOVF9DSEFSQUNURVIgPSAnXFx1RkZGRCc7XHJcblxyXG5leHBvcnRzLkNPREVfUE9JTlRTID0ge1xyXG4gICAgRU9GOiAtMSxcclxuICAgIE5VTEw6IDB4MDAsXHJcbiAgICBUQUJVTEFUSU9OOiAweDA5LFxyXG4gICAgQ0FSUklBR0VfUkVUVVJOOiAweDBELFxyXG4gICAgTElORV9GRUVEOiAweDBBLFxyXG4gICAgRk9STV9GRUVEOiAweDBDLFxyXG4gICAgU1BBQ0U6IDB4MjAsXHJcbiAgICBFWENMQU1BVElPTl9NQVJLOiAweDIxLFxyXG4gICAgUVVPVEFUSU9OX01BUks6IDB4MjIsXHJcbiAgICBOVU1CRVJfU0lHTjogMHgyMyxcclxuICAgIEFNUEVSU0FORDogMHgyNixcclxuICAgIEFQT1NUUk9QSEU6IDB4MjcsXHJcbiAgICBIWVBIRU5fTUlOVVM6IDB4MkQsXHJcbiAgICBTT0xJRFVTOiAweDJGLFxyXG4gICAgRElHSVRfMDogMHgzMCxcclxuICAgIERJR0lUXzk6IDB4MzksXHJcbiAgICBTRU1JQ09MT046IDB4M0IsXHJcbiAgICBMRVNTX1RIQU5fU0lHTjogMHgzQyxcclxuICAgIEVRVUFMU19TSUdOOiAweDNELFxyXG4gICAgR1JFQVRFUl9USEFOX1NJR046IDB4M0UsXHJcbiAgICBRVUVTVElPTl9NQVJLOiAweDNGLFxyXG4gICAgTEFUSU5fQ0FQSVRBTF9BOiAweDQxLFxyXG4gICAgTEFUSU5fQ0FQSVRBTF9GOiAweDQ2LFxyXG4gICAgTEFUSU5fQ0FQSVRBTF9YOiAweDU4LFxyXG4gICAgTEFUSU5fQ0FQSVRBTF9aOiAweDVBLFxyXG4gICAgR1JBVkVfQUNDRU5UOiAweDYwLFxyXG4gICAgTEFUSU5fU01BTExfQTogMHg2MSxcclxuICAgIExBVElOX1NNQUxMX0Y6IDB4NjYsXHJcbiAgICBMQVRJTl9TTUFMTF9YOiAweDc4LFxyXG4gICAgTEFUSU5fU01BTExfWjogMHg3QSxcclxuICAgIEJPTTogMHhGRUZGLFxyXG4gICAgUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOiAweEZGRkRcclxufTtcclxuXHJcbmV4cG9ydHMuQ09ERV9QT0lOVF9TRVFVRU5DRVMgPSB7XHJcbiAgICBEQVNIX0RBU0hfU1RSSU5HOiBbMHgyRCwgMHgyRF0sIC8vLS1cclxuICAgIERPQ1RZUEVfU1RSSU5HOiBbMHg0NCwgMHg0RiwgMHg0MywgMHg1NCwgMHg1OSwgMHg1MCwgMHg0NV0sIC8vRE9DVFlQRVxyXG4gICAgQ0RBVEFfU1RBUlRfU1RSSU5HOiBbMHg1QiwgMHg0MywgMHg0NCwgMHg0MSwgMHg1NCwgMHg0MSwgMHg1Ql0sIC8vW0NEQVRBW1xyXG4gICAgQ0RBVEFfRU5EX1NUUklORzogWzB4NUQsIDB4NUQsIDB4M0VdLCAvL11dPlxyXG4gICAgU0NSSVBUX1NUUklORzogWzB4NzMsIDB4NjMsIDB4NzIsIDB4NjksIDB4NzAsIDB4NzRdLCAvL3NjcmlwdFxyXG4gICAgUFVCTElDX1NUUklORzogWzB4NTAsIDB4NTUsIDB4NDIsIDB4NEMsIDB4NDksIDB4NDNdLCAvL1BVQkxJQ1xyXG4gICAgU1lTVEVNX1NUUklORzogWzB4NTMsIDB4NTksIDB4NTMsIDB4NTQsIDB4NDUsIDB4NERdIC8vU1lTVEVNXHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydHMubWVyZ2VPcHRpb25zID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBvcHRpb25zKSB7XHJcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHJcbiAgICByZXR1cm4gW2RlZmF1bHRzLCBvcHRpb25zXS5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgb3B0T2JqKSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMob3B0T2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgbWVyZ2VkW2tleV0gPSBvcHRPYmpba2V5XTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcclxuICAgIH0sIHt9KTtcclxufTtcclxuIiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBQYXJzZXIgPSByZXF1aXJlKCcuLi90cmVlX2NvbnN0cnVjdGlvbi9wYXJzZXInKSxcclxuICAgIFBhcnNpbmdVbml0ID0gcmVxdWlyZSgnLi9wYXJzaW5nX3VuaXQnKTtcclxuXHJcbi8vQVBJXHJcbmV4cG9ydHMucGFyc2VEb2N1bWVudCA9IGZ1bmN0aW9uIChodG1sLCB0cmVlQWRhcHRlcikge1xyXG4gICAgLy9OT1RFOiB0aGlzIHNob3VsZCBiZSByZWVudHJhbnQsIHNvIHdlIGNyZWF0ZSBuZXcgcGFyc2VyIGhlcmVcclxuICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKHRyZWVBZGFwdGVyKSxcclxuICAgICAgICBwYXJzaW5nVW5pdCA9IG5ldyBQYXJzaW5nVW5pdChwYXJzZXIpO1xyXG5cclxuICAgIC8vTk9URTogb3ZlcnJpZGUgcGFyc2VyIGxvb3AgbWV0aG9kXHJcbiAgICBwYXJzZXIuX3J1blBhcnNpbmdMb29wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHBhcnNpbmdVbml0LnBhcnNpbmdMb29wTG9jayA9IHRydWU7XHJcblxyXG4gICAgICAgIHdoaWxlICghcGFyc2luZ1VuaXQuc3VzcGVuZGVkICYmICF0aGlzLnN0b3BwZWQpXHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZXJhdGVQYXJzaW5nTG9vcCgpO1xyXG5cclxuICAgICAgICBwYXJzaW5nVW5pdC5wYXJzaW5nTG9vcExvY2sgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZClcclxuICAgICAgICAgICAgcGFyc2luZ1VuaXQuY2FsbGJhY2sodGhpcy5kb2N1bWVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vTk9URTogd2FpdCB3aGlsZSBwYXJzZXJDb250cm9sbGVyIHdpbGwgYmUgYWRvcHRlZCBieSBjYWxsaW5nIGNvZGUsIHRoZW5cclxuICAgIC8vc3RhcnQgcGFyc2luZ1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcGFyc2VyLnBhcnNlKGh0bWwpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHBhcnNpbmdVbml0O1xyXG59O1xyXG5cclxuZXhwb3J0cy5wYXJzZUlubmVySHRtbCA9IGZ1bmN0aW9uIChpbm5lckh0bWwsIGNvbnRleHRFbGVtZW50LCB0cmVlQWRhcHRlcikge1xyXG4gICAgLy9OT1RFOiB0aGlzIHNob3VsZCBiZSByZWVudHJhbnQsIHNvIHdlIGNyZWF0ZSBuZXcgcGFyc2VyIGhlcmVcclxuICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKHRyZWVBZGFwdGVyKTtcclxuXHJcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJhZ21lbnQoaW5uZXJIdG1sLCBjb250ZXh0RWxlbWVudCk7XHJcbn07XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTl3WVhKelpUVXZiR2xpTDJwelpHOXRMMnB6Wkc5dFgzQmhjbk5sY2k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzUyWVhJZ1VHRnljMlZ5SUQwZ2NtVnhkV2x5WlNnbkxpNHZkSEpsWlY5amIyNXpkSEoxWTNScGIyNHZjR0Z5YzJWeUp5a3NYSEpjYmlBZ0lDQlFZWEp6YVc1blZXNXBkQ0E5SUhKbGNYVnBjbVVvSnk0dmNHRnljMmx1WjE5MWJtbDBKeWs3WEhKY2JseHlYRzR2TDBGUVNWeHlYRzVsZUhCdmNuUnpMbkJoY25ObFJHOWpkVzFsYm5RZ1BTQm1kVzVqZEdsdmJpQW9hSFJ0YkN3Z2RISmxaVUZrWVhCMFpYSXBJSHRjY2x4dUlDQWdJQzh2VGs5VVJUb2dkR2hwY3lCemFHOTFiR1FnWW1VZ2NtVmxiblJ5WVc1MExDQnpieUIzWlNCamNtVmhkR1VnYm1WM0lIQmhjbk5sY2lCb1pYSmxYSEpjYmlBZ0lDQjJZWElnY0dGeWMyVnlJRDBnYm1WM0lGQmhjbk5sY2loMGNtVmxRV1JoY0hSbGNpa3NYSEpjYmlBZ0lDQWdJQ0FnY0dGeWMybHVaMVZ1YVhRZ1BTQnVaWGNnVUdGeWMybHVaMVZ1YVhRb2NHRnljMlZ5S1R0Y2NseHVYSEpjYmlBZ0lDQXZMMDVQVkVVNklHOTJaWEp5YVdSbElIQmhjbk5sY2lCc2IyOXdJRzFsZEdodlpGeHlYRzRnSUNBZ2NHRnljMlZ5TGw5eWRXNVFZWEp6YVc1blRHOXZjQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0J3WVhKemFXNW5WVzVwZEM1d1lYSnphVzVuVEc5dmNFeHZZMnNnUFNCMGNuVmxPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjNhR2xzWlNBb0lYQmhjbk5wYm1kVmJtbDBMbk4xYzNCbGJtUmxaQ0FtSmlBaGRHaHBjeTV6ZEc5d2NHVmtLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TGw5cGRHVnlZWFJsVUdGeWMybHVaMHh2YjNBb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2NHRnljMmx1WjFWdWFYUXVjR0Z5YzJsdVoweHZiM0JNYjJOcklEMGdabUZzYzJVN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5OMGIzQndaV1FwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEJoY25OcGJtZFZibWwwTG1OaGJHeGlZV05yS0hSb2FYTXVaRzlqZFcxbGJuUXBPMXh5WEc0Z0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBdkwwNVBWRVU2SUhkaGFYUWdkMmhwYkdVZ2NHRnljMlZ5UTI5dWRISnZiR3hsY2lCM2FXeHNJR0psSUdGa2IzQjBaV1FnWW5rZ1kyRnNiR2x1WnlCamIyUmxMQ0IwYUdWdVhISmNiaUFnSUNBdkwzTjBZWEowSUhCaGNuTnBibWRjY2x4dUlDQWdJSEJ5YjJObGMzTXVibVY0ZEZScFkyc29ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIQmhjbk5sY2k1d1lYSnpaU2hvZEcxc0tUdGNjbHh1SUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUhKbGRIVnliaUJ3WVhKemFXNW5WVzVwZER0Y2NseHVmVHRjY2x4dVhISmNibVY0Y0c5eWRITXVjR0Z5YzJWSmJtNWxja2gwYld3Z1BTQm1kVzVqZEdsdmJpQW9hVzV1WlhKSWRHMXNMQ0JqYjI1MFpYaDBSV3hsYldWdWRDd2dkSEpsWlVGa1lYQjBaWElwSUh0Y2NseHVJQ0FnSUM4dlRrOVVSVG9nZEdocGN5QnphRzkxYkdRZ1ltVWdjbVZsYm5SeVlXNTBMQ0J6YnlCM1pTQmpjbVZoZEdVZ2JtVjNJSEJoY25ObGNpQm9aWEpsWEhKY2JpQWdJQ0IyWVhJZ2NHRnljMlZ5SUQwZ2JtVjNJRkJoY25ObGNpaDBjbVZsUVdSaGNIUmxjaWs3WEhKY2JseHlYRzRnSUNBZ2NtVjBkWEp1SUhCaGNuTmxjaTV3WVhKelpVWnlZV2R0Wlc1MEtHbHVibVZ5U0hSdGJDd2dZMjl1ZEdWNGRFVnNaVzFsYm5RcE8xeHlYRzU5T3lKZGZRPT0iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgUGFyc2luZ1VuaXQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXJzZXIpIHtcclxuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xyXG4gICAgdGhpcy5zdXNwZW5kZWQgPSBmYWxzZTtcclxuICAgIHRoaXMucGFyc2luZ0xvb3BMb2NrID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcclxufTtcclxuXHJcblBhcnNpbmdVbml0LnByb3RvdHlwZS5fc3RhdGVHdWFyZCA9IGZ1bmN0aW9uIChzdXNwZW5kKSB7XHJcbiAgICBpZiAodGhpcy5zdXNwZW5kZWQgJiYgc3VzcGVuZClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnNlNTogUGFyc2VyIHdhcyBhbHJlYWR5IHN1c3BlbmRlZC4gUGxlYXNlLCBjaGVjayB5b3VyIGNvbnRyb2wgZmxvdyBsb2dpYy4nKTtcclxuXHJcbiAgICBlbHNlIGlmICghdGhpcy5zdXNwZW5kZWQgJiYgIXN1c3BlbmQpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJzZTU6IFBhcnNlciB3YXMgYWxyZWFkeSByZXN1bWVkLiBQbGVhc2UsIGNoZWNrIHlvdXIgY29udHJvbCBmbG93IGxvZ2ljLicpO1xyXG5cclxuICAgIHJldHVybiBzdXNwZW5kO1xyXG59O1xyXG5cclxuUGFyc2luZ1VuaXQucHJvdG90eXBlLnN1c3BlbmQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLnN1c3BlbmRlZCA9IHRoaXMuX3N0YXRlR3VhcmQodHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5QYXJzaW5nVW5pdC5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5zdXNwZW5kZWQgPSB0aGlzLl9zdGF0ZUd1YXJkKGZhbHNlKTtcclxuXHJcbiAgICAvL05PVEU6IGRvbid0IGVudGVyIHBhcnNpbmcgbG9vcCBpZiBpdCBpcyBsb2NrZWQuIFdpdGhvdXQgdGhpcyBsb2NrIF9ydW5QYXJzaW5nTG9vcCgpIG1heSBiZSBjYWxsZWRcclxuICAgIC8vd2hpbGUgcGFyc2luZyBsb29wIGlzIHN0aWxsIHJ1bm5pbmcuIEUuZy4gd2hlbiBzdXNwZW5kKCkgYW5kIHJlc3VtZSgpIGNhbGxlZCBzeW5jaHJvbm91c2x5LlxyXG4gICAgaWYgKCF0aGlzLnBhcnNpbmdMb29wTG9jaylcclxuICAgICAgICB0aGlzLnBhcnNlci5fcnVuUGFyc2luZ0xvb3AoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcblBhcnNpbmdVbml0LnByb3RvdHlwZS5kb2N1bWVudFdyaXRlID0gZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgIHRoaXMucGFyc2VyLnRva2VuaXplci5wcmVwcm9jZXNzb3Iud3JpdGUoaHRtbCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5QYXJzaW5nVW5pdC5wcm90b3R5cGUuaGFuZGxlU2NyaXB0cyA9IGZ1bmN0aW9uIChzY3JpcHRIYW5kbGVyKSB7XHJcbiAgICB0aGlzLnBhcnNlci5zY3JpcHRIYW5kbGVyID0gc2NyaXB0SGFuZGxlcjtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcblBhcnNpbmdVbml0LnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBEZWZhdWx0VHJlZUFkYXB0ZXIgPSByZXF1aXJlKCcuLi90cmVlX2FkYXB0ZXJzL2RlZmF1bHQnKSxcclxuICAgIERvY3R5cGUgPSByZXF1aXJlKCcuLi9jb21tb24vZG9jdHlwZScpLFxyXG4gICAgVXRpbHMgPSByZXF1aXJlKCcuLi9jb21tb24vdXRpbHMnKSxcclxuICAgIEhUTUwgPSByZXF1aXJlKCcuLi9jb21tb24vaHRtbCcpO1xyXG5cclxuLy9BbGlhc2VzXHJcbnZhciAkID0gSFRNTC5UQUdfTkFNRVMsXHJcbiAgICBOUyA9IEhUTUwuTkFNRVNQQUNFUztcclxuXHJcbi8vRGVmYXVsdCBzZXJpYWxpemVyIG9wdGlvbnNcclxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcclxuICAgIGVuY29kZUh0bWxFbnRpdGllczogdHJ1ZVxyXG59O1xyXG5cclxuLy9Fc2NhcGluZyByZWdleGVzXHJcbnZhciBBTVBfUkVHRVggPSAvJi9nLFxyXG4gICAgTkJTUF9SRUdFWCA9IC9cXHUwMGEwL2csXHJcbiAgICBET1VCTEVfUVVPVEVfUkVHRVggPSAvXCIvZyxcclxuICAgIExUX1JFR0VYID0gLzwvZyxcclxuICAgIEdUX1JFR0VYID0gLz4vZztcclxuXHJcbi8vRXNjYXBlIHN0cmluZ1xyXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyLCBhdHRyTW9kZSkge1xyXG4gICAgc3RyID0gc3RyXHJcbiAgICAgICAgLnJlcGxhY2UoQU1QX1JFR0VYLCAnJmFtcDsnKVxyXG4gICAgICAgIC5yZXBsYWNlKE5CU1BfUkVHRVgsICcmbmJzcDsnKTtcclxuXHJcbiAgICBpZiAoYXR0ck1vZGUpXHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoRE9VQkxFX1FVT1RFX1JFR0VYLCAnJnF1b3Q7Jyk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgc3RyID0gc3RyXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKExUX1JFR0VYLCAnJmx0OycpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKEdUX1JFR0VYLCAnJmd0OycpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHI7XHJcbn1cclxuXHJcblxyXG4vL0VucXVvdGUgZG9jdHlwZSBJRFxyXG5cclxuXHJcblxyXG4vL1NlcmlhbGl6ZXJcclxudmFyIFNlcmlhbGl6ZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0cmVlQWRhcHRlciwgb3B0aW9ucykge1xyXG4gICAgdGhpcy50cmVlQWRhcHRlciA9IHRyZWVBZGFwdGVyIHx8IERlZmF1bHRUcmVlQWRhcHRlcjtcclxuICAgIHRoaXMub3B0aW9ucyA9IFV0aWxzLm1lcmdlT3B0aW9ucyhERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuXHJcbi8vQVBJXHJcblNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICB0aGlzLmh0bWwgPSAnJztcclxuICAgIHRoaXMuX3NlcmlhbGl6ZUNoaWxkTm9kZXMobm9kZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHRtbDtcclxufTtcclxuXHJcblxyXG4vL0ludGVybmFsc1xyXG5TZXJpYWxpemVyLnByb3RvdHlwZS5fc2VyaWFsaXplQ2hpbGROb2RlcyA9IGZ1bmN0aW9uIChwYXJlbnROb2RlKSB7XHJcbiAgICB2YXIgY2hpbGROb2RlcyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2RlcyhwYXJlbnROb2RlKTtcclxuXHJcbiAgICBpZiAoY2hpbGROb2Rlcykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBjbkxlbmd0aCA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgY25MZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudE5vZGUgPSBjaGlsZE5vZGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHJlZUFkYXB0ZXIuaXNFbGVtZW50Tm9kZShjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVFbGVtZW50KGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudHJlZUFkYXB0ZXIuaXNUZXh0Tm9kZShjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVUZXh0Tm9kZShjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnRyZWVBZGFwdGVyLmlzQ29tbWVudE5vZGUoY3VycmVudE5vZGUpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplQ29tbWVudE5vZGUoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50cmVlQWRhcHRlci5pc0RvY3VtZW50VHlwZU5vZGUoY3VycmVudE5vZGUpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplRG9jdW1lbnRUeXBlTm9kZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuU2VyaWFsaXplci5wcm90b3R5cGUuX3NlcmlhbGl6ZUVsZW1lbnQgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgdmFyIHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKG5vZGUpLFxyXG4gICAgICAgIG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkobm9kZSk7XHJcblxyXG4gICAgdGhpcy5odG1sICs9ICc8JyArIHRuO1xyXG4gICAgdGhpcy5fc2VyaWFsaXplQXR0cmlidXRlcyhub2RlKTtcclxuICAgIHRoaXMuaHRtbCArPSAnPic7XHJcblxyXG4gICAgaWYgKHRuICE9PSAkLkFSRUEgJiYgdG4gIT09ICQuQkFTRSAmJiB0biAhPT0gJC5CQVNFRk9OVCAmJiB0biAhPT0gJC5CR1NPVU5EICYmIHRuICE9PSAkLkJSICYmIHRuICE9PSAkLkJSICYmXHJcbiAgICAgICAgdG4gIT09ICQuQ09MICYmIHRuICE9PSAkLkVNQkVEICYmIHRuICE9PSAkLkZSQU1FICYmIHRuICE9PSAkLkhSICYmIHRuICE9PSAkLklNRyAmJiB0biAhPT0gJC5JTlBVVCAmJlxyXG4gICAgICAgIHRuICE9PSAkLktFWUdFTiAmJiB0biAhPT0gJC5MSU5LICYmIHRuICE9PSAkLk1FTlVJVEVNICYmIHRuICE9PSAkLk1FVEEgJiYgdG4gIT09ICQuUEFSQU0gJiYgdG4gIT09ICQuU09VUkNFICYmXHJcbiAgICAgICAgdG4gIT09ICQuVFJBQ0sgJiYgdG4gIT09ICQuV0JSKSB7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gJC5QUkUgfHwgdG4gPT09ICQuVEVYVEFSRUEgfHwgdG4gPT09ICQuTElTVElORykge1xyXG4gICAgICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChub2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmaXJzdENoaWxkICYmIHRoaXMudHJlZUFkYXB0ZXIuaXNUZXh0Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRleHROb2RlQ29udGVudChmaXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sICs9ICdcXG4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY2hpbGROb2Rlc0hvbGRlciA9IHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2Rlcyhub2RlKVswXSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZXJpYWxpemVDaGlsZE5vZGVzKGNoaWxkTm9kZXNIb2xkZXIpO1xyXG4gICAgICAgIHRoaXMuaHRtbCArPSAnPC8nICsgdG4gKyAnPic7XHJcbiAgICB9XHJcbn07XHJcblxyXG5TZXJpYWxpemVyLnByb3RvdHlwZS5fc2VyaWFsaXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICB2YXIgYXR0cnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldEF0dHJMaXN0KG5vZGUpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwLCBhdHRyc0xlbmd0aCA9IGF0dHJzLmxlbmd0aDsgaSA8IGF0dHJzTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgYXR0ciA9IGF0dHJzW2ldLFxyXG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMub3B0aW9ucy5lbmNvZGVIdG1sRW50aXRpZXMgPyBlc2NhcGVTdHJpbmcoYXR0ci52YWx1ZSwgdHJ1ZSkgOiBhdHRyLnZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWwgKz0gJyAnO1xyXG5cclxuICAgICAgICBpZiAoIWF0dHIubmFtZXNwYWNlKVxyXG4gICAgICAgICAgICB0aGlzLmh0bWwgKz0gYXR0ci5uYW1lO1xyXG5cclxuICAgICAgICBlbHNlIGlmIChhdHRyLm5hbWVzcGFjZSA9PT0gTlMuWE1MKVxyXG4gICAgICAgICAgICB0aGlzLmh0bWwgKz0gJ3htbDonICsgYXR0ci5uYW1lO1xyXG5cclxuICAgICAgICBlbHNlIGlmIChhdHRyLm5hbWVzcGFjZSA9PT0gTlMuWE1MTlMpIHtcclxuICAgICAgICAgICAgaWYgKGF0dHIubmFtZSAhPT0gJ3htbG5zJylcclxuICAgICAgICAgICAgICAgIHRoaXMuaHRtbCArPSAneG1sbnM6JztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSBhdHRyLm5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmIChhdHRyLm5hbWVzcGFjZSA9PT0gTlMuWExJTkspXHJcbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSAneGxpbms6JyArIGF0dHIubmFtZTtcclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmh0bWwgKz0gYXR0ci5uYW1lc3BhY2UgKyAnOicgKyBhdHRyLm5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbCArPSAnPVwiJyArIHZhbHVlICsgJ1wiJztcclxuICAgIH1cclxufTtcclxuXHJcblNlcmlhbGl6ZXIucHJvdG90eXBlLl9zZXJpYWxpemVUZXh0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICB2YXIgY29udGVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGV4dE5vZGVDb250ZW50KG5vZGUpLFxyXG4gICAgICAgIHBhcmVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0UGFyZW50Tm9kZShub2RlKSxcclxuICAgICAgICBwYXJlbnRUbiA9IHZvaWQgMDtcclxuXHJcbiAgICBpZiAocGFyZW50ICYmIHRoaXMudHJlZUFkYXB0ZXIuaXNFbGVtZW50Tm9kZShwYXJlbnQpKVxyXG4gICAgICAgIHBhcmVudFRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHBhcmVudCk7XHJcblxyXG4gICAgaWYgKHBhcmVudFRuID09PSAkLlNUWUxFIHx8IHBhcmVudFRuID09PSAkLlNDUklQVCB8fCBwYXJlbnRUbiA9PT0gJC5YTVAgfHwgcGFyZW50VG4gPT09ICQuSUZSQU1FIHx8XHJcbiAgICAgICAgcGFyZW50VG4gPT09ICQuTk9FTUJFRCB8fCBwYXJlbnRUbiA9PT0gJC5OT0ZSQU1FUyB8fCBwYXJlbnRUbiA9PT0gJC5QTEFJTlRFWFQgfHwgcGFyZW50VG4gPT09ICQuTk9TQ1JJUFQpIHtcclxuICAgICAgICB0aGlzLmh0bWwgKz0gY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5odG1sICs9IHRoaXMub3B0aW9ucy5lbmNvZGVIdG1sRW50aXRpZXMgPyBlc2NhcGVTdHJpbmcoY29udGVudCwgZmFsc2UpIDogY29udGVudDtcclxufTtcclxuXHJcblNlcmlhbGl6ZXIucHJvdG90eXBlLl9zZXJpYWxpemVDb21tZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICB0aGlzLmh0bWwgKz0gJzwhLS0nICsgdGhpcy50cmVlQWRhcHRlci5nZXRDb21tZW50Tm9kZUNvbnRlbnQobm9kZSkgKyAnLS0+JztcclxufTtcclxuXHJcblNlcmlhbGl6ZXIucHJvdG90eXBlLl9zZXJpYWxpemVEb2N1bWVudFR5cGVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIHZhciBuYW1lID0gdGhpcy50cmVlQWRhcHRlci5nZXREb2N1bWVudFR5cGVOb2RlTmFtZShub2RlKSxcclxuICAgICAgICBwdWJsaWNJZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlTm9kZVB1YmxpY0lkKG5vZGUpLFxyXG4gICAgICAgIHN5c3RlbUlkID0gdGhpcy50cmVlQWRhcHRlci5nZXREb2N1bWVudFR5cGVOb2RlU3lzdGVtSWQobm9kZSk7XHJcblxyXG4gICAgdGhpcy5odG1sICs9ICc8JyArIERvY3R5cGUuc2VyaWFsaXplQ29udGVudChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpICsgJz4nO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgVG9rZW5pemVyID0gcmVxdWlyZSgnLi4vdG9rZW5pemF0aW9uL3Rva2VuaXplcicpLFxyXG4gICAgVG9rZW5pemVyUHJveHkgPSByZXF1aXJlKCcuL3Rva2VuaXplcl9wcm94eScpLFxyXG4gICAgVXRpbHMgPSByZXF1aXJlKCcuLi9jb21tb24vdXRpbHMnKTtcclxuXHJcbi8vRGVmYXVsdCBvcHRpb25zXHJcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XHJcbiAgICBkZWNvZGVIdG1sRW50aXRpZXM6IHRydWUsXHJcbiAgICBsb2NhdGlvbkluZm86IGZhbHNlXHJcbn07XHJcblxyXG4vL1NraXBwaW5nIGhhbmRsZXJcclxuZnVuY3Rpb24gc2tpcCgpIHtcclxuICAgIC8vTk9URTogZG8gbm90aGluZyA9KVxyXG59XHJcblxyXG4vL1NpbXBsZUFwaVBhcnNlclxyXG52YXIgU2ltcGxlQXBpUGFyc2VyID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGFuZGxlcnMsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IFV0aWxzLm1lcmdlT3B0aW9ucyhERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5oYW5kbGVycyA9IHtcclxuICAgICAgICBkb2N0eXBlOiB0aGlzLl93cmFwSGFuZGxlcihoYW5kbGVycy5kb2N0eXBlKSxcclxuICAgICAgICBzdGFydFRhZzogdGhpcy5fd3JhcEhhbmRsZXIoaGFuZGxlcnMuc3RhcnRUYWcpLFxyXG4gICAgICAgIGVuZFRhZzogdGhpcy5fd3JhcEhhbmRsZXIoaGFuZGxlcnMuZW5kVGFnKSxcclxuICAgICAgICB0ZXh0OiB0aGlzLl93cmFwSGFuZGxlcihoYW5kbGVycy50ZXh0KSxcclxuICAgICAgICBjb21tZW50OiB0aGlzLl93cmFwSGFuZGxlcihoYW5kbGVycy5jb21tZW50KVxyXG4gICAgfTtcclxufTtcclxuXHJcblNpbXBsZUFwaVBhcnNlci5wcm90b3R5cGUuX3dyYXBIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcclxuICAgIHZhciBwYXJzZXIgPSB0aGlzO1xyXG5cclxuICAgIGhhbmRsZXIgPSBoYW5kbGVyIHx8IHNraXA7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbkluZm8pIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChwYXJzZXIuY3VycmVudFRva2VuTG9jYXRpb24pO1xyXG4gICAgICAgICAgICBoYW5kbGVyLmFwcGx5KGhhbmRsZXIsIGFyZ3MpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhhbmRsZXI7XHJcbn07XHJcblxyXG4vL0FQSVxyXG5TaW1wbGVBcGlQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgIHZhciB0b2tlbiA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5fcmVzZXQoaHRtbCk7XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICAgIHRva2VuID0gdGhpcy50b2tlbml6ZXJQcm94eS5nZXROZXh0VG9rZW4oKTtcclxuXHJcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5DSEFSQUNURVJfVE9LRU4gfHxcclxuICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOIHx8XHJcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTikge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbkluZm8pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdUZXh0ID09PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuTG9jYXRpb24gPSB0b2tlbi5sb2NhdGlvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5Mb2NhdGlvbi5lbmQgPSB0b2tlbi5sb2NhdGlvbi5lbmQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1RleHQgPSAodGhpcy5wZW5kaW5nVGV4dCB8fCAnJykgKyB0b2tlbi5jaGFycztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9lbWl0UGVuZGluZ1RleHQoKTtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlVG9rZW4odG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH0gd2hpbGUgKHRva2VuLnR5cGUgIT09IFRva2VuaXplci5FT0ZfVE9LRU4pO1xyXG59O1xyXG5cclxuLy9JbnRlcm5hbHNcclxuU2ltcGxlQXBpUGFyc2VyLnByb3RvdHlwZS5faGFuZGxlVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25JbmZvKVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuTG9jYXRpb24gPSB0b2tlbi5sb2NhdGlvbjtcclxuXHJcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTilcclxuICAgICAgICB0aGlzLmhhbmRsZXJzLnN0YXJ0VGFnKHRva2VuLnRhZ05hbWUsIHRva2VuLmF0dHJzLCB0b2tlbi5zZWxmQ2xvc2luZyk7XHJcblxyXG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4pXHJcbiAgICAgICAgdGhpcy5oYW5kbGVycy5lbmRUYWcodG9rZW4udGFnTmFtZSk7XHJcblxyXG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkNPTU1FTlRfVE9LRU4pXHJcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jb21tZW50KHRva2VuLmRhdGEpO1xyXG5cclxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5ET0NUWVBFX1RPS0VOKVxyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZG9jdHlwZSh0b2tlbi5uYW1lLCB0b2tlbi5wdWJsaWNJZCwgdG9rZW4uc3lzdGVtSWQpO1xyXG5cclxufTtcclxuXHJcblNpbXBsZUFwaVBhcnNlci5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgIHRoaXMudG9rZW5pemVyUHJveHkgPSBuZXcgVG9rZW5pemVyUHJveHkoaHRtbCwgdGhpcy5vcHRpb25zKTtcclxuICAgIHRoaXMucGVuZGluZ1RleHQgPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50VG9rZW5Mb2NhdGlvbiA9IG51bGw7XHJcbn07XHJcblxyXG5TaW1wbGVBcGlQYXJzZXIucHJvdG90eXBlLl9lbWl0UGVuZGluZ1RleHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy5wZW5kaW5nVGV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMudGV4dCh0aGlzLnBlbmRpbmdUZXh0KTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdUZXh0ID0gbnVsbDtcclxuICAgIH1cclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFRva2VuaXplciA9IHJlcXVpcmUoJy4uL3Rva2VuaXphdGlvbi90b2tlbml6ZXInKSxcclxuICAgIEZvcmVpZ25Db250ZW50ID0gcmVxdWlyZSgnLi4vY29tbW9uL2ZvcmVpZ25fY29udGVudCcpLFxyXG4gICAgVU5JQ09ERSA9IHJlcXVpcmUoJy4uL2NvbW1vbi91bmljb2RlJyksXHJcbiAgICBIVE1MID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWwnKTtcclxuXHJcbi8vQWxpYXNlc1xyXG52YXIgJCA9IEhUTUwuVEFHX05BTUVTLFxyXG4gICAgTlMgPSBIVE1MLk5BTUVTUEFDRVM7XHJcblxyXG5cclxuLy9Ub2tlbml6ZXIgcHJveHlcclxuLy9OT1RFOiB0aGlzIHByb3h5IHNpbXVsYXRlcyBhZGp1c3RtZW50IG9mIHRoZSBUb2tlbml6ZXIgd2hpY2ggcGVyZm9ybWVkIGJ5IHN0YW5kYXJkIHBhcnNlciBkdXJpbmcgdHJlZSBjb25zdHJ1Y3Rpb24uXHJcbnZhciBUb2tlbml6ZXJQcm94eSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGh0bWwsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMudG9rZW5pemVyID0gbmV3IFRva2VuaXplcihodG1sLCBvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLm5hbWVzcGFjZVN0YWNrID0gW107XHJcbiAgICB0aGlzLm5hbWVzcGFjZVN0YWNrVG9wID0gLTE7XHJcbiAgICB0aGlzLmN1cnJlbnROYW1lc3BhY2UgPSBudWxsO1xyXG4gICAgdGhpcy5pbkZvcmVpZ25Db250ZW50ID0gZmFsc2U7XHJcbn07XHJcblxyXG4vL0FQSVxyXG5Ub2tlbml6ZXJQcm94eS5wcm90b3R5cGUuZ2V0TmV4dFRva2VuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHRva2VuID0gdGhpcy50b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7XHJcblxyXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5TVEFSVF9UQUdfVE9LRU4pXHJcbiAgICAgICAgdGhpcy5faGFuZGxlU3RhcnRUYWdUb2tlbih0b2tlbik7XHJcblxyXG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4pXHJcbiAgICAgICAgdGhpcy5faGFuZGxlRW5kVGFnVG9rZW4odG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTiAmJiB0aGlzLmluRm9yZWlnbkNvbnRlbnQpIHtcclxuICAgICAgICB0b2tlbi50eXBlID0gVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTjtcclxuICAgICAgICB0b2tlbi5jaGFycyA9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0b2tlbjtcclxufTtcclxuXHJcbi8vTmFtZXNwYWNlIHN0YWNrIG11dGF0aW9uc1xyXG5Ub2tlbml6ZXJQcm94eS5wcm90b3R5cGUuX2VudGVyTmFtZXNwYWNlID0gZnVuY3Rpb24gKG5hbWVzcGFjZSkge1xyXG4gICAgdGhpcy5uYW1lc3BhY2VTdGFja1RvcCsrO1xyXG4gICAgdGhpcy5uYW1lc3BhY2VTdGFjay5wdXNoKG5hbWVzcGFjZSk7XHJcblxyXG4gICAgdGhpcy5pbkZvcmVpZ25Db250ZW50ID0gbmFtZXNwYWNlICE9PSBOUy5IVE1MO1xyXG4gICAgdGhpcy5jdXJyZW50TmFtZXNwYWNlID0gbmFtZXNwYWNlO1xyXG4gICAgdGhpcy50b2tlbml6ZXIuYWxsb3dDREFUQSA9IHRoaXMuaW5Gb3JlaWduQ29udGVudDtcclxufTtcclxuXHJcblRva2VuaXplclByb3h5LnByb3RvdHlwZS5fbGVhdmVDdXJyZW50TmFtZXNwYWNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5uYW1lc3BhY2VTdGFja1RvcC0tO1xyXG4gICAgdGhpcy5uYW1lc3BhY2VTdGFjay5wb3AoKTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnROYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZVN0YWNrW3RoaXMubmFtZXNwYWNlU3RhY2tUb3BdO1xyXG4gICAgdGhpcy5pbkZvcmVpZ25Db250ZW50ID0gdGhpcy5jdXJyZW50TmFtZXNwYWNlICE9PSBOUy5IVE1MO1xyXG4gICAgdGhpcy50b2tlbml6ZXIuYWxsb3dDREFUQSA9IHRoaXMuaW5Gb3JlaWduQ29udGVudDtcclxufTtcclxuXHJcbi8vVG9rZW4gaGFuZGxlcnNcclxuVG9rZW5pemVyUHJveHkucHJvdG90eXBlLl9lbnN1cmVUb2tlbml6ZXJNb2RlID0gZnVuY3Rpb24gKHRuKSB7XHJcbiAgICBpZiAodG4gPT09ICQuVEVYVEFSRUEgfHwgdG4gPT09ICQuVElUTEUpXHJcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5SQ0RBVEE7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuUExBSU5URVhUKVxyXG4gICAgICAgIHRoaXMudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUExBSU5URVhUO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlNDUklQVClcclxuICAgICAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IFRva2VuaXplci5NT0RFLlNDUklQVF9EQVRBO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlNUWUxFIHx8IHRuID09PSAkLklGUkFNRSB8fCB0biA9PT0gJC5YTVAgfHxcclxuICAgICAgICAgICAgIHRuID09PSAkLk5PRU1CRUQgfHwgdG4gPT09ICQuTk9GUkFNRVMgfHwgdG4gPT09ICQuTk9TQ1JJUFQpIHtcclxuICAgICAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IFRva2VuaXplci5NT0RFLlJBV1RFWFQ7XHJcbiAgICB9XHJcbn07XHJcblxyXG5Ub2tlbml6ZXJQcm94eS5wcm90b3R5cGUuX2hhbmRsZVN0YXJ0VGFnVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLlNWRylcclxuICAgICAgICB0aGlzLl9lbnRlck5hbWVzcGFjZShOUy5TVkcpO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLk1BVEgpXHJcbiAgICAgICAgdGhpcy5fZW50ZXJOYW1lc3BhY2UoTlMuTUFUSE1MKTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5pbkZvcmVpZ25Db250ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChGb3JlaWduQ29udGVudC5jYXVzZXNFeGl0KHRva2VuKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQ3VycmVudE5hbWVzcGFjZSgpO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAoRm9yZWlnbkNvbnRlbnQuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludCh0biwgdGhpcy5jdXJyZW50TmFtZXNwYWNlKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICBGb3JlaWduQ29udGVudC5pc0h0bWxJbnRlZ3JhdGlvblBvaW50KHRuLCB0aGlzLmN1cnJlbnROYW1lc3BhY2UsIHRva2VuLmF0dHJzKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZW50ZXJOYW1lc3BhY2UoTlMuSFRNTCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5fZW5zdXJlVG9rZW5pemVyTW9kZSh0bik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5Ub2tlbml6ZXJQcm94eS5wcm90b3R5cGUuX2hhbmRsZUVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICghdGhpcy5pbkZvcmVpZ25Db250ZW50KSB7XHJcbiAgICAgICAgdmFyIHByZXZpb3VzTnMgPSB0aGlzLm5hbWVzcGFjZVN0YWNrW3RoaXMubmFtZXNwYWNlU3RhY2tUb3AgLSAxXTtcclxuXHJcbiAgICAgICAgLy9OT1RFOiBjaGVjayBmb3IgZXhpdCBmcm9tIGludGVncmF0aW9uIHBvaW50XHJcbiAgICAgICAgaWYgKEZvcmVpZ25Db250ZW50LmlzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQodG4sIHByZXZpb3VzTnMpIHx8XHJcbiAgICAgICAgICAgIEZvcmVpZ25Db250ZW50LmlzSHRtbEludGVncmF0aW9uUG9pbnQodG4sIHByZXZpb3VzTnMsIHRva2VuLmF0dHJzKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9sZWF2ZUN1cnJlbnROYW1lc3BhY2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlNDUklQVClcclxuICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5EQVRBO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKCh0biA9PT0gJC5TVkcgJiYgdGhpcy5jdXJyZW50TmFtZXNwYWNlID09PSBOUy5TVkcpIHx8XHJcbiAgICAgICAgICAgICAodG4gPT09ICQuTUFUSCAmJiB0aGlzLmN1cnJlbnROYW1lc3BhY2UgPT09IE5TLk1BVEhNTCkpXHJcbiAgICAgICAgdGhpcy5fbGVhdmVDdXJyZW50TmFtZXNwYWNlKCk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKHRva2VuaXplcikge1xyXG4gICAgLy9OT1RFOiBvYnRhaW4gVG9rZW5pemVyIHByb3RvIHRoaXMgd2F5IHRvIGF2b2lkIG1vZHVsZSBjaXJjdWxhciByZWZlcmVuY2VzXHJcbiAgICB2YXIgdG9rZW5pemVyUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodG9rZW5pemVyKTtcclxuXHJcbiAgICB0b2tlbml6ZXIudG9rZW5TdGFydExvYyA9IC0xO1xyXG5cclxuICAgIC8vTk9URTogYWRkIGxvY2F0aW9uIGluZm8gYnVpbGRlciBtZXRob2RcclxuICAgIHRva2VuaXplci5fYXR0YWNoTG9jYXRpb25JbmZvID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICAgICAgdG9rZW4ubG9jYXRpb24gPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnRva2VuU3RhcnRMb2MsXHJcbiAgICAgICAgICAgIGVuZDogLTFcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvL05PVEU6IHBhdGNoIHRva2VuIGNyZWF0aW9uIG1ldGhvZHMgYW5kIGF0dGFjaCBsb2NhdGlvbiBvYmplY3RzXHJcbiAgICB0b2tlbml6ZXIuX2NyZWF0ZVN0YXJ0VGFnVG9rZW4gPSBmdW5jdGlvbiAodGFnTmFtZUZpcnN0Q2gpIHtcclxuICAgICAgICB0b2tlbml6ZXJQcm90by5fY3JlYXRlU3RhcnRUYWdUb2tlbi5jYWxsKHRoaXMsIHRhZ05hbWVGaXJzdENoKTtcclxuICAgICAgICB0aGlzLl9hdHRhY2hMb2NhdGlvbkluZm8odGhpcy5jdXJyZW50VG9rZW4pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0b2tlbml6ZXIuX2NyZWF0ZUVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKHRhZ05hbWVGaXJzdENoKSB7XHJcbiAgICAgICAgdG9rZW5pemVyUHJvdG8uX2NyZWF0ZUVuZFRhZ1Rva2VuLmNhbGwodGhpcywgdGFnTmFtZUZpcnN0Q2gpO1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaExvY2F0aW9uSW5mbyh0aGlzLmN1cnJlbnRUb2tlbik7XHJcbiAgICB9O1xyXG5cclxuICAgIHRva2VuaXplci5fY3JlYXRlQ29tbWVudFRva2VuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRva2VuaXplclByb3RvLl9jcmVhdGVDb21tZW50VG9rZW4uY2FsbCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9hdHRhY2hMb2NhdGlvbkluZm8odGhpcy5jdXJyZW50VG9rZW4pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0b2tlbml6ZXIuX2NyZWF0ZURvY3R5cGVUb2tlbiA9IGZ1bmN0aW9uIChkb2N0eXBlTmFtZUZpcnN0Q2gpIHtcclxuICAgICAgICB0b2tlbml6ZXJQcm90by5fY3JlYXRlRG9jdHlwZVRva2VuLmNhbGwodGhpcywgZG9jdHlwZU5hbWVGaXJzdENoKTtcclxuICAgICAgICB0aGlzLl9hdHRhY2hMb2NhdGlvbkluZm8odGhpcy5jdXJyZW50VG9rZW4pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0b2tlbml6ZXIuX2NyZWF0ZUNoYXJhY3RlclRva2VuID0gZnVuY3Rpb24gKHR5cGUsIGNoKSB7XHJcbiAgICAgICAgdG9rZW5pemVyUHJvdG8uX2NyZWF0ZUNoYXJhY3RlclRva2VuLmNhbGwodGhpcywgdHlwZSwgY2gpO1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaExvY2F0aW9uSW5mbyh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vTk9URTogcGF0Y2ggdG9rZW4gZW1pc3Npb24gbWV0aG9kcyB0byBkZXRlcm1pbmUgZW5kIGxvY2F0aW9uXHJcbiAgICB0b2tlbml6ZXIuX2VtaXRDdXJyZW50VG9rZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy9OT1RFOiBpZiB3ZSBoYXZlIHBlbmRpbmcgY2hhcmFjdGVyIHRva2VuIG1ha2UgaXQncyBlbmQgbG9jYXRpb24gZXF1YWwgdG8gdGhlXHJcbiAgICAgICAgLy9jdXJyZW50IHRva2VuJ3Mgc3RhcnQgbG9jYXRpb24uXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuKVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbi5sb2NhdGlvbi5lbmQgPSB0aGlzLmN1cnJlbnRUb2tlbi5sb2NhdGlvbi5zdGFydDtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ubG9jYXRpb24uZW5kID0gdGhpcy5wcmVwcm9jZXNzb3IucG9zICsgMTtcclxuICAgICAgICB0b2tlbml6ZXJQcm90by5fZW1pdEN1cnJlbnRUb2tlbi5jYWxsKHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0b2tlbml6ZXIuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy9OT1RFOiBpZiB3ZSBoYXZlIGNoYXJhY3RlciB0b2tlbiBhbmQgaXQncyBsb2NhdGlvbiB3YXNuJ3Qgc2V0IGluIHRoZSBfZW1pdEN1cnJlbnRUb2tlbigpLFxyXG4gICAgICAgIC8vdGhlbiBzZXQgaXQncyBsb2NhdGlvbiBhdCB0aGUgY3VycmVudCBwcmVwcm9jZXNzb3IgcG9zaXRpb25cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gJiYgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb24uZW5kID09PSAtMSkge1xyXG4gICAgICAgICAgICAvL05PVEU6IHdlIGRvbid0IG5lZWQgdG8gaW5jcmVtZW50IHByZXByb2Nlc3NvciBwb3NpdGlvbiwgc2luY2UgY2hhcmFjdGVyIHRva2VuXHJcbiAgICAgICAgICAgIC8vZW1pc3Npb24gaXMgYWx3YXlzIGZvcmNlZCBieSB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRva2VuIGhlcmUuXHJcbiAgICAgICAgICAgIC8vU28sIHdlIGFscmVhZHkgaGF2ZSBhZHZhbmNlZCBwb3NpdGlvbi5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb24uZW5kID0gdGhpcy5wcmVwcm9jZXNzb3IucG9zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9rZW5pemVyUHJvdG8uX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4uY2FsbCh0aGlzKTtcclxuICAgIH07XHJcblxyXG4gICAgLy9OT1RFOiBwYXRjaCBpbml0aWFsIHN0YXRlcyBmb3IgZWFjaCBtb2RlIHRvIG9idGFpbiB0b2tlbiBzdGFydCBwb3NpdGlvblxyXG4gICAgT2JqZWN0LmtleXModG9rZW5pemVyUHJvdG8uTU9ERSlcclxuXHJcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobW9kZU5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRva2VuaXplclByb3RvLk1PREVbbW9kZU5hbWVdO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgICAgICAgICB0b2tlbml6ZXJbc3RhdGVdID0gZnVuY3Rpb24gKGNwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRva2VuU3RhcnRMb2MgPSB0aGlzLnByZXByb2Nlc3Nvci5wb3M7XHJcbiAgICAgICAgICAgICAgICB0b2tlbml6ZXJQcm90b1tzdGF0ZV0uY2FsbCh0aGlzLCBjcCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8vTk9URTogdGhpcyBmaWxlIGNvbnRhaW5zIGF1dG8gZ2VuZXJhdGVkIHRyaWUgc3RydWN0dXJlIHRoYXQgaXMgdXNlZCBmb3IgbmFtZWQgZW50aXR5IHJlZmVyZW5jZXMgY29uc3VtcHRpb25cclxuLy8oc2VlOiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90b2tlbml6YXRpb24uaHRtbCN0b2tlbml6aW5nLWNoYXJhY3Rlci1yZWZlcmVuY2VzIGFuZFxyXG4vL2h0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL25hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VzLmh0bWwjbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXMpXHJcbm1vZHVsZS5leHBvcnRzID0gezY1OntsOns2OTp7bDp7MTA4OntsOnsxMDU6e2w6ezEwMzp7bDp7NTk6e2M6WzE5OF19fSxjOlsxOThdfX19fX19fSw3Nzp7bDp7ODA6e2w6ezU5OntjOlszOF19fSxjOlszOF19fX0sOTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMTkzXX19LGM6WzE5M119fX19fX19fX0sOTg6e2w6ezExNDp7bDp7MTAxOntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzI1OF19fX19fX19fX19fSw5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMTk0XX19LGM6WzE5NF19fX19fSwxMjE6e2w6ezU5OntjOlsxMDQwXX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDY4XX19fX19LDEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTE4OntsOnsxMDE6e2w6ezU5OntjOlsxOTJdfX0sYzpbMTkyXX19fX19fX19fSwxMDg6e2w6ezExMjp7bDp7MTA0OntsOns5Nzp7bDp7NTk6e2M6WzkxM119fX19fX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzI1Nl19fX19fX19fX0sMTEwOntsOnsxMDA6e2w6ezU5OntjOlsxMDgzNV19fX19fSwxMTE6e2w6ezEwMzp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsyNjBdfX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEyMF19fX19fX19LDExMjp7bDp7MTEyOntsOnsxMDg6e2w6ezEyMTp7bDp7NzA6e2w6ezExNzp7bDp7MTEwOntsOns5OTp7bDp7MTE2OntsOnsxMDU6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODI4OV19fX19fX19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6WzE5N119fSxjOlsxOTddfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5NjRdfX19fX0sMTE1OntsOnsxMDU6e2w6ezEwMzp7bDp7MTEwOntsOns1OTp7YzpbODc4OF19fX19fX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzE5NV19fSxjOlsxOTVdfX19fX19fX19LDExNzp7bDp7MTA5OntsOnsxMDg6e2w6ezU5OntjOlsxOTZdfX0sYzpbMTk2XX19fX19fX0sNjY6e2w6ezk3OntsOns5OTp7bDp7MTA3OntsOnsxMTU6e2w6ezEwODp7bDp7OTc6e2w6ezExNTp7bDp7MTA0OntsOns1OTp7YzpbODcyNl19fX19fX19fX19fX19fX0sMTE0OntsOnsxMTg6e2w6ezU5OntjOlsxMDk4M119fX0sMTE5OntsOnsxMDE6e2w6ezEwMDp7bDp7NTk6e2M6Wzg5NjZdfX19fX19fX19fX0sOTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNDFdfX19fX0sMTAxOntsOns5OTp7bDp7OTc6e2w6ezExNzp7bDp7MTE1OntsOnsxMDE6e2w6ezU5OntjOls4NzU3XX19fX19fX19fX19LDExNDp7bDp7MTEwOntsOnsxMTE6e2w6ezExNzp7bDp7MTA4OntsOnsxMDg6e2w6ezEwNTp7bDp7MTE1OntsOns1OTp7YzpbODQ5Ml19fX19fX19fX19fX19fX19fSwxMTY6e2w6ezk3OntsOns1OTp7YzpbOTE0XX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwNjldfX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEyMV19fX19fX19LDExNDp7bDp7MTAxOntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzcyOF19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbODQ5Ml19fX19fX19LDExNzp7bDp7MTA5OntsOnsxMTI6e2w6ezEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc4Ml19fX19fX19fX19fX19LDY3OntsOns3Mjp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNjNdfX19fX19fSw3OTp7bDp7ODA6e2w6ezg5OntsOns1OTp7YzpbMTY5XX19LGM6WzE2OV19fX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyNjJdfX19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg5MTRdfSwxMDU6e2w6ezExNjp7bDp7OTc6e2w6ezEwODp7bDp7Njg6e2w6ezEwNTp7bDp7MTAyOntsOnsxMDI6e2w6ezEwMTp7bDp7MTE0OntsOnsxMDE6e2w6ezExMDp7bDp7MTE2OntsOnsxMDU6e2w6ezk3OntsOnsxMDg6e2w6ezY4OntsOns1OTp7YzpbODUxN119fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDEyMTp7bDp7MTA4OntsOnsxMDE6e2w6ezEyMTp7bDp7MTE1OntsOns1OTp7YzpbODQ5M119fX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzI2OF19fX19fX19fX0sMTAxOntsOnsxMDA6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbMTk5XX19LGM6WzE5OV19fX19fX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzI2NF19fX19fX19LDExMTp7bDp7MTEwOntsOnsxMDU6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbODc1Ml19fX19fX19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsyNjZdfX19fX19fSwxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwODp7bDp7OTc6e2w6ezU5OntjOlsxODRdfX19fX19fX19fX0sMTEwOntsOnsxMTY6e2w6ezEwMTp7bDp7MTE0OntsOns2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsxODNdfX19fX19fX19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOls4NDkzXX19fX19LDEwNDp7bDp7MTA1OntsOns1OTp7YzpbOTM1XX19fX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7MTA4OntsOnsxMDE6e2w6ezY4OntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6Wzg4NTddfX19fX19fSw3Nzp7bDp7MTA1OntsOnsxMTA6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbODg1NF19fX19fX19fX19fSw4MDp7bDp7MTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6Wzg4NTNdfX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls4ODU1XX19fX19fX19fX19fX19fX19fX19fSwxMDg6e2w6ezExMTp7bDp7OTk6e2w6ezEwNzp7bDp7MTE5OntsOnsxMDU6e2w6ezExNTp7bDp7MTAxOntsOns2Nzp7bDp7MTExOntsOnsxMTA6e2w6ezExNjp7bDp7MTExOntsOnsxMTc6e2w6ezExNDp7bDp7NzM6e2w6ezExMDp7bDp7MTE2OntsOnsxMDE6e2w6ezEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc1NF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTAxOntsOns2Nzp7bDp7MTE3OntsOnsxMTQ6e2w6ezEwODp7bDp7MTIxOntsOns2ODp7bDp7MTExOntsOnsxMTc6e2w6ezk4OntsOnsxMDg6e2w6ezEwMTp7bDp7ODE6e2w6ezExNzp7bDp7MTExOntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzgyMjFdfX19fX19fX19fX19fX19fX19fX19fX0sODE6e2w6ezExNzp7bDp7MTExOntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzgyMTddfX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODc1OV19LDEwMTp7bDp7NTk6e2M6WzEwODY4XX19fX19fX19fSwxMTA6e2w6ezEwMzp7bDp7MTE0OntsOnsxMTc6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4ODAxXX19fX19fX19fX19fX0sMTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NTFdfX19fX19fSwxMTY6e2w6ezExMTp7bDp7MTE3OntsOnsxMTQ6e2w6ezczOntsOnsxMTA6e2w6ezExNjp7bDp7MTAxOntsOnsxMDM6e2w6ezExNDp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg3NTBdfX19fX19fX19fX19fX19fX19fX19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbODQ1MF19fX0sMTE0OntsOnsxMTE6e2w6ezEwMDp7bDp7MTE3OntsOns5OTp7bDp7MTE2OntsOns1OTp7YzpbODcyMF19fX19fX19fX19fX19fX0sMTE3OntsOnsxMTA6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezY3OntsOnsxMDg6e2w6ezExMTp7bDp7OTk6e2w6ezEwNzp7bDp7MTE5OntsOnsxMDU6e2w6ezExNTp7bDp7MTAxOntsOns2Nzp7bDp7MTExOntsOnsxMTA6e2w6ezExNjp7bDp7MTExOntsOnsxMTc6e2w6ezExNDp7bDp7NzM6e2w6ezExMDp7bDp7MTE2OntsOnsxMDE6e2w6ezEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc1NV19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTExOntsOnsxMTU6e2w6ezExNTp7bDp7NTk6e2M6WzEwNzk5XX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5NjZdfX19fX19fSwxMTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg5MTVdfSw2Nzp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg3ODFdfX19fX19fX19fX19fSw2ODp7bDp7Njg6e2w6ezU5OntjOls4NTE3XX0sMTExOntsOnsxMTY6e2w6ezExNDp7bDp7OTc6e2w6ezEwNDp7bDp7MTAwOntsOns1OTp7YzpbMTA1MTNdfX19fX19fX19fX19fX19LDc0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAyNl19fX19fX19LDgzOntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAyOV19fX19fX19LDkwOntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzOV19fX19fX19LDk3OntsOnsxMDM6e2w6ezEwMzp7bDp7MTAxOntsOnsxMTQ6e2w6ezU5OntjOls4MjI1XX19fX19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MDldfX19fX0sMTE1OntsOnsxMDQ6e2w6ezExODp7bDp7NTk6e2M6WzEwOTgwXX19fX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsyNzBdfX19fX19fX19LDEyMTp7bDp7NTk6e2M6WzEwNDRdfX19fX0sMTAxOntsOnsxMDg6e2w6ezU5OntjOls4NzExXX0sMTE2OntsOns5Nzp7bDp7NTk6e2M6WzkxNl19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwNzFdfX19fX0sMTA1OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7MTA1OntsOnsxMTY6e2w6ezEwNTp7bDp7OTk6e2w6ezk3OntsOnsxMDg6e2w6ezY1OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzE4MF19fX19fX19fX19fSw2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls3MjldfX19LDExNzp7bDp7OTg6e2w6ezEwODp7bDp7MTAxOntsOns2NTp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOls3MzNdfX19fX19fX19fX19fX19fX19fX19fX0sNzE6e2w6ezExNDp7bDp7OTc6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbOTZdfX19fX19fX19fX0sODQ6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzczMl19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTA5OntsOnsxMTE6e2w6ezExMDp7bDp7MTAwOntsOns1OTp7YzpbODkwMF19fX19fX19fX19fSwxMDI6e2w6ezEwMjp7bDp7MTAxOntsOnsxMTQ6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezEwNTp7bDp7OTc6e2w6ezEwODp7bDp7Njg6e2w6ezU5OntjOls4NTE4XX19fX19fX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEyM119fX19fSwxMTY6e2w6ezU5OntjOlsxNjhdfSw2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4NDEyXX19fX19fX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc4NF19fX19fX19fX19fX19LDExNzp7bDp7OTg6e2w6ezEwODp7bDp7MTAxOntsOns2Nzp7bDp7MTExOntsOnsxMTA6e2w6ezExNjp7bDp7MTExOntsOnsxMTc6e2w6ezExNDp7bDp7NzM6e2w6ezExMDp7bDp7MTE2OntsOnsxMDE6e2w6ezEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc1MV19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDY4OntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzE2OF19fX0sMTE5OntsOnsxMTA6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU5XX19fX19fX19fX19fX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU2XX19fX19fX19fX19LDgyOntsOnsxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjYwXX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezU5OntjOlsxMDk4MF19fX19fX19fX19fX19LDExMTp7bDp7MTEwOntsOnsxMDM6e2w6ezc2OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbMTAyMzJdfX19fX19fX19fX0sODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwMjM0XX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDgyOntsOnsxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDIzM119fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw4Mjp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY1OF19fX19fX19fX19fSw4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezU5OntjOls4ODcyXX19fX19fX19fX19fX19fX19LDg1OntsOnsxMTI6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU3XX19fX19fX19fX19LDY4OntsOnsxMTE6e2w6ezExOTp7bDp7MTEwOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY2MV19fX19fX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOnsxMTQ6e2w6ezExNjp7bDp7MTA1OntsOns5OTp7bDp7OTc6e2w6ezEwODp7bDp7NjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4NzQxXX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTE5OntsOnsxMTA6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk1XX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDUxNV19fX19fX19LDg1OntsOnsxMTI6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjkzXX19fX19fX19fX19fX19fX19fX19fX19fX0sNjY6e2w6ezExNDp7bDp7MTAxOntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6Wzc4NV19fX19fX19fX19fSw3Njp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7ODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7ODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU3Nl19fX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTA1OTBdfX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOns5OTp7bDp7MTE2OntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MzddfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTgyXX19fX19fX19fX19fX19fX19fX19fX19fX19fSw4Mjp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTA1OTFdfX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOns5OTp7bDp7MTE2OntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NDFdfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTgzXX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4NjhdfSw2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYxNV19fX19fX19fX19fX19fX19fSw5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY1OV19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5NjddfX19fX0sMTE2OntsOnsxMTQ6e2w6ezExMTp7bDp7MTA3OntsOns1OTp7YzpbMjcyXX19fX19fX19fX19fX0sNjk6e2w6ezc4OntsOns3MTp7bDp7NTk6e2M6WzMzMF19fX19fSw4NDp7bDp7NzI6e2w6ezU5OntjOlsyMDhdfX0sYzpbMjA4XX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyMDFdfX0sYzpbMjAxXX19fX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsyODJdfX19fX19fX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzIwMl19fSxjOlsyMDJdfX19fX0sMTIxOntsOns1OTp7YzpbMTA2OV19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMjc4XX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwNzJdfX19fX0sMTAzOntsOnsxMTQ6e2w6ezk3OntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzIwMF19fSxjOlsyMDBdfX19fX19fX19LDEwODp7bDp7MTAxOntsOnsxMDk6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4NzEyXX19fX19fX19fX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzI3NF19fX19fX19LDExMjp7bDp7MTE2OntsOnsxMjE6e2w6ezgzOntsOnsxMDk6e2w6ezk3OntsOnsxMDg6e2w6ezEwODp7bDp7ODM6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTE0OntsOnsxMDE6e2w6ezU5OntjOls5NzIzXX19fX19fX19fX19fX19fX19fX19fX19LDg2OntsOnsxMDE6e2w6ezExNDp7bDp7MTIxOntsOns4Mzp7bDp7MTA5OntsOns5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezgzOntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezExNDp7bDp7MTAxOntsOns1OTp7YzpbOTY0M119fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMDM6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMjgwXX19fX19fX0sMTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxMjRdfX19fX19fSwxMTI6e2w6ezExNTp7bDp7MTA1OntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbOTE3XX19fX19fX19fX19fX0sMTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOlsxMDg2OV19LDg0OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4NzcwXX19fX19fX19fX19fX19fSwxMDU6e2w6ezEwODp7bDp7MTA1OntsOns5ODp7bDp7MTE0OntsOnsxMDU6e2w6ezExNzp7bDp7MTA5OntsOns1OTp7YzpbODY1Ml19fX19fX19fX19fX19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbODQ5Nl19fX19fSwxMDU6e2w6ezEwOTp7bDp7NTk6e2M6WzEwODY3XX19fX19fX0sMTE2OntsOns5Nzp7bDp7NTk6e2M6WzkxOV19fX19fSwxMTc6e2w6ezEwOTp7bDp7MTA4OntsOns1OTp7YzpbMjAzXX19LGM6WzIwM119fX19fSwxMjA6e2w6ezEwNTp7bDp7MTE1OntsOnsxMTY6e2w6ezExNTp7bDp7NTk6e2M6Wzg3MDddfX19fX19fX19LDExMjp7bDp7MTExOntsOnsxMTA6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezEwNTp7bDp7OTc6e2w6ezEwODp7bDp7Njk6e2w6ezU5OntjOls4NTE5XX19fX19fX19fX19fX19fX19fX19fX19fX0sNzA6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDYwXX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDczXX19fX19LDEwNTp7bDp7MTA4OntsOnsxMDg6e2w6ezEwMTp7bDp7MTAwOntsOns4Mzp7bDp7MTA5OntsOns5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezgzOntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezExNDp7bDp7MTAxOntsOns1OTp7YzpbOTcyNF19fX19fX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOnsxMTQ6e2w6ezEyMTp7bDp7ODM6e2w6ezEwOTp7bDp7OTc6e2w6ezEwODp7bDp7MTA4OntsOns4Mzp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMTp7bDp7NTk6e2M6Wzk2NDJdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEyNV19fX19fSwxMTQ6e2w6ezY1OntsOnsxMDg6e2w6ezEwODp7bDp7NTk6e2M6Wzg3MDRdfX19fX19fX19LDExNzp7bDp7MTE0OntsOnsxMDU6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTY6e2w6ezExNDp7bDp7MTAyOntsOns1OTp7YzpbODQ5N119fX19fX19fX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6Wzg0OTddfX19fX19fX19LDcxOntsOns3NDp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwMjddfX19fX19fSw4NDp7bDp7NTk6e2M6WzYyXX19LGM6WzYyXX0sOTc6e2w6ezEwOTp7bDp7MTA5OntsOns5Nzp7bDp7NTk6e2M6WzkxNV19LDEwMDp7bDp7NTk6e2M6Wzk4OF19fX19fX19fX19fSw5ODp7bDp7MTE0OntsOnsxMDE6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjg2XX19fX19fX19fX19LDk5OntsOnsxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsyOTBdfX19fX19fX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzI4NF19fX19fX19LDEyMTp7bDp7NTk6e2M6WzEwNDNdfX19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzI4OF19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDc0XX19fX19LDEwMzp7bDp7NTk6e2M6Wzg5MjFdfX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxMjZdfX19fX19fSwxMTQ6e2w6ezEwMTp7bDp7OTc6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MDVdfSw3Njp7bDp7MTAxOntsOnsxMTU6e2w6ezExNTp7bDp7NTk6e2M6Wzg5MjNdfX19fX19fX19fX19fX19fX19fSw3MDp7bDp7MTE3OntsOnsxMDg6e2w6ezEwODp7bDp7Njk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODgwN119fX19fX19fX19fX19fX19fX19LDcxOntsOnsxMTQ6e2w6ezEwMTp7bDp7OTc6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezU5OntjOlsxMDkxNF19fX19fX19fX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTU6e2w6ezU5OntjOls4ODIzXX19fX19fX19fSw4Mzp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6WzEwODc4XX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbODgxOV19fX19fX19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5NzBdfX19fX19fSwxMTY6e2w6ezU5OntjOls4ODExXX19fX19LDcyOntsOns2NTp7bDp7ODI6e2w6ezY4OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA2Nl19fX19fX19fX19fSw5Nzp7bDp7OTk6e2w6ezEwMTp7bDp7MTA3OntsOns1OTp7YzpbNzExXX19fX19fX0sMTE2OntsOns1OTp7YzpbOTRdfX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzI5Ml19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOls4NDYwXX19fX19LDEwNTp7bDp7MTA4OntsOns5ODp7bDp7MTAxOntsOnsxMTQ6e2w6ezExNjp7bDp7ODM6e2w6ezExMjp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOls4NDU5XX19fX19fX19fX19fX19fX19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOls4NDYxXX19fX19LDExNDp7bDp7MTA1OntsOnsxMjI6e2w6ezExMTp7bDp7MTEwOntsOnsxMTY6e2w6ezk3OntsOnsxMDg6e2w6ezc2OntsOnsxMDU6e2w6ezExMDp7bDp7MTAxOntsOns1OTp7YzpbOTQ3Ml19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbODQ1OV19fX19fSwxMTY6e2w6ezExNDp7bDp7MTExOntsOnsxMDc6e2w6ezU5OntjOlsyOTRdfX19fX19fX19fX0sMTE3OntsOnsxMDk6e2w6ezExMjp7bDp7Njg6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezcyOntsOnsxMTc6e2w6ezEwOTp7bDp7MTEyOntsOns1OTp7YzpbODc4Ml19fX19fX19fX19fX19fX19fSw2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4NzgzXX19fX19fX19fX19fX19fX19fX0sNzM6e2w6ezY5OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA0NV19fX19fX19LDc0OntsOnsxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbMzA2XX19fX19fX19fSw3OTp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwMjVdfX19fX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyMDVdfX0sYzpbMjA1XX19fX19fX19fSw5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMjA2XX19LGM6WzIwNl19fX19fSwxMjE6e2w6ezU5OntjOlsxMDQ4XX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlszMDRdfX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6Wzg0NjVdfX19fX0sMTAzOntsOnsxMTQ6e2w6ezk3OntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzIwNF19fSxjOlsyMDRdfX19fX19fX19LDEwOTp7bDp7NTk6e2M6Wzg0NjVdfSw5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzI5OF19fX19fSwxMDM6e2w6ezEwNTp7bDp7MTEwOntsOns5Nzp7bDp7MTE0OntsOnsxMjE6e2w6ezczOntsOns1OTp7YzpbODUyMF19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezEwODp7bDp7MTA1OntsOnsxMDE6e2w6ezExNTp7bDp7NTk6e2M6Wzg2NThdfX19fX19fX19fX19fSwxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NDhdfSwxMDE6e2w6ezEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc0N119fX19fX19fX0sMTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTA1OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6Wzg4OThdfX19fX19fX19fX19fX19fX19fX19LDExODp7bDp7MTA1OntsOnsxMTU6e2w6ezEwNTp7bDp7OTg6e2w6ezEwODp7bDp7MTAxOntsOns2Nzp7bDp7MTExOntsOnsxMDk6e2w6ezEwOTp7bDp7OTc6e2w6ezU5OntjOls4MjkxXX19fX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls4MjkwXX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTE6e2w6ezEwMzp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszMDJdfX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEyOF19fX19fSwxMTY6e2w6ezk3OntsOns1OTp7YzpbOTIxXX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbODQ2NF19fX19fX19LDExNjp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbMjk2XX19fX19fX19fX19LDExNzp7bDp7MTA3OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzMF19fX19fX19LDEwOTp7bDp7MTA4OntsOns1OTp7YzpbMjA3XX19LGM6WzIwN119fX19fX19LDc0OntsOns5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMzA4XX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA0OV19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA3N119fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTI5XX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTczXX19fX19LDEwMTp7bDp7MTE0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzMl19fX19fX19fX19fSwxMTc6e2w6ezEwNzp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwMjhdfX19fX19fX19fX0sNzU6e2w6ezcyOntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA2MV19fX19fX19LDc0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzNl19fX19fX19LDk3OntsOnsxMTI6e2w6ezExMjp7bDp7OTc6e2w6ezU5OntjOls5MjJdfX19fX19fX19LDk5OntsOnsxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlszMTBdfX19fX19fX19LDEyMTp7bDp7NTk6e2M6WzEwNTBdfX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwNzhdfX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzMF19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk3NF19fX19fX19fX0sNzY6e2w6ezc0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzM119fX19fX19LDg0OntsOns1OTp7YzpbNjBdfX0sYzpbNjBdfSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlszMTNdfX19fX19fX19LDEwOTp7bDp7OTg6e2w6ezEwMDp7bDp7OTc6e2w6ezU5OntjOls5MjNdfX19fX19fX19LDExMDp7bDp7MTAzOntsOns1OTp7YzpbMTAyMThdfX19fX0sMTEyOntsOnsxMDg6e2w6ezk3OntsOns5OTp7bDp7MTAxOntsOnsxMTY6e2w6ezExNDp7bDp7MTAyOntsOns1OTp7YzpbODQ2Nl19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MDZdfX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszMTddfX19fX19fX19LDEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzMxNV19fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA1MV19fX19fSwxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns2NTp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOns2Njp7bDp7MTE0OntsOns5Nzp7bDp7OTk6e2w6ezEwNzp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOlsxMDIxNl19fX19fX19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTkyXX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4Njc2XX19fX19fX0sODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2NDZdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw2Nzp7bDp7MTAxOntsOnsxMDU6e2w6ezEwODp7bDp7MTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6Wzg5NjhdfX19fX19fX19fX19fX19LDY4OntsOnsxMTE6e2w6ezExNzp7bDp7OTg6e2w6ezEwODp7bDp7MTAxOntsOns2Njp7bDp7MTE0OntsOns5Nzp7bDp7OTk6e2w6ezEwNzp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOlsxMDIxNF19fX19fX19fX19fX19fX19fX19fX19fSwxMTk6e2w6ezExMDp7bDp7ODQ6e2w6ezEwMTp7bDp7MTAxOntsOns4Njp7bDp7MTAxOntsOns5OTp7bDp7MTE2OntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTkzXX19fX19fX19fX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOls4NjQzXX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU4NV19fX19fX19fX19fX19fX19fX19fX19fX19fX0sNzA6e2w6ezEwODp7bDp7MTExOntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6Wzg5NzBdfX19fX19fX19fX0sODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg1OTZdfX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU3NF19fX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezU5OntjOls4ODY3XX0sNjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2MTJdfX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU4Nl19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7OTc6e2w6ezExMDp7bDp7MTAzOntsOnsxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4ODJdfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNzAzXX19fX19fX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODg4NF19fX19fX19fX19fX19fX19fX19fX19fX19fX0sODU6e2w6ezExMjp7bDp7Njg6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTA1NzddfX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDE6e2w6ezEwMTp7bDp7ODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU5Ml19fX19fX19fX19fX19fX19fX19LDg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbODYzOV19LDY2OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1ODRdfX19fX19fX19fX19fX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOls4NjM2XX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU3OF19fX19fX19fX19fX19fX19fX19LDk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU2XX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY2MF19fX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTE1OntsOns2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezcxOntsOnsxMTQ6e2w6ezEwMTp7bDp7OTc6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezU5OntjOls4OTIyXX19fX19fX19fX19fX19fX19fX19fX19fX0sNzA6e2w6ezExNzp7bDp7MTA4OntsOnsxMDg6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MDZdfX19fX19fX19fX19fX19fX19fSw3MTp7bDp7MTE0OntsOnsxMDE6e2w6ezk3OntsOnsxMTY6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbODgyMl19fX19fX19fX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTU6e2w6ezU5OntjOlsxMDkxM119fX19fX19fX0sODM6e2w6ezEwODp7bDp7OTc6e2w6ezExMDp7bDp7MTE2OntsOns2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOlsxMDg3N119fX19fX19fX19fX19fX19fX19fX0sODQ6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4MThdfX19fX19fX19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwNzldfX19fX0sMTA4OntsOns1OTp7YzpbODkyMF19LDEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjY2XX19fX19fX19fX19fX19fX19fX0sMTA5OntsOnsxMDU6e2w6ezEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlszMTldfX19fX19fX19fX0sMTExOntsOnsxMTA6e2w6ezEwMzp7bDp7NzY6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDIyOV19fX19fX19fX19fSw4Mjp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbMTAyMzFdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwMjMwXX19fX19fX19fX19fX19fX19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDIzMl19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwMjM0XX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbMTAyMzNdfX19fX19fX19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzMV19fX19fSwxMTk6e2w6ezEwMTp7bDp7MTE0OntsOns3Njp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2MDFdfX19fX19fX19fX19fX19fX19fSw4Mjp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYwMF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOls4NDY2XX19fX19LDEwNDp7bDp7NTk6e2M6Wzg2MjRdfX19LDExNjp7bDp7MTE0OntsOnsxMTE6e2w6ezEwNzp7bDp7NTk6e2M6WzMyMV19fX19fX19fX19fSwxMTY6e2w6ezU5OntjOls4ODEwXX19fX19LDc3OntsOns5Nzp7bDp7MTEyOntsOns1OTp7YzpbMTA1MDFdfX19fX0sOTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNTJdfX19fX0sMTAxOntsOnsxMDA6e2w6ezEwNTp7bDp7MTE3OntsOnsxMDk6e2w6ezgzOntsOnsxMTI6e2w6ezk3OntsOns5OTp7bDp7MTAxOntsOns1OTp7YzpbODI4N119fX19fX19fX19fX19fX19fX19LDEwODp7bDp7MTA4OntsOnsxMDU6e2w6ezExMDp7bDp7MTE2OntsOnsxMTQ6e2w6ezEwMjp7bDp7NTk6e2M6Wzg0OTldfX19fX19fX19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwODBdfX19fX0sMTA1OntsOnsxMTA6e2w6ezExNzp7bDp7MTE1OntsOns4MDp7bDp7MTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6Wzg3MjNdfX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzMl19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6Wzg0OTldfX19fX19fSwxMTc6e2w6ezU5OntjOls5MjRdfX19fX0sNzg6e2w6ezc0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzNF19fX19fX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzMyM119fX19fX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszMjddfX19fX19fX19LDEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzMyNV19fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA1M119fX19fSwxMDE6e2w6ezEwMzp7bDp7OTc6e2w6ezExNjp7bDp7MTA1OntsOnsxMTg6e2w6ezEwMTp7bDp7Nzc6e2w6ezEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezExNzp7bDp7MTA5OntsOns4Mzp7bDp7MTEyOntsOns5Nzp7bDp7OTk6e2w6ezEwMTp7bDp7NTk6e2M6WzgyMDNdfX19fX19fX19fX19fX19fX19fX19fX0sODQ6e2w6ezEwNDp7bDp7MTA1OntsOns5OTp7bDp7MTA3OntsOns4Mzp7bDp7MTEyOntsOns5Nzp7bDp7OTk6e2w6ezEwMTp7bDp7NTk6e2M6WzgyMDNdfX19fX19fX19fX19fX19LDExMDp7bDp7ODM6e2w6ezExMjp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOls4MjAzXX19fX19fX19fX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7MTE0OntsOnsxMjE6e2w6ezg0OntsOnsxMDQ6e2w6ezEwNTp7bDp7MTEwOntsOns4Mzp7bDp7MTEyOntsOns5Nzp7bDp7OTk6e2w6ezEwMTp7bDp7NTk6e2M6WzgyMDNdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTE2OntsOnsxMDE6e2w6ezEwMDp7bDp7NzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NTk6e2M6Wzg4MTFdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTU6e2w6ezc2OntsOnsxMDE6e2w6ezExNTp7bDp7MTE1OntsOns1OTp7YzpbODgxMF19fX19fX19fX19fX19fX19fX19fX19fX19LDExOTp7bDp7NzY6e2w6ezEwNTp7bDp7MTEwOntsOnsxMDE6e2w6ezU5OntjOlsxMF19fX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDgxXX19fX19LDExMTp7bDp7NjY6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTA3OntsOns1OTp7YzpbODI4OF19fX19fX19fX19fSwxMTA6e2w6ezY2OntsOnsxMTQ6e2w6ezEwMTp7bDp7OTc6e2w6ezEwNzp7bDp7MTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7ODM6e2w6ezExMjp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOlsxNjBdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTEyOntsOnsxMDI6e2w6ezU5OntjOls4NDY5XX19fX19LDExNjp7bDp7NTk6e2M6WzEwOTg4XX0sNjc6e2w6ezExMTp7bDp7MTEwOntsOnsxMDM6e2w6ezExNDp7bDp7MTE3OntsOnsxMDE6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbODgwMl19fX19fX19fX19fX19fX19fSwxMTc6e2w6ezExMjp7bDp7Njc6e2w6ezk3OntsOnsxMTI6e2w6ezU5OntjOls4ODEzXX19fX19fX19fX19fX0sNjg6e2w6ezExMTp7bDp7MTE3OntsOns5ODp7bDp7MTA4OntsOnsxMDE6e2w6ezg2OntsOnsxMDE6e2w6ezExNDp7bDp7MTE2OntsOnsxMDU6e2w6ezk5OntsOns5Nzp7bDp7MTA4OntsOns2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzg3NDJdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sNjk6e2w6ezEwODp7bDp7MTAxOntsOnsxMDk6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4NzEzXX19fX19fX19fX19fX0sMTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4ODAwXX0sODQ6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg3NzAsODI0XX19fX19fX19fX19fX19fX19fX0sMTIwOntsOnsxMDU6e2w6ezExNTp7bDp7MTE2OntsOnsxMTU6e2w6ezU5OntjOls4NzA4XX19fX19fX19fX19fX0sNzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NTk6e2M6Wzg4MTVdfSw2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4ODE3XX19fX19fX19fX19LDcwOntsOnsxMTc6e2w6ezEwODp7bDp7MTA4OntsOns2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4ODA3LDgyNF19fX19fX19fX19fX19fX19fX19LDcxOntsOnsxMTQ6e2w6ezEwMTp7bDp7OTc6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezU5OntjOls4ODExLDgyNF19fX19fX19fX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTU6e2w6ezU5OntjOls4ODI1XX19fX19fX19fSw4Mzp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6WzEwODc4LDgyNF19fX19fX19fX19fX19fX19fX19fX0sODQ6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4MjFdfX19fX19fX19fX19fX19fX19fX19fX19fSw3Mjp7bDp7MTE3OntsOnsxMDk6e2w6ezExMjp7bDp7Njg6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezcyOntsOnsxMTc6e2w6ezEwOTp7bDp7MTEyOntsOns1OTp7YzpbODc4Miw4MjRdfX19fX19fX19fX19fX19fX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc4Myw4MjRdfX19fX19fX19fX19fX19fX19fSw3Njp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7ODQ6e2w6ezExNDp7bDp7MTA1OntsOns5Nzp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOns1OTp7YzpbODkzOF19LDY2OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA3MDMsODI0XX19fX19fX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODk0MF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTE1OntsOns1OTp7YzpbODgxNF19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MTZdfX19fX19fX19fX0sNzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NTk6e2M6Wzg4MjRdfX19fX19fX19fX19fX19LDc2OntsOnsxMDE6e2w6ezExNTp7bDp7MTE1OntsOns1OTp7YzpbODgxMCw4MjRdfX19fX19fX19LDgzOntsOnsxMDg6e2w6ezk3OntsOnsxMTA6e2w6ezExNjp7bDp7Njk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbMTA4NzcsODI0XX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbODgyMF19fX19fX19fX19fX19fX19fX19LDc4OntsOnsxMDE6e2w6ezExNTp7bDp7MTE2OntsOnsxMDE6e2w6ezEwMDp7bDp7NzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NzE6e2w6ezExNDp7bDp7MTAxOntsOns5Nzp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7NTk6e2M6WzEwOTE0LDgyNF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw3Njp7bDp7MTAxOntsOnsxMTU6e2w6ezExNTp7bDp7NzY6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTU6e2w6ezU5OntjOlsxMDkxMyw4MjRdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sODA6e2w6ezExNDp7bDp7MTAxOntsOns5OTp7bDp7MTAxOntsOnsxMDA6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbODgzMl19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6WzEwOTI3LDgyNF19fX19fX19fX19fSw4Mzp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg5MjhdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw4Mjp7bDp7MTAxOntsOnsxMTg6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7Njk6e2w6ezEwODp7bDp7MTAxOntsOnsxMDk6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4NzE2XX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezg0OntsOnsxMTQ6e2w6ezEwNTp7bDp7OTc6e2w6ezExMDp7bDp7MTAzOntsOnsxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzg5MzldfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNzA0LDgyNF19fX19fX19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg5NDFdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw4Mzp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMTp7bDp7ODM6e2w6ezExNzp7bDp7OTg6e2w6ezExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOls4ODQ3LDgyNF19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg5MzBdfX19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODg0OCw4MjRdfSw2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4OTMxXX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTE3OntsOns5ODp7bDp7MTE1OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6Wzg4MzQsODQwMl19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4NDBdfX19fX19fX19fX19fX19fX19fSw5OTp7bDp7OTk6e2w6ezEwMTp7bDp7MTAxOntsOnsxMDA6e2w6ezExNTp7bDp7NTk6e2M6Wzg4MzNdfSw2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOlsxMDkyOCw4MjRdfX19fX19fX19fX0sODM6e2w6ezEwODp7bDp7OTc6e2w6ezExMDp7bDp7MTE2OntsOns2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4OTI5XX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbODgzMSw4MjRdfX19fX19fX19fX19fX19fX19fX19fX0sMTEyOntsOnsxMDE6e2w6ezExNDp7bDp7MTE1OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6Wzg4MzUsODQwMl19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4NDFdfX19fX19fX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4NzY5XX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc3Ml19fX19fX19fX19fSw3MDp7bDp7MTE3OntsOnsxMDg6e2w6ezEwODp7bDp7Njk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc3NV19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4Nzc3XX19fX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOnsxMTQ6e2w6ezExNjp7bDp7MTA1OntsOns5OTp7bDp7OTc6e2w6ezEwODp7bDp7NjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4NzQwXX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5NzddfX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzIwOV19fSxjOlsyMDldfX19fX19fX19LDExNzp7bDp7NTk6e2M6WzkyNV19fX19fSw3OTp7bDp7Njk6e2w6ezEwODp7bDp7MTA1OntsOnsxMDM6e2w6ezU5OntjOlszMzhdfX19fX19fX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzIxMV19fSxjOlsyMTFdfX19fX19fX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOlsyMTJdfX0sYzpbMjEyXX19fX19LDEyMTp7bDp7NTk6e2M6WzEwNTRdfX19fX0sMTAwOntsOns5ODp7bDp7MTA4OntsOns5Nzp7bDp7OTk6e2w6ezU5OntjOlszMzZdfX19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwODJdfX19fX0sMTAzOntsOnsxMTQ6e2w6ezk3OntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzIxMF19fSxjOlsyMTBdfX19fX19fX19LDEwOTp7bDp7OTc6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlszMzJdfX19fX19fSwxMDE6e2w6ezEwMzp7bDp7OTc6e2w6ezU5OntjOls5MzddfX19fX19fSwxMDU6e2w6ezk5OntsOnsxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbOTI3XX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzNF19fX19fX19LDExMjp7bDp7MTAxOntsOnsxMTA6e2w6ezY3OntsOnsxMTc6e2w6ezExNDp7bDp7MTA4OntsOnsxMjE6e2w6ezY4OntsOnsxMTE6e2w6ezExNzp7bDp7OTg6e2w6ezEwODp7bDp7MTAxOntsOns4MTp7bDp7MTE3OntsOnsxMTE6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbODIyMF19fX19fX19fX19fX19fX19fX19fX19fSw4MTp7bDp7MTE3OntsOnsxMTE6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbODIxNl19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTE0OntsOns1OTp7YzpbMTA4MzZdfX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk3OF19fX19fSwxMDg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6WzIxNl19fSxjOlsyMTZdfX19fX19fX19LDExNjp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbMjEzXX19LGM6WzIxM119fX19fSwxMDk6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbMTA4MDddfX19fX19fX19fX0sMTE3OntsOnsxMDk6e2w6ezEwODp7bDp7NTk6e2M6WzIxNF19fSxjOlsyMTRdfX19fX0sMTE4OntsOnsxMDE6e2w6ezExNDp7bDp7NjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4MjU0XX19fX19LDExNDp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOls5MTgyXX19fSwxMDc6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbOTE0MF19fX19fX19fX19fX19fX0sODA6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezEwNDp7bDp7MTAxOntsOnsxMTU6e2w6ezEwNTp7bDp7MTE1OntsOns1OTp7YzpbOTE4MF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDgwOntsOns5Nzp7bDp7MTE0OntsOnsxMTY6e2w6ezEwNTp7bDp7OTc6e2w6ezEwODp7bDp7Njg6e2w6ezU5OntjOls4NzA2XX19fX19fX19fX19fX19fSw5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA1NV19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA4M119fX19fSwxMDQ6e2w6ezEwNTp7bDp7NTk6e2M6WzkzNF19fX19fSwxMDU6e2w6ezU5OntjOls5MjhdfX19LDEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezc3OntsOnsxMDU6e2w6ezExMDp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxNzddfX19fX19fX19fX19fX19fX0sMTExOntsOnsxMDU6e2w6ezExMDp7bDp7OTk6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMTp7bDp7MTEyOntsOnsxMDg6e2w6ezk3OntsOnsxMTA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg0NjBdfX19fX19fX19fX19fX19fX19fX19fX0sMTEyOntsOnsxMDI6e2w6ezU5OntjOls4NDczXX19fX19fX0sMTE0OntsOns1OTp7YzpbMTA5MzldfSwxMDE6e2w6ezk5OntsOnsxMDE6e2w6ezEwMDp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls4ODI2XX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbMTA5MjddfX19fX19fX19fX0sODM6e2w6ezEwODp7bDp7OTc6e2w6ezExMDp7bDp7MTE2OntsOns2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4ODI4XX19fX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbODgzMF19fX19fX19fX19fX19fX19fX19fX19fSwxMDU6e2w6ezEwOTp7bDp7MTAxOntsOns1OTp7YzpbODI0M119fX19fX19LDExMTp7bDp7MTAwOntsOnsxMTc6e2w6ezk5OntsOnsxMTY6e2w6ezU5OntjOls4NzE5XX19fX19fX19fSwxMTI6e2w6ezExMTp7bDp7MTE0OntsOnsxMTY6e2w6ezEwNTp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls4NzU5XX0sOTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg3MzNdfX19fX19fX19fX19fX19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTc5XX19fX19LDEwNTp7bDp7NTk6e2M6WzkzNl19fX19fX19LDgxOntsOns4NTp7bDp7Nzk6e2w6ezg0OntsOns1OTp7YzpbMzRdfX0sYzpbMzRdfX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwODRdfX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6Wzg0NzRdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5ODBdfX19fX19fX19LDgyOntsOns2Njp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA1MTJdfX19fX19fX19LDY5OntsOns3MTp7bDp7NTk6e2M6WzE3NF19fSxjOlsxNzRdfX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzM0MF19fX19fX19fX0sMTEwOntsOnsxMDM6e2w6ezU5OntjOlsxMDIxOV19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MDhdfSwxMTY6e2w6ezEwODp7bDp7NTk6e2M6WzEwNTE4XX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzM0NF19fX19fX19fX0sMTAxOntsOnsxMDA6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbMzQyXX19fX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDU2XX19fX19LDEwMTp7bDp7NTk6e2M6Wzg0NzZdfSwxMTg6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7Njk6e2w6ezEwODp7bDp7MTAxOntsOnsxMDk6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4NzE1XX19fX19fX19fX19fX0sMTEzOntsOnsxMTc6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDU6e2w6ezk4OntsOnsxMTQ6e2w6ezEwNTp7bDp7MTE3OntsOnsxMDk6e2w6ezU5OntjOls4NjUxXX19fX19fX19fX19fX19fX19fX19fX19LDg1OntsOnsxMTI6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7MTA1OntsOnsxMDg6e2w6ezEwNTp7bDp7OTg6e2w6ezExNDp7bDp7MTA1OntsOnsxMTc6e2w6ezEwOTp7bDp7NTk6e2M6WzEwNjA3XX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6Wzg0NzZdfX19fX0sMTA0OntsOnsxMTE6e2w6ezU5OntjOls5MjldfX19fX0sMTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns2NTp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOns2Njp7bDp7MTE0OntsOns5Nzp7bDp7OTk6e2w6ezEwNzp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOlsxMDIxN119fX19fX19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk0XX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4Njc3XX19fX19fX0sNzY6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjQ0XX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDY3OntsOnsxMDE6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDU6e2w6ezExMDp7bDp7MTAzOntsOns1OTp7YzpbODk2OV19fX19fX19fX19fX19fX0sNjg6e2w6ezExMTp7bDp7MTE3OntsOns5ODp7bDp7MTA4OntsOnsxMDE6e2w6ezY2OntsOnsxMTQ6e2w6ezk3OntsOns5OTp7bDp7MTA3OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6WzEwMjE1XX19fX19fX19fX19fX19fX19fX19fX19LDExOTp7bDp7MTEwOntsOns4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTA1ODldfX19fX19fX19fX19fX19fX19fSw4Njp7bDp7MTAxOntsOns5OTp7bDp7MTE2OntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NDJdfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTgxXX19fX19fX19fX19fX19fX19fX19fX19fX19fSw3MDp7bDp7MTA4OntsOnsxMTE6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbODk3MV19fX19fX19fX19fSw4NDp7bDp7MTAxOntsOnsxMDE6e2w6ezU5OntjOls4ODY2XX0sNjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2MTRdfX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU4N119fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7OTc6e2w6ezExMDp7bDp7MTAzOntsOnsxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4ODNdfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNzA0XX19fX19fX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODg4NV19fX19fX19fX19fX19fX19fX19fX19fX19fX0sODU6e2w6ezExMjp7bDp7Njg6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTA1NzVdfX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDE6e2w6ezEwMTp7bDp7ODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDU4OF19fX19fX19fX19fX19fX19fX19LDg2OntsOnsxMDE6e2w6ezk5OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbODYzOF19LDY2OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1ODBdfX19fX19fX19fX19fX19fX19fX19fX0sODY6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7MTExOntsOnsxMTQ6e2w6ezU5OntjOls4NjQwXX0sNjY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU3OV19fX19fX19fX19fX19fX19fX19LDk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU4XX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6Wzg0NzddfX19fX0sMTE3OntsOnsxMTA6e2w6ezEwMDp7bDp7NzM6e2w6ezEwOTp7bDp7MTEyOntsOnsxMDg6e2w6ezEwNTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOlsxMDYwOF19fX19fX19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2NjddfX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6Wzg0NzVdfX19fX0sMTA0OntsOns1OTp7YzpbODYyNV19fX19fSwxMTc6e2w6ezEwODp7bDp7MTAxOntsOns2ODp7bDp7MTAxOntsOnsxMDg6e2w6ezk3OntsOnsxMjE6e2w6ezEwMTp7bDp7MTAwOntsOns1OTp7YzpbMTA3NDBdfX19fX19fX19fX19fX19fX19fX19fX0sODM6e2w6ezcyOntsOns2Nzp7bDp7NzI6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDY1XX19fX19fX19fSw5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA2NF19fX19fX19LDc5OntsOns3MDp7bDp7ODQ6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDY4XX19fX19fX19fX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzM0Nl19fX19fX19fX19fSw5OTp7bDp7NTk6e2M6WzEwOTQwXX0sOTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszNTJdfX19fX19fX19LDEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzM1MF19fX19fX19fX0sMTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMzQ4XX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA1N119fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA4Nl19fX19fSwxMDQ6e2w6ezExMTp7bDp7MTE0OntsOnsxMTY6e2w6ezY4OntsOnsxMTE6e2w6ezExOTp7bDp7MTEwOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5NV19fX19fX19fX19fX19fX19fX19LDc2OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5Ml19fX19fX19fX19fX19fX19fX19LDgyOntsOnsxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk0XX19fX19fX19fX19fX19fX19fX19fSw4NTp7bDp7MTEyOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5M119fX19fX19fX19fX19fX19fX19fX19fSwxMDU6e2w6ezEwMzp7bDp7MTA5OntsOns5Nzp7bDp7NTk6e2M6WzkzMV19fX19fX19fX0sMTA5OntsOns5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezY3OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezEwODp7bDp7MTAxOntsOns1OTp7YzpbODcyOF19fX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzOF19fX19fX19LDExMzp7bDp7MTE0OntsOnsxMTY6e2w6ezU5OntjOls4NzMwXX19fX19LDExNzp7bDp7OTc6e2w6ezExNDp7bDp7MTAxOntsOns1OTp7YzpbOTYzM119LDczOntsOnsxMTA6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezExNTp7bDp7MTAxOntsOns5OTp7bDp7MTE2OntsOnsxMDU6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODg1MV19fX19fX19fX19fX19fX19fX19fX19fX19LDgzOntsOnsxMTc6e2w6ezk4OntsOnsxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODg0N119LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4NDldfX19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODg0OF19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4NTBdfX19fX19fX19fX19fX19fX19fX19fX19fX19LDg1OntsOnsxMTA6e2w6ezEwNTp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls4ODUyXX19fX19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5ODJdfX19fX19fSwxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4OTAyXX19fX19fX0sMTE3OntsOns5ODp7bDp7NTk6e2M6Wzg5MTJdfSwxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODkxMl19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MzhdfX19fX19fX19fX19fX19fX19fSw5OTp7bDp7OTk6e2w6ezEwMTp7bDp7MTAxOntsOnsxMDA6e2w6ezExNTp7bDp7NTk6e2M6Wzg4MjddfSw2OTp7bDp7MTEzOntsOnsxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOlsxMDkyOF19fX19fX19fX19fSw4Mzp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MjldfX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4ODMxXX19fX19fX19fX19fX19fX19fX19fSwxMDQ6e2w6ezg0OntsOnsxMDQ6e2w6ezk3OntsOnsxMTY6e2w6ezU5OntjOls4NzE1XX19fX19fX19fX19fX0sMTA5OntsOns1OTp7YzpbODcyMV19fX0sMTEyOntsOns1OTp7YzpbODkxM119LDEwMTp7bDp7MTE0OntsOnsxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODgzNV19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4MzldfX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOls4OTEzXX19fX19fX19fX19fX0sODQ6e2w6ezcyOntsOns3OTp7bDp7ODI6e2w6ezc4OntsOns1OTp7YzpbMjIyXX19LGM6WzIyMl19fX19fX19LDgyOntsOns2NTp7bDp7Njg6e2w6ezY5OntsOns1OTp7YzpbODQ4Ml19fX19fX19fX0sODM6e2w6ezcyOntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTAzNV19fX19fX19LDk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDYyXX19fX19fX0sOTc6e2w6ezk4OntsOns1OTp7YzpbOV19fX0sMTE3OntsOns1OTp7YzpbOTMyXX19fX19LDk5OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzM1Nl19fX19fX19fX0sMTAxOntsOnsxMDA6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbMzU0XX19fX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDU4XX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDg3XX19fX19LDEwNDp7bDp7MTAxOntsOnsxMTQ6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTE6e2w6ezExNDp7bDp7MTAxOntsOns1OTp7YzpbODc1Nl19fX19fX19fX19fX19LDExNjp7bDp7OTc6e2w6ezU5OntjOls5MjBdfX19fX19fSwxMDU6e2w6ezk5OntsOnsxMDc6e2w6ezgzOntsOnsxMTI6e2w6ezk3OntsOns5OTp7bDp7MTAxOntsOns1OTp7YzpbODI4Nyw4MjAyXX19fX19fX19fX19fX19fSwxMTA6e2w6ezgzOntsOnsxMTI6e2w6ezk3OntsOns5OTp7bDp7MTAxOntsOns1OTp7YzpbODIwMV19fX19fX19fX19fX19fX19fSwxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4NzY0XX0sNjk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc3MV19fX19fX19fX19fSw3MDp7bDp7MTE3OntsOnsxMDg6e2w6ezEwODp7bDp7Njk6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODc3M119fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOls4Nzc2XX19fX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDEzOV19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMTI6e2w6ezEwODp7bDp7MTAxOntsOns2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4NDExXX19fX19fX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk4M119fX19fSwxMTY6e2w6ezExNDp7bDp7MTExOntsOnsxMDc6e2w6ezU5OntjOlszNThdfX19fX19fX19fX19fSw4NTp7bDp7OTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMjE4XX19LGM6WzIxOF19fX19fX19LDExNDp7bDp7MTE0OntsOns1OTp7YzpbODYwN119LDExMTp7bDp7OTk6e2w6ezEwNTp7bDp7MTE0OntsOns1OTp7YzpbMTA1NjldfX19fX19fX19fX19fX19LDk4OntsOnsxMTQ6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDM4XX19fX19LDEwMTp7bDp7MTE4OntsOnsxMDE6e2w6ezU5OntjOlszNjRdfX19fX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzIxOV19fSxjOlsyMTldfX19fX0sMTIxOntsOns1OTp7YzpbMTA1OV19fX19fSwxMDA6e2w6ezk4OntsOnsxMDg6e2w6ezk3OntsOns5OTp7bDp7NTk6e2M6WzM2OF19fX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA4OF19fX19fSwxMDM6e2w6ezExNDp7bDp7OTc6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjE3XX19LGM6WzIxN119fX19fX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzM2Ml19fX19fX19fX0sMTEwOntsOnsxMDA6e2w6ezEwMTp7bDp7MTE0OntsOns2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzk1XX19fX19LDExNDp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOls5MTgzXX19fSwxMDc6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbOTE0MV19fX19fX19fX19fX19fX0sODA6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezEwNDp7bDp7MTAxOntsOnsxMTU6e2w6ezEwNTp7bDp7MTE1OntsOns1OTp7YzpbOTE4MV19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMDU6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODg5OV19LDgwOntsOnsxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbODg0Nl19fX19fX19fX19fX19fX19fSwxMTE6e2w6ezEwMzp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszNzBdfX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE0MF19fX19fX19LDExMjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg1OTNdfSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTE0XX19fX19fX0sNjg6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjQ1XX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDY4OntsOnsxMTE6e2w6ezExOTp7bDp7MTEwOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5N119fX19fX19fX19fX19fX19fX19LDY5OntsOnsxMTM6e2w6ezExNzp7bDp7MTA1OntsOnsxMDg6e2w6ezEwNTp7bDp7OTg6e2w6ezExNDp7bDp7MTA1OntsOnsxMTc6e2w6ezEwOTp7bDp7NTk6e2M6WzEwNjA2XX19fX19fX19fX19fX19fX19fX19fX19LDg0OntsOnsxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4NjldfSw2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYxM119fX19fX19fX19fX19fX19fSw5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY1N119fX19fX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjYxXX19fX19fX19fX19fX19fX19fX0sMTEyOntsOnsxMDE6e2w6ezExNDp7bDp7NzY6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk4XX19fX19fX19fX19fX19fX19fX0sODI6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg1OTldfX19fX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTA1OntsOns1OTp7YzpbOTc4XX0sMTA4OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzkzM119fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6WzM2Nl19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTg0XX19fX19fX0sMTE2OntsOnsxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOlszNjBdfX19fX19fX19fX0sMTE3OntsOnsxMDk6e2w6ezEwODp7bDp7NTk6e2M6WzIyMF19fSxjOlsyMjBdfX19fX19fSw4Njp7bDp7Njg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NzVdfX19fX19fX19LDk4OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA5ODddfX19fX19fSw5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA0Ml19fX19fSwxMDA6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NzNdfSwxMDg6e2w6ezU5OntjOlsxMDk4Ml19fX19fX19fX19fSwxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4OTddfX19LDExNDp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4MjE0XX19fX19fX0sMTE2OntsOns1OTp7YzpbODIxNF19LDEwNTp7bDp7OTk6e2w6ezk3OntsOnsxMDg6e2w6ezY2OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbODczOV19fX19fX19LDc2OntsOnsxMDU6e2w6ezExMDp7bDp7MTAxOntsOns1OTp7YzpbMTI0XX19fX19fX19fSw4Mzp7bDp7MTAxOntsOnsxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezk3OntsOnsxMTY6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbMTAwNzJdfX19fX19fX19fX19fX19fX19fSw4NDp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbODc2OF19fX19fX19fX19fX19fX19fX19fX0sMTIxOntsOns4NDp7bDp7MTA0OntsOnsxMDU6e2w6ezExMDp7bDp7ODM6e2w6ezExMjp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOls4MjAyXX19fX19fX19fX19fX19fX19fX19fX19fX0sMTAyOntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwODldfX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE0MV19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk4NV19fX19fX19LDExODp7bDp7MTAwOntsOns5Nzp7bDp7MTE1OntsOnsxMDQ6e2w6ezU5OntjOls4ODc0XX19fX19fX19fX19fX0sODc6e2w6ezk5OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOlszNzJdfX19fX19fX19LDEwMTp7bDp7MTAwOntsOnsxMDM6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4OTZdfX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDkwXX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNDJdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5ODZdfX19fX19fX19LDg4OntsOnsxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA5MV19fX19fSwxMDU6e2w6ezU5OntjOls5MjZdfX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNDNdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5ODddfX19fX19fX19LDg5OntsOns2NTp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNzFdfX19fX19fSw3Mzp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwMzFdfX19fX19fSw4NTp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNzBdfX19fX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyMjFdfX0sYzpbMjIxXX19fX19fX19fSw5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMzc0XX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA2N119fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDA5Ml19fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTQ0XX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTg4XX19fX19fX0sMTE3OntsOnsxMDk6e2w6ezEwODp7bDp7NTk6e2M6WzM3Nl19fX19fX19fX0sOTA6e2w6ezcyOntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA0Nl19fX19fX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzM3N119fX19fX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszODFdfX19fX19fX19LDEyMTp7bDp7NTk6e2M6WzEwNDddfX19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzM3OV19fX19fX19LDEwMTp7bDp7MTE0OntsOnsxMTE6e2w6ezg3OntsOnsxMDU6e2w6ezEwMDp7bDp7MTE2OntsOnsxMDQ6e2w6ezgzOntsOnsxMTI6e2w6ezk3OntsOns5OTp7bDp7MTAxOntsOns1OTp7YzpbODIwM119fX19fX19fX19fX19fX19fX19fX19fX19LDExNjp7bDp7OTc6e2w6ezU5OntjOls5MThdfX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6Wzg0ODhdfX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6Wzg0ODRdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5ODldfX19fX19fX19LDk3OntsOns5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyMjVdfX0sYzpbMjI1XX19fX19fX19fSw5ODp7bDp7MTE0OntsOnsxMDE6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjU5XX19fX19fX19fX19LDk5OntsOns1OTp7YzpbODc2Nl19LDY5OntsOns1OTp7YzpbODc2Niw4MTldfX19LDEwMDp7bDp7NTk6e2M6Wzg3NjddfX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzIyNl19fSxjOlsyMjZdfX19fX0sMTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzE4MF19fSxjOlsxODBdfX19fX0sMTIxOntsOns1OTp7YzpbMTA3Ml19fX19fSwxMDE6e2w6ezEwODp7bDp7MTA1OntsOnsxMDM6e2w6ezU5OntjOlsyMzBdfX0sYzpbMjMwXX19fX19fX0sMTAyOntsOns1OTp7YzpbODI4OV19LDExNDp7bDp7NTk6e2M6WzEyMDA5NF19fX19fSwxMDM6e2w6ezExNDp7bDp7OTc6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjI0XX19LGM6WzIyNF19fX19fX19fX0sMTA4OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE1OntsOnsxMjE6e2w6ezEwOTp7bDp7NTk6e2M6Wzg1MDFdfX19fX19fX19LDExMjp7bDp7MTA0OntsOns1OTp7YzpbODUwMV19fX19fX19LDExMjp7bDp7MTA0OntsOns5Nzp7bDp7NTk6e2M6Wzk0NV19fX19fX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzI1N119fX19fSwxMDg6e2w6ezEwMzp7bDp7NTk6e2M6WzEwODE1XX19fX19fX0sMTEyOntsOns1OTp7YzpbMzhdfX0sYzpbMzhdfX19LDExMDp7bDp7MTAwOntsOns1OTp7YzpbODc0M119LDk3OntsOnsxMTA6e2w6ezEwMDp7bDp7NTk6e2M6WzEwODM3XX19fX19fX0sMTAwOntsOns1OTp7YzpbMTA4NDRdfX19LDExNTp7bDp7MTA4OntsOnsxMTE6e2w6ezExMjp7bDp7MTAxOntsOns1OTp7YzpbMTA4NDBdfX19fX19fX19fX0sMTE4OntsOns1OTp7YzpbMTA4NDJdfX19fX0sMTAzOntsOns1OTp7YzpbODczNl19LDEwMTp7bDp7NTk6e2M6WzEwNjYwXX19fSwxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzg3MzZdfX19fX0sMTA5OntsOnsxMTU6e2w6ezEwMDp7bDp7NTk6e2M6Wzg3MzddfSw5Nzp7bDp7OTc6e2w6ezU5OntjOlsxMDY2NF19fX0sOTg6e2w6ezU5OntjOlsxMDY2NV19fX0sOTk6e2w6ezU5OntjOlsxMDY2Nl19fX0sMTAwOntsOns1OTp7YzpbMTA2NjddfX19LDEwMTp7bDp7NTk6e2M6WzEwNjY4XX19fSwxMDI6e2w6ezU5OntjOlsxMDY2OV19fX0sMTAzOntsOns1OTp7YzpbMTA2NzBdfX19LDEwNDp7bDp7NTk6e2M6WzEwNjcxXX19fX19fX19fX19LDExNDp7bDp7MTE2OntsOns1OTp7YzpbODczNV19LDExODp7bDp7OTg6e2w6ezU5OntjOls4ODk0XX0sMTAwOntsOns1OTp7YzpbMTA2NTNdfX19fX19fX19fX0sMTE1OntsOnsxMTI6e2w6ezEwNDp7bDp7NTk6e2M6Wzg3MzhdfX19fX0sMTE2OntsOns1OTp7YzpbMTk3XX19fX19LDEyMjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbOTA4NF19fX19fX19fX19fX19LDExMTp7bDp7MTAzOntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzI2MV19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTQ2XX19fX19fX0sMTEyOntsOns1OTp7YzpbODc3Nl19LDY5OntsOns1OTp7YzpbMTA4NjRdfX19LDk3OntsOns5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezU5OntjOlsxMDg2M119fX19fX19fX0sMTAxOntsOns1OTp7YzpbODc3OF19fX0sMTA1OntsOnsxMDA6e2w6ezU5OntjOls4Nzc5XX19fX19LDExMTp7bDp7MTE1OntsOns1OTp7YzpbMzldfX19fX0sMTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbODc3Nl19LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc3OF19fX19fX19fX19fX19fX0sMTE0OntsOnsxMDU6e2w6ezExMDp7bDp7MTAzOntsOns1OTp7YzpbMjI5XX19LGM6WzIyOV19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk5MF19fX19fSwxMTY6e2w6ezU5OntjOls0Ml19fX0sMTIxOntsOnsxMDk6e2w6ezExMjp7bDp7NTk6e2M6Wzg3NzZdfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg3ODFdfX19fX19fX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzIyN119fSxjOlsyMjddfX19fX19fX19LDExNzp7bDp7MTA5OntsOnsxMDg6e2w6ezU5OntjOlsyMjhdfX0sYzpbMjI4XX19fX19LDExOTp7bDp7OTk6e2w6ezExMTp7bDp7MTEwOntsOnsxMDU6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbODc1NV19fX19fX19fX19fX19LDEwNTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDc2OV19fX19fX19fX19fSw5ODp7bDp7Nzg6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA5ODldfX19fX19fSw5Nzp7bDp7OTk6e2w6ezEwNzp7bDp7OTk6e2w6ezExMTp7bDp7MTEwOntsOnsxMDM6e2w6ezU5OntjOls4NzgwXX19fX19fX19fSwxMDE6e2w6ezExMjp7bDp7MTE1OntsOnsxMDU6e2w6ezEwODp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsxMDE0XX19fX19fX19fX19fX19fSwxMTI6e2w6ezExNDp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7NTk6e2M6WzgyNDVdfX19fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg3NjVdfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg5MDldfX19fX19fX19fX19fX19LDExNDp7bDp7MTE4OntsOnsxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4OTNdfX19fX19fSwxMTk6e2w6ezEwMTp7bDp7MTAwOntsOns1OTp7YzpbODk2NV19LDEwMzp7bDp7MTAxOntsOns1OTp7YzpbODk2NV19fX19fX19fX19fX19fX0sOTg6e2w6ezExNDp7bDp7MTA3OntsOns1OTp7YzpbOTE0MV19LDExNjp7bDp7OTg6e2w6ezExNDp7bDp7MTA3OntsOns1OTp7YzpbOTE0Ml19fX19fX19fX19fX19fX0sOTk6e2w6ezExMTp7bDp7MTEwOntsOnsxMDM6e2w6ezU5OntjOls4NzgwXX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA3M119fX19fSwxMDA6e2w6ezExMzp7bDp7MTE3OntsOnsxMTE6e2w6ezU5OntjOls4MjIyXX19fX19fX19fSwxMDE6e2w6ezk5OntsOns5Nzp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4NzU3XX0sMTAxOntsOns1OTp7YzpbODc1N119fX19fX19fX19fSwxMDk6e2w6ezExMjp7bDp7MTE2OntsOnsxMjE6e2w6ezExODp7bDp7NTk6e2M6WzEwNjcyXX19fX19fX19fX19LDExMjp7bDp7MTE1OntsOnsxMDU6e2w6ezU5OntjOlsxMDE0XX19fX19fX0sMTE0OntsOnsxMTA6e2w6ezExMTp7bDp7MTE3OntsOns1OTp7YzpbODQ5Ml19fX19fX19fX0sMTE2OntsOns5Nzp7bDp7NTk6e2M6Wzk0Nl19fX0sMTA0OntsOns1OTp7YzpbODUwMl19fX0sMTE5OntsOnsxMDE6e2w6ezEwMTp7bDp7MTEwOntsOns1OTp7YzpbODgxMl19fX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDk1XX19fX19LDEwNTp7bDp7MTAzOntsOns5OTp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg4OThdfX19fX0sMTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbOTcxMV19fX19fX19LDExNzp7bDp7MTEyOntsOns1OTp7YzpbODg5OV19fX19fX19LDExMTp7bDp7MTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzUyXX19fX19fX0sMTEyOntsOnsxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbMTA3NTNdfX19fX19fX19LDExNjp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbMTA3NTRdfX19fX19fX19fX19fSwxMTU6e2w6ezExMzp7bDp7OTk6e2w6ezExNzp7bDp7MTEyOntsOns1OTp7YzpbMTA3NThdfX19fX19fX19LDExNjp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzk3MzNdfX19fX19fX19LDExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezk3OntsOnsxMTA6e2w6ezEwMzp7bDp7MTA4OntsOnsxMDE6e2w6ezEwMDp7bDp7MTExOntsOnsxMTk6e2w6ezExMDp7bDp7NTk6e2M6Wzk2NjFdfX19fX19fX19LDExNzp7bDp7MTEyOntsOns1OTp7YzpbOTY1MV19fX19fX19fX19fX19fX19fX19fX0sMTE3OntsOnsxMTI6e2w6ezEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxMDc1Nl19fX19fX19fX19fSwxMTg6e2w6ezEwMTp7bDp7MTAxOntsOns1OTp7YzpbODg5N119fX19fX19LDExOTp7bDp7MTAxOntsOnsxMDA6e2w6ezEwMzp7bDp7MTAxOntsOns1OTp7YzpbODg5Nl19fX19fX19fX19fX19fX0sMTA3OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwNTA5XX19fX19fX19fX19LDEwODp7bDp7OTc6e2w6ezk5OntsOnsxMDc6e2w6ezEwODp7bDp7MTExOntsOnsxMjI6e2w6ezEwMTp7bDp7MTEwOntsOnsxMDM6e2w6ezEwMTp7bDp7NTk6e2M6WzEwNzMxXX19fX19fX19fX19fX19fSwxMTU6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTE0OntsOnsxMDE6e2w6ezU5OntjOls5NjQyXX19fX19fX19fX19fX0sMTE2OntsOnsxMTQ6e2w6ezEwNTp7bDp7OTc6e2w6ezExMDp7bDp7MTAzOntsOnsxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzk2NTJdfSwxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezU5OntjOls5NjYyXX19fX19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezU5OntjOls5NjY2XX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6Wzk2NTZdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTA6e2w6ezEwNzp7bDp7NTk6e2M6WzkyNTFdfX19fX19fSwxMDc6e2w6ezQ5OntsOns1MDp7bDp7NTk6e2M6Wzk2MThdfX19LDUyOntsOns1OTp7YzpbOTYxN119fX19fSw1MTp7bDp7NTI6e2w6ezU5OntjOls5NjE5XX19fX19fX0sMTExOntsOns5OTp7bDp7MTA3OntsOns1OTp7YzpbOTYwOF19fX19fX19fX0sMTEwOntsOnsxMDE6e2w6ezU5OntjOls2MSw4NDIxXX0sMTEzOntsOnsxMTc6e2w6ezEwNTp7bDp7MTE4OntsOns1OTp7YzpbODgwMSw4NDIxXX19fX19fX19fX19LDExMTp7bDp7MTE2OntsOns1OTp7YzpbODk3Nl19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNDddfX19fX0sMTE2OntsOns1OTp7YzpbODg2OV19LDExNjp7bDp7MTExOntsOnsxMDk6e2w6ezU5OntjOls4ODY5XX19fX19fX19fSwxMTk6e2w6ezExNjp7bDp7MTA1OntsOnsxMDE6e2w6ezU5OntjOls4OTA0XX19fX19fX19fSwxMjA6e2w6ezY4OntsOns3Njp7bDp7NTk6e2M6Wzk1NTldfX19LDgyOntsOns1OTp7YzpbOTU1Nl19fX0sMTA4OntsOns1OTp7YzpbOTU1OF19fX0sMTE0OntsOns1OTp7YzpbOTU1NV19fX19fSw3Mjp7bDp7NTk6e2M6Wzk1NTJdfSw2ODp7bDp7NTk6e2M6Wzk1NzRdfX19LDg1OntsOns1OTp7YzpbOTU3N119fX0sMTAwOntsOns1OTp7YzpbOTU3Ml19fX0sMTE3OntsOns1OTp7YzpbOTU3NV19fX19fSw4NTp7bDp7NzY6e2w6ezU5OntjOls5NTY1XX19fSw4Mjp7bDp7NTk6e2M6Wzk1NjJdfX19LDEwODp7bDp7NTk6e2M6Wzk1NjRdfX19LDExNDp7bDp7NTk6e2M6Wzk1NjFdfX19fX0sODY6e2w6ezU5OntjOls5NTUzXX0sNzI6e2w6ezU5OntjOls5NTgwXX19fSw3Njp7bDp7NTk6e2M6Wzk1NzFdfX19LDgyOntsOns1OTp7YzpbOTU2OF19fX0sMTA0OntsOns1OTp7YzpbOTU3OV19fX0sMTA4OntsOns1OTp7YzpbOTU3MF19fX0sMTE0OntsOns1OTp7YzpbOTU2N119fX19fSw5ODp7bDp7MTExOntsOnsxMjA6e2w6ezU5OntjOlsxMDY5N119fX19fX19LDEwMDp7bDp7NzY6e2w6ezU5OntjOls5NTU3XX19fSw4Mjp7bDp7NTk6e2M6Wzk1NTRdfX19LDEwODp7bDp7NTk6e2M6Wzk0ODhdfX19LDExNDp7bDp7NTk6e2M6Wzk0ODRdfX19fX0sMTA0OntsOns1OTp7YzpbOTQ3Ml19LDY4OntsOns1OTp7YzpbOTU3M119fX0sODU6e2w6ezU5OntjOls5NTc2XX19fSwxMDA6e2w6ezU5OntjOls5NTE2XX19fSwxMTc6e2w6ezU5OntjOls5NTI0XX19fX19LDEwOTp7bDp7MTA1OntsOnsxMTA6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbODg2M119fX19fX19fX19fSwxMTI6e2w6ezEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4ODYyXX19fX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA5OntsOnsxMDE6e2w6ezExNTp7bDp7NTk6e2M6Wzg4NjRdfX19fX19fX19fX0sMTE3OntsOns3Njp7bDp7NTk6e2M6Wzk1NjNdfX19LDgyOntsOns1OTp7YzpbOTU2MF19fX0sMTA4OntsOns1OTp7YzpbOTQ5Nl19fX0sMTE0OntsOns1OTp7YzpbOTQ5Ml19fX19fSwxMTg6e2w6ezU5OntjOls5NDc0XX0sNzI6e2w6ezU5OntjOls5NTc4XX19fSw3Njp7bDp7NTk6e2M6Wzk1NjldfX19LDgyOntsOns1OTp7YzpbOTU2Nl19fX0sMTA0OntsOns1OTp7YzpbOTUzMl19fX0sMTA4OntsOns1OTp7YzpbOTUwOF19fX0sMTE0OntsOns1OTp7YzpbOTUwMF19fX19fX19fX0sMTEyOntsOnsxMTQ6e2w6ezEwNTp7bDp7MTA5OntsOnsxMDE6e2w6ezU5OntjOls4MjQ1XX19fX19fX19fX19LDExNDp7bDp7MTAxOntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzcyOF19fX19fX19LDExODp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxNjZdfX0sYzpbMTY2XX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5OTFdfX19fX0sMTAxOntsOnsxMDk6e2w6ezEwNTp7bDp7NTk6e2M6WzgyNzFdfX19fX19fSwxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg3NjVdfSwxMDE6e2w6ezU5OntjOls4OTA5XX19fX19fX0sMTExOntsOnsxMDg6e2w6ezU5OntjOls5Ml19LDk4OntsOns1OTp7YzpbMTA2OTNdfX19LDEwNDp7bDp7MTE1OntsOnsxMTc6e2w6ezk4OntsOns1OTp7YzpbMTAxODRdfX19fX19fX19fX19fX19LDExNzp7bDp7MTA4OntsOnsxMDg6e2w6ezU5OntjOls4MjI2XX0sMTAxOntsOnsxMTY6e2w6ezU5OntjOls4MjI2XX19fX19fX19fSwxMDk6e2w6ezExMjp7bDp7NTk6e2M6Wzg3ODJdfSw2OTp7bDp7NTk6e2M6WzEwOTI2XX19fSwxMDE6e2w6ezU5OntjOls4NzgzXX0sMTEzOntsOns1OTp7YzpbODc4M119fX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyNjNdfX19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg3NDVdfSw5Nzp7bDp7MTEwOntsOnsxMDA6e2w6ezU5OntjOlsxMDgyMF19fX19fX19LDk4OntsOnsxMTQ6e2w6ezk5OntsOnsxMTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwODI1XX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7MTEyOntsOns1OTp7YzpbMTA4MjddfX19fX0sMTE3OntsOnsxMTI6e2w6ezU5OntjOlsxMDgyM119fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsxMDgxNl19fX19fX19LDExNTp7bDp7NTk6e2M6Wzg3NDUsNjUwMjRdfX19fX0sMTE0OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6WzgyNTddfX19fX0sMTExOntsOnsxMTA6e2w6ezU5OntjOls3MTFdfX19fX19fX19LDk5OntsOns5Nzp7bDp7MTEyOntsOnsxMTU6e2w6ezU5OntjOlsxMDgyOV19fX19fSwxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMjY5XX19fX19fX19fSwxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsyMzFdfX0sYzpbMjMxXX19fX19fX0sMTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMjY1XX19fX19fX0sMTE3OntsOnsxMTI6e2w6ezExNTp7bDp7NTk6e2M6WzEwODI4XX0sMTE1OntsOnsxMDk6e2w6ezU5OntjOlsxMDgzMl19fX19fX19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsyNjddfX19fX19fSwxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsxODRdfX0sYzpbMTg0XX19fX19LDEwOTp7bDp7MTEyOntsOnsxMTY6e2w6ezEyMTp7bDp7MTE4OntsOns1OTp7YzpbMTA2NzRdfX19fX19fX19fX0sMTEwOntsOnsxMTY6e2w6ezU5OntjOlsxNjJdfSwxMDE6e2w6ezExNDp7bDp7MTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzE4M119fX19fX19fX19fX0sYzpbMTYyXX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDk2XX19fX19LDEwNDp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwOTVdfX19fX0sMTAxOntsOns5OTp7bDp7MTA3OntsOns1OTp7YzpbMTAwMDNdfSwxMDk6e2w6ezk3OntsOnsxMTQ6e2w6ezEwNzp7bDp7NTk6e2M6WzEwMDAzXX19fX19fX19fX19fX19fSwxMDU6e2w6ezU5OntjOls5NjddfX19fX0sMTA1OntsOnsxMTQ6e2w6ezU5OntjOls5Njc1XX0sNjk6e2w6ezU5OntjOlsxMDY5MV19fX0sOTk6e2w6ezU5OntjOls3MTBdfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg3OTFdfX19fX0sMTA4OntsOnsxMDE6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezEwODp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7NTk6e2M6Wzg2MzRdfX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns1OTp7YzpbODYzNV19fX19fX19fX19fX19fX19fX19fX0sMTAwOntsOns4Mjp7bDp7NTk6e2M6WzE3NF19fX0sODM6e2w6ezU5OntjOls5NDE2XX19fSw5Nzp7bDp7MTE1OntsOnsxMTY6e2w6ezU5OntjOls4ODU5XX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6Wzg4NThdfX19fX19fX19LDEwMDp7bDp7OTc6e2w6ezExNTp7bDp7MTA0OntsOns1OTp7YzpbODg2MV19fX19fX19fX19fX19fX19fSwxMDE6e2w6ezU5OntjOls4NzkxXX19fSwxMDI6e2w6ezExMDp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzY4XX19fX19fX19fX19LDEwOTp7bDp7MTA1OntsOnsxMDA6e2w6ezU5OntjOlsxMDk5MV19fX19fX19LDExNTp7bDp7OTk6e2w6ezEwNTp7bDp7MTE0OntsOns1OTp7YzpbMTA2OTBdfX19fX19fX19fX19fSwxMDg6e2w6ezExNzp7bDp7OTg6e2w6ezExNTp7bDp7NTk6e2M6Wzk4MjddfSwxMTc6e2w6ezEwNTp7bDp7MTE2OntsOns1OTp7YzpbOTgyN119fX19fX19fX19fX19fX0sMTExOntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbNThdfSwxMDE6e2w6ezU5OntjOls4Nzg4XX0sMTEzOntsOns1OTp7YzpbODc4OF19fX19fX19fX19fSwxMDk6e2w6ezEwOTp7bDp7OTc6e2w6ezU5OntjOls0NF19LDExNjp7bDp7NTk6e2M6WzY0XX19fX19fX0sMTEyOntsOns1OTp7YzpbODcwNV19LDEwMjp7bDp7MTEwOntsOns1OTp7YzpbODcyOF19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTA5OntsOnsxMDE6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbODcwNV19fX19fX19fX0sMTIwOntsOnsxMDE6e2w6ezExNTp7bDp7NTk6e2M6Wzg0NTBdfX19fX19fX19fX19fX19LDExMDp7bDp7MTAzOntsOns1OTp7YzpbODc3M119LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsxMDg2MV19fX19fX19fX0sMTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NTBdfX19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTQ4XX19fSwxMTQ6e2w6ezExMTp7bDp7MTAwOntsOns1OTp7YzpbODcyMF19fX19fX19LDEyMTp7bDp7NTk6e2M6WzE2OV19LDExNTp7bDp7MTE0OntsOns1OTp7YzpbODQ3MV19fX19fX0sYzpbMTY5XX19fX19LDExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODYyOV19fX19fX19LDExMTp7bDp7MTE1OntsOnsxMTU6e2w6ezU5OntjOlsxMDAwN119fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTkyXX19fX19LDExNzp7bDp7OTg6e2w6ezU5OntjOlsxMDk1OV19LDEwMTp7bDp7NTk6e2M6WzEwOTYxXX19fX19LDExMjp7bDp7NTk6e2M6WzEwOTYwXX0sMTAxOntsOns1OTp7YzpbMTA5NjJdfX19fX19fX19LDExNjp7bDp7MTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6Wzg5NDNdfX19fX19fX19LDExNzp7bDp7MTAwOntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezEwODp7bDp7NTk6e2M6WzEwNTUyXX19fSwxMTQ6e2w6ezU5OntjOlsxMDU0OV19fX19fX19fX19fSwxMDE6e2w6ezExMjp7bDp7MTE0OntsOns1OTp7YzpbODkyNl19fX19fSwxMTU6e2w6ezk5OntsOns1OTp7YzpbODkyN119fX19fX19LDEwODp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODYzMF19LDExMjp7bDp7NTk6e2M6WzEwNTU3XX19fX19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg3NDZdfSw5ODp7bDp7MTE0OntsOns5OTp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwODI0XX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7MTEyOntsOns1OTp7YzpbMTA4MjJdfX19fX0sMTE3OntsOnsxMTI6e2w6ezU5OntjOlsxMDgyNl19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4ODQ1XX19fX19fX0sMTExOntsOnsxMTQ6e2w6ezU5OntjOlsxMDgyMV19fX19fSwxMTU6e2w6ezU5OntjOls4NzQ2LDY1MDI0XX19fX19LDExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODYzMV19LDEwOTp7bDp7NTk6e2M6WzEwNTU2XX19fX19fX19fSwxMDg6e2w6ezEyMTp7bDp7MTAxOntsOnsxMTM6e2w6ezExMjp7bDp7MTE0OntsOnsxMDE6e2w6ezk5OntsOns1OTp7YzpbODkyNl19fX19fX19fX0sMTE1OntsOnsxMTc6e2w6ezk5OntsOns5OTp7bDp7NTk6e2M6Wzg5MjddfX19fX19fX19fX19fSwxMTg6e2w6ezEwMTp7bDp7MTAxOntsOns1OTp7YzpbODkxMF19fX19fX19LDExOTp7bDp7MTAxOntsOnsxMDA6e2w6ezEwMzp7bDp7MTAxOntsOns1OTp7YzpbODkxMV19fX19fX19fX19fX19fX0sMTE0OntsOnsxMDE6e2w6ezExMDp7bDp7NTk6e2M6WzE2NF19fSxjOlsxNjRdfX19fX0sMTE4OntsOnsxMDE6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezEwODp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7NTk6e2M6Wzg2MzBdfX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns1OTp7YzpbODYzMV19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTE4OntsOnsxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg5MTBdfX19fX19fSwxMTk6e2w6ezEwMTp7bDp7MTAwOntsOns1OTp7YzpbODkxMV19fX19fX19fX0sMTE5OntsOns5OTp7bDp7MTExOntsOnsxMTA6e2w6ezEwNTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOls4NzU0XX19fX19fX19fX19fX0sMTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NTNdfX19fX19fX19LDEyMTp7bDp7MTA4OntsOns5OTp7bDp7MTE2OntsOnsxMjE6e2w6ezU5OntjOls5MDA1XX19fX19fX19fX19fX0sMTAwOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjU5XX19fX19fX0sNzI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU5N119fX19fX19LDk3OntsOnsxMDM6e2w6ezEwMzp7bDp7MTAxOntsOnsxMTQ6e2w6ezU5OntjOls4MjI0XX19fX19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTE2OntsOnsxMDQ6e2w6ezU5OntjOls4NTA0XX19fX19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg1OTVdfX19fX0sMTE1OntsOnsxMDQ6e2w6ezU5OntjOls4MjA4XX0sMTE4OntsOns1OTp7YzpbODg2N119fX19fX19fX0sOTg6e2w6ezEwNzp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDUxMV19fX19fX19fX19fSwxMDg6e2w6ezk3OntsOns5OTp7bDp7NTk6e2M6WzczM119fX19fX19fX0sOTk6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMjcxXX19fX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDc2XX19fX19LDEwMDp7bDp7NTk6e2M6Wzg1MThdfSw5Nzp7bDp7MTAzOntsOnsxMDM6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbODIyNV19fX19fX19fX0sMTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjUwXX19fX19fX0sMTExOntsOnsxMTY6e2w6ezExNTp7bDp7MTAxOntsOnsxMTM6e2w6ezU5OntjOlsxMDg3MV19fX19fX19fX19fX19LDEwMTp7bDp7MTAzOntsOns1OTp7YzpbMTc2XX19LGM6WzE3Nl19LDEwODp7bDp7MTE2OntsOns5Nzp7bDp7NTk6e2M6Wzk0OF19fX19fX19LDEwOTp7bDp7MTEyOntsOnsxMTY6e2w6ezEyMTp7bDp7MTE4OntsOns1OTp7YzpbMTA2NzNdfX19fX19fX19fX19fSwxMDI6e2w6ezEwNTp7bDp7MTE1OntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6WzEwNjIzXX19fX19fX19fSwxMTQ6e2w6ezU5OntjOlsxMjAwOTddfX19fX0sMTA0OntsOns5Nzp7bDp7MTE0OntsOnsxMDg6e2w6ezU5OntjOls4NjQzXX19fSwxMTQ6e2w6ezU5OntjOls4NjQyXX19fX19fX19fSwxMDU6e2w6ezk3OntsOnsxMDk6e2w6ezU5OntjOls4OTAwXX0sMTExOntsOnsxMTA6e2w6ezEwMDp7bDp7NTk6e2M6Wzg5MDBdfSwxMTU6e2w6ezExNzp7bDp7MTA1OntsOnsxMTY6e2w6ezU5OntjOls5ODMwXX19fX19fX19fX19fX19fSwxMTU6e2w6ezU5OntjOls5ODMwXX19fX19fX0sMTAxOntsOns1OTp7YzpbMTY4XX19fSwxMDM6e2w6ezk3OntsOnsxMDk6e2w6ezEwOTp7bDp7OTc6e2w6ezU5OntjOls5ODldfX19fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezExMDp7bDp7NTk6e2M6Wzg5NDZdfX19fX19fSwxMTg6e2w6ezU5OntjOlsyNDddfSwxMDU6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbMjQ3XX0sMTExOntsOnsxMTA6e2w6ezExNjp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbODkwM119fX19fX19fX19fX19fX19LGM6WzI0N119fX19fSwxMTE6e2w6ezExMDp7bDp7MTIwOntsOns1OTp7YzpbODkwM119fX19fX19fX19fSwxMDY6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTA2XX19fX19fX0sMTA4OntsOns5OTp7bDp7MTExOntsOnsxMTQ6e2w6ezExMDp7bDp7NTk6e2M6Wzg5OTBdfX19fX19fSwxMTQ6e2w6ezExMTp7bDp7MTEyOntsOns1OTp7YzpbODk3M119fX19fX19fX19fSwxMTE6e2w6ezEwODp7bDp7MTA4OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMzZdfX19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTQ5XX19fX19LDExNjp7bDp7NTk6e2M6WzcyOV19LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc4NF19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4Nzg1XX19fX19fX19fX19LDEwOTp7bDp7MTA1OntsOnsxMTA6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbODc2MF19fX19fX19fX19fSwxMTI6e2w6ezEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4NzI0XX19fX19fX19fSwxMTU6e2w6ezExMzp7bDp7MTE3OntsOns5Nzp7bDp7MTE0OntsOnsxMDE6e2w6ezU5OntjOls4ODY1XX19fX19fX19fX19fX19fSwxMTc6e2w6ezk4OntsOnsxMDg6e2w6ezEwMTp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezExOTp7bDp7MTAxOntsOnsxMDA6e2w6ezEwMzp7bDp7MTAxOntsOns1OTp7YzpbODk2Nl19fX19fX19fX19fX19fX19fX19fX19fX19LDExOTp7bDp7MTEwOntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5NV19fX19fX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezExNTp7bDp7NTk6e2M6Wzg2NTBdfX19fX19fX19fX19fX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTEyOntsOnsxMTE6e2w6ezExMTp7bDp7MTEwOntsOnsxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezU5OntjOls4NjQzXX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6Wzg2NDJdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezk4OntsOnsxMDc6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbMTA1MTJdfX19fX19fX19fX19fSw5OTp7bDp7MTExOntsOnsxMTQ6e2w6ezExMDp7bDp7NTk6e2M6Wzg5OTFdfX19fX19fSwxMTQ6e2w6ezExMTp7bDp7MTEyOntsOns1OTp7YzpbODk3Ml19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5OTNdfX19LDEyMTp7bDp7NTk6e2M6WzExMDldfX19fX0sMTExOntsOnsxMDg6e2w6ezU5OntjOlsxMDc0Ml19fX19fSwxMTY6e2w6ezExNDp7bDp7MTExOntsOnsxMDc6e2w6ezU5OntjOlsyNzNdfX19fX19fX19fX0sMTE2OntsOnsxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbODk0NV19fX19fX19LDExNDp7bDp7MTA1OntsOns1OTp7YzpbOTY2M119LDEwMjp7bDp7NTk6e2M6Wzk2NjJdfX19fX19fX19LDExNzp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY5M119fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjA3XX19fX19fX19fSwxMTk6e2w6ezk3OntsOnsxMTA6e2w6ezEwMzp7bDp7MTA4OntsOnsxMDE6e2w6ezU5OntjOlsxMDY2Ml19fX19fX19fX19fX19LDEyMjp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzExMTldfX19fX0sMTA1OntsOnsxMDM6e2w6ezExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTAyMzldfX19fX19fX19fX19fX19fX0sMTAxOntsOns2ODp7bDp7Njg6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA4NzFdfX19fX19fSwxMTE6e2w6ezExNjp7bDp7NTk6e2M6Wzg3ODVdfX19fX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlsyMzNdfX0sYzpbMjMzXX19fX19fX0sMTE1OntsOnsxMTY6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbMTA4NjJdfX19fX19fX19fX0sOTk6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMjgzXX19fX19fX19fSwxMDU6e2w6ezExNDp7bDp7NTk6e2M6Wzg3OTBdfSw5OTp7bDp7NTk6e2M6WzIzNF19fSxjOlsyMzRdfX19fX0sMTExOntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODc4OV19fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTEwMV19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMjc5XX19fX19fX0sMTAxOntsOns1OTp7YzpbODUxOV19fX0sMTAyOntsOns2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4Nzg2XX19fX19fX0sMTE0OntsOns1OTp7YzpbMTIwMDk4XX19fX19LDEwMzp7bDp7NTk6e2M6WzEwOTA2XX0sMTE0OntsOns5Nzp7bDp7MTE4OntsOnsxMDE6e2w6ezU5OntjOlsyMzJdfX0sYzpbMjMyXX19fX19fX0sMTE1OntsOns1OTp7YzpbMTA5MDJdfSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA5MDRdfX19fX19fX19fX0sMTA4OntsOns1OTp7YzpbMTA5MDVdfSwxMDU6e2w6ezExMDp7bDp7MTE2OntsOnsxMDE6e2w6ezExNDp7bDp7MTE1OntsOns1OTp7YzpbOTE5MV19fX19fX19fX19fX19LDEwODp7bDp7NTk6e2M6Wzg0NjddfX19LDExNTp7bDp7NTk6e2M6WzEwOTAxXX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwOTAzXX19fX19fX19fX19LDEwOTp7bDp7OTc6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsyNzVdfX19fX19fSwxMTI6e2w6ezExNjp7bDp7MTIxOntsOns1OTp7YzpbODcwOV19LDExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOls4NzA5XX19fX19fX0sMTE4OntsOns1OTp7YzpbODcwOV19fX19fX19fX0sMTE1OntsOnsxMTI6e2w6ezQ5OntsOns1MTp7bDp7NTk6e2M6WzgxOTZdfX19LDUyOntsOns1OTp7YzpbODE5N119fX19fSw1OTp7YzpbODE5NV19fX19fX19LDExMDp7bDp7MTAzOntsOns1OTp7YzpbMzMxXX19fSwxMTU6e2w6ezExMjp7bDp7NTk6e2M6WzgxOTRdfX19fX19fSwxMTE6e2w6ezEwMzp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsyODFdfX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE1MF19fX19fX19LDExMjp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzg5MTddfSwxMTU6e2w6ezEwODp7bDp7NTk6e2M6WzEwNzIzXX19fX19fX19fSwxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbMTA4NjVdfX19fX19fSwxMTU6e2w6ezEwNTp7bDp7NTk6e2M6Wzk0OV19LDEwODp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls5NDldfX19fX19fSwxMTg6e2w6ezU5OntjOlsxMDEzXX19fX19fX19fSwxMTM6e2w6ezk5OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOls4NzkwXX19fX19fX0sMTExOntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbODc4OV19fX19fX19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODc3MF19fX19fSwxMDg6e2w6ezk3OntsOnsxMTA6e2w6ezExNjp7bDp7MTAzOntsOnsxMTY6e2w6ezExNDp7bDp7NTk6e2M6WzEwOTAyXX19fX19fX0sMTA4OntsOnsxMDE6e2w6ezExNTp7bDp7MTE1OntsOns1OTp7YzpbMTA5MDFdfX19fX19fX19fX19fX19fX19fSwxMTc6e2w6ezk3OntsOnsxMDg6e2w6ezExNTp7bDp7NTk6e2M6WzYxXX19fX19fX0sMTAxOntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6Wzg3OTldfX19fX19fSwxMDU6e2w6ezExODp7bDp7NTk6e2M6Wzg4MDFdfSw2ODp7bDp7Njg6e2w6ezU5OntjOlsxMDg3Ml19fX19fX19fX19fSwxMTg6e2w6ezExMjp7bDp7OTc6e2w6ezExNDp7bDp7MTE1OntsOnsxMDg6e2w6ezU5OntjOlsxMDcyNV19fX19fX19fX19fX19fX0sMTE0OntsOns2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4Nzg3XX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA2MDldfX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6Wzg0OTVdfX19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6Wzg3ODRdfX19fX19fSwxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg3NzBdfX19fX19fSwxMTY6e2w6ezk3OntsOns1OTp7YzpbOTUxXX19fSwxMDQ6e2w6ezU5OntjOlsyNDBdfX0sYzpbMjQwXX19fSwxMTc6e2w6ezEwOTp7bDp7MTA4OntsOns1OTp7YzpbMjM1XX19LGM6WzIzNV19fX0sMTE0OntsOnsxMTE6e2w6ezU5OntjOls4MzY0XX19fX19fX0sMTIwOntsOns5OTp7bDp7MTA4OntsOns1OTp7YzpbMzNdfX19fX0sMTA1OntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6Wzg3MDddfX19fX19fSwxMTI6e2w6ezEwMTp7bDp7OTk6e2w6ezExNjp7bDp7OTc6e2w6ezExNjp7bDp7MTA1OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6Wzg0OTZdfX19fX19fX19fX19fX19fX0sMTExOntsOnsxMTA6e2w6ezEwMTp7bDp7MTEwOntsOnsxMTY6e2w6ezEwNTp7bDp7OTc6e2w6ezEwODp7bDp7MTAxOntsOns1OTp7YzpbODUxOV19fX19fX19fX19fX19fX19fX19fX19fX19LDEwMjp7bDp7OTc6e2w6ezEwODp7bDp7MTA4OntsOnsxMDU6e2w6ezExMDp7bDp7MTAzOntsOnsxMDA6e2w6ezExMTp7bDp7MTE2OntsOnsxMTU6e2w6ezEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc4Nl19fX19fX19fX19fX19fX19fX19fX19fX19LDk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDkyXX19fX19LDEwMTp7bDp7MTA5OntsOns5Nzp7bDp7MTA4OntsOnsxMDE6e2w6ezU5OntjOls5NzkyXX19fX19fX19fX19LDEwMjp7bDp7MTA1OntsOnsxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbNjQyNTldfX19fX19fX19LDEwODp7bDp7MTA1OntsOnsxMDM6e2w6ezU5OntjOls2NDI1Nl19fX19fSwxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbNjQyNjBdfX19fX19fX19LDExNDp7bDp7NTk6e2M6WzEyMDA5OV19fX19fSwxMDU6e2w6ezEwODp7bDp7MTA1OntsOnsxMDM6e2w6ezU5OntjOls2NDI1N119fX19fX19fX0sMTA2OntsOnsxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbMTAyLDEwNl19fX19fX19fX0sMTA4OntsOns5Nzp7bDp7MTE2OntsOns1OTp7YzpbOTgzN119fX19fSwxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbNjQyNThdfX19fX19fSwxMTY6e2w6ezExMDp7bDp7MTE1OntsOns1OTp7YzpbOTY0OV19fX19fX19fX0sMTEwOntsOnsxMTE6e2w6ezEwMjp7bDp7NTk6e2M6WzQwMl19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNTFdfX19fX0sMTE0OntsOns5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezU5OntjOls4NzA0XX19fX19fX0sMTA3OntsOns1OTp7YzpbODkxNl19LDExODp7bDp7NTk6e2M6WzEwOTY5XX19fX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezExNjp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzY1XX19fX19fX19fX19fX19fSwxMTQ6e2w6ezk3OntsOns5OTp7bDp7NDk6e2w6ezUwOntsOns1OTp7YzpbMTg5XX19LGM6WzE4OV19LDUxOntsOns1OTp7YzpbODUzMV19fX0sNTI6e2w6ezU5OntjOlsxODhdfX0sYzpbMTg4XX0sNTM6e2w6ezU5OntjOls4NTMzXX19fSw1NDp7bDp7NTk6e2M6Wzg1MzddfX19LDU2OntsOns1OTp7YzpbODUzOV19fX19fSw1MDp7bDp7NTE6e2w6ezU5OntjOls4NTMyXX19fSw1Mzp7bDp7NTk6e2M6Wzg1MzRdfX19fX0sNTE6e2w6ezUyOntsOns1OTp7YzpbMTkwXX19LGM6WzE5MF19LDUzOntsOns1OTp7YzpbODUzNV19fX0sNTY6e2w6ezU5OntjOls4NTQwXX19fX19LDUyOntsOns1Mzp7bDp7NTk6e2M6Wzg1MzZdfX19fX0sNTM6e2w6ezU0OntsOns1OTp7YzpbODUzOF19fX0sNTY6e2w6ezU5OntjOls4NTQxXX19fX19LDU1OntsOns1Njp7bDp7NTk6e2M6Wzg1NDJdfX19fX19fSwxMTU6e2w6ezEwODp7bDp7NTk6e2M6WzgyNjBdfX19fX19fSwxMTE6e2w6ezExOTp7bDp7MTEwOntsOns1OTp7YzpbODk5NF19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTE5OTk1XX19fX19fX19fSwxMDM6e2w6ezY5OntsOns1OTp7YzpbODgwN119LDEwODp7bDp7NTk6e2M6WzEwODkyXX19fX19LDk3OntsOns5OTp7bDp7MTE3OntsOnsxMTY6e2w6ezEwMTp7bDp7NTk6e2M6WzUwMV19fX19fX19fX0sMTA5OntsOnsxMDk6e2w6ezk3OntsOns1OTp7YzpbOTQ3XX0sMTAwOntsOns1OTp7YzpbOTg5XX19fX19fX19fSwxMTI6e2w6ezU5OntjOlsxMDg4Nl19fX19fSw5ODp7bDp7MTE0OntsOnsxMDE6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjg3XX19fX19fX19fX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOlsyODVdfX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDc1XX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlsyODldfX19fX19fSwxMDE6e2w6ezU5OntjOls4ODA1XX0sMTA4OntsOns1OTp7YzpbODkyM119fX0sMTEzOntsOns1OTp7YzpbODgwNV19LDExMzp7bDp7NTk6e2M6Wzg4MDddfX19LDExNTp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDg3OF19fX19fX19fX19fX19LDExNTp7bDp7NTk6e2M6WzEwODc4XX0sOTk6e2w6ezk5OntsOns1OTp7YzpbMTA5MjFdfX19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwODgwXX0sMTExOntsOns1OTp7YzpbMTA4ODJdfSwxMDg6e2w6ezU5OntjOlsxMDg4NF19fX19fX19fX19fSwxMDg6e2w6ezU5OntjOls4OTIzLDY1MDI0XX0sMTAxOntsOnsxMTU6e2w6ezU5OntjOlsxMDkwMF19fX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDEwMF19fX19fSwxMDM6e2w6ezU5OntjOls4ODExXX0sMTAzOntsOns1OTp7YzpbODkyMV19fX19fSwxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMDg6e2w6ezU5OntjOls4NTAzXX19fX19fX19fSwxMDY6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTA3XX19fX19fX0sMTA4OntsOns1OTp7YzpbODgyM119LDY5OntsOns1OTp7YzpbMTA4OThdfX19LDk3OntsOns1OTp7YzpbMTA5MTddfX19LDEwNjp7bDp7NTk6e2M6WzEwOTE2XX19fX19LDExMDp7bDp7Njk6e2w6ezU5OntjOls4ODA5XX19fSw5Nzp7bDp7MTEyOntsOns1OTp7YzpbMTA4OTBdfSwxMTI6e2w6ezExNDp7bDp7MTExOntsOnsxMjA6e2w6ezU5OntjOlsxMDg5MF19fX19fX19fX19fX19LDEwMTp7bDp7NTk6e2M6WzEwODg4XX0sMTEzOntsOns1OTp7YzpbMTA4ODhdfSwxMTM6e2w6ezU5OntjOls4ODA5XX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg5MzVdfX19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNTJdfX19fX19fSwxMTQ6e2w6ezk3OntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6Wzk2XX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOls4NDU4XX19fX19LDEwNTp7bDp7MTA5OntsOns1OTp7YzpbODgxOV19LDEwMTp7bDp7NTk6e2M6WzEwODk0XX19fSwxMDg6e2w6ezU5OntjOlsxMDg5Nl19fX19fX19fX0sMTE2OntsOns1OTp7YzpbNjJdfSw5OTp7bDp7OTk6e2w6ezU5OntjOlsxMDkxOV19fX0sMTA1OntsOnsxMTQ6e2w6ezU5OntjOlsxMDg3NF19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4OTE5XX19fX19fX0sMTA4OntsOns4MDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjQ1XX19fX19fX19fSwxMTM6e2w6ezExNzp7bDp7MTAxOntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6WzEwODc2XX19fX19fX19fX19LDExNDp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbMTA4ODZdfX19fX19fX19fX0sMTE0OntsOnsxMTQ6e2w6ezU5OntjOlsxMDYxNl19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4OTE5XX19fX19fX0sMTAxOntsOnsxMTM6e2w6ezEwODp7bDp7MTAxOntsOnsxMTU6e2w6ezExNTp7bDp7NTk6e2M6Wzg5MjNdfX19fX19fX19LDExMzp7bDp7MTA4OntsOnsxMDE6e2w6ezExNTp7bDp7MTE1OntsOns1OTp7YzpbMTA4OTJdfX19fX19fX19fX19fX19LDEwODp7bDp7MTAxOntsOnsxMTU6e2w6ezExNTp7bDp7NTk6e2M6Wzg4MjNdfX19fX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOls4ODE5XX19fX19fX19fX0sYzpbNjJdfSwxMTg6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTY6e2w6ezExMDp7bDp7MTAxOntsOnsxMTM6e2w6ezExMzp7bDp7NTk6e2M6Wzg4MDksNjUwMjRdfX19fX19fX19fX19fX19LDExMDp7bDp7Njk6e2w6ezU5OntjOls4ODA5LDY1MDI0XX19fX19fX19fSwxMDQ6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NjBdfX19fX19fSw5Nzp7bDp7MTA1OntsOnsxMTQ6e2w6ezExNTp7bDp7MTEyOntsOns1OTp7YzpbODIwMl19fX19fX19fX0sMTA4OntsOnsxMDI6e2w6ezU5OntjOlsxODldfX19fX0sMTA5OntsOnsxMDU6e2w6ezEwODp7bDp7MTE2OntsOns1OTp7YzpbODQ1OV19fX19fX19fX0sMTE0OntsOnsxMDA6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDk4XX19fX19fX0sMTE0OntsOns1OTp7YzpbODU5Nl19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTY4XX19fX19fX0sMTE5OntsOns1OTp7YzpbODYyMV19fX19fX19fX0sOTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4NDYzXX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzI5M119fX19fX19fX0sMTAxOntsOns5Nzp7bDp7MTE0OntsOnsxMTY6e2w6ezExNTp7bDp7NTk6e2M6Wzk4MjldfSwxMTc6e2w6ezEwNTp7bDp7MTE2OntsOns1OTp7YzpbOTgyOV19fX19fX19fX19fX19fX0sMTA4OntsOnsxMDg6e2w6ezEwNTp7bDp7MTEyOntsOns1OTp7YzpbODIzMF19fX19fX19fX0sMTE0OntsOns5OTp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls4ODg5XX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMTAxXX19fX19LDEwNzp7bDp7MTE1OntsOnsxMDE6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbMTA1MzNdfX19fX19fX19fX0sMTE5OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwNTM0XX19fX19fX19fX19fX19fSwxMTE6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg3MDNdfX19fX19fSwxMDk6e2w6ezExNjp7bDp7MTA0OntsOnsxMTY6e2w6ezU5OntjOls4NzYzXX19fX19fX19fSwxMTE6e2w6ezEwNzp7bDp7MTA4OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYxN119fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYxOF19fX19fX19fX19fX19fX19fX19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTUzXX19fX19LDExNDp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4MjEzXX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk5N119fX19fSwxMDg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg0NjNdfX19fX19fX19LDExNjp7bDp7MTE0OntsOnsxMTE6e2w6ezEwNzp7bDp7NTk6e2M6WzI5NV19fX19fX19fX19fSwxMjE6e2w6ezk4OntsOnsxMTc6e2w6ezEwODp7bDp7MTA4OntsOns1OTp7YzpbODI1OV19fX19fX19fX0sMTEyOntsOnsxMDQ6e2w6ezEwMTp7bDp7MTEwOntsOns1OTp7YzpbODIwOF19fX19fX19fX19fX19LDEwNTp7bDp7OTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMjM3XX19LGM6WzIzN119fX19fX19fX0sOTk6e2w6ezU5OntjOls4MjkxXX0sMTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMjM4XX19LGM6WzIzOF19fX19fSwxMjE6e2w6ezU5OntjOlsxMDgwXX19fX19LDEwMTp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwNzddfX19fX0sMTIwOntsOns5OTp7bDp7MTA4OntsOns1OTp7YzpbMTYxXX19LGM6WzE2MV19fX19fX19LDEwMjp7bDp7MTAyOntsOns1OTp7YzpbODY2MF19fX0sMTE0OntsOns1OTp7YzpbMTIwMTAyXX19fX19LDEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTE4OntsOnsxMDE6e2w6ezU5OntjOlsyMzZdfX0sYzpbMjM2XX19fX19fX19fSwxMDU6e2w6ezU5OntjOls4NTIwXX0sMTA1OntsOnsxMDU6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbMTA3NjRdfX19fX19fSwxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NDldfX19fX19fSwxMTA6e2w6ezEwMjp7bDp7MTA1OntsOnsxMTA6e2w6ezU5OntjOlsxMDcxNl19fX19fX19fX0sMTExOntsOnsxMTY6e2w6ezk3OntsOns1OTp7YzpbODQ4OV19fX19fX19fX0sMTA2OntsOnsxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbMzA3XX19fX19fX19fSwxMDk6e2w6ezk3OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMjk5XX19fX19LDEwMzp7bDp7MTAxOntsOns1OTp7YzpbODQ2NV19fX0sMTA4OntsOnsxMDU6e2w6ezExMDp7bDp7MTAxOntsOns1OTp7YzpbODQ2NF19fX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOnsxMTY6e2w6ezU5OntjOls4NDY1XX19fX19fX19fX19LDExNjp7bDp7MTA0OntsOns1OTp7YzpbMzA1XX19fX19fX0sMTExOntsOnsxMDI6e2w6ezU5OntjOls4ODg3XX19fX19LDExMjp7bDp7MTAxOntsOnsxMDA6e2w6ezU5OntjOls0MzddfX19fX19fX19LDExMDp7bDp7NTk6e2M6Wzg3MTJdfSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTAxOntsOns1OTp7YzpbODQ1M119fX19fX19fX0sMTAyOntsOnsxMDU6e2w6ezExMDp7bDp7NTk6e2M6Wzg3MzRdfSwxMTY6e2w6ezEwNTp7bDp7MTAxOntsOns1OTp7YzpbMTA3MTddfX19fX19fX19fX19fSwxMTE6e2w6ezEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlszMDVdfX19fX19fX19LDExNjp7bDp7NTk6e2M6Wzg3NDddfSw5OTp7bDp7OTc6e2w6ezEwODp7bDp7NTk6e2M6Wzg4OTBdfX19fX19fSwxMDE6e2w6ezEwMzp7bDp7MTAxOntsOnsxMTQ6e2w6ezExNTp7bDp7NTk6e2M6Wzg0ODRdfX19fX19fX19LDExNDp7bDp7OTk6e2w6ezk3OntsOnsxMDg6e2w6ezU5OntjOls4ODkwXX19fX19fX19fX19LDEwODp7bDp7OTc6e2w6ezExNDp7bDp7MTA0OntsOnsxMDc6e2w6ezU5OntjOlsxMDc3NV19fX19fX19fX19fSwxMTI6e2w6ezExNDp7bDp7MTExOntsOnsxMDA6e2w6ezU5OntjOlsxMDgxMl19fX19fX19fX19fX19LDExMTp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzExMDVdfX19fX0sMTAzOntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzMwM119fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTU0XX19fX19LDExNjp7bDp7OTc6e2w6ezU5OntjOls5NTNdfX19fX19fSwxMTI6e2w6ezExNDp7bDp7MTExOntsOnsxMDA6e2w6ezU5OntjOlsxMDgxMl19fX19fX19fX0sMTEzOntsOnsxMTc6e2w6ezEwMTp7bDp7MTE1OntsOnsxMTY6e2w6ezU5OntjOlsxOTFdfX0sYzpbMTkxXX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMTk5OThdfX19fX0sMTA1OntsOnsxMTA6e2w6ezU5OntjOls4NzEyXX0sNjk6e2w6ezU5OntjOls4OTUzXX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbODk0OV19fX19fX19LDExNTp7bDp7NTk6e2M6Wzg5NDhdfSwxMTg6e2w6ezU5OntjOls4OTQ3XX19fX19LDExODp7bDp7NTk6e2M6Wzg3MTJdfX19fX19fX19LDExNjp7bDp7NTk6e2M6WzgyOTBdfSwxMDU6e2w6ezEwODp7bDp7MTAwOntsOnsxMDE6e2w6ezU5OntjOlsyOTddfX19fX19fX19fX0sMTE3OntsOnsxMDc6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTEwXX19fX19fX0sMTA5OntsOnsxMDg6e2w6ezU5OntjOlsyMzldfX0sYzpbMjM5XX19fX19fX0sMTA2OntsOns5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezk5OntsOns1OTp7YzpbMzA5XX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA4MV19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDEwM119fX19fSwxMDk6e2w6ezk3OntsOnsxMTY6e2w6ezEwNDp7bDp7NTk6e2M6WzU2N119fX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE1NV19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzExOTk5OV19fX19fSwxMDE6e2w6ezExNDp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzExMTJdfX19fX19fX19fX0sMTE3OntsOnsxMDc6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTA4XX19fX19fX19fX19LDEwNzp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOns5Nzp7bDp7NTk6e2M6Wzk1NF19LDExODp7bDp7NTk6e2M6WzEwMDhdfX19fX19fX19fX0sOTk6e2w6ezEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzMxMV19fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA4Ml19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDEwNF19fX19fSwxMDM6e2w6ezExNDp7bDp7MTAxOntsOnsxMDE6e2w6ezExMDp7bDp7NTk6e2M6WzMxMl19fX19fX19fX19fSwxMDQ6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDkzXX19fX19fX0sMTA2OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTExNl19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNTZdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMDBdfX19fX19fX19LDEwODp7bDp7NjU6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NjZdfX19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NTZdfX19fX0sMTE2OntsOns5Nzp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsxMDUyM119fX19fX19fX19fSw2Njp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA1MTBdfX19fX19fX19LDY5OntsOns1OTp7YzpbODgwNl19LDEwMzp7bDp7NTk6e2M6WzEwODkxXX19fX19LDcyOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1OTRdfX19fX19fSw5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlszMTRdfX19fX19fX19LDEwMTp7bDp7MTA5OntsOnsxMTI6e2w6ezExNjp7bDp7MTIxOntsOnsxMTg6e2w6ezU5OntjOlsxMDY3Nl19fX19fX19fX19fX19LDEwMzp7bDp7MTE0OntsOns5Nzp7bDp7MTEwOntsOns1OTp7YzpbODQ2Nl19fX19fX19fX0sMTA5OntsOns5ODp7bDp7MTAwOntsOns5Nzp7bDp7NTk6e2M6Wzk1NV19fX19fX19fX0sMTEwOntsOnsxMDM6e2w6ezU5OntjOlsxMDIxNl19LDEwMDp7bDp7NTk6e2M6WzEwNjQxXX19fSwxMDg6e2w6ezEwMTp7bDp7NTk6e2M6WzEwMjE2XX19fX19fX19fSwxMTI6e2w6ezU5OntjOlsxMDg4NV19fX0sMTEzOntsOnsxMTc6e2w6ezExMTp7bDp7NTk6e2M6WzE3MV19fSxjOlsxNzFdfX19fX0sMTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NTkyXX0sOTg6e2w6ezU5OntjOls4Njc2XX0sMTAyOntsOnsxMTU6e2w6ezU5OntjOlsxMDUyN119fX19fX19LDEwMjp7bDp7MTE1OntsOns1OTp7YzpbMTA1MjVdfX19fX0sMTA0OntsOnsxMDc6e2w6ezU5OntjOls4NjE3XX19fX19LDEwODp7bDp7MTEyOntsOns1OTp7YzpbODYxOV19fX19fSwxMTI6e2w6ezEwODp7bDp7NTk6e2M6WzEwNTUzXX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOlsxMDYxMV19fX19fX19LDExNjp7bDp7MTA4OntsOns1OTp7YzpbODYxMF19fX19fX19fX0sMTE2OntsOns1OTp7YzpbMTA5MjNdfSw5Nzp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsxMDUyMV19fX19fX19LDEwMTp7bDp7NTk6e2M6WzEwOTI1XX0sMTE1OntsOns1OTp7YzpbMTA5MjUsNjUwMjRdfX19fX19fX19LDk4OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOlsxMDUwOF19fX19fX19LDk4OntsOnsxMTQ6e2w6ezEwNzp7bDp7NTk6e2M6WzEwMDk4XX19fX19fX0sMTE0OntsOns5Nzp7bDp7OTk6e2w6ezEwMTp7bDp7NTk6e2M6WzEyM119fX0sMTA3OntsOns1OTp7YzpbOTFdfX19fX19fSwxMDc6e2w6ezEwMTp7bDp7NTk6e2M6WzEwNjM1XX19fSwxMTU6e2w6ezEwODp7bDp7MTAwOntsOns1OTp7YzpbMTA2MzldfX19LDExNzp7bDp7NTk6e2M6WzEwNjM3XX19fX19fX19fX19fX0sOTk6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMzE4XX19fX19fX19fSwxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlszMTZdfX19fX19fSwxMDU6e2w6ezEwODp7bDp7NTk6e2M6Wzg5NjhdfX19fX19fSwxMTc6e2w6ezk4OntsOns1OTp7YzpbMTIzXX19fX19LDEyMTp7bDp7NTk6e2M6WzEwODNdfX19fX0sMTAwOntsOns5OTp7bDp7OTc6e2w6ezU5OntjOlsxMDU1MF19fX19fSwxMTM6e2w6ezExNzp7bDp7MTExOntsOns1OTp7YzpbODIyMF19LDExNDp7bDp7NTk6e2M6WzgyMjJdfX19fX19fX19LDExNDp7bDp7MTAwOntsOnsxMDQ6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU5OV19fX19fX19fX0sMTE3OntsOnsxMTU6e2w6ezEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTcxXX19fX19fX19fX19fX0sMTE1OntsOnsxMDQ6e2w6ezU5OntjOls4NjI2XX19fX19fX0sMTAxOntsOns1OTp7YzpbODgwNF19LDEwMjp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5Ml19LDExNjp7bDp7OTc6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbODYxMF19fX19fX19fX19fX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTEyOntsOnsxMTE6e2w6ezExMTp7bDp7MTEwOntsOnsxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezU5OntjOls4NjM3XX19fX19fX19fSwxMTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg2MzZdfX19fX19fX19fX19fX19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezExNTp7bDp7NTk6e2M6Wzg2NDddfX19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5Nl19LDExNTp7bDp7NTk6e2M6Wzg2NDZdfX19fX19fX19fX19fSwxMDQ6e2w6ezk3OntsOnsxMTQ6e2w6ezExMjp7bDp7MTExOntsOnsxMTE6e2w6ezExMDp7bDp7MTE1OntsOns1OTp7YzpbODY1MV19fX19fX19fX19fX19fX19fSwxMTU6e2w6ezExMzp7bDp7MTE3OntsOnsxMDU6e2w6ezEwMzp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2MjFdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTY6e2w6ezEwNDp7bDp7MTE0OntsOnsxMDE6e2w6ezEwMTp7bDp7MTE2OntsOnsxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls4OTA3XX19fX19fX19fX19fX19fX19fX19fX19fX0sMTAzOntsOns1OTp7YzpbODkyMl19fX0sMTEzOntsOns1OTp7YzpbODgwNF19LDExMzp7bDp7NTk6e2M6Wzg4MDZdfX19LDExNTp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDg3N119fX19fX19fX19fX19LDExNTp7bDp7NTk6e2M6WzEwODc3XX0sOTk6e2w6ezk5OntsOns1OTp7YzpbMTA5MjBdfX19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwODc5XX0sMTExOntsOns1OTp7YzpbMTA4ODFdfSwxMTQ6e2w6ezU5OntjOlsxMDg4M119fX19fX19fX19fSwxMDM6e2w6ezU5OntjOls4OTIyLDY1MDI0XX0sMTAxOntsOnsxMTU6e2w6ezU5OntjOlsxMDg5OV19fX19fX19LDExNTp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbMTA4ODVdfX19fX19fX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbODkxOF19fX19fX19LDEwMTp7bDp7MTEzOntsOnsxMDM6e2w6ezExNjp7bDp7MTE0OntsOns1OTp7YzpbODkyMl19fX19fX19LDExMzp7bDp7MTAzOntsOnsxMTY6e2w6ezExNDp7bDp7NTk6e2M6WzEwODkxXX19fX19fX19fX19fX0sMTAzOntsOnsxMTY6e2w6ezExNDp7bDp7NTk6e2M6Wzg4MjJdfX19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODgxOF19fX19fX19fX19fX19LDEwMjp7bDp7MTA1OntsOnsxMTU6e2w6ezEwNDp7bDp7MTE2OntsOns1OTp7YzpbMTA2MjBdfX19fX19fX19LDEwODp7bDp7MTExOntsOnsxMTE6e2w6ezExNDp7bDp7NTk6e2M6Wzg5NzBdfX19fX19fX19LDExNDp7bDp7NTk6e2M6WzEyMDEwNV19fX19fSwxMDM6e2w6ezU5OntjOls4ODIyXX0sNjk6e2w6ezU5OntjOlsxMDg5N119fX19fSwxMDQ6e2w6ezk3OntsOnsxMTQ6e2w6ezEwMDp7bDp7NTk6e2M6Wzg2MzddfX19LDExNzp7bDp7NTk6e2M6Wzg2MzZdfSwxMDg6e2w6ezU5OntjOlsxMDYwMl19fX19fX19fX0sOTg6e2w6ezEwODp7bDp7MTA3OntsOns1OTp7YzpbOTYwNF19fX19fX19fX0sMTA2OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTExM119fX19fX19LDEwODp7bDp7NTk6e2M6Wzg4MTBdfSw5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjQ3XX19fX19fX0sOTk6e2w6ezExMTp7bDp7MTE0OntsOnsxMTA6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbODk5MF19fX19fX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTAwOntsOns1OTp7YzpbMTA2MDNdfX19fX19fX19LDExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOls5NzIyXX19fX19fX19fSwxMDk6e2w6ezEwNTp7bDp7MTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzMyMF19fX19fX19fX0sMTExOntsOnsxMTc6e2w6ezExNTp7bDp7MTE2OntsOns1OTp7YzpbOTEzNl19LDk3OntsOns5OTp7bDp7MTA0OntsOnsxMDE6e2w6ezU5OntjOls5MTM2XX19fX19fX19fX19fX19fX19fX0sMTEwOntsOns2OTp7bDp7NTk6e2M6Wzg4MDhdfX19LDk3OntsOnsxMTI6e2w6ezU5OntjOlsxMDg4OV19LDExMjp7bDp7MTE0OntsOnsxMTE6e2w6ezEyMDp7bDp7NTk6e2M6WzEwODg5XX19fX19fX19fX19fX0sMTAxOntsOns1OTp7YzpbMTA4ODddfSwxMTM6e2w6ezU5OntjOlsxMDg4N119LDExMzp7bDp7NTk6e2M6Wzg4MDhdfX19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODkzNF19fX19fX19fX0sMTExOntsOns5Nzp7bDp7MTEwOntsOnsxMDM6e2w6ezU5OntjOlsxMDIyMF19fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg3MDFdfX19fX19fSw5ODp7bDp7MTE0OntsOnsxMDc6e2w6ezU5OntjOlsxMDIxNF19fX19fX19LDExMDp7bDp7MTAzOntsOnsxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDIyOV19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6WzEwMjMxXX19fX19fX19fX19fX19fX19fX19fX19fX19fX19LDEwOTp7bDp7OTc6e2w6ezExMjp7bDp7MTE1OntsOnsxMTY6e2w6ezExMTp7bDp7NTk6e2M6WzEwMjM2XX19fX19fX19fX19fX0sMTE0OntsOnsxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOlsxMDIzMF19fX19fX19fX19fX19fX19fX19fX19fX19LDExMTp7bDp7MTEyOntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOnsxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezU5OntjOls4NjE5XX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6Wzg2MjBdfX19fX19fX19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDYyOV19fX19fSwxMDI6e2w6ezU5OntjOlsxMjAxNTddfX19LDEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxMDc5N119fX19fX19fX0sMTE2OntsOnsxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOlsxMDgwNF19fX19fX19fX19fSwxMTk6e2w6ezk3OntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6Wzg3MjddfX19fX19fSw5ODp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzk1XX19fX19fX19fSwxMjI6e2w6ezU5OntjOls5Njc0XX0sMTAxOntsOnsxMTA6e2w6ezEwMzp7bDp7MTAxOntsOns1OTp7YzpbOTY3NF19fX19fX19fX0sMTAyOntsOns1OTp7YzpbMTA3MzFdfX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls0MF19LDEwODp7bDp7MTE2OntsOns1OTp7YzpbMTA2NDNdfX19fX19fX19fX0sMTE0OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjQ2XX19fX19fX0sOTk6e2w6ezExMTp7bDp7MTE0OntsOnsxMTA6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbODk5MV19fX19fX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NTFdfSwxMDA6e2w6ezU5OntjOlsxMDYwNV19fX19fX19fX0sMTA5OntsOns1OTp7YzpbODIwNl19fX0sMTE2OntsOnsxMTQ6e2w6ezEwNTp7bDp7NTk6e2M6Wzg4OTVdfX19fX19fX19LDExNTp7bDp7OTc6e2w6ezExMzp7bDp7MTE3OntsOnsxMTE6e2w6ezU5OntjOls4MjQ5XX19fX19fX19fSw5OTp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDAxXX19fX19LDEwNDp7bDp7NTk6e2M6Wzg2MjRdfX19LDEwNTp7bDp7MTA5OntsOns1OTp7YzpbODgxOF19LDEwMTp7bDp7NTk6e2M6WzEwODkzXX19fSwxMDM6e2w6ezU5OntjOlsxMDg5NV19fX19fX19LDExMzp7bDp7OTg6e2w6ezU5OntjOls5MV19fX0sMTE3OntsOnsxMTE6e2w6ezU5OntjOls4MjE2XX0sMTE0OntsOns1OTp7YzpbODIxOF19fX19fX19fX0sMTE2OntsOnsxMTQ6e2w6ezExMTp7bDp7MTA3OntsOns1OTp7YzpbMzIyXX19fX19fX19fX19LDExNjp7bDp7NTk6e2M6WzYwXX0sOTk6e2w6ezk5OntsOns1OTp7YzpbMTA5MThdfX19LDEwNTp7bDp7MTE0OntsOns1OTp7YzpbMTA4NzNdfX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbODkxOF19fX19fX19LDEwNDp7bDp7MTE0OntsOnsxMDE6e2w6ezEwMTp7bDp7NTk6e2M6Wzg5MDddfX19fX19fX19LDEwNTp7bDp7MTA5OntsOnsxMDE6e2w6ezExNTp7bDp7NTk6e2M6Wzg5MDVdfX19fX19fX19LDEwODp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA2MTRdfX19fX19fX19LDExMzp7bDp7MTE3OntsOnsxMDE6e2w6ezExNTp7bDp7MTE2OntsOns1OTp7YzpbMTA4NzVdfX19fX19fX19fX0sMTE0OntsOns4MDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjQ2XX19fX19fX0sMTA1OntsOns1OTp7YzpbOTY2N119LDEwMTp7bDp7NTk6e2M6Wzg4ODRdfX19LDEwMjp7bDp7NTk6e2M6Wzk2NjZdfX19fX19fX0sYzpbNjBdfSwxMTc6e2w6ezExNDp7bDp7MTAwOntsOnsxMTU6e2w6ezEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTcwXX19fX19fX19fX19LDExNzp7bDp7MTA0OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1OThdfX19fX19fX19fX19fSwxMTg6e2w6ezEwMTp7bDp7MTE0OntsOnsxMTY6e2w6ezExMDp7bDp7MTAxOntsOnsxMTM6e2w6ezExMzp7bDp7NTk6e2M6Wzg4MDgsNjUwMjRdfX19fX19fX19fX19fX19LDExMDp7bDp7Njk6e2w6ezU5OntjOls4ODA4LDY1MDI0XX19fX19fX19fSwxMDk6e2w6ezY4OntsOns2ODp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4NzYyXX19fX19fX19fSw5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzE3NV19fSxjOlsxNzVdfX19LDEwODp7bDp7MTAxOntsOns1OTp7YzpbOTc5NF19fX0sMTE2OntsOns1OTp7YzpbMTAwMTZdfSwxMDE6e2w6ezExNTp7bDp7MTAxOntsOns1OTp7YzpbMTAwMTZdfX19fX19fX19fX0sMTEyOntsOns1OTp7YzpbODYxNF19LDExNTp7bDp7MTE2OntsOnsxMTE6e2w6ezU5OntjOls4NjE0XX0sMTAwOntsOnsxMTE6e2w6ezExOTp7bDp7MTEwOntsOns1OTp7YzpbODYxNV19fX19fX19fX0sMTA4OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns1OTp7YzpbODYxMl19fX19fX19fX0sMTE3OntsOnsxMTI6e2w6ezU5OntjOls4NjEzXX19fX19fX19fX19fX0sMTE0OntsOnsxMDc6e2w6ezEwMTp7bDp7MTE0OntsOns1OTp7YzpbOTY0Nl19fX19fX19fX19fSw5OTp7bDp7MTExOntsOnsxMDk6e2w6ezEwOTp7bDp7OTc6e2w6ezU5OntjOlsxMDc5M119fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA4NF19fX19fSwxMDA6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6WzgyMTJdfX19fX19fX19LDEwMTp7bDp7OTc6e2w6ezExNTp7bDp7MTE3OntsOnsxMTQ6e2w6ezEwMTp7bDp7MTAwOntsOns5Nzp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOns1OTp7YzpbODczN119fX19fX19fX19fX19fX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMTA2XX19fX19LDEwNDp7bDp7MTExOntsOns1OTp7YzpbODQ4N119fX19fSwxMDU6e2w6ezk5OntsOnsxMTQ6e2w6ezExMTp7bDp7NTk6e2M6WzE4MV19fSxjOlsxODFdfX19fX0sMTAwOntsOns1OTp7YzpbODczOV19LDk3OntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6WzQyXX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns1OTp7YzpbMTA5OTJdfX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTgzXX19LGM6WzE4M119fX19fX19LDExMDp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4NzIyXX0sOTg6e2w6ezU5OntjOls4ODYzXX19fSwxMDA6e2w6ezU5OntjOls4NzYwXX0sMTE3OntsOns1OTp7YzpbMTA3OTRdfX19fX19fX19fX19fSwxMDg6e2w6ezk5OntsOnsxMTI6e2w6ezU5OntjOlsxMDk3MV19fX19fSwxMDA6e2w6ezExNDp7bDp7NTk6e2M6WzgyMzBdfX19fX19fSwxMTA6e2w6ezExMjp7bDp7MTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6Wzg3MjNdfX19fX19fX19fX0sMTExOntsOnsxMDA6e2w6ezEwMTp7bDp7MTA4OntsOnsxMTU6e2w6ezU5OntjOls4ODcxXX19fX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE1OF19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg3MjNdfX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDAwMl19fX19fSwxMTY6e2w6ezExMjp7bDp7MTExOntsOnsxMTU6e2w6ezU5OntjOls4NzY2XX19fX19fX19fX19LDExNzp7bDp7NTk6e2M6Wzk1Nl19LDEwODp7bDp7MTE2OntsOnsxMDU6e2w6ezEwOTp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg4ODhdfX19fX19fX19fX19fSwxMDk6e2w6ezk3OntsOnsxMTI6e2w6ezU5OntjOls4ODg4XX19fX19fX19fX19LDExMDp7bDp7NzE6e2w6ezEwMzp7bDp7NTk6e2M6Wzg5MjEsODI0XX19fSwxMTY6e2w6ezU5OntjOls4ODExLDg0MDJdfSwxMTg6e2w6ezU5OntjOls4ODExLDgyNF19fX19fX19LDc2OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODY1M119fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2NTRdfX19fX19fX19fX19fX19fX19fX19fX19fX19LDEwODp7bDp7NTk6e2M6Wzg5MjAsODI0XX19fSwxMTY6e2w6ezU5OntjOls4ODEwLDg0MDJdfSwxMTg6e2w6ezU5OntjOls4ODEwLDgyNF19fX19fX19LDgyOntsOnsxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjU1XX19fX19fX19fX19fX19fX19fX19fSw4Njp7bDp7Njg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NzldfX19fX19fX19LDEwMDp7bDp7OTc6e2w6ezExNTp7bDp7MTA0OntsOns1OTp7YzpbODg3OF19fX19fX19fX19fSw5Nzp7bDp7OTg6e2w6ezEwODp7bDp7OTc6e2w6ezU5OntjOls4NzExXX19fX19fX0sOTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlszMjRdfX19fX19fX19LDExMDp7bDp7MTAzOntsOns1OTp7YzpbODczNiw4NDAyXX19fX19LDExMjp7bDp7NTk6e2M6Wzg3NzddfSw2OTp7bDp7NTk6e2M6WzEwODY0LDgyNF19fX0sMTA1OntsOnsxMDA6e2w6ezU5OntjOls4Nzc5LDgyNF19fX19fSwxMTE6e2w6ezExNTp7bDp7NTk6e2M6WzMyOV19fX19fSwxMTI6e2w6ezExNDp7bDp7MTExOntsOnsxMjA6e2w6ezU5OntjOls4Nzc3XX19fX19fX19fX19LDExNjp7bDp7MTE3OntsOnsxMTQ6e2w6ezU5OntjOls5ODM4XX0sOTc6e2w6ezEwODp7bDp7NTk6e2M6Wzk4MzhdfSwxMTU6e2w6ezU5OntjOls4NDY5XX19fX19fX19fX19fX19fSw5ODp7bDp7MTE1OntsOnsxMTI6e2w6ezU5OntjOlsxNjBdfX0sYzpbMTYwXX19fSwxMTc6e2w6ezEwOTp7bDp7MTEyOntsOns1OTp7YzpbODc4Miw4MjRdfSwxMDE6e2w6ezU5OntjOls4NzgzLDgyNF19fX19fX19fX19fSw5OTp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwODE5XX19fSwxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMzI4XX19fX19fX19fSwxMDE6e2w6ezEwMDp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlszMjZdfX19fX19fX19LDExMTp7bDp7MTEwOntsOnsxMDM6e2w6ezU5OntjOls4Nzc1XX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwODYxLDgyNF19fX19fX19fX19fX19LDExNzp7bDp7MTEyOntsOns1OTp7YzpbMTA4MThdfX19fX0sMTIxOntsOns1OTp7YzpbMTA4NV19fX19fSwxMDA6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6WzgyMTFdfX19fX19fX19LDEwMTp7bDp7NTk6e2M6Wzg4MDBdfSw2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjYzXX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTA0OntsOnsxMDc6e2w6ezU5OntjOlsxMDUzMl19fX19fSwxMTQ6e2w6ezU5OntjOls4NTk5XX0sMTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk5XX19fX19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4Nzg0LDgyNF19fX19fX19LDExMzp7bDp7MTE3OntsOnsxMDU6e2w6ezExODp7bDp7NTk6e2M6Wzg4MDJdfX19fX19fX19LDExNTp7bDp7MTAxOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1MzZdfX19fX19fSwxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg3NzAsODI0XX19fX19fX0sMTIwOntsOnsxMDU6e2w6ezExNTp7bDp7MTE2OntsOns1OTp7YzpbODcwOF19LDExNTp7bDp7NTk6e2M6Wzg3MDhdfX19fX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDEwN119fX19fSwxMDM6e2w6ezY5OntsOns1OTp7YzpbODgwNyw4MjRdfX19LDEwMTp7bDp7NTk6e2M6Wzg4MTddfSwxMTM6e2w6ezU5OntjOls4ODE3XX0sMTEzOntsOns1OTp7YzpbODgwNyw4MjRdfX19LDExNTp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDg3OCw4MjRdfX19fX19fX19fX19fSwxMTU6e2w6ezU5OntjOlsxMDg3OCw4MjRdfX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg4MjFdfX19fX19fSwxMTY6e2w6ezU5OntjOls4ODE1XX0sMTE0OntsOns1OTp7YzpbODgxNV19fX19fX19LDEwNDp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY1NF19fX19fX19LDk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MjJdfX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDk5NF19fX19fX19fX0sMTA1OntsOns1OTp7YzpbODcxNV19LDExNTp7bDp7NTk6e2M6Wzg5NTZdfSwxMDA6e2w6ezU5OntjOls4OTU0XX19fX19LDExODp7bDp7NTk6e2M6Wzg3MTVdfX19fX0sMTA2OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTExNF19fX19fX19LDEwODp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY1M119fX19fX19LDY5OntsOns1OTp7YzpbODgwNiw4MjRdfX19LDk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2MDJdfX19fX19fSwxMDA6e2w6ezExNDp7bDp7NTk6e2M6WzgyMjldfX19fX0sMTAxOntsOns1OTp7YzpbODgxNl19LDEwMjp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYwMl19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOnsxMTE6e2w6ezExOTp7bDp7NTk6e2M6Wzg2MjJdfX19fX19fX19fX19fX19fX19fX19fX19fSwxMTM6e2w6ezU5OntjOls4ODE2XX0sMTEzOntsOns1OTp7YzpbODgwNiw4MjRdfX19LDExNTp7bDp7MTA4OntsOns5Nzp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDg3Nyw4MjRdfX19fX19fX19fX19fSwxMTU6e2w6ezU5OntjOlsxMDg3Nyw4MjRdfSwxMTU6e2w6ezU5OntjOls4ODE0XX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg4MjBdfX19fX19fSwxMTY6e2w6ezU5OntjOls4ODE0XX0sMTE0OntsOnsxMDU6e2w6ezU5OntjOls4OTM4XX0sMTAxOntsOns1OTp7YzpbODk0MF19fX19fX19fX19fSwxMDk6e2w6ezEwNTp7bDp7MTAwOntsOns1OTp7YzpbODc0MF19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNTldfX19fX0sMTE2OntsOns1OTp7YzpbMTcyXX0sMTA1OntsOnsxMTA6e2w6ezU5OntjOls4NzEzXX0sNjk6e2w6ezU5OntjOls4OTUzLDgyNF19fX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6Wzg5NDksODI0XX19fX19fX0sMTE4OntsOns5Nzp7bDp7NTk6e2M6Wzg3MTNdfX19LDk4OntsOns1OTp7YzpbODk1MV19fX0sOTk6e2w6ezU5OntjOls4OTUwXX19fX19fX19fSwxMTA6e2w6ezEwNTp7bDp7NTk6e2M6Wzg3MTZdfSwxMTg6e2w6ezk3OntsOns1OTp7YzpbODcxNl19fX0sOTg6e2w6ezU5OntjOls4OTU4XX19fSw5OTp7bDp7NTk6e2M6Wzg5NTddfX19fX19fX19fSxjOlsxNzJdfX19LDExMjp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzg3NDJdfSw5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezEwMTp7bDp7MTA4OntsOns1OTp7YzpbODc0Ml19fX19fX19fX19fSwxMTU6e2w6ezEwODp7bDp7NTk6e2M6WzExMDA1LDg0MjFdfX19fX0sMTE2OntsOns1OTp7YzpbODcwNiw4MjRdfX19fX19fSwxMTE6e2w6ezEwODp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzcyXX19fX19fX19fX19LDExNDp7bDp7NTk6e2M6Wzg4MzJdfSw5OTp7bDp7MTE3OntsOnsxMDE6e2w6ezU5OntjOls4OTI4XX19fX19fX0sMTAxOntsOns1OTp7YzpbMTA5MjcsODI0XX0sOTk6e2w6ezU5OntjOls4ODMyXX0sMTAxOntsOnsxMTM6e2w6ezU5OntjOlsxMDkyNyw4MjRdfX19fX19fX19fX19fSwxMTQ6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NTVdfX19fX19fSw5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjAzXX0sOTk6e2w6ezU5OntjOlsxMDU0Nyw4MjRdfX19LDExOTp7bDp7NTk6e2M6Wzg2MDUsODI0XX19fX19fX19fSwxMDU6e2w6ezEwMzp7bDp7MTA0OntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NjAzXX19fX19fX19fX19fX19fX19fX0sMTE2OntsOnsxMTQ6e2w6ezEwNTp7bDp7NTk6e2M6Wzg5MzldfSwxMDE6e2w6ezU5OntjOls4OTQxXX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezU5OntjOls4ODMzXX0sOTk6e2w6ezExNzp7bDp7MTAxOntsOns1OTp7YzpbODkyOV19fX19fX19LDEwMTp7bDp7NTk6e2M6WzEwOTI4LDgyNF19fX0sMTE0OntsOns1OTp7YzpbMTIwMDAzXX19fX19LDEwNDp7bDp7MTExOntsOnsxMTQ6e2w6ezExNjp7bDp7MTA5OntsOnsxMDU6e2w6ezEwMDp7bDp7NTk6e2M6Wzg3NDBdfX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezk3OntsOnsxMDg6e2w6ezEwODp7bDp7MTAxOntsOnsxMDg6e2w6ezU5OntjOls4NzQyXX19fX19fX19fX19fX19fX19fX19fX19fX0sMTA1OntsOnsxMDk6e2w6ezU5OntjOls4NzY5XX0sMTAxOntsOns1OTp7YzpbODc3Ml19LDExMzp7bDp7NTk6e2M6Wzg3NzJdfX19fX19fX19LDEwOTp7bDp7MTA1OntsOnsxMDA6e2w6ezU5OntjOls4NzQwXX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbODc0Ml19fX19fX19LDExMzp7bDp7MTE1OntsOnsxMTc6e2w6ezk4OntsOnsxMDE6e2w6ezU5OntjOls4OTMwXX19fX19LDExMjp7bDp7MTAxOntsOns1OTp7YzpbODkzMV19fX19fX19fX19fSwxMTc6e2w6ezk4OntsOns1OTp7YzpbODgzNl19LDY5OntsOns1OTp7YzpbMTA5NDksODI0XX19fSwxMDE6e2w6ezU5OntjOls4ODQwXX19fSwxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODgzNCw4NDAyXX0sMTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODQwXX0sMTEzOntsOns1OTp7YzpbMTA5NDksODI0XX19fX19fX19fX19fX19fSw5OTp7bDp7OTk6e2w6ezU5OntjOls4ODMzXX0sMTAxOntsOnsxMTM6e2w6ezU5OntjOlsxMDkyOCw4MjRdfX19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg4MzddfSw2OTp7bDp7NTk6e2M6WzEwOTUwLDgyNF19fX0sMTAxOntsOns1OTp7YzpbODg0MV19fX0sMTE1OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6Wzg4MzUsODQwMl19LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODg0MV19LDExMzp7bDp7NTk6e2M6WzEwOTUwLDgyNF19fX19fX19fX19fX19fX19fX19LDExNjp7bDp7MTAzOntsOnsxMDg6e2w6ezU5OntjOls4ODI1XX19fX19LDEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzI0MV19fSxjOlsyNDFdfX19fX19fSwxMDg6e2w6ezEwMzp7bDp7NTk6e2M6Wzg4MjRdfX19fX0sMTE0OntsOnsxMDU6e2w6ezk3OntsOnsxMTA6e2w6ezEwMzp7bDp7MTA4OntsOnsxMDE6e2w6ezEwODp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7NTk6e2M6Wzg5MzhdfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg5NDBdfX19fX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6Wzg5MzldfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg5NDFdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTc6e2w6ezU5OntjOls5NTddfSwxMDk6e2w6ezU5OntjOlszNV19LDEwMTp7bDp7MTE0OntsOnsxMTE6e2w6ezU5OntjOls4NDcwXX19fX19fX0sMTE1OntsOnsxMTI6e2w6ezU5OntjOls4MTk5XX19fX19fX19fSwxMTg6e2w6ezY4OntsOns5Nzp7bDp7MTE1OntsOnsxMDQ6e2w6ezU5OntjOls4ODc3XX19fX19fX19fSw3Mjp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA1MDBdfX19fX19fX19LDk3OntsOnsxMTI6e2w6ezU5OntjOls4NzgxLDg0MDJdfX19fX0sMTAwOntsOns5Nzp7bDp7MTE1OntsOnsxMDQ6e2w6ezU5OntjOls4ODc2XX19fX19fX19fSwxMDM6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4MDUsODQwMl19fX0sMTE2OntsOns1OTp7YzpbNjIsODQwMl19fX19fSwxMDU6e2w6ezExMDp7bDp7MTAyOntsOnsxMDU6e2w6ezExMDp7bDp7NTk6e2M6WzEwNzE4XX19fX19fX19fX19LDEwODp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA0OThdfX19fX19fSwxMDE6e2w6ezU5OntjOls4ODA0LDg0MDJdfX19LDExNjp7bDp7NTk6e2M6WzYwLDg0MDJdfSwxMTQ6e2w6ezEwNTp7bDp7MTAxOntsOns1OTp7YzpbODg4NCw4NDAyXX19fX19fX19fX19LDExNDp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA0OTldfX19fX19fSwxMTY6e2w6ezExNDp7bDp7MTA1OntsOnsxMDE6e2w6ezU5OntjOls4ODg1LDg0MDJdfX19fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg3NjQsODQwMl19fX19fX19fX0sMTE5OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjYyXX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTA0OntsOnsxMDc6e2w6ezU5OntjOlsxMDUzMV19fX19fSwxMTQ6e2w6ezU5OntjOls4NTk4XX0sMTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk4XX19fX19fX19fX19LDExMDp7bDp7MTAxOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1MzVdfX19fX19fX19fX19fSwxMTE6e2w6ezgzOntsOns1OTp7YzpbOTQxNl19fX0sOTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMjQzXX19LGM6WzI0M119fX19fX19LDExNTp7bDp7MTE2OntsOns1OTp7YzpbODg1OV19fX19fX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6Wzg4NThdfSw5OTp7bDp7NTk6e2M6WzI0NF19fSxjOlsyNDRdfX19fX0sMTIxOntsOns1OTp7YzpbMTA4Nl19fX19fSwxMDA6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NjFdfX19fX19fSw5ODp7bDp7MTA4OntsOns5Nzp7bDp7OTk6e2w6ezU5OntjOlszMzddfX19fX19fX19LDEwNTp7bDp7MTE4OntsOns1OTp7YzpbMTA4MDhdfX19fX0sMTExOntsOnsxMTY6e2w6ezU5OntjOls4ODU3XX19fX19LDExNTp7bDp7MTExOntsOnsxMDg6e2w6ezEwMDp7bDp7NTk6e2M6WzEwNjg0XX19fX19fX19fX19LDEwMTp7bDp7MTA4OntsOnsxMDU6e2w6ezEwMzp7bDp7NTk6e2M6WzMzOV19fX19fX19fX0sMTAyOntsOns5OTp7bDp7MTA1OntsOnsxMTQ6e2w6ezU5OntjOlsxMDY4N119fX19fX19LDExNDp7bDp7NTk6e2M6WzEyMDEwOF19fX19fSwxMDM6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbNzMxXX19fX19LDExNDp7bDp7OTc6e2w6ezExODp7bDp7MTAxOntsOns1OTp7YzpbMjQyXX19LGM6WzI0Ml19fX19fX19LDExNjp7bDp7NTk6e2M6WzEwNjg5XX19fX19LDEwNDp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDY3N119fX19fX19LDEwOTp7bDp7NTk6e2M6WzkzN119fX19fSwxMDU6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbODc1MF19fX19fX19LDEwODp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODYzNF19fX19fX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjg2XX19fX19LDExNDp7bDp7MTExOntsOnsxMTU6e2w6ezExNTp7bDp7NTk6e2M6WzEwNjgzXX19fX19fX19fX19LDEwNTp7bDp7MTEwOntsOnsxMDE6e2w6ezU5OntjOls4MjU0XX19fX19fX0sMTE2OntsOns1OTp7YzpbMTA2ODhdfX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzMzM119fX19fX19LDEwMTp7bDp7MTAzOntsOns5Nzp7bDp7NTk6e2M6Wzk2OV19fX19fX19LDEwNTp7bDp7OTk6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls5NTldfX19fX19fX19LDEwMDp7bDp7NTk6e2M6WzEwNjc4XX19fSwxMTA6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbODg1NF19fX19fX19fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTYwXX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA2NzldfX19fX0sMTAxOntsOnsxMTQ6e2w6ezExMjp7bDp7NTk6e2M6WzEwNjgxXX19fX19fX0sMTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6Wzg4NTNdfX19fX19fX19LDExNDp7bDp7NTk6e2M6Wzg3NDRdfSw5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjM1XX19fX19fX0sMTAwOntsOns1OTp7YzpbMTA4NDVdfSwxMDE6e2w6ezExNDp7bDp7NTk6e2M6Wzg1MDBdfSwxMTE6e2w6ezEwMjp7bDp7NTk6e2M6Wzg1MDBdfX19fX19fX19LDEwMjp7bDp7NTk6e2M6WzE3MF19fSxjOlsxNzBdfSwxMDk6e2w6ezU5OntjOlsxODZdfX0sYzpbMTg2XX19fSwxMDU6e2w6ezEwMzp7bDp7MTExOntsOnsxMDI6e2w6ezU5OntjOls4ODg2XX19fX19fX19fSwxMTE6e2w6ezExNDp7bDp7NTk6e2M6WzEwODM4XX19fX19LDExNTp7bDp7MTA4OntsOnsxMTE6e2w6ezExMjp7bDp7MTAxOntsOns1OTp7YzpbMTA4MzldfX19fX19fX19fX0sMTE4OntsOns1OTp7YzpbMTA4NDNdfX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbODUwMF19fX19fSwxMDg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6WzI0OF19fSxjOlsyNDhdfX19fX19fSwxMTE6e2w6ezEwODp7bDp7NTk6e2M6Wzg4NTZdfX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzI0NV19fSxjOlsyNDVdfX19fX0sMTA5OntsOnsxMDE6e2w6ezExNTp7bDp7NTk6e2M6Wzg4NTVdfSw5Nzp7bDp7MTE1OntsOns1OTp7YzpbMTA4MDZdfX19fX19fX19fX19fX19LDExNzp7bDp7MTA5OntsOnsxMDg6e2w6ezU5OntjOlsyNDZdfX0sYzpbMjQ2XX19fX19LDExODp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls5MDIxXX19fX19fX19fX19LDExMjp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6Wzg3NDFdfSw5Nzp7bDp7NTk6e2M6WzE4Ml19LDEwODp7bDp7MTA4OntsOnsxMDE6e2w6ezEwODp7bDp7NTk6e2M6Wzg3NDFdfX19fX19fX19fSxjOlsxODJdfSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbMTA5OTVdfX19fX0sMTA4OntsOns1OTp7YzpbMTEwMDVdfX19fX0sMTE2OntsOns1OTp7YzpbODcwNl19fX19fX19LDk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDg3XX19fX19LDEwMTp7bDp7MTE0OntsOns5OTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlszN119fX19fX19LDEwNTp7bDp7MTExOntsOnsxMDA6e2w6ezU5OntjOls0Nl19fX19fX19LDEwOTp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOls4MjQwXX19fX19fX0sMTEyOntsOns1OTp7YzpbODg2OV19fX0sMTE2OntsOnsxMDE6e2w6ezExMDp7bDp7MTA3OntsOns1OTp7YzpbODI0MV19fX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMTA5XX19fX19LDEwNDp7bDp7MTA1OntsOns1OTp7YzpbOTY2XX0sMTE4OntsOns1OTp7YzpbOTgxXX19fX19LDEwOTp7bDp7MTA5OntsOns5Nzp7bDp7MTE2OntsOns1OTp7YzpbODQ5OV19fX19fX19fX0sMTExOntsOnsxMTA6e2w6ezEwMTp7bDp7NTk6e2M6Wzk3NDJdfX19fX19fX19LDEwNTp7bDp7NTk6e2M6Wzk2MF19LDExNjp7bDp7OTk6e2w6ezEwNDp7bDp7MTAyOntsOnsxMTE6e2w6ezExNDp7bDp7MTA3OntsOns1OTp7YzpbODkxNl19fX19fX19fX19fX19fX0sMTE4OntsOns1OTp7YzpbOTgyXX19fX19LDEwODp7bDp7OTc6e2w6ezExMDp7bDp7OTk6e2w6ezEwNzp7bDp7NTk6e2M6Wzg0NjNdfSwxMDQ6e2w6ezU5OntjOls4NDYyXX19fX19fX0sMTA3OntsOnsxMTg6e2w6ezU5OntjOls4NDYzXX19fX19fX19fSwxMTc6e2w6ezExNTp7bDp7NTk6e2M6WzQzXX0sOTc6e2w6ezk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6WzEwNzg3XX19fX19fX19fSw5ODp7bDp7NTk6e2M6Wzg4NjJdfX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6WzEwNzg2XX19fX19fX0sMTAwOntsOnsxMTE6e2w6ezU5OntjOls4NzI0XX19fSwxMTc6e2w6ezU5OntjOlsxMDc4OV19fX19fSwxMDE6e2w6ezU5OntjOlsxMDg2Nl19fX0sMTA5OntsOnsxMTA6e2w6ezU5OntjOlsxNzddfX0sYzpbMTc3XX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbMTA3OTBdfX19fX19fSwxMTY6e2w6ezExOTp7bDp7MTExOntsOns1OTp7YzpbMTA3OTFdfX19fX19fX19fX19fSwxMDk6e2w6ezU5OntjOlsxNzddfX19LDExMTp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzczXX19fX19fX19fX19fX0sMTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNjFdfX19fX0sMTE3OntsOnsxMTA6e2w6ezEwMDp7bDp7NTk6e2M6WzE2M119fSxjOlsxNjNdfX19fX19fSwxMTQ6e2w6ezU5OntjOls4ODI2XX0sNjk6e2w6ezU5OntjOlsxMDkzMV19fX0sOTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwOTM1XX19fX19LDk5OntsOnsxMTc6e2w6ezEwMTp7bDp7NTk6e2M6Wzg4MjhdfX19fX19fSwxMDE6e2w6ezU5OntjOlsxMDkyN119LDk5OntsOns1OTp7YzpbODgyNl19LDk3OntsOnsxMTI6e2w6ezExMjp7bDp7MTE0OntsOnsxMTE6e2w6ezEyMDp7bDp7NTk6e2M6WzEwOTM1XX19fX19fX19fX19fX0sOTk6e2w6ezExNzp7bDp7MTE0OntsOnsxMDg6e2w6ezEyMTp7bDp7MTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODI4XX19fX19fX19fX19fX19fSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6WzEwOTI3XX19fX19LDExMDp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbMTA5MzddfX19fX19fX19fX19fSwxMDE6e2w6ezExMzp7bDp7MTEzOntsOns1OTp7YzpbMTA5MzNdfX19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODkzNl19fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg4MzBdfX19fX19fX19fX0sMTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7NTk6e2M6WzgyNDJdfSwxMTU6e2w6ezU5OntjOls4NDczXX19fX19fX19fSwxMTA6e2w6ezY5OntsOns1OTp7YzpbMTA5MzNdfX19LDk3OntsOnsxMTI6e2w6ezU5OntjOlsxMDkzN119fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODkzNl19fX19fX19fX0sMTExOntsOnsxMDA6e2w6ezU5OntjOls4NzE5XX19fSwxMDI6e2w6ezk3OntsOnsxMDg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls5MDA2XX19fX19fX19fSwxMDg6e2w6ezEwNTp7bDp7MTEwOntsOnsxMDE6e2w6ezU5OntjOls4OTc4XX19fX19fX19fSwxMTU6e2w6ezExNzp7bDp7MTE0OntsOnsxMDI6e2w6ezU5OntjOls4OTc5XX19fX19fX19fX19LDExMjp7bDp7NTk6e2M6Wzg3MzNdfSwxMTY6e2w6ezExMTp7bDp7NTk6e2M6Wzg3MzNdfX19fX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOls4ODMwXX19fX19fX0sMTE3OntsOnsxMTQ6e2w6ezEwMTp7bDp7MTA4OntsOns1OTp7YzpbODg4MF19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMDVdfX19fX0sMTA1OntsOns1OTp7YzpbOTY4XX19fX19LDExNzp7bDp7MTEwOntsOns5OTp7bDp7MTE1OntsOnsxMTI6e2w6ezU5OntjOls4MjAwXX19fX19fX19fX19fX0sMTEzOntsOnsxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExMF19fX19fSwxMDU6e2w6ezExMDp7bDp7MTE2OntsOns1OTp7YzpbMTA3NjRdfX19fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTYyXX19fX19fX0sMTEyOntsOnsxMTQ6e2w6ezEwNTp7bDp7MTA5OntsOnsxMDE6e2w6ezU5OntjOls4Mjc5XX19fX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDAwNl19fX19fX19LDExNzp7bDp7OTc6e2w6ezExNjp7bDp7MTAxOntsOnsxMTQ6e2w6ezExMDp7bDp7MTA1OntsOnsxMTE6e2w6ezExMDp7bDp7MTE1OntsOns1OTp7YzpbODQ2MV19fX19fX19fX19fX19fX0sMTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzc0XX19fX19fX19fX19LDEwMTp7bDp7MTE1OntsOnsxMTY6e2w6ezU5OntjOls2M119LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc5OV19fX19fX19fX19fSwxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzM0XX19LGM6WzM0XX19fX19fX0sMTE0OntsOns2NTp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY2N119fX19fX19LDExNDp7bDp7MTE0OntsOns1OTp7YzpbODY1OF19fX19fSwxMTY6e2w6ezk3OntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzEwNTI0XX19fX19fX19fX19LDY2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOlsxMDUxMV19fX19fX19fX0sNzI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMDU5Nl19fX19fX19LDk3OntsOns5OTp7bDp7MTAxOntsOns1OTp7YzpbODc2NSw4MTddfX19LDExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlszNDFdfX19fX19fX19LDEwMDp7bDp7MTA1OntsOns5OTp7bDp7NTk6e2M6Wzg3MzBdfX19fX19fSwxMDE6e2w6ezEwOTp7bDp7MTEyOntsOnsxMTY6e2w6ezEyMTp7bDp7MTE4OntsOns1OTp7YzpbMTA2NzVdfX19fX19fX19fX19fSwxMTA6e2w6ezEwMzp7bDp7NTk6e2M6WzEwMjE3XX0sMTAwOntsOns1OTp7YzpbMTA2NDJdfX19LDEwMTp7bDp7NTk6e2M6WzEwNjYxXX19fSwxMDg6e2w6ezEwMTp7bDp7NTk6e2M6WzEwMjE3XX19fX19fX19fSwxMTM6e2w6ezExNzp7bDp7MTExOntsOns1OTp7YzpbMTg3XX19LGM6WzE4N119fX19fSwxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg1OTRdfSw5Nzp7bDp7MTEyOntsOns1OTp7YzpbMTA2MTNdfX19fX0sOTg6e2w6ezU5OntjOls4Njc3XX0sMTAyOntsOnsxMTU6e2w6ezU5OntjOlsxMDUyOF19fX19fX19LDk5OntsOns1OTp7YzpbMTA1NDddfX19LDEwMjp7bDp7MTE1OntsOns1OTp7YzpbMTA1MjZdfX19fX0sMTA0OntsOnsxMDc6e2w6ezU5OntjOls4NjE4XX19fX19LDEwODp7bDp7MTEyOntsOns1OTp7YzpbODYyMF19fX19fSwxMTI6e2w6ezEwODp7bDp7NTk6e2M6WzEwNTY1XX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOlsxMDYxMl19fX19fX19LDExNjp7bDp7MTA4OntsOns1OTp7YzpbODYxMV19fX19fSwxMTk6e2w6ezU5OntjOls4NjA1XX19fX19fX0sMTE2OntsOns5Nzp7bDp7MTA1OntsOnsxMDg6e2w6ezU5OntjOlsxMDUyMl19fX19fX19LDEwNTp7bDp7MTExOntsOns1OTp7YzpbODc1OF19LDExMDp7bDp7OTc6e2w6ezEwODp7bDp7MTE1OntsOns1OTp7YzpbODQ3NF19fX19fX19fX19fX19fX19fSw5ODp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA1MDldfX19fX19fSw5ODp7bDp7MTE0OntsOnsxMDc6e2w6ezU5OntjOlsxMDA5OV19fX19fX19LDExNDp7bDp7OTc6e2w6ezk5OntsOnsxMDE6e2w6ezU5OntjOlsxMjVdfX19LDEwNzp7bDp7NTk6e2M6WzkzXX19fX19fX0sMTA3OntsOnsxMDE6e2w6ezU5OntjOlsxMDYzNl19fX0sMTE1OntsOnsxMDg6e2w6ezEwMDp7bDp7NTk6e2M6WzEwNjM4XX19fSwxMTc6e2w6ezU5OntjOlsxMDY0MF19fX19fX19fX19fX19LDk5OntsOns5Nzp7bDp7MTE0OntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzM0NV19fX19fX19fX0sMTAxOntsOnsxMDA6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbMzQzXX19fX19fX0sMTA1OntsOnsxMDg6e2w6ezU5OntjOls4OTY5XX19fX19fX0sMTE3OntsOns5ODp7bDp7NTk6e2M6WzEyNV19fX19fSwxMjE6e2w6ezU5OntjOlsxMDg4XX19fX19LDEwMDp7bDp7OTk6e2w6ezk3OntsOns1OTp7YzpbMTA1NTFdfX19fX0sMTA4OntsOnsxMDA6e2w6ezEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjAxXX19fX19fX19fX19LDExMzp7bDp7MTE3OntsOnsxMTE6e2w6ezU5OntjOls4MjIxXX0sMTE0OntsOns1OTp7YzpbODIyMV19fX19fX19fX0sMTE1OntsOnsxMDQ6e2w6ezU5OntjOls4NjI3XX19fX19fX0sMTAxOntsOns5Nzp7bDp7MTA4OntsOns1OTp7YzpbODQ3Nl19LDEwNTp7bDp7MTEwOntsOnsxMDE6e2w6ezU5OntjOls4NDc1XX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOnsxMTY6e2w6ezU5OntjOls4NDc2XX19fX19fX19fSwxMTU6e2w6ezU5OntjOls4NDc3XX19fX19fX0sOTk6e2w6ezExNjp7bDp7NTk6e2M6Wzk2NDVdfX19fX0sMTAzOntsOns1OTp7YzpbMTc0XX19LGM6WzE3NF19fX0sMTAyOntsOnsxMDU6e2w6ezExNTp7bDp7MTA0OntsOnsxMTY6e2w6ezU5OntjOlsxMDYyMV19fX19fX19fX0sMTA4OntsOnsxMTE6e2w6ezExMTp7bDp7MTE0OntsOns1OTp7YzpbODk3MV19fX19fX19fX0sMTE0OntsOns1OTp7YzpbMTIwMTExXX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTAwOntsOns1OTp7YzpbODY0MV19fX0sMTE3OntsOns1OTp7YzpbODY0MF19LDEwODp7bDp7NTk6e2M6WzEwNjA0XX19fX19fX19fSwxMTE6e2w6ezU5OntjOls5NjFdfSwxMTg6e2w6ezU5OntjOlsxMDA5XX19fX19fX0sMTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5NF19LDExNjp7bDp7OTc6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbODYxMV19fX19fX19fX19fX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTEyOntsOnsxMTE6e2w6ezExMTp7bDp7MTEwOntsOnsxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezU5OntjOls4NjQxXX19fX19fX19fSwxMTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg2NDBdfX19fX19fX19fX19fX19fX19fSwxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezExNTp7bDp7NTk6e2M6Wzg2NDRdfX19fX19fX19fX19fSwxMDQ6e2w6ezk3OntsOnsxMTQ6e2w6ezExMjp7bDp7MTExOntsOnsxMTE6e2w6ezExMDp7bDp7MTE1OntsOns1OTp7YzpbODY1Ml19fX19fX19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOnsxMTU6e2w6ezU5OntjOls4NjQ5XX19fX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTEzOntsOnsxMTc6e2w6ezEwNTp7bDp7MTAzOntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYwNV19fX19fX19fX19fX19fX19fX19fX0sMTE2OntsOnsxMDQ6e2w6ezExNDp7bDp7MTAxOntsOnsxMDE6e2w6ezExNjp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbODkwOF19fX19fX19fX19fX19fX19fX19fX19fX19fX0sMTEwOntsOnsxMDM6e2w6ezU5OntjOls3MzBdfX19fX0sMTE1OntsOnsxMDU6e2w6ezExMDp7bDp7MTAzOntsOnsxMDA6e2w6ezExMTp7bDp7MTE2OntsOnsxMTU6e2w6ezEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc4N119fX19fX19fX19fX19fX19fX19fX19fSwxMDg6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NDRdfX19fX19fSwxMDQ6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls4NjUyXX19fX19fX0sMTA5OntsOns1OTp7YzpbODIwN119fX19fSwxMDk6e2w6ezExMTp7bDp7MTE3OntsOnsxMTU6e2w6ezExNjp7bDp7NTk6e2M6WzkxMzddfSw5Nzp7bDp7OTk6e2w6ezEwNDp7bDp7MTAxOntsOns1OTp7YzpbOTEzN119fX19fX19fX19fX19fX19fX19LDExMDp7bDp7MTA5OntsOnsxMDU6e2w6ezEwMDp7bDp7NTk6e2M6WzEwOTkwXX19fX19fX19fSwxMTE6e2w6ezk3OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6WzEwMjIxXX19fX19LDExNDp7bDp7MTE0OntsOns1OTp7YzpbODcwMl19fX19fX19LDk4OntsOnsxMTQ6e2w6ezEwNzp7bDp7NTk6e2M6WzEwMjE1XX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA2MzBdfX19fX0sMTAyOntsOns1OTp7YzpbMTIwMTYzXX19fSwxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbMTA3OThdfX19fX19fX19LDExNjp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7MTE1OntsOns1OTp7YzpbMTA4MDVdfX19fX19fX19fX19fSwxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls0MV19LDEwMzp7bDp7MTE2OntsOns1OTp7YzpbMTA2NDRdfX19fX19fX19LDExMjp7bDp7MTExOntsOnsxMDg6e2w6ezEwNTp7bDp7MTEwOntsOnsxMTY6e2w6ezU5OntjOlsxMDc3MF19fX19fX19fX19fX19fX0sMTE0OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjQ5XX19fX19fX19fSwxMTU6e2w6ezk3OntsOnsxMTM6e2w6ezExNzp7bDp7MTExOntsOns1OTp7YzpbODI1MF19fX19fX19fX0sOTk6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDAwN119fX19fSwxMDQ6e2w6ezU5OntjOls4NjI1XX19fSwxMTM6e2w6ezk4OntsOns1OTp7YzpbOTNdfX19LDExNzp7bDp7MTExOntsOns1OTp7YzpbODIxN119LDExNDp7bDp7NTk6e2M6WzgyMTddfX19fX19fX19fX0sMTE2OntsOnsxMDQ6e2w6ezExNDp7bDp7MTAxOntsOnsxMDE6e2w6ezU5OntjOls4OTA4XX19fX19fX19fSwxMDU6e2w6ezEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls4OTA2XX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7NTk6e2M6Wzk2NTddfSwxMDE6e2w6ezU5OntjOls4ODg1XX19fSwxMDI6e2w6ezU5OntjOls5NjU2XX19fSwxMDg6e2w6ezExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOlsxMDcwMl19fX19fX19fX19fX19fX0sMTE3OntsOnsxMDg6e2w6ezExNzp7bDp7MTA0OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA2MDBdfX19fX19fX19fX19fSwxMjA6e2w6ezU5OntjOls4NDc4XX19fX19LDExNTp7bDp7OTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMzQ3XX19fX19fX19fX19LDk4OntsOnsxMTM6e2w6ezExNzp7bDp7MTExOntsOns1OTp7YzpbODIxOF19fX19fX19fX0sOTk6e2w6ezU5OntjOls4ODI3XX0sNjk6e2w6ezU5OntjOlsxMDkzMl19fX0sOTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwOTM2XX19fSwxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMzUzXX19fX19fX19fSw5OTp7bDp7MTE3OntsOnsxMDE6e2w6ezU5OntjOls4ODI5XX19fX19fX0sMTAxOntsOns1OTp7YzpbMTA5MjhdfSwxMDA6e2w6ezEwNTp7bDp7MTA4OntsOns1OTp7YzpbMzUxXX19fX19fX19fSwxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOlszNDldfX19fX19fSwxMTA6e2w6ezY5OntsOns1OTp7YzpbMTA5MzRdfX19LDk3OntsOnsxMTI6e2w6ezU5OntjOlsxMDkzOF19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODkzN119fX19fX19fX0sMTEyOntsOnsxMTE6e2w6ezEwODp7bDp7MTA1OntsOnsxMTA6e2w6ezExNjp7bDp7NTk6e2M6WzEwNzcxXX19fX19fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg4MzFdfX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDg5XX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4OTAxXX0sOTg6e2w6ezU5OntjOls4ODY1XX19fSwxMDE6e2w6ezU5OntjOlsxMDg1NF19fX19fX19fX0sMTAxOntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjY0XX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTA0OntsOnsxMDc6e2w6ezU5OntjOlsxMDUzM119fX19fSwxMTQ6e2w6ezU5OntjOls4NjAwXX0sMTExOntsOnsxMTk6e2w6ezU5OntjOls4NjAwXX19fX19fX19fX19LDk5OntsOnsxMTY6e2w6ezU5OntjOlsxNjddfX0sYzpbMTY3XX19fSwxMDk6e2w6ezEwNTp7bDp7NTk6e2M6WzU5XX19fX19LDExNTp7bDp7MTE5OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1MzddfX19fX19fX19LDExNjp7bDp7MTA5OntsOnsxMDU6e2w6ezExMDp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4NzI2XX19fX19fX19fSwxMTA6e2w6ezU5OntjOls4NzI2XX19fX19fX0sMTIwOntsOnsxMTY6e2w6ezU5OntjOlsxMDAzOF19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMTEyXX0sMTExOntsOnsxMTk6e2w6ezExMDp7bDp7NTk6e2M6Wzg5OTRdfX19fX19fX19fX0sMTA0OntsOns5Nzp7bDp7MTE0OntsOnsxMTI6e2w6ezU5OntjOls5ODM5XX19fX19fX0sOTk6e2w6ezEwNDp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzEwOTddfX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDk2XX19fX19LDExMTp7bDp7MTE0OntsOnsxMTY6e2w6ezEwOTp7bDp7MTA1OntsOnsxMDA6e2w6ezU5OntjOls4NzM5XX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOns5Nzp7bDp7MTA4OntsOnsxMDg6e2w6ezEwMTp7bDp7MTA4OntsOns1OTp7YzpbODc0MV19fX19fX19fX19fX19fX19fX19fX19fSwxMjE6e2w6ezU5OntjOlsxNzNdfX0sYzpbMTczXX19fSwxMDU6e2w6ezEwMzp7bDp7MTA5OntsOns5Nzp7bDp7NTk6e2M6Wzk2M119LDEwMjp7bDp7NTk6e2M6Wzk2Ml19fX0sMTE4OntsOns1OTp7YzpbOTYyXX19fX19fX19fSwxMDk6e2w6ezU5OntjOls4NzY0XX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwODU4XX19fX19fX0sMTAxOntsOns1OTp7YzpbODc3MV19LDExMzp7bDp7NTk6e2M6Wzg3NzFdfX19fX0sMTAzOntsOns1OTp7YzpbMTA5MTBdfSw2OTp7bDp7NTk6e2M6WzEwOTEyXX19fX19LDEwODp7bDp7NTk6e2M6WzEwOTA5XX0sNjk6e2w6ezU5OntjOlsxMDkxMV19fX19fSwxMTA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg3NzRdfX19fX0sMTEyOntsOnsxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbMTA3ODhdfX19fX19fX19LDExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTA2MTBdfX19fX19fX19fX19fSwxMDg6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg1OTJdfX19fX19fX19LDEwOTp7bDp7OTc6e2w6ezEwODp7bDp7MTA4OntsOnsxMTU6e2w6ezEwMTp7bDp7MTE2OntsOnsxMDk6e2w6ezEwNTp7bDp7MTEwOntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6Wzg3MjZdfX19fX19fX19fX19fX19fX19fX19LDExNTp7bDp7MTA0OntsOnsxMTI6e2w6ezU5OntjOlsxMDgwM119fX19fX19fX0sMTAxOntsOnsxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezExNTp7bDp7MTA4OntsOns1OTp7YzpbMTA3MjRdfX19fX19fX19fX19fSwxMDU6e2w6ezEwMDp7bDp7NTk6e2M6Wzg3MzldfX19LDEwODp7bDp7MTAxOntsOns1OTp7YzpbODk5NV19fX19fX19LDExNjp7bDp7NTk6e2M6WzEwOTIyXX0sMTAxOntsOns1OTp7YzpbMTA5MjRdfSwxMTU6e2w6ezU5OntjOlsxMDkyNCw2NTAyNF19fX19fX19fX0sMTExOntsOnsxMDI6e2w6ezExNjp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzExMDBdfX19fX19fX19LDEwODp7bDp7NTk6e2M6WzQ3XX0sOTg6e2w6ezU5OntjOlsxMDY5Ml19LDk3OntsOnsxMTQ6e2w6ezU5OntjOls5MDIzXX19fX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE2NF19fX19fX19LDExMjp7bDp7OTc6e2w6ezEwMDp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOls5ODI0XX0sMTE3OntsOnsxMDU6e2w6ezExNjp7bDp7NTk6e2M6Wzk4MjRdfX19fX19fX19fX19fSwxMTQ6e2w6ezU5OntjOls4NzQxXX19fX19fX0sMTEzOntsOns5OTp7bDp7OTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg4NTFdfSwxMTU6e2w6ezU5OntjOls4ODUxLDY1MDI0XX19fX19fX0sMTE3OntsOnsxMTI6e2w6ezU5OntjOls4ODUyXX0sMTE1OntsOns1OTp7YzpbODg1Miw2NTAyNF19fX19fX19fX0sMTE1OntsOnsxMTc6e2w6ezk4OntsOns1OTp7YzpbODg0N119LDEwMTp7bDp7NTk6e2M6Wzg4NDldfX19LDExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOls4ODQ3XX0sMTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODQ5XX19fX19fX19fX19fX0sMTEyOntsOns1OTp7YzpbODg0OF19LDEwMTp7bDp7NTk6e2M6Wzg4NTBdfX19LDExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezU5OntjOls4ODQ4XX0sMTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODUwXX19fX19fX19fX19fX19fX19LDExNzp7bDp7NTk6e2M6Wzk2MzNdfSw5Nzp7bDp7MTE0OntsOnsxMDE6e2w6ezU5OntjOls5NjMzXX19fSwxMDI6e2w6ezU5OntjOls5NjQyXX19fX19fX0sMTAyOntsOns1OTp7YzpbOTY0Ml19fX19fX19LDExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODU5NF19fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDA4XX19fX19LDEwMTp7bDp7MTE2OntsOnsxMDk6e2w6ezExMDp7bDp7NTk6e2M6Wzg3MjZdfX19fX19fX19LDEwOTp7bDp7MTA1OntsOnsxMDg6e2w6ezEwMTp7bDp7NTk6e2M6Wzg5OTVdfX19fX19fX19LDExNjp7bDp7OTc6e2w6ezExNDp7bDp7MTAyOntsOns1OTp7YzpbODkwMl19fX19fX19fX19fSwxMTY6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOls5NzM0XX0sMTAyOntsOns1OTp7YzpbOTczM119fX19fX19LDExNDp7bDp7OTc6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7MTAxOntsOnsxMTI6e2w6ezExNTp7bDp7MTA1OntsOnsxMDg6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMTAxM119fX19fX19fX19fX19fX0sMTEyOntsOnsxMDQ6e2w6ezEwNTp7bDp7NTk6e2M6Wzk4MV19fX19fX19fX19fX19fX19fSwxMTA6e2w6ezExNTp7bDp7NTk6e2M6WzE3NV19fX19fX19fX0sMTE3OntsOns5ODp7bDp7NTk6e2M6Wzg4MzRdfSw2OTp7bDp7NTk6e2M6WzEwOTQ5XX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA5NDFdfX19fX19fSwxMDE6e2w6ezU5OntjOls4ODM4XX0sMTAwOntsOnsxMTE6e2w6ezExNjp7bDp7NTk6e2M6WzEwOTQ3XX19fX19fX19fSwxMDk6e2w6ezExNzp7bDp7MTA4OntsOnsxMTY6e2w6ezU5OntjOlsxMDk0NV19fX19fX19fX0sMTEwOntsOns2OTp7bDp7NTk6e2M6WzEwOTU1XX19fSwxMDE6e2w6ezU5OntjOls4ODQyXX19fX19LDExMjp7bDp7MTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6WzEwOTQzXX19fX19fX19fSwxMTQ6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjE3XX19fX19fX19fSwxMTU6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODgzNF19LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODgzOF19LDExMzp7bDp7NTk6e2M6WzEwOTQ5XX19fX19fX0sMTEwOntsOnsxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg4NDJdfSwxMTM6e2w6ezU5OntjOlsxMDk1NV19fX19fX19fX19fX19LDEwNTp7bDp7MTA5OntsOns1OTp7YzpbMTA5NTFdfX19fX0sMTE3OntsOns5ODp7bDp7NTk6e2M6WzEwOTY1XX19fSwxMTI6e2w6ezU5OntjOlsxMDk2M119fX19fX19fX0sOTk6e2w6ezk5OntsOns1OTp7YzpbODgyN119LDk3OntsOnsxMTI6e2w6ezExMjp7bDp7MTE0OntsOnsxMTE6e2w6ezEyMDp7bDp7NTk6e2M6WzEwOTM2XX19fX19fX19fX19fX0sOTk6e2w6ezExNzp7bDp7MTE0OntsOnsxMDg6e2w6ezEyMTp7bDp7MTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODI5XX19fX19fX19fX19fX19fSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6WzEwOTI4XX19fX19LDExMDp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbMTA5MzhdfX19fX19fX19fX19fSwxMDE6e2w6ezExMzp7bDp7MTEzOntsOns1OTp7YzpbMTA5MzRdfX19fX19fSwxMTU6e2w6ezEwNTp7bDp7MTA5OntsOns1OTp7YzpbODkzN119fX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwOTp7bDp7NTk6e2M6Wzg4MzFdfX19fX19fX19fX0sMTA5OntsOns1OTp7YzpbODcyMV19fX0sMTEwOntsOnsxMDM6e2w6ezU5OntjOls5ODM0XX19fX19LDExMjp7bDp7NDk6e2w6ezU5OntjOlsxODVdfX0sYzpbMTg1XX0sNTA6e2w6ezU5OntjOlsxNzhdfX0sYzpbMTc4XX0sNTE6e2w6ezU5OntjOlsxNzldfX0sYzpbMTc5XX0sNTk6e2M6Wzg4MzVdfSw2OTp7bDp7NTk6e2M6WzEwOTUwXX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA5NDJdfX19fX0sMTE1OntsOnsxMTc6e2w6ezk4OntsOns1OTp7YzpbMTA5NjhdfX19fX19fX19LDEwMTp7bDp7NTk6e2M6Wzg4MzldfSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA5NDhdfX19fX19fX19LDEwNDp7bDp7MTE1OntsOnsxMTE6e2w6ezEwODp7bDp7NTk6e2M6WzEwMTg1XX19fX19LDExNzp7bDp7OTg6e2w6ezU5OntjOlsxMDk2N119fX19fX19fX0sMTA4OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOlsxMDYxOV19fX19fX19fX0sMTA5OntsOnsxMTc6e2w6ezEwODp7bDp7MTE2OntsOns1OTp7YzpbMTA5NDZdfX19fX19fX19LDExMDp7bDp7Njk6e2w6ezU5OntjOlsxMDk1Nl19fX0sMTAxOntsOns1OTp7YzpbODg0M119fX19fSwxMTI6e2w6ezEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxMDk0NF19fX19fX19fX0sMTE1OntsOnsxMDE6e2w6ezExNjp7bDp7NTk6e2M6Wzg4MzVdfSwxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg4MzldfSwxMTM6e2w6ezU5OntjOlsxMDk1MF19fX19fX19LDExMDp7bDp7MTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODQzXX0sMTEzOntsOns1OTp7YzpbMTA5NTZdfX19fX19fX19fX19fSwxMDU6e2w6ezEwOTp7bDp7NTk6e2M6WzEwOTUyXX19fX19LDExNzp7bDp7OTg6e2w6ezU5OntjOlsxMDk2NF19fX0sMTEyOntsOns1OTp7YzpbMTA5NjZdfX19fX19fX19fX0sMTE5OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOls4NjY1XX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTA0OntsOnsxMDc6e2w6ezU5OntjOlsxMDUzNF19fX19fSwxMTQ6e2w6ezU5OntjOls4NjAxXX0sMTExOntsOnsxMTk6e2w6ezU5OntjOls4NjAxXX19fX19fX19fX19LDExMDp7bDp7MTE5OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA1MzhdfX19fX19fX19fX0sMTIyOntsOnsxMDg6e2w6ezEwNTp7bDp7MTAzOntsOns1OTp7YzpbMjIzXX19LGM6WzIyM119fX19fX19fX0sMTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMDM6e2w6ezEwMTp7bDp7MTE2OntsOns1OTp7YzpbODk4Ml19fX19fX19fX0sMTE3OntsOns1OTp7YzpbOTY0XX19fX19LDk4OntsOnsxMTQ6e2w6ezEwNzp7bDp7NTk6e2M6WzkxNDBdfX19fX19fSw5OTp7bDp7OTc6e2w6ezExNDp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlszNTddfX19fX19fX19LDEwMTp7bDp7MTAwOntsOnsxMDU6e2w6ezEwODp7bDp7NTk6e2M6WzM1NV19fX19fX19fX0sMTIxOntsOns1OTp7YzpbMTA5MF19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbODQxMV19fX19fX19LDEwMTp7bDp7MTA4OntsOnsxMTQ6e2w6ezEwMTp7bDp7OTk6e2w6ezU5OntjOls4OTgxXX19fX19fX19fX19LDEwMjp7bDp7MTE0OntsOns1OTp7YzpbMTIwMTEzXX19fX19LDEwNDp7bDp7MTAxOntsOnsxMTQ6e2w6ezEwMTp7bDp7NTI6e2w6ezU5OntjOls4NzU2XX19fSwxMDI6e2w6ezExMTp7bDp7MTE0OntsOnsxMDE6e2w6ezU5OntjOls4NzU2XX19fX19fX19fX19fX0sMTE2OntsOns5Nzp7bDp7NTk6e2M6Wzk1Ml19LDExNTp7bDp7MTIxOntsOnsxMDk6e2w6ezU5OntjOls5NzddfX19fX19fSwxMTg6e2w6ezU5OntjOls5NzddfX19fX19fX19LDEwNTp7bDp7OTk6e2w6ezEwNzp7bDp7OTc6e2w6ezExMjp7bDp7MTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTIwOntsOns1OTp7YzpbODc3Nl19fX19fX19fX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOls4NzY0XX19fX19fX19fX19LDExMDp7bDp7MTE1OntsOnsxMTI6e2w6ezU5OntjOls4MjAxXX19fX19fX19fSwxMDc6e2w6ezk3OntsOnsxMTI6e2w6ezU5OntjOls4Nzc2XX19fX19LDExNTp7bDp7MTA1OntsOnsxMDk6e2w6ezU5OntjOls4NzY0XX19fX19fX19fSwxMTE6e2w6ezExNDp7bDp7MTEwOntsOns1OTp7YzpbMjU0XX19LGM6WzI1NF19fX19fX19LDEwNTp7bDp7MTA4OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6WzczMl19fX19fX19LDEwOTp7bDp7MTAxOntsOnsxMTU6e2w6ezU5OntjOlsyMTVdfSw5ODp7bDp7NTk6e2M6Wzg4NjRdfSw5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA4MDFdfX19fX19fSwxMDA6e2w6ezU5OntjOlsxMDgwMF19fX19LGM6WzIxNV19fX19fSwxMTA6e2w6ezExNjp7bDp7NTk6e2M6Wzg3NDldfX19fX19fSwxMTE6e2w6ezEwMTp7bDp7OTc6e2w6ezU5OntjOlsxMDUzNl19fX19fSwxMTI6e2w6ezU5OntjOls4ODY4XX0sOTg6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbOTAxNF19fX19fX19LDk5OntsOnsxMDU6e2w6ezExNDp7bDp7NTk6e2M6WzEwOTkzXX19fX19fX0sMTAyOntsOns1OTp7YzpbMTIwMTY1XX0sMTExOntsOnsxMTQ6e2w6ezEwNzp7bDp7NTk6e2M6WzEwOTcwXX19fX19fX19fX19LDExNTp7bDp7OTc6e2w6ezU5OntjOlsxMDUzN119fX19fX19LDExMjp7bDp7MTE0OntsOnsxMDU6e2w6ezEwOTp7bDp7MTAxOntsOns1OTp7YzpbODI0NF19fX19fX19fX19fSwxMTQ6e2w6ezk3OntsOnsxMDA6e2w6ezEwMTp7bDp7NTk6e2M6Wzg0ODJdfX19fX19fSwxMDU6e2w6ezk3OntsOnsxMTA6e2w6ezEwMzp7bDp7MTA4OntsOnsxMDE6e2w6ezU5OntjOls5NjUzXX0sMTAwOntsOnsxMTE6e2w6ezExOTp7bDp7MTEwOntsOns1OTp7YzpbOTY2M119fX19fX19fX0sMTA4OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns1OTp7YzpbOTY2N119LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODg4NF19fX19fX19fX19fX19LDExMzp7bDp7NTk6e2M6Wzg3OTZdfX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns1OTp7YzpbOTY1N119LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODg4NV19fX19fX19fX19fX19fX19fX19fX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls5NzA4XX19fX19fX0sMTAxOntsOns1OTp7YzpbODc5Nl19fX0sMTA5OntsOnsxMDU6e2w6ezExMDp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxMDgxMF19fX19fX19fX19fSwxMTI6e2w6ezEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOlsxMDgwOV19fX19fX19fX0sMTE1OntsOns5ODp7bDp7NTk6e2M6WzEwNzAxXX19fX19LDExNjp7bDp7MTA1OntsOnsxMDk6e2w6ezEwMTp7bDp7NTk6e2M6WzEwODExXX19fX19fX19fX19LDExMjp7bDp7MTAxOntsOnsxMjI6e2w6ezEwNTp7bDp7MTE3OntsOnsxMDk6e2w6ezU5OntjOls5MTg2XX19fX19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMDldfX19LDEyMTp7bDp7NTk6e2M6WzEwOTRdfX19fX0sMTA0OntsOns5OTp7bDp7MTIxOntsOns1OTp7YzpbMTExNV19fX19fX19LDExNjp7bDp7MTE0OntsOnsxMTE6e2w6ezEwNzp7bDp7NTk6e2M6WzM1OV19fX19fX19fX19fSwxMTk6e2w6ezEwNTp7bDp7MTIwOntsOnsxMTY6e2w6ezU5OntjOls4ODEyXX19fX19fX0sMTExOntsOnsxMDQ6e2w6ezEwMTp7bDp7OTc6e2w6ezEwMDp7bDp7MTA4OntsOnsxMDE6e2w6ezEwMjp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYwNl19fX19fX19fX19fX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODYwOF19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSwxMTc6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NTddfX19fX19fSw3Mjp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNTk1XX19fX19fX0sOTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMjUwXX19LGM6WzI1MF19fX19fX19LDExNDp7bDp7MTE0OntsOns1OTp7YzpbODU5M119fX19fX19LDk4OntsOnsxMTQ6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTE4XX19fX19LDEwMTp7bDp7MTE4OntsOnsxMDE6e2w6ezU5OntjOlszNjVdfX19fX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzI1MV19fSxjOlsyNTFdfX19fX0sMTIxOntsOns1OTp7YzpbMTA5MV19fX19fSwxMDA6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NDVdfX19fX19fSw5ODp7bDp7MTA4OntsOns5Nzp7bDp7OTk6e2w6ezU5OntjOlszNjldfX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwNjA2XX19fX19fX19fSwxMDI6e2w6ezEwNTp7bDp7MTE1OntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6WzEwNjIyXX19fX19fX19fSwxMTQ6e2w6ezU5OntjOlsxMjAxMTRdfX19fX0sMTAzOntsOnsxMTQ6e2w6ezk3OntsOnsxMTg6e2w6ezEwMTp7bDp7NTk6e2M6WzI0OV19fSxjOlsyNDldfX19fX19fX19LDEwNDp7bDp7OTc6e2w6ezExNDp7bDp7MTA4OntsOns1OTp7YzpbODYzOV19fX0sMTE0OntsOns1OTp7YzpbODYzOF19fX19fX19LDk4OntsOnsxMDg6e2w6ezEwNzp7bDp7NTk6e2M6Wzk2MDBdfX19fX19fX19LDEwODp7bDp7OTk6e2w6ezExMTp7bDp7MTE0OntsOnsxMTA6e2w6ezU5OntjOls4OTg4XX0sMTAxOntsOnsxMTQ6e2w6ezU5OntjOls4OTg4XX19fX19fX19fX19LDExNDp7bDp7MTExOntsOnsxMTI6e2w6ezU5OntjOls4OTc1XX19fX19fX19fSwxMTY6e2w6ezExNDp7bDp7MTA1OntsOns1OTp7YzpbOTcyMF19fX19fX19fX0sMTA5OntsOns5Nzp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzM2M119fX19fX19LDEwODp7bDp7NTk6e2M6WzE2OF19fSxjOlsxNjhdfX19LDExMTp7bDp7MTAzOntsOnsxMTE6e2w6ezExMDp7bDp7NTk6e2M6WzM3MV19fX19fX19LDExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTY2XX19fX19fX0sMTEyOntsOns5Nzp7bDp7MTE0OntsOnsxMTQ6e2w6ezExMTp7bDp7MTE5OntsOns1OTp7YzpbODU5M119fX19fX19fX19fSwxMDA6e2w6ezExMTp7bDp7MTE5OntsOnsxMTA6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezU5OntjOls4NTk3XX19fX19fX19fX19fX19fX19fX0sMTA0OntsOns5Nzp7bDp7MTE0OntsOnsxMTI6e2w6ezExMTp7bDp7MTExOntsOnsxMTA6e2w6ezEwODp7bDp7MTAxOntsOnsxMDI6e2w6ezExNjp7bDp7NTk6e2M6Wzg2MzldfX19fX19fX19LDExNDp7bDp7MTA1OntsOnsxMDM6e2w6ezEwNDp7bDp7MTE2OntsOns1OTp7YzpbODYzOF19fX19fX19fX19fX19fX19fX19fX19fX19LDEwODp7bDp7MTE3OntsOnsxMTU6e2w6ezU5OntjOls4ODQ2XX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezU5OntjOls5NjVdfSwxMDQ6e2w6ezU5OntjOls5NzhdfX19LDEwODp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOls5NjVdfX19fX19fX19fX0sMTE3OntsOnsxMTI6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7MTExOntsOnsxMTk6e2w6ezExNTp7bDp7NTk6e2M6Wzg2NDhdfX19fX19fX19fX19fX19fX19fSwxMTQ6e2w6ezk5OntsOnsxMTE6e2w6ezExNDp7bDp7MTEwOntsOns1OTp7YzpbODk4OV19LDEwMTp7bDp7MTE0OntsOns1OTp7YzpbODk4OV19fX19fX19fX19fSwxMTQ6e2w6ezExMTp7bDp7MTEyOntsOns1OTp7YzpbODk3NF19fX19fX19fX0sMTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6WzM2N119fX19fX19LDExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOls5NzIxXX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMTBdfX19fX19fSwxMTY6e2w6ezEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOls4OTQ0XX19fX19fX0sMTA1OntsOnsxMDg6e2w6ezEwMDp7bDp7MTAxOntsOns1OTp7YzpbMzYxXX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7NTk6e2M6Wzk2NTNdfSwxMDI6e2w6ezU5OntjOls5NjUyXX19fX19fX19fSwxMTc6e2w6ezk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6Wzg2NDhdfX19fX19fSwxMDk6e2w6ezEwODp7bDp7NTk6e2M6WzI1Ml19fSxjOlsyNTJdfX19fX0sMTE5OntsOns5Nzp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOns1OTp7YzpbMTA2NjNdfX19fX19fX19fX19fX19LDExODp7bDp7NjU6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY2MV19fX19fX19LDY2OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbMTA5ODRdfSwxMTg6e2w6ezU5OntjOlsxMDk4NV19fX19fX19fX0sNjg6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NzJdfX19fX19fX19LDk3OntsOnsxMTA6e2w6ezEwMzp7bDp7MTE0OntsOnsxMTY6e2w6ezU5OntjOlsxMDY1Ml19fX19fX19fX0sMTE0OntsOnsxMDE6e2w6ezExMjp7bDp7MTE1OntsOnsxMDU6e2w6ezEwODp7bDp7MTExOntsOnsxMTA6e2w6ezU5OntjOlsxMDEzXX19fX19fX19fX19fX19fSwxMDc6e2w6ezk3OntsOnsxMTI6e2w6ezExMjp7bDp7OTc6e2w6ezU5OntjOlsxMDA4XX19fX19fX19fX19LDExMDp7bDp7MTExOntsOnsxMTY6e2w6ezEwNDp7bDp7MTA1OntsOnsxMTA6e2w6ezEwMzp7bDp7NTk6e2M6Wzg3MDldfX19fX19fX19fX19fX19LDExMjp7bDp7MTA0OntsOnsxMDU6e2w6ezU5OntjOls5ODFdfX19fX0sMTA1OntsOns1OTp7YzpbOTgyXX19fSwxMTQ6e2w6ezExMTp7bDp7MTEyOntsOnsxMTY6e2w6ezExMTp7bDp7NTk6e2M6Wzg3MzNdfX19fX19fX19fX19fSwxMTQ6e2w6ezU5OntjOls4NTk3XX0sMTA0OntsOnsxMTE6e2w6ezU5OntjOlsxMDA5XX19fX19fX0sMTE1OntsOnsxMDU6e2w6ezEwMzp7bDp7MTA5OntsOns5Nzp7bDp7NTk6e2M6Wzk2Ml19fX19fX19fX0sMTE3OntsOns5ODp7bDp7MTE1OntsOnsxMDE6e2w6ezExNjp7bDp7MTEwOntsOnsxMDE6e2w6ezExMzp7bDp7NTk6e2M6Wzg4NDIsNjUwMjRdfSwxMTM6e2w6ezU5OntjOlsxMDk1NSw2NTAyNF19fX19fX19fX19fX19fX19fSwxMTI6e2w6ezExNTp7bDp7MTAxOntsOnsxMTY6e2w6ezExMDp7bDp7MTAxOntsOnsxMTM6e2w6ezU5OntjOls4ODQzLDY1MDI0XX0sMTEzOntsOns1OTp7YzpbMTA5NTYsNjUwMjRdfX19fX19fX19fX19fX19fX19fX19LDExNjp7bDp7MTA0OntsOnsxMDE6e2w6ezExNjp7bDp7OTc6e2w6ezU5OntjOls5NzddfX19fX19fX19LDExNDp7bDp7MTA1OntsOns5Nzp7bDp7MTEwOntsOnsxMDM6e2w6ezEwODp7bDp7MTAxOntsOnsxMDg6e2w6ezEwMTp7bDp7MTAyOntsOnsxMTY6e2w6ezU5OntjOls4ODgyXX19fX19fX19fSwxMTQ6e2w6ezEwNTp7bDp7MTAzOntsOnsxMDQ6e2w6ezExNjp7bDp7NTk6e2M6Wzg4ODNdfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fSw5OTp7bDp7MTIxOntsOns1OTp7YzpbMTA3NF19fX19fSwxMDA6e2w6ezk3OntsOnsxMTU6e2w6ezEwNDp7bDp7NTk6e2M6Wzg4NjZdfX19fX19fX19LDEwMTp7bDp7MTAxOntsOns1OTp7YzpbODc0NF19LDk4OntsOns5Nzp7bDp7MTE0OntsOns1OTp7YzpbODg5MV19fX19fX19LDEwMTp7bDp7MTEzOntsOns1OTp7YzpbODc5NF19fX19fX19LDEwODp7bDp7MTA4OntsOnsxMDU6e2w6ezExMjp7bDp7NTk6e2M6Wzg5NDJdfX19fX19fX19LDExNDp7bDp7OTg6e2w6ezk3OntsOnsxMTQ6e2w6ezU5OntjOlsxMjRdfX19fX19fSwxMTY6e2w6ezU5OntjOlsxMjRdfX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExNV19fX19fSwxMDg6e2w6ezExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOls4ODgyXX19fX19fX19fSwxMTA6e2w6ezExNTp7bDp7MTE3OntsOns5ODp7bDp7NTk6e2M6Wzg4MzQsODQwMl19fX0sMTEyOntsOns1OTp7YzpbODgzNSw4NDAyXX19fX19fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTY3XX19fX19fX0sMTEyOntsOnsxMTQ6e2w6ezExMTp7bDp7MTEyOntsOns1OTp7YzpbODczM119fX19fX19fX0sMTE0OntsOnsxMTY6e2w6ezExNDp7bDp7MTA1OntsOns1OTp7YzpbODg4M119fX19fX19fX0sMTE1OntsOns5OTp7bDp7MTE0OntsOns1OTp7YzpbMTIwMDExXX19fX19LDExNzp7bDp7OTg6e2w6ezExMDp7bDp7Njk6e2w6ezU5OntjOlsxMDk1NSw2NTAyNF19fX0sMTAxOntsOns1OTp7YzpbODg0Miw2NTAyNF19fX19fX19LDExMjp7bDp7MTEwOntsOns2OTp7bDp7NTk6e2M6WzEwOTU2LDY1MDI0XX19fSwxMDE6e2w6ezU5OntjOls4ODQzLDY1MDI0XX19fX19fX19fX19LDEyMjp7bDp7MTA1OntsOnsxMDM6e2w6ezEyMjp7bDp7OTc6e2w6ezEwMzp7bDp7NTk6e2M6WzEwNjUwXX19fX19fX19fX19fX19fSwxMTk6e2w6ezk5OntsOnsxMDU6e2w6ezExNDp7bDp7OTk6e2w6ezU5OntjOlszNzNdfX19fX19fX19LDEwMTp7bDp7MTAwOntsOns5ODp7bDp7OTc6e2w6ezExNDp7bDp7NTk6e2M6WzEwODQ3XX19fX19fX0sMTAzOntsOnsxMDE6e2w6ezU5OntjOls4NzQzXX0sMTEzOntsOns1OTp7YzpbODc5M119fX19fX19fX0sMTA1OntsOnsxMDE6e2w6ezExNDp7bDp7MTEyOntsOns1OTp7YzpbODQ3Ml19fX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExNl19fX19fSwxMTE6e2w6ezExMjp7bDp7MTAyOntsOns1OTp7YzpbMTIwMTY4XX19fX19fX0sMTEyOntsOns1OTp7YzpbODQ3Ml19fX0sMTE0OntsOns1OTp7YzpbODc2OF19LDEwMTp7bDp7OTc6e2w6ezExNjp7bDp7MTA0OntsOns1OTp7YzpbODc2OF19fX19fX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMTJdfX19fX19fX19LDEyMDp7bDp7OTk6e2w6ezk3OntsOnsxMTI6e2w6ezU5OntjOls4ODk4XX19fX19LDEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6Wzk3MTFdfX19fX19fSwxMTc6e2w6ezExMjp7bDp7NTk6e2M6Wzg4OTldfX19fX19fSwxMDA6e2w6ezExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOls5NjYxXX19fX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExN119fX19fSwxMDQ6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6WzEwMjM0XX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTAyMzFdfX19fX19fX19LDEwNTp7bDp7NTk6e2M6Wzk1OF19fX0sMTA4OntsOns2NTp7bDp7MTE0OntsOnsxMTQ6e2w6ezU5OntjOlsxMDIzMl19fX19fX19LDk3OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6WzEwMjI5XX19fX19fX19fSwxMDk6e2w6ezk3OntsOnsxMTI6e2w6ezU5OntjOlsxMDIzNl19fX19fX19LDExMDp7bDp7MTA1OntsOnsxMTU6e2w6ezU5OntjOls4OTU1XX19fX19fX0sMTExOntsOnsxMDA6e2w6ezExMTp7bDp7MTE2OntsOns1OTp7YzpbMTA3NTJdfX19fX19fSwxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE2OV19fX0sMTA4OntsOnsxMTc6e2w6ezExNTp7bDp7NTk6e2M6WzEwNzUzXX19fX19fX19fSwxMTY6e2w6ezEwNTp7bDp7MTA5OntsOnsxMDE6e2w6ezU5OntjOlsxMDc1NF19fX19fX19fX19fSwxMTQ6e2w6ezY1OntsOnsxMTQ6e2w6ezExNDp7bDp7NTk6e2M6WzEwMjMzXX19fX19fX0sOTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbMTAyMzBdfX19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDAxM119fX19fSwxMTM6e2w6ezk5OntsOnsxMTc6e2w6ezExMjp7bDp7NTk6e2M6WzEwNzU4XX19fX19fX19fX19LDExNzp7bDp7MTEyOntsOnsxMDg6e2w6ezExNzp7bDp7MTE1OntsOns1OTp7YzpbMTA3NTZdfX19fX19fX19LDExNjp7bDp7MTE0OntsOnsxMDU6e2w6ezU5OntjOls5NjUxXX19fX19fX19fSwxMTg6e2w6ezEwMTp7bDp7MTAxOntsOns1OTp7YzpbODg5N119fX19fX19LDExOTp7bDp7MTAxOntsOnsxMDA6e2w6ezEwMzp7bDp7MTAxOntsOns1OTp7YzpbODg5Nl19fX19fX19fX19fX19LDEyMTp7bDp7OTc6e2w6ezk5OntsOnsxMTc6e2w6ezExNjp7bDp7MTAxOntsOns1OTp7YzpbMjUzXX19LGM6WzI1M119fX19fSwxMjE6e2w6ezU5OntjOlsxMTAzXX19fX19fX0sOTk6e2w6ezEwNTp7bDp7MTE0OntsOns5OTp7bDp7NTk6e2M6WzM3NV19fX19fX19LDEyMTp7bDp7NTk6e2M6WzEwOTldfX19fX0sMTAxOntsOnsxMTA6e2w6ezU5OntjOlsxNjVdfX0sYzpbMTY1XX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExOF19fX19fSwxMDU6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMTExXX19fX19fX0sMTExOntsOnsxMTI6e2w6ezEwMjp7bDp7NTk6e2M6WzEyMDE3MF19fX19fX19LDExNTp7bDp7OTk6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDAxNF19fX19fX19LDExNzp7bDp7OTk6e2w6ezEyMTp7bDp7NTk6e2M6WzExMDJdfX19fX0sMTA5OntsOnsxMDg6e2w6ezU5OntjOlsyNTVdfX0sYzpbMjU1XX19fX19fX0sMTIyOntsOns5Nzp7bDp7OTk6e2w6ezExNzp7bDp7MTE2OntsOnsxMDE6e2w6ezU5OntjOlszNzhdfX19fX19fX19fX0sOTk6e2w6ezk3OntsOnsxMTQ6e2w6ezExMTp7bDp7MTEwOntsOns1OTp7YzpbMzgyXX19fX19fX19fSwxMjE6e2w6ezU5OntjOlsxMDc5XX19fX19LDEwMDp7bDp7MTExOntsOnsxMTY6e2w6ezU5OntjOlszODBdfX19fX19fSwxMDE6e2w6ezEwMTp7bDp7MTE2OntsOnsxMTQ6e2w6ezEwMjp7bDp7NTk6e2M6Wzg0ODhdfX19fX19fX19LDExNjp7bDp7OTc6e2w6ezU5OntjOls5NTBdfX19fX19fSwxMDI6e2w6ezExNDp7bDp7NTk6e2M6WzEyMDExOV19fX19fSwxMDQ6e2w6ezk5OntsOnsxMjE6e2w6ezU5OntjOlsxMDc4XX19fX19fX0sMTA1OntsOnsxMDM6e2w6ezExNDp7bDp7OTc6e2w6ezExNDp7bDp7MTE0OntsOns1OTp7YzpbODY2OV19fX19fX19fX19fX19LDExMTp7bDp7MTEyOntsOnsxMDI6e2w6ezU5OntjOlsxMjAxNzFdfX19fX19fSwxMTU6e2w6ezk5OntsOnsxMTQ6e2w6ezU5OntjOlsxMjAwMTVdfX19fX19fSwxMTk6e2w6ezEwNjp7bDp7NTk6e2M6WzgyMDVdfX19LDExMDp7bDp7MTA2OntsOns1OTp7YzpbODIwNF19fX19fX19fX19O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgVU5JQ09ERSA9IHJlcXVpcmUoJy4uL2NvbW1vbi91bmljb2RlJyk7XHJcblxyXG4vL0FsaWFzZXNcclxudmFyICQgPSBVTklDT0RFLkNPREVfUE9JTlRTO1xyXG5cclxuLy9VdGlsc1xyXG5cclxuLy9PUFRJTUlaQVRJT046IHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgbW92ZWQgb3V0IG9mIHRoaXMgbW9kdWxlLiBWOCBDcmFua3NoYWZ0IHdpbGwgbm90IGlubGluZVxyXG4vL3RoaXMgZnVuY3Rpb25zIGlmIHRoZXkgd2lsbCBiZSBzaXR1YXRlZCBpbiBhbm90aGVyIG1vZHVsZSBkdWUgdG8gY29udGV4dCBzd2l0Y2guXHJcbi8vQWx3YXlzIHBlcmZvcm0gaW5saW5pbmcgY2hlY2sgYmVmb3JlIG1vZGlmeWluZyB0aGlzIGZ1bmN0aW9ucyAoJ25vZGUgLS10cmFjZS1pbmxpbmluZycpLlxyXG5mdW5jdGlvbiBpc1Jlc2VydmVkQ29kZVBvaW50KGNwKSB7XHJcbiAgICByZXR1cm4gY3AgPj0gMHhEODAwICYmIGNwIDw9IDB4REZGRiB8fCBjcCA+IDB4MTBGRkZGO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1N1cnJvZ2F0ZVBhaXIoY3AxLCBjcDIpIHtcclxuICAgIHJldHVybiBjcDEgPj0gMHhEODAwICYmIGNwMSA8PSAweERCRkYgJiYgY3AyID49IDB4REMwMCAmJiBjcDIgPD0gMHhERkZGO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTdXJyb2dhdGVQYWlyQ29kZVBvaW50KGNwMSwgY3AyKSB7XHJcbiAgICByZXR1cm4gKGNwMSAtIDB4RDgwMCkgKiAweDQwMCArIDB4MjQwMCArIGNwMjtcclxufVxyXG5cclxuLy9QcmVwcm9jZXNzb3JcclxuLy9OT1RFOiBIVE1MIGlucHV0IHByZXByb2Nlc3NpbmdcclxuLy8oc2VlOiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtKVxyXG52YXIgUHJlcHJvY2Vzc29yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaHRtbCkge1xyXG4gICAgdGhpcy53cml0ZShodG1sKTtcclxuXHJcbiAgICAvL05PVEU6IG9uZSBsZWFkaW5nIFUrRkVGRiBCWVRFIE9SREVSIE1BUksgY2hhcmFjdGVyIG11c3QgYmUgaWdub3JlZCBpZiBhbnkgYXJlIHByZXNlbnQgaW4gdGhlIGlucHV0IHN0cmVhbS5cclxuICAgIHRoaXMucG9zID0gdGhpcy5odG1sLmNoYXJDb2RlQXQoMCkgPT09ICQuQk9NID8gMCA6IC0xO1xyXG5cclxuICAgIHRoaXMuZ2FwU3RhY2sgPSBbXTtcclxuICAgIHRoaXMubGFzdEdhcFBvcyA9IC0xO1xyXG4gICAgdGhpcy5za2lwTmV4dE5ld0xpbmUgPSBmYWxzZTtcclxufTtcclxuXHJcblByZXByb2Nlc3Nvci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoaHRtbCkge1xyXG4gICAgaWYgKHRoaXMuaHRtbCkge1xyXG4gICAgICAgIHRoaXMuaHRtbCA9IHRoaXMuaHRtbC5zdWJzdHJpbmcoMCwgdGhpcy5wb3MgKyAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sLnN1YnN0cmluZyh0aGlzLnBvcyArIDEsIHRoaXMuaHRtbC5sZW5ndGgpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLmh0bWwgPSBodG1sO1xyXG5cclxuXHJcbiAgICB0aGlzLmxhc3RDaGFyUG9zID0gdGhpcy5odG1sLmxlbmd0aCAtIDE7XHJcbn07XHJcblxyXG5QcmVwcm9jZXNzb3IucHJvdG90eXBlLmFkdmFuY2VBbmRQZWVrQ29kZVBvaW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5wb3MrKztcclxuXHJcbiAgICBpZiAodGhpcy5wb3MgPiB0aGlzLmxhc3RDaGFyUG9zKVxyXG4gICAgICAgIHJldHVybiAkLkVPRjtcclxuXHJcbiAgICB2YXIgY3AgPSB0aGlzLmh0bWwuY2hhckNvZGVBdCh0aGlzLnBvcyk7XHJcblxyXG4gICAgLy9OT1RFOiBhbnkgVSswMDBBIExJTkUgRkVFRCAoTEYpIGNoYXJhY3RlcnMgdGhhdCBpbW1lZGlhdGVseSBmb2xsb3cgYSBVKzAwMEQgQ0FSUklBR0UgUkVUVVJOIChDUikgY2hhcmFjdGVyXHJcbiAgICAvL211c3QgYmUgaWdub3JlZC5cclxuICAgIGlmICh0aGlzLnNraXBOZXh0TmV3TGluZSAmJiBjcCA9PT0gJC5MSU5FX0ZFRUQpIHtcclxuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2FkZEdhcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VBbmRQZWVrQ29kZVBvaW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9OT1RFOiBhbGwgVSswMDBEIENBUlJJQUdFIFJFVFVSTiAoQ1IpIGNoYXJhY3RlcnMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gVSswMDBBIExJTkUgRkVFRCAoTEYpIGNoYXJhY3RlcnNcclxuICAgIGlmIChjcCA9PT0gJC5DQVJSSUFHRV9SRVRVUk4pIHtcclxuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuICQuTElORV9GRUVEO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XHJcblxyXG4gICAgLy9PUFRJTUlaQVRJT046IGZpcnN0IHBlcmZvcm0gY2hlY2sgaWYgdGhlIGNvZGUgcG9pbnQgaW4gdGhlIGFsbG93ZWQgcmFuZ2UgdGhhdCBjb3ZlcnMgbW9zdCBjb21tb25cclxuICAgIC8vSFRNTCBpbnB1dCAoZS5nLiBBU0NJSSBjb2RlcykgdG8gYXZvaWQgcGVyZm9ybWFuY2UtY29zdCBvcGVyYXRpb25zIGZvciBoaWdoLXJhbmdlIGNvZGUgcG9pbnRzLlxyXG4gICAgcmV0dXJuIGNwID49IDB4RDgwMCA/IHRoaXMuX3Byb2Nlc3NIaWdoUmFuZ2VDb2RlUG9pbnQoY3ApIDogY3A7XHJcbn07XHJcblxyXG5QcmVwcm9jZXNzb3IucHJvdG90eXBlLl9wcm9jZXNzSGlnaFJhbmdlQ29kZVBvaW50ID0gZnVuY3Rpb24gKGNwKSB7XHJcbiAgICAvL05PVEU6IHRyeSB0byBwZWVrIGEgc3Vycm9nYXRlIHBhaXJcclxuICAgIGlmICh0aGlzLnBvcyAhPT0gdGhpcy5sYXN0Q2hhclBvcykge1xyXG4gICAgICAgIHZhciBuZXh0Q3AgPSB0aGlzLmh0bWwuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xyXG5cclxuICAgICAgICBpZiAoaXNTdXJyb2dhdGVQYWlyKGNwLCBuZXh0Q3ApKSB7XHJcbiAgICAgICAgICAgIC8vTk9URTogd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyLiBQZWVrIHBhaXIgY2hhcmFjdGVyIGFuZCByZWNhbGN1bGF0ZSBjb2RlIHBvaW50LlxyXG4gICAgICAgICAgICB0aGlzLnBvcysrO1xyXG4gICAgICAgICAgICBjcCA9IGdldFN1cnJvZ2F0ZVBhaXJDb2RlUG9pbnQoY3AsIG5leHRDcCk7XHJcblxyXG4gICAgICAgICAgICAvL05PVEU6IGFkZCBnYXAgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCBkdXJpbmcgcmV0cmVhdFxyXG4gICAgICAgICAgICB0aGlzLl9hZGRHYXAoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzUmVzZXJ2ZWRDb2RlUG9pbnQoY3ApKVxyXG4gICAgICAgIGNwID0gJC5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgcmV0dXJuIGNwO1xyXG59O1xyXG5cclxuUHJlcHJvY2Vzc29yLnByb3RvdHlwZS5fYWRkR2FwID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5nYXBTdGFjay5wdXNoKHRoaXMubGFzdEdhcFBvcyk7XHJcbiAgICB0aGlzLmxhc3RHYXBQb3MgPSB0aGlzLnBvcztcclxufTtcclxuXHJcblByZXByb2Nlc3Nvci5wcm90b3R5cGUucmV0cmVhdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0aGlzLnBvcyA9PT0gdGhpcy5sYXN0R2FwUG9zKSB7XHJcbiAgICAgICAgdGhpcy5sYXN0R2FwUG9zID0gdGhpcy5nYXBTdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLnBvcy0tO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9zLS07XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBQcmVwcm9jZXNzb3IgPSByZXF1aXJlKCcuL3ByZXByb2Nlc3NvcicpLFxyXG4gICAgTG9jYXRpb25JbmZvTWl4aW4gPSByZXF1aXJlKCcuL2xvY2F0aW9uX2luZm9fbWl4aW4nKSxcclxuICAgIFVOSUNPREUgPSByZXF1aXJlKCcuLi9jb21tb24vdW5pY29kZScpLFxyXG4gICAgTkFNRURfRU5USVRZX1RSSUUgPSByZXF1aXJlKCcuL25hbWVkX2VudGl0eV90cmllJyk7XHJcblxyXG4vL0FsaWFzZXNcclxudmFyICQgPSBVTklDT0RFLkNPREVfUE9JTlRTLFxyXG4gICAgJCQgPSBVTklDT0RFLkNPREVfUE9JTlRfU0VRVUVOQ0VTO1xyXG5cclxuLy9SZXBsYWNlbWVudCBjb2RlIHBvaW50cyBmb3IgbnVtZXJpYyBlbnRpdGllc1xyXG52YXIgTlVNRVJJQ19FTlRJVFlfUkVQTEFDRU1FTlRTID0ge1xyXG4gICAgMHgwMDogMHhGRkZELCAweDBEOiAweDAwMEQsIDB4ODA6IDB4MjBBQywgMHg4MTogMHgwMDgxLCAweDgyOiAweDIwMUEsIDB4ODM6IDB4MDE5MiwgMHg4NDogMHgyMDFFLFxyXG4gICAgMHg4NTogMHgyMDI2LCAweDg2OiAweDIwMjAsIDB4ODc6IDB4MjAyMSwgMHg4ODogMHgwMkM2LCAweDg5OiAweDIwMzAsIDB4OEE6IDB4MDE2MCwgMHg4QjogMHgyMDM5LFxyXG4gICAgMHg4QzogMHgwMTUyLCAweDhEOiAweDAwOEQsIDB4OEU6IDB4MDE3RCwgMHg4RjogMHgwMDhGLCAweDkwOiAweDAwOTAsIDB4OTE6IDB4MjAxOCwgMHg5MjogMHgyMDE5LFxyXG4gICAgMHg5MzogMHgyMDFDLCAweDk0OiAweDIwMUQsIDB4OTU6IDB4MjAyMiwgMHg5NjogMHgyMDEzLCAweDk3OiAweDIwMTQsIDB4OTg6IDB4MDJEQywgMHg5OTogMHgyMTIyLFxyXG4gICAgMHg5QTogMHgwMTYxLCAweDlCOiAweDIwM0EsIDB4OUM6IDB4MDE1MywgMHg5RDogMHgwMDlELCAweDlFOiAweDAxN0UsIDB4OUY6IDB4MDE3OFxyXG59O1xyXG5cclxuLy9TdGF0ZXNcclxudmFyIERBVEFfU1RBVEUgPSAnREFUQV9TVEFURScsXHJcbiAgICBDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0RBVEFfU1RBVEUgPSAnQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9EQVRBX1NUQVRFJyxcclxuICAgIFJDREFUQV9TVEFURSA9ICdSQ0RBVEFfU1RBVEUnLFxyXG4gICAgQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9SQ0RBVEFfU1RBVEUgPSAnQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9SQ0RBVEFfU1RBVEUnLFxyXG4gICAgUkFXVEVYVF9TVEFURSA9ICdSQVdURVhUX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX1NUQVRFID0gJ1NDUklQVF9EQVRBX1NUQVRFJyxcclxuICAgIFBMQUlOVEVYVF9TVEFURSA9ICdQTEFJTlRFWFRfU1RBVEUnLFxyXG4gICAgVEFHX09QRU5fU1RBVEUgPSAnVEFHX09QRU5fU1RBVEUnLFxyXG4gICAgRU5EX1RBR19PUEVOX1NUQVRFID0gJ0VORF9UQUdfT1BFTl9TVEFURScsXHJcbiAgICBUQUdfTkFNRV9TVEFURSA9ICdUQUdfTkFNRV9TVEFURScsXHJcbiAgICBSQ0RBVEFfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnUkNEQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFJyxcclxuICAgIFJDREFUQV9FTkRfVEFHX09QRU5fU1RBVEUgPSAnUkNEQVRBX0VORF9UQUdfT1BFTl9TVEFURScsXHJcbiAgICBSQ0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1JDREFUQV9FTkRfVEFHX05BTUVfU1RBVEUnLFxyXG4gICAgUkFXVEVYVF9MRVNTX1RIQU5fU0lHTl9TVEFURSA9ICdSQVdURVhUX0xFU1NfVEhBTl9TSUdOX1NUQVRFJyxcclxuICAgIFJBV1RFWFRfRU5EX1RBR19PUEVOX1NUQVRFID0gJ1JBV1RFWFRfRU5EX1RBR19PUEVOX1NUQVRFJyxcclxuICAgIFJBV1RFWFRfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1JBV1RFWFRfRU5EX1RBR19OQU1FX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFID0gJ1NDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0VORF9UQUdfT1BFTl9TVEFURSA9ICdTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5fU1RBVEUnLFxyXG4gICAgU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VORF9UQUdfTkFNRV9TVEFURScsXHJcbiAgICBTQ1JJUFRfREFUQV9FU0NBUEVfU1RBUlRfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURScsXHJcbiAgICBTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURScsXHJcbiAgICBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTl9TVEFURSA9ICdTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTl9TVEFURScsXHJcbiAgICBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURSA9ICdTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURScsXHJcbiAgICBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUX1NUQVRFID0gJ1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfU1RBUlRfU1RBVEUnLFxyXG4gICAgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEUnLFxyXG4gICAgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9TVEFURSA9ICdTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX1NUQVRFJyxcclxuICAgIFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURSA9ICdTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX0RBU0hfU1RBVEUnLFxyXG4gICAgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUnLFxyXG4gICAgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEUnLFxyXG4gICAgQkVGT1JFX0FUVFJJQlVURV9OQU1FX1NUQVRFID0gJ0JFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURScsXHJcbiAgICBBVFRSSUJVVEVfTkFNRV9TVEFURSA9ICdBVFRSSUJVVEVfTkFNRV9TVEFURScsXHJcbiAgICBBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSA9ICdBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURScsXHJcbiAgICBCRUZPUkVfQVRUUklCVVRFX1ZBTFVFX1NUQVRFID0gJ0JFRk9SRV9BVFRSSUJVVEVfVkFMVUVfU1RBVEUnLFxyXG4gICAgQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURfU1RBVEUgPSAnQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURfU1RBVEUnLFxyXG4gICAgQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEUgPSAnQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEUnLFxyXG4gICAgQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEX1NUQVRFID0gJ0FUVFJJQlVURV9WQUxVRV9VTlFVT1RFRF9TVEFURScsXHJcbiAgICBDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0FUVFJJQlVURV9WQUxVRV9TVEFURSA9ICdDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0FUVFJJQlVURV9WQUxVRV9TVEFURScsXHJcbiAgICBBRlRFUl9BVFRSSUJVVEVfVkFMVUVfUVVPVEVEX1NUQVRFID0gJ0FGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URURfU1RBVEUnLFxyXG4gICAgU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURSA9ICdTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFJyxcclxuICAgIEJPR1VTX0NPTU1FTlRfU1RBVEUgPSAnQk9HVVNfQ09NTUVOVF9TVEFURScsXHJcbiAgICBNQVJLVVBfREVDTEFSQVRJT05fT1BFTl9TVEFURSA9ICdNQVJLVVBfREVDTEFSQVRJT05fT1BFTl9TVEFURScsXHJcbiAgICBDT01NRU5UX1NUQVJUX1NUQVRFID0gJ0NPTU1FTlRfU1RBUlRfU1RBVEUnLFxyXG4gICAgQ09NTUVOVF9TVEFSVF9EQVNIX1NUQVRFID0gJ0NPTU1FTlRfU1RBUlRfREFTSF9TVEFURScsXHJcbiAgICBDT01NRU5UX1NUQVRFID0gJ0NPTU1FTlRfU1RBVEUnLFxyXG4gICAgQ09NTUVOVF9FTkRfREFTSF9TVEFURSA9ICdDT01NRU5UX0VORF9EQVNIX1NUQVRFJyxcclxuICAgIENPTU1FTlRfRU5EX1NUQVRFID0gJ0NPTU1FTlRfRU5EX1NUQVRFJyxcclxuICAgIENPTU1FTlRfRU5EX0JBTkdfU1RBVEUgPSAnQ09NTUVOVF9FTkRfQkFOR19TVEFURScsXHJcbiAgICBET0NUWVBFX1NUQVRFID0gJ0RPQ1RZUEVfU1RBVEUnLFxyXG4gICAgQkVGT1JFX0RPQ1RZUEVfTkFNRV9TVEFURSA9ICdCRUZPUkVfRE9DVFlQRV9OQU1FX1NUQVRFJyxcclxuICAgIERPQ1RZUEVfTkFNRV9TVEFURSA9ICdET0NUWVBFX05BTUVfU1RBVEUnLFxyXG4gICAgQUZURVJfRE9DVFlQRV9OQU1FX1NUQVRFID0gJ0FGVEVSX0RPQ1RZUEVfTkFNRV9TVEFURScsXHJcbiAgICBBRlRFUl9ET0NUWVBFX1BVQkxJQ19LRVlXT1JEX1NUQVRFID0gJ0FGVEVSX0RPQ1RZUEVfUFVCTElDX0tFWVdPUkRfU1RBVEUnLFxyXG4gICAgQkVGT1JFX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEUgPSAnQkVGT1JFX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEUnLFxyXG4gICAgRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFID0gJ0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURScsXHJcbiAgICBET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEUgPSAnRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFJyxcclxuICAgIEFGVEVSX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEUgPSAnQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TVEFURScsXHJcbiAgICBCRVRXRUVOX0RPQ1RZUEVfUFVCTElDX0FORF9TWVNURU1fSURFTlRJRklFUlNfU1RBVEUgPSAnQkVUV0VFTl9ET0NUWVBFX1BVQkxJQ19BTkRfU1lTVEVNX0lERU5USUZJRVJTX1NUQVRFJyxcclxuICAgIEFGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkRfU1RBVEUgPSAnQUZURVJfRE9DVFlQRV9TWVNURU1fS0VZV09SRF9TVEFURScsXHJcbiAgICBCRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURSA9ICdCRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURScsXHJcbiAgICBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEUgPSAnRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFJyxcclxuICAgIERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURSA9ICdET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEUnLFxyXG4gICAgQUZURVJfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURSA9ICdBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NUQVRFJyxcclxuICAgIEJPR1VTX0RPQ1RZUEVfU1RBVEUgPSAnQk9HVVNfRE9DVFlQRV9TVEFURScsXHJcbiAgICBDREFUQV9TRUNUSU9OX1NUQVRFID0gJ0NEQVRBX1NFQ1RJT05fU1RBVEUnO1xyXG5cclxuLy9VdGlsc1xyXG5cclxuLy9PUFRJTUlaQVRJT046IHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgbW92ZWQgb3V0IG9mIHRoaXMgbW9kdWxlLiBWOCBDcmFua3NoYWZ0IHdpbGwgbm90IGlubGluZVxyXG4vL3RoaXMgZnVuY3Rpb25zIGlmIHRoZXkgd2lsbCBiZSBzaXR1YXRlZCBpbiBhbm90aGVyIG1vZHVsZSBkdWUgdG8gY29udGV4dCBzd2l0Y2guXHJcbi8vQWx3YXlzIHBlcmZvcm0gaW5saW5pbmcgY2hlY2sgYmVmb3JlIG1vZGlmeWluZyB0aGlzIGZ1bmN0aW9ucyAoJ25vZGUgLS10cmFjZS1pbmxpbmluZycpLlxyXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UoY3ApIHtcclxuICAgIHJldHVybiBjcCA9PT0gJC5TUEFDRSB8fCBjcCA9PT0gJC5MSU5FX0ZFRUQgfHwgY3AgPT09ICQuVEFCVUxBVElPTiB8fCBjcCA9PT0gJC5GT1JNX0ZFRUQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQXNjaWlEaWdpdChjcCkge1xyXG4gICAgcmV0dXJuIGNwID49ICQuRElHSVRfMCAmJiBjcCA8PSAkLkRJR0lUXzk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQXNjaWlVcHBlcihjcCkge1xyXG4gICAgcmV0dXJuIGNwID49ICQuTEFUSU5fQ0FQSVRBTF9BICYmIGNwIDw9ICQuTEFUSU5fQ0FQSVRBTF9aO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FzY2lpTG93ZXIoY3ApIHtcclxuICAgIHJldHVybiBjcCA+PSAkLkxBVElOX1NNQUxMX0EgJiYgY3AgPD0gJC5MQVRJTl9TTUFMTF9aO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FzY2lpQWxwaGFOdW1lcmljKGNwKSB7XHJcbiAgICByZXR1cm4gaXNBc2NpaURpZ2l0KGNwKSB8fCBpc0FzY2lpVXBwZXIoY3ApIHx8IGlzQXNjaWlMb3dlcihjcCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRGlnaXQoY3AsIGlzSGV4KSB7XHJcbiAgICByZXR1cm4gaXNBc2NpaURpZ2l0KGNwKSB8fCAoaXNIZXggJiYgKChjcCA+PSAkLkxBVElOX0NBUElUQUxfQSAmJiBjcCA8PSAkLkxBVElOX0NBUElUQUxfRikgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwID49ICQuTEFUSU5fU01BTExfQSAmJiBjcCA8PSAkLkxBVElOX1NNQUxMX0YpKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUmVzZXJ2ZWRDb2RlUG9pbnQoY3ApIHtcclxuICAgIHJldHVybiBjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGIHx8IGNwID4gMHgxMEZGRkY7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvQXNjaWlMb3dlckNvZGVQb2ludChjcCkge1xyXG4gICAgcmV0dXJuIGNwICsgMHgwMDIwO1xyXG59XHJcblxyXG4vL05PVEU6IFN0cmluZy5mcm9tQ2hhckNvZGUoKSBmdW5jdGlvbiBjYW4gaGFuZGxlIG9ubHkgY2hhcmFjdGVycyBmcm9tIEJNUCBzdWJzZXQuXHJcbi8vU28sIHdlIG5lZWQgdG8gd29ya2Fyb3VuZCB0aGlzIG1hbnVhbGx5LlxyXG4vLyhzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21DaGFyQ29kZSNHZXR0aW5nX2l0X3RvX3dvcmtfd2l0aF9oaWdoZXJfdmFsdWVzKVxyXG5mdW5jdGlvbiB0b0NoYXIoY3ApIHtcclxuICAgIGlmIChjcCA8PSAweEZGRkYpXHJcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApO1xyXG5cclxuICAgIGNwIC09IDB4MTAwMDA7XHJcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCB8IGNwICYgMHgzRkYpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b0FzY2lpTG93ZXJDaGFyKGNwKSB7XHJcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0b0FzY2lpTG93ZXJDb2RlUG9pbnQoY3ApKTtcclxufVxyXG5cclxuLy9Ub2tlbml6ZXJcclxudmFyIFRva2VuaXplciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGh0bWwsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuZGlzYWJsZUVudGl0aWVzRGVjb2RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnByZXByb2Nlc3NvciA9IG5ldyBQcmVwcm9jZXNzb3IoaHRtbCk7XHJcblxyXG4gICAgdGhpcy50b2tlblF1ZXVlID0gW107XHJcblxyXG4gICAgdGhpcy5hbGxvd0NEQVRBID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB0aGlzLnJldHVyblN0YXRlID0gJyc7XHJcblxyXG4gICAgdGhpcy5jb25zdW1wdGlvblBvcyA9IDA7XHJcblxyXG4gICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xyXG4gICAgdGhpcy5hZGRpdGlvbmFsQWxsb3dlZENwID0gdm9pZCAwO1xyXG4gICAgdGhpcy5sYXN0U3RhcnRUYWdOYW1lID0gJyc7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50QXR0ciA9IG51bGw7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVFbnRpdGllc0RlY29kaW5nID0gIW9wdGlvbnMuZGVjb2RlSHRtbEVudGl0aWVzO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbkluZm8pXHJcbiAgICAgICAgICAgIExvY2F0aW9uSW5mb01peGluLmFzc2lnbih0aGlzKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vVG9rZW4gdHlwZXNcclxuVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTiA9ICdDSEFSQUNURVJfVE9LRU4nO1xyXG5Ub2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU4gPSAnTlVMTF9DSEFSQUNURVJfVE9LRU4nO1xyXG5Ub2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU4gPSAnV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU4nO1xyXG5Ub2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOID0gJ1NUQVJUX1RBR19UT0tFTic7XHJcblRva2VuaXplci5FTkRfVEFHX1RPS0VOID0gJ0VORF9UQUdfVE9LRU4nO1xyXG5Ub2tlbml6ZXIuQ09NTUVOVF9UT0tFTiA9ICdDT01NRU5UX1RPS0VOJztcclxuVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU4gPSAnRE9DVFlQRV9UT0tFTic7XHJcblRva2VuaXplci5FT0ZfVE9LRU4gPSAnRU9GX1RPS0VOJztcclxuXHJcbi8vVG9rZW5pemVyIGluaXRpYWwgc3RhdGVzIGZvciBkaWZmZXJlbnQgbW9kZXNcclxuVG9rZW5pemVyLk1PREUgPSBUb2tlbml6ZXIucHJvdG90eXBlLk1PREUgPSB7XHJcbiAgICBEQVRBOiBEQVRBX1NUQVRFLFxyXG4gICAgUkNEQVRBOiBSQ0RBVEFfU1RBVEUsXHJcbiAgICBSQVdURVhUOiBSQVdURVhUX1NUQVRFLFxyXG4gICAgU0NSSVBUX0RBVEE6IFNDUklQVF9EQVRBX1NUQVRFLFxyXG4gICAgUExBSU5URVhUOiBQTEFJTlRFWFRfU1RBVEVcclxufTtcclxuXHJcbi8vU3RhdGljXHJcblRva2VuaXplci5nZXRUb2tlbkF0dHIgPSBmdW5jdGlvbiAodG9rZW4sIGF0dHJOYW1lKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdG9rZW4uYXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAodG9rZW4uYXR0cnNbaV0ubmFtZSA9PT0gYXR0ck5hbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0b2tlbi5hdHRyc1tpXS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8vR2V0IHRva2VuXHJcblRva2VuaXplci5wcm90b3R5cGUuZ2V0TmV4dFRva2VuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgd2hpbGUgKCF0aGlzLnRva2VuUXVldWUubGVuZ3RoKVxyXG4gICAgICAgIHRoaXNbdGhpcy5zdGF0ZV0odGhpcy5fY29uc3VtZSgpKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50b2tlblF1ZXVlLnNoaWZ0KCk7XHJcbn07XHJcblxyXG4vL0NvbnN1bXB0aW9uXHJcblRva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmNvbnN1bXB0aW9uUG9zKys7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzb3IuYWR2YW5jZUFuZFBlZWtDb2RlUG9pbnQoKTtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX3VuY29uc3VtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMuY29uc3VtcHRpb25Qb3MtLTtcclxuICAgIHRoaXMucHJlcHJvY2Vzc29yLnJldHJlYXQoKTtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX3VuY29uc3VtZVNldmVyYWwgPSBmdW5jdGlvbiAoY291bnQpIHtcclxuICAgIHdoaWxlIChjb3VudC0tKVxyXG4gICAgICAgIHRoaXMuX3VuY29uc3VtZSgpO1xyXG59O1xyXG5cclxuVG9rZW5pemVyLnByb3RvdHlwZS5fcmVjb25zdW1lSW5TdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgdGhpcy5fdW5jb25zdW1lKCk7XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lU3Vic2VxdWVudElmTWF0Y2ggPSBmdW5jdGlvbiAocGF0dGVybiwgc3RhcnRDcCwgY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgdmFyIHJvbGxiYWNrUG9zID0gdGhpcy5jb25zdW1wdGlvblBvcyxcclxuICAgICAgICBpc01hdGNoID0gdHJ1ZSxcclxuICAgICAgICBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGgsXHJcbiAgICAgICAgcGF0dGVyblBvcyA9IDAsXHJcbiAgICAgICAgY3AgPSBzdGFydENwLFxyXG4gICAgICAgIHBhdHRlcm5DcCA9IHZvaWQgMDtcclxuXHJcbiAgICBmb3IgKDsgcGF0dGVyblBvcyA8IHBhdHRlcm5MZW5ndGg7IHBhdHRlcm5Qb3MrKykge1xyXG4gICAgICAgIGlmIChwYXR0ZXJuUG9zID4gMClcclxuICAgICAgICAgICAgY3AgPSB0aGlzLl9jb25zdW1lKCk7XHJcblxyXG4gICAgICAgIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICAgICAgaXNNYXRjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhdHRlcm5DcCA9IHBhdHRlcm5bcGF0dGVyblBvc107XHJcblxyXG4gICAgICAgIGlmIChjcCAhPT0gcGF0dGVybkNwICYmIChjYXNlU2Vuc2l0aXZlIHx8IGNwICE9PSB0b0FzY2lpTG93ZXJDb2RlUG9pbnQocGF0dGVybkNwKSkpIHtcclxuICAgICAgICAgICAgaXNNYXRjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc01hdGNoKVxyXG4gICAgICAgIHRoaXMuX3VuY29uc3VtZVNldmVyYWwodGhpcy5jb25zdW1wdGlvblBvcyAtIHJvbGxiYWNrUG9zKTtcclxuXHJcbiAgICByZXR1cm4gaXNNYXRjaDtcclxufTtcclxuXHJcbi8vTG9va2FoZWFkXHJcblRva2VuaXplci5wcm90b3R5cGUuX2xvb2thaGVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBjcCA9IHRoaXMucHJlcHJvY2Vzc29yLmFkdmFuY2VBbmRQZWVrQ29kZVBvaW50KCk7XHJcbiAgICB0aGlzLnByZXByb2Nlc3Nvci5yZXRyZWF0KCk7XHJcblxyXG4gICAgcmV0dXJuIGNwO1xyXG59O1xyXG5cclxuLy9UZW1wIGJ1ZmZlclxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLmlzVGVtcEJ1ZmZlckVxdWFsVG9TY3JpcHRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy50ZW1wQnVmZi5sZW5ndGggIT09ICQkLlNDUklQVF9TVFJJTkcubGVuZ3RoKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGVtcEJ1ZmYubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy50ZW1wQnVmZltpXSAhPT0gJCQuU0NSSVBUX1NUUklOR1tpXSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuLy9Ub2tlbiBjcmVhdGlvblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLmJ1aWxkU3RhcnRUYWdUb2tlbiA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFRva2VuaXplci5TVEFSVF9UQUdfVE9LRU4sXHJcbiAgICAgICAgdGFnTmFtZTogdGFnTmFtZSxcclxuICAgICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXHJcbiAgICAgICAgYXR0cnM6IFtdXHJcbiAgICB9O1xyXG59O1xyXG5cclxuVG9rZW5pemVyLnByb3RvdHlwZS5idWlsZEVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdHlwZTogVG9rZW5pemVyLkVORF9UQUdfVE9LRU4sXHJcbiAgICAgICAgdGFnTmFtZTogdGFnTmFtZSxcclxuICAgICAgICBpZ25vcmVkOiBmYWxzZSxcclxuICAgICAgICBhdHRyczogW11cclxuICAgIH07XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jcmVhdGVTdGFydFRhZ1Rva2VuID0gZnVuY3Rpb24gKHRhZ05hbWVGaXJzdENoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMuYnVpbGRTdGFydFRhZ1Rva2VuKHRhZ05hbWVGaXJzdENoKTtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX2NyZWF0ZUVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKHRhZ05hbWVGaXJzdENoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMuYnVpbGRFbmRUYWdUb2tlbih0YWdOYW1lRmlyc3RDaCk7XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jcmVhdGVDb21tZW50VG9rZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHtcclxuICAgICAgICB0eXBlOiBUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTixcclxuICAgICAgICBkYXRhOiAnJ1xyXG4gICAgfTtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX2NyZWF0ZURvY3R5cGVUb2tlbiA9IGZ1bmN0aW9uIChkb2N0eXBlTmFtZUZpcnN0Q2gpIHtcclxuICAgIHRoaXMuY3VycmVudFRva2VuID0ge1xyXG4gICAgICAgIHR5cGU6IFRva2VuaXplci5ET0NUWVBFX1RPS0VOLFxyXG4gICAgICAgIG5hbWU6IGRvY3R5cGVOYW1lRmlyc3RDaCB8fCAnJyxcclxuICAgICAgICBmb3JjZVF1aXJrczogZmFsc2UsXHJcbiAgICAgICAgcHVibGljSWQ6IG51bGwsXHJcbiAgICAgICAgc3lzdGVtSWQ6IG51bGxcclxuICAgIH07XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jcmVhdGVDaGFyYWN0ZXJUb2tlbiA9IGZ1bmN0aW9uICh0eXBlLCBjaCkge1xyXG4gICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSB7XHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBjaGFyczogY2hcclxuICAgIH07XHJcbn07XHJcblxyXG4vL1RhZyBhdHRyaWJ1dGVzXHJcblRva2VuaXplci5wcm90b3R5cGUuX2NyZWF0ZUF0dHIgPSBmdW5jdGlvbiAoYXR0ck5hbWVGaXJzdENoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRBdHRyID0ge1xyXG4gICAgICAgIG5hbWU6IGF0dHJOYW1lRmlyc3RDaCxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgIH07XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9pc0R1cGxpY2F0ZUF0dHIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gVG9rZW5pemVyLmdldFRva2VuQXR0cih0aGlzLmN1cnJlbnRUb2tlbiwgdGhpcy5jdXJyZW50QXR0ci5uYW1lKSAhPT0gbnVsbDtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX2xlYXZlQXR0ck5hbWUgPSBmdW5jdGlvbiAodG9TdGF0ZSkge1xyXG4gICAgdGhpcy5zdGF0ZSA9IHRvU3RhdGU7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc0R1cGxpY2F0ZUF0dHIoKSlcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5hdHRycy5wdXNoKHRoaXMuY3VycmVudEF0dHIpO1xyXG59O1xyXG5cclxuLy9BcHByb3ByaWF0ZSBlbmQgdGFnIHRva2VuXHJcbi8vKHNlZTogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdG9rZW5pemF0aW9uLmh0bWwjYXBwcm9wcmlhdGUtZW5kLXRhZy10b2tlbilcclxuVG9rZW5pemVyLnByb3RvdHlwZS5faXNBcHByb3ByaWF0ZUVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9PT0gdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZTtcclxufTtcclxuXHJcbi8vVG9rZW4gZW1pc3Npb25cclxuVG9rZW5pemVyLnByb3RvdHlwZS5fZW1pdEN1cnJlbnRUb2tlbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4oKTtcclxuXHJcbiAgICAvL05PVEU6IHN0b3JlIGVtaXRlZCBzdGFydCB0YWcncyB0YWdOYW1lIHRvIGRldGVybWluZSBpcyB0aGUgZm9sbG93aW5nIGVuZCB0YWcgdG9rZW4gaXMgYXBwcm9wcmlhdGUuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTilcclxuICAgICAgICB0aGlzLmxhc3RTdGFydFRhZ05hbWUgPSB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lO1xyXG5cclxuICAgIHRoaXMudG9rZW5RdWV1ZS5wdXNoKHRoaXMuY3VycmVudFRva2VuKTtcclxuICAgIHRoaXMuY3VycmVudFRva2VuID0gbnVsbDtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4pIHtcclxuICAgICAgICB0aGlzLnRva2VuUXVldWUucHVzaCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBudWxsO1xyXG4gICAgfVxyXG59O1xyXG5cclxuVG9rZW5pemVyLnByb3RvdHlwZS5fZW1pdEVPRlRva2VuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5fZW1pdEN1cnJlbnRDaGFyYWN0ZXJUb2tlbigpO1xyXG4gICAgdGhpcy50b2tlblF1ZXVlLnB1c2goe3R5cGU6IFRva2VuaXplci5FT0ZfVE9LRU59KTtcclxufTtcclxuXHJcbi8vQ2hhcmFjdGVycyBlbWlzc2lvblxyXG5cclxuLy9PUFRJTUlaQVRJT046IHNwZWNpZmljYXRpb24gdXNlcyBvbmx5IG9uZSB0eXBlIG9mIGNoYXJhY3RlciB0b2tlbnMgKG9uZSB0b2tlbiBwZXIgY2hhcmFjdGVyKS5cclxuLy9UaGlzIGNhdXNlcyBhIGh1Z2UgbWVtb3J5IG92ZXJoZWFkIGFuZCBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBwYXJzZXIgbG9vcHMuIHBhcnNlNSB1c2VzIDMgZ3JvdXBzIG9mIGNoYXJhY3RlcnMuXHJcbi8vSWYgd2UgaGF2ZSBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgZ3JvdXAsIHBhcnNlciBjYW4gcHJvY2VzcyBpdFxyXG4vL2FzIGEgc2luZ2xlIHNvbGlkIGNoYXJhY3RlciB0b2tlbi5cclxuLy9TbywgdGhlcmUgYXJlIDMgdHlwZXMgb2YgY2hhcmFjdGVyIHRva2VucyBpbiBwYXJzZTU6XHJcbi8vMSlOVUxMX0NIQVJBQ1RFUl9UT0tFTiAtIFxcdTAwMDAtY2hhcmFjdGVyIHNlcXVlbmNlcyAoZS5nLiAnXFx1MDAwMFxcdTAwMDBcXHUwMDAwJylcclxuLy8yKVdISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOIC0gYW55IHdoaXRlc3BhY2UvbmV3LWxpbmUgY2hhcmFjdGVyIHNlcXVlbmNlcyAoZS5nLiAnXFxuICBcXHJcXHQgICBcXGYnKVxyXG4vLzMpQ0hBUkFDVEVSX1RPS0VOIC0gYW55IGNoYXJhY3RlciBzZXF1ZW5jZSB3aGljaCBkb24ndCBiZWxvbmcgdG8gZ3JvdXBzIDEgYW5kIDIgKGUuZy4gJ2FiY2RlZjEyMzRAQCMkJV4nKVxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9hcHBlbmRDaGFyVG9DdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBmdW5jdGlvbiAodHlwZSwgY2gpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbiAmJiB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbi50eXBlICE9PSB0eXBlKVxyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4oKTtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4pXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4uY2hhcnMgKz0gY2g7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUNoYXJhY3RlclRva2VuKHR5cGUsIGNoKTtcclxufTtcclxuXHJcblRva2VuaXplci5wcm90b3R5cGUuX2VtaXRDb2RlUG9pbnQgPSBmdW5jdGlvbiAoY3ApIHtcclxuICAgIHZhciB0eXBlID0gVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTjtcclxuXHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICB0eXBlID0gVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdHlwZSA9IFRva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTjtcclxuXHJcbiAgICB0aGlzLl9hcHBlbmRDaGFyVG9DdXJyZW50Q2hhcmFjdGVyVG9rZW4odHlwZSwgdG9DaGFyKGNwKSk7XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9lbWl0U2V2ZXJhbENvZGVQb2ludHMgPSBmdW5jdGlvbiAoY29kZVBvaW50cykge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY29kZVBvaW50c1tpXSk7XHJcbn07XHJcblxyXG4vL05PVEU6IHVzZWQgdGhlbiB3ZSBlbWl0IGNoYXJhY3RlciBleHBsaWNpdGx5LiBUaGlzIGlzIGFsd2F5cyBhIG5vbi13aGl0ZXNwYWNlIGFuZCBhIG5vbi1udWxsIGNoYXJhY3Rlci5cclxuLy9TbyB3ZSBjYW4gYXZvaWQgYWRkaXRpb25hbCBjaGVja3MgaGVyZS5cclxuVG9rZW5pemVyLnByb3RvdHlwZS5fZW1pdENoYXIgPSBmdW5jdGlvbiAoY2gpIHtcclxuICAgIHRoaXMuX2FwcGVuZENoYXJUb0N1cnJlbnRDaGFyYWN0ZXJUb2tlbihUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOLCBjaCk7XHJcbn07XHJcblxyXG4vL0NoYXJhY3RlciByZWZlcmVuY2UgdG9rZW5pemF0aW9uXHJcblRva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVOdW1lcmljRW50aXR5ID0gZnVuY3Rpb24gKGlzSGV4KSB7XHJcbiAgICB2YXIgZGlnaXRzID0gJycsXHJcbiAgICAgICAgbmV4dENwID0gdm9pZCAwO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBkaWdpdHMgKz0gdG9DaGFyKHRoaXMuX2NvbnN1bWUoKSk7XHJcbiAgICAgICAgbmV4dENwID0gdGhpcy5fbG9va2FoZWFkKCk7XHJcbiAgICB9IHdoaWxlIChuZXh0Q3AgIT09ICQuRU9GICYmIGlzRGlnaXQobmV4dENwLCBpc0hleCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9sb29rYWhlYWQoKSA9PT0gJC5TRU1JQ09MT04pXHJcbiAgICAgICAgdGhpcy5fY29uc3VtZSgpO1xyXG5cclxuICAgIHZhciByZWZlcmVuY2VkQ3AgPSBwYXJzZUludChkaWdpdHMsIGlzSGV4ID8gMTYgOiAxMCksXHJcbiAgICAgICAgcmVwbGFjZW1lbnQgPSBOVU1FUklDX0VOVElUWV9SRVBMQUNFTUVOVFNbcmVmZXJlbmNlZENwXTtcclxuXHJcbiAgICBpZiAocmVwbGFjZW1lbnQpXHJcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xyXG5cclxuICAgIGlmIChpc1Jlc2VydmVkQ29kZVBvaW50KHJlZmVyZW5jZWRDcCkpXHJcbiAgICAgICAgcmV0dXJuICQuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG5cclxuICAgIHJldHVybiByZWZlcmVuY2VkQ3A7XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lTmFtZWRFbnRpdHkgPSBmdW5jdGlvbiAoc3RhcnRDcCwgaW5BdHRyKSB7XHJcbiAgICB2YXIgcmVmZXJlbmNlZENvZGVQb2ludHMgPSBudWxsLFxyXG4gICAgICAgIGVudGl0eUNvZGVQb2ludHNDb3VudCA9IDAsXHJcbiAgICAgICAgY3AgPSBzdGFydENwLFxyXG4gICAgICAgIGxlYWYgPSBOQU1FRF9FTlRJVFlfVFJJRVtjcF0sXHJcbiAgICAgICAgY29uc3VtZWRDb3VudCA9IDEsXHJcbiAgICAgICAgc2VtaWNvbG9uVGVybWluYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAoOyBsZWFmICYmIGNwICE9PSAkLkVPRjsgY3AgPSB0aGlzLl9jb25zdW1lKCksIGNvbnN1bWVkQ291bnQrKywgbGVhZiA9IGxlYWYubCAmJiBsZWFmLmxbY3BdKSB7XHJcbiAgICAgICAgaWYgKGxlYWYuYykge1xyXG4gICAgICAgICAgICAvL05PVEU6IHdlIGhhdmUgYXQgbGVhc3Qgb25lIG5hbWVkIHJlZmVyZW5jZSBtYXRjaC4gQnV0IHdlIGRvbid0IHN0b3AgbG9va3VwIGF0IHRoaXMgcG9pbnQsXHJcbiAgICAgICAgICAgIC8vYmVjYXVzZSBsb25nZXIgbWF0Y2hlcyBzdGlsbCBjYW4gYmUgZm91bmQgKGUuZy4gJyZub3QnIGFuZCAnJm5vdGluOycpIGV4Y2VwdCB0aGUgY2FzZVxyXG4gICAgICAgICAgICAvL3RoZW4gZm91bmQgbWF0Y2ggaXMgdGVybWluYXRlZCBieSBzZW1pY29sb24uXHJcbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb2RlUG9pbnRzID0gbGVhZi5jO1xyXG4gICAgICAgICAgICBlbnRpdHlDb2RlUG9pbnRzQ291bnQgPSBjb25zdW1lZENvdW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNwID09PSAkLlNFTUlDT0xPTikge1xyXG4gICAgICAgICAgICAgICAgc2VtaWNvbG9uVGVybWluYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVmZXJlbmNlZENvZGVQb2ludHMpIHtcclxuICAgICAgICBpZiAoIXNlbWljb2xvblRlcm1pbmF0ZWQpIHtcclxuICAgICAgICAgICAgLy9OT1RFOiB1bmNvbnN1bWUgZXhjZXNzIChlLmcuICdpdCcgaW4gJyZub3RpdCcpXHJcbiAgICAgICAgICAgIHRoaXMuX3VuY29uc3VtZVNldmVyYWwoY29uc3VtZWRDb3VudCAtIGVudGl0eUNvZGVQb2ludHNDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAvL05PVEU6IElmIHRoZSBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlzIGJlaW5nIGNvbnN1bWVkIGFzIHBhcnQgb2YgYW4gYXR0cmlidXRlIGFuZCB0aGUgbmV4dCBjaGFyYWN0ZXJcclxuICAgICAgICAgICAgLy9pcyBlaXRoZXIgYSBVKzAwM0QgRVFVQUxTIFNJR04gY2hhcmFjdGVyICg9KSBvciBhbiBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVyLCB0aGVuLCBmb3IgaGlzdG9yaWNhbFxyXG4gICAgICAgICAgICAvL3JlYXNvbnMsIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IHdlcmUgbWF0Y2hlZCBhZnRlciB0aGUgVSswMDI2IEFNUEVSU0FORCBjaGFyYWN0ZXIgKCYpIG11c3QgYmVcclxuICAgICAgICAgICAgLy91bmNvbnN1bWVkLCBhbmQgbm90aGluZyBpcyByZXR1cm5lZC5cclxuICAgICAgICAgICAgLy9Ib3dldmVyLCBpZiB0aGlzIG5leHQgY2hhcmFjdGVyIGlzIGluIGZhY3QgYSBVKzAwM0QgRVFVQUxTIFNJR04gY2hhcmFjdGVyICg9KSwgdGhlbiB0aGlzIGlzIGFcclxuICAgICAgICAgICAgLy9wYXJzZSBlcnJvciwgYmVjYXVzZSBzb21lIGxlZ2FjeSB1c2VyIGFnZW50cyB3aWxsIG1pc2ludGVycHJldCB0aGUgbWFya3VwIGluIHRob3NlIGNhc2VzLlxyXG4gICAgICAgICAgICAvLyhzZWU6IGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3Rva2VuaXphdGlvbi5odG1sI3Rva2VuaXppbmctY2hhcmFjdGVyLXJlZmVyZW5jZXMpXHJcbiAgICAgICAgICAgIGlmIChpbkF0dHIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuZXh0Q3AgPSB0aGlzLl9sb29rYWhlYWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dENwID09PSAkLkVRVUFMU19TSUdOIHx8IGlzQXNjaWlBbHBoYU51bWVyaWMobmV4dENwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuY29uc3VtZVNldmVyYWwoZW50aXR5Q29kZVBvaW50c0NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRDb2RlUG9pbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3VuY29uc3VtZVNldmVyYWwoY29uc3VtZWRDb3VudCk7XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lQ2hhcmFjdGVyUmVmZXJlbmNlID0gZnVuY3Rpb24gKHN0YXJ0Q3AsIGluQXR0cikge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZUVudGl0aWVzRGVjb2RpbmcgfHwgaXNXaGl0ZXNwYWNlKHN0YXJ0Q3ApIHx8IHN0YXJ0Q3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04gfHxcclxuICAgICAgICBzdGFydENwID09PSAkLkFNUEVSU0FORCB8fCBzdGFydENwID09PSB0aGlzLmFkZGl0aW9uYWxBbGxvd2VkQ3AgfHwgc3RhcnRDcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICAvL05PVEU6IG5vdCBhIGNoYXJhY3RlciByZWZlcmVuY2UuIE5vIGNoYXJhY3RlcnMgYXJlIGNvbnN1bWVkLCBhbmQgbm90aGluZyBpcyByZXR1cm5lZC5cclxuICAgICAgICB0aGlzLl91bmNvbnN1bWUoKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChzdGFydENwID09PSAkLk5VTUJFUl9TSUdOKSB7XHJcbiAgICAgICAgLy9OT1RFOiB3ZSBoYXZlIGEgbnVtZXJpYyBlbnRpdHkgY2FuZGlkYXRlLCBub3cgd2Ugc2hvdWxkIGRldGVybWluZSBpZiBpdCdzIGhleCBvciBkZWNpbWFsXHJcbiAgICAgICAgdmFyIGlzSGV4ID0gZmFsc2UsXHJcbiAgICAgICAgICAgIG5leHRDcCA9IHRoaXMuX2xvb2thaGVhZCgpO1xyXG5cclxuICAgICAgICBpZiAobmV4dENwID09PSAkLkxBVElOX1NNQUxMX1ggfHwgbmV4dENwID09PSAkLkxBVElOX0NBUElUQUxfWCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb25zdW1lKCk7XHJcbiAgICAgICAgICAgIGlzSGV4ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5leHRDcCA9IHRoaXMuX2xvb2thaGVhZCgpO1xyXG5cclxuICAgICAgICAvL05PVEU6IGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGRpZ2l0IHRoaXMgaXMgYSBudW1lcmljIGVudGl0eSBmb3Igc3VyZSwgc28gd2UgY29uc3VtZSBpdFxyXG4gICAgICAgIGlmIChuZXh0Q3AgIT09ICQuRU9GICYmIGlzRGlnaXQobmV4dENwLCBpc0hleCkpXHJcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5fY29uc3VtZU51bWVyaWNFbnRpdHkoaXNIZXgpXTtcclxuXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTk9URTogb3RoZXJ3aXNlIHRoaXMgaXMgYSBib2d1cyBudW1iZXIgZW50aXR5IGFuZCBhIHBhcnNlIGVycm9yLiBVbmNvbnN1bWUgdGhlIG51bWJlciBzaWduXHJcbiAgICAgICAgICAgIC8vYW5kIHRoZSAneCctY2hhcmFjdGVyIGlmIGFwcHJvcHJpYXRlLlxyXG4gICAgICAgICAgICB0aGlzLl91bmNvbnN1bWVTZXZlcmFsKGlzSGV4ID8gMiA6IDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdW1lTmFtZWRFbnRpdHkoc3RhcnRDcCwgaW5BdHRyKTtcclxufTtcclxuXHJcbi8vU3RhdGUgbWFjaGluZVxyXG52YXIgXyA9IFRva2VuaXplci5wcm90b3R5cGU7XHJcblxyXG4vLzEyLjIuNC4xIERhdGEgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tEQVRBX1NUQVRFXSA9IGZ1bmN0aW9uIGRhdGFTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkFNUEVSU0FORClcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9EQVRBX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBUQUdfT1BFTl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMiBDaGFyYWN0ZXIgcmVmZXJlbmNlIGluIGRhdGEgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0RBVEFfU1RBVEVdID0gZnVuY3Rpb24gY2hhcmFjdGVyUmVmZXJlbmNlSW5EYXRhU3RhdGUoY3ApIHtcclxuICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgdGhpcy5hZGRpdGlvbmFsQWxsb3dlZENwID0gdm9pZCAwO1xyXG5cclxuICAgIHZhciByZWZlcmVuY2VkQ29kZVBvaW50cyA9IHRoaXMuX2NvbnN1bWVDaGFyYWN0ZXJSZWZlcmVuY2UoY3AsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAocmVmZXJlbmNlZENvZGVQb2ludHMpXHJcbiAgICAgICAgdGhpcy5fZW1pdFNldmVyYWxDb2RlUG9pbnRzKHJlZmVyZW5jZWRDb2RlUG9pbnRzKTtcclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignJicpO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjMgUkNEQVRBIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bUkNEQVRBX1NUQVRFXSA9IGZ1bmN0aW9uIHJjZGF0YVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuQU1QRVJTQU5EKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFSQUNURVJfUkVGRVJFTkNFX0lOX1JDREFUQV9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTilcclxuICAgICAgICB0aGlzLnN0YXRlID0gUkNEQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNCBDaGFyYWN0ZXIgcmVmZXJlbmNlIGluIFJDREFUQSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0NIQVJBQ1RFUl9SRUZFUkVOQ0VfSU5fUkNEQVRBX1NUQVRFXSA9IGZ1bmN0aW9uIGNoYXJhY3RlclJlZmVyZW5jZUluUmNkYXRhU3RhdGUoY3ApIHtcclxuICAgIHRoaXMuc3RhdGUgPSBSQ0RBVEFfU1RBVEU7XHJcbiAgICB0aGlzLmFkZGl0aW9uYWxBbGxvd2VkQ3AgPSB2b2lkIDA7XHJcblxyXG4gICAgdmFyIHJlZmVyZW5jZWRDb2RlUG9pbnRzID0gdGhpcy5fY29uc3VtZUNoYXJhY3RlclJlZmVyZW5jZShjcCwgZmFsc2UpO1xyXG5cclxuICAgIGlmIChyZWZlcmVuY2VkQ29kZVBvaW50cylcclxuICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHMocmVmZXJlbmNlZENvZGVQb2ludHMpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcmJyk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNSBSQVdURVhUIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bUkFXVEVYVF9TVEFURV0gPSBmdW5jdGlvbiByYXd0ZXh0U3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTilcclxuICAgICAgICB0aGlzLnN0YXRlID0gUkFXVEVYVF9MRVNTX1RIQU5fU0lHTl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpXHJcbiAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjYgU2NyaXB0IGRhdGEgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTilcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfTEVTU19USEFOX1NJR05fU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTClcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC43IFBMQUlOVEVYVCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1BMQUlOVEVYVF9TVEFURV0gPSBmdW5jdGlvbiBwbGFpbnRleHRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuOCBUYWcgb3BlbiBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1RBR19PUEVOX1NUQVRFXSA9IGZ1bmN0aW9uIHRhZ09wZW5TdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkVYQ0xBTUFUSU9OX01BUkspXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1BUktVUF9ERUNMQVJBVElPTl9PUEVOX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLlNPTElEVVMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEVORF9UQUdfT1BFTl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlU3RhcnRUYWdUb2tlbih0b0FzY2lpTG93ZXJDaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRBR19OQU1FX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGlzQXNjaWlMb3dlcihjcCkpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVTdGFydFRhZ1Rva2VuKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBUQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5RVUVTVElPTl9NQVJLKSB7XHJcbiAgICAgICAgLy9OT1RFOiBjYWxsIGJvZ3VzIGNvbW1lbnQgc3RhdGUgZGlyZWN0bHkgd2l0aCBjdXJyZW50IGNvbnN1bWVkIGNoYXJhY3RlciB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNvbnN1bXB0aW9uLlxyXG4gICAgICAgIHRoaXNbQk9HVVNfQ09NTUVOVF9TVEFURV0oY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC45IEVuZCB0YWcgb3BlbiBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0VORF9UQUdfT1BFTl9TVEFURV0gPSBmdW5jdGlvbiBlbmRUYWdPcGVuU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4odG9Bc2NpaUxvd2VyQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBUQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4odG9DaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRBR19OQU1FX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJzwnKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLycpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vTk9URTogY2FsbCBib2d1cyBjb21tZW50IHN0YXRlIGRpcmVjdGx5IHdpdGggY3VycmVudCBjb25zdW1lZCBjaGFyYWN0ZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVjb25zdW1wdGlvbi5cclxuICAgICAgICB0aGlzW0JPR1VTX0NPTU1FTlRfU1RBVEVdKGNwKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4xMCBUYWcgbmFtZSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1RBR19OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIHRhZ05hbWVTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5TT0xJRFVTKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGlzQXNjaWlVcHBlcihjcCkpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0FzY2lpTG93ZXJDaGFyKGNwKTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4xMSBSQ0RBVEEgbGVzcy10aGFuIHNpZ24gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tSQ0RBVEFfTEVTU19USEFOX1NJR05fU1RBVEVdID0gZnVuY3Rpb24gcmNkYXRhTGVzc1RoYW5TaWduU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBSQ0RBVEFfRU5EX1RBR19PUEVOX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQ0RBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjEyIFJDREFUQSBlbmQgdGFnIG9wZW4gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tSQ0RBVEFfRU5EX1RBR19PUEVOX1NUQVRFXSA9IGZ1bmN0aW9uIHJjZGF0YUVuZFRhZ09wZW5TdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzQXNjaWlVcHBlcihjcCkpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVFbmRUYWdUb2tlbih0b0FzY2lpTG93ZXJDaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gUkNEQVRBX0VORF9UQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4odG9DaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gUkNEQVRBX0VORF9UQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcvJyk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQ0RBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjEzIFJDREFUQSBlbmQgdGFnIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tSQ0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIHJjZGF0YUVuZFRhZ05hbWVTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzQXNjaWlVcHBlcihjcCkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChjcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaUxvd2VyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdG9DaGFyKGNwKTtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0FwcHJvcHJpYXRlRW5kVGFnVG9rZW4oKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcvJyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdFNldmVyYWxDb2RlUG9pbnRzKHRoaXMudGVtcEJ1ZmYpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoUkNEQVRBX1NUQVRFKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4xNCBSQVdURVhUIGxlc3MtdGhhbiBzaWduIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bUkFXVEVYVF9MRVNTX1RIQU5fU0lHTl9TVEFURV0gPSBmdW5jdGlvbiByYXd0ZXh0TGVzc1RoYW5TaWduU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBSQVdURVhUX0VORF9UQUdfT1BFTl9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoUkFXVEVYVF9TVEFURSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMTUgUkFXVEVYVCBlbmQgdGFnIG9wZW4gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tSQVdURVhUX0VORF9UQUdfT1BFTl9TVEFURV0gPSBmdW5jdGlvbiByYXd0ZXh0RW5kVGFnT3BlblN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUVuZFRhZ1Rva2VuKHRvQXNjaWlMb3dlckNoYXIoY3ApKTtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBSQVdURVhUX0VORF9UQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4odG9DaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gUkFXVEVYVF9FTkRfVEFHX05BTUVfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJzwnKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLycpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoUkFXVEVYVF9TVEFURSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMTYgUkFXVEVYVCBlbmQgdGFnIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tSQVdURVhUX0VORF9UQUdfTkFNRV9TVEFURV0gPSBmdW5jdGlvbiByYXd0ZXh0RW5kVGFnTmFtZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdG9Bc2NpaUxvd2VyQ2hhcihjcCk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChjcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQXBwcm9wcmlhdGVFbmRUYWdUb2tlbigpKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0FUVFJJQlVURV9OQU1FX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNFTEZfQ0xPU0lOR19TVEFSVF9UQUdfU1RBVEU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJy8nKTtcclxuICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHModGhpcy50ZW1wQnVmZik7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQVdURVhUX1NUQVRFKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4xNyBTY3JpcHQgZGF0YSBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFMZXNzVGhhblNpZ25TdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmID0gW107XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VORF9UQUdfT1BFTl9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FWENMQU1BVElPTl9NQVJLKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCchJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJzwnKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX1NUQVRFKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4xOCBTY3JpcHQgZGF0YSBlbmQgdGFnIG9wZW4gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5fU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YUVuZFRhZ09wZW5TdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzQXNjaWlVcHBlcihjcCkpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVFbmRUYWdUb2tlbih0b0FzY2lpTG93ZXJDaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGlzQXNjaWlMb3dlcihjcCkpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVFbmRUYWdUb2tlbih0b0NoYXIoY3ApKTtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FTkRfVEFHX05BTUVfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJzwnKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLycpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjE5IFNjcmlwdCBkYXRhIGVuZCB0YWcgbmFtZSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0VORF9UQUdfTkFNRV9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhRW5kVGFnTmFtZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdG9Bc2NpaUxvd2VyQ2hhcihjcCk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChjcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQXBwcm9wcmlhdGVFbmRUYWdUb2tlbigpKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0FUVFJJQlVURV9OQU1FX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcvJyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdFNldmVyYWxDb2RlUG9pbnRzKHRoaXMudGVtcEJ1ZmYpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjIwIFNjcmlwdCBkYXRhIGVzY2FwZSBzdGFydCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhRXNjYXBlU3RhcnRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVfU1RBUlRfREFTSF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX1NUQVRFKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4yMSBTY3JpcHQgZGF0YSBlc2NhcGUgc3RhcnQgZGFzaCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFFc2NhcGVTdGFydERhc2hTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX1NUQVRFKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4yMiBTY3JpcHQgZGF0YSBlc2NhcGVkIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhRXNjYXBlZFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4yMyBTY3JpcHQgZGF0YSBlc2NhcGVkIGRhc2ggc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YUVzY2FwZWREYXNoU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX0RBU0hfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJy0nKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTilcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjI0IFNjcmlwdCBkYXRhIGVzY2FwZWQgZGFzaCBkYXNoIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX0RBU0hfU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKVxyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCctJyk7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJz4nKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjI1IFNjcmlwdCBkYXRhIGVzY2FwZWQgbGVzcy10aGFuIHNpZ24gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTl9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaCh0b0FzY2lpTG93ZXJDb2RlUG9pbnQoY3ApKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9TVEFSVF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGlzQXNjaWlMb3dlcihjcCkpIHtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmID0gW107XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9TVEFSVF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFKTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4yNiBTY3JpcHQgZGF0YSBlc2NhcGVkIGVuZCB0YWcgb3BlbiBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0VTQ0FQRURfRU5EX1RBR19PUEVOX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFFc2NhcGVkRW5kVGFnT3BlblN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUVuZFRhZ1Rva2VuKHRvQXNjaWlMb3dlckNoYXIoY3ApKTtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4odG9DaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX05BTUVfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJzwnKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLycpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMjcgU2NyaXB0IGRhdGEgZXNjYXBlZCBlbmQgdGFnIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWVTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzQXNjaWlVcHBlcihjcCkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChjcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaUxvd2VyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdG9DaGFyKGNwKTtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0FwcHJvcHJpYXRlRW5kVGFnVG9rZW4oKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcvJyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdFNldmVyYWxDb2RlUG9pbnRzKHRoaXMudGVtcEJ1ZmYpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMjggU2NyaXB0IGRhdGEgZG91YmxlIGVzY2FwZSBzdGFydCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfU1RBUlRfU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0U3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApIHx8IGNwID09PSAkLlNPTElEVVMgfHwgY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5pc1RlbXBCdWZmZXJFcXVhbFRvU2NyaXB0U3RyaW5nKCkgPyBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9TVEFURSA6IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaCh0b0FzY2lpTG93ZXJDb2RlUG9pbnQoY3ApKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4yOSBTY3JpcHQgZGF0YSBkb3VibGUgZXNjYXBlZCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTClcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjMwIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGRhc2ggc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX1NUQVRFXSA9IGZ1bmN0aW9uIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc8Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjMxIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGRhc2ggZGFzaCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURV0gPSBmdW5jdGlvbiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hEYXNoU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpXHJcbiAgICAgICAgdGhpcy5fZW1pdENoYXIoJy0nKTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcignPCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCc+Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q2hhcihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjMyIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGxlc3MtdGhhbiBzaWduIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmID0gW107XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfRU5EX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDaGFyKCcvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEUpO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjMzIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGUgZW5kIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEVdID0gZnVuY3Rpb24gc2NyaXB0RGF0YURvdWJsZUVzY2FwZUVuZFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSB8fCBjcCA9PT0gJC5TT0xJRFVTIHx8IGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuaXNUZW1wQnVmZmVyRXF1YWxUb1NjcmlwdFN0cmluZygpID8gU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURSA6IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xyXG5cclxuICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XHJcbiAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKHRvQXNjaWlMb3dlckNvZGVQb2ludChjcCkpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGlzQXNjaWlMb3dlcihjcCkpIHtcclxuICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4zNCBCZWZvcmUgYXR0cmlidXRlIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEVdID0gZnVuY3Rpb24gYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGNwID09PSAkLlNPTElEVVMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNFTEZfQ0xPU0lOR19TVEFSVF9UQUdfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIodG9Bc2NpaUxvd2VyQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlQXR0cihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFUVFJJQlVURV9OQU1FX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLIHx8IGNwID09PSAkLkFQT1NUUk9QSEUgfHwgY3AgPT09ICQuTEVTU19USEFOX1NJR04gfHwgY3AgPT09ICQuRVFVQUxTX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVBdHRyKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpXHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVBdHRyKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4zNSBBdHRyaWJ1dGUgbmFtZSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0FUVFJJQlVURV9OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIGF0dHJpYnV0ZU5hbWVTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgdGhpcy5fbGVhdmVBdHRyTmFtZShBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuU09MSURVUylcclxuICAgICAgICB0aGlzLl9sZWF2ZUF0dHJOYW1lKFNFTEZfQ0xPU0lOR19TVEFSVF9UQUdfU1RBVEUpO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVRVUFMU19TSUdOKVxyXG4gICAgICAgIHRoaXMuX2xlYXZlQXR0ck5hbWUoQkVGT1JFX0FUVFJJQlVURV9WQUxVRV9TVEFURSk7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9sZWF2ZUF0dHJOYW1lKERBVEFfU1RBVEUpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIubmFtZSArPSB0b0FzY2lpTG93ZXJDaGFyKGNwKTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSyB8fCBjcCA9PT0gJC5BUE9TVFJPUEhFIHx8IGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIubmFtZSArPSB0b0NoYXIoY3ApO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXR0ci5uYW1lICs9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLm5hbWUgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4zNiBBZnRlciBhdHRyaWJ1dGUgbmFtZSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0FGVEVSX0FUVFJJQlVURV9OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIGFmdGVyQXR0cmlidXRlTmFtZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGNwID09PSAkLlNPTElEVVMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNFTEZfQ0xPU0lOR19TVEFSVF9UQUdfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRVFVQUxTX1NJR04pXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfVkFMVUVfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIodG9Bc2NpaUxvd2VyQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlQXR0cihVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFUVFJJQlVURV9OQU1FX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLIHx8IGNwID09PSAkLkFQT1NUUk9QSEUgfHwgY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVBdHRyKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpXHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVBdHRyKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4zNyBCZWZvcmUgYXR0cmlidXRlIHZhbHVlIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQkVGT1JFX0FUVFJJQlVURV9WQUxVRV9TVEFURV0gPSBmdW5jdGlvbiBiZWZvcmVBdHRyaWJ1dGVWYWx1ZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5BTVBFUlNBTkQpXHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShBVFRSSUJVVEVfVkFMVUVfVU5RVU9URURfU1RBVEUpO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFUVFJJQlVURV9WQUxVRV9TSU5HTEVfUVVPVEVEX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfVU5RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04gfHwgY3AgPT09ICQuRVFVQUxTX1NJR04gfHwgY3AgPT09ICQuR1JBVkVfQUNDRU5UKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfVU5RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfVU5RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuMzggQXR0cmlidXRlIHZhbHVlIChkb3VibGUtcXVvdGVkKSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0FUVFJJQlVURV9WQUxVRV9ET1VCTEVfUVVPVEVEX1NUQVRFXSA9IGZ1bmN0aW9uIGF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSylcclxuICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfQVRUUklCVVRFX1ZBTFVFX1FVT1RFRF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5BTVBFUlNBTkQpIHtcclxuICAgICAgICB0aGlzLmFkZGl0aW9uYWxBbGxvd2VkQ3AgPSAkLlFVT1RBVElPTl9NQVJLO1xyXG4gICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0FUVFJJQlVURV9WQUxVRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC4zOSBBdHRyaWJ1dGUgdmFsdWUgKHNpbmdsZS1xdW90ZWQpIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEVdID0gZnVuY3Rpb24gYXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZWRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URURfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuQU1QRVJTQU5EKSB7XHJcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsQWxsb3dlZENwID0gJC5BUE9TVFJPUEhFO1xyXG4gICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFSQUNURVJfUkVGRVJFTkNFX0lOX0FUVFJJQlVURV9WQUxVRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKVxyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC40MCBBdHRyaWJ1dGUgdmFsdWUgKHVucXVvdGVkKSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0FUVFJJQlVURV9WQUxVRV9VTlFVT1RFRF9TVEFURV0gPSBmdW5jdGlvbiBhdHRyaWJ1dGVWYWx1ZVVucXVvdGVkU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuQU1QRVJTQU5EKSB7XHJcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsQWxsb3dlZENwID0gJC5HUkVBVEVSX1RIQU5fU0lHTjtcclxuICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9BVFRSSUJVVEVfVkFMVUVfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTClcclxuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLIHx8IGNwID09PSAkLkFQT1NUUk9QSEUgfHwgY3AgPT09ICQuTEVTU19USEFOX1NJR04gfHxcclxuICAgICAgICAgICAgIGNwID09PSAkLkVRVUFMU19TSUdOIHx8IGNwID09PSAkLkdSQVZFX0FDQ0VOVCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gdG9DaGFyKGNwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpXHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB0b0NoYXIoY3ApO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjQxIENoYXJhY3RlciByZWZlcmVuY2UgaW4gYXR0cmlidXRlIHZhbHVlIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQ0hBUkFDVEVSX1JFRkVSRU5DRV9JTl9BVFRSSUJVVEVfVkFMVUVfU1RBVEVdID0gZnVuY3Rpb24gY2hhcmFjdGVyUmVmZXJlbmNlSW5BdHRyaWJ1dGVWYWx1ZVN0YXRlKGNwKSB7XHJcbiAgICB2YXIgcmVmZXJlbmNlZENvZGVQb2ludHMgPSB0aGlzLl9jb25zdW1lQ2hhcmFjdGVyUmVmZXJlbmNlKGNwLCB0cnVlKTtcclxuXHJcbiAgICBpZiAocmVmZXJlbmNlZENvZGVQb2ludHMpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZmVyZW5jZWRDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHRvQ2hhcihyZWZlcmVuY2VkQ29kZVBvaW50c1tpXSk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9ICcmJztcclxuXHJcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5yZXR1cm5TdGF0ZTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC40MiBBZnRlciBhdHRyaWJ1dGUgdmFsdWUgKHF1b3RlZCkgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tBRlRFUl9BVFRSSUJVVEVfVkFMVUVfUVVPVEVEX1NUQVRFXSA9IGZ1bmN0aW9uIGFmdGVyQXR0cmlidXRlVmFsdWVRdW90ZWRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5TT0xJRFVTKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNDMgU2VsZi1jbG9zaW5nIHN0YXJ0IHRhZyBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW1NFTEZfQ0xPU0lOR19TVEFSVF9UQUdfU1RBVEVdID0gZnVuY3Rpb24gc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zZWxmQ2xvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRilcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNDQgQm9ndXMgY29tbWVudCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0JPR1VTX0NPTU1FTlRfU1RBVEVdID0gZnVuY3Rpb24gYm9ndXNDb21tZW50U3RhdGUoY3ApIHtcclxuICAgIHRoaXMuX2NyZWF0ZUNvbW1lbnRUb2tlbigpO1xyXG5cclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IGNwID09PSAkLk5VTEwgPyBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUiA6IHRvQ2hhcihjcCk7XHJcbiAgICAgICAgICAgIGNwID0gdGhpcy5fY29uc3VtZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNDUgTWFya3VwIGRlY2xhcmF0aW9uIG9wZW4gc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tNQVJLVVBfREVDTEFSQVRJT05fT1BFTl9TVEFURV0gPSBmdW5jdGlvbiBtYXJrdXBEZWNsYXJhdGlvbk9wZW5TdGF0ZShjcCkge1xyXG4gICAgaWYgKHRoaXMuX2NvbnN1bWVTdWJzZXF1ZW50SWZNYXRjaCgkJC5EQVNIX0RBU0hfU1RSSU5HLCBjcCwgdHJ1ZSkpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVDb21tZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9TVEFSVF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0aGlzLl9jb25zdW1lU3Vic2VxdWVudElmTWF0Y2goJCQuRE9DVFlQRV9TVFJJTkcsIGNwLCBmYWxzZSkpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAodGhpcy5hbGxvd0NEQVRBICYmIHRoaXMuX2NvbnN1bWVTdWJzZXF1ZW50SWZNYXRjaCgkJC5DREFUQV9TVEFSVF9TVFJJTkcsIGNwLCB0cnVlKSlcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ0RBVEFfU0VDVElPTl9TVEFURTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvL05PVEU6IGNhbGwgYm9ndXMgY29tbWVudCBzdGF0ZSBkaXJlY3RseSB3aXRoIGN1cnJlbnQgY29uc3VtZWQgY2hhcmFjdGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlY29uc3VtcHRpb24uXHJcbiAgICAgICAgdGhpc1tCT0dVU19DT01NRU5UX1NUQVRFXShjcCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNDYgQ29tbWVudCBzdGFydCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0NPTU1FTlRfU1RBUlRfU1RBVEVdID0gZnVuY3Rpb24gY29tbWVudFN0YXJ0U3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBUlRfREFTSF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IHRvQ2hhcihjcCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBVEU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNDcgQ29tbWVudCBzdGFydCBkYXNoIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQ09NTUVOVF9TVEFSVF9EQVNIX1NUQVRFXSA9IGZ1bmN0aW9uIGNvbW1lbnRTdGFydERhc2hTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUylcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9FTkRfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gJy0nO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLSc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX1NUQVRFO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjQ4IENvbW1lbnQgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tDT01NRU5UX1NUQVRFXSA9IGZ1bmN0aW9uIGNvbW1lbnRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUylcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9FTkRfREFTSF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC40OSBDb21tZW50IGVuZCBkYXNoIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQ09NTUVOVF9FTkRfREFTSF9TVEFURV0gPSBmdW5jdGlvbiBjb21tZW50RW5kRGFzaFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX0VORF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLSc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9ICctJztcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IHRvQ2hhcihjcCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBVEU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNTAgQ29tbWVudCBlbmQgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tDT01NRU5UX0VORF9TVEFURV0gPSBmdW5jdGlvbiBjb21tZW50RW5kU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FWENMQU1BVElPTl9NQVJLKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX0VORF9CQU5HX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUylcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9ICctJztcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0nO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0nO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gdG9DaGFyKGNwKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC41MSBDb21tZW50IGVuZCBiYW5nIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQ09NTUVOVF9FTkRfQkFOR19TVEFURV0gPSBmdW5jdGlvbiBjb21tZW50RW5kQmFuZ1N0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0hJztcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9FTkRfREFTSF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0hJztcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gJy0tISc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSB0b0NoYXIoY3ApO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX1NUQVRFO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjUyIERPQ1RZUEUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tET0NUWVBFX1NUQVRFXSA9IGZ1bmN0aW9uIGRvY3R5cGVTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9ET0NUWVBFX05BTUVfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJFRk9SRV9ET0NUWVBFX05BTUVfU1RBVEUpO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjUzIEJlZm9yZSBET0NUWVBFIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tCRUZPUkVfRE9DVFlQRV9OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIGJlZm9yZURvY3R5cGVOYW1lU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbih0b0FzY2lpTG93ZXJDaGFyKGNwKSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfTkFNRV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVEb2N0eXBlVG9rZW4oVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX05BTUVfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKHRvQ2hhcihjcCkpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX05BTUVfU1RBVEU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNTQgRE9DVFlQRSBuYW1lIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bRE9DVFlQRV9OQU1FX1NUQVRFXSA9IGZ1bmN0aW9uIGRvY3R5cGVOYW1lU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBRlRFUl9ET0NUWVBFX05BTUVfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSlcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5uYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ubmFtZSArPSBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLm5hbWUgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC41NSBBZnRlciBET0NUWVBFIG5hbWUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tBRlRFUl9ET0NUWVBFX05BTUVfU1RBVEVdID0gZnVuY3Rpb24gYWZ0ZXJEb2N0eXBlTmFtZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0aGlzLl9jb25zdW1lU3Vic2VxdWVudElmTWF0Y2goJCQuUFVCTElDX1NUUklORywgY3AsIGZhbHNlKSlcclxuICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfRE9DVFlQRV9QVUJMSUNfS0VZV09SRF9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmICh0aGlzLl9jb25zdW1lU3Vic2VxdWVudElmTWF0Y2goJCQuU1lTVEVNX1NUUklORywgY3AsIGZhbHNlKSlcclxuICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfRE9DVFlQRV9TWVNURU1fS0VZV09SRF9TVEFURTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJPR1VTX0RPQ1RZUEVfU1RBVEU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNTYgQWZ0ZXIgRE9DVFlQRSBwdWJsaWMga2V5d29yZCBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0FGVEVSX0RPQ1RZUEVfUFVCTElDX0tFWVdPUkRfU1RBVEVdID0gZnVuY3Rpb24gYWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSlcclxuICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkID0gJyc7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQk9HVVNfRE9DVFlQRV9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC41NyBCZWZvcmUgRE9DVFlQRSBwdWJsaWMgaWRlbnRpZmllciBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0JFRk9SRV9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NUQVRFXSA9IGZ1bmN0aW9uIGJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkID0gJyc7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQk9HVVNfRE9DVFlQRV9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC41OCBET0NUWVBFIHB1YmxpYyBpZGVudGlmaWVyIChkb3VibGUtcXVvdGVkKSBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURV0gPSBmdW5jdGlvbiBkb2N0eXBlUHVibGljSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFGVEVSX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTClcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCArPSBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCArPSB0b0NoYXIoY3ApO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjU5IERPQ1RZUEUgcHVibGljIGlkZW50aWZpZXIgKHNpbmdsZS1xdW90ZWQpIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFXSA9IGZ1bmN0aW9uIGRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBBRlRFUl9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NUQVRFO1xyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ucHVibGljSWQgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ucHVibGljSWQgKz0gdG9DaGFyKGNwKTtcclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC42MCBBZnRlciBET0NUWVBFIHB1YmxpYyBpZGVudGlmaWVyIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TVEFURV0gPSBmdW5jdGlvbiBhZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCRVRXRUVOX0RPQ1RZUEVfUFVCTElDX0FORF9TWVNURU1fSURFTlRJRklFUlNfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkID0gJyc7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCT0dVU19ET0NUWVBFX1NUQVRFO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjYxIEJldHdlZW4gRE9DVFlQRSBwdWJsaWMgYW5kIHN5c3RlbSBpZGVudGlmaWVycyBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0JFVFdFRU5fRE9DVFlQRV9QVUJMSUNfQU5EX1NZU1RFTV9JREVOVElGSUVSU19TVEFURV0gPSBmdW5jdGlvbiBiZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQk9HVVNfRE9DVFlQRV9TVEFURTtcclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vLzEyLjIuNC42MiBBZnRlciBET0NUWVBFIHN5c3RlbSBrZXl3b3JkIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQUZURVJfRE9DVFlQRV9TWVNURU1fS0VZV09SRF9TVEFURV0gPSBmdW5jdGlvbiBhZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkU3RhdGUoY3ApIHtcclxuICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSykge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkID0gJyc7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcclxuICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCT0dVU19ET0NUWVBFX1NUQVRFO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjYzIEJlZm9yZSBET0NUWVBFIHN5c3RlbSBpZGVudGlmaWVyIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bQkVGT1JFX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU1RBVEVdID0gZnVuY3Rpb24gYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSykge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkID0gJyc7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcclxuICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCT0dVU19ET0NUWVBFX1NUQVRFO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjY0IERPQ1RZUEUgc3lzdGVtIGlkZW50aWZpZXIgKGRvdWJsZS1xdW90ZWQpIHN0YXRlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbl9bRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFXSA9IGZ1bmN0aW9uIGRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUoY3ApIHtcclxuICAgIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSylcclxuICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURTtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuTlVMTClcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCArPSBVTklDT0RFLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkICs9IHRvQ2hhcihjcCk7XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNjUgRE9DVFlQRSBzeXN0ZW0gaWRlbnRpZmllciAoc2luZ2xlLXF1b3RlZCkgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEVdID0gZnVuY3Rpb24gZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZShjcCkge1xyXG4gICAgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEFGVEVSX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU1RBVEU7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKGNwID09PSAkLk5VTEwpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgKz0gVU5JQ09ERS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCArPSB0b0NoYXIoY3ApO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjY2IEFmdGVyIERPQ1RZUEUgc3lzdGVtIGlkZW50aWZpZXIgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NUQVRFXSA9IGZ1bmN0aW9uIGFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShjcCkge1xyXG4gICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xyXG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCT0dVU19ET0NUWVBFX1NUQVRFO1xyXG59O1xyXG5cclxuXHJcbi8vMTIuMi40LjY3IEJvZ3VzIERPQ1RZUEUgc3RhdGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuX1tCT0dVU19ET0NUWVBFX1NUQVRFXSA9IGZ1bmN0aW9uIGJvZ3VzRG9jdHlwZVN0YXRlKGNwKSB7XHJcbiAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcclxuICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XHJcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xyXG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREFUQV9TVEFURSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuLy8xMi4yLjQuNjggQ0RBVEEgc2VjdGlvbiBzdGF0ZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5fW0NEQVRBX1NFQ1RJT05fU1RBVEVdID0gZnVuY3Rpb24gY2RhdGFTZWN0aW9uU3RhdGUoY3ApIHtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgaWYgKGNwID09PSAkLkVPRikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKERBVEFfU1RBVEUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbnN1bWVTdWJzZXF1ZW50SWZNYXRjaCgkJC5DREFUQV9FTkRfU1RSSU5HLCBjcCwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xyXG4gICAgICAgICAgICBjcCA9IHRoaXMuX2NvbnN1bWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8vTm9kZSBjb25zdHJ1Y3Rpb25cclxuZXhwb3J0cy5jcmVhdGVEb2N1bWVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbm9kZU5hbWU6ICcjZG9jdW1lbnQnLFxyXG4gICAgICAgIHF1aXJrc01vZGU6IGZhbHNlLFxyXG4gICAgICAgIGNoaWxkTm9kZXM6IFtdXHJcbiAgICB9O1xyXG59O1xyXG5cclxuZXhwb3J0cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBub2RlTmFtZTogJyNkb2N1bWVudC1mcmFnbWVudCcsXHJcbiAgICAgICAgcXVpcmtzTW9kZTogZmFsc2UsXHJcbiAgICAgICAgY2hpbGROb2RlczogW11cclxuICAgIH07XHJcbn07XHJcblxyXG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZXNwYWNlVVJJLCBhdHRycykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBub2RlTmFtZTogdGFnTmFtZSxcclxuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxyXG4gICAgICAgIGF0dHJzOiBhdHRycyxcclxuICAgICAgICBuYW1lc3BhY2VVUkk6IG5hbWVzcGFjZVVSSSxcclxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcclxuICAgICAgICBwYXJlbnROb2RlOiBudWxsXHJcbiAgICB9O1xyXG59O1xyXG5cclxuZXhwb3J0cy5jcmVhdGVDb21tZW50Tm9kZSA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5vZGVOYW1lOiAnI2NvbW1lbnQnLFxyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgcGFyZW50Tm9kZTogbnVsbFxyXG4gICAgfTtcclxufTtcclxuXHJcbnZhciBjcmVhdGVUZXh0Tm9kZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBub2RlTmFtZTogJyN0ZXh0JyxcclxuICAgICAgICB2YWx1ZTogdmFsdWUsXHJcbiAgICAgICAgcGFyZW50Tm9kZTogbnVsbFxyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vVHJlZSBtdXRhdGlvblxyXG5leHBvcnRzLnNldERvY3VtZW50VHlwZSA9IGZ1bmN0aW9uIChkb2N1bWVudCwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSB7XHJcbiAgICB2YXIgZG9jdHlwZU5vZGUgPSBudWxsO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jdW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lID09PSAnI2RvY3VtZW50VHlwZScpIHtcclxuICAgICAgICAgICAgZG9jdHlwZU5vZGUgPSBkb2N1bWVudC5jaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRvY3R5cGVOb2RlKSB7XHJcbiAgICAgICAgZG9jdHlwZU5vZGUubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgZG9jdHlwZU5vZGUucHVibGljSWQgPSBwdWJsaWNJZDtcclxuICAgICAgICBkb2N0eXBlTm9kZS5zeXN0ZW1JZCA9IHN5c3RlbUlkO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGFwcGVuZENoaWxkKGRvY3VtZW50LCB7XHJcbiAgICAgICAgICAgIG5vZGVOYW1lOiAnI2RvY3VtZW50VHlwZScsXHJcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiBwdWJsaWNJZCxcclxuICAgICAgICAgICAgc3lzdGVtSWQ6IHN5c3RlbUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnRzLnNldFF1aXJrc01vZGUgPSBmdW5jdGlvbiAoZG9jdW1lbnQpIHtcclxuICAgIGRvY3VtZW50LnF1aXJrc01vZGUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0cy5pc1F1aXJrc01vZGUgPSBmdW5jdGlvbiAoZG9jdW1lbnQpIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWlya3NNb2RlO1xyXG59O1xyXG5cclxudmFyIGFwcGVuZENoaWxkID0gZXhwb3J0cy5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChwYXJlbnROb2RlLCBuZXdOb2RlKSB7XHJcbiAgICBwYXJlbnROb2RlLmNoaWxkTm9kZXMucHVzaChuZXdOb2RlKTtcclxuICAgIG5ld05vZGUucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbn07XHJcblxyXG52YXIgaW5zZXJ0QmVmb3JlID0gZXhwb3J0cy5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSkge1xyXG4gICAgdmFyIGluc2VydGlvbklkeCA9IHBhcmVudE5vZGUuY2hpbGROb2Rlcy5pbmRleE9mKHJlZmVyZW5jZU5vZGUpO1xyXG5cclxuICAgIHBhcmVudE5vZGUuY2hpbGROb2Rlcy5zcGxpY2UoaW5zZXJ0aW9uSWR4LCAwLCBuZXdOb2RlKTtcclxuICAgIG5ld05vZGUucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbn07XHJcblxyXG5leHBvcnRzLmRldGFjaE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgIHZhciBpZHggPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcy5pbmRleE9mKG5vZGUpO1xyXG5cclxuICAgICAgICBub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBudWxsO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0cy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRleHQpIHtcclxuICAgIGlmIChwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdmFyIHByZXZOb2RlID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzW3BhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZOb2RlLm5vZGVOYW1lID09PSAnI3RleHQnKSB7XHJcbiAgICAgICAgICAgIHByZXZOb2RlLnZhbHVlICs9IHRleHQ7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kQ2hpbGQocGFyZW50Tm9kZSwgY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xyXG59O1xyXG5cclxuZXhwb3J0cy5pbnNlcnRUZXh0QmVmb3JlID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRleHQsIHJlZmVyZW5jZU5vZGUpIHtcclxuICAgIHZhciBwcmV2Tm9kZSA9IHBhcmVudE5vZGUuY2hpbGROb2Rlc1twYXJlbnROb2RlLmNoaWxkTm9kZXMuaW5kZXhPZihyZWZlcmVuY2VOb2RlKSAtIDFdO1xyXG5cclxuICAgIGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5ub2RlTmFtZSA9PT0gJyN0ZXh0JylcclxuICAgICAgICBwcmV2Tm9kZS52YWx1ZSArPSB0ZXh0O1xyXG4gICAgZWxzZVxyXG4gICAgICAgIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSwgcmVmZXJlbmNlTm9kZSk7XHJcbn07XHJcblxyXG5leHBvcnRzLmFkb3B0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChyZWNpcGllbnROb2RlLCBhdHRycykge1xyXG4gICAgdmFyIHJlY2lwaWVudEF0dHJzTWFwID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNpcGllbnROb2RlLmF0dHJzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHJlY2lwaWVudEF0dHJzTWFwLnB1c2gocmVjaXBpZW50Tm9kZS5hdHRyc1tpXS5uYW1lKTtcclxuXHJcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHJzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHJlY2lwaWVudEF0dHJzTWFwLmluZGV4T2YoYXR0cnNbal0ubmFtZSkgPT09IC0xKVxyXG4gICAgICAgICAgICByZWNpcGllbnROb2RlLmF0dHJzLnB1c2goYXR0cnNbal0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbi8vVHJlZSB0cmF2ZXJzaW5nXHJcbmV4cG9ydHMuZ2V0Rmlyc3RDaGlsZCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzWzBdO1xyXG59O1xyXG5cclxuZXhwb3J0cy5nZXRDaGlsZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXM7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldFBhcmVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTtcclxufTtcclxuXHJcbmV4cG9ydHMuZ2V0QXR0ckxpc3QgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUuYXR0cnM7XHJcbn07XHJcblxyXG4vL05vZGUgZGF0YVxyXG5leHBvcnRzLmdldFRhZ05hbWUgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZTtcclxufTtcclxuXHJcbmV4cG9ydHMuZ2V0TmFtZXNwYWNlVVJJID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm5hbWVzcGFjZVVSSTtcclxufTtcclxuXHJcbmV4cG9ydHMuZ2V0VGV4dE5vZGVDb250ZW50ID0gZnVuY3Rpb24gKHRleHROb2RlKSB7XHJcbiAgICByZXR1cm4gdGV4dE5vZGUudmFsdWU7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldENvbW1lbnROb2RlQ29udGVudCA9IGZ1bmN0aW9uIChjb21tZW50Tm9kZSkge1xyXG4gICAgcmV0dXJuIGNvbW1lbnROb2RlLmRhdGE7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldERvY3VtZW50VHlwZU5vZGVOYW1lID0gZnVuY3Rpb24gKGRvY3R5cGVOb2RlKSB7XHJcbiAgICByZXR1cm4gZG9jdHlwZU5vZGUubmFtZTtcclxufTtcclxuXHJcbmV4cG9ydHMuZ2V0RG9jdW1lbnRUeXBlTm9kZVB1YmxpY0lkID0gZnVuY3Rpb24gKGRvY3R5cGVOb2RlKSB7XHJcbiAgICByZXR1cm4gZG9jdHlwZU5vZGUucHVibGljSWQ7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldERvY3VtZW50VHlwZU5vZGVTeXN0ZW1JZCA9IGZ1bmN0aW9uIChkb2N0eXBlTm9kZSkge1xyXG4gICAgcmV0dXJuIGRvY3R5cGVOb2RlLnN5c3RlbUlkO1xyXG59O1xyXG5cclxuLy9Ob2RlIHR5cGVzXHJcbmV4cG9ydHMuaXNUZXh0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJyN0ZXh0JztcclxufTtcclxuXHJcbmV4cG9ydHMuaXNDb21tZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJyNjb21tZW50JztcclxufTtcclxuXHJcbmV4cG9ydHMuaXNEb2N1bWVudFR5cGVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnI2RvY3VtZW50VHlwZSc7XHJcbn07XHJcblxyXG5leHBvcnRzLmlzRWxlbWVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuICEhbm9kZS50YWdOYW1lO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgRG9jdHlwZSA9IHJlcXVpcmUoJy4uL2NvbW1vbi9kb2N0eXBlJyk7XHJcblxyXG4vL0NvbnZlcnNpb24gdGFibGVzIGZvciBET00gTGV2ZWwxIHN0cnVjdHVyZSBlbXVsYXRpb25cclxudmFyIG5vZGVUeXBlcyA9IHtcclxuICAgIGVsZW1lbnQ6IDEsXHJcbiAgICB0ZXh0OiAzLFxyXG4gICAgY2RhdGE6IDQsXHJcbiAgICBjb21tZW50OiA4XHJcbn07XHJcblxyXG52YXIgbm9kZVByb3BlcnR5U2hvcnRoYW5kcyA9IHtcclxuICAgIHRhZ05hbWU6ICduYW1lJyxcclxuICAgIGNoaWxkTm9kZXM6ICdjaGlsZHJlbicsXHJcbiAgICBwYXJlbnROb2RlOiAncGFyZW50JyxcclxuICAgIHByZXZpb3VzU2libGluZzogJ3ByZXYnLFxyXG4gICAgbmV4dFNpYmxpbmc6ICduZXh0JyxcclxuICAgIG5vZGVWYWx1ZTogJ2RhdGEnXHJcbn07XHJcblxyXG4vL05vZGVcclxudmFyIE5vZGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcclxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xyXG4gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgICAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xyXG4gICAgfVxyXG59O1xyXG5cclxuTm9kZS5wcm90b3R5cGUgPSB7XHJcbiAgICBnZXQgZmlyc3RDaGlsZCgpIHtcclxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlblswXSB8fCBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXQgbGFzdENoaWxkKCkge1xyXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdIHx8IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldCBub2RlVHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gbm9kZVR5cGVzW3RoaXMudHlwZV0gfHwgbm9kZVR5cGVzLmVsZW1lbnQ7XHJcbiAgICB9XHJcbn07XHJcblxyXG5PYmplY3Qua2V5cyhub2RlUHJvcGVydHlTaG9ydGhhbmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgIHZhciBzaG9ydGhhbmQgPSBub2RlUHJvcGVydHlTaG9ydGhhbmRzW2tleV07XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5vZGUucHJvdG90eXBlLCBrZXksIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXNbc2hvcnRoYW5kXSB8fCBudWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXNbc2hvcnRoYW5kXSA9IHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5cclxuLy9Ob2RlIGNvbnN0cnVjdGlvblxyXG5leHBvcnRzLmNyZWF0ZURvY3VtZW50ID1cclxuZXhwb3J0cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIG5ldyBOb2RlKHtcclxuICAgICAgICB0eXBlOiAncm9vdCcsXHJcbiAgICAgICAgbmFtZTogJ3Jvb3QnLFxyXG4gICAgICAgIHBhcmVudDogbnVsbCxcclxuICAgICAgICBwcmV2OiBudWxsLFxyXG4gICAgICAgIG5leHQ6IG51bGwsXHJcbiAgICAgICAgY2hpbGRyZW46IFtdXHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lc3BhY2VVUkksIGF0dHJzKSB7XHJcbiAgICB2YXIgYXR0cmlicyA9IHt9LFxyXG4gICAgICAgIGF0dHJpYnNOYW1lc3BhY2UgPSB7fSxcclxuICAgICAgICBhdHRyaWJzUHJlZml4ID0ge307XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJzW2ldLm5hbWU7XHJcblxyXG4gICAgICAgIGF0dHJpYnNbYXR0ck5hbWVdID0gYXR0cnNbaV0udmFsdWU7XHJcbiAgICAgICAgYXR0cmlic05hbWVzcGFjZVthdHRyTmFtZV0gPSBhdHRyc1tpXS5uYW1lc3BhY2U7XHJcbiAgICAgICAgYXR0cmlic1ByZWZpeFthdHRyTmFtZV0gPSBhdHRyc1tpXS5wcmVmaXg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBOb2RlKHtcclxuICAgICAgICB0eXBlOiB0YWdOYW1lID09PSAnc2NyaXB0JyB8fCB0YWdOYW1lID09PSAnc3R5bGUnID8gdGFnTmFtZSA6ICd0YWcnLFxyXG4gICAgICAgIG5hbWU6IHRhZ05hbWUsXHJcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2VVUkksXHJcbiAgICAgICAgYXR0cmliczogYXR0cmlicyxcclxuICAgICAgICAneC1hdHRyaWJzTmFtZXNwYWNlJzogYXR0cmlic05hbWVzcGFjZSxcclxuICAgICAgICAneC1hdHRyaWJzUHJlZml4JzogYXR0cmlic1ByZWZpeCxcclxuICAgICAgICBjaGlsZHJlbjogW10sXHJcbiAgICAgICAgcGFyZW50OiBudWxsLFxyXG4gICAgICAgIHByZXY6IG51bGwsXHJcbiAgICAgICAgbmV4dDogbnVsbFxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5leHBvcnRzLmNyZWF0ZUNvbW1lbnROb2RlID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgIHJldHVybiBuZXcgTm9kZSh7XHJcbiAgICAgICAgdHlwZTogJ2NvbW1lbnQnLFxyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgcGFyZW50OiBudWxsLFxyXG4gICAgICAgIHByZXY6IG51bGwsXHJcbiAgICAgICAgbmV4dDogbnVsbFxyXG4gICAgfSk7XHJcbn07XHJcblxyXG52YXIgY3JlYXRlVGV4dE5vZGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgIHJldHVybiBuZXcgTm9kZSh7XHJcbiAgICAgICAgdHlwZTogJ3RleHQnLFxyXG4gICAgICAgIGRhdGE6IHZhbHVlLFxyXG4gICAgICAgIHBhcmVudDogbnVsbCxcclxuICAgICAgICBwcmV2OiBudWxsLFxyXG4gICAgICAgIG5leHQ6IG51bGxcclxuICAgIH0pO1xyXG59O1xyXG5cclxuXHJcbi8vVHJlZSBtdXRhdGlvblxyXG5leHBvcnRzLnNldERvY3VtZW50VHlwZSA9IGZ1bmN0aW9uIChkb2N1bWVudCwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSB7XHJcbiAgICB2YXIgZGF0YSA9IERvY3R5cGUuc2VyaWFsaXplQ29udGVudChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpLFxyXG4gICAgICAgIGRvY3R5cGVOb2RlID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmNoaWxkcmVuW2ldLnR5cGUgPT09ICdkaXJlY3RpdmUnICYmIGRvY3VtZW50LmNoaWxkcmVuW2ldLm5hbWUgPT09ICchZG9jdHlwZScpIHtcclxuICAgICAgICAgICAgZG9jdHlwZU5vZGUgPSBkb2N1bWVudC5jaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkb2N0eXBlTm9kZSkge1xyXG4gICAgICAgIGRvY3R5cGVOb2RlLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGRvY3R5cGVOb2RlWyd4LW5hbWUnXSA9IG5hbWU7XHJcbiAgICAgICAgZG9jdHlwZU5vZGVbJ3gtcHVibGljSWQnXSA9IHB1YmxpY0lkO1xyXG4gICAgICAgIGRvY3R5cGVOb2RlWyd4LXN5c3RlbUlkJ10gPSBzeXN0ZW1JZDtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBhcHBlbmRDaGlsZChkb2N1bWVudCwgbmV3IE5vZGUoe1xyXG4gICAgICAgICAgICB0eXBlOiAnZGlyZWN0aXZlJyxcclxuICAgICAgICAgICAgbmFtZTogJyFkb2N0eXBlJyxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgJ3gtbmFtZSc6IG5hbWUsXHJcbiAgICAgICAgICAgICd4LXB1YmxpY0lkJzogcHVibGljSWQsXHJcbiAgICAgICAgICAgICd4LXN5c3RlbUlkJzogc3lzdGVtSWRcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxuZXhwb3J0cy5zZXRRdWlya3NNb2RlID0gZnVuY3Rpb24gKGRvY3VtZW50KSB7XHJcbiAgICBkb2N1bWVudC5xdWlya3NNb2RlID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydHMuaXNRdWlya3NNb2RlID0gZnVuY3Rpb24gKGRvY3VtZW50KSB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQucXVpcmtzTW9kZTtcclxufTtcclxuXHJcbnZhciBhcHBlbmRDaGlsZCA9IGV4cG9ydHMuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbmV3Tm9kZSkge1xyXG4gICAgdmFyIHByZXYgPSBwYXJlbnROb2RlLmNoaWxkcmVuW3BhcmVudE5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKHByZXYpIHtcclxuICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xyXG4gICAgICAgIG5ld05vZGUucHJldiA9IHByZXY7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyZW50Tm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xyXG4gICAgbmV3Tm9kZS5wYXJlbnQgPSBwYXJlbnROb2RlO1xyXG59O1xyXG5cclxudmFyIGluc2VydEJlZm9yZSA9IGV4cG9ydHMuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHtcclxuICAgIHZhciBpbnNlcnRpb25JZHggPSBwYXJlbnROb2RlLmNoaWxkcmVuLmluZGV4T2YocmVmZXJlbmNlTm9kZSksXHJcbiAgICAgICAgcHJldiA9IHJlZmVyZW5jZU5vZGUucHJldjtcclxuXHJcbiAgICBpZiAocHJldikge1xyXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XHJcbiAgICAgICAgbmV3Tm9kZS5wcmV2ID0gcHJldjtcclxuICAgIH1cclxuXHJcbiAgICByZWZlcmVuY2VOb2RlLnByZXYgPSBuZXdOb2RlO1xyXG4gICAgbmV3Tm9kZS5uZXh0ID0gcmVmZXJlbmNlTm9kZTtcclxuXHJcbiAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnNwbGljZShpbnNlcnRpb25JZHgsIDAsIG5ld05vZGUpO1xyXG4gICAgbmV3Tm9kZS5wYXJlbnQgPSBwYXJlbnROb2RlO1xyXG59O1xyXG5cclxuZXhwb3J0cy5kZXRhY2hOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgIHZhciBpZHggPSBub2RlLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKG5vZGUpLFxyXG4gICAgICAgICAgICBwcmV2ID0gbm9kZS5wcmV2LFxyXG4gICAgICAgICAgICBuZXh0ID0gbm9kZS5uZXh0O1xyXG5cclxuICAgICAgICBub2RlLnByZXYgPSBudWxsO1xyXG4gICAgICAgIG5vZGUubmV4dCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChwcmV2KVxyXG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXh0O1xyXG5cclxuICAgICAgICBpZiAobmV4dClcclxuICAgICAgICAgICAgbmV4dC5wcmV2ID0gcHJldjtcclxuXHJcbiAgICAgICAgbm9kZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBudWxsO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0cy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRleHQpIHtcclxuICAgIHZhciBsYXN0Q2hpbGQgPSBwYXJlbnROb2RlLmNoaWxkcmVuW3BhcmVudE5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKGxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQudHlwZSA9PT0gJ3RleHQnKVxyXG4gICAgICAgIGxhc3RDaGlsZC5kYXRhICs9IHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgYXBwZW5kQ2hpbGQocGFyZW50Tm9kZSwgY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xyXG59O1xyXG5cclxuZXhwb3J0cy5pbnNlcnRUZXh0QmVmb3JlID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRleHQsIHJlZmVyZW5jZU5vZGUpIHtcclxuICAgIHZhciBwcmV2Tm9kZSA9IHBhcmVudE5vZGUuY2hpbGRyZW5bcGFyZW50Tm9kZS5jaGlsZHJlbi5pbmRleE9mKHJlZmVyZW5jZU5vZGUpIC0gMV07XHJcblxyXG4gICAgaWYgKHByZXZOb2RlICYmIHByZXZOb2RlLnR5cGUgPT09ICd0ZXh0JylcclxuICAgICAgICBwcmV2Tm9kZS5kYXRhICs9IHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudE5vZGUsIGNyZWF0ZVRleHROb2RlKHRleHQpLCByZWZlcmVuY2VOb2RlKTtcclxufTtcclxuXHJcbmV4cG9ydHMuYWRvcHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHJlY2lwaWVudE5vZGUsIGF0dHJzKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0cnNbaV0ubmFtZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiByZWNpcGllbnROb2RlLmF0dHJpYnNbYXR0ck5hbWVdID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZWNpcGllbnROb2RlLmF0dHJpYnNbYXR0ck5hbWVdID0gYXR0cnNbaV0udmFsdWU7XHJcbiAgICAgICAgICAgIHJlY2lwaWVudE5vZGVbJ3gtYXR0cmlic05hbWVzcGFjZSddW2F0dHJOYW1lXSA9IGF0dHJzW2ldLm5hbWVzcGFjZTtcclxuICAgICAgICAgICAgcmVjaXBpZW50Tm9kZVsneC1hdHRyaWJzUHJlZml4J11bYXR0ck5hbWVdID0gYXR0cnNbaV0ucHJlZml4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblxyXG4vL1RyZWUgdHJhdmVyc2luZ1xyXG5leHBvcnRzLmdldEZpcnN0Q2hpbGQgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5bMF07XHJcbn07XHJcblxyXG5leHBvcnRzLmdldENoaWxkTm9kZXMgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW47XHJcbn07XHJcblxyXG5leHBvcnRzLmdldFBhcmVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUucGFyZW50O1xyXG59O1xyXG5cclxuZXhwb3J0cy5nZXRBdHRyTGlzdCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICB2YXIgYXR0ckxpc3QgPSBbXTtcclxuXHJcbiAgICBmb3IgKHZhciBuYW1lIGluIG5vZGUuYXR0cmlicykge1xyXG4gICAgICAgIGlmIChub2RlLmF0dHJpYnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICAgICAgYXR0ckxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUuYXR0cmlic1tuYW1lXSxcclxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogbm9kZVsneC1hdHRyaWJzTmFtZXNwYWNlJ11bbmFtZV0sXHJcbiAgICAgICAgICAgICAgICBwcmVmaXg6IG5vZGVbJ3gtYXR0cmlic1ByZWZpeCddW25hbWVdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXR0ckxpc3Q7XHJcbn07XHJcblxyXG5cclxuLy9Ob2RlIGRhdGFcclxuZXhwb3J0cy5nZXRUYWdOYW1lID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm5hbWU7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldE5hbWVzcGFjZVVSSSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5uYW1lc3BhY2U7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldFRleHROb2RlQ29udGVudCA9IGZ1bmN0aW9uICh0ZXh0Tm9kZSkge1xyXG4gICAgcmV0dXJuIHRleHROb2RlLmRhdGE7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldENvbW1lbnROb2RlQ29udGVudCA9IGZ1bmN0aW9uIChjb21tZW50Tm9kZSkge1xyXG4gICAgcmV0dXJuIGNvbW1lbnROb2RlLmRhdGE7XHJcbn07XHJcblxyXG5leHBvcnRzLmdldERvY3VtZW50VHlwZU5vZGVOYW1lID0gZnVuY3Rpb24gKGRvY3R5cGVOb2RlKSB7XHJcbiAgICByZXR1cm4gZG9jdHlwZU5vZGVbJ3gtbmFtZSddO1xyXG59O1xyXG5cclxuZXhwb3J0cy5nZXREb2N1bWVudFR5cGVOb2RlUHVibGljSWQgPSBmdW5jdGlvbiAoZG9jdHlwZU5vZGUpIHtcclxuICAgIHJldHVybiBkb2N0eXBlTm9kZVsneC1wdWJsaWNJZCddO1xyXG59O1xyXG5cclxuZXhwb3J0cy5nZXREb2N1bWVudFR5cGVOb2RlU3lzdGVtSWQgPSBmdW5jdGlvbiAoZG9jdHlwZU5vZGUpIHtcclxuICAgIHJldHVybiBkb2N0eXBlTm9kZVsneC1zeXN0ZW1JZCddO1xyXG59O1xyXG5cclxuXHJcbi8vTm9kZSB0eXBlc1xyXG5leHBvcnRzLmlzVGV4dE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ3RleHQnO1xyXG59O1xyXG5cclxuZXhwb3J0cy5pc0NvbW1lbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdjb21tZW50JztcclxufTtcclxuXHJcbmV4cG9ydHMuaXNEb2N1bWVudFR5cGVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdkaXJlY3RpdmUnICYmIG5vZGUubmFtZSA9PT0gJyFkb2N0eXBlJztcclxufTtcclxuXHJcbmV4cG9ydHMuaXNFbGVtZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICByZXR1cm4gISFub2RlLmF0dHJpYnM7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8vQ29uc3RcclxudmFyIE5PQUhfQVJLX0NBUEFDSVRZID0gMztcclxuXHJcbi8vTGlzdCBvZiBmb3JtYXR0aW5nIGVsZW1lbnRzXHJcbnZhciBGb3JtYXR0aW5nRWxlbWVudExpc3QgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0cmVlQWRhcHRlcikge1xyXG4gICAgdGhpcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5lbnRyaWVzID0gW107XHJcbiAgICB0aGlzLnRyZWVBZGFwdGVyID0gdHJlZUFkYXB0ZXI7XHJcbiAgICB0aGlzLmJvb2ttYXJrID0gbnVsbDtcclxufTtcclxuXHJcbi8vRW50cnkgdHlwZXNcclxuRm9ybWF0dGluZ0VsZW1lbnRMaXN0Lk1BUktFUl9FTlRSWSA9ICdNQVJLRVJfRU5UUlknO1xyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QuRUxFTUVOVF9FTlRSWSA9ICdFTEVNRU5UX0VOVFJZJztcclxuXHJcbi8vTm9haCBBcmsncyBjb25kaXRpb25cclxuLy9PUFRJTUlaQVRJT046IGF0IGZpcnN0IHdlIHRyeSB0byBmaW5kIHBvc3NpYmxlIGNhbmRpZGF0ZXMgZm9yIGV4Y2x1c2lvbiB1c2luZ1xyXG4vL2xpZ2h0d2VpZ2h0IGhldXJpc3RpY3Mgd2l0aG91dCB0aG9yb3VnaCBhdHRyaWJ1dGVzIGNoZWNrLlxyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QucHJvdG90eXBlLl9nZXROb2FoQXJrQ29uZGl0aW9uQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uIChuZXdFbGVtZW50KSB7XHJcbiAgICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLmxlbmd0aCA+PSBOT0FIX0FSS19DQVBBQ0lUWSkge1xyXG4gICAgICAgIHZhciBuZUF0dHJzTGVuZ3RoID0gdGhpcy50cmVlQWRhcHRlci5nZXRBdHRyTGlzdChuZXdFbGVtZW50KS5sZW5ndGgsXHJcbiAgICAgICAgICAgIG5lVGFnTmFtZSA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShuZXdFbGVtZW50KSxcclxuICAgICAgICAgICAgbmVOYW1lc3BhY2VVUkkgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShuZXdFbGVtZW50KTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5NQVJLRVJfRU5UUlkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZW50cnkuZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRycyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0QXR0ckxpc3QoZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpID09PSBuZVRhZ05hbWUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnQpID09PSBuZU5hbWVzcGFjZVVSSSAmJlxyXG4gICAgICAgICAgICAgICAgZWxlbWVudEF0dHJzLmxlbmd0aCA9PT0gbmVBdHRyc0xlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtpZHg6IGksIGF0dHJzOiBlbGVtZW50QXR0cnN9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5sZW5ndGggPCBOT0FIX0FSS19DQVBBQ0lUWSA/IFtdIDogY2FuZGlkYXRlcztcclxufTtcclxuXHJcbkZvcm1hdHRpbmdFbGVtZW50TGlzdC5wcm90b3R5cGUuX2Vuc3VyZU5vYWhBcmtDb25kaXRpb24gPSBmdW5jdGlvbiAobmV3RWxlbWVudCkge1xyXG4gICAgdmFyIGNhbmRpZGF0ZXMgPSB0aGlzLl9nZXROb2FoQXJrQ29uZGl0aW9uQ2FuZGlkYXRlcyhuZXdFbGVtZW50KSxcclxuICAgICAgICBjTGVuZ3RoID0gY2FuZGlkYXRlcy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGNMZW5ndGgpIHtcclxuICAgICAgICB2YXIgbmVBdHRycyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0QXR0ckxpc3QobmV3RWxlbWVudCksXHJcbiAgICAgICAgICAgIG5lQXR0cnNMZW5ndGggPSBuZUF0dHJzLmxlbmd0aCxcclxuICAgICAgICAgICAgbmVBdHRyc01hcCA9IHt9O1xyXG5cclxuICAgICAgICAvL05PVEU6IGJ1aWxkIGF0dHJzIG1hcCBmb3IgdGhlIG5ldyBlbGVtZW50IHNvIHdlIGNhbiBwZXJmb3JtIGZhc3QgbG9va3Vwc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVBdHRyc0xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBuZUF0dHIgPSBuZUF0dHJzW2ldO1xyXG5cclxuICAgICAgICAgICAgbmVBdHRyc01hcFtuZUF0dHIubmFtZV0gPSBuZUF0dHIudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5lQXR0cnNMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNMZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNBdHRyID0gY2FuZGlkYXRlc1tqXS5hdHRyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobmVBdHRyc01hcFtjQXR0ci5uYW1lXSAhPT0gY0F0dHIudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjTGVuZ3RoLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoIDwgTk9BSF9BUktfQ0FQQUNJVFkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL05PVEU6IHJlbW92ZSBib3R0b21tb3N0IGNhbmRpZGF0ZXMgdW50aWwgTm9haCdzIEFyayBjb25kaXRpb24gd2lsbCBub3QgYmUgbWV0XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGNMZW5ndGggLSAxOyBpID49IE5PQUhfQVJLX0NBUEFDSVRZIC0gMTsgaS0tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoY2FuZGlkYXRlc1tpXS5pZHgsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aC0tO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8vTXV0YXRpb25zXHJcbkZvcm1hdHRpbmdFbGVtZW50TGlzdC5wcm90b3R5cGUuaW5zZXJ0TWFya2VyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe3R5cGU6IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5NQVJLRVJfRU5UUll9KTtcclxuICAgIHRoaXMubGVuZ3RoKys7XHJcbn07XHJcblxyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QucHJvdG90eXBlLnB1c2hFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHRva2VuKSB7XHJcbiAgICB0aGlzLl9lbnN1cmVOb2FoQXJrQ29uZGl0aW9uKGVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcclxuICAgICAgICB0eXBlOiBGb3JtYXR0aW5nRWxlbWVudExpc3QuRUxFTUVOVF9FTlRSWSxcclxuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgIHRva2VuOiB0b2tlblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5sZW5ndGgrKztcclxufTtcclxuXHJcbkZvcm1hdHRpbmdFbGVtZW50TGlzdC5wcm90b3R5cGUuaW5zZXJ0RWxlbWVudEFmdGVyQm9va21hcmsgPSBmdW5jdGlvbiAoZWxlbWVudCwgdG9rZW4pIHtcclxuICAgIHZhciBib29rbWFya0lkeCA9IHRoaXMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICBmb3IgKDsgYm9va21hcmtJZHggPj0gMDsgYm9va21hcmtJZHgtLSkge1xyXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXNbYm9va21hcmtJZHhdID09PSB0aGlzLmJvb2ttYXJrKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGJvb2ttYXJrSWR4ICsgMSwgMCwge1xyXG4gICAgICAgIHR5cGU6IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5FTEVNRU5UX0VOVFJZLFxyXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgdG9rZW46IHRva2VuXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxlbmd0aCsrO1xyXG59O1xyXG5cclxuRm9ybWF0dGluZ0VsZW1lbnRMaXN0LnByb3RvdHlwZS5yZW1vdmVFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkge1xyXG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzW2ldID09PSBlbnRyeSkge1xyXG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aC0tO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QucHJvdG90eXBlLmNsZWFyVG9MYXN0TWFya2VyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5lbnRyaWVzLnBvcCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aC0tO1xyXG5cclxuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRm9ybWF0dGluZ0VsZW1lbnRMaXN0Lk1BUktFUl9FTlRSWSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vL1NlYXJjaFxyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QucHJvdG90eXBlLmdldEVsZW1lbnRFbnRyeUluU2NvcGVXaXRoVGFnTmFtZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZW50cmllc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5NQVJLRVJfRU5UUlkpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVudHJ5LmVsZW1lbnQpID09PSB0YWdOYW1lKVxyXG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5Gb3JtYXR0aW5nRWxlbWVudExpc3QucHJvdG90eXBlLmdldEVsZW1lbnRFbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZW50cmllc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5FTEVNRU5UX0VOVFJZICYmIGVudHJ5LmVsZW1lbnQgPT0gZWxlbWVudClcclxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgT3BlbkVsZW1lbnRTdGFjayA9IHJlcXVpcmUoJy4vb3Blbl9lbGVtZW50X3N0YWNrJyksXHJcbiAgICBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6YXRpb24vdG9rZW5pemVyJyksXHJcbiAgICBIVE1MID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWwnKTtcclxuXHJcblxyXG4vL0FsaWFzZXNcclxudmFyICQgPSBIVE1MLlRBR19OQU1FUztcclxuXHJcblxyXG5mdW5jdGlvbiBzZXRFbmRMb2NhdGlvbihlbGVtZW50LCBjbG9zaW5nVG9rZW4sIHRyZWVBZGFwdGVyKSB7XHJcbiAgICB2YXIgbG9jID0gZWxlbWVudC5fX2xvY2F0aW9uO1xyXG5cclxuICAgIGlmICghbG9jKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWxvYy5zdGFydFRhZykge1xyXG4gICAgICAgIGxvYy5zdGFydFRhZyA9IHtcclxuICAgICAgICAgICAgc3RhcnQ6IGxvYy5zdGFydCxcclxuICAgICAgICAgICAgZW5kOiBsb2MuZW5kXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2xvc2luZ1Rva2VuLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgdmFyIHRuID0gdHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSxcclxuICAgICAgICAgICAgLy8gTk9URTogRm9yIGNhc2VzIGxpa2UgPHA+IDxwPiA8L3A+IC0gRmlyc3QgJ3AnIGNsb3NlcyB3aXRob3V0IGEgY2xvc2luZyB0YWcgYW5kXHJcbiAgICAgICAgICAgIC8vIGZvciBjYXNlcyBsaWtlIDx0ZD4gPHA+IDwvdGQ+IC0gJ3AnIGNsb3NlcyB3aXRob3V0IGEgY2xvc2luZyB0YWdcclxuICAgICAgICAgICAgaXNDbG9zaW5nRW5kVGFnID0gY2xvc2luZ1Rva2VuLnR5cGUgPT09IFRva2VuaXplci5FTkRfVEFHX1RPS0VOICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuID09PSBjbG9zaW5nVG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQ2xvc2luZ0VuZFRhZykge1xyXG4gICAgICAgICAgICBsb2MuZW5kVGFnID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IGNsb3NpbmdUb2tlbi5sb2NhdGlvbi5zdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZDogY2xvc2luZ1Rva2VuLmxvY2F0aW9uLmVuZFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jLmVuZCA9IGNsb3NpbmdUb2tlbi5sb2NhdGlvbi5lbmQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vTk9URTogcGF0Y2ggb3BlbiBlbGVtZW50cyBzdGFjaywgc28gd2UgY2FuIGFzc2lnbiBlbmQgbG9jYXRpb24gZm9yIHRoZSBlbGVtZW50c1xyXG5mdW5jdGlvbiBwYXRjaE9wZW5FbGVtZW50c1N0YWNrKHN0YWNrLCBwYXJzZXIpIHtcclxuICAgIHZhciB0cmVlQWRhcHRlciA9IHBhcnNlci50cmVlQWRhcHRlcjtcclxuXHJcbiAgICBzdGFjay5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgc2V0RW5kTG9jYXRpb24odGhpcy5jdXJyZW50LCBwYXJzZXIuY3VycmVudFRva2VuLCB0cmVlQWRhcHRlcik7XHJcbiAgICAgICAgT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUucG9wLmNhbGwodGhpcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIHN0YWNrLnBvcEFsbFVwVG9IdG1sRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+IDA7IGktLSlcclxuICAgICAgICAgICAgc2V0RW5kTG9jYXRpb24odGhpcy5pdGVtc1tpXSwgcGFyc2VyLmN1cnJlbnRUb2tlbiwgdHJlZUFkYXB0ZXIpO1xyXG5cclxuICAgICAgICBPcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5wb3BBbGxVcFRvSHRtbEVsZW1lbnQuY2FsbCh0aGlzKTtcclxuICAgIH07XHJcblxyXG4gICAgc3RhY2sucmVtb3ZlID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICBzZXRFbmRMb2NhdGlvbihlbGVtZW50LCBwYXJzZXIuY3VycmVudFRva2VuLCB0cmVlQWRhcHRlcik7XHJcbiAgICAgICAgT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcywgZWxlbWVudCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChwYXJzZXIpIHtcclxuICAgIC8vTk9URTogb2J0YWluIFBhcnNlciBwcm90byB0aGlzIHdheSB0byBhdm9pZCBtb2R1bGUgY2lyY3VsYXIgcmVmZXJlbmNlc1xyXG4gICAgdmFyIHBhcnNlclByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBhcnNlciksXHJcbiAgICAgICAgdHJlZUFkYXB0ZXIgPSBwYXJzZXIudHJlZUFkYXB0ZXI7XHJcblxyXG5cclxuICAgIC8vTk9URTogcGF0Y2ggX3Jlc2V0IG1ldGhvZFxyXG4gICAgcGFyc2VyLl9yZXNldCA9IGZ1bmN0aW9uIChodG1sLCBkb2N1bWVudCwgZnJhZ21lbnRDb250ZXh0KSB7XHJcbiAgICAgICAgcGFyc2VyUHJvdG8uX3Jlc2V0LmNhbGwodGhpcywgaHRtbCwgZG9jdW1lbnQsIGZyYWdtZW50Q29udGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoYWJsZUVsZW1lbnRMb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYXN0Rm9zdGVyUGFyZW50aW5nTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gbnVsbDtcclxuXHJcbiAgICAgICAgcGF0Y2hPcGVuRWxlbWVudHNTdGFjayh0aGlzLm9wZW5FbGVtZW50cywgcGFyc2VyKTtcclxuICAgIH07XHJcblxyXG4gICAgcGFyc2VyLl9wcm9jZXNzVG9rZW5JbkZvcmVpZ25Db250ZW50ID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSB0b2tlbjtcclxuICAgICAgICBwYXJzZXJQcm90by5fcHJvY2Vzc1Rva2VuSW5Gb3JlaWduQ29udGVudC5jYWxsKHRoaXMsIHRva2VuKTtcclxuICAgIH07XHJcblxyXG4gICAgcGFyc2VyLl9wcm9jZXNzVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRva2VuO1xyXG4gICAgICAgIHBhcnNlclByb3RvLl9wcm9jZXNzVG9rZW4uY2FsbCh0aGlzLCB0b2tlbik7XHJcblxyXG4gICAgICAgIC8vTk9URTogPGJvZHk+IGFuZCA8aHRtbD4gYXJlIG5ldmVyIHBvcHBlZCBmcm9tIHRoZSBzdGFjaywgc28gd2UgbmVlZCB0byB1cGRhdGVkXHJcbiAgICAgICAgLy90aGVpciBlbmQgbG9jYXRpb24gZXhwbGljaXRseS5cclxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4gJiZcclxuICAgICAgICAgICAgKHRva2VuLnRhZ05hbWUgPT09ICQuSFRNTCB8fFxyXG4gICAgICAgICAgICAodG9rZW4udGFnTmFtZSA9PT0gJC5CT0RZICYmIHRoaXMub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoJC5CT0RZKSkpKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5vcGVuRWxlbWVudHMuaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSA9PT0gdG9rZW4udGFnTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVuZExvY2F0aW9uKGVsZW1lbnQsIHRva2VuLCB0cmVlQWRhcHRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vRG9jdHlwZVxyXG4gICAgcGFyc2VyLl9zZXREb2N1bWVudFR5cGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgICAgICBwYXJzZXJQcm90by5fc2V0RG9jdW1lbnRUeXBlLmNhbGwodGhpcywgdG9rZW4pO1xyXG5cclxuICAgICAgICB2YXIgZG9jdW1lbnRDaGlsZHJlbiA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2Rlcyh0aGlzLmRvY3VtZW50KSxcclxuICAgICAgICAgICAgY25MZW5ndGggPSBkb2N1bWVudENoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbkxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnRDaGlsZHJlbltpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVBZGFwdGVyLmlzRG9jdW1lbnRUeXBlTm9kZShub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5fX2xvY2F0aW9uID0gdG9rZW4ubG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy9FbGVtZW50c1xyXG4gICAgcGFyc2VyLl9hdHRhY2hFbGVtZW50VG9UcmVlID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAvL05PVEU6IF9hdHRhY2hFbGVtZW50VG9UcmVlIGlzIGNhbGxlZCBmcm9tIF9hcHBlbmRFbGVtZW50LCBfaW5zZXJ0RWxlbWVudCBhbmQgX2luc2VydFRlbXBsYXRlIG1ldGhvZHMuXHJcbiAgICAgICAgLy9TbyB3ZSB3aWxsIHVzZSB0b2tlbiBsb2NhdGlvbiBzdG9yZWQgaW4gdGhpcyBtZXRob2RzIGZvciB0aGUgZWxlbWVudC5cclxuICAgICAgICBlbGVtZW50Ll9fbG9jYXRpb24gPSB0aGlzLmF0dGFjaGFibGVFbGVtZW50TG9jYXRpb24gfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmF0dGFjaGFibGVFbGVtZW50TG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIHBhcnNlclByb3RvLl9hdHRhY2hFbGVtZW50VG9UcmVlLmNhbGwodGhpcywgZWxlbWVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHBhcnNlci5fYXBwZW5kRWxlbWVudCA9IGZ1bmN0aW9uICh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hhYmxlRWxlbWVudExvY2F0aW9uID0gdG9rZW4ubG9jYXRpb247XHJcbiAgICAgICAgcGFyc2VyUHJvdG8uX2FwcGVuZEVsZW1lbnQuY2FsbCh0aGlzLCB0b2tlbiwgbmFtZXNwYWNlVVJJKTtcclxuICAgIH07XHJcblxyXG4gICAgcGFyc2VyLl9pbnNlcnRFbGVtZW50ID0gZnVuY3Rpb24gKHRva2VuLCBuYW1lc3BhY2VVUkkpIHtcclxuICAgICAgICB0aGlzLmF0dGFjaGFibGVFbGVtZW50TG9jYXRpb24gPSB0b2tlbi5sb2NhdGlvbjtcclxuICAgICAgICBwYXJzZXJQcm90by5faW5zZXJ0RWxlbWVudC5jYWxsKHRoaXMsIHRva2VuLCBuYW1lc3BhY2VVUkkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwYXJzZXIuX2luc2VydFRlbXBsYXRlID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hhYmxlRWxlbWVudExvY2F0aW9uID0gdG9rZW4ubG9jYXRpb247XHJcbiAgICAgICAgcGFyc2VyUHJvdG8uX2luc2VydFRlbXBsYXRlLmNhbGwodGhpcywgdG9rZW4pO1xyXG5cclxuICAgICAgICB2YXIgdG1wbENvbnRlbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmdldENoaWxkTm9kZXModGhpcy5vcGVuRWxlbWVudHMuY3VycmVudClbMF07XHJcblxyXG4gICAgICAgIHRtcGxDb250ZW50Ll9fbG9jYXRpb24gPSBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICBwYXJzZXIuX2luc2VydEZha2VSb290RWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBwYXJzZXJQcm90by5faW5zZXJ0RmFrZVJvb3RFbGVtZW50LmNhbGwodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudC5fX2xvY2F0aW9uID0gbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgLy9Db21tZW50c1xyXG4gICAgcGFyc2VyLl9hcHBlbmRDb21tZW50Tm9kZSA9IGZ1bmN0aW9uICh0b2tlbiwgcGFyZW50KSB7XHJcbiAgICAgICAgcGFyc2VyUHJvdG8uX2FwcGVuZENvbW1lbnROb2RlLmNhbGwodGhpcywgdG9rZW4sIHBhcmVudCk7XHJcblxyXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2RlcyhwYXJlbnQpLFxyXG4gICAgICAgICAgICBjb21tZW50Tm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICBjb21tZW50Tm9kZS5fX2xvY2F0aW9uID0gdG9rZW4ubG9jYXRpb247XHJcbiAgICB9O1xyXG5cclxuICAgIC8vVGV4dFxyXG4gICAgcGFyc2VyLl9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy9OT1RFOiBzdG9yZSBsYXN0IGZvc3RlciBwYXJlbnRpbmcgbG9jYXRpb24sIHNvIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIGluc2VydGVkIHRleHRcclxuICAgICAgICAvL2luIGNhc2Ugb2YgZm9zdGVyIHBhcmVudGluZ1xyXG4gICAgICAgIHRoaXMubGFzdEZvc3RlclBhcmVudGluZ0xvY2F0aW9uID0gcGFyc2VyUHJvdG8uX2ZpbmRGb3N0ZXJQYXJlbnRpbmdMb2NhdGlvbi5jYWxsKHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RGb3N0ZXJQYXJlbnRpbmdMb2NhdGlvbjtcclxuICAgIH07XHJcblxyXG4gICAgcGFyc2VyLl9pbnNlcnRDaGFyYWN0ZXJzID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICAgICAgcGFyc2VyUHJvdG8uX2luc2VydENoYXJhY3RlcnMuY2FsbCh0aGlzLCB0b2tlbik7XHJcblxyXG4gICAgICAgIHZhciBoYXNGb3N0ZXJQYXJlbnQgPSB0aGlzLl9zaG91bGRGb3N0ZXJQYXJlbnRPbkluc2VydGlvbigpLFxyXG4gICAgICAgICAgICBwYXJlbnRpbmdMb2NhdGlvbiA9IHRoaXMubGFzdEZvc3RlclBhcmVudGluZ0xvY2F0aW9uLFxyXG4gICAgICAgICAgICBwYXJlbnQgPSAoaGFzRm9zdGVyUGFyZW50ICYmIHBhcmVudGluZ0xvY2F0aW9uLnBhcmVudCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudFRtcGxDb250ZW50IHx8XHJcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQsXHJcbiAgICAgICAgICAgIHNpYmxpbmdzID0gdGhpcy50cmVlQWRhcHRlci5nZXRDaGlsZE5vZGVzKHBhcmVudCksXHJcbiAgICAgICAgICAgIHRleHROb2RlSWR4ID0gaGFzRm9zdGVyUGFyZW50ICYmIHBhcmVudGluZ0xvY2F0aW9uLmJlZm9yZUVsZW1lbnQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLmluZGV4T2YocGFyZW50aW5nTG9jYXRpb24uYmVmb3JlRWxlbWVudCkgLSAxIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncy5sZW5ndGggLSAxLFxyXG4gICAgICAgICAgICB0ZXh0Tm9kZSA9IHNpYmxpbmdzW3RleHROb2RlSWR4XTtcclxuXHJcbiAgICAgICAgLy9OT1RFOiBpZiB3ZSBoYXZlIGxvY2F0aW9uIGFzc2lnbmVkIGJ5IGFub3RoZXIgdG9rZW4sIHRoZW4ganVzdCB1cGRhdGUgZW5kIHBvc2l0aW9uXHJcbiAgICAgICAgaWYgKHRleHROb2RlLl9fbG9jYXRpb24pXHJcbiAgICAgICAgICAgIHRleHROb2RlLl9fbG9jYXRpb24uZW5kID0gdG9rZW4ubG9jYXRpb24uZW5kO1xyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRleHROb2RlLl9fbG9jYXRpb24gPSB0b2tlbi5sb2NhdGlvbjtcclxuICAgIH07XHJcbn07XHJcblxyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgSFRNTCA9IHJlcXVpcmUoJy4uL2NvbW1vbi9odG1sJyk7XHJcblxyXG4vL0FsaWFzZXNcclxudmFyICQgPSBIVE1MLlRBR19OQU1FUyxcclxuICAgIE5TID0gSFRNTC5OQU1FU1BBQ0VTO1xyXG5cclxuLy9FbGVtZW50IHV0aWxzXHJcblxyXG4vL09QVElNSVpBVElPTjogSW50ZWdlciBjb21wYXJpc29ucyBhcmUgbG93LWNvc3QsIHNvIHdlIGNhbiB1c2UgdmVyeSBmYXN0IHRhZyBuYW1lIGxlbmd0aCBmaWx0ZXJzIGhlcmUuXHJcbi8vSXQncyBmYXN0ZXIgdGhhbiB1c2luZyBkaWN0aW9uYXJ5LlxyXG5mdW5jdGlvbiBpc0ltcGxpZWRFbmRUYWdSZXF1aXJlZCh0bikge1xyXG4gICAgc3dpdGNoICh0bi5sZW5ndGgpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5QO1xyXG5cclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5SUCB8fCB0biA9PT0gJC5SVCB8fCB0biA9PT0gJC5ERCB8fCB0biA9PT0gJC5EVCB8fCB0biA9PT0gJC5MSTtcclxuXHJcbiAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICByZXR1cm4gdG4gPT09ICQuT1BUSU9OO1xyXG5cclxuICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5PUFRHUk9VUDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU2NvcGluZ0VsZW1lbnQodG4sIG5zKSB7XHJcbiAgICBzd2l0Y2ggKHRuLmxlbmd0aCkge1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlREIHx8IHRuID09PSAkLlRIKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zID09PSBOUy5IVE1MO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuTUkgfHwgdG4gPT09ICQuTU8gfHwgdG4gPT0gJC5NTiB8fCB0biA9PT0gJC5NUylcclxuICAgICAgICAgICAgICAgIHJldHVybiBucyA9PT0gTlMuTUFUSE1MO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnMgPT09IE5TLkhUTUw7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5ERVNDKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zID09PSBOUy5TVkc7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuVEFCTEUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnMgPT09IE5TLkhUTUw7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5NVEVYVClcclxuICAgICAgICAgICAgICAgIHJldHVybiBucyA9PT0gTlMuTUFUSE1MO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVElUTEUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnMgPT09IE5TLlNWRztcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgIHJldHVybiAodG4gPT09ICQuQVBQTEVUIHx8IHRuID09PSAkLk9CSkVDVCkgJiYgbnMgPT09IE5TLkhUTUw7XHJcblxyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgICAgcmV0dXJuICh0biA9PT0gJC5DQVBUSU9OIHx8IHRuID09PSAkLk1BUlFVRUUpICYmIG5zID09PSBOUy5IVE1MO1xyXG5cclxuICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5URU1QTEFURSAmJiBucyA9PT0gTlMuSFRNTDtcclxuXHJcbiAgICAgICAgY2FzZSAxMzpcclxuICAgICAgICAgICAgcmV0dXJuIHRuID09PSAkLkZPUkVJR05fT0JKRUNUICYmIG5zID09PSBOUy5TVkc7XHJcblxyXG4gICAgICAgIGNhc2UgMTQ6XHJcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5BTk5PVEFUSU9OX1hNTCAmJiBucyA9PT0gTlMuTUFUSE1MO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLy9TdGFjayBvZiBvcGVuIGVsZW1lbnRzXHJcbnZhciBPcGVuRWxlbWVudFN0YWNrID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9jdW1lbnQsIHRyZWVBZGFwdGVyKSB7XHJcbiAgICB0aGlzLnN0YWNrVG9wID0gLTE7XHJcbiAgICB0aGlzLml0ZW1zID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnQgPSBkb2N1bWVudDtcclxuICAgIHRoaXMuY3VycmVudFRhZ05hbWUgPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50VG1wbENvbnRlbnQgPSBudWxsO1xyXG4gICAgdGhpcy50bXBsQ291bnQgPSAwO1xyXG4gICAgdGhpcy50cmVlQWRhcHRlciA9IHRyZWVBZGFwdGVyO1xyXG59O1xyXG5cclxuLy9JbmRleCBvZiBlbGVtZW50XHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLl9pbmRleE9mID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHZhciBpZHggPSAtMTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtc1tpXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZHggPSBpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWR4O1xyXG59O1xyXG5cclxuLy9VcGRhdGUgY3VycmVudCBlbGVtZW50XHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLl9pc0luVGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5URU1QTEFURSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCkgPT09IE5TLkhUTUw7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5fdXBkYXRlQ3VycmVudEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZW1zW3RoaXMuc3RhY2tUb3BdO1xyXG4gICAgdGhpcy5jdXJyZW50VGFnTmFtZSA9IHRoaXMuY3VycmVudCAmJiB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5jdXJyZW50KTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRUbXBsQ29udGVudCA9IHRoaXMuX2lzSW5UZW1wbGF0ZSgpID8gdGhpcy50cmVlQWRhcHRlci5nZXRDaGlsZE5vZGVzKHRoaXMuY3VycmVudClbMF0gOiBudWxsO1xyXG59O1xyXG5cclxuLy9NdXRhdGlvbnNcclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB0aGlzLml0ZW1zWysrdGhpcy5zdGFja1RvcF0gPSBlbGVtZW50O1xyXG4gICAgdGhpcy5fdXBkYXRlQ3VycmVudEVsZW1lbnQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5faXNJblRlbXBsYXRlKCkpXHJcbiAgICAgICAgdGhpcy50bXBsQ291bnQrKztcclxuXHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLnN0YWNrVG9wLS07XHJcblxyXG4gICAgaWYgKHRoaXMudG1wbENvdW50ID4gMCAmJiB0aGlzLl9pc0luVGVtcGxhdGUoKSlcclxuICAgICAgICB0aGlzLnRtcGxDb3VudC0tO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpIHtcclxuICAgIHZhciBpZHggPSB0aGlzLl9pbmRleE9mKG9sZEVsZW1lbnQpO1xyXG4gICAgdGhpcy5pdGVtc1tpZHhdID0gbmV3RWxlbWVudDtcclxuXHJcbiAgICBpZiAoaWR4ID09PSB0aGlzLnN0YWNrVG9wKVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChyZWZlcmVuY2VFbGVtZW50LCBuZXdFbGVtZW50KSB7XHJcbiAgICB2YXIgaW5zZXJ0aW9uSWR4ID0gdGhpcy5faW5kZXhPZihyZWZlcmVuY2VFbGVtZW50KSArIDE7XHJcblxyXG4gICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5zZXJ0aW9uSWR4LCAwLCBuZXdFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaW5zZXJ0aW9uSWR4ID09ICsrdGhpcy5zdGFja1RvcClcclxuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xyXG59O1xyXG5cclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUucG9wVW50aWxUYWdOYW1lUG9wcGVkID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcclxuICAgIHdoaWxlICh0aGlzLnN0YWNrVG9wID4gLTEpIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLmN1cnJlbnRUYWdOYW1lO1xyXG5cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG5cclxuICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG59O1xyXG5cclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUucG9wVW50aWxUZW1wbGF0ZVBvcHBlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHdoaWxlICh0aGlzLnN0YWNrVG9wID4gLTEpIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLmN1cnJlbnRUYWdOYW1lLFxyXG4gICAgICAgICAgICBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9wKCk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gJC5URU1QTEFURSAmJiBucyA9PT0gTlMuSFRNTClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5wb3BVbnRpbEVsZW1lbnRQb3BwZWQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgd2hpbGUgKHRoaXMuc3RhY2tUb3AgPiAtMSkge1xyXG4gICAgICAgIHZhciBwb3BwZWRFbGVtZW50ID0gdGhpcy5jdXJyZW50O1xyXG5cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG5cclxuICAgICAgICBpZiAocG9wcGVkRWxlbWVudCA9PT0gZWxlbWVudClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5wb3BVbnRpbE51bWJlcmVkSGVhZGVyUG9wcGVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgd2hpbGUgKHRoaXMuc3RhY2tUb3AgPiAtMSkge1xyXG4gICAgICAgIHZhciB0biA9IHRoaXMuY3VycmVudFRhZ05hbWU7XHJcblxyXG4gICAgICAgIHRoaXMucG9wKCk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gJC5IMSB8fCB0biA9PT0gJC5IMiB8fCB0biA9PT0gJC5IMyB8fCB0biA9PT0gJC5INCB8fCB0biA9PT0gJC5INSB8fCB0biA9PT0gJC5INilcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5wb3BBbGxVcFRvSHRtbEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAvL05PVEU6IGhlcmUgd2UgYXNzdW1lIHRoYXQgcm9vdCA8aHRtbD4gZWxlbWVudCBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIG9wZW4gZWxlbWVudCBzdGFjaywgc29cclxuICAgIC8vd2UgcGVyZm9ybSB0aGlzIGZhc3Qgc3RhY2sgY2xlYW4gdXAuXHJcbiAgICB0aGlzLnN0YWNrVG9wID0gMDtcclxuICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5jbGVhckJhY2tUb1RhYmxlQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHdoaWxlICh0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLlRBQkxFICYmIHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuVEVNUExBVEUgJiYgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5IVE1MKVxyXG4gICAgICAgIHRoaXMucG9wKCk7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB3aGlsZSAodGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5UQk9EWSAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLlRGT09UICYmXHJcbiAgICAgICAgICAgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5USEVBRCAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLlRFTVBMQVRFICYmXHJcbiAgICAgICAgICAgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5IVE1MKSB7XHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgIH1cclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgd2hpbGUgKHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuVFIgJiYgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5URU1QTEFURSAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLkhUTUwpXHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtc1tpXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1RvcC0tO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vL1NlYXJjaFxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS50cnlQZWVrUHJvcGVybHlOZXN0ZWRCb2R5RWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIC8vUHJvcGVybHkgbmVzdGVkIDxib2R5PiBlbGVtZW50IChzaG91bGQgYmUgc2Vjb25kIGVsZW1lbnQgaW4gc3RhY2spLlxyXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLml0ZW1zWzFdO1xyXG4gICAgcmV0dXJuIGVsZW1lbnQgJiYgdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpID09PSAkLkJPRFkgPyBlbGVtZW50IDogbnVsbDtcclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmRleE9mKGVsZW1lbnQpID4gLTE7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5nZXRDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB2YXIgZWxlbWVudElkeCA9IHRoaXMuX2luZGV4T2YoZWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIC0tZWxlbWVudElkeCA+PSAwID8gdGhpcy5pdGVtc1tlbGVtZW50SWR4XSA6IG51bGw7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5pc1Jvb3RIdG1sRWxlbWVudEN1cnJlbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGFja1RvcCA9PT0gMCAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lID09PSAkLkhUTUw7XHJcbn07XHJcblxyXG4vL0VsZW1lbnQgaW4gc2NvcGVcclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUuaGFzSW5TY29wZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHZhciBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xyXG5cclxuICAgICAgICBpZiAoaXNTY29waW5nRWxlbWVudCh0biwgbnMpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5oYXNOdW1iZXJlZEhlYWRlckluU2NvcGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gJC5IMSB8fCB0biA9PT0gJC5IMiB8fCB0biA9PT0gJC5IMyB8fCB0biA9PT0gJC5INCB8fCB0biA9PT0gJC5INSB8fCB0biA9PT0gJC5INilcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGlmIChpc1Njb3BpbmdFbGVtZW50KHRuLCB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKSkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmhhc0luTGlzdEl0ZW1TY29wZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHZhciBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xyXG5cclxuICAgICAgICBpZiAoKCh0biA9PT0gJC5VTCB8fCB0biA9PT0gJC5PTCkgJiYgbnMgPT09IE5TLkhUTUwpIHx8IGlzU2NvcGluZ0VsZW1lbnQodG4sIG5zKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUuaGFzSW5CdXR0b25TY29wZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHZhciBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xyXG5cclxuICAgICAgICBpZiAoKHRuID09PSAkLkJVVFRPTiAmJiBucyA9PT0gTlMuSFRNTCkgfHwgaXNTY29waW5nRWxlbWVudCh0biwgbnMpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5PcGVuRWxlbWVudFN0YWNrLnByb3RvdHlwZS5oYXNJblRhYmxlU2NvcGUgPSBmdW5jdGlvbiAodGFnTmFtZSkge1xyXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuaXRlbXNbaV0pO1xyXG5cclxuICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICB2YXIgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcclxuXHJcbiAgICAgICAgaWYgKCh0biA9PT0gJC5UQUJMRSB8fCB0biA9PT0gJC5URU1QTEFURSB8fCB0biA9PT0gJC5IVE1MKSAmJiBucyA9PT0gTlMuSFRNTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuT3BlbkVsZW1lbnRTdGFjay5wcm90b3R5cGUuaGFzVGFibGVCb2R5Q29udGV4dEluVGFibGVTY29wZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGZvciAodmFyIGkgPSB0aGlzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZSh0aGlzLml0ZW1zW2ldKTtcclxuXHJcbiAgICAgICAgaWYgKHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRIRUFEIHx8IHRuID09PSAkLlRGT09UKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgdmFyIG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICgodG4gPT09ICQuVEFCTEUgfHwgdG4gPT09ICQuSFRNTCkgJiYgbnMgPT09IE5TLkhUTUwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmhhc0luU2VsZWN0U2NvcGUgPSBmdW5jdGlvbiAodGFnTmFtZSkge1xyXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuaXRlbXNbaV0pO1xyXG5cclxuICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICB2YXIgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcclxuXHJcbiAgICAgICAgaWYgKHRuICE9PSAkLk9QVElPTiAmJiB0biAhPT0gJC5PUFRHUk9VUCAmJiBucyA9PT0gTlMuSFRNTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuLy9JbXBsaWVkIGVuZCB0YWdzXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB3aGlsZSAoaXNJbXBsaWVkRW5kVGFnUmVxdWlyZWQodGhpcy5jdXJyZW50VGFnTmFtZSkpXHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxufTtcclxuXHJcbk9wZW5FbGVtZW50U3RhY2sucHJvdG90eXBlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uID0gZnVuY3Rpb24gKGV4Y2x1c2lvblRhZ05hbWUpIHtcclxuICAgIHdoaWxlIChpc0ltcGxpZWRFbmRUYWdSZXF1aXJlZCh0aGlzLmN1cnJlbnRUYWdOYW1lKSAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSBleGNsdXNpb25UYWdOYW1lKVxyXG4gICAgICAgIHRoaXMucG9wKCk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6YXRpb24vdG9rZW5pemVyJyksXHJcbiAgICBPcGVuRWxlbWVudFN0YWNrID0gcmVxdWlyZSgnLi9vcGVuX2VsZW1lbnRfc3RhY2snKSxcclxuICAgIEZvcm1hdHRpbmdFbGVtZW50TGlzdCA9IHJlcXVpcmUoJy4vZm9ybWF0dGluZ19lbGVtZW50X2xpc3QnKSxcclxuICAgIExvY2F0aW9uSW5mb01peGluID0gcmVxdWlyZSgnLi9sb2NhdGlvbl9pbmZvX21peGluJyksXHJcbiAgICBEZWZhdWx0VHJlZUFkYXB0ZXIgPSByZXF1aXJlKCcuLi90cmVlX2FkYXB0ZXJzL2RlZmF1bHQnKSxcclxuICAgIERvY3R5cGUgPSByZXF1aXJlKCcuLi9jb21tb24vZG9jdHlwZScpLFxyXG4gICAgRm9yZWlnbkNvbnRlbnQgPSByZXF1aXJlKCcuLi9jb21tb24vZm9yZWlnbl9jb250ZW50JyksXHJcbiAgICBVdGlscyA9IHJlcXVpcmUoJy4uL2NvbW1vbi91dGlscycpLFxyXG4gICAgVU5JQ09ERSA9IHJlcXVpcmUoJy4uL2NvbW1vbi91bmljb2RlJyksXHJcbiAgICBIVE1MID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWwnKTtcclxuXHJcbi8vQWxpYXNlc1xyXG52YXIgJCA9IEhUTUwuVEFHX05BTUVTLFxyXG4gICAgTlMgPSBIVE1MLk5BTUVTUEFDRVMsXHJcbiAgICBBVFRSUyA9IEhUTUwuQVRUUlM7XHJcblxyXG4vL0RlZmF1bHQgb3B0aW9uc1xyXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xyXG4gICAgZGVjb2RlSHRtbEVudGl0aWVzOiB0cnVlLFxyXG4gICAgbG9jYXRpb25JbmZvOiBmYWxzZVxyXG59O1xyXG5cclxuLy9NaXNjIGNvbnN0YW50c1xyXG52YXIgU0VBUkNIQUJMRV9JTkRFWF9ERUZBVUxUX1BST01QVCA9ICdUaGlzIGlzIGEgc2VhcmNoYWJsZSBpbmRleC4gRW50ZXIgc2VhcmNoIGtleXdvcmRzOiAnLFxyXG4gICAgU0VBUkNIQUJMRV9JTkRFWF9JTlBVVF9OQU1FID0gJ2lzaW5kZXgnLFxyXG4gICAgSElEREVOX0lOUFVUX1RZUEUgPSAnaGlkZGVuJztcclxuXHJcbi8vQWRvcHRpb24gYWdlbmN5IGxvb3BzIGl0ZXJhdGlvbiBjb3VudFxyXG52YXIgQUFfT1VURVJfTE9PUF9JVEVSID0gOCxcclxuICAgIEFBX0lOTkVSX0xPT1BfSVRFUiA9IDM7XHJcblxyXG4vL0luc2VydGlvbiBtb2Rlc1xyXG52YXIgSU5JVElBTF9NT0RFID0gJ0lOSVRJQUxfTU9ERScsXHJcbiAgICBCRUZPUkVfSFRNTF9NT0RFID0gJ0JFRk9SRV9IVE1MX01PREUnLFxyXG4gICAgQkVGT1JFX0hFQURfTU9ERSA9ICdCRUZPUkVfSEVBRF9NT0RFJyxcclxuICAgIElOX0hFQURfTU9ERSA9ICdJTl9IRUFEX01PREUnLFxyXG4gICAgQUZURVJfSEVBRF9NT0RFID0gJ0FGVEVSX0hFQURfTU9ERScsXHJcbiAgICBJTl9CT0RZX01PREUgPSAnSU5fQk9EWV9NT0RFJyxcclxuICAgIFRFWFRfTU9ERSA9ICdURVhUX01PREUnLFxyXG4gICAgSU5fVEFCTEVfTU9ERSA9ICdJTl9UQUJMRV9NT0RFJyxcclxuICAgIElOX1RBQkxFX1RFWFRfTU9ERSA9ICdJTl9UQUJMRV9URVhUX01PREUnLFxyXG4gICAgSU5fQ0FQVElPTl9NT0RFID0gJ0lOX0NBUFRJT05fTU9ERScsXHJcbiAgICBJTl9DT0xVTU5fR1JPVVBfTU9ERSA9ICdJTl9DT0xVTU5fR1JPVVBfTU9ERScsXHJcbiAgICBJTl9UQUJMRV9CT0RZX01PREUgPSAnSU5fVEFCTEVfQk9EWV9NT0RFJyxcclxuICAgIElOX1JPV19NT0RFID0gJ0lOX1JPV19NT0RFJyxcclxuICAgIElOX0NFTExfTU9ERSA9ICdJTl9DRUxMX01PREUnLFxyXG4gICAgSU5fU0VMRUNUX01PREUgPSAnSU5fU0VMRUNUX01PREUnLFxyXG4gICAgSU5fU0VMRUNUX0lOX1RBQkxFX01PREUgPSAnSU5fU0VMRUNUX0lOX1RBQkxFX01PREUnLFxyXG4gICAgSU5fVEVNUExBVEVfTU9ERSA9ICdJTl9URU1QTEFURV9NT0RFJyxcclxuICAgIEFGVEVSX0JPRFlfTU9ERSA9ICdBRlRFUl9CT0RZX01PREUnLFxyXG4gICAgSU5fRlJBTUVTRVRfTU9ERSA9ICdJTl9GUkFNRVNFVF9NT0RFJyxcclxuICAgIEFGVEVSX0ZSQU1FU0VUX01PREUgPSAnQUZURVJfRlJBTUVTRVRfTU9ERScsXHJcbiAgICBBRlRFUl9BRlRFUl9CT0RZX01PREUgPSAnQUZURVJfQUZURVJfQk9EWV9NT0RFJyxcclxuICAgIEFGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREUgPSAnQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERSc7XHJcblxyXG4vL0luc2VydGlvbiBtb2RlIHJlc2V0IG1hcFxyXG52YXIgSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQID0ge307XHJcblxyXG5JTlNFUlRJT05fTU9ERV9SRVNFVF9NQVBbJC5UUl0gPSBJTl9ST1dfTU9ERTtcclxuSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQWyQuVEJPRFldID1cclxuSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQWyQuVEhFQURdID1cclxuSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQWyQuVEZPT1RdID0gSU5fVEFCTEVfQk9EWV9NT0RFO1xyXG5JTlNFUlRJT05fTU9ERV9SRVNFVF9NQVBbJC5DQVBUSU9OXSA9IElOX0NBUFRJT05fTU9ERTtcclxuSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQWyQuQ09MR1JPVVBdID0gSU5fQ09MVU1OX0dST1VQX01PREU7XHJcbklOU0VSVElPTl9NT0RFX1JFU0VUX01BUFskLlRBQkxFXSA9IElOX1RBQkxFX01PREU7XHJcbklOU0VSVElPTl9NT0RFX1JFU0VUX01BUFskLkJPRFldID0gSU5fQk9EWV9NT0RFO1xyXG5JTlNFUlRJT05fTU9ERV9SRVNFVF9NQVBbJC5GUkFNRVNFVF0gPSBJTl9GUkFNRVNFVF9NT0RFO1xyXG5cclxuLy9UZW1wbGF0ZSBpbnNlcnRpb24gbW9kZSBzd2l0Y2ggbWFwXHJcbnZhciBURU1QTEFURV9JTlNFUlRJT05fTU9ERV9TV0lUQ0hfTUFQID0ge307XHJcblxyXG5URU1QTEFURV9JTlNFUlRJT05fTU9ERV9TV0lUQ0hfTUFQWyQuQ0FQVElPTl0gPVxyXG5URU1QTEFURV9JTlNFUlRJT05fTU9ERV9TV0lUQ0hfTUFQWyQuQ09MR1JPVVBdID1cclxuVEVNUExBVEVfSU5TRVJUSU9OX01PREVfU1dJVENIX01BUFskLlRCT0RZXSA9XHJcblRFTVBMQVRFX0lOU0VSVElPTl9NT0RFX1NXSVRDSF9NQVBbJC5URk9PVF0gPVxyXG5URU1QTEFURV9JTlNFUlRJT05fTU9ERV9TV0lUQ0hfTUFQWyQuVEhFQURdID0gSU5fVEFCTEVfTU9ERTtcclxuVEVNUExBVEVfSU5TRVJUSU9OX01PREVfU1dJVENIX01BUFskLkNPTF0gPSBJTl9DT0xVTU5fR1JPVVBfTU9ERTtcclxuVEVNUExBVEVfSU5TRVJUSU9OX01PREVfU1dJVENIX01BUFskLlRSXSA9IElOX1RBQkxFX0JPRFlfTU9ERTtcclxuVEVNUExBVEVfSU5TRVJUSU9OX01PREVfU1dJVENIX01BUFskLlREXSA9XHJcblRFTVBMQVRFX0lOU0VSVElPTl9NT0RFX1NXSVRDSF9NQVBbJC5USF0gPSBJTl9ST1dfTU9ERTtcclxuXHJcbi8vVG9rZW4gaGFuZGxlcnMgbWFwIGZvciBpbnNlcnRpb24gbW9kZXNcclxudmFyIF8gPSB7fTtcclxuXHJcbl9bSU5JVElBTF9NT0RFXSA9IHt9O1xyXG5fW0lOSVRJQUxfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW0lOSVRJQUxfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IHRva2VuSW5Jbml0aWFsTW9kZTtcclxuX1tJTklUSUFMX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTklUSUFMX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnQ7XHJcbl9bSU5JVElBTF9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBkb2N0eXBlSW5Jbml0aWFsTW9kZTtcclxuX1tJTklUSUFMX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID1cclxuX1tJTklUSUFMX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9XHJcbl9bSU5JVElBTF9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IHRva2VuSW5Jbml0aWFsTW9kZTtcclxuXHJcbl9bQkVGT1JFX0hUTUxfTU9ERV0gPSB7fTtcclxuX1tCRUZPUkVfSFRNTF9NT0RFXVtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXSA9XHJcbl9bQkVGT1JFX0hUTUxfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IHRva2VuQmVmb3JlSHRtbDtcclxuX1tCRUZPUkVfSFRNTF9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bQkVGT1JFX0hUTUxfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tCRUZPUkVfSFRNTF9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tCRUZPUkVfSFRNTF9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnQmVmb3JlSHRtbDtcclxuX1tCRUZPUkVfSFRNTF9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdCZWZvcmVIdG1sO1xyXG5fW0JFRk9SRV9IVE1MX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gdG9rZW5CZWZvcmVIdG1sO1xyXG5cclxuX1tCRUZPUkVfSEVBRF9NT0RFXSA9IHt9O1xyXG5fW0JFRk9SRV9IRUFEX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tCRUZPUkVfSEVBRF9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gdG9rZW5CZWZvcmVIZWFkO1xyXG5fW0JFRk9SRV9IRUFEX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tCRUZPUkVfSEVBRF9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50O1xyXG5fW0JFRk9SRV9IRUFEX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0JFRk9SRV9IRUFEX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdCZWZvcmVIZWFkO1xyXG5fW0JFRk9SRV9IRUFEX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9IGVuZFRhZ0JlZm9yZUhlYWQ7XHJcbl9bQkVGT1JFX0hFQURfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSB0b2tlbkJlZm9yZUhlYWQ7XHJcblxyXG5fW0lOX0hFQURfTU9ERV0gPSB7fTtcclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl0gPSB0b2tlbkluSGVhZDtcclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSBpbnNlcnRDaGFyYWN0ZXJzO1xyXG5fW0lOX0hFQURfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX0hFQURfTU9ERV1bVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl0gPSBzdGFydFRhZ0luSGVhZDtcclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9IGVuZFRhZ0luSGVhZDtcclxuX1tJTl9IRUFEX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gdG9rZW5JbkhlYWQ7XHJcblxyXG5fW0FGVEVSX0hFQURfTU9ERV0gPSB7fTtcclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl0gPSB0b2tlbkFmdGVySGVhZDtcclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSBpbnNlcnRDaGFyYWN0ZXJzO1xyXG5fW0FGVEVSX0hFQURfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0FGVEVSX0hFQURfTU9ERV1bVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl0gPSBzdGFydFRhZ0FmdGVySGVhZDtcclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9IGVuZFRhZ0FmdGVySGVhZDtcclxuX1tBRlRFUl9IRUFEX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gdG9rZW5BZnRlckhlYWQ7XHJcblxyXG5fW0lOX0JPRFlfTU9ERV0gPSB7fTtcclxuX1tJTl9CT0RZX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID0gY2hhcmFjdGVySW5Cb2R5O1xyXG5fW0lOX0JPRFlfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX0JPRFlfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHk7XHJcbl9bSU5fQk9EWV9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50O1xyXG5fW0lOX0JPRFlfTU9ERV1bVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fQk9EWV9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5Cb2R5O1xyXG5fW0lOX0JPRFlfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID0gZW5kVGFnSW5Cb2R5O1xyXG5fW0lOX0JPRFlfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSBlb2ZJbkJvZHk7XHJcblxyXG5fW1RFWFRfTU9ERV0gPSB7fTtcclxuX1tURVhUX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tURVhUX01PREVdW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW1RFWFRfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGluc2VydENoYXJhY3RlcnM7XHJcbl9bVEVYVF9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPVxyXG5fW1RFWFRfTU9ERV1bVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dID1cclxuX1tURVhUX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bVEVYVF9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJblRleHQ7XHJcbl9bVEVYVF9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IGVvZkluVGV4dDtcclxuXHJcbl9bSU5fVEFCTEVfTU9ERV0gPSB7fTtcclxuX1tJTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXSA9XHJcbl9bSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9XHJcbl9bSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGNoYXJhY3RlckluVGFibGU7XHJcbl9bSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tJTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5UYWJsZTtcclxuX1tJTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJblRhYmxlO1xyXG5fW0lOX1RBQkxFX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gZW9mSW5Cb2R5O1xyXG5cclxuX1tJTl9UQUJMRV9URVhUX01PREVdID0ge307XHJcbl9bSU5fVEFCTEVfVEVYVF9NT0RFXVtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXSA9IGNoYXJhY3RlckluVGFibGVUZXh0O1xyXG5fW0lOX1RBQkxFX1RFWFRfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX1RBQkxFX1RFWFRfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IHdoaXRlc3BhY2VDaGFyYWN0ZXJJblRhYmxlVGV4dDtcclxuX1tJTl9UQUJMRV9URVhUX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9XHJcbl9bSU5fVEFCTEVfVEVYVF9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPVxyXG5fW0lOX1RBQkxFX1RFWFRfTU9ERV1bVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl0gPVxyXG5fW0lOX1RBQkxFX1RFWFRfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID1cclxuX1tJTl9UQUJMRV9URVhUX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gdG9rZW5JblRhYmxlVGV4dDtcclxuXHJcbl9bSU5fQ0FQVElPTl9NT0RFXSA9IHt9O1xyXG5fW0lOX0NBUFRJT05fTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPSBjaGFyYWN0ZXJJbkJvZHk7XHJcbl9bSU5fQ0FQVElPTl9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fQ0FQVElPTl9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keTtcclxuX1tJTl9DQVBUSU9OX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnQ7XHJcbl9bSU5fQ0FQVElPTl9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9DQVBUSU9OX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdJbkNhcHRpb247XHJcbl9bSU5fQ0FQVElPTl9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJbkNhcHRpb247XHJcbl9bSU5fQ0FQVElPTl9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IGVvZkluQm9keTtcclxuXHJcbl9bSU5fQ09MVU1OX0dST1VQX01PREVdID0ge307XHJcbl9bSU5fQ09MVU1OX0dST1VQX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tJTl9DT0xVTU5fR1JPVVBfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IHRva2VuSW5Db2x1bW5Hcm91cDtcclxuX1tJTl9DT0xVTU5fR1JPVVBfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGluc2VydENoYXJhY3RlcnM7XHJcbl9bSU5fQ09MVU1OX0dST1VQX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnQ7XHJcbl9bSU5fQ09MVU1OX0dST1VQX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX0NPTFVNTl9HUk9VUF9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5Db2x1bW5Hcm91cDtcclxuX1tJTl9DT0xVTU5fR1JPVVBfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID0gZW5kVGFnSW5Db2x1bW5Hcm91cDtcclxuX1tJTl9DT0xVTU5fR1JPVVBfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSBlb2ZJbkJvZHk7XHJcblxyXG5fW0lOX1RBQkxFX0JPRFlfTU9ERV0gPSB7fTtcclxuX1tJTl9UQUJMRV9CT0RZX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tJTl9UQUJMRV9CT0RZX01PREVdW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW0lOX1RBQkxFX0JPRFlfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGNoYXJhY3RlckluVGFibGU7XHJcbl9bSU5fVEFCTEVfQk9EWV9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50O1xyXG5fW0lOX1RBQkxFX0JPRFlfTU9ERV1bVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fVEFCTEVfQk9EWV9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5UYWJsZUJvZHk7XHJcbl9bSU5fVEFCTEVfQk9EWV9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJblRhYmxlQm9keTtcclxuX1tJTl9UQUJMRV9CT0RZX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gZW9mSW5Cb2R5O1xyXG5cclxuX1tJTl9ST1dfTU9ERV0gPSB7fTtcclxuX1tJTl9ST1dfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW0lOX1JPV19NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID1cclxuX1tJTl9ST1dfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGNoYXJhY3RlckluVGFibGU7XHJcbl9bSU5fUk9XX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnQ7XHJcbl9bSU5fUk9XX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX1JPV19NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5Sb3c7XHJcbl9bSU5fUk9XX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9IGVuZFRhZ0luUm93O1xyXG5fW0lOX1JPV19NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IGVvZkluQm9keTtcclxuXHJcbl9bSU5fQ0VMTF9NT0RFXSA9IHt9O1xyXG5fW0lOX0NFTExfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPSBjaGFyYWN0ZXJJbkJvZHk7XHJcbl9bSU5fQ0VMTF9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fQ0VMTF9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keTtcclxuX1tJTl9DRUxMX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnQ7XHJcbl9bSU5fQ0VMTF9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9DRUxMX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdJbkNlbGw7XHJcbl9bSU5fQ0VMTF9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJbkNlbGw7XHJcbl9bSU5fQ0VMTF9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IGVvZkluQm9keTtcclxuXHJcbl9bSU5fU0VMRUNUX01PREVdID0ge307XHJcbl9bSU5fU0VMRUNUX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID0gaW5zZXJ0Q2hhcmFjdGVycztcclxuX1tJTl9TRUxFQ1RfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0lOX1NFTEVDVF9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gaW5zZXJ0Q2hhcmFjdGVycztcclxuX1tJTl9TRUxFQ1RfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tJTl9TRUxFQ1RfTU9ERV1bVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fU0VMRUNUX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdJblNlbGVjdDtcclxuX1tJTl9TRUxFQ1RfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID0gZW5kVGFnSW5TZWxlY3Q7XHJcbl9bSU5fU0VMRUNUX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gZW9mSW5Cb2R5O1xyXG5cclxuX1tJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERV0gPSB7fTtcclxuX1tJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPSBpbnNlcnRDaGFyYWN0ZXJzO1xyXG5fW0lOX1NFTEVDVF9JTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fU0VMRUNUX0lOX1RBQkxFX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSBpbnNlcnRDaGFyYWN0ZXJzO1xyXG5fW0lOX1NFTEVDVF9JTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50O1xyXG5fW0lOX1NFTEVDVF9JTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl0gPSBzdGFydFRhZ0luU2VsZWN0SW5UYWJsZTtcclxuX1tJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID0gZW5kVGFnSW5TZWxlY3RJblRhYmxlO1xyXG5fW0lOX1NFTEVDVF9JTl9UQUJMRV9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IGVvZkluQm9keTtcclxuXHJcbl9bSU5fVEVNUExBVEVfTU9ERV0gPSB7fTtcclxuX1tJTl9URU1QTEFURV9NT0RFXVtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXSA9IGNoYXJhY3RlckluQm9keTtcclxuX1tJTl9URU1QTEFURV9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fVEVNUExBVEVfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHk7XHJcbl9bSU5fVEVNUExBVEVfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tJTl9URU1QTEFURV9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9URU1QTEFURV9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5UZW1wbGF0ZTtcclxuX1tJTl9URU1QTEFURV9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJblRlbXBsYXRlO1xyXG5fW0lOX1RFTVBMQVRFX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gZW9mSW5UZW1wbGF0ZTtcclxuXHJcbl9bQUZURVJfQk9EWV9NT0RFXSA9IHt9O1xyXG5fW0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IHRva2VuQWZ0ZXJCb2R5O1xyXG5fW0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHk7XHJcbl9bQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50VG9Sb290SHRtbEVsZW1lbnQ7XHJcbl9bQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tBRlRFUl9CT0RZX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdBZnRlckJvZHk7XHJcbl9bQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdBZnRlckJvZHk7XHJcbl9bQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuRU9GX1RPS0VOXSA9IHN0b3BQYXJzaW5nO1xyXG5cclxuX1tJTl9GUkFNRVNFVF9NT0RFXSA9IHt9O1xyXG5fW0lOX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dID1cclxuX1tJTl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bSU5fRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXSA9IGluc2VydENoYXJhY3RlcnM7XHJcbl9bSU5fRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dID0gYXBwZW5kQ29tbWVudDtcclxuX1tJTl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tJTl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnSW5GcmFtZXNldDtcclxuX1tJTl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSBlbmRUYWdJbkZyYW1lc2V0O1xyXG5fW0lOX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5FT0ZfVE9LRU5dID0gc3RvcFBhcnNpbmc7XHJcblxyXG5fW0FGVEVSX0ZSQU1FU0VUX01PREVdID0ge307XHJcbl9bQUZURVJfRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPVxyXG5fW0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl0gPSBpZ25vcmVUb2tlbjtcclxuX1tBRlRFUl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gaW5zZXJ0Q2hhcmFjdGVycztcclxuX1tBRlRFUl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl0gPSBhcHBlbmRDb21tZW50O1xyXG5fW0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdBZnRlckZyYW1lc2V0O1xyXG5fW0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXSA9IGVuZFRhZ0FmdGVyRnJhbWVzZXQ7XHJcbl9bQUZURVJfRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSBzdG9wUGFyc2luZztcclxuXHJcbl9bQUZURVJfQUZURVJfQk9EWV9NT0RFXSA9IHt9O1xyXG5fW0FGVEVSX0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl0gPSB0b2tlbkFmdGVyQWZ0ZXJCb2R5O1xyXG5fW0FGVEVSX0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IHRva2VuQWZ0ZXJBZnRlckJvZHk7XHJcbl9bQUZURVJfQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dID0gd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keTtcclxuX1tBRlRFUl9BRlRFUl9CT0RZX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnRUb0RvY3VtZW50O1xyXG5fW0FGVEVSX0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bQUZURVJfQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXSA9IHN0YXJ0VGFnQWZ0ZXJBZnRlckJvZHk7XHJcbl9bQUZURVJfQUZURVJfQk9EWV9NT0RFXVtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl0gPSB0b2tlbkFmdGVyQWZ0ZXJCb2R5O1xyXG5fW0FGVEVSX0FGVEVSX0JPRFlfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSBzdG9wUGFyc2luZztcclxuXHJcbl9bQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERV0gPSB7fTtcclxuX1tBRlRFUl9BRlRFUl9GUkFNRVNFVF9NT0RFXVtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXSA9XHJcbl9bQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0FGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl0gPSB3aGl0ZXNwYWNlQ2hhcmFjdGVySW5Cb2R5O1xyXG5fW0FGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXSA9IGFwcGVuZENvbW1lbnRUb0RvY3VtZW50O1xyXG5fW0FGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXSA9IGlnbm9yZVRva2VuO1xyXG5fW0FGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREVdW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dID0gc3RhcnRUYWdBZnRlckFmdGVyRnJhbWVzZXQ7XHJcbl9bQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dID0gaWdub3JlVG9rZW47XHJcbl9bQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERV1bVG9rZW5pemVyLkVPRl9UT0tFTl0gPSBzdG9wUGFyc2luZztcclxuXHJcbi8vU2VhcmNoYWJsZSBpbmRleCBidWlsZGluZyB1dGlscyAoPGlzaW5kZXg+IHRhZylcclxuZnVuY3Rpb24gZ2V0U2VhcmNoYWJsZUluZGV4Rm9ybUF0dHJzKGlzaW5kZXhTdGFydFRhZ1Rva2VuKSB7XHJcbiAgICB2YXIgaW5kZXhBY3Rpb24gPSBUb2tlbml6ZXIuZ2V0VG9rZW5BdHRyKGlzaW5kZXhTdGFydFRhZ1Rva2VuLCBBVFRSUy5BQ1RJT04pLFxyXG4gICAgICAgIGF0dHJzID0gW107XHJcblxyXG4gICAgaWYgKGluZGV4QWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgYXR0cnMucHVzaCh7XHJcbiAgICAgICAgICAgIG5hbWU6IEFUVFJTLkFDVElPTixcclxuICAgICAgICAgICAgdmFsdWU6IGluZGV4QWN0aW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF0dHJzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTZWFyY2hhYmxlSW5kZXhMYWJlbFRleHQoaXNpbmRleFN0YXJ0VGFnVG9rZW4pIHtcclxuICAgIHZhciBpbmRleFByb21wdCA9IFRva2VuaXplci5nZXRUb2tlbkF0dHIoaXNpbmRleFN0YXJ0VGFnVG9rZW4sIEFUVFJTLlBST01QVCk7XHJcblxyXG4gICAgcmV0dXJuIGluZGV4UHJvbXB0ID09PSBudWxsID8gU0VBUkNIQUJMRV9JTkRFWF9ERUZBVUxUX1BST01QVCA6IGluZGV4UHJvbXB0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTZWFyY2hhYmxlSW5kZXhJbnB1dEF0dHJzKGlzaW5kZXhTdGFydFRhZ1Rva2VuKSB7XHJcbiAgICB2YXIgaXNpbmRleEF0dHJzID0gaXNpbmRleFN0YXJ0VGFnVG9rZW4uYXR0cnMsXHJcbiAgICAgICAgaW5wdXRBdHRycyA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXNpbmRleEF0dHJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIG5hbWUgPSBpc2luZGV4QXR0cnNbaV0ubmFtZTtcclxuXHJcbiAgICAgICAgaWYgKG5hbWUgIT09IEFUVFJTLk5BTUUgJiYgbmFtZSAhPT0gQVRUUlMuQUNUSU9OICYmIG5hbWUgIT09IEFUVFJTLlBST01QVClcclxuICAgICAgICAgICAgaW5wdXRBdHRycy5wdXNoKGlzaW5kZXhBdHRyc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXRBdHRycy5wdXNoKHtcclxuICAgICAgICBuYW1lOiBBVFRSUy5OQU1FLFxyXG4gICAgICAgIHZhbHVlOiBTRUFSQ0hBQkxFX0lOREVYX0lOUFVUX05BTUVcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpbnB1dEF0dHJzO1xyXG59XHJcblxyXG4vL1BhcnNlclxyXG52YXIgUGFyc2VyID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodHJlZUFkYXB0ZXIsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMudHJlZUFkYXB0ZXIgPSB0cmVlQWRhcHRlciB8fCBEZWZhdWx0VHJlZUFkYXB0ZXI7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBVdGlscy5tZXJnZU9wdGlvbnMoREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKTtcclxuICAgIHRoaXMuc2NyaXB0SGFuZGxlciA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbkluZm8pXHJcbiAgICAgICAgTG9jYXRpb25JbmZvTWl4aW4uYXNzaWduKHRoaXMpO1xyXG59O1xyXG5cclxuLy9BUElcclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChodG1sKSB7XHJcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZURvY3VtZW50KCk7XHJcblxyXG4gICAgdGhpcy5fcmVzZXQoaHRtbCwgZG9jdW1lbnQsIG51bGwpO1xyXG4gICAgdGhpcy5fcnVuUGFyc2luZ0xvb3AoKTtcclxuXHJcbiAgICByZXR1cm4gZG9jdW1lbnQ7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJhZ21lbnQgPSBmdW5jdGlvbiAoaHRtbCwgZnJhZ21lbnRDb250ZXh0KSB7XHJcbiAgICAvL05PVEU6IHVzZSA8dGVtcGxhdGU+IGVsZW1lbnQgYXMgYSBmcmFnbWVudCBjb250ZXh0IGlmIGNvbnRleHQgZWxlbWVudCB3YXMgbm90IHByb3ZpZGVkLFxyXG4gICAgLy9zbyB3ZSB3aWxsIHBhcnNlIGluIFwiZm9yZ2l2aW5nXCIgbWFubmVyXHJcbiAgICBpZiAoIWZyYWdtZW50Q29udGV4dClcclxuICAgICAgICBmcmFnbWVudENvbnRleHQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQoJC5URU1QTEFURSwgTlMuSFRNTCwgW10pO1xyXG5cclxuICAgIC8vTk9URTogY3JlYXRlIGZha2UgZWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgJ2RvY3VtZW50JyBmb3IgZnJhZ21lbnQgcGFyc2luZy5cclxuICAgIC8vVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGpzZG9tIHRoZXJlICdkb2N1bWVudCcgY2FuJ3QgYmUgcmVjcmVhdGVkLCB0aGVyZWZvcmVcclxuICAgIC8vZnJhZ21lbnQgcGFyc2luZyBjYXVzZXMgbWVzc2luZyBvZiB0aGUgbWFpbiBgZG9jdW1lbnRgLlxyXG4gICAgdmFyIGRvY3VtZW50TW9jayA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCgnZG9jdW1lbnRtb2NrJywgTlMuSFRNTCwgW10pO1xyXG5cclxuICAgIHRoaXMuX3Jlc2V0KGh0bWwsIGRvY3VtZW50TW9jaywgZnJhZ21lbnRDb250ZXh0KTtcclxuXHJcbiAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGZyYWdtZW50Q29udGV4dCkgPT09ICQuVEVNUExBVEUpXHJcbiAgICAgICAgdGhpcy5fcHVzaFRtcGxJbnNlcnRpb25Nb2RlKElOX1RFTVBMQVRFX01PREUpO1xyXG5cclxuICAgIHRoaXMuX2luaXRUb2tlbml6ZXJGb3JGcmFnbWVudFBhcnNpbmcoKTtcclxuICAgIHRoaXMuX2luc2VydEZha2VSb290RWxlbWVudCgpO1xyXG4gICAgdGhpcy5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XHJcbiAgICB0aGlzLl9maW5kRm9ybUluRnJhZ21lbnRDb250ZXh0KCk7XHJcbiAgICB0aGlzLl9ydW5QYXJzaW5nTG9vcCgpO1xyXG5cclxuICAgIHZhciByb290RWxlbWVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChkb2N1bWVudE1vY2spLFxyXG4gICAgICAgIGZyYWdtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblxyXG4gICAgdGhpcy5fYWRvcHROb2Rlcyhyb290RWxlbWVudCwgZnJhZ21lbnQpO1xyXG5cclxuICAgIHJldHVybiBmcmFnbWVudDtcclxufTtcclxuXHJcbi8vUmVzZXQgc3RhdGVcclxuUGFyc2VyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbiAoaHRtbCwgZG9jdW1lbnQsIGZyYWdtZW50Q29udGV4dCkge1xyXG4gICAgdGhpcy50b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKGh0bWwsIHRoaXMub3B0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5JVElBTF9NT0RFO1xyXG4gICAgdGhpcy5vcmlnaW5hbEluc2VydGlvbk1vZGUgPSAnJztcclxuXHJcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICB0aGlzLmZyYWdtZW50Q29udGV4dCA9IGZyYWdtZW50Q29udGV4dDtcclxuXHJcbiAgICB0aGlzLmhlYWRFbGVtZW50ID0gbnVsbDtcclxuICAgIHRoaXMuZm9ybUVsZW1lbnQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMub3BlbkVsZW1lbnRzID0gbmV3IE9wZW5FbGVtZW50U3RhY2sodGhpcy5kb2N1bWVudCwgdGhpcy50cmVlQWRhcHRlcik7XHJcbiAgICB0aGlzLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyA9IG5ldyBGb3JtYXR0aW5nRWxlbWVudExpc3QodGhpcy50cmVlQWRhcHRlcik7XHJcblxyXG4gICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrID0gW107XHJcbiAgICB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tUb3AgPSAtMTtcclxuICAgIHRoaXMuY3VycmVudFRtcGxJbnNlcnRpb25Nb2RlID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMgPSBbXTtcclxuICAgIHRoaXMuaGFzTm9uV2hpdGVzcGFjZVBlbmRpbmdDaGFyYWN0ZXJUb2tlbiA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuZnJhbWVzZXRPayA9IHRydWU7XHJcbiAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb3N0ZXJQYXJlbnRpbmdFbmFibGVkID0gZmFsc2U7XHJcbn07XHJcblxyXG4vL1BhcnNpbmcgbG9vcFxyXG5QYXJzZXIucHJvdG90eXBlLl9pdGVyYXRlUGFyc2luZ0xvb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLl9zZXR1cFRva2VuaXplckNEQVRBTW9kZSgpO1xyXG5cclxuICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW5pemVyLmdldE5leHRUb2tlbigpO1xyXG5cclxuICAgIGlmICh0aGlzLnNraXBOZXh0TmV3TGluZSkge1xyXG4gICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU4gJiYgdG9rZW4uY2hhcnNbMF0gPT09ICdcXG4nKSB7XHJcbiAgICAgICAgICAgIGlmICh0b2tlbi5jaGFycy5sZW5ndGggPT09IDEpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0b2tlbi5jaGFycyA9IHRva2VuLmNoYXJzLnN1YnN0cigxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3Nob3VsZFByb2Nlc3NUb2tlbkluRm9yZWlnbkNvbnRlbnQodG9rZW4pKVxyXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NUb2tlbkluRm9yZWlnbkNvbnRlbnQodG9rZW4pO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fcnVuUGFyc2luZ0xvb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB3aGlsZSAoIXRoaXMuc3RvcHBlZClcclxuICAgICAgICB0aGlzLl9pdGVyYXRlUGFyc2luZ0xvb3AoKTtcclxufTtcclxuXHJcbi8vVGV4dCBwYXJzaW5nXHJcblBhcnNlci5wcm90b3R5cGUuX3NldHVwVG9rZW5pemVyQ0RBVEFNb2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLl9nZXRBZGp1c3RlZEN1cnJlbnRFbGVtZW50KCk7XHJcblxyXG4gICAgdGhpcy50b2tlbml6ZXIuYWxsb3dDREFUQSA9IGN1cnJlbnQgJiYgY3VycmVudCAhPT0gdGhpcy5kb2N1bWVudCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGN1cnJlbnQpICE9PSBOUy5IVE1MICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0aGlzLl9pc0h0bWxJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnQpKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghdGhpcy5faXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChjdXJyZW50KSk7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9zd2l0Y2hUb1RleHRQYXJzaW5nID0gZnVuY3Rpb24gKGN1cnJlbnRUb2tlbiwgbmV4dFRva2VuaXplclN0YXRlKSB7XHJcbiAgICB0aGlzLl9pbnNlcnRFbGVtZW50KGN1cnJlbnRUb2tlbiwgTlMuSFRNTCk7XHJcbiAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IG5leHRUb2tlbml6ZXJTdGF0ZTtcclxuICAgIHRoaXMub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gdGhpcy5pbnNlcnRpb25Nb2RlO1xyXG4gICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gVEVYVF9NT0RFO1xyXG59O1xyXG5cclxuLy9GcmFnbWVudCBwYXJzaW5nXHJcblBhcnNlci5wcm90b3R5cGUuX2dldEFkanVzdGVkQ3VycmVudEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVuRWxlbWVudHMuc3RhY2tUb3AgPT09IDAgJiYgdGhpcy5mcmFnbWVudENvbnRleHQgP1xyXG4gICAgICAgICAgIHRoaXMuZnJhZ21lbnRDb250ZXh0IDpcclxuICAgICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fZmluZEZvcm1JbkZyYWdtZW50Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBub2RlID0gdGhpcy5mcmFnbWVudENvbnRleHQ7XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmICh0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUobm9kZSkgPT09ICQuRk9STSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50ID0gbm9kZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlID0gdGhpcy50cmVlQWRhcHRlci5nZXRQYXJlbnROb2RlKG5vZGUpO1xyXG4gICAgfSB3aGlsZSAobm9kZSk7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9pbml0VG9rZW5pemVyRm9yRnJhZ21lbnRQYXJzaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuZnJhZ21lbnRDb250ZXh0KTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuVElUTEUgfHwgdG4gPT09ICQuVEVYVEFSRUEpXHJcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5SQ0RBVEE7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuU1RZTEUgfHwgdG4gPT09ICQuWE1QIHx8IHRuID09PSAkLklGUkFNRSB8fFxyXG4gICAgICAgICAgICAgdG4gPT09ICQuTk9FTUJFRCB8fCB0biA9PT0gJC5OT0ZSQU1FUyB8fCB0biA9PT0gJC5OT1NDUklQVCkge1xyXG4gICAgICAgIHRoaXMudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUkFXVEVYVDtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5TQ1JJUFQpXHJcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5TQ1JJUFRfREFUQTtcclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5QTEFJTlRFWFQpXHJcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5QTEFJTlRFWFQ7XHJcbn07XHJcblxyXG4vL1RyZWUgbXV0YXRpb25cclxuUGFyc2VyLnByb3RvdHlwZS5fc2V0RG9jdW1lbnRUeXBlID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICB0aGlzLnRyZWVBZGFwdGVyLnNldERvY3VtZW50VHlwZSh0aGlzLmRvY3VtZW50LCB0b2tlbi5uYW1lLCB0b2tlbi5wdWJsaWNJZCwgdG9rZW4uc3lzdGVtSWQpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fYXR0YWNoRWxlbWVudFRvVHJlZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICBpZiAodGhpcy5fc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSlcclxuICAgICAgICB0aGlzLl9mb3N0ZXJQYXJlbnRFbGVtZW50KGVsZW1lbnQpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50VG1wbENvbnRlbnQgfHwgdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudDtcclxuXHJcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChwYXJlbnQsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fYXBwZW5kRWxlbWVudCA9IGZ1bmN0aW9uICh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XHJcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCh0b2tlbi50YWdOYW1lLCBuYW1lc3BhY2VVUkksIHRva2VuLmF0dHJzKTtcclxuXHJcbiAgICB0aGlzLl9hdHRhY2hFbGVtZW50VG9UcmVlKGVsZW1lbnQpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5faW5zZXJ0RWxlbWVudCA9IGZ1bmN0aW9uICh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XHJcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCh0b2tlbi50YWdOYW1lLCBuYW1lc3BhY2VVUkksIHRva2VuLmF0dHJzKTtcclxuXHJcbiAgICB0aGlzLl9hdHRhY2hFbGVtZW50VG9UcmVlKGVsZW1lbnQpO1xyXG4gICAgdGhpcy5vcGVuRWxlbWVudHMucHVzaChlbGVtZW50KTtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX2luc2VydFRlbXBsYXRlID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICB2YXIgdG1wbCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCh0b2tlbi50YWdOYW1lLCBOUy5IVE1MLCB0b2tlbi5hdHRycyksXHJcbiAgICAgICAgY29udGVudCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cclxuICAgIHRoaXMudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQodG1wbCwgY29udGVudCk7XHJcbiAgICB0aGlzLl9hdHRhY2hFbGVtZW50VG9UcmVlKHRtcGwpO1xyXG4gICAgdGhpcy5vcGVuRWxlbWVudHMucHVzaCh0bXBsKTtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX2luc2VydEZha2VSb290RWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBlbGVtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KCQuSFRNTCwgTlMuSFRNTCwgW10pO1xyXG5cclxuICAgIHRoaXMudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQodGhpcy5vcGVuRWxlbWVudHMuY3VycmVudCwgZWxlbWVudCk7XHJcbiAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fYXBwZW5kQ29tbWVudE5vZGUgPSBmdW5jdGlvbiAodG9rZW4sIHBhcmVudCkge1xyXG4gICAgdmFyIGNvbW1lbnROb2RlID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVDb21tZW50Tm9kZSh0b2tlbi5kYXRhKTtcclxuXHJcbiAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKHBhcmVudCwgY29tbWVudE5vZGUpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5faW5zZXJ0Q2hhcmFjdGVycyA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgaWYgKHRoaXMuX3Nob3VsZEZvc3RlclBhcmVudE9uSW5zZXJ0aW9uKCkpXHJcbiAgICAgICAgdGhpcy5fZm9zdGVyUGFyZW50VGV4dCh0b2tlbi5jaGFycyk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnRUbXBsQ29udGVudCB8fCB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xyXG5cclxuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmluc2VydFRleHQocGFyZW50LCB0b2tlbi5jaGFycyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9hZG9wdE5vZGVzID0gZnVuY3Rpb24gKGRvbm9yLCByZWNpcGllbnQpIHtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy50cmVlQWRhcHRlci5nZXRGaXJzdENoaWxkKGRvbm9yKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZClcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShjaGlsZCk7XHJcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChyZWNpcGllbnQsIGNoaWxkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vVG9rZW4gcHJvY2Vzc2luZ1xyXG5QYXJzZXIucHJvdG90eXBlLl9zaG91bGRQcm9jZXNzVG9rZW5JbkZvcmVpZ25Db250ZW50ID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICB2YXIgY3VycmVudCA9IHRoaXMuX2dldEFkanVzdGVkQ3VycmVudEVsZW1lbnQoKTtcclxuXHJcbiAgICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudCA9PT0gdGhpcy5kb2N1bWVudClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdmFyIG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoY3VycmVudCk7XHJcblxyXG4gICAgaWYgKG5zID09PSBOUy5IVE1MKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGN1cnJlbnQpID09PSAkLkFOTk9UQVRJT05fWE1MICYmIG5zID09PSBOUy5NQVRITUwgJiZcclxuICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOICYmIHRva2VuLnRhZ05hbWUgPT09ICQuU1ZHKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBpc0NoYXJhY3RlclRva2VuID0gdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU4gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOLFxyXG4gICAgICAgIGlzTWF0aE1MVGV4dFN0YXJ0VGFnID0gdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udGFnTmFtZSAhPT0gJC5NR0xZUEggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnRhZ05hbWUgIT09ICQuTUFMSUdOTUFSSztcclxuXHJcbiAgICBpZiAoKGlzTWF0aE1MVGV4dFN0YXJ0VGFnIHx8IGlzQ2hhcmFjdGVyVG9rZW4pICYmIHRoaXMuX2lzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQoY3VycmVudCkpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICgodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTiB8fCBpc0NoYXJhY3RlclRva2VuKSAmJiB0aGlzLl9pc0h0bWxJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnQpKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdG9rZW4udHlwZSAhPT0gVG9rZW5pemVyLkVPRl9UT0tFTjtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX3Byb2Nlc3NUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgX1t0aGlzLmluc2VydGlvbk1vZGVdW3Rva2VuLnR5cGVdKHRoaXMsIHRva2VuKTtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX3Byb2Nlc3NUb2tlbkluQm9keU1vZGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIF9bSU5fQk9EWV9NT0RFXVt0b2tlbi50eXBlXSh0aGlzLCB0b2tlbik7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9wcm9jZXNzVG9rZW5JbkZvcmVpZ25Db250ZW50ID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTilcclxuICAgICAgICBjaGFyYWN0ZXJJbkZvcmVpZ25Db250ZW50KHRoaXMsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU4pXHJcbiAgICAgICAgbnVsbENoYXJhY3RlckluRm9yZWlnbkNvbnRlbnQodGhpcywgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTilcclxuICAgICAgICBpbnNlcnRDaGFyYWN0ZXJzKHRoaXMsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTilcclxuICAgICAgICBhcHBlbmRDb21tZW50KHRoaXMsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOKVxyXG4gICAgICAgIHN0YXJ0VGFnSW5Gb3JlaWduQ29udGVudCh0aGlzLCB0b2tlbik7XHJcblxyXG4gICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4pXHJcbiAgICAgICAgZW5kVGFnSW5Gb3JlaWduQ29udGVudCh0aGlzLCB0b2tlbik7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9wcm9jZXNzRmFrZVN0YXJ0VGFnV2l0aEF0dHJzID0gZnVuY3Rpb24gKHRhZ05hbWUsIGF0dHJzKSB7XHJcbiAgICB2YXIgZmFrZVRva2VuID0gdGhpcy50b2tlbml6ZXIuYnVpbGRTdGFydFRhZ1Rva2VuKHRhZ05hbWUpO1xyXG5cclxuICAgIGZha2VUb2tlbi5hdHRycyA9IGF0dHJzO1xyXG4gICAgdGhpcy5fcHJvY2Vzc1Rva2VuKGZha2VUb2tlbik7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9wcm9jZXNzRmFrZVN0YXJ0VGFnID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcclxuICAgIHZhciBmYWtlVG9rZW4gPSB0aGlzLnRva2VuaXplci5idWlsZFN0YXJ0VGFnVG9rZW4odGFnTmFtZSk7XHJcblxyXG4gICAgdGhpcy5fcHJvY2Vzc1Rva2VuKGZha2VUb2tlbik7XHJcbiAgICByZXR1cm4gZmFrZVRva2VuO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fcHJvY2Vzc0Zha2VFbmRUYWcgPSBmdW5jdGlvbiAodGFnTmFtZSkge1xyXG4gICAgdmFyIGZha2VUb2tlbiA9IHRoaXMudG9rZW5pemVyLmJ1aWxkRW5kVGFnVG9rZW4odGFnTmFtZSk7XHJcblxyXG4gICAgdGhpcy5fcHJvY2Vzc1Rva2VuKGZha2VUb2tlbik7XHJcbiAgICByZXR1cm4gZmFrZVRva2VuO1xyXG59O1xyXG5cclxuLy9JbnRlZ3JhdGlvbiBwb2ludHNcclxuUGFyc2VyLnByb3RvdHlwZS5faXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCksXHJcbiAgICAgICAgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KTtcclxuXHJcbiAgICByZXR1cm4gRm9yZWlnbkNvbnRlbnQuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludCh0biwgbnMpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5faXNIdG1sSW50ZWdyYXRpb25Qb2ludCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCksXHJcbiAgICAgICAgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KSxcclxuICAgICAgICBhdHRycyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0QXR0ckxpc3QoZWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIEZvcmVpZ25Db250ZW50LmlzSHRtbEludGVncmF0aW9uUG9pbnQodG4sIG5zLCBhdHRycyk7XHJcbn07XHJcblxyXG4vL0FjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnRzIHJlY29uc3RydWN0aW9uXHJcblBhcnNlci5wcm90b3R5cGUuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGxpc3RMZW5ndGggPSB0aGlzLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGxpc3RMZW5ndGgpIHtcclxuICAgICAgICB2YXIgdW5vcGVuSWR4ID0gbGlzdExlbmd0aCxcclxuICAgICAgICAgICAgZW50cnkgPSBudWxsO1xyXG5cclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHVub3BlbklkeC0tO1xyXG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmVudHJpZXNbdW5vcGVuSWR4XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBGb3JtYXR0aW5nRWxlbWVudExpc3QuTUFSS0VSX0VOVFJZIHx8IHRoaXMub3BlbkVsZW1lbnRzLmNvbnRhaW5zKGVudHJ5LmVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB1bm9wZW5JZHgrKztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSB3aGlsZSAodW5vcGVuSWR4ID4gMCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSB1bm9wZW5JZHg7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5lbnRyaWVzW2ldO1xyXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnRFbGVtZW50KGVudHJ5LnRva2VuLCB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbnRyeS5lbGVtZW50KSk7XHJcbiAgICAgICAgICAgIGVudHJ5LmVsZW1lbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8vQ2xvc2UgZWxlbWVudHNcclxuUGFyc2VyLnByb3RvdHlwZS5fY2xvc2VUYWJsZUNlbGwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKCQuVEQpKVxyXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NGYWtlRW5kVGFnKCQuVEQpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9wcm9jZXNzRmFrZUVuZFRhZygkLlRIKTtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX2Nsb3NlUEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbigkLlApO1xyXG4gICAgdGhpcy5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuUCk7XHJcbn07XHJcblxyXG4vL0luc2VydGlvbiBtb2Rlc1xyXG5QYXJzZXIucHJvdG90eXBlLl9yZXNldEluc2VydGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBmb3IgKHZhciBpID0gdGhpcy5vcGVuRWxlbWVudHMuc3RhY2tUb3AsIGxhc3QgPSBmYWxzZTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zW2ldO1xyXG5cclxuICAgICAgICBpZiAoaSA9PT0gMCkge1xyXG4gICAgICAgICAgICBsYXN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZyYWdtZW50Q29udGV4dClcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmZyYWdtZW50Q29udGV4dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSxcclxuICAgICAgICAgICAgbmV3SW5zZXJ0aW9uTW9kZSA9IElOU0VSVElPTl9NT0RFX1JFU0VUX01BUFt0bl07XHJcblxyXG4gICAgICAgIGlmIChuZXdJbnNlcnRpb25Nb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IG5ld0luc2VydGlvbk1vZGU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSBpZiAoIWxhc3QgJiYgKHRuID09PSAkLlREIHx8IHRuID09PSAkLlRIKSkge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJTl9DRUxMX01PREU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSBpZiAoIWxhc3QgJiYgdG4gPT09ICQuSEVBRCkge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJTl9IRUFEX01PREU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuU0VMRUNUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0SW5zZXJ0aW9uTW9kZUZvclNlbGVjdChpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSkge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSB0aGlzLmN1cnJlbnRUbXBsSW5zZXJ0aW9uTW9kZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5IVE1MKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IHRoaXMuaGVhZEVsZW1lbnQgPyBBRlRFUl9IRUFEX01PREUgOiBCRUZPUkVfSEVBRF9NT0RFO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKGxhc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9yZXNldEluc2VydGlvbk1vZGVGb3JTZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0SWR4KSB7XHJcbiAgICBpZiAoc2VsZWN0SWR4ID4gMCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSBzZWxlY3RJZHggLSAxOyBpID4gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIHZhciBhbmNlc3RvciA9IHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zW2ldLFxyXG4gICAgICAgICAgICAgICAgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoYW5jZXN0b3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlRFTVBMQVRFKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5fU0VMRUNUX0lOX1RBQkxFX01PREU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5fU0VMRUNUX01PREU7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9wdXNoVG1wbEluc2VydGlvbk1vZGUgPSBmdW5jdGlvbiAobW9kZSkge1xyXG4gICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrLnB1c2gobW9kZSk7XHJcbiAgICB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tUb3ArKztcclxuICAgIHRoaXMuY3VycmVudFRtcGxJbnNlcnRpb25Nb2RlID0gbW9kZTtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuX3BvcFRtcGxJbnNlcnRpb25Nb2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrLnBvcCgpO1xyXG4gICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrVG9wLS07XHJcbiAgICB0aGlzLmN1cnJlbnRUbXBsSW5zZXJ0aW9uTW9kZSA9IHRoaXMudG1wbEluc2VydGlvbk1vZGVTdGFja1t0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tUb3BdO1xyXG59O1xyXG5cclxuLy9Gb3N0ZXIgcGFyZW50aW5nXHJcblBhcnNlci5wcm90b3R5cGUuX2lzRWxlbWVudENhdXNlc0Zvc3RlclBhcmVudGluZyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB2YXIgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIHRuID09PSAkLlRBQkxFIHx8IHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRGT09UIHx8IHRuID09ICQuVEhFQUQgfHwgdG4gPT09ICQuVFI7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9zaG91bGRGb3N0ZXJQYXJlbnRPbkluc2VydGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgJiYgdGhpcy5faXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fZmluZEZvc3RlclBhcmVudGluZ0xvY2F0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGxvY2F0aW9uID0ge1xyXG4gICAgICAgIHBhcmVudDogbnVsbCxcclxuICAgICAgICBiZWZvcmVFbGVtZW50OiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAodmFyIGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgb3BlbkVsZW1lbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1tpXSxcclxuICAgICAgICAgICAgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUob3BlbkVsZW1lbnQpLFxyXG4gICAgICAgICAgICBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKG9wZW5FbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MKSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2RlcyhvcGVuRWxlbWVudClbMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVEFCTEUpIHtcclxuICAgICAgICAgICAgbG9jYXRpb24ucGFyZW50ID0gdGhpcy50cmVlQWRhcHRlci5nZXRQYXJlbnROb2RlKG9wZW5FbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbi5wYXJlbnQpXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5iZWZvcmVFbGVtZW50ID0gb3BlbkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudCA9IHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zW2kgLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWxvY2F0aW9uLnBhcmVudClcclxuICAgICAgICBsb2NhdGlvbi5wYXJlbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1swXTtcclxuXHJcbiAgICByZXR1cm4gbG9jYXRpb247XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLl9mb3N0ZXJQYXJlbnRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2ZpbmRGb3N0ZXJQYXJlbnRpbmdMb2NhdGlvbigpO1xyXG5cclxuICAgIGlmIChsb2NhdGlvbi5iZWZvcmVFbGVtZW50KVxyXG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuaW5zZXJ0QmVmb3JlKGxvY2F0aW9uLnBhcmVudCwgZWxlbWVudCwgbG9jYXRpb24uYmVmb3JlRWxlbWVudCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChsb2NhdGlvbi5wYXJlbnQsIGVsZW1lbnQpO1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5fZm9zdGVyUGFyZW50VGV4dCA9IGZ1bmN0aW9uIChjaGFycykge1xyXG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5fZmluZEZvc3RlclBhcmVudGluZ0xvY2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQpXHJcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5pbnNlcnRUZXh0QmVmb3JlKGxvY2F0aW9uLnBhcmVudCwgY2hhcnMsIGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuaW5zZXJ0VGV4dChsb2NhdGlvbi5wYXJlbnQsIGNoYXJzKTtcclxufTtcclxuXHJcbi8vU3BlY2lhbCBlbGVtZW50c1xyXG5QYXJzZXIucHJvdG90eXBlLl9pc1NwZWNpYWxFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgIHZhciB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSxcclxuICAgICAgICBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnQpO1xyXG5cclxuICAgIHJldHVybiBIVE1MLlNQRUNJQUxfRUxFTUVOVFNbbnNdW3RuXTtcclxufTtcclxuXHJcbi8vQWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobVxyXG4vLyhzZWU6IGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RyZWUtY29uc3RydWN0aW9uLmh0bWwjYWRvcHRpb25BZ2VuY3kpXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vL1N0ZXBzIDUtOCBvZiB0aGUgYWxnb3JpdGhtXHJcbmZ1bmN0aW9uIGFhT2J0YWluRm9ybWF0dGluZ0VsZW1lbnRFbnRyeShwLCB0b2tlbikge1xyXG4gICAgdmFyIGZvcm1hdHRpbmdFbGVtZW50RW50cnkgPSBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5nZXRFbGVtZW50RW50cnlJblNjb3BlV2l0aFRhZ05hbWUodG9rZW4udGFnTmFtZSk7XHJcblxyXG4gICAgaWYgKGZvcm1hdHRpbmdFbGVtZW50RW50cnkpIHtcclxuICAgICAgICBpZiAoIXAub3BlbkVsZW1lbnRzLmNvbnRhaW5zKGZvcm1hdHRpbmdFbGVtZW50RW50cnkuZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XHJcbiAgICAgICAgICAgIGZvcm1hdHRpbmdFbGVtZW50RW50cnkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSBpZiAoIXAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUodG9rZW4udGFnTmFtZSkpXHJcbiAgICAgICAgICAgIGZvcm1hdHRpbmdFbGVtZW50RW50cnkgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICByZXR1cm4gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeTtcclxufVxyXG5cclxuLy9TdGVwcyA5IGFuZCAxMCBvZiB0aGUgYWxnb3JpdGhtXHJcbmZ1bmN0aW9uIGFhT2J0YWluRnVydGhlc3RCbG9jayhwLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5KSB7XHJcbiAgICB2YXIgZnVydGhlc3RCbG9jayA9IG51bGw7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IHAub3BlbkVsZW1lbnRzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuaXRlbXNbaV07XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50ID09PSBmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBpZiAocC5faXNTcGVjaWFsRWxlbWVudChlbGVtZW50KSlcclxuICAgICAgICAgICAgZnVydGhlc3RCbG9jayA9IGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmdXJ0aGVzdEJsb2NrKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxFbGVtZW50UG9wcGVkKGZvcm1hdHRpbmdFbGVtZW50RW50cnkuZWxlbWVudCk7XHJcbiAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZ1cnRoZXN0QmxvY2s7XHJcbn1cclxuXHJcbi8vU3RlcCAxMyBvZiB0aGUgYWxnb3JpdGhtXHJcbmZ1bmN0aW9uIGFhSW5uZXJMb29wKHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50KSB7XHJcbiAgICB2YXIgZWxlbWVudCA9IG51bGwsXHJcbiAgICAgICAgbGFzdEVsZW1lbnQgPSBmdXJ0aGVzdEJsb2NrLFxyXG4gICAgICAgIG5leHRFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuZ2V0Q29tbW9uQW5jZXN0b3IoZnVydGhlc3RCbG9jayk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBBQV9JTk5FUl9MT09QX0lURVI7IGkrKykge1xyXG4gICAgICAgIGVsZW1lbnQgPSBuZXh0RWxlbWVudDtcclxuXHJcbiAgICAgICAgLy9OT1RFOiBzdG9yZSBuZXh0IGVsZW1lbnQgZm9yIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIChpdCBtYXkgYmUgZGVsZXRlZCBmcm9tIHRoZSBzdGFjayBieSBzdGVwIDkuNSlcclxuICAgICAgICBuZXh0RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLmdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICB2YXIgZWxlbWVudEVudHJ5ID0gcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuZ2V0RWxlbWVudEVudHJ5KGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoIWVsZW1lbnRFbnRyeSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGZvcm1hdHRpbmdFbGVtZW50KVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZWxlbWVudCA9IGFhUmVjcmVhdGVFbGVtZW50RnJvbUVudHJ5KHAsIGVsZW1lbnRFbnRyeSk7XHJcblxyXG4gICAgICAgIGlmIChsYXN0RWxlbWVudCA9PT0gZnVydGhlc3RCbG9jaylcclxuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYm9va21hcmsgPSBlbGVtZW50RW50cnk7XHJcblxyXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShsYXN0RWxlbWVudCk7XHJcbiAgICAgICAgcC50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChlbGVtZW50LCBsYXN0RWxlbWVudCk7XHJcbiAgICAgICAgbGFzdEVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYXN0RWxlbWVudDtcclxufVxyXG5cclxuLy9TdGVwIDEzLjcgb2YgdGhlIGFsZ29yaXRobVxyXG5mdW5jdGlvbiBhYVJlY3JlYXRlRWxlbWVudEZyb21FbnRyeShwLCBlbGVtZW50RW50cnkpIHtcclxuICAgIHZhciBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnRFbnRyeS5lbGVtZW50KSxcclxuICAgICAgICBuZXdFbGVtZW50ID0gcC50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KGVsZW1lbnRFbnRyeS50b2tlbi50YWdOYW1lLCBucywgZWxlbWVudEVudHJ5LnRva2VuLmF0dHJzKTtcclxuXHJcbiAgICBwLm9wZW5FbGVtZW50cy5yZXBsYWNlKGVsZW1lbnRFbnRyeS5lbGVtZW50LCBuZXdFbGVtZW50KTtcclxuICAgIGVsZW1lbnRFbnRyeS5lbGVtZW50ID0gbmV3RWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcclxufVxyXG5cclxuLy9TdGVwIDE0IG9mIHRoZSBhbGdvcml0aG1cclxuZnVuY3Rpb24gYWFJbnNlcnRMYXN0Tm9kZUluQ29tbW9uQW5jZXN0b3IocCwgY29tbW9uQW5jZXN0b3IsIGxhc3RFbGVtZW50KSB7XHJcbiAgICBpZiAocC5faXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKGNvbW1vbkFuY2VzdG9yKSlcclxuICAgICAgICBwLl9mb3N0ZXJQYXJlbnRFbGVtZW50KGxhc3RFbGVtZW50KTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB2YXIgdG4gPSBwLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoY29tbW9uQW5jZXN0b3IpLFxyXG4gICAgICAgICAgICBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGNvbW1vbkFuY2VzdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MKVxyXG4gICAgICAgICAgICBjb21tb25BbmNlc3RvciA9IHAudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2Rlcyhjb21tb25BbmNlc3RvcilbMF07XHJcblxyXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQoY29tbW9uQW5jZXN0b3IsIGxhc3RFbGVtZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLy9TdGVwcyAxNS0xOSBvZiB0aGUgYWxnb3JpdGhtXHJcbmZ1bmN0aW9uIGFhUmVwbGFjZUZvcm1hdHRpbmdFbGVtZW50KHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50RW50cnkpIHtcclxuICAgIHZhciBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGZvcm1hdHRpbmdFbGVtZW50RW50cnkuZWxlbWVudCksXHJcbiAgICAgICAgdG9rZW4gPSBmb3JtYXR0aW5nRWxlbWVudEVudHJ5LnRva2VuLFxyXG4gICAgICAgIG5ld0VsZW1lbnQgPSBwLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodG9rZW4udGFnTmFtZSwgbnMsIHRva2VuLmF0dHJzKTtcclxuXHJcbiAgICBwLl9hZG9wdE5vZGVzKGZ1cnRoZXN0QmxvY2ssIG5ld0VsZW1lbnQpO1xyXG4gICAgcC50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChmdXJ0aGVzdEJsb2NrLCBuZXdFbGVtZW50KTtcclxuXHJcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnRFbGVtZW50QWZ0ZXJCb29rbWFyayhuZXdFbGVtZW50LCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5LnRva2VuKTtcclxuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZUVudHJ5KGZvcm1hdHRpbmdFbGVtZW50RW50cnkpO1xyXG5cclxuICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xyXG4gICAgcC5vcGVuRWxlbWVudHMuaW5zZXJ0QWZ0ZXIoZnVydGhlc3RCbG9jaywgbmV3RWxlbWVudCk7XHJcbn1cclxuXHJcbi8vQWxnb3JpdGhtIGVudHJ5IHBvaW50XHJcbmZ1bmN0aW9uIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbikge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBBQV9PVVRFUl9MT09QX0lURVI7IGkrKykge1xyXG4gICAgICAgIHZhciBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gYWFPYnRhaW5Gb3JtYXR0aW5nRWxlbWVudEVudHJ5KHAsIHRva2VuLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcclxuXHJcbiAgICAgICAgaWYgKCFmb3JtYXR0aW5nRWxlbWVudEVudHJ5KVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgdmFyIGZ1cnRoZXN0QmxvY2sgPSBhYU9idGFpbkZ1cnRoZXN0QmxvY2socCwgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XHJcblxyXG4gICAgICAgIGlmICghZnVydGhlc3RCbG9jaylcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmJvb2ttYXJrID0gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeTtcclxuXHJcbiAgICAgICAgdmFyIGxhc3RFbGVtZW50ID0gYWFJbm5lckxvb3AocCwgZnVydGhlc3RCbG9jaywgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KSxcclxuICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBwLm9wZW5FbGVtZW50cy5nZXRDb21tb25BbmNlc3Rvcihmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xyXG5cclxuICAgICAgICBwLnRyZWVBZGFwdGVyLmRldGFjaE5vZGUobGFzdEVsZW1lbnQpO1xyXG4gICAgICAgIGFhSW5zZXJ0TGFzdE5vZGVJbkNvbW1vbkFuY2VzdG9yKHAsIGNvbW1vbkFuY2VzdG9yLCBsYXN0RWxlbWVudCk7XHJcbiAgICAgICAgYWFSZXBsYWNlRm9ybWF0dGluZ0VsZW1lbnQocCwgZnVydGhlc3RCbG9jaywgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vL0dlbmVyaWMgdG9rZW4gaGFuZGxlcnNcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gaWdub3JlVG9rZW4ocCwgdG9rZW4pIHtcclxuICAgIC8vTk9URTogZG8gbm90aGluZyA9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBlbmRDb21tZW50KHAsIHRva2VuKSB7XHJcbiAgICBwLl9hcHBlbmRDb21tZW50Tm9kZSh0b2tlbiwgcC5vcGVuRWxlbWVudHMuY3VycmVudFRtcGxDb250ZW50IHx8IHAub3BlbkVsZW1lbnRzLmN1cnJlbnQpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGVuZENvbW1lbnRUb1Jvb3RIdG1sRWxlbWVudChwLCB0b2tlbikge1xyXG4gICAgcC5fYXBwZW5kQ29tbWVudE5vZGUodG9rZW4sIHAub3BlbkVsZW1lbnRzLml0ZW1zWzBdKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwZW5kQ29tbWVudFRvRG9jdW1lbnQocCwgdG9rZW4pIHtcclxuICAgIHAuX2FwcGVuZENvbW1lbnROb2RlKHRva2VuLCBwLmRvY3VtZW50KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5zZXJ0Q2hhcmFjdGVycyhwLCB0b2tlbikge1xyXG4gICAgcC5faW5zZXJ0Q2hhcmFjdGVycyh0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0b3BQYXJzaW5nKHAsIHRva2VuKSB7XHJcbiAgICBwLnN0b3BwZWQgPSB0cnVlO1xyXG59XHJcblxyXG4vLzEyLjIuNS40LjEgVGhlIFwiaW5pdGlhbFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIGRvY3R5cGVJbkluaXRpYWxNb2RlKHAsIHRva2VuKSB7XHJcbiAgICBwLl9zZXREb2N1bWVudFR5cGUodG9rZW4pO1xyXG5cclxuICAgIGlmICh0b2tlbi5mb3JjZVF1aXJrcyB8fCBEb2N0eXBlLmlzUXVpcmtzKHRva2VuLm5hbWUsIHRva2VuLnB1YmxpY0lkLCB0b2tlbi5zeXN0ZW1JZCkpXHJcbiAgICAgICAgcC50cmVlQWRhcHRlci5zZXRRdWlya3NNb2RlKHAuZG9jdW1lbnQpO1xyXG5cclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEJFRk9SRV9IVE1MX01PREU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRva2VuSW5Jbml0aWFsTW9kZShwLCB0b2tlbikge1xyXG4gICAgcC50cmVlQWRhcHRlci5zZXRRdWlya3NNb2RlKHAuZG9jdW1lbnQpO1xyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gQkVGT1JFX0hUTUxfTU9ERTtcclxuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbn1cclxuXHJcblxyXG4vLzEyLjIuNS40LjIgVGhlIFwiYmVmb3JlIGh0bWxcIiBpbnNlcnRpb24gbW9kZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5mdW5jdGlvbiBzdGFydFRhZ0JlZm9yZUh0bWwocCwgdG9rZW4pIHtcclxuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLkhUTUwpIHtcclxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBCRUZPUkVfSEVBRF9NT0RFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0b2tlbkJlZm9yZUh0bWwocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdCZWZvcmVIdG1sKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5IVE1MIHx8IHRuID09PSAkLkhFQUQgfHwgdG4gPT09ICQuQk9EWSB8fCB0biA9PT0gJC5CUilcclxuICAgICAgICB0b2tlbkJlZm9yZUh0bWwocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b2tlbkJlZm9yZUh0bWwocCwgdG9rZW4pIHtcclxuICAgIHAuX2luc2VydEZha2VSb290RWxlbWVudCgpO1xyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gQkVGT1JFX0hFQURfTU9ERTtcclxuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbn1cclxuXHJcblxyXG4vLzEyLjIuNS40LjMgVGhlIFwiYmVmb3JlIGhlYWRcIiBpbnNlcnRpb24gbW9kZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5mdW5jdGlvbiBzdGFydFRhZ0JlZm9yZUhlYWQocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkhFQUQpIHtcclxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgICAgICBwLmhlYWRFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuY3VycmVudDtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9IRUFEX01PREU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0JlZm9yZUhlYWQocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhFQUQgfHwgdG4gPT09ICQuQk9EWSB8fCB0biA9PT0gJC5IVE1MIHx8IHRuID09PSAkLkJSKVxyXG4gICAgICAgIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbikge1xyXG4gICAgcC5fcHJvY2Vzc0Zha2VTdGFydFRhZygkLkhFQUQpO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuXHJcbi8vMTIuMi41LjQuNCBUaGUgXCJpbiBoZWFkXCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkJBU0UgfHwgdG4gPT09ICQuQkFTRUZPTlQgfHwgdG4gPT09ICQuQkdTT1VORCB8fFxyXG4gICAgICAgICAgICAgdG4gPT09ICQuQ09NTUFORCB8fCB0biA9PT0gJC5MSU5LIHx8IHRuID09PSAkLk1FVEEpIHtcclxuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5USVRMRSlcclxuICAgICAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5SQ0RBVEEpO1xyXG5cclxuICAgIC8vTk9URTogaGVyZSB3ZSBhc3N1bWUgdGhhdCB3ZSBhbHdheXMgYWN0IGFzIGFuIGludGVyYWN0aXZlIHVzZXIgYWdlbnQgd2l0aCBlbmFibGVkIHNjcmlwdGluZywgc28gd2UgcGFyc2VcclxuICAgIC8vPG5vc2NyaXB0PiBhcyBhIHJhd3RleHQuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5OT1NDUklQVCB8fCB0biA9PT0gJC5OT0ZSQU1FUyB8fCB0biA9PT0gJC5TVFlMRSlcclxuICAgICAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5SQVdURVhUKTtcclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5TQ1JJUFQpXHJcbiAgICAgICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgVG9rZW5pemVyLk1PREUuU0NSSVBUX0RBVEEpO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlRFTVBMQVRFKSB7XHJcbiAgICAgICAgcC5faW5zZXJ0VGVtcGxhdGUodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluc2VydE1hcmtlcigpO1xyXG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RFTVBMQVRFX01PREU7XHJcbiAgICAgICAgcC5fcHVzaFRtcGxJbnNlcnRpb25Nb2RlKElOX1RFTVBMQVRFX01PREUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuICE9PSAkLkhFQUQpXHJcbiAgICAgICAgdG9rZW5JbkhlYWQocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdJbkhlYWQocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhFQUQpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBBRlRFUl9IRUFEX01PREU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuQk9EWSB8fCB0biA9PT0gJC5CUiB8fCB0biA9PT0gJC5IVE1MKVxyXG4gICAgICAgIHRva2VuSW5IZWFkKHAsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSAmJiBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPiAwKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpO1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGVtcGxhdGVQb3BwZWQoKTtcclxuICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5jbGVhclRvTGFzdE1hcmtlcigpO1xyXG4gICAgICAgIHAuX3BvcFRtcGxJbnNlcnRpb25Nb2RlKCk7XHJcbiAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRva2VuSW5IZWFkKHAsIHRva2VuKSB7XHJcbiAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLkhFQUQpO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuXHJcbi8vMTIuMi41LjQuNiBUaGUgXCJhZnRlciBoZWFkXCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdBZnRlckhlYWQocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkJPRFkpIHtcclxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgICAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9CT0RZX01PREU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuRlJBTUVTRVQpIHtcclxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9GUkFNRVNFVF9NT0RFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkJBU0UgfHwgdG4gPT09ICQuQkFTRUZPTlQgfHwgdG4gPT09ICQuQkdTT1VORCB8fCB0biA9PT0gJC5MSU5LIHx8IHRuID09PSAkLk1FVEEgfHxcclxuICAgICAgICAgICAgIHRuID09PSAkLk5PRlJBTUVTIHx8IHRuID09PSAkLlNDUklQVCB8fCB0biA9PT0gJC5TVFlMRSB8fCB0biA9PT0gJC5URU1QTEFURSB8fCB0biA9PT0gJC5USVRMRSkge1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnB1c2gocC5oZWFkRWxlbWVudCk7XHJcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShwLmhlYWRFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biAhPT0gJC5IRUFEKVxyXG4gICAgICAgIHRva2VuQWZ0ZXJIZWFkKHAsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5kVGFnQWZ0ZXJIZWFkKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5CT0RZIHx8IHRuID09PSAkLkhUTUwgfHwgdG4gPT09ICQuQlIpXHJcbiAgICAgICAgdG9rZW5BZnRlckhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlRFTVBMQVRFKVxyXG4gICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRva2VuQWZ0ZXJIZWFkKHAsIHRva2VuKSB7XHJcbiAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnKCQuQk9EWSk7XHJcbiAgICBwLmZyYW1lc2V0T2sgPSB0cnVlO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuXHJcbi8vMTIuMi41LjQuNyBUaGUgXCJpbiBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcclxuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGFyYWN0ZXJJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICBwLl9pbnNlcnRDaGFyYWN0ZXJzKHRva2VuKTtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBodG1sU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPT09IDApXHJcbiAgICAgICAgcC50cmVlQWRhcHRlci5hZG9wdEF0dHJpYnV0ZXMocC5vcGVuRWxlbWVudHMuaXRlbXNbMF0sIHRva2VuLmF0dHJzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYm9keVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgYm9keUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy50cnlQZWVrUHJvcGVybHlOZXN0ZWRCb2R5RWxlbWVudCgpO1xyXG5cclxuICAgIGlmIChib2R5RWxlbWVudCAmJiBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPT09IDApIHtcclxuICAgICAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcclxuICAgICAgICBwLnRyZWVBZGFwdGVyLmFkb3B0QXR0cmlidXRlcyhib2R5RWxlbWVudCwgdG9rZW4uYXR0cnMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmcmFtZXNldFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgYm9keUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy50cnlQZWVrUHJvcGVybHlOZXN0ZWRCb2R5RWxlbWVudCgpO1xyXG5cclxuICAgIGlmIChwLmZyYW1lc2V0T2sgJiYgYm9keUVsZW1lbnQpIHtcclxuICAgICAgICBwLnRyZWVBZGFwdGVyLmRldGFjaE5vZGUoYm9keUVsZW1lbnQpO1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcEFsbFVwVG9IdG1sRWxlbWVudCgpO1xyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0ZSQU1FU0VUX01PREU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSlcclxuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XHJcblxyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG51bWJlcmVkSGVhZGVyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKCQuUCkpXHJcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xyXG5cclxuICAgIHZhciB0biA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5IMSB8fCB0biA9PT0gJC5IMiB8fCB0biA9PT0gJC5IMyB8fCB0biA9PT0gJC5INCB8fCB0biA9PT0gJC5INSB8fCB0biA9PT0gJC5INilcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuXHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKCQuUCkpXHJcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xyXG5cclxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgLy9OT1RFOiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIFUrMDAwQSBMSU5FIEZFRUQgKExGKSBjaGFyYWN0ZXIgdG9rZW4sIHRoZW4gaWdub3JlIHRoYXQgdG9rZW4gYW5kIG1vdmVcclxuICAgIC8vb24gdG8gdGhlIG5leHQgb25lLiAoTmV3bGluZXMgYXQgdGhlIHN0YXJ0IG9mIHByZSBibG9ja3MgYXJlIGlnbm9yZWQgYXMgYW4gYXV0aG9yaW5nIGNvbnZlbmllbmNlLilcclxuICAgIHAuc2tpcE5leHROZXdMaW5lID0gdHJ1ZTtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHZhciBpblRlbXBsYXRlID0gcC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMDtcclxuXHJcbiAgICBpZiAoIXAuZm9ybUVsZW1lbnQgfHwgaW5UZW1wbGF0ZSkge1xyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKCQuUCkpXHJcbiAgICAgICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcclxuXHJcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcblxyXG4gICAgICAgIGlmICghaW5UZW1wbGF0ZSlcclxuICAgICAgICAgICAgcC5mb3JtRWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RJdGVtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgZWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zW2ldLFxyXG4gICAgICAgICAgICB0biA9IHAudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKCh0b2tlbi50YWdOYW1lID09PSAkLkxJICYmIHRuID09PSAkLkxJKSB8fFxyXG4gICAgICAgICAgICAoKHRva2VuLnRhZ05hbWUgPT09ICQuREQgfHwgdG9rZW4udGFnTmFtZSA9PT0gJC5EVCkgJiYgKHRuID09PSAkLkREIHx8IHRuID09ICQuRFQpKSkge1xyXG4gICAgICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZyh0bik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRuICE9PSAkLkFERFJFU1MgJiYgdG4gIT09ICQuRElWICYmIHRuICE9PSAkLlAgJiYgcC5faXNTcGVjaWFsRWxlbWVudChlbGVtZW50KSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSlcclxuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XHJcblxyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBsYWludGV4dFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKVxyXG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcclxuXHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIHAudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUExBSU5URVhUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidXR0b25TdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoJC5CVVRUT04pKSB7XHJcbiAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5CVVRUT04pO1xyXG4gICAgICAgIGJ1dHRvblN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHZhciBhY3RpdmVFbGVtZW50RW50cnkgPSBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5nZXRFbGVtZW50RW50cnlJblNjb3BlV2l0aFRhZ05hbWUoJC5BKTtcclxuXHJcbiAgICBpZiAoYWN0aXZlRWxlbWVudEVudHJ5KSB7XHJcbiAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5BKTtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoYWN0aXZlRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xyXG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZUVudHJ5KGFjdGl2ZUVsZW1lbnRFbnRyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcclxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucHVzaEVsZW1lbnQocC5vcGVuRWxlbWVudHMuY3VycmVudCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnB1c2hFbGVtZW50KHAub3BlbkVsZW1lbnRzLmN1cnJlbnQsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbm9iclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xyXG5cclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKCQuTk9CUikpIHtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLk5PQlIpO1xyXG4gICAgICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5wdXNoRWxlbWVudChwLm9wZW5FbGVtZW50cy5jdXJyZW50LCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGxldFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnRNYXJrZXIoKTtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0YWJsZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBpZiAoIXAudHJlZUFkYXB0ZXIuaXNRdWlya3NNb2RlKHAuZG9jdW1lbnQpICYmIHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSlcclxuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XHJcblxyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX01PREU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcclxuICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlucHV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuXHJcbiAgICB2YXIgaW5wdXRUeXBlID0gVG9rZW5pemVyLmdldFRva2VuQXR0cih0b2tlbiwgQVRUUlMuVFlQRSk7XHJcblxyXG4gICAgaWYgKCFpbnB1dFR5cGUgfHwgaW5wdXRUeXBlLnRvTG93ZXJDYXNlKCkgIT09IEhJRERFTl9JTlBVVF9UWVBFKVxyXG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyYW1TdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKCQuUCkpXHJcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xyXG5cclxuICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGltYWdlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHRva2VuLnRhZ05hbWUgPSAkLklNRztcclxuICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzaW5kZXhTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKCFwLmZvcm1FbGVtZW50IHx8IHAub3BlbkVsZW1lbnRzLnRtcGxDb3VudCA+IDApIHtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnV2l0aEF0dHJzKCQuRk9STSwgZ2V0U2VhcmNoYWJsZUluZGV4Rm9ybUF0dHJzKHRva2VuKSk7XHJcbiAgICAgICAgcC5fcHJvY2Vzc0Zha2VTdGFydFRhZygkLkhSKTtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnKCQuTEFCRUwpO1xyXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuaW5zZXJ0VGV4dChwLm9wZW5FbGVtZW50cy5jdXJyZW50LCBnZXRTZWFyY2hhYmxlSW5kZXhMYWJlbFRleHQodG9rZW4pKTtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnV2l0aEF0dHJzKCQuSU5QVVQsIGdldFNlYXJjaGFibGVJbmRleElucHV0QXR0cnModG9rZW4pKTtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLkxBQkVMKTtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnKCQuSFIpO1xyXG4gICAgICAgIHAuX3Byb2Nlc3NGYWtlRW5kVGFnKCQuRk9STSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRleHRhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgLy9OT1RFOiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIFUrMDAwQSBMSU5FIEZFRUQgKExGKSBjaGFyYWN0ZXIgdG9rZW4sIHRoZW4gaWdub3JlIHRoYXQgdG9rZW4gYW5kIG1vdmVcclxuICAgIC8vb24gdG8gdGhlIG5leHQgb25lLiAoTmV3bGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRleHRhcmVhIGVsZW1lbnRzIGFyZSBpZ25vcmVkIGFzIGFuIGF1dGhvcmluZyBjb252ZW5pZW5jZS4pXHJcbiAgICBwLnNraXBOZXh0TmV3TGluZSA9IHRydWU7XHJcbiAgICBwLnRva2VuaXplci5zdGF0ZSA9IFRva2VuaXplci5NT0RFLlJDREFUQTtcclxuICAgIHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gcC5pbnNlcnRpb25Nb2RlO1xyXG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XHJcbiAgICBwLmluc2VydGlvbk1vZGUgPSBURVhUX01PREU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHhtcFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKVxyXG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcclxuXHJcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xyXG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XHJcbiAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5SQVdURVhUKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaWZyYW1lU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG4gICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgVG9rZW5pemVyLk1PREUuUkFXVEVYVCk7XHJcbn1cclxuXHJcbi8vTk9URTogaGVyZSB3ZSBhc3N1bWUgdGhhdCB3ZSBhbHdheXMgYWN0IGFzIGFuIHVzZXIgYWdlbnQgd2l0aCBlbmFibGVkIHBsdWdpbnMsIHNvIHdlIHBhcnNlXHJcbi8vPG5vZW1iZWQ+IGFzIGEgcmF3dGV4dC5cclxuZnVuY3Rpb24gbm9lbWJlZFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5SQVdURVhUKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChwLmluc2VydGlvbk1vZGUgPT09IElOX1RBQkxFX01PREUgfHwgcC5pbnNlcnRpb25Nb2RlID09PSBJTl9DQVBUSU9OX01PREUgfHxcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPT09IElOX1RBQkxFX0JPRFlfTU9ERSB8fCBwLmluc2VydGlvbk1vZGUgPT09IElOX1JPV19NT0RFIHx8XHJcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID09PSBJTl9DRUxMX01PREUpIHtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fU0VMRUNUX01PREU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9wdGdyb3VwU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRJT04pXHJcbiAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5PUFRJT04pO1xyXG5cclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcnBTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoJC5SVUJZKSlcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XHJcblxyXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1lbnVpdGVtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtYXRoU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XHJcblxyXG4gICAgRm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5NYXRoTUxBdHRycyh0b2tlbik7XHJcbiAgICBGb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKTtcclxuXHJcbiAgICBpZiAodG9rZW4uc2VsZkNsb3NpbmcpXHJcbiAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuTUFUSE1MKTtcclxuICAgIGVsc2VcclxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5NQVRITUwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdmdTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcclxuXHJcbiAgICBGb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblNWR0F0dHJzKHRva2VuKTtcclxuICAgIEZvcmVpZ25Db250ZW50LmFkanVzdFRva2VuWE1MQXR0cnModG9rZW4pO1xyXG5cclxuICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZylcclxuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5TVkcpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLlNWRyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcclxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG59XHJcblxyXG4vL09QVElNSVpBVElPTjogSW50ZWdlciBjb21wYXJpc29ucyBhcmUgbG93LWNvc3QsIHNvIHdlIGNhbiB1c2UgdmVyeSBmYXN0IHRhZyBuYW1lIGxlbmd0aCBmaWx0ZXJzIGhlcmUuXHJcbi8vSXQncyBmYXN0ZXIgdGhhbiB1c2luZyBkaWN0aW9uYXJ5LlxyXG5mdW5jdGlvbiBzdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBzd2l0Y2ggKHRuLmxlbmd0aCkge1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkkgfHwgdG4gPT09ICQuUyB8fCB0biA9PT0gJC5CIHx8IHRuID09PSAkLlUpXHJcbiAgICAgICAgICAgICAgICBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuUClcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5BKVxyXG4gICAgICAgICAgICAgICAgYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuREwgfHwgdG4gPT09ICQuT0wgfHwgdG4gPT09ICQuVUwpXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuSDEgfHwgdG4gPT09ICQuSDIgfHwgdG4gPT09ICQuSDMgfHwgdG4gPT09ICQuSDQgfHwgdG4gPT09ICQuSDUgfHwgdG4gPT09ICQuSDYpXHJcbiAgICAgICAgICAgICAgICBudW1iZXJlZEhlYWRlclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkxJIHx8IHRuID09PSAkLkREIHx8IHRuID09PSAkLkRUKVxyXG4gICAgICAgICAgICAgICAgbGlzdEl0ZW1TdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5FTSB8fCB0biA9PT0gJC5UVClcclxuICAgICAgICAgICAgICAgIGJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5CUilcclxuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5IUilcclxuICAgICAgICAgICAgICAgIGhyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuUlAgfHwgdG4gPT09ICQuUlQpXHJcbiAgICAgICAgICAgICAgICBycFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuICE9PSAkLlRIICYmIHRuICE9PSAkLlREICYmIHRuICE9PSAkLlRSKVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5ESVYgfHwgdG4gPT09ICQuRElSIHx8IHRuID09PSAkLk5BVilcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5QUkUpXHJcbiAgICAgICAgICAgICAgICBwcmVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5CSUcpXHJcbiAgICAgICAgICAgICAgICBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuSU1HIHx8IHRuID09PSAkLldCUilcclxuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5YTVApXHJcbiAgICAgICAgICAgICAgICB4bXBTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5TVkcpXHJcbiAgICAgICAgICAgICAgICBzdmdTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biAhPT0gJC5DT0wpXHJcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgICAgICAgICBodG1sU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuQkFTRSB8fCB0biA9PT0gJC5MSU5LIHx8IHRuID09PSAkLk1FVEEpXHJcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5CT0RZKVxyXG4gICAgICAgICAgICAgICAgYm9keVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLk1BSU4gfHwgdG4gPT09ICQuTUVOVSlcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5GT1JNKVxyXG4gICAgICAgICAgICAgICAgZm9ybVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkNPREUgfHwgdG4gPT09ICQuRk9OVClcclxuICAgICAgICAgICAgICAgIGJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5OT0JSKVxyXG4gICAgICAgICAgICAgICAgbm9iclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkFSRUEpXHJcbiAgICAgICAgICAgICAgICBhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuTUFUSClcclxuICAgICAgICAgICAgICAgIG1hdGhTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biAhPT0gJC5IRUFEKVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5TVFlMRSB8fCB0biA9PT0gJC5USVRMRSlcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkFTSURFKVxyXG4gICAgICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlNNQUxMKVxyXG4gICAgICAgICAgICAgICAgYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlRBQkxFKVxyXG4gICAgICAgICAgICAgICAgdGFibGVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5FTUJFRClcclxuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5JTlBVVClcclxuICAgICAgICAgICAgICAgIGlucHV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuUEFSQU0gfHwgdG4gPT09ICQuVFJBQ0spXHJcbiAgICAgICAgICAgICAgICBwYXJhbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLklNQUdFKVxyXG4gICAgICAgICAgICAgICAgaW1hZ2VTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biAhPT0gJC5GUkFNRSAmJiB0biAhPT0gJC5UQk9EWSAmJiB0biAhPT0gJC5URk9PVCAmJiB0biAhPT0gJC5USEVBRClcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuU0NSSVBUKVxyXG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuQ0VOVEVSIHx8IHRuID09PSAkLkZJR1VSRSB8fCB0biA9PT0gJC5GT09URVIgfHwgdG4gPT09ICQuSEVBREVSIHx8IHRuID09PSAkLkhHUk9VUClcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5CVVRUT04pXHJcbiAgICAgICAgICAgICAgICBidXR0b25TdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5TVFJJS0UgfHwgdG4gPT09ICQuU1RST05HKVxyXG4gICAgICAgICAgICAgICAgYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkFQUExFVCB8fCB0biA9PT0gJC5PQkpFQ1QpXHJcbiAgICAgICAgICAgICAgICBhcHBsZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5LRVlHRU4pXHJcbiAgICAgICAgICAgICAgICBhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuU09VUkNFKVxyXG4gICAgICAgICAgICAgICAgcGFyYW1TdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5JRlJBTUUpXHJcbiAgICAgICAgICAgICAgICBpZnJhbWVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5TRUxFQ1QpXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5PUFRJT04pXHJcbiAgICAgICAgICAgICAgICBvcHRncm91cFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuQkdTT1VORCB8fCB0biA9PT0gJC5DT01NQU5EKVxyXG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuREVUQUlMUyB8fCB0biA9PT0gJC5BRERSRVNTIHx8IHRuID09PSAkLkFSVElDTEUgfHwgdG4gPT09ICQuU0VDVElPTiB8fCB0biA9PT0gJC5TVU1NQVJZKVxyXG4gICAgICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkxJU1RJTkcpXHJcbiAgICAgICAgICAgICAgICBwcmVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5NQVJRVUVFKVxyXG4gICAgICAgICAgICAgICAgYXBwbGV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuSVNJTkRFWClcclxuICAgICAgICAgICAgICAgIGlzaW5kZXhTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5OT0VNQkVEKVxyXG4gICAgICAgICAgICAgICAgbm9lbWJlZFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuICE9PSAkLkNBUFRJT04pXHJcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgODpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkJBU0VGT05UIHx8IHRuID09PSAkLk1FTlVJVEVNKVxyXG4gICAgICAgICAgICAgICAgbWVudWl0ZW1TdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5GUkFNRVNFVClcclxuICAgICAgICAgICAgICAgIGZyYW1lc2V0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuRklFTERTRVQpXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVEVYVEFSRUEpXHJcbiAgICAgICAgICAgICAgICB0ZXh0YXJlYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlRFTVBMQVRFKVxyXG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuTk9TQ1JJUFQpXHJcbiAgICAgICAgICAgICAgICBub2VtYmVkU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuT1BUR1JPVVApXHJcbiAgICAgICAgICAgICAgICBvcHRncm91cFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuICE9PSAkLkNPTEdST1VQKVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5QTEFJTlRFWFQpXHJcbiAgICAgICAgICAgICAgICBwbGFpbnRleHRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgMTA6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CTE9DS1FVT1RFIHx8IHRuID09PSAkLkZJR0NBUFRJT04pXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBib2R5RW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSgkLkJPRFkpKVxyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEFGVEVSX0JPRFlfTU9ERTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdG9rZW4uaWdub3JlZCA9IHRydWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGh0bWxFbmRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIHZhciBmYWtlVG9rZW4gPSBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLkJPRFkpO1xyXG5cclxuICAgIGlmICghZmFrZVRva2VuLmlnbm9yZWQpXHJcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkcmVzc0VuZFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSh0bikpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKHRuKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZm9ybUVuZFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgdmFyIGluVGVtcGxhdGUgPSBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPiAwLFxyXG4gICAgICAgIGZvcm1FbGVtZW50ID0gcC5mb3JtRWxlbWVudDtcclxuXHJcbiAgICBpZiAoIWluVGVtcGxhdGUpXHJcbiAgICAgICAgcC5mb3JtRWxlbWVudCA9IG51bGw7XHJcblxyXG4gICAgaWYgKChmb3JtRWxlbWVudCB8fCBpblRlbXBsYXRlKSAmJiBwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKCQuRk9STSkpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XHJcblxyXG4gICAgICAgIGlmIChpblRlbXBsYXRlKVxyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5GT1JNKTtcclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoZm9ybUVsZW1lbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFnc1dpdGhFeGNsdXNpb24oJC5QKTtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5QKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnKCQuUCk7XHJcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbGlFbmRUYWdJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkxpc3RJdGVtU2NvcGUoJC5MSSkpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbigkLkxJKTtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5MSSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRkRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKHRuKTtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQodG4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBudW1iZXJlZEhlYWRlckVuZFRhZ0luQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc051bWJlcmVkSGVhZGVySW5TY29wZSgpKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpO1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsTnVtYmVyZWRIZWFkZXJQb3BwZWQoKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbGV0RW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQodG4pO1xyXG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJyRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICBwLl9wcm9jZXNzRmFrZVN0YXJ0VGFnKCQuQlIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuaXRlbXNbaV07XHJcblxyXG4gICAgICAgIGlmIChwLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCkgPT09IHRuKSB7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKHRuKTtcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxFbGVtZW50UG9wcGVkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwLl9pc1NwZWNpYWxFbGVtZW50KGVsZW1lbnQpKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIH1cclxufVxyXG5cclxuLy9PUFRJTUlaQVRJT046IEludGVnZXIgY29tcGFyaXNvbnMgYXJlIGxvdy1jb3N0LCBzbyB3ZSBjYW4gdXNlIHZlcnkgZmFzdCB0YWcgbmFtZSBsZW5ndGggZmlsdGVycyBoZXJlLlxyXG4vL0l0J3MgZmFzdGVyIHRoYW4gdXNpbmcgZGljdGlvbmFyeS5cclxuZnVuY3Rpb24gZW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIHN3aXRjaCAodG4ubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuQSB8fCB0biA9PT0gJC5CIHx8IHRuID09PSAkLkkgfHwgdG4gPT09ICQuUyB8fCB0biA9PSAkLlUpXHJcbiAgICAgICAgICAgICAgICBjYWxsQWRvcHRpb25BZ2VuY3kocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuUClcclxuICAgICAgICAgICAgICAgIHBFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBpZiAodG4gPT0gJC5ETCB8fCB0biA9PT0gJC5VTCB8fCB0biA9PT0gJC5PTClcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuTEkpXHJcbiAgICAgICAgICAgICAgICBsaUVuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5ERCB8fCB0biA9PT0gJC5EVClcclxuICAgICAgICAgICAgICAgIGRkRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkgxIHx8IHRuID09PSAkLkgyIHx8IHRuID09PSAkLkgzIHx8IHRuID09PSAkLkg0IHx8IHRuID09PSAkLkg1IHx8IHRuID09PSAkLkg2KVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyZWRIZWFkZXJFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuQlIpXHJcbiAgICAgICAgICAgICAgICBickVuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5FTSB8fCB0biA9PT0gJC5UVClcclxuICAgICAgICAgICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CSUcpXHJcbiAgICAgICAgICAgICAgICBjYWxsQWRvcHRpb25BZ2VuY3kocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuRElSIHx8IHRuID09PSAkLkRJViB8fCB0biA9PT0gJC5OQVYpXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkJPRFkpXHJcbiAgICAgICAgICAgICAgICBib2R5RW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgICAgICAgICBodG1sRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkZPUk0pXHJcbiAgICAgICAgICAgICAgICBmb3JtRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkNPREUgfHwgdG4gPT09ICQuRk9OVCB8fCB0biA9PT0gJC5OT0JSKVxyXG4gICAgICAgICAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLk1BSU4gfHwgdG4gPT09ICQuTUVOVSlcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuQVNJREUpXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlNNQUxMKVxyXG4gICAgICAgICAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkNFTlRFUiB8fCB0biA9PT0gJC5GSUdVUkUgfHwgdG4gPT09ICQuRk9PVEVSIHx8IHRuID09PSAkLkhFQURFUiB8fCB0biA9PT0gJC5IR1JPVVApXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLkFQUExFVCB8fCB0biA9PT0gJC5PQkpFQ1QpXHJcbiAgICAgICAgICAgICAgICBhcHBsZXRFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT0gJC5TVFJJS0UgfHwgdG4gPT09ICQuU1RST05HKVxyXG4gICAgICAgICAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkFERFJFU1MgfHwgdG4gPT09ICQuQVJUSUNMRSB8fCB0biA9PT0gJC5ERVRBSUxTIHx8IHRuID09PSAkLlNFQ1RJT04gfHwgdG4gPT09ICQuU1VNTUFSWSlcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuTUFSUVVFRSlcclxuICAgICAgICAgICAgICAgIGFwcGxldEVuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5GSUVMRFNFVClcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpXHJcbiAgICAgICAgICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAxMDpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkJMT0NLUVVPVEUgfHwgdG4gPT09ICQuRklHQ0FQVElPTilcclxuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdCA6XHJcbiAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBlb2ZJbkJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tUb3AgPiAtMSlcclxuICAgICAgICBlb2ZJblRlbXBsYXRlKHAsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgcC5zdG9wcGVkID0gdHJ1ZTtcclxufVxyXG5cclxuLy8xMi4yLjUuNC44IFRoZSBcInRleHRcIiBpbnNlcnRpb24gbW9kZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5mdW5jdGlvbiBlbmRUYWdJblRleHQocCwgdG9rZW4pIHtcclxuICAgIGlmICghcC5mcmFnbWVudENvbnRleHQgJiYgcC5zY3JpcHRIYW5kbGVyICYmIHRva2VuLnRhZ05hbWUgPT09ICQuU0NSSVBUKVxyXG4gICAgICAgIHAuc2NyaXB0SGFuZGxlcihwLmRvY3VtZW50LCBwLm9wZW5FbGVtZW50cy5jdXJyZW50KTtcclxuXHJcbiAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZW9mSW5UZXh0KHAsIHRva2VuKSB7XHJcbiAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuXHJcbi8vMTIuMi41LjQuOSBUaGUgXCJpbiB0YWJsZVwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIGNoYXJhY3RlckluVGFibGUocCwgdG9rZW4pIHtcclxuICAgIHZhciBjdXJUbiA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lO1xyXG5cclxuICAgIGlmIChjdXJUbiA9PT0gJC5UQUJMRSB8fCBjdXJUbiA9PT0gJC5UQk9EWSB8fCBjdXJUbiA9PT0gJC5URk9PVCB8fCBjdXJUbiA9PT0gJC5USEVBRCB8fCBjdXJUbiA9PT0gJC5UUikge1xyXG4gICAgICAgIHAucGVuZGluZ0NoYXJhY3RlclRva2VucyA9IFtdO1xyXG4gICAgICAgIHAuaGFzTm9uV2hpdGVzcGFjZVBlbmRpbmdDaGFyYWN0ZXJUb2tlbiA9IGZhbHNlO1xyXG4gICAgICAgIHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gcC5pbnNlcnRpb25Nb2RlO1xyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX1RFWFRfTU9ERTtcclxuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYXB0aW9uU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XHJcbiAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQ29udGV4dCgpO1xyXG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0NBUFRJT05fTU9ERTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29sZ3JvdXBTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcclxuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XHJcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0NPTFVNTl9HUk9VUF9NT0RFO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb2xTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcclxuICAgIHAuX3Byb2Nlc3NGYWtlU3RhcnRUYWcoJC5DT0xHUk9VUCk7XHJcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0Ym9keVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xyXG4gICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUNvbnRleHQoKTtcclxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfQk9EWV9NT0RFO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0ZFN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xyXG4gICAgcC5fcHJvY2Vzc0Zha2VTdGFydFRhZygkLlRCT0RZKTtcclxuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRhYmxlU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgZmFrZVRva2VuID0gcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5UQUJMRSk7XHJcblxyXG4gICAgLy9OT1RFOiBUaGUgZmFrZSBlbmQgdGFnIHRva2VuIGhlcmUgY2FuIG9ubHkgYmUgaWdub3JlZCBpbiB0aGUgZnJhZ21lbnQgY2FzZS5cclxuICAgIGlmICghZmFrZVRva2VuLmlnbm9yZWQpXHJcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5wdXRTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcclxuICAgIHZhciBpbnB1dFR5cGUgPSBUb2tlbml6ZXIuZ2V0VG9rZW5BdHRyKHRva2VuLCBBVFRSUy5UWVBFKTtcclxuXHJcbiAgICBpZiAoaW5wdXRUeXBlICYmIGlucHV0VHlwZS50b0xvd2VyQ2FzZSgpID09PSBISURERU5fSU5QVVRfVFlQRSlcclxuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZm9ybVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xyXG4gICAgaWYgKCFwLmZvcm1FbGVtZW50ICYmIHAub3BlbkVsZW1lbnRzLnRtcGxDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuZm9ybUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5jdXJyZW50O1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgc3dpdGNoICh0bi5sZW5ndGgpIHtcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5URCB8fCB0biA9PT0gJC5USCB8fCB0biA9PT0gJC5UUilcclxuICAgICAgICAgICAgICAgIHRkU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuQ09MKVxyXG4gICAgICAgICAgICAgICAgY29sU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuRk9STSlcclxuICAgICAgICAgICAgICAgIGZvcm1TdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5UQUJMRSlcclxuICAgICAgICAgICAgICAgIHRhYmxlU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSAkLlNUWUxFKVxyXG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVEJPRFkgfHwgdG4gPT09ICQuVEZPT1QgfHwgdG4gPT09ICQuVEhFQUQpXHJcbiAgICAgICAgICAgICAgICB0Ym9keVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlIGlmICh0biA9PT0gJC5JTlBVVClcclxuICAgICAgICAgICAgICAgIGlucHV0U3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuU0NSSVBUKVxyXG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIDc6XHJcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5DQVBUSU9OKVxyXG4gICAgICAgICAgICAgICAgY2FwdGlvblN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgODpcclxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkNPTEdST1VQKVxyXG4gICAgICAgICAgICAgICAgY29sZ3JvdXBTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpXHJcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XHJcblxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdJblRhYmxlKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5UQUJMRSkge1xyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5UQUJMRSkpIHtcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuVEFCTEUpO1xyXG4gICAgICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdG9rZW4uaWdub3JlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpXHJcbiAgICAgICAgZW5kVGFnSW5IZWFkKHAsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0biAhPT0gJC5CT0RZICYmIHRuICE9PSAkLkNBUFRJT04gJiYgdG4gIT09ICQuQ09MICYmIHRuICE9PSAkLkNPTEdST1VQICYmIHRuICE9PSAkLkhUTUwgJiZcclxuICAgICAgICAgICAgIHRuICE9PSAkLlRCT0RZICYmIHRuICE9PSAkLlREICYmIHRuICE9PSAkLlRGT09UICYmIHRuICE9PSAkLlRIICYmIHRuICE9PSAkLlRIRUFEICYmIHRuICE9PSAkLlRSKSB7XHJcbiAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdG9rZW5JblRhYmxlKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgc2F2ZWRGb3N0ZXJQYXJlbnRpbmdTdGF0ZSA9IHAuZm9zdGVyUGFyZW50aW5nRW5hYmxlZDtcclxuXHJcbiAgICBwLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgPSB0cnVlO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuSW5Cb2R5TW9kZSh0b2tlbik7XHJcbiAgICBwLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgPSBzYXZlZEZvc3RlclBhcmVudGluZ1N0YXRlO1xyXG59XHJcblxyXG5cclxuLy8xMi4yLjUuNC4xMCBUaGUgXCJpbiB0YWJsZSB0ZXh0XCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gd2hpdGVzcGFjZUNoYXJhY3RlckluVGFibGVUZXh0KHAsIHRva2VuKSB7XHJcbiAgICBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMucHVzaCh0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoYXJhY3RlckluVGFibGVUZXh0KHAsIHRva2VuKSB7XHJcbiAgICBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMucHVzaCh0b2tlbik7XHJcbiAgICBwLmhhc05vbldoaXRlc3BhY2VQZW5kaW5nQ2hhcmFjdGVyVG9rZW4gPSB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b2tlbkluVGFibGVUZXh0KHAsIHRva2VuKSB7XHJcbiAgICBpZiAocC5oYXNOb25XaGl0ZXNwYWNlUGVuZGluZ0NoYXJhY3RlclRva2VuKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5wZW5kaW5nQ2hhcmFjdGVyVG9rZW5zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICBwLl9pbnNlcnRDaGFyYWN0ZXJzKHAucGVuZGluZ0NoYXJhY3RlclRva2Vuc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XHJcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG59XHJcblxyXG5cclxuLy8xMi4yLjUuNC4xMSBUaGUgXCJpbiBjYXB0aW9uXCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdJbkNhcHRpb24ocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkNBUFRJT04gfHwgdG4gPT09ICQuQ09MIHx8IHRuID09PSAkLkNPTEdST1VQIHx8IHRuID09PSAkLlRCT0RZIHx8XHJcbiAgICAgICAgdG4gPT09ICQuVEQgfHwgdG4gPT09ICQuVEZPT1QgfHwgdG4gPT09ICQuVEggfHwgdG4gPT09ICQuVEhFQUQgfHwgdG4gPT09ICQuVFIpIHtcclxuICAgICAgICB2YXIgZmFrZVRva2VuID0gcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5DQVBUSU9OKTtcclxuXHJcbiAgICAgICAgLy9OT1RFOiBUaGUgZmFrZSBlbmQgdGFnIHRva2VuIGhlcmUgY2FuIG9ubHkgYmUgaWdub3JlZCBpbiB0aGUgZnJhZ21lbnQgY2FzZS5cclxuICAgICAgICBpZiAoIWZha2VUb2tlbi5pZ25vcmVkKVxyXG4gICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0luQ2FwdGlvbihwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuQ0FQVElPTikge1xyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5DQVBUSU9OKSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCgkLkNBUFRJT04pO1xyXG4gICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5jbGVhclRvTGFzdE1hcmtlcigpO1xyXG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9NT0RFO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0b2tlbi5pZ25vcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSkge1xyXG4gICAgICAgIHZhciBmYWtlVG9rZW4gPSBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLkNBUFRJT04pO1xyXG5cclxuICAgICAgICAvL05PVEU6IFRoZSBmYWtlIGVuZCB0YWcgdG9rZW4gaGVyZSBjYW4gb25seSBiZSBpZ25vcmVkIGluIHRoZSBmcmFnbWVudCBjYXNlLlxyXG4gICAgICAgIGlmICghZmFrZVRva2VuLmlnbm9yZWQpXHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gIT09ICQuQk9EWSAmJiB0biAhPT0gJC5DT0wgJiYgdG4gIT09ICQuQ09MR1JPVVAgJiYgdG4gIT09ICQuSFRNTCAmJiB0biAhPT0gJC5UQk9EWSAmJlxyXG4gICAgICAgICAgICAgdG4gIT09ICQuVEQgJiYgdG4gIT09ICQuVEZPT1QgJiYgdG4gIT09ICQuVEggJiYgdG4gIT09ICQuVEhFQUQgJiYgdG4gIT09ICQuVFIpIHtcclxuICAgICAgICBlbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLy8xMi4yLjUuNC4xMiBUaGUgXCJpbiBjb2x1bW4gZ3JvdXBcIiBpbnNlcnRpb24gbW9kZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5mdW5jdGlvbiBzdGFydFRhZ0luQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkNPTClcclxuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSlcclxuICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRva2VuSW5Db2x1bW5Hcm91cChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0luQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkNPTEdST1VQKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lICE9PSAkLkNPTEdST1VQKVxyXG4gICAgICAgICAgICB0b2tlbi5pZ25vcmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xyXG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9NT0RFO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSlcclxuICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuICE9PSAkLkNPTClcclxuICAgICAgICB0b2tlbkluQ29sdW1uR3JvdXAocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b2tlbkluQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcclxuICAgIHZhciBmYWtlVG9rZW4gPSBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLkNPTEdST1VQKTtcclxuXHJcbiAgICAvL05PVEU6IFRoZSBmYWtlIGVuZCB0YWcgdG9rZW4gaGVyZSBjYW4gb25seSBiZSBpZ25vcmVkIGluIHRoZSBmcmFnbWVudCBjYXNlLlxyXG4gICAgaWYgKCFmYWtlVG9rZW4uaWdub3JlZClcclxuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG59XHJcblxyXG4vLzEyLjIuNS40LjEzIFRoZSBcImluIHRhYmxlIGJvZHlcIiBpbnNlcnRpb24gbW9kZVxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5mdW5jdGlvbiBzdGFydFRhZ0luVGFibGVCb2R5KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5UUikge1xyXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpO1xyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1JPV19NT0RFO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlRIIHx8IHRuID09PSAkLlREKSB7XHJcbiAgICAgICAgcC5fcHJvY2Vzc0Zha2VTdGFydFRhZygkLlRSKTtcclxuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLkNBUFRJT04gfHwgdG4gPT09ICQuQ09MIHx8IHRuID09PSAkLkNPTEdST1VQIHx8XHJcbiAgICAgICAgICAgICB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRCkge1xyXG5cclxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzVGFibGVCb2R5Q29udGV4dEluVGFibGVTY29wZSgpKSB7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpO1xyXG4gICAgICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZyhwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSk7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICBzdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdJblRhYmxlQm9keShwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuVEJPRFkgfHwgdG4gPT09ICQuVEZPT1QgfHwgdG4gPT09ICQuVEhFQUQpIHtcclxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKHRuKSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XHJcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX01PREU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlRBQkxFKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc1RhYmxlQm9keUNvbnRleHRJblRhYmxlU2NvcGUoKSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUpO1xyXG4gICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biAhPT0gJC5CT0RZICYmIHRuICE9PSAkLkNBUFRJT04gJiYgdG4gIT09ICQuQ09MICYmIHRuICE9PSAkLkNPTEdST1VQIHx8XHJcbiAgICAgICAgICAgICB0biAhPT0gJC5IVE1MICYmIHRuICE9PSAkLlREICYmIHRuICE9PSAkLlRIICYmIHRuICE9PSAkLlRSKSB7XHJcbiAgICAgICAgZW5kVGFnSW5UYWJsZShwLCB0b2tlbik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vMTIuMi41LjQuMTQgVGhlIFwiaW4gcm93XCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdJblJvdyhwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuVEggfHwgdG4gPT09ICQuVEQpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlUm93Q29udGV4dCgpO1xyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0NFTExfTU9ERTtcclxuICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnRNYXJrZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5DQVBUSU9OIHx8IHRuID09PSAkLkNPTCB8fCB0biA9PT0gJC5DT0xHUk9VUCB8fCB0biA9PT0gJC5UQk9EWSB8fFxyXG4gICAgICAgICAgICAgdG4gPT09ICQuVEZPT1QgfHwgdG4gPT09ICQuVEhFQUQgfHwgdG4gPT09ICQuVFIpIHtcclxuICAgICAgICB2YXIgZmFrZVRva2VuID0gcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5UUik7XHJcblxyXG4gICAgICAgIC8vTk9URTogVGhlIGZha2UgZW5kIHRhZyB0b2tlbiBoZXJlIGNhbiBvbmx5IGJlIGlnbm9yZWQgaW4gdGhlIGZyYWdtZW50IGNhc2UuXHJcbiAgICAgICAgaWYgKCFmYWtlVG9rZW4uaWdub3JlZClcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgc3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5kVGFnSW5Sb3cocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLlRSKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSgkLlRSKSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlUm93Q29udGV4dCgpO1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfQk9EWV9NT0RFO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0b2tlbi5pZ25vcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSkge1xyXG4gICAgICAgIHZhciBmYWtlVG9rZW4gPSBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLlRSKTtcclxuXHJcbiAgICAgICAgLy9OT1RFOiBUaGUgZmFrZSBlbmQgdGFnIHRva2VuIGhlcmUgY2FuIG9ubHkgYmUgaWdub3JlZCBpbiB0aGUgZnJhZ21lbnQgY2FzZS5cclxuICAgICAgICBpZiAoIWZha2VUb2tlbi5pZ25vcmVkKVxyXG4gICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRGT09UIHx8IHRuID09PSAkLlRIRUFEKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSh0bikpIHtcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5UUik7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuICE9PSAkLkJPRFkgJiYgdG4gIT09ICQuQ0FQVElPTiAmJiB0biAhPT0gJC5DT0wgJiYgdG4gIT09ICQuQ09MR1JPVVAgfHxcclxuICAgICAgICAgICAgIHRuICE9PSAkLkhUTUwgJiYgdG4gIT09ICQuVEQgJiYgdG4gIT09ICQuVEgpIHtcclxuICAgICAgICBlbmRUYWdJblRhYmxlKHAsIHRva2VuKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8vMTIuMi41LjQuMTUgVGhlIFwiaW4gY2VsbFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnSW5DZWxsKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5DQVBUSU9OIHx8IHRuID09PSAkLkNPTCB8fCB0biA9PT0gJC5DT0xHUk9VUCB8fCB0biA9PT0gJC5UQk9EWSB8fFxyXG4gICAgICAgIHRuID09PSAkLlREIHx8IHRuID09PSAkLlRGT09UIHx8IHRuID09PSAkLlRIIHx8IHRuID09PSAkLlRIRUFEIHx8IHRuID09PSAkLlRSKSB7XHJcblxyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5URCkgfHwgcC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKCQuVEgpKSB7XHJcbiAgICAgICAgICAgIHAuX2Nsb3NlVGFibGVDZWxsKCk7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0luQ2VsbChwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuVEQgfHwgdG4gPT09ICQuVEgpIHtcclxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKHRuKSkge1xyXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCh0bik7XHJcbiAgICAgICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XHJcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1JPV19NT0RFO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSB8fCB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRCB8fCB0biA9PT0gJC5UUikge1xyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG4pKSB7XHJcbiAgICAgICAgICAgIHAuX2Nsb3NlVGFibGVDZWxsKCk7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuICE9PSAkLkJPRFkgJiYgdG4gIT09ICQuQ0FQVElPTiAmJiB0biAhPT0gJC5DT0wgJiYgdG4gIT09ICQuQ09MR1JPVVAgJiYgdG4gIT09ICQuSFRNTClcclxuICAgICAgICBlbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG59XHJcblxyXG4vLzEyLjIuNS40LjE2IFRoZSBcImluIHNlbGVjdFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnSW5TZWxlY3QocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLk9QVElPTikge1xyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRJT04pXHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NGYWtlRW5kVGFnKCQuT1BUSU9OKTtcclxuXHJcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuT1BUR1JPVVApIHtcclxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUgPT09ICQuT1BUSU9OKVxyXG4gICAgICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLk9QVElPTik7XHJcblxyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRHUk9VUClcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5PUFRHUk9VUCk7XHJcblxyXG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2UgaWYgKHRuID09PSAkLlNFTEVDVClcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLlNFTEVDVCk7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuSU5QVVQgfHwgdG4gPT09ICQuS0VZR0VOIHx8IHRuID09PSAkLlRFWFRBUkVBKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2VsZWN0U2NvcGUoJC5TRUxFQ1QpKSB7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NGYWtlRW5kVGFnKCQuU0VMRUNUKTtcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuU0NSSVBUIHx8IHRuID09PSAkLlRFTVBMQVRFKVxyXG4gICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5kVGFnSW5TZWxlY3QocCwgdG9rZW4pIHtcclxuICAgIHZhciB0biA9IHRva2VuLnRhZ05hbWU7XHJcblxyXG4gICAgaWYgKHRuID09PSAkLk9QVEdST1VQKSB7XHJcbiAgICAgICAgdmFyIHByZXZPcGVuRWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zW3Aub3BlbkVsZW1lbnRzLnN0YWNrVG9wIC0gMV0sXHJcbiAgICAgICAgICAgIHByZXZPcGVuRWxlbWVudFRuID0gcHJldk9wZW5FbGVtZW50ICYmIHAudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShwcmV2T3BlbkVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUgPT09ICQuT1BUSU9OICYmIHByZXZPcGVuRWxlbWVudFRuID09PSAkLk9QVEdST1VQKVxyXG4gICAgICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLk9QVElPTik7XHJcblxyXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRHUk9VUClcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuT1BUSU9OKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lID09PSAkLk9QVElPTilcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuU0VMRUNUICYmIHAub3BlbkVsZW1lbnRzLmhhc0luU2VsZWN0U2NvcGUoJC5TRUxFQ1QpKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuU0VMRUNUKTtcclxuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSlcclxuICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG59XHJcblxyXG4vLzEyLjIuNS40LjE3IFRoZSBcImluIHNlbGVjdCBpbiB0YWJsZVwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnSW5TZWxlY3RJblRhYmxlKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5DQVBUSU9OIHx8IHRuID09PSAkLlRBQkxFIHx8IHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRGT09UIHx8XHJcbiAgICAgICAgdG4gPT09ICQuVEhFQUQgfHwgdG4gPT09ICQuVFIgfHwgdG4gPT09ICQuVEQgfHwgdG4gPT09ICQuVEgpIHtcclxuICAgICAgICBwLl9wcm9jZXNzRmFrZUVuZFRhZygkLlNFTEVDVCk7XHJcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgc3RhcnRUYWdJblNlbGVjdChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0luU2VsZWN0SW5UYWJsZShwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuQ0FQVElPTiB8fCB0biA9PT0gJC5UQUJMRSB8fCB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fFxyXG4gICAgICAgIHRuID09PSAkLlRIRUFEIHx8IHRuID09PSAkLlRSIHx8IHRuID09PSAkLlREIHx8IHRuID09PSAkLlRIKSB7XHJcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSh0bikpIHtcclxuICAgICAgICAgICAgcC5fcHJvY2Vzc0Zha2VFbmRUYWcoJC5TRUxFQ1QpO1xyXG4gICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgZW5kVGFnSW5TZWxlY3QocCwgdG9rZW4pO1xyXG59XHJcblxyXG4vLzEyLjIuNS40LjE4IFRoZSBcImluIHRlbXBsYXRlXCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdJblRlbXBsYXRlKHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5CQVNFIHx8IHRuID09PSAkLkJBU0VGT05UIHx8IHRuID09PSAkLkJHU09VTkQgfHwgdG4gPT09ICQuTElOSyB8fCB0biA9PT0gJC5NRVRBIHx8XHJcbiAgICAgICAgdG4gPT09ICQuTk9GUkFNRVMgfHwgdG4gPT09ICQuU0NSSVBUIHx8IHRuID09PSAkLlNUWUxFIHx8IHRuID09PSAkLlRFTVBMQVRFIHx8IHRuID09PSAkLlRJVExFKSB7XHJcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBuZXdJbnNlcnRpb25Nb2RlID0gVEVNUExBVEVfSU5TRVJUSU9OX01PREVfU1dJVENIX01BUFt0bl0gfHwgSU5fQk9EWV9NT0RFO1xyXG5cclxuICAgICAgICBwLl9wb3BUbXBsSW5zZXJ0aW9uTW9kZSgpO1xyXG4gICAgICAgIHAuX3B1c2hUbXBsSW5zZXJ0aW9uTW9kZShuZXdJbnNlcnRpb25Nb2RlKTtcclxuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBuZXdJbnNlcnRpb25Nb2RlO1xyXG4gICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0luVGVtcGxhdGUocCwgdG9rZW4pIHtcclxuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLlRFTVBMQVRFKVxyXG4gICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVvZkluVGVtcGxhdGUocCwgdG9rZW4pIHtcclxuICAgIGlmIChwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPiAwKSB7XHJcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUZW1wbGF0ZVBvcHBlZCgpO1xyXG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XHJcbiAgICAgICAgcC5fcG9wVG1wbEluc2VydGlvbk1vZGUoKTtcclxuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcclxuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgICBwLnN0b3BwZWQgPSB0cnVlO1xyXG59XHJcblxyXG5cclxuLy8xMi4yLjUuNC4xOSBUaGUgXCJhZnRlciBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZnVuY3Rpb24gc3RhcnRUYWdBZnRlckJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0b2tlbkFmdGVyQm9keShwLCB0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuZFRhZ0FmdGVyQm9keShwLCB0b2tlbikge1xyXG4gICAgaWYgKHRva2VuLnRhZ05hbWUgPT09ICQuSFRNTCkge1xyXG4gICAgICAgIGlmICghcC5mcmFnbWVudENvbnRleHQpXHJcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEFGVEVSX0FGVEVSX0JPRFlfTU9ERTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlXHJcbiAgICAgICAgdG9rZW5BZnRlckJvZHkocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b2tlbkFmdGVyQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuLy8xMi4yLjUuNC4yMCBUaGUgXCJpbiBmcmFtZXNldFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnSW5GcmFtZXNldChwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuSFRNTClcclxuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuRlJBTUVTRVQpXHJcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuRlJBTUUpXHJcbiAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuTk9GUkFNRVMpXHJcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdJbkZyYW1lc2V0KHAsIHRva2VuKSB7XHJcbiAgICBpZiAodG9rZW4udGFnTmFtZSA9PT0gJC5GUkFNRVNFVCAmJiAhcC5vcGVuRWxlbWVudHMuaXNSb290SHRtbEVsZW1lbnRDdXJyZW50KCkpIHtcclxuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcclxuXHJcbiAgICAgICAgaWYgKCFwLmZyYWdtZW50Q29udGV4dCAmJiBwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSAhPT0gJC5GUkFNRVNFVClcclxuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gQUZURVJfRlJBTUVTRVRfTU9ERTtcclxuICAgIH1cclxufVxyXG5cclxuLy8xMi4yLjUuNC4yMSBUaGUgXCJhZnRlciBmcmFtZXNldFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnQWZ0ZXJGcmFtZXNldChwLCB0b2tlbikge1xyXG4gICAgdmFyIHRuID0gdG9rZW4udGFnTmFtZTtcclxuXHJcbiAgICBpZiAodG4gPT09ICQuSFRNTClcclxuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XHJcblxyXG4gICAgZWxzZSBpZiAodG4gPT09ICQuTk9GUkFNRVMpXHJcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmRUYWdBZnRlckZyYW1lc2V0KHAsIHRva2VuKSB7XHJcbiAgICBpZiAodG9rZW4udGFnTmFtZSA9PT0gJC5IVE1MKVxyXG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEFGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREU7XHJcbn1cclxuXHJcbi8vMTIuMi41LjQuMjIgVGhlIFwiYWZ0ZXIgYWZ0ZXIgYm9keVwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnQWZ0ZXJBZnRlckJvZHkocCwgdG9rZW4pIHtcclxuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLkhUTUwpXHJcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgICB0b2tlbkFmdGVyQWZ0ZXJCb2R5KHAsIHRva2VuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9rZW5BZnRlckFmdGVyQm9keShwLCB0b2tlbikge1xyXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xyXG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcclxufVxyXG5cclxuLy8xMi4yLjUuNC4yMyBUaGUgXCJhZnRlciBhZnRlciBmcmFtZXNldFwiIGluc2VydGlvbiBtb2RlXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnQWZ0ZXJBZnRlckZyYW1lc2V0KHAsIHRva2VuKSB7XHJcbiAgICB2YXIgdG4gPSB0b2tlbi50YWdOYW1lO1xyXG5cclxuICAgIGlmICh0biA9PT0gJC5IVE1MKVxyXG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcclxuXHJcbiAgICBlbHNlIGlmICh0biA9PT0gJC5OT0ZSQU1FUylcclxuICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XHJcbn1cclxuXHJcblxyXG4vLzEyLjIuNS41IFRoZSBydWxlcyBmb3IgcGFyc2luZyB0b2tlbnMgaW4gZm9yZWlnbiBjb250ZW50XHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmZ1bmN0aW9uIG51bGxDaGFyYWN0ZXJJbkZvcmVpZ25Db250ZW50KHAsIHRva2VuKSB7XHJcbiAgICB0b2tlbi5jaGFycyA9IFVOSUNPREUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xyXG4gICAgcC5faW5zZXJ0Q2hhcmFjdGVycyh0b2tlbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoYXJhY3RlckluRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcclxuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xyXG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Gb3JlaWduQ29udGVudChwLCB0b2tlbikge1xyXG4gICAgaWYgKEZvcmVpZ25Db250ZW50LmNhdXNlc0V4aXQodG9rZW4pICYmICFwLmZyYWdtZW50Q29udGV4dCkge1xyXG4gICAgICAgIHdoaWxlIChwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShwLm9wZW5FbGVtZW50cy5jdXJyZW50KSAhPT0gTlMuSFRNTCAmJlxyXG4gICAgICAgICAgICAgICAoIXAuX2lzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQocC5vcGVuRWxlbWVudHMuY3VycmVudCkpICYmXHJcbiAgICAgICAgICAgICAgICghcC5faXNIdG1sSW50ZWdyYXRpb25Qb2ludChwLm9wZW5FbGVtZW50cy5jdXJyZW50KSkpIHtcclxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBjdXJyZW50ID0gcC5fZ2V0QWRqdXN0ZWRDdXJyZW50RWxlbWVudCgpLFxyXG4gICAgICAgICAgICBjdXJyZW50TnMgPSBwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShjdXJyZW50KTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnROcyA9PT0gTlMuTUFUSE1MKVxyXG4gICAgICAgICAgICBGb3JlaWduQ29udGVudC5hZGp1c3RUb2tlbk1hdGhNTEF0dHJzKHRva2VuKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudE5zID09PSBOUy5TVkcpIHtcclxuICAgICAgICAgICAgRm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5TVkdUYWdOYW1lKHRva2VuKTtcclxuICAgICAgICAgICAgRm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5TVkdBdHRycyh0b2tlbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBGb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKTtcclxuXHJcbiAgICAgICAgaWYgKHRva2VuLnNlbGZDbG9zaW5nKVxyXG4gICAgICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBjdXJyZW50TnMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgY3VycmVudE5zKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZW5kVGFnSW5Gb3JlaWduQ29udGVudChwLCB0b2tlbikge1xyXG4gICAgZm9yICh2YXIgaSA9IHAub3BlbkVsZW1lbnRzLnN0YWNrVG9wOyBpID4gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnQpID09PSBOUy5IVE1MKSB7XHJcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHAudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KS50b0xvd2VyQ2FzZSgpID09PSB0b2tlbi50YWdOYW1lKSB7XHJcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsRWxlbWVudFBvcHBlZChlbGVtZW50KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5d1lYUm9MV0p5YjNkelpYSnBabmt2YVc1a1pYZ3Vhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5OGdRMjl3ZVhKcFoyaDBJRXB2ZVdWdWRDd2dTVzVqTGlCaGJtUWdiM1JvWlhJZ1RtOWtaU0JqYjI1MGNtbGlkWFJ2Y25NdVhHNHZMMXh1THk4Z1VHVnliV2x6YzJsdmJpQnBjeUJvWlhKbFlua2daM0poYm5SbFpDd2dabkpsWlNCdlppQmphR0Z5WjJVc0lIUnZJR0Z1ZVNCd1pYSnpiMjRnYjJKMFlXbHVhVzVuSUdGY2JpOHZJR052Y0hrZ2IyWWdkR2hwY3lCemIyWjBkMkZ5WlNCaGJtUWdZWE56YjJOcFlYUmxaQ0JrYjJOMWJXVnVkR0YwYVc5dUlHWnBiR1Z6SUNoMGFHVmNiaTh2SUZ3aVUyOW1kSGRoY21WY0lpa3NJSFJ2SUdSbFlXd2dhVzRnZEdobElGTnZablIzWVhKbElIZHBkR2h2ZFhRZ2NtVnpkSEpwWTNScGIyNHNJR2x1WTJ4MVpHbHVaMXh1THk4Z2QybDBhRzkxZENCc2FXMXBkR0YwYVc5dUlIUm9aU0J5YVdkb2RITWdkRzhnZFhObExDQmpiM0I1TENCdGIyUnBabmtzSUcxbGNtZGxMQ0J3ZFdKc2FYTm9MRnh1THk4Z1pHbHpkSEpwWW5WMFpTd2djM1ZpYkdsalpXNXpaU3dnWVc1a0wyOXlJSE5sYkd3Z1kyOXdhV1Z6SUc5bUlIUm9aU0JUYjJaMGQyRnlaU3dnWVc1a0lIUnZJSEJsY20xcGRGeHVMeThnY0dWeWMyOXVjeUIwYnlCM2FHOXRJSFJvWlNCVGIyWjBkMkZ5WlNCcGN5Qm1kWEp1YVhOb1pXUWdkRzhnWkc4Z2MyOHNJSE4xWW1wbFkzUWdkRzhnZEdobFhHNHZMeUJtYjJ4c2IzZHBibWNnWTI5dVpHbDBhVzl1Y3pwY2JpOHZYRzR2THlCVWFHVWdZV0p2ZG1VZ1kyOXdlWEpwWjJoMElHNXZkR2xqWlNCaGJtUWdkR2hwY3lCd1pYSnRhWE56YVc5dUlHNXZkR2xqWlNCemFHRnNiQ0JpWlNCcGJtTnNkV1JsWkZ4dUx5OGdhVzRnWVd4c0lHTnZjR2xsY3lCdmNpQnpkV0p6ZEdGdWRHbGhiQ0J3YjNKMGFXOXVjeUJ2WmlCMGFHVWdVMjltZEhkaGNtVXVYRzR2TDF4dUx5OGdWRWhGSUZOUFJsUlhRVkpGSUVsVElGQlNUMVpKUkVWRUlGd2lRVk1nU1ZOY0lpd2dWMGxVU0U5VlZDQlhRVkpTUVU1VVdTQlBSaUJCVGxrZ1MwbE9SQ3dnUlZoUVVrVlRVMXh1THk4Z1QxSWdTVTFRVEVsRlJDd2dTVTVEVEZWRVNVNUhJRUpWVkNCT1QxUWdURWxOU1ZSRlJDQlVUeUJVU0VVZ1YwRlNVa0ZPVkVsRlV5QlBSbHh1THk4Z1RVVlNRMGhCVGxSQlFrbE1TVlJaTENCR1NWUk9SVk5USUVaUFVpQkJJRkJCVWxSSlExVk1RVklnVUZWU1VFOVRSU0JCVGtRZ1RrOU9TVTVHVWtsT1IwVk5SVTVVTGlCSlRseHVMeThnVGs4Z1JWWkZUbFFnVTBoQlRFd2dWRWhGSUVGVlZFaFBVbE1nVDFJZ1EwOVFXVkpKUjBoVUlFaFBURVJGVWxNZ1FrVWdURWxCUWt4RklFWlBVaUJCVGxrZ1EweEJTVTBzWEc0dkx5QkVRVTFCUjBWVElFOVNJRTlVU0VWU0lFeEpRVUpKVEVsVVdTd2dWMGhGVkVoRlVpQkpUaUJCVGlCQlExUkpUMDRnVDBZZ1EwOU9WRkpCUTFRc0lGUlBVbFFnVDFKY2JpOHZJRTlVU0VWU1YwbFRSU3dnUVZKSlUwbE9SeUJHVWs5TkxDQlBWVlFnVDBZZ1QxSWdTVTRnUTA5T1RrVkRWRWxQVGlCWFNWUklJRlJJUlNCVFQwWlVWMEZTUlNCUFVpQlVTRVZjYmk4dklGVlRSU0JQVWlCUFZFaEZVaUJFUlVGTVNVNUhVeUJKVGlCVVNFVWdVMDlHVkZkQlVrVXVYRzVjYmk4dklISmxjMjlzZG1WeklDNGdZVzVrSUM0dUlHVnNaVzFsYm5SeklHbHVJR0VnY0dGMGFDQmhjbkpoZVNCM2FYUm9JR1JwY21WamRHOXllU0J1WVcxbGN5QjBhR1Z5WlZ4dUx5OGdiWFZ6ZENCaVpTQnVieUJ6YkdGemFHVnpMQ0JsYlhCMGVTQmxiR1Z0Wlc1MGN5d2diM0lnWkdWMmFXTmxJRzVoYldWeklDaGpPbHhjS1NCcGJpQjBhR1VnWVhKeVlYbGNiaTh2SUNoemJ5QmhiSE52SUc1dklHeGxZV1JwYm1jZ1lXNWtJSFJ5WVdsc2FXNW5JSE5zWVhOb1pYTWdMU0JwZENCa2IyVnpJRzV2ZENCa2FYTjBhVzVuZFdsemFGeHVMeThnY21Wc1lYUnBkbVVnWVc1a0lHRmljMjlzZFhSbElIQmhkR2h6S1Z4dVpuVnVZM1JwYjI0Z2JtOXliV0ZzYVhwbFFYSnlZWGtvY0dGeWRITXNJR0ZzYkc5M1FXSnZkbVZTYjI5MEtTQjdYRzRnSUM4dklHbG1JSFJvWlNCd1lYUm9JSFJ5YVdWeklIUnZJR2R2SUdGaWIzWmxJSFJvWlNCeWIyOTBMQ0JnZFhCZ0lHVnVaSE1nZFhBZ1BpQXdYRzRnSUhaaGNpQjFjQ0E5SURBN1hHNGdJR1p2Y2lBb2RtRnlJR2tnUFNCd1lYSjBjeTVzWlc1bmRHZ2dMU0F4T3lCcElENDlJREE3SUdrdExTa2dlMXh1SUNBZ0lIWmhjaUJzWVhOMElEMGdjR0Z5ZEhOYmFWMDdYRzRnSUNBZ2FXWWdLR3hoYzNRZ1BUMDlJQ2N1SnlrZ2UxeHVJQ0FnSUNBZ2NHRnlkSE11YzNCc2FXTmxLR2tzSURFcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHRnpkQ0E5UFQwZ0p5NHVKeWtnZTF4dUlDQWdJQ0FnY0dGeWRITXVjM0JzYVdObEtHa3NJREVwTzF4dUlDQWdJQ0FnZFhBckt6dGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIVndLU0I3WEc0Z0lDQWdJQ0J3WVhKMGN5NXpjR3hwWTJVb2FTd2dNU2s3WEc0Z0lDQWdJQ0IxY0MwdE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHZJR2xtSUhSb1pTQndZWFJvSUdseklHRnNiRzkzWldRZ2RHOGdaMjhnWVdKdmRtVWdkR2hsSUhKdmIzUXNJSEpsYzNSdmNtVWdiR1ZoWkdsdVp5QXVMbk5jYmlBZ2FXWWdLR0ZzYkc5M1FXSnZkbVZTYjI5MEtTQjdYRzRnSUNBZ1ptOXlJQ2c3SUhWd0xTMDdJSFZ3S1NCN1hHNGdJQ0FnSUNCd1lYSjBjeTUxYm5Ob2FXWjBLQ2N1TGljcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCd1lYSjBjenRjYm4xY2JseHVMeThnVTNCc2FYUWdZU0JtYVd4bGJtRnRaU0JwYm5SdklGdHliMjkwTENCa2FYSXNJR0poYzJWdVlXMWxMQ0JsZUhSZExDQjFibWw0SUhabGNuTnBiMjVjYmk4dklDZHliMjkwSnlCcGN5QnFkWE4wSUdFZ2MyeGhjMmdzSUc5eUlHNXZkR2hwYm1jdVhHNTJZWElnYzNCc2FYUlFZWFJvVW1VZ1BWeHVJQ0FnSUM5ZUtGeGNMejk4S1NoYlhGeHpYRnhUWFNvL0tTZ29QenBjWEM1N01Td3lmWHhiWGx4Y0wxMHJQM3dwS0Z4Y0xsdGVMbHhjTDEwcWZDa3BLRDg2VzF4Y0wxMHFLU1F2TzF4dWRtRnlJSE53YkdsMFVHRjBhQ0E5SUdaMWJtTjBhVzl1S0dacGJHVnVZVzFsS1NCN1hHNGdJSEpsZEhWeWJpQnpjR3hwZEZCaGRHaFNaUzVsZUdWaktHWnBiR1Z1WVcxbEtTNXpiR2xqWlNneEtUdGNibjA3WEc1Y2JpOHZJSEJoZEdndWNtVnpiMngyWlNoYlpuSnZiU0F1TGk1ZExDQjBieWxjYmk4dklIQnZjMmw0SUhabGNuTnBiMjVjYm1WNGNHOXlkSE11Y21WemIyeDJaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0IyWVhJZ2NtVnpiMngyWldSUVlYUm9JRDBnSnljc1hHNGdJQ0FnSUNCeVpYTnZiSFpsWkVGaWMyOXNkWFJsSUQwZ1ptRnNjMlU3WEc1Y2JpQWdabTl5SUNoMllYSWdhU0E5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnTFNBeE95QnBJRDQ5SUMweElDWW1JQ0Z5WlhOdmJIWmxaRUZpYzI5c2RYUmxPeUJwTFMwcElIdGNiaUFnSUNCMllYSWdjR0YwYUNBOUlDaHBJRDQ5SURBcElEOGdZWEpuZFcxbGJuUnpXMmxkSURvZ2NISnZZMlZ6Y3k1amQyUW9LVHRjYmx4dUlDQWdJQzh2SUZOcmFYQWdaVzF3ZEhrZ1lXNWtJR2x1ZG1Gc2FXUWdaVzUwY21sbGMxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2NHRjBhQ0FoUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEZ5WjNWdFpXNTBjeUIwYnlCd1lYUm9MbkpsYzI5c2RtVWdiWFZ6ZENCaVpTQnpkSEpwYm1kekp5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2hjR0YwYUNrZ2UxeHVJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WemIyeDJaV1JRWVhSb0lEMGdjR0YwYUNBcklDY3ZKeUFySUhKbGMyOXNkbVZrVUdGMGFEdGNiaUFnSUNCeVpYTnZiSFpsWkVGaWMyOXNkWFJsSUQwZ2NHRjBhQzVqYUdGeVFYUW9NQ2tnUFQwOUlDY3ZKenRjYmlBZ2ZWeHVYRzRnSUM4dklFRjBJSFJvYVhNZ2NHOXBiblFnZEdobElIQmhkR2dnYzJodmRXeGtJR0psSUhKbGMyOXNkbVZrSUhSdklHRWdablZzYkNCaFluTnZiSFYwWlNCd1lYUm9MQ0JpZFhSY2JpQWdMeThnYUdGdVpHeGxJSEpsYkdGMGFYWmxJSEJoZEdoeklIUnZJR0psSUhOaFptVWdLRzFwWjJoMElHaGhjSEJsYmlCM2FHVnVJSEJ5YjJObGMzTXVZM2RrS0NrZ1ptRnBiSE1wWEc1Y2JpQWdMeThnVG05eWJXRnNhWHBsSUhSb1pTQndZWFJvWEc0Z0lISmxjMjlzZG1Wa1VHRjBhQ0E5SUc1dmNtMWhiR2w2WlVGeWNtRjVLR1pwYkhSbGNpaHlaWE52YkhabFpGQmhkR2d1YzNCc2FYUW9KeThuS1N3Z1puVnVZM1JwYjI0b2NDa2dlMXh1SUNBZ0lISmxkSFZ5YmlBaElYQTdYRzRnSUgwcExDQWhjbVZ6YjJ4MlpXUkJZbk52YkhWMFpTa3VhbTlwYmlnbkx5Y3BPMXh1WEc0Z0lISmxkSFZ5YmlBb0tISmxjMjlzZG1Wa1FXSnpiMngxZEdVZ1B5QW5MeWNnT2lBbkp5a2dLeUJ5WlhOdmJIWmxaRkJoZEdncElIeDhJQ2N1Snp0Y2JuMDdYRzVjYmk4dklIQmhkR2d1Ym05eWJXRnNhWHBsS0hCaGRHZ3BYRzR2THlCd2IzTnBlQ0IyWlhKemFXOXVYRzVsZUhCdmNuUnpMbTV2Y20xaGJHbDZaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3BJSHRjYmlBZ2RtRnlJR2x6UVdKemIyeDFkR1VnUFNCbGVIQnZjblJ6TG1selFXSnpiMngxZEdVb2NHRjBhQ2tzWEc0Z0lDQWdJQ0IwY21GcGJHbHVaMU5zWVhOb0lEMGdjM1ZpYzNSeUtIQmhkR2dzSUMweEtTQTlQVDBnSnk4bk8xeHVYRzRnSUM4dklFNXZjbTFoYkdsNlpTQjBhR1VnY0dGMGFGeHVJQ0J3WVhSb0lEMGdibTl5YldGc2FYcGxRWEp5WVhrb1ptbHNkR1Z5S0hCaGRHZ3VjM0JzYVhRb0p5OG5LU3dnWm5WdVkzUnBiMjRvY0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUFoSVhBN1hHNGdJSDBwTENBaGFYTkJZbk52YkhWMFpTa3VhbTlwYmlnbkx5Y3BPMXh1WEc0Z0lHbG1JQ2doY0dGMGFDQW1KaUFoYVhOQlluTnZiSFYwWlNrZ2UxeHVJQ0FnSUhCaGRHZ2dQU0FuTGljN1hHNGdJSDFjYmlBZ2FXWWdLSEJoZEdnZ0ppWWdkSEpoYVd4cGJtZFRiR0Z6YUNrZ2UxeHVJQ0FnSUhCaGRHZ2dLejBnSnk4bk8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlDaHBjMEZpYzI5c2RYUmxJRDhnSnk4bklEb2dKeWNwSUNzZ2NHRjBhRHRjYm4wN1hHNWNiaTh2SUhCdmMybDRJSFpsY25OcGIyNWNibVY0Y0c5eWRITXVhWE5CWW5OdmJIVjBaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3BJSHRjYmlBZ2NtVjBkWEp1SUhCaGRHZ3VZMmhoY2tGMEtEQXBJRDA5UFNBbkx5YzdYRzU5TzF4dVhHNHZMeUJ3YjNOcGVDQjJaWEp6YVc5dVhHNWxlSEJ2Y25SekxtcHZhVzRnUFNCbWRXNWpkR2x2YmlncElIdGNiaUFnZG1GeUlIQmhkR2h6SUQwZ1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5Oc2FXTmxMbU5oYkd3b1lYSm5kVzFsYm5SekxDQXdLVHRjYmlBZ2NtVjBkWEp1SUdWNGNHOXlkSE11Ym05eWJXRnNhWHBsS0dacGJIUmxjaWh3WVhSb2N5d2dablZ1WTNScGIyNG9jQ3dnYVc1a1pYZ3BJSHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JSEFnSVQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RCY21kMWJXVnVkSE1nZEc4Z2NHRjBhQzVxYjJsdUlHMTFjM1FnWW1VZ2MzUnlhVzVuY3ljcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjRHRjYmlBZ2ZTa3VhbTlwYmlnbkx5Y3BLVHRjYm4wN1hHNWNibHh1THk4Z2NHRjBhQzV5Wld4aGRHbDJaU2htY205dExDQjBieWxjYmk4dklIQnZjMmw0SUhabGNuTnBiMjVjYm1WNGNHOXlkSE11Y21Wc1lYUnBkbVVnUFNCbWRXNWpkR2x2YmlobWNtOXRMQ0IwYnlrZ2UxeHVJQ0JtY205dElEMGdaWGh3YjNKMGN5NXlaWE52YkhabEtHWnliMjBwTG5OMVluTjBjaWd4S1R0Y2JpQWdkRzhnUFNCbGVIQnZjblJ6TG5KbGMyOXNkbVVvZEc4cExuTjFZbk4wY2lneEtUdGNibHh1SUNCbWRXNWpkR2x2YmlCMGNtbHRLR0Z5Y2lrZ2UxeHVJQ0FnSUhaaGNpQnpkR0Z5ZENBOUlEQTdYRzRnSUNBZ1ptOXlJQ2c3SUhOMFlYSjBJRHdnWVhKeUxteGxibWQwYURzZ2MzUmhjblFyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLR0Z5Y2x0emRHRnlkRjBnSVQwOUlDY25LU0JpY21WaGF6dGNiaUFnSUNCOVhHNWNiaUFnSUNCMllYSWdaVzVrSUQwZ1lYSnlMbXhsYm1kMGFDQXRJREU3WEc0Z0lDQWdabTl5SUNnN0lHVnVaQ0ErUFNBd095QmxibVF0TFNrZ2UxeHVJQ0FnSUNBZ2FXWWdLR0Z5Y2x0bGJtUmRJQ0U5UFNBbkp5a2dZbkpsWVdzN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tITjBZWEowSUQ0Z1pXNWtLU0J5WlhSMWNtNGdXMTA3WEc0Z0lDQWdjbVYwZFhKdUlHRnljaTV6YkdsalpTaHpkR0Z5ZEN3Z1pXNWtJQzBnYzNSaGNuUWdLeUF4S1R0Y2JpQWdmVnh1WEc0Z0lIWmhjaUJtY205dFVHRnlkSE1nUFNCMGNtbHRLR1p5YjIwdWMzQnNhWFFvSnk4bktTazdYRzRnSUhaaGNpQjBiMUJoY25SeklEMGdkSEpwYlNoMGJ5NXpjR3hwZENnbkx5Y3BLVHRjYmx4dUlDQjJZWElnYkdWdVozUm9JRDBnVFdGMGFDNXRhVzRvWm5KdmJWQmhjblJ6TG14bGJtZDBhQ3dnZEc5UVlYSjBjeTVzWlc1bmRHZ3BPMXh1SUNCMllYSWdjMkZ0WlZCaGNuUnpUR1Z1WjNSb0lEMGdiR1Z1WjNSb08xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLR1p5YjIxUVlYSjBjMXRwWFNBaFBUMGdkRzlRWVhKMGMxdHBYU2tnZTF4dUlDQWdJQ0FnYzJGdFpWQmhjblJ6VEdWdVozUm9JRDBnYVR0Y2JpQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSFpoY2lCdmRYUndkWFJRWVhKMGN5QTlJRnRkTzF4dUlDQm1iM0lnS0haaGNpQnBJRDBnYzJGdFpWQmhjblJ6VEdWdVozUm9PeUJwSUR3Z1puSnZiVkJoY25SekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdiM1YwY0hWMFVHRnlkSE11Y0hWemFDZ25MaTRuS1R0Y2JpQWdmVnh1WEc0Z0lHOTFkSEIxZEZCaGNuUnpJRDBnYjNWMGNIVjBVR0Z5ZEhNdVkyOXVZMkYwS0hSdlVHRnlkSE11YzJ4cFkyVW9jMkZ0WlZCaGNuUnpUR1Z1WjNSb0tTazdYRzVjYmlBZ2NtVjBkWEp1SUc5MWRIQjFkRkJoY25SekxtcHZhVzRvSnk4bktUdGNibjA3WEc1Y2JtVjRjRzl5ZEhNdWMyVndJRDBnSnk4bk8xeHVaWGh3YjNKMGN5NWtaV3hwYldsMFpYSWdQU0FuT2ljN1hHNWNibVY0Y0c5eWRITXVaR2x5Ym1GdFpTQTlJR1oxYm1OMGFXOXVLSEJoZEdncElIdGNiaUFnZG1GeUlISmxjM1ZzZENBOUlITndiR2wwVUdGMGFDaHdZWFJvS1N4Y2JpQWdJQ0FnSUhKdmIzUWdQU0J5WlhOMWJIUmJNRjBzWEc0Z0lDQWdJQ0JrYVhJZ1BTQnlaWE4xYkhSYk1WMDdYRzVjYmlBZ2FXWWdLQ0Z5YjI5MElDWW1JQ0ZrYVhJcElIdGNiaUFnSUNBdkx5Qk9ieUJrYVhKdVlXMWxJSGRvWVhSemIyVjJaWEpjYmlBZ0lDQnlaWFIxY200Z0p5NG5PMXh1SUNCOVhHNWNiaUFnYVdZZ0tHUnBjaWtnZTF4dUlDQWdJQzh2SUVsMElHaGhjeUJoSUdScGNtNWhiV1VzSUhOMGNtbHdJSFJ5WVdsc2FXNW5JSE5zWVhOb1hHNGdJQ0FnWkdseUlEMGdaR2x5TG5OMVluTjBjaWd3TENCa2FYSXViR1Z1WjNSb0lDMGdNU2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnY205dmRDQXJJR1JwY2p0Y2JuMDdYRzVjYmx4dVpYaHdiM0owY3k1aVlYTmxibUZ0WlNBOUlHWjFibU4wYVc5dUtIQmhkR2dzSUdWNGRDa2dlMXh1SUNCMllYSWdaaUE5SUhOd2JHbDBVR0YwYUNod1lYUm9LVnN5WFR0Y2JpQWdMeThnVkU5RVR6b2diV0ZyWlNCMGFHbHpJR052YlhCaGNtbHpiMjRnWTJGelpTMXBibk5sYm5OcGRHbDJaU0J2YmlCM2FXNWtiM2R6UDF4dUlDQnBaaUFvWlhoMElDWW1JR1l1YzNWaWMzUnlLQzB4SUNvZ1pYaDBMbXhsYm1kMGFDa2dQVDA5SUdWNGRDa2dlMXh1SUNBZ0lHWWdQU0JtTG5OMVluTjBjaWd3TENCbUxteGxibWQwYUNBdElHVjRkQzVzWlc1bmRHZ3BPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQm1PMXh1ZlR0Y2JseHVYRzVsZUhCdmNuUnpMbVY0ZEc1aGJXVWdQU0JtZFc1amRHbHZiaWh3WVhSb0tTQjdYRzRnSUhKbGRIVnliaUJ6Y0d4cGRGQmhkR2dvY0dGMGFDbGJNMTA3WEc1OU8xeHVYRzVtZFc1amRHbHZiaUJtYVd4MFpYSWdLSGh6TENCbUtTQjdYRzRnSUNBZ2FXWWdLSGh6TG1acGJIUmxjaWtnY21WMGRYSnVJSGh6TG1acGJIUmxjaWhtS1R0Y2JpQWdJQ0IyWVhJZ2NtVnpJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCNGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9aaWg0YzF0cFhTd2dhU3dnZUhNcEtTQnlaWE11Y0hWemFDaDRjMXRwWFNrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc1OVhHNWNiaTh2SUZOMGNtbHVaeTV3Y205MGIzUjVjR1V1YzNWaWMzUnlJQzBnYm1WbllYUnBkbVVnYVc1a1pYZ2daRzl1SjNRZ2QyOXlheUJwYmlCSlJUaGNiblpoY2lCemRXSnpkSElnUFNBbllXSW5Mbk4xWW5OMGNpZ3RNU2tnUFQwOUlDZGlKMXh1SUNBZ0lEOGdablZ1WTNScGIyNGdLSE4wY2l3Z2MzUmhjblFzSUd4bGJpa2dleUJ5WlhSMWNtNGdjM1J5TG5OMVluTjBjaWh6ZEdGeWRDd2diR1Z1S1NCOVhHNGdJQ0FnT2lCbWRXNWpkR2x2YmlBb2MzUnlMQ0J6ZEdGeWRDd2diR1Z1S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h6ZEdGeWRDQThJREFwSUhOMFlYSjBJRDBnYzNSeUxteGxibWQwYUNBcklITjBZWEowTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYzNSeUxuTjFZbk4wY2loemRHRnlkQ3dnYkdWdUtUdGNiaUFnSUNCOVhHNDdYRzRpWFgwPSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiEgaHR0cDovL210aHMuYmUvcHVueWNvZGUgdjEuMi40IGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHM7XG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHRtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW14gLX5dLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1xceDJFfFxcdTMwMDJ8XFx1RkYwRXxcXHVGRjYxL2csIC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuXHQvKiogRXJyb3IgbWVzc2FnZXMgKi9cblx0ZXJyb3JzID0ge1xuXHRcdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdFx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0XHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xuXHR9LFxuXG5cdC8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cblx0YmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluLFxuXHRmbG9vciA9IE1hdGguZmxvb3IsXG5cdHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUsXG5cblx0LyoqIFRlbXBvcmFyeSB2YXJpYWJsZSAqL1xuXHRrZXk7XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cblx0ICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHRcdHRocm93IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdFx0YXJyYXlbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyYXk7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHJldHVybiBtYXAoc3RyaW5nLnNwbGl0KHJlZ2V4U2VwYXJhdG9ycyksIGZuKS5qb2luKCcuJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBkZWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cblx0ICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxuXHRcdCAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuXHRcdCAgICB2YWx1ZSxcblx0XHQgICAgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGVuY29kZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cblx0ICogQHNlZSBgZGlnaXRUb0Jhc2ljKClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50IChmb3IgdXNlIGluXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcblx0ICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCAtIDQ4IDwgMTApIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSAyMjtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDY1IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA2NTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDk3IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA5Nztcblx0XHR9XG5cdFx0cmV0dXJuIGJhc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3Jcblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Vcblx0ICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG5cdCAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG5cdCAqL1xuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcblx0XHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHRcdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG5cdH1cblxuXHQvKipcblx0ICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cblx0ICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRhcHQoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG5cdFx0dmFyIGsgPSAwO1xuXHRcdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdFx0ZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuXHRcdGZvciAoLyogbm8gaW5pdGlhbGl6YXRpb24gKi87IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG5cdFx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdFx0fVxuXHRcdHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG5cdCAqIHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuXHRcdC8vIERvbid0IHVzZSBVQ1MtMlxuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsXG5cdFx0ICAgIG91dCxcblx0XHQgICAgaSA9IDAsXG5cdFx0ICAgIG4gPSBpbml0aWFsTixcblx0XHQgICAgYmlhcyA9IGluaXRpYWxCaWFzLFxuXHRcdCAgICBiYXNpYyxcblx0XHQgICAgaixcblx0XHQgICAgaW5kZXgsXG5cdFx0ICAgIG9sZGksXG5cdFx0ICAgIHcsXG5cdFx0ICAgIGssXG5cdFx0ICAgIGRpZ2l0LFxuXHRcdCAgICB0LFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgYmFzZU1pbnVzVDtcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHRcdC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG5cdFx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cblx0XHRiYXNpYyA9IGlucHV0Lmxhc3RJbmRleE9mKGRlbGltaXRlcik7XG5cdFx0aWYgKGJhc2ljIDwgMCkge1xuXHRcdFx0YmFzaWMgPSAwO1xuXHRcdH1cblxuXHRcdGZvciAoaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0XHQvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcblx0XHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcblx0XHRcdFx0ZXJyb3IoJ25vdC1iYXNpYycpO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHRcdC8vIHBvaW50cyB3ZXJlIGNvcGllZDsgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvdGhlcndpc2UuXG5cblx0XHRmb3IgKGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xuXG5cdFx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXG5cdFx0XHQvLyB3aGljaCBnZXRzIGFkZGVkIHRvIGBpYC4gVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llclxuXHRcdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXG5cdFx0XHRmb3IgKG9sZGkgPSBpLCB3ID0gMSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cblx0XHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHcgKj0gYmFzZU1pbnVzVDtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xuXG5cdFx0XHQvLyBgaWAgd2FzIHN1cHBvc2VkIHRvIHdyYXAgYXJvdW5kIGZyb20gYG91dGAgdG8gYDBgLFxuXHRcdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRcdGlmIChmbG9vcihpIC8gb3V0KSA+IG1heEludCAtIG4pIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0XHRpICU9IG91dDtcblxuXHRcdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dFxuXHRcdFx0b3V0cHV0LnNwbGljZShpKyssIDAsIG4pO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVjczJlbmNvZGUob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgdG8gYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcblx0XHR2YXIgbixcblx0XHQgICAgZGVsdGEsXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50LFxuXHRcdCAgICBiYXNpY0xlbmd0aCxcblx0XHQgICAgYmlhcyxcblx0XHQgICAgaixcblx0XHQgICAgbSxcblx0XHQgICAgcSxcblx0XHQgICAgayxcblx0XHQgICAgdCxcblx0XHQgICAgY3VycmVudFZhbHVlLFxuXHRcdCAgICBvdXRwdXQgPSBbXSxcblx0XHQgICAgLyoqIGBpbnB1dExlbmd0aGAgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYGlucHV0YC4gKi9cblx0XHQgICAgaW5wdXRMZW5ndGgsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsXG5cdFx0ICAgIGJhc2VNaW51c1QsXG5cdFx0ICAgIHFNaW51c1Q7XG5cblx0XHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBVbmljb2RlXG5cdFx0aW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTtcblxuXHRcdC8vIENhY2hlIHRoZSBsZW5ndGhcblx0XHRpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuXHRcdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG5cdFx0biA9IGluaXRpYWxOO1xuXHRcdGRlbHRhID0gMDtcblx0XHRiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzXG5cdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xuXG5cdFx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdFx0Ly8gYGJhc2ljTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuXG5cdFx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgLSBpZiBpdCBpcyBub3QgZW1wdHkgLSB3aXRoIGEgZGVsaW1pdGVyXG5cdFx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0XHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0XHQvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0XG5cdFx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdFx0Zm9yIChtID0gbWF4SW50LCBqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdFx0bSA9IGN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sXG5cdFx0XHQvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvd1xuXHRcdFx0aGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuXHRcdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0XHRuID0gbTtcblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG5cdFx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJcblx0XHRcdFx0XHRmb3IgKHEgPSBkZWx0YSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cdFx0XHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblx0XHRcdFx0XHRcdGlmIChxIDwgdCkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHFNaW51c1QgPSBxIC0gdDtcblx0XHRcdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKFxuXHRcdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdFx0KytoYW5kbGVkQ1BDb3VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQrK2RlbHRhO1xuXHRcdFx0KytuO1xuXG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgdG8gVW5pY29kZS4gT25seSB0aGVcblx0ICogUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLiBpdCBkb2Vzbid0XG5cdCAqIG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkIHRvXG5cdCAqIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBQdW55Y29kZSBkb21haW4gbmFtZSB0byBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoZG9tYWluKSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihkb21haW4sIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIHRvIFB1bnljb2RlLiBPbmx5IHRoZVxuXHQgKiBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLCBpLmUuIGl0IGRvZXNuJ3Rcblx0ICogbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW4gQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSB0byBjb252ZXJ0LCBhcyBhIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShkb21haW4pIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGRvbWFpbiwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuMi40Jyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBPYmplY3Rcblx0XHQgKi9cblx0XHQndWNzMic6IHtcblx0XHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdFx0J2VuY29kZSc6IHVjczJlbmNvZGVcblx0XHR9LFxuXHRcdCdkZWNvZGUnOiBkZWNvZGUsXG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdFx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxuXHR9O1xuXG5cdC8qKiBFeHBvc2UgYHB1bnljb2RlYCAqL1xuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZSgncHVueWNvZGUnLCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHsgLy8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdGZvciAoa2V5IGluIHB1bnljb2RlKSB7XG5cdFx0XHRcdHB1bnljb2RlLmhhc093blByb3BlcnR5KGtleSkgJiYgKGZyZWVFeHBvcnRzW2tleV0gPSBwdW55Y29kZVtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OXdkVzU1WTI5a1pTOXdkVzU1WTI5a1pTNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEVpTENKbWFXeGxJam9pWjJWdVpYSmhkR1ZrTG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFJU0JvZEhSd09pOHZiWFJvY3k1aVpTOXdkVzU1WTI5a1pTQjJNUzR5TGpRZ1lua2dRRzFoZEdocFlYTWdLaTljYmpzb1puVnVZM1JwYjI0b2NtOXZkQ2tnZTF4dVhHNWNkQzhxS2lCRVpYUmxZM1FnWm5KbFpTQjJZWEpwWVdKc1pYTWdLaTljYmx4MGRtRnlJR1p5WldWRmVIQnZjblJ6SUQwZ2RIbHdaVzltSUdWNGNHOXlkSE1nUFQwZ0oyOWlhbVZqZENjZ0ppWWdaWGh3YjNKMGN6dGNibHgwZG1GeUlHWnlaV1ZOYjJSMWJHVWdQU0IwZVhCbGIyWWdiVzlrZFd4bElEMDlJQ2R2WW1wbFkzUW5JQ1ltSUcxdlpIVnNaU0FtSmx4dVhIUmNkRzF2WkhWc1pTNWxlSEJ2Y25SeklEMDlJR1p5WldWRmVIQnZjblJ6SUNZbUlHMXZaSFZzWlR0Y2JseDBkbUZ5SUdaeVpXVkhiRzlpWVd3Z1BTQjBlWEJsYjJZZ1oyeHZZbUZzSUQwOUlDZHZZbXBsWTNRbklDWW1JR2RzYjJKaGJEdGNibHgwYVdZZ0tHWnlaV1ZIYkc5aVlXd3VaMnh2WW1Gc0lEMDlQU0JtY21WbFIyeHZZbUZzSUh4OElHWnlaV1ZIYkc5aVlXd3VkMmx1Wkc5M0lEMDlQU0JtY21WbFIyeHZZbUZzS1NCN1hHNWNkRngwY205dmRDQTlJR1p5WldWSGJHOWlZV3c3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1ZHaGxJR0J3ZFc1NVkyOWtaV0FnYjJKcVpXTjBMbHh1WEhRZ0tpQkFibUZ0WlNCd2RXNTVZMjlrWlZ4dVhIUWdLaUJBZEhsd1pTQlBZbXBsWTNSY2JseDBJQ292WEc1Y2RIWmhjaUJ3ZFc1NVkyOWtaU3hjYmx4dVhIUXZLaW9nU0dsbmFHVnpkQ0J3YjNOcGRHbDJaU0J6YVdkdVpXUWdNekl0WW1sMElHWnNiMkYwSUhaaGJIVmxJQ292WEc1Y2RHMWhlRWx1ZENBOUlESXhORGMwT0RNMk5EY3NJQzh2SUdGcllTNGdNSGczUmtaR1JrWkdSaUJ2Y2lBeVhqTXhMVEZjYmx4dVhIUXZLaW9nUW05dmRITjBjbWx1WnlCd1lYSmhiV1YwWlhKeklDb3ZYRzVjZEdKaGMyVWdQU0F6Tml4Y2JseDBkRTFwYmlBOUlERXNYRzVjZEhSTllYZ2dQU0F5Tml4Y2JseDBjMnRsZHlBOUlETTRMRnh1WEhSa1lXMXdJRDBnTnpBd0xGeHVYSFJwYm1sMGFXRnNRbWxoY3lBOUlEY3lMRnh1WEhScGJtbDBhV0ZzVGlBOUlERXlPQ3dnTHk4Z01IZzRNRnh1WEhSa1pXeHBiV2wwWlhJZ1BTQW5MU2NzSUM4dklDZGNYSGd5UkNkY2JseHVYSFF2S2lvZ1VtVm5kV3hoY2lCbGVIQnlaWE56YVc5dWN5QXFMMXh1WEhSeVpXZGxlRkIxYm5samIyUmxJRDBnTDE1NGJpMHRMeXhjYmx4MGNtVm5aWGhPYjI1QlUwTkpTU0E5SUM5YlhpQXRmbDB2TENBdkx5QjFibkJ5YVc1MFlXSnNaU0JCVTBOSlNTQmphR0Z5Y3lBcklHNXZiaTFCVTBOSlNTQmphR0Z5YzF4dVhIUnlaV2RsZUZObGNHRnlZWFJ2Y25NZ1BTQXZYRng0TWtWOFhGeDFNekF3TW54Y1hIVkdSakJGZkZ4Y2RVWkdOakV2Wnl3Z0x5OGdVa1pESURNME9UQWdjMlZ3WVhKaGRHOXljMXh1WEc1Y2RDOHFLaUJGY25KdmNpQnRaWE56WVdkbGN5QXFMMXh1WEhSbGNuSnZjbk1nUFNCN1hHNWNkRngwSjI5MlpYSm1iRzkzSnpvZ0owOTJaWEptYkc5M09pQnBibkIxZENCdVpXVmtjeUIzYVdSbGNpQnBiblJsWjJWeWN5QjBieUJ3Y205alpYTnpKeXhjYmx4MFhIUW5ibTkwTFdKaGMybGpKem9nSjBsc2JHVm5ZV3dnYVc1d2RYUWdQajBnTUhnNE1DQW9ibTkwSUdFZ1ltRnphV01nWTI5a1pTQndiMmx1ZENrbkxGeHVYSFJjZENkcGJuWmhiR2xrTFdsdWNIVjBKem9nSjBsdWRtRnNhV1FnYVc1d2RYUW5YRzVjZEgwc1hHNWNibHgwTHlvcUlFTnZiblpsYm1sbGJtTmxJSE5vYjNKMFkzVjBjeUFxTDF4dVhIUmlZWE5sVFdsdWRYTlVUV2x1SUQwZ1ltRnpaU0F0SUhSTmFXNHNYRzVjZEdac2IyOXlJRDBnVFdGMGFDNW1iRzl2Y2l4Y2JseDBjM1J5YVc1blJuSnZiVU5vWVhKRGIyUmxJRDBnVTNSeWFXNW5MbVp5YjIxRGFHRnlRMjlrWlN4Y2JseHVYSFF2S2lvZ1ZHVnRjRzl5WVhKNUlIWmhjbWxoWW14bElDb3ZYRzVjZEd0bGVUdGNibHh1WEhRdktpMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRLaTljYmx4dVhIUXZLaXBjYmx4MElDb2dRU0JuWlc1bGNtbGpJR1Z5Y205eUlIVjBhV3hwZEhrZ1puVnVZM1JwYjI0dVhHNWNkQ0FxSUVCd2NtbDJZWFJsWEc1Y2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQjBlWEJsSUZSb1pTQmxjbkp2Y2lCMGVYQmxMbHh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdSWEp5YjNKOUlGUm9jbTkzY3lCaElHQlNZVzVuWlVWeWNtOXlZQ0IzYVhSb0lIUm9aU0JoY0hCc2FXTmhZbXhsSUdWeWNtOXlJRzFsYzNOaFoyVXVYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUJsY25KdmNpaDBlWEJsS1NCN1hHNWNkRngwZEdoeWIzY2dVbUZ1WjJWRmNuSnZjaWhsY25KdmNuTmJkSGx3WlYwcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUVnWjJWdVpYSnBZeUJnUVhKeVlYa2piV0Z3WUNCMWRHbHNhWFI1SUdaMWJtTjBhVzl1TGx4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCaGNuSmhlU0JVYUdVZ1lYSnlZWGtnZEc4Z2FYUmxjbUYwWlNCdmRtVnlMbHh1WEhRZ0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmpZV3hzWW1GamF5QlVhR1VnWm5WdVkzUnBiMjRnZEdoaGRDQm5aWFJ6SUdOaGJHeGxaQ0JtYjNJZ1pYWmxjbmtnWVhKeVlYbGNibHgwSUNvZ2FYUmxiUzVjYmx4MElDb2dRSEpsZEhWeWJuTWdlMEZ5Y21GNWZTQkJJRzVsZHlCaGNuSmhlU0J2WmlCMllXeDFaWE1nY21WMGRYSnVaV1FnWW5rZ2RHaGxJR05oYkd4aVlXTnJJR1oxYm1OMGFXOXVMbHh1WEhRZ0tpOWNibHgwWm5WdVkzUnBiMjRnYldGd0tHRnljbUY1TENCbWJpa2dlMXh1WEhSY2RIWmhjaUJzWlc1bmRHZ2dQU0JoY25KaGVTNXNaVzVuZEdnN1hHNWNkRngwZDJocGJHVWdLR3hsYm1kMGFDMHRLU0I3WEc1Y2RGeDBYSFJoY25KaGVWdHNaVzVuZEdoZElEMGdabTRvWVhKeVlYbGJiR1Z1WjNSb1hTazdYRzVjZEZ4MGZWeHVYSFJjZEhKbGRIVnliaUJoY25KaGVUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJCSUhOcGJYQnNaU0JnUVhKeVlYa2piV0Z3WUMxc2FXdGxJSGR5WVhCd1pYSWdkRzhnZDI5eWF5QjNhWFJvSUdSdmJXRnBiaUJ1WVcxbElITjBjbWx1WjNNdVhHNWNkQ0FxSUVCd2NtbDJZWFJsWEc1Y2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmtiMjFoYVc0Z1ZHaGxJR1J2YldGcGJpQnVZVzFsTGx4dVhIUWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JqWVd4c1ltRmpheUJVYUdVZ1puVnVZM1JwYjI0Z2RHaGhkQ0JuWlhSeklHTmhiR3hsWkNCbWIzSWdaWFpsY25sY2JseDBJQ29nWTJoaGNtRmpkR1Z5TGx4dVhIUWdLaUJBY21WMGRYSnVjeUI3UVhKeVlYbDlJRUVnYm1WM0lITjBjbWx1WnlCdlppQmphR0Z5WVdOMFpYSnpJSEpsZEhWeWJtVmtJR0o1SUhSb1pTQmpZV3hzWW1GamExeHVYSFFnS2lCbWRXNWpkR2x2Ymk1Y2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlHMWhjRVJ2YldGcGJpaHpkSEpwYm1jc0lHWnVLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHMWhjQ2h6ZEhKcGJtY3VjM0JzYVhRb2NtVm5aWGhUWlhCaGNtRjBiM0p6S1N3Z1ptNHBMbXB2YVc0b0p5NG5LVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCRGNtVmhkR1Z6SUdGdUlHRnljbUY1SUdOdmJuUmhhVzVwYm1jZ2RHaGxJRzUxYldWeWFXTWdZMjlrWlNCd2IybHVkSE1nYjJZZ1pXRmphQ0JWYm1samIyUmxYRzVjZENBcUlHTm9ZWEpoWTNSbGNpQnBiaUIwYUdVZ2MzUnlhVzVuTGlCWGFHbHNaU0JLWVhaaFUyTnlhWEIwSUhWelpYTWdWVU5UTFRJZ2FXNTBaWEp1WVd4c2VTeGNibHgwSUNvZ2RHaHBjeUJtZFc1amRHbHZiaUIzYVd4c0lHTnZiblpsY25RZ1lTQndZV2x5SUc5bUlITjFjbkp2WjJGMFpTQm9ZV3gyWlhNZ0tHVmhZMmdnYjJZZ2QyaHBZMmhjYmx4MElDb2dWVU5UTFRJZ1pYaHdiM05sY3lCaGN5QnpaWEJoY21GMFpTQmphR0Z5WVdOMFpYSnpLU0JwYm5SdklHRWdjMmx1WjJ4bElHTnZaR1VnY0c5cGJuUXNYRzVjZENBcUlHMWhkR05vYVc1bklGVlVSaTB4Tmk1Y2JseDBJQ29nUUhObFpTQmdjSFZ1ZVdOdlpHVXVkV056TWk1bGJtTnZaR1ZnWEc1Y2RDQXFJRUJ6WldVZ1BHaDBkSEE2THk5dFlYUm9hV0Z6WW5sdVpXNXpMbUpsTDI1dmRHVnpMMnBoZG1GelkzSnBjSFF0Wlc1amIyUnBibWMrWEc1Y2RDQXFJRUJ0WlcxaVpYSlBaaUJ3ZFc1NVkyOWtaUzUxWTNNeVhHNWNkQ0FxSUVCdVlXMWxJR1JsWTI5a1pWeHVYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYzNSeWFXNW5JRlJvWlNCVmJtbGpiMlJsSUdsdWNIVjBJSE4wY21sdVp5QW9WVU5UTFRJcExseHVYSFFnS2lCQWNtVjBkWEp1Y3lCN1FYSnlZWGw5SUZSb1pTQnVaWGNnWVhKeVlYa2diMllnWTI5a1pTQndiMmx1ZEhNdVhHNWNkQ0FxTDF4dVhIUm1kVzVqZEdsdmJpQjFZM015WkdWamIyUmxLSE4wY21sdVp5a2dlMXh1WEhSY2RIWmhjaUJ2ZFhSd2RYUWdQU0JiWFN4Y2JseDBYSFFnSUNBZ1kyOTFiblJsY2lBOUlEQXNYRzVjZEZ4MElDQWdJR3hsYm1kMGFDQTlJSE4wY21sdVp5NXNaVzVuZEdnc1hHNWNkRngwSUNBZ0lIWmhiSFZsTEZ4dVhIUmNkQ0FnSUNCbGVIUnlZVHRjYmx4MFhIUjNhR2xzWlNBb1kyOTFiblJsY2lBOElHeGxibWQwYUNrZ2UxeHVYSFJjZEZ4MGRtRnNkV1VnUFNCemRISnBibWN1WTJoaGNrTnZaR1ZCZENoamIzVnVkR1Z5S3lzcE8xeHVYSFJjZEZ4MGFXWWdLSFpoYkhWbElENDlJREI0UkRnd01DQW1KaUIyWVd4MVpTQThQU0F3ZUVSQ1JrWWdKaVlnWTI5MWJuUmxjaUE4SUd4bGJtZDBhQ2tnZTF4dVhIUmNkRngwWEhRdkx5Qm9hV2RvSUhOMWNuSnZaMkYwWlN3Z1lXNWtJSFJvWlhKbElHbHpJR0VnYm1WNGRDQmphR0Z5WVdOMFpYSmNibHgwWEhSY2RGeDBaWGgwY21FZ1BTQnpkSEpwYm1jdVkyaGhja052WkdWQmRDaGpiM1Z1ZEdWeUt5c3BPMXh1WEhSY2RGeDBYSFJwWmlBb0tHVjRkSEpoSUNZZ01IaEdRekF3S1NBOVBTQXdlRVJETURBcElIc2dMeThnYkc5M0lITjFjbkp2WjJGMFpWeHVYSFJjZEZ4MFhIUmNkRzkxZEhCMWRDNXdkWE5vS0Nnb2RtRnNkV1VnSmlBd2VETkdSaWtnUER3Z01UQXBJQ3NnS0dWNGRISmhJQ1lnTUhnelJrWXBJQ3NnTUhneE1EQXdNQ2s3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdkVzV0WVhSamFHVmtJSE4xY25KdloyRjBaVHNnYjI1c2VTQmhjSEJsYm1RZ2RHaHBjeUJqYjJSbElIVnVhWFFzSUdsdUlHTmhjMlVnZEdobElHNWxlSFJjYmx4MFhIUmNkRngwWEhRdkx5QmpiMlJsSUhWdWFYUWdhWE1nZEdobElHaHBaMmdnYzNWeWNtOW5ZWFJsSUc5bUlHRWdjM1Z5Y205bllYUmxJSEJoYVhKY2JseDBYSFJjZEZ4MFhIUnZkWFJ3ZFhRdWNIVnphQ2gyWVd4MVpTazdYRzVjZEZ4MFhIUmNkRngwWTI5MWJuUmxjaTB0TzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSdmRYUndkWFF1Y0hWemFDaDJZV3gxWlNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQnZkWFJ3ZFhRN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRM0psWVhSbGN5QmhJSE4wY21sdVp5QmlZWE5sWkNCdmJpQmhiaUJoY25KaGVTQnZaaUJ1ZFcxbGNtbGpJR052WkdVZ2NHOXBiblJ6TGx4dVhIUWdLaUJBYzJWbElHQndkVzU1WTI5a1pTNTFZM015TG1SbFkyOWtaV0JjYmx4MElDb2dRRzFsYldKbGNrOW1JSEIxYm5samIyUmxMblZqY3pKY2JseDBJQ29nUUc1aGJXVWdaVzVqYjJSbFhHNWNkQ0FxSUVCd1lYSmhiU0I3UVhKeVlYbDlJR052WkdWUWIybHVkSE1nVkdobElHRnljbUY1SUc5bUlHNTFiV1Z5YVdNZ1kyOWtaU0J3YjJsdWRITXVYRzVjZENBcUlFQnlaWFIxY201eklIdFRkSEpwYm1kOUlGUm9aU0J1WlhjZ1ZXNXBZMjlrWlNCemRISnBibWNnS0ZWRFV5MHlLUzVjYmx4MElDb3ZYRzVjZEdaMWJtTjBhVzl1SUhWamN6SmxibU52WkdVb1lYSnlZWGtwSUh0Y2JseDBYSFJ5WlhSMWNtNGdiV0Z3S0dGeWNtRjVMQ0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1WEhSY2RGeDBkbUZ5SUc5MWRIQjFkQ0E5SUNjbk8xeHVYSFJjZEZ4MGFXWWdLSFpoYkhWbElENGdNSGhHUmtaR0tTQjdYRzVjZEZ4MFhIUmNkSFpoYkhWbElDMDlJREI0TVRBd01EQTdYRzVjZEZ4MFhIUmNkRzkxZEhCMWRDQXJQU0J6ZEhKcGJtZEdjbTl0UTJoaGNrTnZaR1VvZG1Gc2RXVWdQajQrSURFd0lDWWdNSGd6UmtZZ2ZDQXdlRVE0TURBcE8xeHVYSFJjZEZ4MFhIUjJZV3gxWlNBOUlEQjRSRU13TUNCOElIWmhiSFZsSUNZZ01IZ3pSa1k3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ2ZFhSd2RYUWdLejBnYzNSeWFXNW5Sbkp2YlVOb1lYSkRiMlJsS0haaGJIVmxLVHRjYmx4MFhIUmNkSEpsZEhWeWJpQnZkWFJ3ZFhRN1hHNWNkRngwZlNrdWFtOXBiaWduSnlrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRMjl1ZG1WeWRITWdZU0JpWVhOcFl5QmpiMlJsSUhCdmFXNTBJR2x1ZEc4Z1lTQmthV2RwZEM5cGJuUmxaMlZ5TGx4dVhIUWdLaUJBYzJWbElHQmthV2RwZEZSdlFtRnphV01vS1dCY2JseDBJQ29nUUhCeWFYWmhkR1ZjYmx4MElDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlHTnZaR1ZRYjJsdWRDQlVhR1VnWW1GemFXTWdiblZ0WlhKcFl5QmpiMlJsSUhCdmFXNTBJSFpoYkhWbExseHVYSFFnS2lCQWNtVjBkWEp1Y3lCN1RuVnRZbVZ5ZlNCVWFHVWdiblZ0WlhKcFl5QjJZV3gxWlNCdlppQmhJR0poYzJsaklHTnZaR1VnY0c5cGJuUWdLR1p2Y2lCMWMyVWdhVzVjYmx4MElDb2djbVZ3Y21WelpXNTBhVzVuSUdsdWRHVm5aWEp6S1NCcGJpQjBhR1VnY21GdVoyVWdZREJnSUhSdklHQmlZWE5sSUMwZ01XQXNJRzl5SUdCaVlYTmxZQ0JwWmx4dVhIUWdLaUIwYUdVZ1kyOWtaU0J3YjJsdWRDQmtiMlZ6SUc1dmRDQnlaWEJ5WlhObGJuUWdZU0IyWVd4MVpTNWNibHgwSUNvdlhHNWNkR1oxYm1OMGFXOXVJR0poYzJsalZHOUVhV2RwZENoamIyUmxVRzlwYm5RcElIdGNibHgwWEhScFppQW9ZMjlrWlZCdmFXNTBJQzBnTkRnZ1BDQXhNQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR052WkdWUWIybHVkQ0F0SURJeU8xeHVYSFJjZEgxY2JseDBYSFJwWmlBb1kyOWtaVkJ2YVc1MElDMGdOalVnUENBeU5pa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHTnZaR1ZRYjJsdWRDQXRJRFkxTzF4dVhIUmNkSDFjYmx4MFhIUnBaaUFvWTI5a1pWQnZhVzUwSUMwZ09UY2dQQ0F5TmlrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdOdlpHVlFiMmx1ZENBdElEazNPMXh1WEhSY2RIMWNibHgwWEhSeVpYUjFjbTRnWW1GelpUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJEYjI1MlpYSjBjeUJoSUdScFoybDBMMmx1ZEdWblpYSWdhVzUwYnlCaElHSmhjMmxqSUdOdlpHVWdjRzlwYm5RdVhHNWNkQ0FxSUVCelpXVWdZR0poYzJsalZHOUVhV2RwZENncFlGeHVYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUWdLaUJBY0dGeVlXMGdlMDUxYldKbGNuMGdaR2xuYVhRZ1ZHaGxJRzUxYldWeWFXTWdkbUZzZFdVZ2IyWWdZU0JpWVhOcFl5QmpiMlJsSUhCdmFXNTBMbHh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdUblZ0WW1WeWZTQlVhR1VnWW1GemFXTWdZMjlrWlNCd2IybHVkQ0IzYUc5elpTQjJZV3gxWlNBb2QyaGxiaUIxYzJWa0lHWnZjbHh1WEhRZ0tpQnlaWEJ5WlhObGJuUnBibWNnYVc1MFpXZGxjbk1wSUdseklHQmthV2RwZEdBc0lIZG9hV05vSUc1bFpXUnpJSFJ2SUdKbElHbHVJSFJvWlNCeVlXNW5aVnh1WEhRZ0tpQmdNR0FnZEc4Z1lHSmhjMlVnTFNBeFlDNGdTV1lnWUdac1lXZGdJR2x6SUc1dmJpMTZaWEp2TENCMGFHVWdkWEJ3WlhKallYTmxJR1p2Y20wZ2FYTmNibHgwSUNvZ2RYTmxaRHNnWld4elpTd2dkR2hsSUd4dmQyVnlZMkZ6WlNCbWIzSnRJR2x6SUhWelpXUXVJRlJvWlNCaVpXaGhkbWx2Y2lCcGN5QjFibVJsWm1sdVpXUmNibHgwSUNvZ2FXWWdZR1pzWVdkZ0lHbHpJRzV2YmkxNlpYSnZJR0Z1WkNCZ1pHbG5hWFJnSUdoaGN5QnVieUIxY0hCbGNtTmhjMlVnWm05eWJTNWNibHgwSUNvdlhHNWNkR1oxYm1OMGFXOXVJR1JwWjJsMFZHOUNZWE5wWXloa2FXZHBkQ3dnWm14aFp5a2dlMXh1WEhSY2RDOHZJQ0F3TGk0eU5TQnRZWEFnZEc4Z1FWTkRTVWtnWVM0dWVpQnZjaUJCTGk1YVhHNWNkRngwTHk4Z01qWXVMak0xSUcxaGNDQjBieUJCVTBOSlNTQXdMaTQ1WEc1Y2RGeDBjbVYwZFhKdUlHUnBaMmwwSUNzZ01qSWdLeUEzTlNBcUlDaGthV2RwZENBOElESTJLU0F0SUNnb1pteGhaeUFoUFNBd0tTQThQQ0ExS1R0Y2JseDBmVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkNhV0Z6SUdGa1lYQjBZWFJwYjI0Z1puVnVZM1JwYjI0Z1lYTWdjR1Z5SUhObFkzUnBiMjRnTXk0MElHOW1JRkpHUXlBek5Ea3lMbHh1WEhRZ0tpQm9kSFJ3T2k4dmRHOXZiSE11YVdWMFppNXZjbWN2YUhSdGJDOXlabU16TkRreUkzTmxZM1JwYjI0dE15NDBYRzVjZENBcUlFQndjbWwyWVhSbFhHNWNkQ0FxTDF4dVhIUm1kVzVqZEdsdmJpQmhaR0Z3ZENoa1pXeDBZU3dnYm5WdFVHOXBiblJ6TENCbWFYSnpkRlJwYldVcElIdGNibHgwWEhSMllYSWdheUE5SURBN1hHNWNkRngwWkdWc2RHRWdQU0JtYVhKemRGUnBiV1VnUHlCbWJHOXZjaWhrWld4MFlTQXZJR1JoYlhBcElEb2daR1ZzZEdFZ1BqNGdNVHRjYmx4MFhIUmtaV3gwWVNBclBTQm1iRzl2Y2loa1pXeDBZU0F2SUc1MWJWQnZhVzUwY3lrN1hHNWNkRngwWm05eUlDZ3ZLaUJ1YnlCcGJtbDBhV0ZzYVhwaGRHbHZiaUFxTHpzZ1pHVnNkR0VnUGlCaVlYTmxUV2x1ZFhOVVRXbHVJQ29nZEUxaGVDQStQaUF4T3lCcklDczlJR0poYzJVcElIdGNibHgwWEhSY2RHUmxiSFJoSUQwZ1pteHZiM0lvWkdWc2RHRWdMeUJpWVhObFRXbHVkWE5VVFdsdUtUdGNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJR1pzYjI5eUtHc2dLeUFvWW1GelpVMXBiblZ6VkUxcGJpQXJJREVwSUNvZ1pHVnNkR0VnTHlBb1pHVnNkR0VnS3lCemEyVjNLU2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1EyOXVkbVZ5ZEhNZ1lTQlFkVzU1WTI5a1pTQnpkSEpwYm1jZ2IyWWdRVk5EU1VrdGIyNXNlU0J6ZVcxaWIyeHpJSFJ2SUdFZ2MzUnlhVzVuSUc5bUlGVnVhV052WkdWY2JseDBJQ29nYzNsdFltOXNjeTVjYmx4MElDb2dRRzFsYldKbGNrOW1JSEIxYm5samIyUmxYRzVjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCcGJuQjFkQ0JVYUdVZ1VIVnVlV052WkdVZ2MzUnlhVzVuSUc5bUlFRlRRMGxKTFc5dWJIa2djM2x0WW05c2N5NWNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UxTjBjbWx1WjMwZ1ZHaGxJSEpsYzNWc2RHbHVaeUJ6ZEhKcGJtY2diMllnVlc1cFkyOWtaU0J6ZVcxaWIyeHpMbHh1WEhRZ0tpOWNibHgwWm5WdVkzUnBiMjRnWkdWamIyUmxLR2x1Y0hWMEtTQjdYRzVjZEZ4MEx5OGdSRzl1SjNRZ2RYTmxJRlZEVXkweVhHNWNkRngwZG1GeUlHOTFkSEIxZENBOUlGdGRMRnh1WEhSY2RDQWdJQ0JwYm5CMWRFeGxibWQwYUNBOUlHbHVjSFYwTG14bGJtZDBhQ3hjYmx4MFhIUWdJQ0FnYjNWMExGeHVYSFJjZENBZ0lDQnBJRDBnTUN4Y2JseDBYSFFnSUNBZ2JpQTlJR2x1YVhScFlXeE9MRnh1WEhSY2RDQWdJQ0JpYVdGeklEMGdhVzVwZEdsaGJFSnBZWE1zWEc1Y2RGeDBJQ0FnSUdKaGMybGpMRnh1WEhSY2RDQWdJQ0JxTEZ4dVhIUmNkQ0FnSUNCcGJtUmxlQ3hjYmx4MFhIUWdJQ0FnYjJ4a2FTeGNibHgwWEhRZ0lDQWdkeXhjYmx4MFhIUWdJQ0FnYXl4Y2JseDBYSFFnSUNBZ1pHbG5hWFFzWEc1Y2RGeDBJQ0FnSUhRc1hHNWNkRngwSUNBZ0lDOHFLaUJEWVdOb1pXUWdZMkZzWTNWc1lYUnBiMjRnY21WemRXeDBjeUFxTDF4dVhIUmNkQ0FnSUNCaVlYTmxUV2x1ZFhOVU8xeHVYRzVjZEZ4MEx5OGdTR0Z1Wkd4bElIUm9aU0JpWVhOcFl5QmpiMlJsSUhCdmFXNTBjem9nYkdWMElHQmlZWE5wWTJBZ1ltVWdkR2hsSUc1MWJXSmxjaUJ2WmlCcGJuQjFkQ0JqYjJSbFhHNWNkRngwTHk4Z2NHOXBiblJ6SUdKbFptOXlaU0IwYUdVZ2JHRnpkQ0JrWld4cGJXbDBaWElzSUc5eUlHQXdZQ0JwWmlCMGFHVnlaU0JwY3lCdWIyNWxMQ0IwYUdWdUlHTnZjSGxjYmx4MFhIUXZMeUIwYUdVZ1ptbHljM1FnWW1GemFXTWdZMjlrWlNCd2IybHVkSE1nZEc4Z2RHaGxJRzkxZEhCMWRDNWNibHh1WEhSY2RHSmhjMmxqSUQwZ2FXNXdkWFF1YkdGemRFbHVaR1Y0VDJZb1pHVnNhVzFwZEdWeUtUdGNibHgwWEhScFppQW9ZbUZ6YVdNZ1BDQXdLU0I3WEc1Y2RGeDBYSFJpWVhOcFl5QTlJREE3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBabTl5SUNocUlEMGdNRHNnYWlBOElHSmhjMmxqT3lBcksyb3BJSHRjYmx4MFhIUmNkQzh2SUdsbUlHbDBKM01nYm05MElHRWdZbUZ6YVdNZ1kyOWtaU0J3YjJsdWRGeHVYSFJjZEZ4MGFXWWdLR2x1Y0hWMExtTm9ZWEpEYjJSbFFYUW9haWtnUGowZ01IZzRNQ2tnZTF4dVhIUmNkRngwWEhSbGNuSnZjaWduYm05MExXSmhjMmxqSnlrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSdmRYUndkWFF1Y0hWemFDaHBibkIxZEM1amFHRnlRMjlrWlVGMEtHb3BLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJOWVdsdUlHUmxZMjlrYVc1bklHeHZiM0E2SUhOMFlYSjBJR3AxYzNRZ1lXWjBaWElnZEdobElHeGhjM1FnWkdWc2FXMXBkR1Z5SUdsbUlHRnVlU0JpWVhOcFl5QmpiMlJsWEc1Y2RGeDBMeThnY0c5cGJuUnpJSGRsY21VZ1kyOXdhV1ZrT3lCemRHRnlkQ0JoZENCMGFHVWdZbVZuYVc1dWFXNW5JRzkwYUdWeWQybHpaUzVjYmx4dVhIUmNkR1p2Y2lBb2FXNWtaWGdnUFNCaVlYTnBZeUErSURBZ1B5QmlZWE5wWXlBcklERWdPaUF3T3lCcGJtUmxlQ0E4SUdsdWNIVjBUR1Z1WjNSb095QXZLaUJ1YnlCbWFXNWhiQ0JsZUhCeVpYTnphVzl1SUNvdktTQjdYRzVjYmx4MFhIUmNkQzh2SUdCcGJtUmxlR0FnYVhNZ2RHaGxJR2x1WkdWNElHOW1JSFJvWlNCdVpYaDBJR05vWVhKaFkzUmxjaUIwYnlCaVpTQmpiMjV6ZFcxbFpDNWNibHgwWEhSY2RDOHZJRVJsWTI5a1pTQmhJR2RsYm1WeVlXeHBlbVZrSUhaaGNtbGhZbXhsTFd4bGJtZDBhQ0JwYm5SbFoyVnlJR2x1ZEc4Z1lHUmxiSFJoWUN4Y2JseDBYSFJjZEM4dklIZG9hV05vSUdkbGRITWdZV1JrWldRZ2RHOGdZR2xnTGlCVWFHVWdiM1psY21ac2IzY2dZMmhsWTJ0cGJtY2dhWE1nWldGemFXVnlYRzVjZEZ4MFhIUXZMeUJwWmlCM1pTQnBibU55WldGelpTQmdhV0FnWVhNZ2QyVWdaMjhzSUhSb1pXNGdjM1ZpZEhKaFkzUWdiMlptSUdsMGN5QnpkR0Z5ZEdsdVoxeHVYSFJjZEZ4MEx5OGdkbUZzZFdVZ1lYUWdkR2hsSUdWdVpDQjBieUJ2WW5SaGFXNGdZR1JsYkhSaFlDNWNibHgwWEhSY2RHWnZjaUFvYjJ4a2FTQTlJR2tzSUhjZ1BTQXhMQ0JySUQwZ1ltRnpaVHNnTHlvZ2JtOGdZMjl1WkdsMGFXOXVJQ292T3lCcklDczlJR0poYzJVcElIdGNibHh1WEhSY2RGeDBYSFJwWmlBb2FXNWtaWGdnUGowZ2FXNXdkWFJNWlc1bmRHZ3BJSHRjYmx4MFhIUmNkRngwWEhSbGNuSnZjaWduYVc1MllXeHBaQzFwYm5CMWRDY3BPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MFpHbG5hWFFnUFNCaVlYTnBZMVJ2UkdsbmFYUW9hVzV3ZFhRdVkyaGhja052WkdWQmRDaHBibVJsZUNzcktTazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tHUnBaMmwwSUQ0OUlHSmhjMlVnZkh3Z1pHbG5hWFFnUGlCbWJHOXZjaWdvYldGNFNXNTBJQzBnYVNrZ0x5QjNLU2tnZTF4dVhIUmNkRngwWEhSY2RHVnljbTl5S0NkdmRtVnlabXh2ZHljcE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwYVNBclBTQmthV2RwZENBcUlIYzdYRzVjZEZ4MFhIUmNkSFFnUFNCcklEdzlJR0pwWVhNZ1B5QjBUV2x1SURvZ0tHc2dQajBnWW1saGN5QXJJSFJOWVhnZ1B5QjBUV0Y0SURvZ2F5QXRJR0pwWVhNcE8xeHVYRzVjZEZ4MFhIUmNkR2xtSUNoa2FXZHBkQ0E4SUhRcElIdGNibHgwWEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEdKaGMyVk5hVzUxYzFRZ1BTQmlZWE5sSUMwZ2REdGNibHgwWEhSY2RGeDBhV1lnS0hjZ1BpQm1iRzl2Y2lodFlYaEpiblFnTHlCaVlYTmxUV2x1ZFhOVUtTa2dlMXh1WEhSY2RGeDBYSFJjZEdWeWNtOXlLQ2R2ZG1WeVpteHZkeWNwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBkeUFxUFNCaVlYTmxUV2x1ZFhOVU8xeHVYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRzkxZENBOUlHOTFkSEIxZEM1c1pXNW5kR2dnS3lBeE8xeHVYSFJjZEZ4MFltbGhjeUE5SUdGa1lYQjBLR2tnTFNCdmJHUnBMQ0J2ZFhRc0lHOXNaR2tnUFQwZ01DazdYRzVjYmx4MFhIUmNkQzh2SUdCcFlDQjNZWE1nYzNWd2NHOXpaV1FnZEc4Z2QzSmhjQ0JoY205MWJtUWdabkp2YlNCZ2IzVjBZQ0IwYnlCZ01HQXNYRzVjZEZ4MFhIUXZMeUJwYm1OeVpXMWxiblJwYm1jZ1lHNWdJR1ZoWTJnZ2RHbHRaU3dnYzI4Z2QyVW5iR3dnWm1sNElIUm9ZWFFnYm05M09seHVYSFJjZEZ4MGFXWWdLR1pzYjI5eUtHa2dMeUJ2ZFhRcElENGdiV0Y0U1c1MElDMGdiaWtnZTF4dVhIUmNkRngwWEhSbGNuSnZjaWduYjNabGNtWnNiM2NuS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGJpQXJQU0JtYkc5dmNpaHBJQzhnYjNWMEtUdGNibHgwWEhSY2RHa2dKVDBnYjNWME8xeHVYRzVjZEZ4MFhIUXZMeUJKYm5ObGNuUWdZRzVnSUdGMElIQnZjMmwwYVc5dUlHQnBZQ0J2WmlCMGFHVWdiM1YwY0hWMFhHNWNkRngwWEhSdmRYUndkWFF1YzNCc2FXTmxLR2tyS3l3Z01Dd2diaWs3WEc1Y2JseDBYSFI5WEc1Y2JseDBYSFJ5WlhSMWNtNGdkV056TW1WdVkyOWtaU2h2ZFhSd2RYUXBPMXh1WEhSOVhHNWNibHgwTHlvcVhHNWNkQ0FxSUVOdmJuWmxjblJ6SUdFZ2MzUnlhVzVuSUc5bUlGVnVhV052WkdVZ2MzbHRZbTlzY3lCMGJ5QmhJRkIxYm5samIyUmxJSE4wY21sdVp5QnZaaUJCVTBOSlNTMXZibXg1WEc1Y2RDQXFJSE41YldKdmJITXVYRzVjZENBcUlFQnRaVzFpWlhKUFppQndkVzU1WTI5a1pWeHVYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYVc1d2RYUWdWR2hsSUhOMGNtbHVaeUJ2WmlCVmJtbGpiMlJsSUhONWJXSnZiSE11WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHRUZEhKcGJtZDlJRlJvWlNCeVpYTjFiSFJwYm1jZ1VIVnVlV052WkdVZ2MzUnlhVzVuSUc5bUlFRlRRMGxKTFc5dWJIa2djM2x0WW05c2N5NWNibHgwSUNvdlhHNWNkR1oxYm1OMGFXOXVJR1Z1WTI5a1pTaHBibkIxZENrZ2UxeHVYSFJjZEhaaGNpQnVMRnh1WEhSY2RDQWdJQ0JrWld4MFlTeGNibHgwWEhRZ0lDQWdhR0Z1Wkd4bFpFTlFRMjkxYm5Rc1hHNWNkRngwSUNBZ0lHSmhjMmxqVEdWdVozUm9MRnh1WEhSY2RDQWdJQ0JpYVdGekxGeHVYSFJjZENBZ0lDQnFMRnh1WEhSY2RDQWdJQ0J0TEZ4dVhIUmNkQ0FnSUNCeExGeHVYSFJjZENBZ0lDQnJMRnh1WEhSY2RDQWdJQ0IwTEZ4dVhIUmNkQ0FnSUNCamRYSnlaVzUwVm1Gc2RXVXNYRzVjZEZ4MElDQWdJRzkxZEhCMWRDQTlJRnRkTEZ4dVhIUmNkQ0FnSUNBdktpb2dZR2x1Y0hWMFRHVnVaM1JvWUNCM2FXeHNJR2h2YkdRZ2RHaGxJRzUxYldKbGNpQnZaaUJqYjJSbElIQnZhVzUwY3lCcGJpQmdhVzV3ZFhSZ0xpQXFMMXh1WEhSY2RDQWdJQ0JwYm5CMWRFeGxibWQwYUN4Y2JseDBYSFFnSUNBZ0x5b3FJRU5oWTJobFpDQmpZV3hqZFd4aGRHbHZiaUJ5WlhOMWJIUnpJQ292WEc1Y2RGeDBJQ0FnSUdoaGJtUnNaV1JEVUVOdmRXNTBVR3gxYzA5dVpTeGNibHgwWEhRZ0lDQWdZbUZ6WlUxcGJuVnpWQ3hjYmx4MFhIUWdJQ0FnY1UxcGJuVnpWRHRjYmx4dVhIUmNkQzh2SUVOdmJuWmxjblFnZEdobElHbHVjSFYwSUdsdUlGVkRVeTB5SUhSdklGVnVhV052WkdWY2JseDBYSFJwYm5CMWRDQTlJSFZqY3pKa1pXTnZaR1VvYVc1d2RYUXBPMXh1WEc1Y2RGeDBMeThnUTJGamFHVWdkR2hsSUd4bGJtZDBhRnh1WEhSY2RHbHVjSFYwVEdWdVozUm9JRDBnYVc1d2RYUXViR1Z1WjNSb08xeHVYRzVjZEZ4MEx5OGdTVzVwZEdsaGJHbDZaU0IwYUdVZ2MzUmhkR1ZjYmx4MFhIUnVJRDBnYVc1cGRHbGhiRTQ3WEc1Y2RGeDBaR1ZzZEdFZ1BTQXdPMXh1WEhSY2RHSnBZWE1nUFNCcGJtbDBhV0ZzUW1saGN6dGNibHh1WEhSY2RDOHZJRWhoYm1Sc1pTQjBhR1VnWW1GemFXTWdZMjlrWlNCd2IybHVkSE5jYmx4MFhIUm1iM0lnS0dvZ1BTQXdPeUJxSUR3Z2FXNXdkWFJNWlc1bmRHZzdJQ3NyYWlrZ2UxeHVYSFJjZEZ4MFkzVnljbVZ1ZEZaaGJIVmxJRDBnYVc1d2RYUmJhbDA3WEc1Y2RGeDBYSFJwWmlBb1kzVnljbVZ1ZEZaaGJIVmxJRHdnTUhnNE1Da2dlMXh1WEhSY2RGeDBYSFJ2ZFhSd2RYUXVjSFZ6YUNoemRISnBibWRHY205dFEyaGhja052WkdVb1kzVnljbVZ1ZEZaaGJIVmxLU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhR0Z1Wkd4bFpFTlFRMjkxYm5RZ1BTQmlZWE5wWTB4bGJtZDBhQ0E5SUc5MWRIQjFkQzVzWlc1bmRHZzdYRzVjYmx4MFhIUXZMeUJnYUdGdVpHeGxaRU5RUTI5MWJuUmdJR2x6SUhSb1pTQnVkVzFpWlhJZ2IyWWdZMjlrWlNCd2IybHVkSE1nZEdoaGRDQm9ZWFpsSUdKbFpXNGdhR0Z1Wkd4bFpEdGNibHgwWEhRdkx5QmdZbUZ6YVdOTVpXNW5kR2hnSUdseklIUm9aU0J1ZFcxaVpYSWdiMllnWW1GemFXTWdZMjlrWlNCd2IybHVkSE11WEc1Y2JseDBYSFF2THlCR2FXNXBjMmdnZEdobElHSmhjMmxqSUhOMGNtbHVaeUF0SUdsbUlHbDBJR2x6SUc1dmRDQmxiWEIwZVNBdElIZHBkR2dnWVNCa1pXeHBiV2wwWlhKY2JseDBYSFJwWmlBb1ltRnphV05NWlc1bmRHZ3BJSHRjYmx4MFhIUmNkRzkxZEhCMWRDNXdkWE5vS0dSbGJHbHRhWFJsY2lrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1RXRnBiaUJsYm1OdlpHbHVaeUJzYjI5d09seHVYSFJjZEhkb2FXeGxJQ2hvWVc1a2JHVmtRMUJEYjNWdWRDQThJR2x1Y0hWMFRHVnVaM1JvS1NCN1hHNWNibHgwWEhSY2RDOHZJRUZzYkNCdWIyNHRZbUZ6YVdNZ1kyOWtaU0J3YjJsdWRITWdQQ0J1SUdoaGRtVWdZbVZsYmlCb1lXNWtiR1ZrSUdGc2NtVmhaSGt1SUVacGJtUWdkR2hsSUc1bGVIUmNibHgwWEhSY2RDOHZJR3hoY21kbGNpQnZibVU2WEc1Y2RGeDBYSFJtYjNJZ0tHMGdQU0J0WVhoSmJuUXNJR29nUFNBd095QnFJRHdnYVc1d2RYUk1aVzVuZEdnN0lDc3JhaWtnZTF4dVhIUmNkRngwWEhSamRYSnlaVzUwVm1Gc2RXVWdQU0JwYm5CMWRGdHFYVHRjYmx4MFhIUmNkRngwYVdZZ0tHTjFjbkpsYm5SV1lXeDFaU0ErUFNCdUlDWW1JR04xY25KbGJuUldZV3gxWlNBOElHMHBJSHRjYmx4MFhIUmNkRngwWEhSdElEMGdZM1Z5Y21WdWRGWmhiSFZsTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRWx1WTNKbFlYTmxJR0JrWld4MFlXQWdaVzV2ZFdkb0lIUnZJR0ZrZG1GdVkyVWdkR2hsSUdSbFkyOWtaWEluY3lBOGJpeHBQaUJ6ZEdGMFpTQjBieUE4YlN3d1BpeGNibHgwWEhSY2RDOHZJR0oxZENCbmRXRnlaQ0JoWjJGcGJuTjBJRzkyWlhKbWJHOTNYRzVjZEZ4MFhIUm9ZVzVrYkdWa1ExQkRiM1Z1ZEZCc2RYTlBibVVnUFNCb1lXNWtiR1ZrUTFCRGIzVnVkQ0FySURFN1hHNWNkRngwWEhScFppQW9iU0F0SUc0Z1BpQm1iRzl2Y2lnb2JXRjRTVzUwSUMwZ1pHVnNkR0VwSUM4Z2FHRnVaR3hsWkVOUVEyOTFiblJRYkhWelQyNWxLU2tnZTF4dVhIUmNkRngwWEhSbGNuSnZjaWduYjNabGNtWnNiM2NuS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MFpHVnNkR0VnS3owZ0tHMGdMU0J1S1NBcUlHaGhibVJzWldSRFVFTnZkVzUwVUd4MWMwOXVaVHRjYmx4MFhIUmNkRzRnUFNCdE8xeHVYRzVjZEZ4MFhIUm1iM0lnS0dvZ1BTQXdPeUJxSUR3Z2FXNXdkWFJNWlc1bmRHZzdJQ3NyYWlrZ2UxeHVYSFJjZEZ4MFhIUmpkWEp5Wlc1MFZtRnNkV1VnUFNCcGJuQjFkRnRxWFR0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvWTNWeWNtVnVkRlpoYkhWbElEd2diaUFtSmlBcksyUmxiSFJoSUQ0Z2JXRjRTVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBaWEp5YjNJb0oyOTJaWEptYkc5M0p5azdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhScFppQW9ZM1Z5Y21WdWRGWmhiSFZsSUQwOUlHNHBJSHRjYmx4MFhIUmNkRngwWEhRdkx5QlNaWEJ5WlhObGJuUWdaR1ZzZEdFZ1lYTWdZU0JuWlc1bGNtRnNhWHBsWkNCMllYSnBZV0pzWlMxc1pXNW5kR2dnYVc1MFpXZGxjbHh1WEhSY2RGeDBYSFJjZEdadmNpQW9jU0E5SUdSbGJIUmhMQ0JySUQwZ1ltRnpaVHNnTHlvZ2JtOGdZMjl1WkdsMGFXOXVJQ292T3lCcklDczlJR0poYzJVcElIdGNibHgwWEhSY2RGeDBYSFJjZEhRZ1BTQnJJRHc5SUdKcFlYTWdQeUIwVFdsdUlEb2dLR3NnUGowZ1ltbGhjeUFySUhSTllYZ2dQeUIwVFdGNElEb2dheUF0SUdKcFlYTXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGFXWWdLSEVnUENCMEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RHSnlaV0ZyTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MGNVMXBiblZ6VkNBOUlIRWdMU0IwTzF4dVhIUmNkRngwWEhSY2RGeDBZbUZ6WlUxcGJuVnpWQ0E5SUdKaGMyVWdMU0IwTzF4dVhIUmNkRngwWEhSY2RGeDBiM1YwY0hWMExuQjFjMmdvWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSE4wY21sdVowWnliMjFEYUdGeVEyOWtaU2hrYVdkcGRGUnZRbUZ6YVdNb2RDQXJJSEZOYVc1MWMxUWdKU0JpWVhObFRXbHVkWE5VTENBd0tTbGNibHgwWEhSY2RGeDBYSFJjZENrN1hHNWNkRngwWEhSY2RGeDBYSFJ4SUQwZ1pteHZiM0lvY1UxcGJuVnpWQ0F2SUdKaGMyVk5hVzUxYzFRcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RHOTFkSEIxZEM1d2RYTm9LSE4wY21sdVowWnliMjFEYUdGeVEyOWtaU2hrYVdkcGRGUnZRbUZ6YVdNb2NTd2dNQ2twS1R0Y2JseDBYSFJjZEZ4MFhIUmlhV0Z6SUQwZ1lXUmhjSFFvWkdWc2RHRXNJR2hoYm1Sc1pXUkRVRU52ZFc1MFVHeDFjMDl1WlN3Z2FHRnVaR3hsWkVOUVEyOTFiblFnUFQwZ1ltRnphV05NWlc1bmRHZ3BPMXh1WEhSY2RGeDBYSFJjZEdSbGJIUmhJRDBnTUR0Y2JseDBYSFJjZEZ4MFhIUXJLMmhoYm1Sc1pXUkRVRU52ZFc1ME8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQ3NyWkdWc2RHRTdYRzVjZEZ4MFhIUXJLMjQ3WEc1Y2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlHOTFkSEIxZEM1cWIybHVLQ2NuS1R0Y2JseDBmVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkRiMjUyWlhKMGN5QmhJRkIxYm5samIyUmxJSE4wY21sdVp5QnlaWEJ5WlhObGJuUnBibWNnWVNCa2IyMWhhVzRnYm1GdFpTQjBieUJWYm1samIyUmxMaUJQYm14NUlIUm9aVnh1WEhRZ0tpQlFkVzU1WTI5a1pXUWdjR0Z5ZEhNZ2IyWWdkR2hsSUdSdmJXRnBiaUJ1WVcxbElIZHBiR3dnWW1VZ1kyOXVkbVZ5ZEdWa0xDQnBMbVV1SUdsMElHUnZaWE51SjNSY2JseDBJQ29nYldGMGRHVnlJR2xtSUhsdmRTQmpZV3hzSUdsMElHOXVJR0VnYzNSeWFXNW5JSFJvWVhRZ2FHRnpJR0ZzY21WaFpIa2dZbVZsYmlCamIyNTJaWEowWldRZ2RHOWNibHgwSUNvZ1ZXNXBZMjlrWlM1Y2JseDBJQ29nUUcxbGJXSmxjazltSUhCMWJubGpiMlJsWEc1Y2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmtiMjFoYVc0Z1ZHaGxJRkIxYm5samIyUmxJR1J2YldGcGJpQnVZVzFsSUhSdklHTnZiblpsY25RZ2RHOGdWVzVwWTI5a1pTNWNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UxTjBjbWx1WjMwZ1ZHaGxJRlZ1YVdOdlpHVWdjbVZ3Y21WelpXNTBZWFJwYjI0Z2IyWWdkR2hsSUdkcGRtVnVJRkIxYm5samIyUmxYRzVjZENBcUlITjBjbWx1Wnk1Y2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlIUnZWVzVwWTI5a1pTaGtiMjFoYVc0cElIdGNibHgwWEhSeVpYUjFjbTRnYldGd1JHOXRZV2x1S0dSdmJXRnBiaXdnWm5WdVkzUnBiMjRvYzNSeWFXNW5LU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjbVZuWlhoUWRXNTVZMjlrWlM1MFpYTjBLSE4wY21sdVp5bGNibHgwWEhSY2RGeDBQeUJrWldOdlpHVW9jM1J5YVc1bkxuTnNhV05sS0RRcExuUnZURzkzWlhKRFlYTmxLQ2twWEc1Y2RGeDBYSFJjZERvZ2MzUnlhVzVuTzF4dVhIUmNkSDBwTzF4dVhIUjlYRzVjYmx4MEx5b3FYRzVjZENBcUlFTnZiblpsY25SeklHRWdWVzVwWTI5a1pTQnpkSEpwYm1jZ2NtVndjbVZ6Wlc1MGFXNW5JR0VnWkc5dFlXbHVJRzVoYldVZ2RHOGdVSFZ1ZVdOdlpHVXVJRTl1YkhrZ2RHaGxYRzVjZENBcUlHNXZiaTFCVTBOSlNTQndZWEowY3lCdlppQjBhR1VnWkc5dFlXbHVJRzVoYldVZ2QybHNiQ0JpWlNCamIyNTJaWEowWldRc0lHa3VaUzRnYVhRZ1pHOWxjMjRuZEZ4dVhIUWdLaUJ0WVhSMFpYSWdhV1lnZVc5MUlHTmhiR3dnYVhRZ2QybDBhQ0JoSUdSdmJXRnBiaUIwYUdGMEozTWdZV3h5WldGa2VTQnBiaUJCVTBOSlNTNWNibHgwSUNvZ1FHMWxiV0psY2s5bUlIQjFibmxqYjJSbFhHNWNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JrYjIxaGFXNGdWR2hsSUdSdmJXRnBiaUJ1WVcxbElIUnZJR052Ym5abGNuUXNJR0Z6SUdFZ1ZXNXBZMjlrWlNCemRISnBibWN1WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHRUZEhKcGJtZDlJRlJvWlNCUWRXNTVZMjlrWlNCeVpYQnlaWE5sYm5SaGRHbHZiaUJ2WmlCMGFHVWdaMmwyWlc0Z1pHOXRZV2x1SUc1aGJXVXVYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUIwYjBGVFEwbEpLR1J2YldGcGJpa2dlMXh1WEhSY2RISmxkSFZ5YmlCdFlYQkViMjFoYVc0b1pHOXRZV2x1TENCbWRXNWpkR2x2YmloemRISnBibWNwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJ5WldkbGVFNXZia0ZUUTBsSkxuUmxjM1FvYzNSeWFXNW5LVnh1WEhSY2RGeDBYSFEvSUNkNGJpMHRKeUFySUdWdVkyOWtaU2h6ZEhKcGJtY3BYRzVjZEZ4MFhIUmNkRG9nYzNSeWFXNW5PMXh1WEhSY2RIMHBPMXh1WEhSOVhHNWNibHgwTHlvdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTb3ZYRzVjYmx4MEx5b3FJRVJsWm1sdVpTQjBhR1VnY0hWaWJHbGpJRUZRU1NBcUwxeHVYSFJ3ZFc1NVkyOWtaU0E5SUh0Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQklITjBjbWx1WnlCeVpYQnlaWE5sYm5ScGJtY2dkR2hsSUdOMWNuSmxiblFnVUhWdWVXTnZaR1V1YW5NZ2RtVnljMmx2YmlCdWRXMWlaWEl1WEc1Y2RGeDBJQ29nUUcxbGJXSmxjazltSUhCMWJubGpiMlJsWEc1Y2RGeDBJQ29nUUhSNWNHVWdVM1J5YVc1blhHNWNkRngwSUNvdlhHNWNkRngwSjNabGNuTnBiMjRuT2lBbk1TNHlMalFuTEZ4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVGdUlHOWlhbVZqZENCdlppQnRaWFJvYjJSeklIUnZJR052Ym5abGNuUWdabkp2YlNCS1lYWmhVMk55YVhCMEozTWdhVzUwWlhKdVlXd2dZMmhoY21GamRHVnlYRzVjZEZ4MElDb2djbVZ3Y21WelpXNTBZWFJwYjI0Z0tGVkRVeTB5S1NCMGJ5QlZibWxqYjJSbElHTnZaR1VnY0c5cGJuUnpMQ0JoYm1RZ1ltRmpheTVjYmx4MFhIUWdLaUJBYzJWbElEeG9kSFJ3T2k4dmJXRjBhR2xoYzJKNWJtVnVjeTVpWlM5dWIzUmxjeTlxWVhaaGMyTnlhWEIwTFdWdVkyOWthVzVuUGx4dVhIUmNkQ0FxSUVCdFpXMWlaWEpQWmlCd2RXNTVZMjlrWlZ4dVhIUmNkQ0FxSUVCMGVYQmxJRTlpYW1WamRGeHVYSFJjZENBcUwxeHVYSFJjZENkMVkzTXlKem9nZTF4dVhIUmNkRngwSjJSbFkyOWtaU2M2SUhWamN6SmtaV052WkdVc1hHNWNkRngwWEhRblpXNWpiMlJsSnpvZ2RXTnpNbVZ1WTI5a1pWeHVYSFJjZEgwc1hHNWNkRngwSjJSbFkyOWtaU2M2SUdSbFkyOWtaU3hjYmx4MFhIUW5aVzVqYjJSbEp6b2daVzVqYjJSbExGeHVYSFJjZENkMGIwRlRRMGxKSnpvZ2RHOUJVME5KU1N4Y2JseDBYSFFuZEc5VmJtbGpiMlJsSnpvZ2RHOVZibWxqYjJSbFhHNWNkSDA3WEc1Y2JseDBMeW9xSUVWNGNHOXpaU0JnY0hWdWVXTnZaR1ZnSUNvdlhHNWNkQzh2SUZOdmJXVWdRVTFFSUdKMWFXeGtJRzl3ZEdsdGFYcGxjbk1zSUd4cGEyVWdjaTVxY3l3Z1kyaGxZMnNnWm05eUlITndaV05wWm1saklHTnZibVJwZEdsdmJpQndZWFIwWlhKdWMxeHVYSFF2THlCc2FXdGxJSFJvWlNCbWIyeHNiM2RwYm1jNlhHNWNkR2xtSUNoY2JseDBYSFIwZVhCbGIyWWdaR1ZtYVc1bElEMDlJQ2RtZFc1amRHbHZiaWNnSmlaY2JseDBYSFIwZVhCbGIyWWdaR1ZtYVc1bExtRnRaQ0E5UFNBbmIySnFaV04wSnlBbUpseHVYSFJjZEdSbFptbHVaUzVoYldSY2JseDBLU0I3WEc1Y2RGeDBaR1ZtYVc1bEtDZHdkVzU1WTI5a1pTY3NJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSEIxYm5samIyUmxPMXh1WEhSY2RIMHBPMXh1WEhSOUlHVnNjMlVnYVdZZ0tHWnlaV1ZGZUhCdmNuUnpJQ1ltSUNGbWNtVmxSWGh3YjNKMGN5NXViMlJsVkhsd1pTa2dlMXh1WEhSY2RHbG1JQ2htY21WbFRXOWtkV3hsS1NCN0lDOHZJR2x1SUU1dlpHVXVhbk1nYjNJZ1VtbHVaMjlLVXlCMk1DNDRMakFyWEc1Y2RGeDBYSFJtY21WbFRXOWtkV3hsTG1WNGNHOXlkSE1nUFNCd2RXNTVZMjlrWlR0Y2JseDBYSFI5SUdWc2MyVWdleUF2THlCcGJpQk9ZWEozYUdGc0lHOXlJRkpwYm1kdlNsTWdkakF1Tnk0d0xWeHVYSFJjZEZ4MFptOXlJQ2hyWlhrZ2FXNGdjSFZ1ZVdOdlpHVXBJSHRjYmx4MFhIUmNkRngwY0hWdWVXTnZaR1V1YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NBbUppQW9abkpsWlVWNGNHOXlkSE5iYTJWNVhTQTlJSEIxYm5samIyUmxXMnRsZVYwcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmU0JsYkhObElIc2dMeThnYVc0Z1VtaHBibThnYjNJZ1lTQjNaV0lnWW5KdmQzTmxjbHh1WEhSY2RISnZiM1F1Y0hWdWVXTnZaR1VnUFNCd2RXNTVZMjlrWlR0Y2JseDBmVnh1WEc1OUtIUm9hWE1wS1R0Y2JpSmRmUT09IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8vIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4vLyBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICAgIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlthLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFthLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLFxuICAgIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICAgIHVuc2FmZVByb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICAgIGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgICAnaHR0cCc6IHRydWUsXG4gICAgICAnaHR0cHMnOiB0cnVlLFxuICAgICAgJ2Z0cCc6IHRydWUsXG4gICAgICAnZ29waGVyJzogdHJ1ZSxcbiAgICAgICdmaWxlJzogdHJ1ZSxcbiAgICAgICdodHRwOic6IHRydWUsXG4gICAgICAnaHR0cHM6JzogdHJ1ZSxcbiAgICAgICdmdHA6JzogdHJ1ZSxcbiAgICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAgICdmaWxlOic6IHRydWVcbiAgICB9LFxuICAgIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIGlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueSBjb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyB0aGUgcGFydCBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGFzIG5vbiBBU0NJSSBjaGFyYWN0ZXJzLiBJLmUuIGl0IGRvc2VudCBtYXR0ZXIgaWZcbiAgICAgIC8vIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIGluIEFTQ0lJLlxuICAgICAgdmFyIGRvbWFpbkFycmF5ID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgnLicpO1xuICAgICAgdmFyIG5ld091dCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb21haW5BcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcyA9IGRvbWFpbkFycmF5W2ldO1xuICAgICAgICBuZXdPdXQucHVzaChzLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pID9cbiAgICAgICAgICAgICd4bi0tJyArIHB1bnljb2RlLmVuY29kZShzKSA6IHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5ob3N0bmFtZSA9IG5ld091dC5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgdmFyIGVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChhZSk7XG4gICAgICBpZiAoZXNjID09PSBhZSkge1xuICAgICAgICBlc2MgPSBlc2NhcGUoYWUpO1xuICAgICAgfVxuICAgICAgcmVzdCA9IHJlc3Quc3BsaXQoYWUpLmpvaW4oZXNjKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgdGhpcy5wYXRobmFtZSA9IHJlc3Q7XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIHZhciBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICB2YXIgcyA9IHRoaXMuc2VhcmNoIHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IHAgKyBzO1xuICB9XG5cbiAgLy8gZmluYWxseSwgcmVjb25zdHJ1Y3QgdGhlIGhyZWYgYmFzZWQgb24gd2hhdCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gIHRoaXMuaHJlZiA9IHRoaXMuZm9ybWF0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZm9ybWF0IGEgcGFyc2VkIG9iamVjdCBpbnRvIGEgdXJsIHN0cmluZ1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvLyBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAvLyBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAvLyB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gIC8vIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gIGlmIChpc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICBpc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAoaXNTdHJpbmcocmVsYXRpdmUpKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIE9iamVjdC5rZXlzKHRoaXMpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHJlc3VsdFtrXSA9IHRoaXNba107XG4gIH0sIHRoaXMpO1xuXG4gIC8vIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAvLyBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgcmVzdWx0Lmhhc2ggPSByZWxhdGl2ZS5oYXNoO1xuXG4gIC8vIGlmIHRoZSByZWxhdGl2ZSB1cmwgaXMgZW1wdHksIHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gaGVyZS5cbiAgaWYgKHJlbGF0aXZlLmhyZWYgPT09ICcnKSB7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGhyZWZzIGxpa2UgLy9mb28vYmFyIGFsd2F5cyBjdXQgdG8gdGhlIHByb3RvY29sLlxuICBpZiAocmVsYXRpdmUuc2xhc2hlcyAmJiAhcmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAvLyB0YWtlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBwcm90b2NvbCBmcm9tIHJlbGF0aXZlXG4gICAgT2JqZWN0LmtleXMocmVsYXRpdmUpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgaWYgKGsgIT09ICdwcm90b2NvbCcpXG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgIH0pO1xuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIE9iamVjdC5rZXlzKHJlbGF0aXZlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIWlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICFpc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBubyBwYXRoIGF0IGFsbC4gIGVhc3kuXG4gICAgLy8gd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBvdGhlciBzdHVmZiBhYm92ZS5cbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgLy8gaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gIC8vIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKFxuICAgICAgKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QpICYmIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHxcbiAgICAgIGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzIHx8IChyZXN1bHQuaG9zdCAmJiBzcmNQYXRoLmxlbmd0aCk7XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IHNyY1BhdGguam9pbignLycpO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAoIWlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICFpc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCI7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuICBhcmcgPT0gbnVsbDtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTkxZEdsc0wzVjBhV3d1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaTh2SUVOdmNIbHlhV2RvZENCS2IzbGxiblFzSUVsdVl5NGdZVzVrSUc5MGFHVnlJRTV2WkdVZ1kyOXVkSEpwWW5WMGIzSnpMbHh1THk5Y2JpOHZJRkJsY20xcGMzTnBiMjRnYVhNZ2FHVnlaV0o1SUdkeVlXNTBaV1FzSUdaeVpXVWdiMllnWTJoaGNtZGxMQ0IwYnlCaGJua2djR1Z5YzI5dUlHOWlkR0ZwYm1sdVp5QmhYRzR2THlCamIzQjVJRzltSUhSb2FYTWdjMjltZEhkaGNtVWdZVzVrSUdGemMyOWphV0YwWldRZ1pHOWpkVzFsYm5SaGRHbHZiaUJtYVd4bGN5QW9kR2hsWEc0dkx5QmNJbE52Wm5SM1lYSmxYQ0lwTENCMGJ5QmtaV0ZzSUdsdUlIUm9aU0JUYjJaMGQyRnlaU0IzYVhSb2IzVjBJSEpsYzNSeWFXTjBhVzl1TENCcGJtTnNkV1JwYm1kY2JpOHZJSGRwZEdodmRYUWdiR2x0YVhSaGRHbHZiaUIwYUdVZ2NtbG5hSFJ6SUhSdklIVnpaU3dnWTI5d2VTd2diVzlrYVdaNUxDQnRaWEpuWlN3Z2NIVmliR2x6YUN4Y2JpOHZJR1JwYzNSeWFXSjFkR1VzSUhOMVlteHBZMlZ1YzJVc0lHRnVaQzl2Y2lCelpXeHNJR052Y0dsbGN5QnZaaUIwYUdVZ1UyOW1kSGRoY21Vc0lHRnVaQ0IwYnlCd1pYSnRhWFJjYmk4dklIQmxjbk52Ym5NZ2RHOGdkMmh2YlNCMGFHVWdVMjltZEhkaGNtVWdhWE1nWm5WeWJtbHphR1ZrSUhSdklHUnZJSE52TENCemRXSnFaV04wSUhSdklIUm9aVnh1THk4Z1ptOXNiRzkzYVc1bklHTnZibVJwZEdsdmJuTTZYRzR2TDF4dUx5OGdWR2hsSUdGaWIzWmxJR052Y0hseWFXZG9kQ0J1YjNScFkyVWdZVzVrSUhSb2FYTWdjR1Z5YldsemMybHZiaUJ1YjNScFkyVWdjMmhoYkd3Z1ltVWdhVzVqYkhWa1pXUmNiaTh2SUdsdUlHRnNiQ0JqYjNCcFpYTWdiM0lnYzNWaWMzUmhiblJwWVd3Z2NHOXlkR2x2Ym5NZ2IyWWdkR2hsSUZOdlpuUjNZWEpsTGx4dUx5OWNiaTh2SUZSSVJTQlRUMFpVVjBGU1JTQkpVeUJRVWs5V1NVUkZSQ0JjSWtGVElFbFRYQ0lzSUZkSlZFaFBWVlFnVjBGU1VrRk9WRmtnVDBZZ1FVNVpJRXRKVGtRc0lFVllVRkpGVTFOY2JpOHZJRTlTSUVsTlVFeEpSVVFzSUVsT1EweFZSRWxPUnlCQ1ZWUWdUazlVSUV4SlRVbFVSVVFnVkU4Z1ZFaEZJRmRCVWxKQlRsUkpSVk1nVDBaY2JpOHZJRTFGVWtOSVFVNVVRVUpKVEVsVVdTd2dSa2xVVGtWVFV5QkdUMUlnUVNCUVFWSlVTVU5WVEVGU0lGQlZVbEJQVTBVZ1FVNUVJRTVQVGtsT1JsSkpUa2RGVFVWT1ZDNGdTVTVjYmk4dklFNVBJRVZXUlU1VUlGTklRVXhNSUZSSVJTQkJWVlJJVDFKVElFOVNJRU5QVUZsU1NVZElWQ0JJVDB4RVJWSlRJRUpGSUV4SlFVSk1SU0JHVDFJZ1FVNVpJRU5NUVVsTkxGeHVMeThnUkVGTlFVZEZVeUJQVWlCUFZFaEZVaUJNU1VGQ1NVeEpWRmtzSUZkSVJWUklSVklnU1U0Z1FVNGdRVU5VU1U5T0lFOUdJRU5QVGxSU1FVTlVMQ0JVVDFKVUlFOVNYRzR2THlCUFZFaEZVbGRKVTBVc0lFRlNTVk5KVGtjZ1JsSlBUU3dnVDFWVUlFOUdJRTlTSUVsT0lFTlBUazVGUTFSSlQwNGdWMGxVU0NCVVNFVWdVMDlHVkZkQlVrVWdUMUlnVkVoRlhHNHZMeUJWVTBVZ1QxSWdUMVJJUlZJZ1JFVkJURWxPUjFNZ1NVNGdWRWhGSUZOUFJsUlhRVkpGTGx4dVhHNTJZWElnWm05eWJXRjBVbVZuUlhod0lEMGdMeVZiYzJScUpWMHZaenRjYm1WNGNHOXlkSE11Wm05eWJXRjBJRDBnWm5WdVkzUnBiMjRvWmlrZ2UxeHVJQ0JwWmlBb0lXbHpVM1J5YVc1bktHWXBLU0I3WEc0Z0lDQWdkbUZ5SUc5aWFtVmpkSE1nUFNCYlhUdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYjJKcVpXTjBjeTV3ZFhOb0tHbHVjM0JsWTNRb1lYSm5kVzFsYm5SelcybGRLU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdlltcGxZM1J6TG1wdmFXNG9KeUFuS1R0Y2JpQWdmVnh1WEc0Z0lIWmhjaUJwSUQwZ01UdGNiaUFnZG1GeUlHRnlaM01nUFNCaGNtZDFiV1Z1ZEhNN1hHNGdJSFpoY2lCc1pXNGdQU0JoY21kekxteGxibWQwYUR0Y2JpQWdkbUZ5SUhOMGNpQTlJRk4wY21sdVp5aG1LUzV5WlhCc1lXTmxLR1p2Y20xaGRGSmxaMFY0Y0N3Z1puVnVZM1JwYjI0b2VDa2dlMXh1SUNBZ0lHbG1JQ2g0SUQwOVBTQW5KU1VuS1NCeVpYUjFjbTRnSnlVbk8xeHVJQ0FnSUdsbUlDaHBJRDQ5SUd4bGJpa2djbVYwZFhKdUlIZzdYRzRnSUNBZ2MzZHBkR05vSUNoNEtTQjdYRzRnSUNBZ0lDQmpZWE5sSUNjbGN5YzZJSEpsZEhWeWJpQlRkSEpwYm1jb1lYSm5jMXRwS3l0ZEtUdGNiaUFnSUNBZ0lHTmhjMlVnSnlWa0p6b2djbVYwZFhKdUlFNTFiV0psY2loaGNtZHpXMmtySzEwcE8xeHVJQ0FnSUNBZ1kyRnpaU0FuSldvbk9seHVJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCS1UwOU9Mbk4wY21sdVoybG1lU2hoY21kelcya3JLMTBwTzF4dUlDQWdJQ0FnSUNCOUlHTmhkR05vSUNoZktTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2RiUTJseVkzVnNZWEpkSnp0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhnN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYmlBZ1ptOXlJQ2gyWVhJZ2VDQTlJR0Z5WjNOYmFWMDdJR2tnUENCc1pXNDdJSGdnUFNCaGNtZHpXeXNyYVYwcElIdGNiaUFnSUNCcFppQW9hWE5PZFd4c0tIZ3BJSHg4SUNGcGMwOWlhbVZqZENoNEtTa2dlMXh1SUNBZ0lDQWdjM1J5SUNzOUlDY2dKeUFySUhnN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSE4wY2lBclBTQW5JQ2NnS3lCcGJuTndaV04wS0hncE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnYzNSeU8xeHVmVHRjYmx4dVhHNHZMeUJOWVhKcklIUm9ZWFFnWVNCdFpYUm9iMlFnYzJodmRXeGtJRzV2ZENCaVpTQjFjMlZrTGx4dUx5OGdVbVYwZFhKdWN5QmhJRzF2WkdsbWFXVmtJR1oxYm1OMGFXOXVJSGRvYVdOb0lIZGhjbTV6SUc5dVkyVWdZbmtnWkdWbVlYVnNkQzVjYmk4dklFbG1JQzB0Ym04dFpHVndjbVZqWVhScGIyNGdhWE1nYzJWMExDQjBhR1Z1SUdsMElHbHpJR0VnYm04dGIzQXVYRzVsZUhCdmNuUnpMbVJsY0hKbFkyRjBaU0E5SUdaMWJtTjBhVzl1S0dadUxDQnRjMmNwSUh0Y2JpQWdMeThnUVd4c2IzY2dabTl5SUdSbGNISmxZMkYwYVc1bklIUm9hVzVuY3lCcGJpQjBhR1VnY0hKdlkyVnpjeUJ2WmlCemRHRnlkR2x1WnlCMWNDNWNiaUFnYVdZZ0tHbHpWVzVrWldacGJtVmtLR2RzYjJKaGJDNXdjbTlqWlhOektTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbGVIQnZjblJ6TG1SbGNISmxZMkYwWlNobWJpd2diWE5uS1M1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBPMXh1SUNBZ0lIMDdYRzRnSUgxY2JseHVJQ0JwWmlBb2NISnZZMlZ6Y3k1dWIwUmxjSEpsWTJGMGFXOXVJRDA5UFNCMGNuVmxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWnVPMXh1SUNCOVhHNWNiaUFnZG1GeUlIZGhjbTVsWkNBOUlHWmhiSE5sTzF4dUlDQm1kVzVqZEdsdmJpQmtaWEJ5WldOaGRHVmtLQ2tnZTF4dUlDQWdJR2xtSUNnaGQyRnlibVZrS1NCN1hHNGdJQ0FnSUNCcFppQW9jSEp2WTJWemN5NTBhSEp2ZDBSbGNISmxZMkYwYVc5dUtTQjdYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaHRjMmNwTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNod2NtOWpaWE56TG5SeVlXTmxSR1Z3Y21WallYUnBiMjRwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1MGNtRmpaU2h0YzJjcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWh0YzJjcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2QyRnlibVZrSUQwZ2RISjFaVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdadUxtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWkdWd2NtVmpZWFJsWkR0Y2JuMDdYRzVjYmx4dWRtRnlJR1JsWW5WbmN5QTlJSHQ5TzF4dWRtRnlJR1JsWW5WblJXNTJhWEp2Ymp0Y2JtVjRjRzl5ZEhNdVpHVmlkV2RzYjJjZ1BTQm1kVzVqZEdsdmJpaHpaWFFwSUh0Y2JpQWdhV1lnS0dselZXNWtaV1pwYm1Wa0tHUmxZblZuUlc1MmFYSnZiaWtwWEc0Z0lDQWdaR1ZpZFdkRmJuWnBjbTl1SUQwZ2NISnZZMlZ6Y3k1bGJuWXVUazlFUlY5RVJVSlZSeUI4ZkNBbkp6dGNiaUFnYzJWMElEMGdjMlYwTG5SdlZYQndaWEpEWVhObEtDazdYRzRnSUdsbUlDZ2haR1ZpZFdkelczTmxkRjBwSUh0Y2JpQWdJQ0JwWmlBb2JtVjNJRkpsWjBWNGNDZ25YRnhjWEdJbklDc2djMlYwSUNzZ0oxeGNYRnhpSnl3Z0oya25LUzUwWlhOMEtHUmxZblZuUlc1MmFYSnZiaWtwSUh0Y2JpQWdJQ0FnSUhaaGNpQndhV1FnUFNCd2NtOWpaWE56TG5CcFpEdGNiaUFnSUNBZ0lHUmxZblZuYzF0elpYUmRJRDBnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ0YzJjZ1BTQmxlSEJ2Y25SekxtWnZjbTFoZEM1aGNIQnNlU2hsZUhCdmNuUnpMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLQ2NsY3lBbFpEb2dKWE1uTENCelpYUXNJSEJwWkN3Z2JYTm5LVHRjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHUmxZblZuYzF0elpYUmRJRDBnWm5WdVkzUnBiMjRvS1NCN2ZUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2NtVjBkWEp1SUdSbFluVm5jMXR6WlhSZE8xeHVmVHRjYmx4dVhHNHZLaXBjYmlBcUlFVmphRzl6SUhSb1pTQjJZV3gxWlNCdlppQmhJSFpoYkhWbExpQlVjbmx6SUhSdklIQnlhVzUwSUhSb1pTQjJZV3gxWlNCdmRYUmNiaUFxSUdsdUlIUm9aU0JpWlhOMElIZGhlU0J3YjNOemFXSnNaU0JuYVhabGJpQjBhR1VnWkdsbVptVnlaVzUwSUhSNWNHVnpMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZZbW9nVkdobElHOWlhbVZqZENCMGJ5QndjbWx1ZENCdmRYUXVYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGN5QlBjSFJwYjI1aGJDQnZjSFJwYjI1eklHOWlhbVZqZENCMGFHRjBJR0ZzZEdWeWN5QjBhR1VnYjNWMGNIVjBMbHh1SUNvdlhHNHZLaUJzWldkaFkzazZJRzlpYWl3Z2MyaHZkMGhwWkdSbGJpd2daR1Z3ZEdnc0lHTnZiRzl5Y3lvdlhHNW1kVzVqZEdsdmJpQnBibk53WldOMEtHOWlhaXdnYjNCMGN5a2dlMXh1SUNBdkx5QmtaV1poZFd4MElHOXdkR2x2Ym5OY2JpQWdkbUZ5SUdOMGVDQTlJSHRjYmlBZ0lDQnpaV1Z1T2lCYlhTeGNiaUFnSUNCemRIbHNhWHBsT2lCemRIbHNhWHBsVG05RGIyeHZjbHh1SUNCOU8xeHVJQ0F2THlCc1pXZGhZM2t1TGk1Y2JpQWdhV1lnS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGowZ015a2dZM1I0TG1SbGNIUm9JRDBnWVhKbmRXMWxiblJ6V3pKZE8xeHVJQ0JwWmlBb1lYSm5kVzFsYm5SekxteGxibWQwYUNBK1BTQTBLU0JqZEhndVkyOXNiM0p6SUQwZ1lYSm5kVzFsYm5Seld6TmRPMXh1SUNCcFppQW9hWE5DYjI5c1pXRnVLRzl3ZEhNcEtTQjdYRzRnSUNBZ0x5OGdiR1ZuWVdONUxpNHVYRzRnSUNBZ1kzUjRMbk5vYjNkSWFXUmtaVzRnUFNCdmNIUnpPMXh1SUNCOUlHVnNjMlVnYVdZZ0tHOXdkSE1wSUh0Y2JpQWdJQ0F2THlCbmIzUWdZVzRnWENKdmNIUnBiMjV6WENJZ2IySnFaV04wWEc0Z0lDQWdaWGh3YjNKMGN5NWZaWGgwWlc1a0tHTjBlQ3dnYjNCMGN5azdYRzRnSUgxY2JpQWdMeThnYzJWMElHUmxabUYxYkhRZ2IzQjBhVzl1YzF4dUlDQnBaaUFvYVhOVmJtUmxabWx1WldRb1kzUjRMbk5vYjNkSWFXUmtaVzRwS1NCamRIZ3VjMmh2ZDBocFpHUmxiaUE5SUdaaGJITmxPMXh1SUNCcFppQW9hWE5WYm1SbFptbHVaV1FvWTNSNExtUmxjSFJvS1NrZ1kzUjRMbVJsY0hSb0lEMGdNanRjYmlBZ2FXWWdLR2x6Vlc1a1pXWnBibVZrS0dOMGVDNWpiMnh2Y25NcEtTQmpkSGd1WTI5c2IzSnpJRDBnWm1Gc2MyVTdYRzRnSUdsbUlDaHBjMVZ1WkdWbWFXNWxaQ2hqZEhndVkzVnpkRzl0U1c1emNHVmpkQ2twSUdOMGVDNWpkWE4wYjIxSmJuTndaV04wSUQwZ2RISjFaVHRjYmlBZ2FXWWdLR04wZUM1amIyeHZjbk1wSUdOMGVDNXpkSGxzYVhwbElEMGdjM1I1YkdsNlpWZHBkR2hEYjJ4dmNqdGNiaUFnY21WMGRYSnVJR1p2Y20xaGRGWmhiSFZsS0dOMGVDd2diMkpxTENCamRIZ3VaR1Z3ZEdncE8xeHVmVnh1Wlhod2IzSjBjeTVwYm5Od1pXTjBJRDBnYVc1emNHVmpkRHRjYmx4dVhHNHZMeUJvZEhSd09pOHZaVzR1ZDJscmFYQmxaR2xoTG05eVp5OTNhV3RwTDBGT1UwbGZaWE5qWVhCbFgyTnZaR1VqWjNKaGNHaHBZM05jYm1sdWMzQmxZM1F1WTI5c2IzSnpJRDBnZTF4dUlDQW5ZbTlzWkNjZ09pQmJNU3dnTWpKZExGeHVJQ0FuYVhSaGJHbGpKeUE2SUZzekxDQXlNMTBzWEc0Z0lDZDFibVJsY214cGJtVW5JRG9nV3pRc0lESTBYU3hjYmlBZ0oybHVkbVZ5YzJVbklEb2dXemNzSURJM1hTeGNiaUFnSjNkb2FYUmxKeUE2SUZzek55d2dNemxkTEZ4dUlDQW5aM0psZVNjZ09pQmJPVEFzSURNNVhTeGNiaUFnSjJKc1lXTnJKeUE2SUZzek1Dd2dNemxkTEZ4dUlDQW5ZbXgxWlNjZ09pQmJNelFzSURNNVhTeGNiaUFnSjJONVlXNG5JRG9nV3pNMkxDQXpPVjBzWEc0Z0lDZG5jbVZsYmljZ09pQmJNeklzSURNNVhTeGNiaUFnSjIxaFoyVnVkR0VuSURvZ1d6TTFMQ0F6T1Ywc1hHNGdJQ2R5WldRbklEb2dXek14TENBek9WMHNYRzRnSUNkNVpXeHNiM2NuSURvZ1d6TXpMQ0F6T1YxY2JuMDdYRzVjYmk4dklFUnZiaWQwSUhWelpTQW5ZbXgxWlNjZ2JtOTBJSFpwYzJsaWJHVWdiMjRnWTIxa0xtVjRaVnh1YVc1emNHVmpkQzV6ZEhsc1pYTWdQU0I3WEc0Z0lDZHpjR1ZqYVdGc0p6b2dKMk41WVc0bkxGeHVJQ0FuYm5WdFltVnlKem9nSjNsbGJHeHZkeWNzWEc0Z0lDZGliMjlzWldGdUp6b2dKM2xsYkd4dmR5Y3NYRzRnSUNkMWJtUmxabWx1WldRbk9pQW5aM0psZVNjc1hHNGdJQ2R1ZFd4c0p6b2dKMkp2YkdRbkxGeHVJQ0FuYzNSeWFXNW5Kem9nSjJkeVpXVnVKeXhjYmlBZ0oyUmhkR1VuT2lBbmJXRm5aVzUwWVNjc1hHNGdJQzh2SUZ3aWJtRnRaVndpT2lCcGJuUmxiblJwYjI1aGJHeDVJRzV2ZENCemRIbHNhVzVuWEc0Z0lDZHlaV2RsZUhBbk9pQW5jbVZrSjF4dWZUdGNibHh1WEc1bWRXNWpkR2x2YmlCemRIbHNhWHBsVjJsMGFFTnZiRzl5S0hOMGNpd2djM1I1YkdWVWVYQmxLU0I3WEc0Z0lIWmhjaUJ6ZEhsc1pTQTlJR2x1YzNCbFkzUXVjM1I1YkdWelczTjBlV3hsVkhsd1pWMDdYRzVjYmlBZ2FXWWdLSE4wZVd4bEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUNkY1hIVXdNREZpV3ljZ0t5QnBibk53WldOMExtTnZiRzl5YzF0emRIbHNaVjFiTUYwZ0t5QW5iU2NnS3lCemRISWdLMXh1SUNBZ0lDQWdJQ0FnSUNBblhGeDFNREF4WWxzbklDc2dhVzV6Y0dWamRDNWpiMnh2Y25OYmMzUjViR1ZkV3pGZElDc2dKMjBuTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhKbGRIVnliaUJ6ZEhJN1hHNGdJSDFjYm4xY2JseHVYRzVtZFc1amRHbHZiaUJ6ZEhsc2FYcGxUbTlEYjJ4dmNpaHpkSElzSUhOMGVXeGxWSGx3WlNrZ2UxeHVJQ0J5WlhSMWNtNGdjM1J5TzF4dWZWeHVYRzVjYm1aMWJtTjBhVzl1SUdGeWNtRjVWRzlJWVhOb0tHRnljbUY1S1NCN1hHNGdJSFpoY2lCb1lYTm9JRDBnZTMwN1hHNWNiaUFnWVhKeVlYa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaDJZV3dzSUdsa2VDa2dlMXh1SUNBZ0lHaGhjMmhiZG1Gc1hTQTlJSFJ5ZFdVN1hHNGdJSDBwTzF4dVhHNGdJSEpsZEhWeWJpQm9ZWE5vTzF4dWZWeHVYRzVjYm1aMWJtTjBhVzl1SUdadmNtMWhkRlpoYkhWbEtHTjBlQ3dnZG1Gc2RXVXNJSEpsWTNWeWMyVlVhVzFsY3lrZ2UxeHVJQ0F2THlCUWNtOTJhV1JsSUdFZ2FHOXZheUJtYjNJZ2RYTmxjaTF6Y0dWamFXWnBaV1FnYVc1emNHVmpkQ0JtZFc1amRHbHZibk11WEc0Z0lDOHZJRU5vWldOcklIUm9ZWFFnZG1Gc2RXVWdhWE1nWVc0Z2IySnFaV04wSUhkcGRHZ2dZVzRnYVc1emNHVmpkQ0JtZFc1amRHbHZiaUJ2YmlCcGRGeHVJQ0JwWmlBb1kzUjRMbU4xYzNSdmJVbHVjM0JsWTNRZ0ppWmNiaUFnSUNBZ0lIWmhiSFZsSUNZbVhHNGdJQ0FnSUNCcGMwWjFibU4wYVc5dUtIWmhiSFZsTG1sdWMzQmxZM1FwSUNZbVhHNGdJQ0FnSUNBdkx5QkdhV3gwWlhJZ2IzVjBJSFJvWlNCMWRHbHNJRzF2WkhWc1pTd2dhWFFuY3lCcGJuTndaV04wSUdaMWJtTjBhVzl1SUdseklITndaV05wWVd4Y2JpQWdJQ0FnSUhaaGJIVmxMbWx1YzNCbFkzUWdJVDA5SUdWNGNHOXlkSE11YVc1emNHVmpkQ0FtSmx4dUlDQWdJQ0FnTHk4Z1FXeHpieUJtYVd4MFpYSWdiM1YwSUdGdWVTQndjbTkwYjNSNWNHVWdiMkpxWldOMGN5QjFjMmx1WnlCMGFHVWdZMmx5WTNWc1lYSWdZMmhsWTJzdVhHNGdJQ0FnSUNBaEtIWmhiSFZsTG1OdmJuTjBjblZqZEc5eUlDWW1JSFpoYkhWbExtTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU0E5UFQwZ2RtRnNkV1VwS1NCN1hHNGdJQ0FnZG1GeUlISmxkQ0E5SUhaaGJIVmxMbWx1YzNCbFkzUW9jbVZqZFhKelpWUnBiV1Z6TENCamRIZ3BPMXh1SUNBZ0lHbG1JQ2doYVhOVGRISnBibWNvY21WMEtTa2dlMXh1SUNBZ0lDQWdjbVYwSUQwZ1ptOXliV0YwVm1Gc2RXVW9ZM1I0TENCeVpYUXNJSEpsWTNWeWMyVlVhVzFsY3lrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWFE3WEc0Z0lIMWNibHh1SUNBdkx5QlFjbWx0YVhScGRtVWdkSGx3WlhNZ1kyRnVibTkwSUdoaGRtVWdjSEp2Y0dWeWRHbGxjMXh1SUNCMllYSWdjSEpwYldsMGFYWmxJRDBnWm05eWJXRjBVSEpwYldsMGFYWmxLR04wZUN3Z2RtRnNkV1VwTzF4dUlDQnBaaUFvY0hKcGJXbDBhWFpsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSEJ5YVcxcGRHbDJaVHRjYmlBZ2ZWeHVYRzRnSUM4dklFeHZiMnNnZFhBZ2RHaGxJR3RsZVhNZ2IyWWdkR2hsSUc5aWFtVmpkQzVjYmlBZ2RtRnlJR3RsZVhNZ1BTQlBZbXBsWTNRdWEyVjVjeWgyWVd4MVpTazdYRzRnSUhaaGNpQjJhWE5wWW14bFMyVjVjeUE5SUdGeWNtRjVWRzlJWVhOb0tHdGxlWE1wTzF4dVhHNGdJR2xtSUNoamRIZ3VjMmh2ZDBocFpHUmxiaWtnZTF4dUlDQWdJR3RsZVhNZ1BTQlBZbXBsWTNRdVoyVjBUM2R1VUhKdmNHVnlkSGxPWVcxbGN5aDJZV3gxWlNrN1hHNGdJSDFjYmx4dUlDQXZMeUJKUlNCa2IyVnpiaWQwSUcxaGEyVWdaWEp5YjNJZ1ptbGxiR1J6SUc1dmJpMWxiblZ0WlhKaFlteGxYRzRnSUM4dklHaDBkSEE2THk5dGMyUnVMbTFwWTNKdmMyOW1kQzVqYjIwdlpXNHRkWE12YkdsaWNtRnllUzlwWlM5a2QzYzFNbk5pZENoMlBYWnpMamswS1M1aGMzQjRYRzRnSUdsbUlDaHBjMFZ5Y205eUtIWmhiSFZsS1Z4dUlDQWdJQ0FnSmlZZ0tHdGxlWE11YVc1a1pYaFBaaWduYldWemMyRm5aU2NwSUQ0OUlEQWdmSHdnYTJWNWN5NXBibVJsZUU5bUtDZGtaWE5qY21sd2RHbHZiaWNwSUQ0OUlEQXBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWnZjbTFoZEVWeWNtOXlLSFpoYkhWbEtUdGNiaUFnZlZ4dVhHNGdJQzh2SUZOdmJXVWdkSGx3WlNCdlppQnZZbXBsWTNRZ2QybDBhRzkxZENCd2NtOXdaWEowYVdWeklHTmhiaUJpWlNCemFHOXlkR04xZEhSbFpDNWNiaUFnYVdZZ0tHdGxlWE11YkdWdVozUm9JRDA5UFNBd0tTQjdYRzRnSUNBZ2FXWWdLR2x6Um5WdVkzUnBiMjRvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2JtRnRaU0E5SUhaaGJIVmxMbTVoYldVZ1B5QW5PaUFuSUNzZ2RtRnNkV1V1Ym1GdFpTQTZJQ2NuTzF4dUlDQWdJQ0FnY21WMGRYSnVJR04wZUM1emRIbHNhWHBsS0NkYlJuVnVZM1JwYjI0bklDc2dibUZ0WlNBcklDZGRKeXdnSjNOd1pXTnBZV3duS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0dselVtVm5SWGh3S0haaGJIVmxLU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR04wZUM1emRIbHNhWHBsS0ZKbFowVjRjQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWN1WTJGc2JDaDJZV3gxWlNrc0lDZHlaV2RsZUhBbktUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHbHpSR0YwWlNoMllXeDFaU2twSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJqZEhndWMzUjViR2w2WlNoRVlYUmxMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeTVqWVd4c0tIWmhiSFZsS1N3Z0oyUmhkR1VuS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0dselJYSnliM0lvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabTl5YldGMFJYSnliM0lvZG1Gc2RXVXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSFpoY2lCaVlYTmxJRDBnSnljc0lHRnljbUY1SUQwZ1ptRnNjMlVzSUdKeVlXTmxjeUE5SUZzbmV5Y3NJQ2Q5SjEwN1hHNWNiaUFnTHk4Z1RXRnJaU0JCY25KaGVTQnpZWGtnZEdoaGRDQjBhR1Y1SUdGeVpTQkJjbkpoZVZ4dUlDQnBaaUFvYVhOQmNuSmhlU2gyWVd4MVpTa3BJSHRjYmlBZ0lDQmhjbkpoZVNBOUlIUnlkV1U3WEc0Z0lDQWdZbkpoWTJWeklEMGdXeWRiSnl3Z0oxMG5YVHRjYmlBZ2ZWeHVYRzRnSUM4dklFMWhhMlVnWm5WdVkzUnBiMjV6SUhOaGVTQjBhR0YwSUhSb1pYa2dZWEpsSUdaMWJtTjBhVzl1YzF4dUlDQnBaaUFvYVhOR2RXNWpkR2x2YmloMllXeDFaU2twSUh0Y2JpQWdJQ0IyWVhJZ2JpQTlJSFpoYkhWbExtNWhiV1VnUHlBbk9pQW5JQ3NnZG1Gc2RXVXVibUZ0WlNBNklDY25PMXh1SUNBZ0lHSmhjMlVnUFNBbklGdEdkVzVqZEdsdmJpY2dLeUJ1SUNzZ0oxMG5PMXh1SUNCOVhHNWNiaUFnTHk4Z1RXRnJaU0JTWldkRmVIQnpJSE5oZVNCMGFHRjBJSFJvWlhrZ1lYSmxJRkpsWjBWNGNITmNiaUFnYVdZZ0tHbHpVbVZuUlhod0tIWmhiSFZsS1NrZ2UxeHVJQ0FnSUdKaGMyVWdQU0FuSUNjZ0t5QlNaV2RGZUhBdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvZG1Gc2RXVXBPMXh1SUNCOVhHNWNiaUFnTHk4Z1RXRnJaU0JrWVhSbGN5QjNhWFJvSUhCeWIzQmxjblJwWlhNZ1ptbHljM1FnYzJGNUlIUm9aU0JrWVhSbFhHNGdJR2xtSUNocGMwUmhkR1VvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdZbUZ6WlNBOUlDY2dKeUFySUVSaGRHVXVjSEp2ZEc5MGVYQmxMblJ2VlZSRFUzUnlhVzVuTG1OaGJHd29kbUZzZFdVcE8xeHVJQ0I5WEc1Y2JpQWdMeThnVFdGclpTQmxjbkp2Y2lCM2FYUm9JRzFsYzNOaFoyVWdabWx5YzNRZ2MyRjVJSFJvWlNCbGNuSnZjbHh1SUNCcFppQW9hWE5GY25KdmNpaDJZV3gxWlNrcElIdGNiaUFnSUNCaVlYTmxJRDBnSnlBbklDc2dabTl5YldGMFJYSnliM0lvZG1Gc2RXVXBPMXh1SUNCOVhHNWNiaUFnYVdZZ0tHdGxlWE11YkdWdVozUm9JRDA5UFNBd0lDWW1JQ2doWVhKeVlYa2dmSHdnZG1Gc2RXVXViR1Z1WjNSb0lEMDlJREFwS1NCN1hHNGdJQ0FnY21WMGRYSnVJR0p5WVdObGMxc3dYU0FySUdKaGMyVWdLeUJpY21GalpYTmJNVjA3WEc0Z0lIMWNibHh1SUNCcFppQW9jbVZqZFhKelpWUnBiV1Z6SUR3Z01Da2dlMXh1SUNBZ0lHbG1JQ2hwYzFKbFowVjRjQ2gyWVd4MVpTa3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmpkSGd1YzNSNWJHbDZaU2hTWldkRmVIQXVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5MbU5oYkd3b2RtRnNkV1VwTENBbmNtVm5aWGh3SnlrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmpkSGd1YzNSNWJHbDZaU2duVzA5aWFtVmpkRjBuTENBbmMzQmxZMmxoYkNjcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHTjBlQzV6WldWdUxuQjFjMmdvZG1Gc2RXVXBPMXh1WEc0Z0lIWmhjaUJ2ZFhSd2RYUTdYRzRnSUdsbUlDaGhjbkpoZVNrZ2UxeHVJQ0FnSUc5MWRIQjFkQ0E5SUdadmNtMWhkRUZ5Y21GNUtHTjBlQ3dnZG1Gc2RXVXNJSEpsWTNWeWMyVlVhVzFsY3l3Z2RtbHphV0pzWlV0bGVYTXNJR3RsZVhNcE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOTFkSEIxZENBOUlHdGxlWE11YldGd0tHWjFibU4wYVc5dUtHdGxlU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR1p2Y20xaGRGQnliM0JsY25SNUtHTjBlQ3dnZG1Gc2RXVXNJSEpsWTNWeWMyVlVhVzFsY3l3Z2RtbHphV0pzWlV0bGVYTXNJR3RsZVN3Z1lYSnlZWGtwTzF4dUlDQWdJSDBwTzF4dUlDQjlYRzVjYmlBZ1kzUjRMbk5sWlc0dWNHOXdLQ2s3WEc1Y2JpQWdjbVYwZFhKdUlISmxaSFZqWlZSdlUybHVaMnhsVTNSeWFXNW5LRzkxZEhCMWRDd2dZbUZ6WlN3Z1luSmhZMlZ6S1R0Y2JuMWNibHh1WEc1bWRXNWpkR2x2YmlCbWIzSnRZWFJRY21sdGFYUnBkbVVvWTNSNExDQjJZV3gxWlNrZ2UxeHVJQ0JwWmlBb2FYTlZibVJsWm1sdVpXUW9kbUZzZFdVcEtWeHVJQ0FnSUhKbGRIVnliaUJqZEhndWMzUjViR2w2WlNnbmRXNWtaV1pwYm1Wa0p5d2dKM1Z1WkdWbWFXNWxaQ2NwTzF4dUlDQnBaaUFvYVhOVGRISnBibWNvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdkbUZ5SUhOcGJYQnNaU0E5SUNkY1hDY25JQ3NnU2xOUFRpNXpkSEpwYm1kcFpua29kbUZzZFdVcExuSmxjR3hoWTJVb0wxNWNJbnhjSWlRdlp5d2dKeWNwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWNtVndiR0ZqWlNndkp5OW5MQ0JjSWx4Y1hGd25YQ0lwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWNtVndiR0ZqWlNndlhGeGNYRndpTDJjc0lDZGNJaWNwSUNzZ0oxeGNKeWM3WEc0Z0lDQWdjbVYwZFhKdUlHTjBlQzV6ZEhsc2FYcGxLSE5wYlhCc1pTd2dKM04wY21sdVp5Y3BPMXh1SUNCOVhHNGdJR2xtSUNocGMwNTFiV0psY2loMllXeDFaU2twWEc0Z0lDQWdjbVYwZFhKdUlHTjBlQzV6ZEhsc2FYcGxLQ2NuSUNzZ2RtRnNkV1VzSUNkdWRXMWlaWEluS1R0Y2JpQWdhV1lnS0dselFtOXZiR1ZoYmloMllXeDFaU2twWEc0Z0lDQWdjbVYwZFhKdUlHTjBlQzV6ZEhsc2FYcGxLQ2NuSUNzZ2RtRnNkV1VzSUNkaWIyOXNaV0Z1SnlrN1hHNGdJQzh2SUVadmNpQnpiMjFsSUhKbFlYTnZiaUIwZVhCbGIyWWdiblZzYkNCcGN5QmNJbTlpYW1WamRGd2lMQ0J6YnlCemNHVmphV0ZzSUdOaGMyVWdhR1Z5WlM1Y2JpQWdhV1lnS0dselRuVnNiQ2gyWVd4MVpTa3BYRzRnSUNBZ2NtVjBkWEp1SUdOMGVDNXpkSGxzYVhwbEtDZHVkV3hzSnl3Z0oyNTFiR3duS1R0Y2JuMWNibHh1WEc1bWRXNWpkR2x2YmlCbWIzSnRZWFJGY25KdmNpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdKMXNuSUNzZ1JYSnliM0l1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuTG1OaGJHd29kbUZzZFdVcElDc2dKMTBuTzF4dWZWeHVYRzVjYm1aMWJtTjBhVzl1SUdadmNtMWhkRUZ5Y21GNUtHTjBlQ3dnZG1Gc2RXVXNJSEpsWTNWeWMyVlVhVzFsY3l3Z2RtbHphV0pzWlV0bGVYTXNJR3RsZVhNcElIdGNiaUFnZG1GeUlHOTFkSEIxZENBOUlGdGRPMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkNBOUlIWmhiSFZsTG14bGJtZDBhRHNnYVNBOElHdzdJQ3NyYVNrZ2UxeHVJQ0FnSUdsbUlDaG9ZWE5QZDI1UWNtOXdaWEowZVNoMllXeDFaU3dnVTNSeWFXNW5LR2twS1NrZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwTG5CMWMyZ29abTl5YldGMFVISnZjR1Z5ZEhrb1kzUjRMQ0IyWVd4MVpTd2djbVZqZFhKelpWUnBiV1Z6TENCMmFYTnBZbXhsUzJWNWN5eGNiaUFnSUNBZ0lDQWdJQ0JUZEhKcGJtY29hU2tzSUhSeWRXVXBLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwTG5CMWMyZ29KeWNwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0JyWlhsekxtWnZja1ZoWTJnb1puVnVZM1JwYjI0b2EyVjVLU0I3WEc0Z0lDQWdhV1lnS0NGclpYa3ViV0YwWTJnb0wxNWNYR1FySkM4cEtTQjdYRzRnSUNBZ0lDQnZkWFJ3ZFhRdWNIVnphQ2htYjNKdFlYUlFjbTl3WlhKMGVTaGpkSGdzSUhaaGJIVmxMQ0J5WldOMWNuTmxWR2x0WlhNc0lIWnBjMmxpYkdWTFpYbHpMRnh1SUNBZ0lDQWdJQ0FnSUd0bGVTd2dkSEoxWlNrcE8xeHVJQ0FnSUgxY2JpQWdmU2s3WEc0Z0lISmxkSFZ5YmlCdmRYUndkWFE3WEc1OVhHNWNibHh1Wm5WdVkzUnBiMjRnWm05eWJXRjBVSEp2Y0dWeWRIa29ZM1I0TENCMllXeDFaU3dnY21WamRYSnpaVlJwYldWekxDQjJhWE5wWW14bFMyVjVjeXdnYTJWNUxDQmhjbkpoZVNrZ2UxeHVJQ0IyWVhJZ2JtRnRaU3dnYzNSeUxDQmtaWE5qTzF4dUlDQmtaWE5qSUQwZ1QySnFaV04wTG1kbGRFOTNibEJ5YjNCbGNuUjVSR1Z6WTNKcGNIUnZjaWgyWVd4MVpTd2dhMlY1S1NCOGZDQjdJSFpoYkhWbE9pQjJZV3gxWlZ0clpYbGRJSDA3WEc0Z0lHbG1JQ2hrWlhOakxtZGxkQ2tnZTF4dUlDQWdJR2xtSUNoa1pYTmpMbk5sZENrZ2UxeHVJQ0FnSUNBZ2MzUnlJRDBnWTNSNExuTjBlV3hwZW1Vb0oxdEhaWFIwWlhJdlUyVjBkR1Z5WFNjc0lDZHpjR1ZqYVdGc0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhOMGNpQTlJR04wZUM1emRIbHNhWHBsS0NkYlIyVjBkR1Z5WFNjc0lDZHpjR1ZqYVdGc0p5azdYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHbG1JQ2hrWlhOakxuTmxkQ2tnZTF4dUlDQWdJQ0FnYzNSeUlEMGdZM1I0TG5OMGVXeHBlbVVvSjF0VFpYUjBaWEpkSnl3Z0ozTndaV05wWVd3bktUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2FXWWdLQ0ZvWVhOUGQyNVFjbTl3WlhKMGVTaDJhWE5wWW14bFMyVjVjeXdnYTJWNUtTa2dlMXh1SUNBZ0lHNWhiV1VnUFNBbld5Y2dLeUJyWlhrZ0t5QW5YU2M3WEc0Z0lIMWNiaUFnYVdZZ0tDRnpkSElwSUh0Y2JpQWdJQ0JwWmlBb1kzUjRMbk5sWlc0dWFXNWtaWGhQWmloa1pYTmpMblpoYkhWbEtTQThJREFwSUh0Y2JpQWdJQ0FnSUdsbUlDaHBjMDUxYkd3b2NtVmpkWEp6WlZScGJXVnpLU2tnZTF4dUlDQWdJQ0FnSUNCemRISWdQU0JtYjNKdFlYUldZV3gxWlNoamRIZ3NJR1JsYzJNdWRtRnNkV1VzSUc1MWJHd3BPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdjM1J5SUQwZ1ptOXliV0YwVm1Gc2RXVW9ZM1I0TENCa1pYTmpMblpoYkhWbExDQnlaV04xY25ObFZHbHRaWE1nTFNBeEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1JQ2h6ZEhJdWFXNWtaWGhQWmlnblhGeHVKeWtnUGlBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1lYSnlZWGtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnpkSElnUFNCemRISXVjM0JzYVhRb0oxeGNiaWNwTG0xaGNDaG1kVzVqZEdsdmJpaHNhVzVsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdKeUFnSnlBcklHeHBibVU3WEc0Z0lDQWdJQ0FnSUNBZ2ZTa3VhbTlwYmlnblhGeHVKeWt1YzNWaWMzUnlLRElwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lITjBjaUE5SUNkY1hHNG5JQ3NnYzNSeUxuTndiR2wwS0NkY1hHNG5LUzV0WVhBb1puVnVZM1JwYjI0b2JHbHVaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDY2dJQ0FuSUNzZ2JHbHVaVHRjYmlBZ0lDQWdJQ0FnSUNCOUtTNXFiMmx1S0NkY1hHNG5LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnpkSElnUFNCamRIZ3VjM1I1YkdsNlpTZ25XME5wY21OMWJHRnlYU2NzSUNkemNHVmphV0ZzSnlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUdsbUlDaHBjMVZ1WkdWbWFXNWxaQ2h1WVcxbEtTa2dlMXh1SUNBZ0lHbG1JQ2hoY25KaGVTQW1KaUJyWlhrdWJXRjBZMmdvTDE1Y1hHUXJKQzhwS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYzNSeU8xeHVJQ0FnSUgxY2JpQWdJQ0J1WVcxbElEMGdTbE5QVGk1emRISnBibWRwWm5rb0p5Y2dLeUJyWlhrcE8xeHVJQ0FnSUdsbUlDaHVZVzFsTG0xaGRHTm9LQzllWENJb1cyRXRla0V0V2w5ZFcyRXRla0V0V2w4d0xUbGRLaWxjSWlRdktTa2dlMXh1SUNBZ0lDQWdibUZ0WlNBOUlHNWhiV1V1YzNWaWMzUnlLREVzSUc1aGJXVXViR1Z1WjNSb0lDMGdNaWs3WEc0Z0lDQWdJQ0J1WVcxbElEMGdZM1I0TG5OMGVXeHBlbVVvYm1GdFpTd2dKMjVoYldVbktUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYm1GdFpTQTlJRzVoYldVdWNtVndiR0ZqWlNndkp5OW5MQ0JjSWx4Y1hGd25YQ0lwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1eVpYQnNZV05sS0M5Y1hGeGNYQ0l2Wnl3Z0oxd2lKeWxjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG5KbGNHeGhZMlVvTHloZVhDSjhYQ0lrS1M5bkxDQmNJaWRjSWlrN1hHNGdJQ0FnSUNCdVlXMWxJRDBnWTNSNExuTjBlV3hwZW1Vb2JtRnRaU3dnSjNOMGNtbHVaeWNwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ1WVcxbElDc2dKem9nSnlBcklITjBjanRjYm4xY2JseHVYRzVtZFc1amRHbHZiaUJ5WldSMVkyVlViMU5wYm1kc1pWTjBjbWx1WnlodmRYUndkWFFzSUdKaGMyVXNJR0p5WVdObGN5a2dlMXh1SUNCMllYSWdiblZ0VEdsdVpYTkZjM1FnUFNBd08xeHVJQ0IyWVhJZ2JHVnVaM1JvSUQwZ2IzVjBjSFYwTG5KbFpIVmpaU2htZFc1amRHbHZiaWh3Y21WMkxDQmpkWElwSUh0Y2JpQWdJQ0J1ZFcxTWFXNWxjMFZ6ZENzck8xeHVJQ0FnSUdsbUlDaGpkWEl1YVc1a1pYaFBaaWduWEZ4dUp5a2dQajBnTUNrZ2JuVnRUR2x1WlhORmMzUXJLenRjYmlBZ0lDQnlaWFIxY200Z2NISmxkaUFySUdOMWNpNXlaWEJzWVdObEtDOWNYSFV3TURGaVhGeGJYRnhrWEZ4a1AyMHZaeXdnSnljcExteGxibWQwYUNBcklERTdYRzRnSUgwc0lEQXBPMXh1WEc0Z0lHbG1JQ2hzWlc1bmRHZ2dQaUEyTUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJpY21GalpYTmJNRjBnSzF4dUlDQWdJQ0FnSUNBZ0lDQW9ZbUZ6WlNBOVBUMGdKeWNnUHlBbkp5QTZJR0poYzJVZ0t5QW5YRnh1SUNjcElDdGNiaUFnSUNBZ0lDQWdJQ0FnSnlBbklDdGNiaUFnSUNBZ0lDQWdJQ0FnYjNWMGNIVjBMbXB2YVc0b0p5eGNYRzRnSUNjcElDdGNiaUFnSUNBZ0lDQWdJQ0FnSnlBbklDdGNiaUFnSUNBZ0lDQWdJQ0FnWW5KaFkyVnpXekZkTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUdKeVlXTmxjMXN3WFNBcklHSmhjMlVnS3lBbklDY2dLeUJ2ZFhSd2RYUXVhbTlwYmlnbkxDQW5LU0FySUNjZ0p5QXJJR0p5WVdObGMxc3hYVHRjYm4xY2JseHVYRzR2THlCT1QxUkZPaUJVYUdWelpTQjBlWEJsSUdOb1pXTnJhVzVuSUdaMWJtTjBhVzl1Y3lCcGJuUmxiblJwYjI1aGJHeDVJR1J2YmlkMElIVnpaU0JnYVc1emRHRnVZMlZ2Wm1CY2JpOHZJR0psWTJGMWMyVWdhWFFnYVhNZ1puSmhaMmxzWlNCaGJtUWdZMkZ1SUdKbElHVmhjMmxzZVNCbVlXdGxaQ0IzYVhSb0lHQlBZbXBsWTNRdVkzSmxZWFJsS0NsZ0xseHVablZ1WTNScGIyNGdhWE5CY25KaGVTaGhjaWtnZTF4dUlDQnlaWFIxY200Z1FYSnlZWGt1YVhOQmNuSmhlU2hoY2lrN1hHNTlYRzVsZUhCdmNuUnpMbWx6UVhKeVlYa2dQU0JwYzBGeWNtRjVPMXh1WEc1bWRXNWpkR2x2YmlCcGMwSnZiMnhsWVc0b1lYSm5LU0I3WEc0Z0lISmxkSFZ5YmlCMGVYQmxiMllnWVhKbklEMDlQU0FuWW05dmJHVmhiaWM3WEc1OVhHNWxlSEJ2Y25SekxtbHpRbTl2YkdWaGJpQTlJR2x6UW05dmJHVmhianRjYmx4dVpuVnVZM1JwYjI0Z2FYTk9kV3hzS0dGeVp5a2dlMXh1SUNCeVpYUjFjbTRnWVhKbklEMDlQU0J1ZFd4c08xeHVmVnh1Wlhod2IzSjBjeTVwYzA1MWJHd2dQU0JwYzA1MWJHdzdYRzVjYm1aMWJtTjBhVzl1SUdselRuVnNiRTl5Vlc1a1pXWnBibVZrS0dGeVp5a2dlMXh1SUNCeVpYUjFjbTRnWVhKbklEMDlJRzUxYkd3N1hHNTlYRzVsZUhCdmNuUnpMbWx6VG5Wc2JFOXlWVzVrWldacGJtVmtJRDBnYVhOT2RXeHNUM0pWYm1SbFptbHVaV1E3WEc1Y2JtWjFibU4wYVc5dUlHbHpUblZ0WW1WeUtHRnlaeWtnZTF4dUlDQnlaWFIxY200Z2RIbHdaVzltSUdGeVp5QTlQVDBnSjI1MWJXSmxjaWM3WEc1OVhHNWxlSEJ2Y25SekxtbHpUblZ0WW1WeUlEMGdhWE5PZFcxaVpYSTdYRzVjYm1aMWJtTjBhVzl1SUdselUzUnlhVzVuS0dGeVp5a2dlMXh1SUNCeVpYUjFjbTRnZEhsd1pXOW1JR0Z5WnlBOVBUMGdKM04wY21sdVp5YzdYRzU5WEc1bGVIQnZjblJ6TG1selUzUnlhVzVuSUQwZ2FYTlRkSEpwYm1jN1hHNWNibVoxYm1OMGFXOXVJR2x6VTNsdFltOXNLR0Z5WnlrZ2UxeHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlHRnlaeUE5UFQwZ0ozTjViV0p2YkNjN1hHNTlYRzVsZUhCdmNuUnpMbWx6VTNsdFltOXNJRDBnYVhOVGVXMWliMnc3WEc1Y2JtWjFibU4wYVc5dUlHbHpWVzVrWldacGJtVmtLR0Z5WnlrZ2UxeHVJQ0J5WlhSMWNtNGdZWEpuSUQwOVBTQjJiMmxrSURBN1hHNTlYRzVsZUhCdmNuUnpMbWx6Vlc1a1pXWnBibVZrSUQwZ2FYTlZibVJsWm1sdVpXUTdYRzVjYm1aMWJtTjBhVzl1SUdselVtVm5SWGh3S0hKbEtTQjdYRzRnSUhKbGRIVnliaUJwYzA5aWFtVmpkQ2h5WlNrZ0ppWWdiMkpxWldOMFZHOVRkSEpwYm1jb2NtVXBJRDA5UFNBblcyOWlhbVZqZENCU1pXZEZlSEJkSnp0Y2JuMWNibVY0Y0c5eWRITXVhWE5TWldkRmVIQWdQU0JwYzFKbFowVjRjRHRjYmx4dVpuVnVZM1JwYjI0Z2FYTlBZbXBsWTNRb1lYSm5LU0I3WEc0Z0lISmxkSFZ5YmlCMGVYQmxiMllnWVhKbklEMDlQU0FuYjJKcVpXTjBKeUFtSmlCaGNtY2dJVDA5SUc1MWJHdzdYRzU5WEc1bGVIQnZjblJ6TG1selQySnFaV04wSUQwZ2FYTlBZbXBsWTNRN1hHNWNibVoxYm1OMGFXOXVJR2x6UkdGMFpTaGtLU0I3WEc0Z0lISmxkSFZ5YmlCcGMwOWlhbVZqZENoa0tTQW1KaUJ2WW1wbFkzUlViMU4wY21sdVp5aGtLU0E5UFQwZ0oxdHZZbXBsWTNRZ1JHRjBaVjBuTzF4dWZWeHVaWGh3YjNKMGN5NXBjMFJoZEdVZ1BTQnBjMFJoZEdVN1hHNWNibVoxYm1OMGFXOXVJR2x6UlhKeWIzSW9aU2tnZTF4dUlDQnlaWFIxY200Z2FYTlBZbXBsWTNRb1pTa2dKaVpjYmlBZ0lDQWdJQ2h2WW1wbFkzUlViMU4wY21sdVp5aGxLU0E5UFQwZ0oxdHZZbXBsWTNRZ1JYSnliM0pkSnlCOGZDQmxJR2x1YzNSaGJtTmxiMllnUlhKeWIzSXBPMXh1ZlZ4dVpYaHdiM0owY3k1cGMwVnljbTl5SUQwZ2FYTkZjbkp2Y2p0Y2JseHVablZ1WTNScGIyNGdhWE5HZFc1amRHbHZiaWhoY21jcElIdGNiaUFnY21WMGRYSnVJSFI1Y0dWdlppQmhjbWNnUFQwOUlDZG1kVzVqZEdsdmJpYzdYRzU5WEc1bGVIQnZjblJ6TG1selJuVnVZM1JwYjI0Z1BTQnBjMFoxYm1OMGFXOXVPMXh1WEc1bWRXNWpkR2x2YmlCcGMxQnlhVzFwZEdsMlpTaGhjbWNwSUh0Y2JpQWdjbVYwZFhKdUlHRnlaeUE5UFQwZ2JuVnNiQ0I4ZkZ4dUlDQWdJQ0FnSUNBZ2RIbHdaVzltSUdGeVp5QTlQVDBnSjJKdmIyeGxZVzRuSUh4OFhHNGdJQ0FnSUNBZ0lDQjBlWEJsYjJZZ1lYSm5JRDA5UFNBbmJuVnRZbVZ5SnlCOGZGeHVJQ0FnSUNBZ0lDQWdkSGx3Wlc5bUlHRnlaeUE5UFQwZ0ozTjBjbWx1WnljZ2ZIeGNiaUFnSUNBZ0lDQWdJSFI1Y0dWdlppQmhjbWNnUFQwOUlDZHplVzFpYjJ3bklIeDhJQ0F2THlCRlV6WWdjM2x0WW05c1hHNGdJQ0FnSUNBZ0lDQjBlWEJsYjJZZ1lYSm5JRDA5UFNBbmRXNWtaV1pwYm1Wa0p6dGNibjFjYm1WNGNHOXlkSE11YVhOUWNtbHRhWFJwZG1VZ1BTQnBjMUJ5YVcxcGRHbDJaVHRjYmx4dVpYaHdiM0owY3k1cGMwSjFabVpsY2lBOUlISmxjWFZwY21Vb0p5NHZjM1Z3Y0c5eWRDOXBjMEoxWm1abGNpY3BPMXh1WEc1bWRXNWpkR2x2YmlCdlltcGxZM1JVYjFOMGNtbHVaeWh2S1NCN1hHNGdJSEpsZEhWeWJpQlBZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvYnlrN1hHNTlYRzVjYmx4dVpuVnVZM1JwYjI0Z2NHRmtLRzRwSUh0Y2JpQWdjbVYwZFhKdUlHNGdQQ0F4TUNBL0lDY3dKeUFySUc0dWRHOVRkSEpwYm1jb01UQXBJRG9nYmk1MGIxTjBjbWx1WnlneE1DazdYRzU5WEc1Y2JseHVkbUZ5SUcxdmJuUm9jeUE5SUZzblNtRnVKeXdnSjBabFlpY3NJQ2ROWVhJbkxDQW5RWEJ5Snl3Z0owMWhlU2NzSUNkS2RXNG5MQ0FuU25Wc0p5d2dKMEYxWnljc0lDZFRaWEFuTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FuVDJOMEp5d2dKMDV2ZGljc0lDZEVaV01uWFR0Y2JseHVMeThnTWpZZ1JtVmlJREUyT2pFNU9qTTBYRzVtZFc1amRHbHZiaUIwYVcxbGMzUmhiWEFvS1NCN1hHNGdJSFpoY2lCa0lEMGdibVYzSUVSaGRHVW9LVHRjYmlBZ2RtRnlJSFJwYldVZ1BTQmJjR0ZrS0dRdVoyVjBTRzkxY25Nb0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhaQ2hrTG1kbGRFMXBiblYwWlhNb0tTa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhaQ2hrTG1kbGRGTmxZMjl1WkhNb0tTbGRMbXB2YVc0b0p6b25LVHRjYmlBZ2NtVjBkWEp1SUZ0a0xtZGxkRVJoZEdVb0tTd2diVzl1ZEdoelcyUXVaMlYwVFc5dWRHZ29LVjBzSUhScGJXVmRMbXB2YVc0b0p5QW5LVHRjYm4xY2JseHVYRzR2THlCc2IyY2dhWE1nYW5WemRDQmhJSFJvYVc0Z2QzSmhjSEJsY2lCMGJ5QmpiMjV6YjJ4bExteHZaeUIwYUdGMElIQnlaWEJsYm1SeklHRWdkR2x0WlhOMFlXMXdYRzVsZUhCdmNuUnpMbXh2WnlBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNCamIyNXpiMnhsTG14dlp5Z25KWE1nTFNBbGN5Y3NJSFJwYldWemRHRnRjQ2dwTENCbGVIQnZjblJ6TG1admNtMWhkQzVoY0hCc2VTaGxlSEJ2Y25SekxDQmhjbWQxYldWdWRITXBLVHRjYm4wN1hHNWNibHh1THlvcVhHNGdLaUJKYm1obGNtbDBJSFJvWlNCd2NtOTBiM1I1Y0dVZ2JXVjBhRzlrY3lCbWNtOXRJRzl1WlNCamIyNXpkSEoxWTNSdmNpQnBiblJ2SUdGdWIzUm9aWEl1WEc0Z0tseHVJQ29nVkdobElFWjFibU4wYVc5dUxuQnliM1J2ZEhsd1pTNXBibWhsY21sMGN5Qm1jbTl0SUd4aGJtY3Vhbk1nY21WM2NtbDBkR1Z1SUdGeklHRWdjM1JoYm1SaGJHOXVaVnh1SUNvZ1puVnVZM1JwYjI0Z0tHNXZkQ0J2YmlCR2RXNWpkR2x2Ymk1d2NtOTBiM1I1Y0dVcExpQk9UMVJGT2lCSlppQjBhR2x6SUdacGJHVWdhWE1nZEc4Z1ltVWdiRzloWkdWa1hHNGdLaUJrZFhKcGJtY2dZbTl2ZEhOMGNtRndjR2x1WnlCMGFHbHpJR1oxYm1OMGFXOXVJRzVsWldSeklIUnZJR0psSUhKbGQzSnBkSFJsYmlCMWMybHVaeUJ6YjIxbElHNWhkR2wyWlZ4dUlDb2dablZ1WTNScGIyNXpJR0Z6SUhCeWIzUnZkSGx3WlNCelpYUjFjQ0IxYzJsdVp5QnViM0p0WVd3Z1NtRjJZVk5qY21sd2RDQmtiMlZ6SUc1dmRDQjNiM0pySUdGelhHNGdLaUJsZUhCbFkzUmxaQ0JrZFhKcGJtY2dZbTl2ZEhOMGNtRndjR2x1WnlBb2MyVmxJRzFwY25KdmNpNXFjeUJwYmlCeU1URTBPVEF6S1M1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1ZlNCamRHOXlJRU52Ym5OMGNuVmpkRzl5SUdaMWJtTjBhVzl1SUhkb2FXTm9JRzVsWldSeklIUnZJR2x1YUdWeWFYUWdkR2hsWEc0Z0tpQWdJQ0FnY0hKdmRHOTBlWEJsTGx4dUlDb2dRSEJoY21GdElIdG1kVzVqZEdsdmJuMGdjM1Z3WlhKRGRHOXlJRU52Ym5OMGNuVmpkRzl5SUdaMWJtTjBhVzl1SUhSdklHbHVhR1Z5YVhRZ2NISnZkRzkwZVhCbElHWnliMjB1WEc0Z0tpOWNibVY0Y0c5eWRITXVhVzVvWlhKcGRITWdQU0J5WlhGMWFYSmxLQ2RwYm1obGNtbDBjeWNwTzF4dVhHNWxlSEJ2Y25SekxsOWxlSFJsYm1RZ1BTQm1kVzVqZEdsdmJpaHZjbWxuYVc0c0lHRmtaQ2tnZTF4dUlDQXZMeUJFYjI0bmRDQmtieUJoYm5sMGFHbHVaeUJwWmlCaFpHUWdhWE51SjNRZ1lXNGdiMkpxWldOMFhHNGdJR2xtSUNnaFlXUmtJSHg4SUNGcGMwOWlhbVZqZENoaFpHUXBLU0J5WlhSMWNtNGdiM0pwWjJsdU8xeHVYRzRnSUhaaGNpQnJaWGx6SUQwZ1QySnFaV04wTG10bGVYTW9ZV1JrS1R0Y2JpQWdkbUZ5SUdrZ1BTQnJaWGx6TG14bGJtZDBhRHRjYmlBZ2QyaHBiR1VnS0drdExTa2dlMXh1SUNBZ0lHOXlhV2RwYmx0clpYbHpXMmxkWFNBOUlHRmtaRnRyWlhselcybGRYVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiM0pwWjJsdU8xeHVmVHRjYmx4dVpuVnVZM1JwYjI0Z2FHRnpUM2R1VUhKdmNHVnlkSGtvYjJKcUxDQndjbTl3S1NCN1hHNGdJSEpsZEhWeWJpQlBZbXBsWTNRdWNISnZkRzkwZVhCbExtaGhjMDkzYmxCeWIzQmxjblI1TG1OaGJHd29iMkpxTENCd2NtOXdLVHRjYm4xY2JpSmRmUT09IiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG5cbid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoXCJiYWJlbC1wb2x5ZmlsbFwiKTtcbi8qKlxuICogU3RhdGljIGFuYWx5c2lzIGZvciBQb2x5bWVyLlxuICogQG5hbWVzcGFjZSBoeWRyb2x5c2lzXG4gKi9cbmV4cG9ydHMuQW5hbHl6ZXIgPSByZXF1aXJlKCcuL2xpYi9hbmFseXplcicpLkFuYWx5emVyO1xuZXhwb3J0cy5GU1Jlc29sdmVyID0gcmVxdWlyZSgnLi9saWIvbG9hZGVyL2ZzLXJlc29sdmVyJykuRlNSZXNvbHZlcjtcbmV4cG9ydHMuTG9hZGVyID0gcmVxdWlyZSgnLi9saWIvbG9hZGVyL2ZpbGUtbG9hZGVyJykuRmlsZUxvYWRlcjtcbmV4cG9ydHMuTm9vcFJlc29sdmVyID0gcmVxdWlyZSgnLi9saWIvbG9hZGVyL25vb3AtcmVzb2x2ZXInKS5Ob29wUmVzb2x2ZXI7XG5leHBvcnRzLlJlZGlyZWN0UmVzb2x2ZXIgPVxuICAgIHJlcXVpcmUoJy4vbGliL2xvYWRlci9yZWRpcmVjdC1yZXNvbHZlcicpLlJlZGlyZWN0UmVzb2x2ZXI7XG5leHBvcnRzLlhIUlJlc29sdmVyID0gcmVxdWlyZSgnLi9saWIvbG9hZGVyL3hoci1yZXNvbHZlcicpLlhIUlJlc29sdmVyO1xuZXhwb3J0cy5TdHJpbmdSZXNvbHZlciA9IHJlcXVpcmUoJy4vbGliL2xvYWRlci9zdHJpbmctcmVzb2x2ZXInKS5TdHJpbmdSZXNvbHZlcjtcbmV4cG9ydHMuX2pzUGFyc2UgPSByZXF1aXJlKCcuL2xpYi9hc3QtdXRpbHMvanMtcGFyc2UnKS5qc1BhcnNlO1xuZXhwb3J0cy5faW1wb3J0UGFyc2UgPSByZXF1aXJlKCcuL2xpYi9hc3QtdXRpbHMvaW1wb3J0LXBhcnNlJykuaW1wb3J0UGFyc2U7XG5cbmV4cG9ydHMuZG9jcyA9IHJlcXVpcmUoJy4vbGliL2FzdC11dGlscy9kb2NzJyk7XG5leHBvcnRzLmpzZG9jID0gcmVxdWlyZSgnLi9saWIvYXN0LXV0aWxzL2pzZG9jJyk7XG4iXX0=