User:Evad37/rater/sandbox/app.js

(function{function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})({1:[function(require,module,exports){ module.exports={ "name": "rater",  "version": "2.7.1",  "description": "Wikipedia userscript that helps assess pages for WikiProjects",  "homepage": "https://github.com/evad37/rater",  "browser": "index.js",  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1",    "lint:es5": "jshint index.js",    "lint:es6": "eslint index.js \"rater-src/**\"",    "lint:fix": "eslint index.js \"rater-src/**\" --fix", "lint": "npm run lint:es6 && npm run lint:es5", "build:bundle": "browserify rater-src/App.js --debug -t babelify --outfile dist/rater.js", "build:minify": "uglifyjs dist/rater.js --compress -b ascii_only=true,beautify=false --output dist/rater.min.js", "build:concat": "concat-cli -f \"comment-top.js\" dist/rater.min.js \"comment-bottom.js\" -o dist/rater.min.js", "build": "npm run lint && npm run build:bundle && npm run build:minify && npm run build:concat" }, "author": { "name": "Evad37", "url": "https://en.wikipedia.org/wiki/User:Evad37" }, "repository": { "type": "git", "url": "https://github.com/evad37/rater.git" }, "license": "(MIT OR CC-BY-4.0)", "devDependencies": { "@babel/core": "^7.9.0", "@babel/preset-env": "^7.9.0", "babelify": "^10.0.0", "browserify": "^16.5.0", "concat-cli": "^4.0.0", "eslint": "^6.8.0", "jshint": "^2.11.0", "uglify-js": "^3.8.0" } }

},{}],2:[function(require,module,exports){ "use strict";

var _setup = _interopRequireDefault(require("./setup")); var _autostart = _interopRequireDefault(require("./autostart")); var _css = _interopRequireDefault(require("./css.js")); var _api = require("./api"); var _windowManager = _interopRequireDefault(require("./windowManager")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

(function App { var stylesheet;  var showMainWindow = function showMainWindow(data) {    if (!data || !data.success) {      return;    }    if (stylesheet) {      stylesheet.disabled = false;    } else {      stylesheet = mw.util.addCSS(_css["default"]);    }    // Add css class to body to enable background scrolling    document.getElementsByTagName("body")[0].classList.add("rater-mainWindow-open");    // Open the window    _windowManager["default"].openWindow("main", data).closed.then(function (result) { // Disable/remove the css styles, so as to not interfere with other scripts/content/OOUI windows if (stylesheet) { stylesheet.disabled = true; }     document.getElementsByTagName("body")[0].classList.remove("rater-mainWindow-open"); // Restart if needed if (result && result.restart) { _windowManager["default"].removeWindows(["main"]).then(_setup["default"]).then(showMainWindow, showSetupError); return; }     // Show notification when saved successfully if (result && result.success) { var $message = $(" ").append($(" ").text("Ratings saved successfully.")); if (result.upgradedStub) { $message.append($(" "),         // TODO: There should be a link that will edit the article for you          $(" ").text("Note that the article appears to be tagged as a stub.")); }       mw.notify($message, {          autoHide: true,          autoHideSeconds: "long",          tag: "Rater-saved"        }); }   });  };  var showSetupError = function showSetupError(code, jqxhr) {    return OO.ui.alert((0, _api.makeErrorMsg)(code, jqxhr), { title: "Rater failed to open" }); };

// Invocation by portlet link mw.util.addPortletLink("p-cactions", "#", "Rater", "ca-rater", "Rate quality and importance", "5"); $("#ca-rater").click(function (event) {   event.preventDefault;    (0, _setup["default"]).then(showMainWindow, showSetupError);  });

// Invocation by auto-start (do not show message on error) (0, _autostart["default"]).then(showMainWindow); }); //

},{"./api":15,"./autostart":16,"./css.js":19,"./setup":22,"./windowManager":24}],3:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.getWithRedirectTo = exports.parseTemplates = exports.Template = void 0; var _api = _interopRequireDefault(require("./api")); var _util = require("./util"); var _config = _interopRequireDefault(require("./config")); var cache = _interopRequireWildcard(require("./cache")); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

/** Template * * @class * Represents the wikitext of template transclusion. Used by #parseTemplates. * @prop {String} name Name of the template * @prop {String} wikitext Full wikitext of the transclusion * @prop {Object[]} parameters Parameters used in the translcusion, in order, of form: {		name: {String|Number} parameter name, or position for unnamed parameters, value: {String} Wikitext passed to the parameter (whitespace trimmed), wikitext: {String} Full wikitext (including leading pipe, parameter name/equals sign (if applicable), value, and any whitespace) } * @constructor * @param {String} wikitext Wikitext of a template transclusion, starting with ''. */ var Template = function Template(wikitext) { this.wikitext = wikitext; this.parameters = []; // Spacing around pipes, equals signs, end braces (defaults) this.pipeStyle = " |"; this.equalsStyle = "="; this.endBracesStyle = "}}"; }; exports.Template = Template; Template.prototype.addParam = function (name, val, wikitext) { this.parameters.push({   "name": name,    "value": val,    "wikitext": "|" + wikitext  }); }; /** * Get a parameter data by parameter name */ Template.prototype.getParam = function (paramName) { return this.parameters.find(function (p) {   return p.name == paramName;  }); }; Template.prototype.setName = function (name) { this.name = name.trim; }; Template.prototype.getTitle = function { return mw.Title.newFromText("Template:" + this.name); };

/** * parseTemplates * * Parses templates from wikitext. * Based on SD0001's version at . * Returns an array containing the template details: * var templates = parseTemplates("Hello  world"); * console.log(templates[0]); // --> object {		name: "foo", wikitext:"", parameters: [ {				name: 1, value: 'Bar', wikitext: '|Bar' },			{				name: 'baz', value: 'qux', wikitext: '|baz=qux ' },			{				name: '2', value: 'loremipsum', wikitext: '| 2 = loremipsum ' },			{				name: '3', value: '', wikitext: '|3=' }		],		getParam: function(paramName) { return this.parameters.find(function(p) { return p.name == paramName; }); }	} *    *  * @param {String} wikitext * @param {Boolean} recursive Set to `true` to also parse templates that occur within other templates, * rather than just top-level templates. * @return {Template[]} templates var parseTemplates = function parseTemplates(wikitext, recursive) { /* eslint-disable no-control-regex */ if (!wikitext) { return []; } var strReplaceAt = function strReplaceAt(string, index, _char) { return string.slice(0, index) + _char + string.slice(index + 1); }; var result = []; var processTemplateText = function processTemplateText(startIdx, endIdx) { var text = wikitext.slice(startIdx, endIdx); var template = new Template("");

// swap out pipe in links with \x01 control character // can have multiple pipes, so might need multiple passes while (/(\[\^\*?)\|(.*?\]\])/g.test(text)) { text = text.replace(/(\[\^\*?)\|(.*?\]\])/g, "$1\x01$2"); }

// Figure out most-used spacing styles for pipes/equals template.pipeStyle = (0, _util.mostFrequent)(text.match(/[\s\n]*\|[\s\n]*/g)) || " |"; template.equalsStyle = (0, _util.mostFrequent)(text.replace(/(=[^|]*)=+/g, "$1").match(/[\s\n]*=[\s\n]*/g)) || "="; // Figure out end-braces style var endSpacing = text.match(/[\s\n]*$/); template.endBracesStyle = (endSpacing ? endSpacing[0] : "") + "}}"; var chunks = text.split("|").map(function (chunk) {     // change '\x01' control characters back to pipes      return chunk.replace(/\x01/g, "|");    }); template.setName(chunks[0]); var parameterChunks = chunks.slice(1); var unnamedIdx = 1; parameterChunks.forEach(function (chunk) {     var indexOfEqualTo = chunk.indexOf("=");      var indexOfOpenBraces = chunk.indexOf("{{");      var isWithoutEquals = !chunk.includes("=");      var hasBracesBeforeEquals = chunk.includes("{{") && indexOfOpenBraces < indexOfEqualTo;      var isUnnamedParam = isWithoutEquals || hasBracesBeforeEquals;      var pName, pNum, pVal;      if (isUnnamedParam) {        // Get the next number not already used by either an unnamed parameter, or by a        // named parameter like `|1=val`        while (template.getParam(unnamedIdx)) {          unnamedIdx++;        }        pNum = unnamedIdx;        pVal = chunk.trim;      } else {        pName = chunk.slice(0, indexOfEqualTo).trim;        pVal = chunk.slice(indexOfEqualTo + 1).trim;      }      template.addParam(pName || pNum, pVal, chunk);    }); result.push(template); }; var n = wikitext.length;

// number of unclosed braces var numUnclosed = 0;

// are we inside a comment, or between nowiki tags, or in a {{{parameter}}}? var inComment = false; var inNowiki = false; var inParameter = false; var startIdx, endIdx; for (var i = 0; i < n; i++) { if (!inComment && !inNowiki && !inParameter) { if (wikitext[i] === "{" && wikitext[i + 1] === "{" && wikitext[i + 2] === "{" && wikitext[i + 3] !== "{") { inParameter = true; i += 2; } else if (wikitext[i] === "{" && wikitext[i + 1] === "{") { if (numUnclosed === 0) { startIdx = i + 2; }       numUnclosed += 2; i++; } else if (wikitext[i] === "}" && wikitext[i + 1] === "}") { if (numUnclosed === 2) { endIdx = i;         processTemplateText(startIdx, endIdx); }       numUnclosed -= 2; i++; } else if (wikitext[i] === "|" && numUnclosed > 2) { // swap out pipes in nested templates with \x01 character wikitext = strReplaceAt(wikitext, i, "\x01"); } else if (/^/.test(wikitext.slice(i, i + 3))) { inComment = false; i += 2; } else if (/^<\/nowiki ?>/.test(wikitext.slice(i, i + 10))) { inNowiki = false; i += 8; } else if (wikitext[i] === "}" && wikitext[i + 1] === "}" && wikitext[i + 2] === "}") { inParameter = false; i += 2; }   }  }  if (recursive) { var subtemplates = (0, _util.filterAndMap)(result, function (template) {     return /\{\{(?:.|\n)*\}\}/.test(template.wikitext.slice(2, -2));    }, function (template) {      return parseTemplates(template.wikitext.slice(2, -2), true);    }); return result.concat.apply(result, subtemplates); } return result; }; /* eslint-enable no-control-regex */

/** * @param {Template|Template[]} templates * @return {Promise|Promise} */ exports.parseTemplates = parseTemplates; var getWithRedirectTo = function getWithRedirectTo(templates) { var templatesArray = Array.isArray(templates) ? templates : [templates]; if (templatesArray.length === 0) { return $.Deferred.resolve([]); } return _api["default"].get({    "action": "query",    "format": "json",    "titles": (0, _util.filterAndMap)(templatesArray, function (template) { return template.getTitle !== null; }, function (template) { return template.getTitle.getPrefixedText; }),   "redirects": 1  }).then(function (result) {    if (!result || !result.query) {      return $.Deferred.reject("Empty response");    }    if (result.query.redirects) {      result.query.redirects.forEach(function (redirect) { var i = templatesArray.findIndex(function (template) {         var title = template.getTitle;          return title && title.getPrefixedText === redirect.from;        }); if (i !== -1) { templatesArray[i].redirectTarget = mw.Title.newFromText(redirect.to); }     });    }    return Array.isArray(templates) ? templatesArray : templatesArray[0];  }); }; exports.getWithRedirectTo = getWithRedirectTo; Template.prototype.getDataForParam = function (key, paraName) { if (!this.paramData) { return null; } // If alias, switch from alias to preferred parameter name var para = this.paramAliases[paraName] || paraName; if (!this.paramData[para]) { return; } var data = this.paramData[para][key]; // Data might actually be an object with key "en" if (data && data.en && !Array.isArray(data)) { return data.en; } return data; }; Template.prototype.isShellTemplate = function { var mainText = this.redirectTarget ? this.redirectTarget.getMainText : this.getTitle.getMainText; return _config["default"].shellTemplates.includes(mainText); }; Template.prototype.setParamDataAndSuggestions = function { var self = this; var paramDataSet = $.Deferred; if (self.paramData) { return paramDataSet.resolve; } var prefixedText = self.redirectTarget ? self.redirectTarget.getPrefixedText : self.getTitle.getPrefixedText; var cachedInfo = cache.read(prefixedText + "-params"); if (cachedInfo && cachedInfo.value && cachedInfo.staleDate && cachedInfo.value.paramData != null && cachedInfo.value.parameterSuggestions != null && cachedInfo.value.paramAliases != null) { self.notemplatedata = cachedInfo.value.notemplatedata; self.paramData = cachedInfo.value.paramData; self.parameterSuggestions = cachedInfo.value.parameterSuggestions; self.paramAliases = cachedInfo.value.paramAliases; paramDataSet.resolve; if (!(0, _util.isAfterDate)(cachedInfo.staleDate)) { // Just use the cached data return paramDataSet; } // else: Use the cache data for now, but also fetch new data from API } _api["default"].get({    action: "templatedata",    titles: prefixedText,    redirects: 1,    includeMissingTitles: 1  }).then(function (response) {    return response;  }, function /*error*/  {    return null;  } // Ignore errors, will use default data  ).then(function (result) {    // Figure out page id (beacuse action=templatedata doesn't have an indexpageids option)    var id = result && $.map(result.pages, function (_value, key) { return key; });   if (!result || !result.pages[id] || result.pages[id].notemplatedata || !result.pages[id].params) {      // No TemplateData, so use defaults (guesses)      self.notemplatedata = true;      self.templatedataApiError = !result;      self.paramData = _config["default"].defaultParameterData;    } else {      self.paramData = result.pages[id].params;    }    self.paramAliases = {};    $.each(self.paramData, function (paraName, paraData) { // Extract aliases for easier reference later on     if (paraData.aliases && paraData.aliases.length) { paraData.aliases.forEach(function (alias) {         self.paramAliases[alias] = paraName;        }); }     // Extract allowed values array from description if (paraData.description && /\[.*'.+?'.*?\]/.test(paraData.description.en)) { try { var allowedVals = JSON.parse(paraData.description.en.replace(/^.*\[/, "[").replace(/"/g, "\\\"").replace(/'/g, "\"").replace(/,\s*]/, "]").replace(/].*$/, "]"));         self.paramData[paraName].allowedValues = allowedVals;        } catch (e) {          console.warn("[Rater] Could not parse allowed values in description:\n  " + paraData.description.en + "\n Check TemplateData for parameter |" + paraName + "= in " + self.getTitle.getPrefixedText);        }      }    });

// Make suggestions for combobox var allParamsArray = !self.notemplatedata && result.pages[id].paramOrder || $.map(self.paramData, function (_val, key) {     return key;    }); self.parameterSuggestions = allParamsArray.filter(function (paramName) {     return paramName && paramName !== "class" && paramName !== "importance";    }).map(function (paramName) {      var optionObject = {        data: paramName      };      var label = self.getDataForParam(label, paramName);      if (label) {        optionObject.label = label + " (|" + paramName + "=)";      }      return optionObject;    }); if (self.templatedataApiError) { // Don't save defaults/guesses to cache; return true; }   cache.write(prefixedText + "-params", {      notemplatedata: self.notemplatedata,      paramData: self.paramData,      parameterSuggestions: self.parameterSuggestions,      paramAliases: self.paramAliases    }, 1); return true; }).then(paramDataSet.resolve, paramDataSet.reject); return paramDataSet; }; var makeListAs = function makeListAs(subjectTitle) {  var name = subjectTitle.getMainText.replace(/\s\(.*\)/, "");  if (name.indexOf(" ") === -1) {    return name;  }  var generationalSuffix = "";  if (/ (?:[JS]r.?|[IVX]+)$/.test(name)) {    generationalSuffix = name.slice(name.lastIndexOf(" "));    name = name.slice(0, name.lastIndexOf(" "));    if (name.indexOf(" ") === -1) {      return name + generationalSuffix;    }  }  var lastName = name.slice(name.lastIndexOf(" ") + 1).replace(/,$/, "");  var otherNames = name.slice(0, name.lastIndexOf(" "));  return lastName + ", " + otherNames + generationalSuffix; }; Template.prototype.addMissingParams = function  {  var thisTemplate = this;

// Autofill listas parameter for WP:BIO var isBiographyBanner = this.getTitle.getMainText === "WikiProject Biography" || this.redirectTarget && this.redirectTarget.getMainText === "WikiProject Biography"; if (isBiographyBanner && !this.getParam("listas")) { var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage; this.parameters.push({     name: "listas",      value: makeListAs(subjectTitle),      autofilled: true    }); }

// Make sure required/suggested parameters are present $.each(thisTemplate.paramData, function (paraName, paraData) {   if ((paraData.required || paraData.suggested) && !thisTemplate.getParam(paraName)) {      // Check if already present in an alias, if any      if (paraData.aliases.length) {        var aliases = thisTemplate.parameters.filter(function (p) { var isAlias = paraData.aliases.includes(p.name); var isEmpty = !p.value; return isAlias && !isEmpty; });       if (aliases.length) {          // At least one non-empty alias, so do nothing          return;        }      }      // No non-empty aliases, so add this to the parameters list (with // value set parameter to either the autovaule, or as null).     // Also set that it was autofilled.      thisTemplate.parameters.push({ name: paraName, value: paraData.autovalue || null, autofilled: true });   }  });  return thisTemplate; }; Template.prototype.setClassesAndImportances = function { var _this = this; var parsed = $.Deferred;

// Don't re-parse if already parsed; no need to parse shell templates or banners without ratings if (this.isShellTemplate) { this.classes = _toConsumableArray(_config["default"].bannerDefaults.classes); return parsed.resolve; } else if (this.classes && this.importances || this.withoutRatings) { return parsed.resolve; } var mainText = this.getTitle.getMainText;

// Some projects have hardcoded values, to avoid standard classes or to prevent API issues (timeout and/or node count exceeded) var redirectTargetOrMainText = this.redirectTarget ? this.redirectTarget.getMainText : mainText; if (_config["default"].customBanners[redirectTargetOrMainText]) { this.classes = _config["default"].customBanners[redirectTargetOrMainText].classes; this.importances = _config["default"].customBanners[redirectTargetOrMainText].importances; return parsed.resolve; }

// Otherwise try reading from cached data var cachedRatings = cache.read(mainText + "-ratings"); if (cachedRatings && cachedRatings.value && cachedRatings.staleDate && cachedRatings.value.classes != null && cachedRatings.value.importances != null) { this.classes = cachedRatings.value.classes; this.importances = cachedRatings.value.importances; parsed.resolve; if (!(0, _util.isAfterDate)(cachedRatings.staleDate)) { // Just use the cached data return parsed; } // else: Use the cache data for now, but also fetch new data from API } var wikitextToParse = ""; _config["default"].bannerDefaults.extendedClasses.forEach(function (classname, index) {   wikitextToParse += "{{" + mainText + "|class=" + classname + "|importance=" + (_config["default"].bannerDefaults.extendedImportances[index] || "") + "}}/n";  }); return _api["default"].get({   action: "parse",    title: "Talk:Sandbox",    text: wikitextToParse,    prop: "categorieshtml"  }).then(function (result) {    var catsHtml = result.parse.categorieshtml["*"];    var extendedClasses = _config["default"].bannerDefaults.extendedClasses.filter(function (cl) { return catsHtml.indexOf(cl + "-Class") !== -1; });   _this.classes = [].concat(_toConsumableArray(_config["default"].bannerDefaults.classes), _toConsumableArray(extendedClasses));    _this.importances = _config["default"].bannerDefaults.extendedImportances.filter(function (imp) { return catsHtml.indexOf(imp + "-importance") !== -1; });   cache.write(mainText + "-ratings", { classes: _this.classes, importances: _this.importances }, 1);   return true;  }); };

//

},{"./api":15,"./cache":17,"./config":18,"./util":23}],4:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _config = _interopRequireDefault(require("../../config")); var _BannerWidget = _interopRequireDefault(require("./BannerWidget")); var _util = require("../../util"); var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest; } function _nonIterableRest { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator], _s; !(_n = (_s = _i.next).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"]; } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } //

var BannerListWidget = function BannerListWidget(config) { config = config || {};

// Call parent constructor BannerListWidget.parent.call(this, config); OO.ui.mixin.GroupElement.call(this, {   $group: this.$element  }); this.$element.addClass("rater-bannerListWidget").css({   "padding": "20px 10px 16px 10px"  });

// Prefs this.preferences = config.preferences; this.oresClass = config.oresClass; this.changed = false;

// Events this.aggregate({   "remove": "bannerRemove"  }); this.connect(this, {   "bannerRemove": "onBannerRemove"  }); this.aggregate({   "changed": "bannerChanged"  }); this.connect(this, {   "bannerChanged": "setChanged"  }); this.aggregate({   "biographyBannerChange": "biographyBannerChanged"  }); this.connect(this, {   "biographyBannerChanged": "syncShellTemplateWithBiographyBanner"  }); this.aggregate({   "updatedSize": "bannerUpdatedSize"  }); this.connect(this, {   "bannerUpdatedSize": "onUpdatedSize"  }); }; OO.inheritClass(BannerListWidget, OO.ui.Widget); OO.mixinClass(BannerListWidget, OO.ui.mixin.GroupElement); /* methods from mixin: - addItems( items, [index] ) : OO.ui.Element (CHAINABLE) - clearItems : OO.ui.Element (CHAINABLE) - findItemFromData( data ) : OO.ui.Element|null - findItemsFromData( data ) : OO.ui.Element[] - removeItems( items ) : OO.ui.Element (CHAINABLE)

BannerListWidget.prototype.onUpdatedSize = function { // Emit an "updatedSize" event so the parent window can update size, if needed this.emit("updatedSize"); }; BannerListWidget.prototype.setChanged = function { this.changed = true; }; BannerListWidget.prototype.onBannerRemove = function (banner) { this.removeItems([banner]); this.setChanged; }; BannerListWidget.prototype.syncShellTemplateWithBiographyBanner = function (biographyBanner) { biographyBanner = biographyBanner || this.items.find(function (banner) {   return banner.mainText === "WikiProject Biography" || banner.redirectTargetMainText === "WikiProject Biography";  }); if (!biographyBanner) return; var bannerShellTemplate = this.items.find(function (banner) {   return banner.mainText === _config["default"].shellTemplates[0] || banner.redirectTargetMainText === _config["default"].shellTemplates[0];  }); if (!bannerShellTemplate) { return; } var paramsToSync = [{ name: "living", normalise: true }, {   name: "blpo", normalise: true }, {   name: "activepol", normalise: true }, {   name: "listas", normalise: false }]; paramsToSync.forEach(function (paramToSync) {    var _map = [biographyBanner, bannerShellTemplate].map(function (banner) { return banner.parameterList.getParameterItems.find(function (parameter) {         return parameter.name === paramToSync.name || banner.paramAliases[parameter.name] === paramToSync.name;        }); }),     _map2 = _slicedToArray(_map, 2),      biographyParam = _map2[0],      shellParam = _map2[1];    if (!biographyParam) return;    var paramSyncValue = paramToSync.normalise ? (0, _util.normaliseYesNo)(biographyParam.value) : biographyParam.value;    biographyParam["delete"];    if (!shellParam && paramSyncValue) {      var index = bannerShellTemplate.addParameterLayout.isVisible ? -1 // Insert at the very end      : bannerShellTemplate.parameterList.items.length - 1; // Insert prior to the "add parameter" button      bannerShellTemplate.parameterList.addItems([new _ParameterWidget["default"]({        "name": paramToSync.name,        "value": paramSyncValue,        "autofilled": true      }, bannerShellTemplate.paramData && bannerShellTemplate.paramData[paramToSync.name])], index);    } else if (!biographyParam.autofilled && paramSyncValue) {      shellParam.setValue(paramSyncValue); shellParam.setAutofilled; } }); }; BannerListWidget.prototype.addShellTemplateIfNeeeded = function  {  var _this = this;  if (!this.items.some(function (banner) {    return banner.isShellTemplate;  })) {    _BannerWidget["default"].newFromTemplateName(_config["default"].shellTemplates[0], { withoutRatings: true }, {     preferences: this.preferences, isArticle: this.pageInfo.isArticle }).then(function (shellBannerWidget) { OO.ui.mixin.GroupElement.prototype.addItems.call(_this, [shellBannerWidget], 0); // Autofill ratings (if able to) _this.autofillClassRatings({       forBannerShell: true      }); // emit updatedSize event _this.onUpdatedSize; }); }  return this; }; BannerListWidget.prototype.addItems = function (items, index) {  if (items.length === 0) {    return this;  }

// Call mixin method to do the adding OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);

// Autofill ratings (if able to, and if enabled in preferences) if (!this.items.some(function (banner) { return banner.isShellTemplate; })) {   this.autofillClassRatings; } this.autofillImportanceRatings;

// emit updatedSize event this.onUpdatedSize; return this; }; BannerListWidget.prototype.autofillClassRatings = function (config) { config = config || {}; // Only autofill if set in preferences if (!this.preferences.autofillClassFromOthers && !this.preferences.autofillClassFromOres && !config.forBannerShell) { return; } // Check what banners already have var uniqueClassRatings = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.items, function (banner) { if (banner.isShellTemplate || !banner.hasClassRatings) { return false; }   var classItem = banner.classDropdown.getMenu.findSelectedItem; return classItem && classItem.getData; }, function (banner) { return banner.classDropdown.getMenu.findSelectedItem.getData; })); // Can't autofill if there isn't either a single value, or no value if (uniqueClassRatings.length > 1) { return; } // Determine what to autofill with var autoClass; if (uniqueClassRatings.length === 1 && (this.preferences.autofillClassFromOthers || config.forBannerShell)) { autoClass = uniqueClassRatings[0]; } else if (uniqueClassRatings.length === 0 && this.preferences.autofillClassFromOres && this.oresClass) { // Don't autofill above C-class switch (this.oresClass) { case "Stub": case "Start": case "C": case "List": autoClass = this.oresClass; } } else { // nothing to do   return; } // Do the autofilling this.items.forEach(function (banner) {   if (!banner.hasClassRatings && !banner.isShellTemplate) {      return;    }    var classItem = banner.classDropdown.getMenu.findSelectedItem;    if (classItem && classItem.getData && !config.forBannerShell) {      return;    }    if (config.forBannerShell && !banner.isShellTemplate && classItem.getData === autoClass) {      banner.classDropdown.getMenu.selectItemByData(null);      return;    }    banner.classDropdown.getMenu.selectItemByData(autoClass);    banner.classDropdown.setAutofilled(true);  }); }; BannerListWidget.prototype.autofillImportanceRatings = function { if (!this.preferences.autofillImportance) { return; } var isRegularArticle = this.pageInfo && this.pageInfo.isArticle && !this.pageInfo.redirect && !this.pageInfo.isDisambig; if (!isRegularArticle) { return; } // TODO: Should try to find a smarter, banner-specific way of determining importance. // Maybe do something with ORES's "drafttopic" model. var autoImportance = "Low"; this.items.forEach(function (banner) {   if (!banner.hasImportanceRatings) {      return;    }    var importanceItem = banner.importanceDropdown.getMenu.findSelectedItem;    if (importanceItem && importanceItem.getData) {      return;    }    banner.importanceDropdown.getMenu.selectItemByData(autoImportance);    banner.importanceDropdown.setAutofilled(true);  }); }; BannerListWidget.prototype.setPreferences = function (prefs) { this.preferences = prefs; this.items.forEach(function (banner) {   return banner.setPreferences(prefs);  }); this.autofillClassRatings; this.autofillImportanceRatings; }; BannerListWidget.prototype.makeWikitext = function { var bannersWikitext = (0, _util.filterAndMap)(this.items, function (banner) {   return !banner.isShellTemplate;  }, function (banner) {    return banner.makeWikitext;  }).join("\n"); var shellTemplate = this.items.find(function (banner) {   return banner.isShellTemplate;  }); if (!shellTemplate) { return bannersWikitext; } var shellParam1 = new _ParameterWidget["default"]({    name: "1",    value: "\n" + bannersWikitext + "\n" + (shellTemplate.nonStandardTemplates ? shellTemplate.nonStandardTemplates + "\n" : "") }); shellTemplate.parameterList.addItems([shellParam1]); var shellWikitext = shellTemplate.makeWikitext; shellTemplate.parameterList.removeItems([shellParam1]); return shellWikitext; }; var _default = BannerListWidget; // exports["default"] = _default;

},{"../../config":18,"../../util":23,"./BannerWidget":5,"./ParameterWidget":9}],5:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _ParameterListWidget = _interopRequireDefault(require("./ParameterListWidget")); var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget")); var _DropdownParameterWidget = _interopRequireDefault(require("./DropdownParameterWidget")); var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget")); var _util = require("../../util"); var _Template = require("../../Template"); var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget")); var _config = _interopRequireDefault(require("../../config")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

function BannerWidget(template, config) { var _this = this; // Configuration initialization config = config || {}; // Call parent constructor BannerWidget["super"].call(this, config); this.$overlay = config.$overlay;

/* --- PREFS --- */ this.preferences = config.preferences;

/* --- PROPS --- */ this.paramData = template.paramData; this.paramAliases = template.paramAliases || {}; this.parameterSuggestions = template.parameterSuggestions; this.name = template.name; this.wikitext = template.wikitext; this.pipeStyle = template.pipeStyle; this.equalsStyle = template.equalsStyle; this.endBracesStyle = template.endBracesStyle; this.mainText = template.getTitle.getMainText; this.redirectTargetMainText = template.redirectTarget && template.redirectTarget.getMainText; this.isShellTemplate = template.isShellTemplate; this.changed = template.parameters.some(function (parameter) {   return parameter.autofilled;  }); // initially false, unless some parameters were autofilled this.hasClassRatings = template.classes && template.classes.length; this.hasImportanceRatings = template.importances && template.importances.length; this.inactiveProject = template.inactiveProject;

/* --- TITLE AND RATINGS --- */

this.removeButton = new OO.ui.ButtonWidget({   icon: "trash",    label: "Remove banner",    title: "Remove banner",    flags: "destructive",    $element: $("")  }); this.clearButton = new OO.ui.ButtonWidget({   icon: "cancel",    label: "Clear parameters",    title: "Clear parameters",    flags: "destructive",    $element: $("")  }); this.removeButton.$element.find("a").css("width", "100%"); this.clearButton.$element.find("a").css("width", "100%"); this.titleButtonsGroup = new OO.ui.ButtonGroupWidget({   items: [this.removeButton, this.clearButton],    $element: $(" ")  }); this.mainLabelPopupButton = new OO.ui.PopupButtonWidget({   label: "").concat(this.inactiveProject ? " (inactive)" : ""), $element: $(" "), $overlay: this.$overlay, indicator: "down", framed: false, popup: { $content: this.titleButtonsGroup.$element, width: 200, padded: false, align: "force-right", anchor: false } });  this.mainLabelPopupButton.$element.children("a").first.css({ "font-size": "110%" }).find("span.oo-ui-labelElement-label").css({ "white-space": "normal" });

// Rating dropdowns if (this.isShellTemplate) { this.classDropdown = new _DropdownParameterWidget["default"]({     label: new OO.ui.HtmlSnippet("Class "),      menu: {        items: [new OO.ui.MenuOptionWidget({ data: null, label: new OO.ui.HtmlSnippet("(".concat(config.isArticle ? "no class" : "auto-detect", ") ")) })].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) { return new OO.ui.MenuOptionWidget({           data: classname,            label: classname          }); })))     },      $overlay: this.$overlay    }); var shellClassParam = template.parameters.find(function (parameter) {     return parameter.name === "class";    }); this.classDropdown.getMenu.selectItemByData(shellClassParam && (0, _util.classMask)(shellClassParam.value)); } else if (this.hasClassRatings) { this.classDropdown = new _DropdownParameterWidget["default"]({     label: new OO.ui.HtmlSnippet("Class "),      menu: {        items: [new OO.ui.MenuOptionWidget({ data: null, label: new OO.ui.HtmlSnippet("(".concat(config.isArticle ? "inherit from shell" : "auto-detect", ") ")) })].concat(_toConsumableArray(template.classes.map(function (classname) { return new OO.ui.MenuOptionWidget({           data: classname,            label: classname          }); })))     },      $overlay: this.$overlay    }); var classParam = template.parameters.find(function (parameter) {     return parameter.name === "class";    }); this.classDropdown.getMenu.selectItemByData(classParam && (0, _util.classMask)(classParam.value)); } if (this.hasImportanceRatings) { this.importanceDropdown = new _DropdownParameterWidget["default"]({     label: new OO.ui.HtmlSnippet("Importance "),      menu: {        items: [new OO.ui.MenuOptionWidget({ data: null, label: new OO.ui.HtmlSnippet("(".concat(config.isArticle ? "no importance" : "auto-detect", ") ")) })].concat(_toConsumableArray(template.importances.map(function (importance) { return new OO.ui.MenuOptionWidget({           data: importance,            label: importance          }); })))     },      $overlay: this.$overlay    }); var importanceParam = template.parameters.find(function (parameter) {     return parameter.name === "importance";    }); this.importanceDropdown.getMenu.selectItemByData(importanceParam && (0, _util.importanceMask)(importanceParam.value)); } this.titleLayout = new OO.ui.HorizontalLayout({    items: [this.mainLabelPopupButton]  }); if (this.hasClassRatings || this.isShellTemplate) { this.titleLayout.addItems([this.classDropdown]); } if (this.hasImportanceRatings) { this.titleLayout.addItems([this.importanceDropdown]); }

/* --- PARAMETERS LIST --- */

var parameterWidgets = (0, _util.filterAndMap)(template.parameters, function (param) {   if (_this.isShellTemplate) {      if (param.name == "1") {        _this.shellParam1Value = param.value;        return false;      }      return param.name !== "class";    }    return param.name !== "class" && param.name !== "importance";  }, function (param) {    return new _ParameterWidget["default"](param, template.paramData[param.name], { $overlay: _this.$overlay }); });  this.parameterList = new _ParameterListWidget["default"]({    items: parameterWidgets,    preferences: this.preferences  });

/* --- ADD PARAMETER SECTION --- */

this.addParameterNameInput = new _SuggestionLookupTextInputWidget["default"]({   suggestions: template.parameterSuggestions,    placeholder: "parameter name",    $element: $(" "),    validate: function (val) {      var _this$getAddParameter = this.getAddParametersInfo(val),        validName = _this$getAddParameter.validName,        name = _this$getAddParameter.name,        value = _this$getAddParameter.value;      return !name && !value ? true : validName;    }.bind(this),    allowSuggestionsWhenEmpty: true,    $overlay: this.$overlay  }); this.updateAddParameterNameSuggestions; this.addParameterValueInput = new _SuggestionLookupTextInputWidget["default"]({   placeholder: "parameter value",    $element: $(" "),    validate: function (val) {      var _this$getAddParameter2 = this.getAddParametersInfo(null, val),        validValue = _this$getAddParameter2.validValue,        name = _this$getAddParameter2.name,        value = _this$getAddParameter2.value;      return !name && !value ? true : validValue;    }.bind(this),    allowSuggestionsWhenEmpty: true,    $overlay: this.$overlay  }); this.addParameterButton = new OO.ui.ButtonWidget({   label: "Add",    icon: "add",    flags: "progressive"  }).setDisabled(true); this.addParameterControls = new _HorizontalLayoutWidget["default"]({   items: [this.addParameterNameInput, new OO.ui.LabelWidget({ label: "=" }), this.addParameterValueInput, this.addParameterButton] }); this.addParameterLayout = new OO.ui.FieldLayout(this.addParameterControls, {   label: "Add parameter:",    align: "top"  }).toggle(false); // A hack to make messages appear on their own line this.addParameterLayout.$element.find(".oo-ui-fieldLayout-messages").css({   "clear": "both",    "padding-top": 0  });

/* --- OVERALL LAYOUT/DISPLAY --- */

// Display the layout elements, and a rule this.$element.addClass("rater-bannerWidget").append(this.titleLayout.$element, this.parameterList.$element, this.addParameterLayout.$element); if (!this.isShellTemplate) { this.$element.append($(" ")); } if (this.isShellTemplate) { this.$element.css({     "background": "#eee",      "border-radius": "10px",      "padding": "0 10px 5px",      "margin-bottom": "12px",      "font-size": "92%"    }); }

/* --- EVENT HANDLING --- */

if (this.hasClassRatings) { this.classDropdown.connect(this, {     "change": "onClassChange"    }); } if (this.hasImportanceRatings) { this.importanceDropdown.connect(this, {     "change": "onImportanceChange"    }); } this.parameterList.connect(this, {    "change": "onParameterChange",    "addParametersButtonClick": "showAddParameterInputs",    "updatedSize": "onUpdatedSize"  }); this.addParameterButton.connect(this, {   "click": "onParameterAdd"  }); this.addParameterNameInput.connect(this, {   "change": "onAddParameterNameChange",    "enter": "onAddParameterNameEnter",    "choose": "onAddParameterNameEnter"  }); this.addParameterValueInput.connect(this, {   "change": "onAddParameterValueChange",    "enter": "onAddParameterValueEnter",    "choose": "onAddParameterValueEnter"  }); this.removeButton.connect(this, {   "click": "onRemoveButtonClick"  }); this.clearButton.connect(this, {   "click": "onClearButtonClick"  });

/* --- APPLY PREF -- */ if (this.preferences.bypassRedirects) { this.bypassRedirect; } } OO.inheritClass(BannerWidget, OO.ui.Widget);

/** * @param {String} templateName * @param {Object} [data] * @param {Boolean} data.withoutRatings * @param {Boolean} data.isWrapper * @param {Object} config * @returns {Promise} */ BannerWidget.newFromTemplateName = function (templateName, data, config) { var template = new _Template.Template; template.name = templateName; if (data && data.withoutRatings) { template.withoutRatings = true; } return (0, _Template.getWithRedirectTo)(template).then(function (template) {    return $.when(template.setClassesAndImportances, template.setParamDataAndSuggestions).then(function  { // Add missing required/suggested values template.addMissingParams; // Return the now-modified template return template; }); }).then(function (template) {    return new BannerWidget(template, config);  }); }; BannerWidget.prototype.onUpdatedSize = function { // Emit an "updatedSize" event so the parent window can update size, if needed this.emit("updatedSize"); }; BannerWidget.prototype.setChanged = function { this.changed = true; this.emit("changed"); if (this.mainText === "WikiProject Biography" || this.redirectTargetMainText === "WikiProject Biography") { // Emit event so BannerListWidget can update the banner shell template (if present) this.emit("biographyBannerChange"); } }; BannerWidget.prototype.onParameterChange = function { this.setChanged; this.updateAddParameterNameSuggestions; }; BannerWidget.prototype.onClassChange = function { this.setChanged; this.classChanged = true; var classItem = this.classDropdown.getMenu.findSelectedItem; if (classItem && classItem.getData == null) { // clear selection this.classDropdown.getMenu.selectItem; } }; BannerWidget.prototype.onImportanceChange = function { this.setChanged; this.importanceChanged = true; var importanceItem = this.importanceDropdown.getMenu.findSelectedItem; if (importanceItem && importanceItem.getData == null) { // clear selection this.importanceDropdown.getMenu.selectItem; } }; BannerWidget.prototype.showAddParameterInputs = function { this.addParameterLayout.toggle(true); this.addParameterNameInput.focus; this.onUpdatedSize; }; BannerWidget.prototype.getAddParametersInfo = function (nameInputVal, valueInputVal) { var name = nameInputVal && nameInputVal.trim || this.addParameterNameInput.getValue.trim; var paramAlreadyIncluded = name === "class" || name === "importance" || name === "1" && this.isShellTemplate || this.parameterList.getParameterItems.some(function (paramWidget) {   return paramWidget.name === name;  }); var value = valueInputVal && valueInputVal.trim || this.addParameterValueInput.getValue.trim; var autovalue = name && this.paramData[name] && this.paramData[name].autovalue || null; return { validName: !!(name && !paramAlreadyIncluded), validValue: !!(value || autovalue), isAutovalue: !!(!value && autovalue), isAlreadyIncluded: !!(name && paramAlreadyIncluded), name: name, value: value, autovalue: autovalue }; }; BannerWidget.prototype.onAddParameterNameChange = function { var _this$getAddParameter3 = this.getAddParametersInfo, validName = _this$getAddParameter3.validName, validValue = _this$getAddParameter3.validValue, isAutovalue = _this$getAddParameter3.isAutovalue, isAlreadyIncluded = _this$getAddParameter3.isAlreadyIncluded, name = _this$getAddParameter3.name, autovalue = _this$getAddParameter3.autovalue; // Set value input placeholder as the autovalue this.addParameterValueInput.$input.attr("placeholder", autovalue || ""); // Set suggestions, if the parameter has a list of allowed values var allowedValues = this.paramData[name] && this.paramData[name].allowedValues && this.paramData[name].allowedValues.map(function (val) {   return {      data: val,      label: val    };  }); this.addParameterValueInput.setSuggestions(allowedValues || []); // Set button disabled state based on validity this.addParameterButton.setDisabled(!validName || !validValue); // Show notice if autovalue will be used this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []); // Show error is the banner already has the parameter set this.addParameterLayout.setErrors(isAlreadyIncluded ? ["Parameter is already present"] : []); }; BannerWidget.prototype.onAddParameterNameEnter = function { this.addParameterValueInput.focus; }; BannerWidget.prototype.onAddParameterValueChange = function { var _this$getAddParameter4 = this.getAddParametersInfo, validName = _this$getAddParameter4.validName, validValue = _this$getAddParameter4.validValue, isAutovalue = _this$getAddParameter4.isAutovalue; this.addParameterButton.setDisabled(!validName || !validValue); this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []); }; BannerWidget.prototype.onAddParameterValueEnter = function { // Make sure button state has been updated this.onAddParameterValueChange; // Do nothing if button is disabled (i.e. name and/or value are invalid) if (this.addParameterButton.isDisabled) { return; } // Add parameter this.onParameterAdd; }; BannerWidget.prototype.onParameterAdd = function { var _this$getAddParameter5 = this.getAddParametersInfo, validName = _this$getAddParameter5.validName, validValue = _this$getAddParameter5.validValue, name = _this$getAddParameter5.name, value = _this$getAddParameter5.value, autovalue = _this$getAddParameter5.autovalue; if (!validName || !validValue) { // Error should already be shown via onAddParameter...Change methods return; } var newParameter = new _ParameterWidget["default"]({    "name": name,    "value": value || autovalue  }, this.paramData[name], {    $overlay: this.$overlay  }); this.parameterList.addItems([newParameter]); this.addParameterNameInput.setValue(""); this.addParameterValueInput.setValue(""); this.addParameterNameInput.$input.focus; }; BannerWidget.prototype.updateAddParameterNameSuggestions = function { var paramsInUse = {}; this.parameterList.getParameterItems.forEach(function (paramWidget) {   return paramsInUse[paramWidget.name] = true;  }); this.addParameterNameInput.setSuggestions(this.parameterSuggestions.filter(function (suggestion) { return !paramsInUse[suggestion.data]; })); }; BannerWidget.prototype.onRemoveButtonClick = function { this.emit("remove"); }; BannerWidget.prototype.onClearButtonClick = function { this.parameterList.clearItems(this.parameterList.getParameterItems); if (this.hasClassRatings) { this.classDropdown.getMenu.selectItem; } if (this.hasImportanceRatings) { this.importanceDropdown.getMenu.selectItem; } }; BannerWidget.prototype.bypassRedirect = function { if (!this.redirectTargetMainText) { return; } // Store the bypassed name this.bypassedName = this.name; // Update title label this.mainLabelPopupButton.setLabel("").concat(this.inactiveProject ? " (inactive)" : "")); // Update properties  this.name = this.redirectTargetMainText;  this.mainText = this.redirectTargetMainText;  this.redirectTargetMainText = null;  this.setChanged; }; BannerWidget.prototype.makeWikitext = function  {  if (!this.changed && this.wikitext) {    return this.wikitext;  }  var pipe = this.pipeStyle;  var equals = this.equalsStyle;  var classItem = (this.hasClassRatings || this.isShellTemplate) && this.classDropdown.getMenu.findSelectedItem;  var classVal = classItem && classItem.getData;  var importanceItem = this.hasImportanceRatings && this.importanceDropdown.getMenu.findSelectedItem;  var importanceVal = importanceItem && importanceItem.getData;  return ("$/, "\n}}"); // avoid empty line at end like Special:Diff/925982142 }; BannerWidget.prototype.setPreferences = function (prefs) { this.preferences = prefs; if (this.preferences.bypassRedirects) { this.bypassRedirect; } this.parameterList.setPreferences(prefs); }; var _default = BannerWidget; // exports["default"] = _default;

},{"../../Template":3,"../../config":18,"../../util":23,"./DropdownParameterWidget":6,"./HorizontalLayoutWidget":7,"./ParameterListWidget":8,"./ParameterWidget":9,"./SuggestionLookupTextInputWidget":11}],6:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; //

function DropdownParameterWidget(config) { // Configuration initialization config = $.extend({   $element: $(" ")  }, config || {});

// Call parent constructor DropdownParameterWidget["super"].call(this, config); this.$overlay = config.$overlay; this.$element.addClass("rater-dropdownParameterWidget");

// Autofilled icon this.autofilled = !!config.autofilled; this.autofilledIcon = new OO.ui.IconWidget({   icon: "robot",    title: "Autofilled by Rater",    flags: "progressive",    $element: $(" ")  }).toggle(this.autofilled); this.$element.find(".oo-ui-indicatorElement-indicator").before(this.autofilledIcon.$element);

// Events this.menu.connect(this, {   "choose": "onDropdownMenuChoose",    "select": "onDropdownMenuSelect"  }); } OO.inheritClass(DropdownParameterWidget, OO.ui.DropdownWidget); DropdownParameterWidget.prototype.setAutofilled = function (setAutofill) { this.autofilledIcon.toggle(!!setAutofill); this.$element.find(".oo-ui-dropdownWidget-handle").css({   "border": setAutofill ? "1px dashed #36c" : ""  }); this.autofilled = !!setAutofill; }; DropdownParameterWidget.prototype.onDropdownMenuChoose = function { this.setAutofilled(false); this.emit("change"); }; DropdownParameterWidget.prototype.onDropdownMenuSelect = function { this.emit("change"); }; DropdownParameterWidget.prototype.getValue = function { var selectedItem = this.menu.findSelectedItem; return selectedItem && selectedItem.getData; }; var _default = DropdownParameterWidget; // exports["default"] = _default;

},{}],7:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } //

/** * A HorizontalLayout that is also a widget, and can thus be placed within * field layouts. * * @class * @param {*} config configuration for OO.ui.HorizontalLayout */ function HorizontalLayoutWidget(config) { // Configuration initialization config = config || {}; // Call parent constructor HorizontalLayoutWidget["super"].call(this, {}); this.layout = new OO.ui.HorizontalLayout(_objectSpread({}, config, { $element: this.$element })); } OO.inheritClass(HorizontalLayoutWidget, OO.ui.Widget); var _default = HorizontalLayoutWidget; // exports["default"] = _default;

},{}],8:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; //

/** * @cfg {OO.ui.Element[]} items Items to be added * @cfg {Number} displayLimit The most to show at once. If the number of items * is more than this, then only the first (displayLimit - 1) items are shown. */ var ParameterListWidget = function ParameterListWidget(config) { config = config || {};

// Call parent constructor ParameterListWidget.parent.call(this, config); OO.ui.mixin.GroupElement.call(this, {   $group: this.$element  }); this.addItems(config.items); this.$element.addClass("rater-parameterListWidget"); this.preferences = config.preferences;

// Hide some parameters (initially), if more than set display limit -- which is the // one more than collapseParamsLowerLimit, to prevent only one param being hidden // (mostly: may occasionally occur if params were auto-filled). var displayLimit = this.preferences.collapseParamsLowerLimit + 1; if (displayLimit && this.items.length > displayLimit) { var hideFromNumber = displayLimit - 1; // One-indexed var hideFromIndex = hideFromNumber - 1; // Zero-indexed var hiddenCount = 0; for (var i = hideFromIndex; i < this.items.length; i++) { if (!this.items[i].autofilled) { // Don't hide auto-filled params this.items[i].toggle(false); hiddenCount++; }   }    if (hiddenCount > 0) { // Add button to show the hidden params this.showMoreParametersButton = new OO.ui.ButtonWidget({       label: "Show " + hiddenCount + " more " + (hiddenCount === 1 ? "parameter" : "parameters"),       framed: false,        $element: $(" ")      }); this.addItems([this.showMoreParametersButton]); } }

// Add the button that allows user to add more parameters this.addParametersButton = new OO.ui.ButtonWidget({   label: "Add parameter",    icon: "add",    framed: false,    $element: $(" ")  }); this.addItems([this.addParametersButton]);

/* --- Events --- */

// Handle delete events from ParameterWidgets this.aggregate({   "delete": "parameterDelete"  }); this.connect(this, {   parameterDelete: "onParameterDelete"  });

// Handle change events from ParameterWidgets this.aggregate({   change: "parameterChange"  }); this.connect(this, {   parameterChange: "onParameterChange"  });

// Handle updatedSize events from ParameterWidgets this.aggregate({   "updatedSize": "parameterUpdatedSize"  }); this.connect(this, {   "parameterUpdatedSize": "onUpdatedSize"  });

// Handle button clicks if (this.showMoreParametersButton) { this.showMoreParametersButton.connect(this, {     "click": "onShowMoreParametersButtonClick"    }); } this.addParametersButton.connect(this, {    "click": "onAddParametersButtonClick"  }); }; OO.inheritClass(ParameterListWidget, OO.ui.Widget); OO.mixinClass(ParameterListWidget, OO.ui.mixin.GroupElement); /* methods from mixin: - addItems( items, [index] ) : OO.ui.Element (CHAINABLE) - clearItems : OO.ui.Element (CHAINABLE) - findItemFromData( data ) : OO.ui.Element|null - findItemsFromData( data ) : OO.ui.Element[] - removeItems( items ) : OO.ui.Element (CHAINABLE)

ParameterListWidget.prototype.onUpdatedSize = function { // Emit an "updatedSize" event so the parent window can update size, if needed this.emit("updatedSize"); }; ParameterListWidget.prototype.addItems = function (items, index) { if (items.length === 0) { return this; }

// Call mixin method to do the adding OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);

// emit updatedSize event this.onUpdatedSize; return this; }; ParameterListWidget.prototype.onParameterDelete = function (parameter) { this.removeItems([parameter]); this.emit("change"); }; ParameterListWidget.prototype.onParameterChange = function { this.emit("change"); }; ParameterListWidget.prototype.getParameterItems = function { return this.items.filter(function (item) {   return item.constructor.name === "ParameterWidget";  }); }; ParameterListWidget.prototype.onShowMoreParametersButtonClick = function { this.removeItems([this.showMoreParametersButton]); this.items.forEach(function (parameterWidget) {   return parameterWidget.toggle(true);  }); this.onUpdatedSize; }; ParameterListWidget.prototype.onAddParametersButtonClick = function { this.removeItems([this.addParametersButton]); this.emit("addParametersButtonClick"); }; ParameterListWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) { return this.getParameterItems.map(function (parameter) {   return parameter.makeWikitext(pipeStyle, equalsStyle);  }).join(""); }; ParameterListWidget.prototype.setPreferences = function (prefs) { this.preferences = prefs; var params = this.getParameterItems; // Unhide some parameters of the collapseParamsLowerLimit has increased. // (Not hiding any if it decreased, since it's a *lower* limit of what needs to be shown.) if (params.length <= this.preferences.collapseParamsLowerLimit) { return; } var hiddenParams = params.filter(function (param) {    return !param.isVisible;  }); var visibleParamsCount = params.length - hiddenParams.length; if (hiddenParams === 0 || visibleParamsCount >= this.preferences.collapseParamsLowerLimit) { return; } var numToUnhide = Math.min(this.preferences.collapseParamsLowerLimit - visibleParamsCount, hiddenParams.length); for (var i = 0; i < numToUnhide; i++) { hiddenParams[i].toggle(true); } var stillHiddenCount = hiddenParams.length - numToUnhide; if (stillHiddenCount === 0) { this.removeItems([this.showMoreParametersButton]); } else { this.showMoreParametersButton.setLabel("Show " + stillHiddenCount + " more " + (stillHiddenCount === 1 ? "paramter" : "paramters")); } }; var _default = ParameterListWidget; // exports["default"] = _default;

},{}],9:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _util = require("../../util"); var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

function ParameterWidget(parameter, paramData, config) { // Configuration initialization config = config || {}; // Call parent constructor ParameterWidget["super"].call(this, config); this.$overlay = config.$overlay; this.name = parameter.name; this.value = parameter.value; this.autofilled = parameter.autofilled; this.isInvalid = parameter.value == null; this.paramData = paramData || {}; this.allowedValues = this.paramData.allowedValues || []; this.isRequired = this.paramData.required; this.isSuggested = this.paramData.suggested;

// Make a checkbox if only 1 or 2 allowed values switch (this.allowedValues.length) { /* eslint-disable no-fallthrough */ case 1: this.allowedValues[1] = null; /* fall-through */ case 2: var isFirstAllowedVal = this.allowedValues.indexOf(parameter.value) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(parameter.value)) === 0; var isSecondAllowedVal = this.allowedValues.indexOf(parameter.value || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(parameter.value ? (0, _util.normaliseYesNo)(parameter.value) : null) === 1; var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal; this.checkbox = new OO.ui.CheckboxInputWidget({       selected: isIndeterminate ? undefined : isFirstAllowedVal,        indeterminate: isIndeterminate ? true : undefined,        $element: $("")      }); break; default: // No checkbox } /* eslint-enable no-fallthrough */

/* --- EDIT PARAMETER LAYOUT --- */

this.input = new OO.ui.ComboBoxInputWidget({   value: this.value,    // label: parameter.name + " =",    // labelPosition: "before",    options: (0, _util.filterAndMap)(this.allowedValues, function (val) { return val !== null; }, function (val) { return { data: val, label: val };   }),    $element: $(" "),    $overlay: this.$overlay  }); // Reduce the excessive whitespace/height this.input.$element.find("input").css({   "padding-top": 0,    "padding-bottom": "2px",    "height": "24px"  }); // Fix label positioning within the reduced height this.input.$element.find("span.oo-ui-labelElement-label").css({   "line-height": "normal"  }); // Also reduce height of dropdown button (if options are present) this.input.$element.find("a.oo-ui-buttonElement-button").css({   "padding-top": 0,    "height": "24px",    "min-height": "0"  }); this.confirmButton = new OO.ui.ButtonWidget({   icon: "check",    label: "Done",    framed: false,    flags: "progressive",    $element: $(" ")  }); this.cancelButton = new OO.ui.ButtonWidget({   icon: "undo",    label: "Cancel",    framed: false  }); this.deleteButton = new OO.ui.ButtonWidget({   icon: this.isRequired ? "restore" : "trash",    label: this.isRequired ? "Required parameter" : "Delete",    framed: false,    flags: "destructive",    disabled: this.isRequired  }); this.editButtonControls = new OO.ui.ButtonGroupWidget({   items: [this.confirmButton, this.cancelButton, this.deleteButton],    $element: $(" ")  }); this.editButtonControls.$element.find("a span:first-child").css({   "min-width": "unset",    "width": "16px",    "margin-right": 0  }); this.editLayoutControls = new _HorizontalLayoutWidget["default"]({   items: [this.input, this.editButtonControls]    //$element: $(" ")  }); this.editLayout = new OO.ui.FieldLayout(this.editLayoutControls, {   label: this.name + " =",    align: "top",    help: this.paramData.description && this.paramData.description.en || false,    helpInline: true  }).toggle; this.editLayout.$element.find("label.oo-ui-inline-help").css({   "margin": "-10px 0 5px 10px"  });

/* --- READ (COLLAPSED) DISPLAY OF PARAMETER --- */

this.invalidIcon = new OO.ui.IconWidget({   icon: "block",    title: "Invalid parameter: no value specified!",    flags: "destructive",    $element: $(" ")  }).toggle(this.isInvalid); this.fullLabel = new OO.ui.LabelWidget({   label: this.name + (this.value ? " = " + this.value : " "),   $element: $("")  }); this.autofilledIcon = new OO.ui.IconWidget({   icon: "robot",    title: "Autofilled by Rater",    flags: "progressive",    $element: $(" ")  }).toggle(this.autofilled); this.editButton = new OO.ui.ButtonWidget({   icon: "edit",    framed: false,    $element: $(" ")  }); this.editButton.$element.find("a").css({   "border-radius": "0 10px 10px 0",    "margin-left": "5px"  }); this.editButton.$element.find("a span").first.css({   "min-width": "unset",    "width": "16px"  }); this.readLayout = new OO.ui.HorizontalLayout({   items: [this.invalidIcon, this.fullLabel, this.autofilledIcon, this.editButton],    $element: $(" ")  }); if (this.checkbox) { this.readLayout.addItems([this.checkbox], 2); }

/* --- CONTAINER FOR BOTH LAYOUTS --- */ this.$element = $(" ").addClass("rater-parameterWidget").css({   "width": "unset",    "display": "inline-block",    "border": this.autofilled ? "1px dashed #36c" : "1px solid #ddd",    "border-radius": "10px",    "padding-left": "10px",    "margin": "0 8px 8px 0",    "background": this.isInvalid ? "#fddd" : "#fffe"  }).append(this.readLayout.$element, this.editLayout.$element); this.editButton.connect(this, {   "click": "onEditClick"  }); this.confirmButton.connect(this, {   "click": "onConfirmClick"  }); this.cancelButton.connect(this, {   "click": "onCancelClick"  }); this.deleteButton.connect(this, {   "click": "onDeleteClick"  }); if (this.checkbox) { this.checkbox.connect(this, {     "change": "onCheckboxChange"    }); } } OO.inheritClass(ParameterWidget, OO.ui.Widget); ParameterWidget.prototype.onUpdatedSize = function { // Emit an "updatedSize" event so the parent window can update size, if needed this.emit("updatedSize"); }; ParameterWidget.prototype.onEditClick = function { this.readLayout.toggle(false); this.editLayout.toggle(true); this.$element.css({   "background": "#fffe"  }); this.input.focus; this.onUpdatedSize; }; ParameterWidget.prototype.onConfirmClick = function { this.setValue(this.input.getValue); this.readLayout.toggle(true); this.editLayout.toggle(false); this.onUpdatedSize; }; ParameterWidget.prototype.onCancelClick = function { this.input.setValue(this.value); this.readLayout.toggle(true); this.editLayout.toggle(false); this.onUpdatedSize; }; ParameterWidget.prototype.onDeleteClick = function { this["delete"]; }; ParameterWidget.prototype.onCheckboxChange = function (isSelected, isIndeterminate) { if (isIndeterminate) { return; } if (isSelected) { this.setValue(this.allowedValues[0]); } else { this.setValue(this.allowedValues[1]); } }; ParameterWidget.prototype["delete"] = function { this.emit("delete"); }; ParameterWidget.prototype.setValue = function (val) { // Turn off autofill stylings/icon this.autofilled = false; this.autofilledIcon.toggle(false); this.$element.css({   "border": "1px solid #ddd"  });

// Update the stored value this.value = val;

// Update the input value for edit mode this.input.setValue(this.value);

// Update validity this.isInvalid = this.value == null; this.invalidIcon.toggle(this.isInvalid); this.$element.css({   "background": this.isInvalid ? "#fddd" : "#fffe"  });

// Updated the label for read mode this.fullLabel.setLabel(this.name + (this.value ? " = " + this.value : ""));

// Update the checkbox (if there is one) if (this.checkbox) { var isFirstAllowedVal = this.allowedValues.indexOf(val) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(val)) === 0; var isSecondAllowedVal = this.allowedValues.indexOf(val || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(val ? (0, _util.normaliseYesNo)(val) : null) === 1; var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal; this.checkbox.setIndeterminate(isIndeterminate, true); if (!isIndeterminate) { var isSelected = isFirstAllowedVal; this.checkbox.setSelected(isSelected, true); } }

// Emit a change event this.emit("change"); }; ParameterWidget.prototype.setAutofilled = function { this.autofilled = true; this.autofilledIcon.toggle(true); this.$element.css({   "border": "1px dashed #36c"  }); }; ParameterWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) { if (this.isInvalid) { return ""; } return pipeStyle + this.name + equalsStyle + (this.value || ""); }; ParameterWidget.prototype.focusInput = function { return this.input.focus; }; var _default = ParameterWidget; // exports["default"] = _default;

},{"../../util":23,"./HorizontalLayoutWidget":7}],10:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _config = _interopRequireDefault(require("../../config")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

function PrefsFormWidget(config) { // Configuration initialization config = config || {}; // Call parent constructor PrefsFormWidget["super"].call(this, config); this.$element.addClass("rater-prefsFormWidget"); this.layout = new OO.ui.FieldsetLayout({   label: "Preferences",    $element: this.$element  }); this.preferences = { "autostart": { input: new OO.ui.ToggleSwitchWidget, label: "Autostart Rater" },   "autostartRedirects": { input: new OO.ui.ToggleSwitchWidget, label: "Autostart on redirects" },   "autostartNamespaces": { input: new mw.widgets.NamespacesMultiselectWidget, label: "Autostart in these namespaces" },   "bypassRedirects": { input: new OO.ui.ToggleSwitchWidget, label: "Bypass redirects to banners" },   "autofillClassFromOthers": { input: new OO.ui.ToggleSwitchWidget, label: "Autofill class from other banners" },   "autofillClassFromOres": { input: new OO.ui.ToggleSwitchWidget, label: "Autofill class based on ORES prediction" },   "autofillImportance": { input: new OO.ui.ToggleSwitchWidget, label: "Autofill low importance" },   "collapseParamsLowerLimit": { input: new OO.ui.NumberInputWidget({       "min": 1      }), label: "Minimum number of parameters to show uncollapsed" },   "watchlist": { input: new OO.ui.ButtonSelectWidget({       items: [new OO.ui.ButtonOptionWidget({ data: "preferences", label: "Default", title: "Uses the same setting as if you manually edited the page, as per Special:Preferences" }), new OO.ui.ButtonOptionWidget({ data: "watch", label: "Always", title: "Always add pages Rater edits to your watchlist" }), new OO.ui.ButtonOptionWidget({ data: "nochange", label: "Never", title: "Never add pages Rater edit to your watchlist" })]     }).selectItemByData("preferences"), label: "Add edited pages to watchlist" },   "resetCache": { input: new OO.ui.ButtonWidget({       label: "Reset cache",        title: "Remove cached data, including list of WikiProjects and template parameters",        flags: ["destructive"]      }) } };  for (var prefName in this.preferences) { this.layout.addItems([new OO.ui.FieldLayout(this.preferences[prefName].input, { label: this.preferences[prefName].label, align: "right" })]); }  this.preferences.resetCache.input.connect(this, {    "click": "onResetCacheClick"  }); } OO.inheritClass(PrefsFormWidget, OO.ui.Widget); PrefsFormWidget.prototype.setPrefValues = function (prefs) { var _this = this; var _loop = function _loop(prefName) { var value = prefs[prefName]; var input = _this.preferences[prefName] && _this.preferences[prefName].input; switch (input && input.constructor.name) { case "OoUiButtonSelectWidget": input.selectItemByData(value); break; case "OoUiNumberInputWidget": case "OoUiToggleSwitchWidget": input.setValue(value); break; case "MwWidgetsNamespacesMultiselectWidget": input.clearItems; value.forEach(function (ns) {         return input.addTag(ns.toString, ns === 0 ? "(Main)" : _config["default"].mw.wgFormattedNamespaces[ns]);       }); break; } };  for (var prefName in prefs) { _loop(prefName); } }; PrefsFormWidget.prototype.getPrefs = function { var prefs = {}; for (var prefName in this.preferences) { var input = this.preferences[prefName].input; var value = void 0; switch (input.constructor.name) { case "OoUiButtonSelectWidget": value = input.findSelectedItem.getData; break; case "OoUiToggleSwitchWidget": value = input.getValue; break; case "OoUiNumberInputWidget": value = Number(input.getValue); // widget uses strings, not numbers! break; case "MwWidgetsNamespacesMultiselectWidget": value = input.getValue.map(Number); // widget uses strings, not numbers! break; }   prefs[prefName] = value; } return prefs; }; PrefsFormWidget.prototype.onResetCacheClick = function { var _this2 = this; OO.ui.confirm("After reseting cache, Rater will close and restart. Any changes made will be discarded.").then(function (confirmed) {   if (confirmed) {      _this2.emit("resetCache");    }  }); }; var _default = PrefsFormWidget; // exports["default"] = _default;

},{"../../config":18}],11:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; //

var SuggestionLookupTextInputWidget = function SuggestionLookupTextInputWidget(config) { OO.ui.TextInputWidget.call(this, config); OO.ui.mixin.LookupElement.call(this, config); this.suggestions = Array.isArray(config.suggestions) ? config.suggestions : []; this.$element.addClass("rater-suggestionLookupTextInputWidget"); }; OO.inheritClass(SuggestionLookupTextInputWidget, OO.ui.TextInputWidget); OO.mixinClass(SuggestionLookupTextInputWidget, OO.ui.mixin.LookupElement);

// Set suggestion. param: Object[] with objects of the form { data: ..., label: ... } SuggestionLookupTextInputWidget.prototype.setSuggestions = function (suggestions) { if (!Array.isArray(suggestions)) { if (suggestions != null) { console.warn("[Rater] SuggestionLookupTextInputWidget.prototype.setSuggestions called with a non-array value:", suggestions); }   return; } this.suggestions = suggestions; };

// Returns data, as a resolution to a promise, to be passed to #getLookupMenuOptionsFromData SuggestionLookupTextInputWidget.prototype.getLookupRequest = function { var deferred = $.Deferred.resolve(new RegExp("\\b" + mw.util.escapeRegExp(this.getValue), "i")); return deferred.promise({   abort: function abort {}  }); };

// ??? SuggestionLookupTextInputWidget.prototype.getLookupCacheDataFromResponse = function (response) { return response || []; };

// Is passed data from #getLookupRequest, returns an array of menu item widgets SuggestionLookupTextInputWidget.prototype.getLookupMenuOptionsFromData = function (pattern) { var labelMatchesInputVal = function labelMatchesInputVal(suggestionItem) { return pattern.test(suggestionItem.label) || !suggestionItem.label && pattern.test(suggestionItem.data); }; var makeMenuOptionWidget = function makeMenuOptionWidget(optionItem) { return new OO.ui.MenuOptionWidget({     data: optionItem.data,      label: optionItem.label || optionItem.data    }); }; return this.suggestions.filter(labelMatchesInputVal).map(makeMenuOptionWidget); };

// Extend onLookupMenuChoose method to emit an choose event SuggestionLookupTextInputWidget.prototype.onLookupMenuChoose = function (item) { // Get data var itemData = item.getData; // Simplify item data if it is an object with a name property if (itemData && itemData.name) { item.setData(itemData.name); } // First blur the input, to prevent the menu popping back up  this.$input.blur; OO.ui.mixin.LookupElement.prototype.onLookupMenuChoose.call(this, item); this.emit("choose", itemData); }; var _default = SuggestionLookupTextInputWidget; // exports["default"] = _default;

},{}],12:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _config = _interopRequireDefault(require("../../config")); var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget")); var _getBanners = require("../../getBanners"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

function TopBarWidget(config) { var _this = this; // Configuration initialization config = $.extend({   expanded: false,    framed: false,    padded: false  }, config || {}); // Call parent constructor TopBarWidget["super"].call(this, config); this.$overlay = config.$overlay;

// Search box this.searchBox = new _SuggestionLookupTextInputWidget["default"]({   placeholder: "Add a WikiProject...",    $element: $(""),    $overlay: this.$overlay  }); (0, _getBanners.getBannerNames).then(function (banners) {   return [].concat(_toConsumableArray(banners.withRatings.map(function (bannerName) { return { label: bannerName.replace("WikiProject ", ""), data: { name: bannerName }     };    })), _toConsumableArray(banners.withoutRatings.map(function (bannerName) { return { label: bannerName.replace("WikiProject ", ""), data: { name: bannerName, withoutRatings: true }     };    })), _toConsumableArray(banners.wrappers.map(function (bannerName) { return { label: bannerName.replace("WikiProject ", "") + " [template wrapper]", data: { name: bannerName, wrapper: true }     };    })), _toConsumableArray(banners.notWPBM.map(function (bannerName) { return { label: bannerName.replace("WikiProject ", ""), data: { name: bannerName }     };    })), _toConsumableArray(banners.inactive.map(function (bannerName) { return { label: bannerName.replace("WikiProject ", "") + " [inactive]", data: { name: bannerName, withoutRatings: true }     };    })), _toConsumableArray(banners.wir.map(function (bannerName) { return { label: bannerName + " [Women In Red meetup/initiative]", data: { name: bannerName, withoutRatings: true }     };    })));  }).then(function (bannerOptions) {    return _this.searchBox.setSuggestions(bannerOptions);  });

// Add button this.addBannerButton = new OO.ui.ButtonWidget({   icon: "add",    title: "Add",    flags: "progressive",    $element: $("")  }); var $searchContainer = $(" ").append(this.searchBox.$element, this.addBannerButton.$element);

// Set all classes/importances // in the style of a popup button with a menu (is actually a dropdown with a hidden label, because that makes the coding easier.) this.setAllDropDown = new OO.ui.DropdownWidget({   icon: "tag",    label: "Set all...",    invisibleLabel: true,    menu: {      items: [new OO.ui.MenuSectionOptionWidget({ label: "Classes" }), new OO.ui.MenuOptionWidget({ data: { "class": null },       label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no class) ") })].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) { return new OO.ui.MenuOptionWidget({         data: {            "class": classname          },          label: classname        }); })), [new OO.ui.MenuSectionOptionWidget({       label: "Importances"      }), new OO.ui.MenuOptionWidget({        data: {          importance: null        },        label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no importance) ")      })], _toConsumableArray(_config["default"].bannerDefaults.importances.map(function (importance) { return new OO.ui.MenuOptionWidget({         data: {            importance: importance          },          label: importance        }); })))   },    $element: $("<span style=\"width:auto;display:inline-block;float:left;margin:0\" title='Set all...'>"),    $overlay: this.$overlay  });

// Remove all banners button this.removeAllButton = new OO.ui.ButtonWidget({   icon: "trash",    title: "Remove all",    flags: "destructive"  });

// Clear all parameters button this.clearAllButton = new OO.ui.ButtonWidget({   icon: "cancel",    title: "Clear all",    flags: "destructive"  });

// Group the buttons together this.menuButtons = new OO.ui.ButtonGroupWidget({   items: [this.removeAllButton, this.clearAllButton],    $element: $(" ")  }); // Include the dropdown in the group this.menuButtons.$element.prepend(this.setAllDropDown.$element);

// Put everything into a layout this.$element.addClass("rater-topBarWidget").css({   "position": "fixed",    "width": "100%",    "background": "#ccc",    "display": "flex",    "flex-wrap": "wrap",    "justify-content": "space-around",    "margin": "-2px 0 0 0"  }).append($searchContainer, this.menuButtons.$element);

/* --- Event handling --- */

this.searchBox.connect(this, {   "enter": "onSearchSelect",    "choose": "onSearchSelect"  }); this.addBannerButton.connect(this, {   "click": "onSearchSelect"  }); this.setAllDropDown.getMenu.connect(this, {   "choose": "onRatingChoose"  }); this.removeAllButton.connect(this, {   "click": "onRemoveAllClick"  }); this.clearAllButton.connect(this, {   "click": "onClearAllClick"  }); } OO.inheritClass(TopBarWidget, OO.ui.PanelLayout); TopBarWidget.prototype.onSearchSelect = function (data) { this.emit("searchSelect", data); }; TopBarWidget.prototype.onRatingChoose = function (item) { var data = item.getData; if (data["class"] || data["class"] === null) { this.emit("setClasses", data["class"]); } if (data.importance || data.importance === null) { this.emit("setImportances", data.importance); } }; TopBarWidget.prototype.onRemoveAllClick = function { this.emit("removeAll"); }; TopBarWidget.prototype.onClearAllClick = function { this.emit("clearAll"); }; TopBarWidget.prototype.setDisabled = function (disable) { [this.searchBox, this.addBannerButton, this.setAllDropDown, this.removeAllButton, this.clearAllButton].forEach(function (widget) {   return widget.setDisabled(disable);  }); }; var _default = TopBarWidget; // exports["default"] = _default;

},{"../../config":18,"../../getBanners":20,"./SuggestionLookupTextInputWidget":11}],13:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _api = require("../api"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

/* var incrementProgressByInterval = function { var incrementIntervalDelay = 100; var incrementIntervalAmount = 0.1; var incrementIntervalMaxval = 98; return window.setInterval(		incrementProgress,		incrementIntervalDelay,		incrementIntervalAmount,		incrementIntervalMaxval	); }; */

var LoadDialog = function LoadDialog(config) { LoadDialog["super"].call(this, config); }; OO.inheritClass(LoadDialog, OO.ui.Dialog); LoadDialog["static"].name = "loadDialog"; LoadDialog["static"].title = "Loading Rater...";

// Customize the initialize function: This is where to add content to the dialog body and set up event handlers. LoadDialog.prototype.initialize = function { var _this$content$$elemen; // Call the parent method. LoadDialog["super"].prototype.initialize.call(this); // Create a layout this.content = new OO.ui.PanelLayout({   padded: true,    expanded: false  }); // Create content this.progressBar = new OO.ui.ProgressBarWidget({   progress: 1  }); this.setuptasks = [new OO.ui.LabelWidget({   label: "Loading your Rater preferences...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Loading list of project banners...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Loading talkpage wikitext...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Parsing talkpage templates...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Getting templates' parameter data...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Checking subject page...",    $element: $("<p style=\"display:block\">")  }), new OO.ui.LabelWidget({    label: "Retrieving quality prediction...",    $element: $("<p style=\"display:block\">")  }).toggle]; this.closeButton = new OO.ui.ButtonWidget({   label: "Close"  }).toggle; this.setupPromises = [];

// Append content to layout (_this$content$$elemen = this.content.$element).append.apply(_this$content$$elemen, [this.progressBar.$element, new OO.ui.LabelWidget({ label: "Initialising:", $element: $("<strong style=\"display:block\">") }).$element].concat(_toConsumableArray(this.setuptasks.map(function (widget) { return widget.$element; })), [this.closeButton.$element]));

// Append layout to dialog this.$body.append(this.content.$element);

// Connect events to handlers this.closeButton.connect(this, {   "click": "onCloseButtonClick"  }); }; LoadDialog.prototype.onCloseButtonClick = function { // Close this dialog, without passing any data this.close; };

// Override the getBodyHeight method to specify a custom height (or don't to use the automatically generated height). LoadDialog.prototype.getBodyHeight = function { return this.content.$element.outerHeight(true); }; LoadDialog.prototype.incrementProgress = function (amount, maximum) { var priorProgress = this.progressBar.getProgress; var incrementedProgress = Math.min(maximum || 100, priorProgress + amount); this.progressBar.setProgress(incrementedProgress); }; LoadDialog.prototype.addTaskPromiseHandlers = function (taskPromises) { var _this = this; var onTaskDone = function onTaskDone(index) { // Add "Done!" to label var widget = _this.setuptasks[index]; widget.setLabel(widget.getLabel + " Done!"); // Increment status bar. Show a smooth transition by   // using small steps over a short duration. var totalIncrement = 100 / _this.setuptasks.length; // percent var totalTime = 400; // milliseconds var totalSteps = 10; var incrementPerStep = totalIncrement / totalSteps; for (var step = 0; step < totalSteps; step++) { window.setTimeout(_this.incrementProgress.bind(_this), totalTime * step / totalSteps, incrementPerStep); } };  var onTaskError = function onTaskError(index, code, info) { var widget = _this.setuptasks[index]; widget.setLabel(widget.getLabel + " Failed. " + (0, _api.makeErrorMsg)(code, info)); _this.closeButton.toggle(true); _this.updateSize; }; taskPromises.forEach(function (promise, index) {    promise.then(function  { return onTaskDone(index); }, function (code, info) { return onTaskError(index, code, info); }); }); };

// Use getSetupProcess to set up the window with data passed to it at the time // of opening LoadDialog.prototype.getSetupProcess = function (data) { var _this2 = this; data = data || {}; return LoadDialog["super"].prototype.getSetupProcess.call(this, data).next(function {    var showOresTask = !!data.ores;    _this2.setuptasks[6].toggle(showOresTask);    var taskPromises = data.ores ? data.promises : data.promises.slice(0, -1);    data.isOpened.then(function  { return _this2.addTaskPromiseHandlers(taskPromises); }); }, this); };

// Prevent window from closing too quickly, using getHoldProcess LoadDialog.prototype.getHoldProcess = function (data) { data = data || {}; if (data.success) { // Wait a bit before processing the close, which happens automatically return LoadDialog["super"].prototype.getHoldProcess.call(this, data).next(800); } // No need to wait if closed manually return LoadDialog["super"].prototype.getHoldProcess.call(this, data); };

// Use the getTeardownProcess method to perform actions whenever the dialog is closed. LoadDialog.prototype.getTeardownProcess = function (data) { var _this3 = this; return LoadDialog["super"].prototype.getTeardownProcess.call(this, data).first(function {    // Perform cleanup: reset labels    _this3.setuptasks.forEach(function (setuptask) { var currentLabel = setuptask.getLabel; setuptask.setLabel(currentLabel.slice(0, currentLabel.indexOf("...") + 3)); }); }, this); }; var _default = LoadDialog; // exports["default"] = _default;

},{"../api":15}],14:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _BannerWidget = _interopRequireDefault(require("./Components/BannerWidget")); var _BannerListWidget = _interopRequireDefault(require("./Components/BannerListWidget")); var _config = _interopRequireDefault(require("../config")); var _api = _interopRequireWildcard(require("../api")); var _PrefsFormWidget = _interopRequireDefault(require("./Components/PrefsFormWidget")); var _prefs = require("../prefs"); var _Template = require("../Template"); var _TopBarWidget = _interopRequireDefault(require("./Components/TopBarWidget")); var _util = require("../util"); var cache = _interopRequireWildcard(require("../cache")); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

function MainWindow(config) { MainWindow["super"].call(this, config); } OO.inheritClass(MainWindow, OO.ui.ProcessDialog); MainWindow["static"].name = "main"; MainWindow["static"].title = $(" ").css({ "font-weight": "normal" }).append($("<a>").css({ "font-weight": "bold" }).attr({ "href": mw.util.getUrl("WP:RATER"), "target": "_blank" }).text("Rater"), " (", $("<a>").attr({ "href": mw.util.getUrl("WT:RATER"),  "target": "_blank" }).text("talk"), ") ", $(" ").css({ "font-size": "90%" }).text("v" + _config["default"].script.version)); MainWindow["static"].size = "large"; MainWindow["static"].actions = [ // Primary (top right): { label: "X", // not using an icon since color becomes inverted, i.e. white on light-grey title: "Close (and discard any changes)", flags: "primary", modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs" }, // Safe (top left) { action: "showPrefs", flags: "safe", icon: "settings", title: "Preferences", modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs" }, // Others (bottom) { action: "save", accessKey: "s", label: new OO.ui.HtmlSnippet(" Save "), flags: ["primary", "progressive"], modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs" }, { action: "preview", accessKey: "p", label: "Show preview", modes: ["edit", "diff"] // available when current mode isn't "preview" or "prefs" }, { action: "changes", accessKey: "v", label: "Show changes", modes: ["edit", "preview"] // available when current mode isn't "diff" or "prefs" }, { action: "back", label: "Back", modes: ["diff", "preview"] // available when current mode is "diff" or "prefs" }, // "prefs" mode only { action: "savePrefs", label: "Update", flags: ["primary", "progressive"], modes: "prefs" }, { action: "closePrefs", label: "Cancel", flags: "safe", modes: "prefs" }];

// Customize the initialize function: This is where to add content to the dialog body and set up event handlers. MainWindow.prototype.initialize = function { // Call the parent method. MainWindow["super"].prototype.initialize.call(this);

/* --- PREFS --- */ this.preferences = _config["default"].defaultPrefs;

/* --- TOP BAR --- */ this.topBar = new _TopBarWidget["default"]({   $overlay: this.$overlay  }); this.$head.css({   "height": "73px"  }).append(this.topBar.$element);

/* --- FOOTER --- */ this.oresLabel = new OO.ui.LabelWidget({   $element: $(" "),    label: $(" ").append($("<a>").attr({      "href": mw.util.getUrl("mw:ORES"),      "target": "_blank"    }).append($(" ").css({ "vertical-align": "text-bottom;" }).attr({ "src": "//upload.wikimedia.org/wikipedia/commons/thumb/5/51/Objective_Revision_Evaluation_Service_logo.svg/40px-Objective_Revision_Evaluation_Service_logo.svg.png", "title": "Machine predicted quality from ORES", "alt": "ORES logo", "width": "20px", "height": "20px" })), " ", $(" ")) }).toggle(false); this.pagetypeLabel = new OO.ui.LabelWidget({   $element: $(" ")  }).toggle(false); this.$foot.prepend(this.oresLabel.$element, this.pagetypeLabel.$element);

/* --- CONTENT AREA --- */

// Banners added dynamically upon opening, so just need a layout with an empty list this.bannerList = new _BannerListWidget["default"]({   preferences: this.preferences  }); this.editLayout = new OO.ui.PanelLayout({   padded: false,    expanded: false,    $content: this.bannerList.$element  });

// Preferences, filled in with current prefs upon loading. // TODO: Make this into a component, add fields and inputs this.prefsForm = new _PrefsFormWidget["default"]; this.prefsLayout = new OO.ui.PanelLayout({   padded: true,    expanded: false,    $content: this.prefsForm.$element  });

// Preview, Show changes this.parsedContentContainer = new OO.ui.FieldsetLayout({   label: "Preview"  }); this.parsedContentWidget = new OO.ui.LabelWidget({   label: "",    $element: $(" ")  }); this.parsedContentContainer.addItems([new OO.ui.FieldLayout(this.parsedContentWidget, { align: "top" })]); this.parsedContentLayout = new OO.ui.PanelLayout({    padded: true,    expanded: false,    $content: this.parsedContentContainer.$element  }); this.contentArea = new OO.ui.StackLayout({   items: [this.editLayout, this.prefsLayout, this.parsedContentLayout],    padded: false,    expanded: false  }); this.$body.css({   "top": "73px"  }).append(this.contentArea.$element);

/* --- EVENT HANDLING --- */

this.topBar.connect(this, {   "searchSelect": "onSearchSelect",    "setClasses": "onSetClasses",    "setImportances": "onSetImportances",    "removeAll": "onRemoveAll",    "clearAll": "onClearAll"  }); this.bannerList.connect(this, {   "updatedSize": "onBannerListUpdateSize"  });

// Handle certain keyboard events. Requires something in the Rater window to be focused, // so add a tabindex to the body and it's parent container. this.$body.attr("tabindex", "999").parent.attr("tabindex", "999").keydown(function (event) {   var scrollAmount;    switch (event.which) {      case 33:        // page up        scrollAmount = this.$body.scrollTop - this.$body.height * 0.9;        break;      case 34:        // page down        scrollAmount = this.$body.scrollTop + this.$body.height * 0.9;        break;      default:        return;    }    this.$body.scrollTop(scrollAmount);    event.preventDefault;  }.bind(this)); this.prefsForm.connect(this, {   "resetCache": "onResetCache"  }); }; MainWindow.prototype.onBannerListUpdateSize = function { // Get the current scroll amount var scrollAmount = this.$body.scrollTop; // Update size (which resets the scroll to 0) this.updateSize; // Scroll to where it was before this.$body.scrollTop(scrollAmount); }; MainWindow.prototype.makeDraggable = function { var $frameEl = this.$element.find(".oo-ui-window-frame"); var $handleEl = this.$element.find(".oo-ui-processDialog-location").css({   "cursor": "move"  }); // Position for css translate transformations, relative to initial position // (which is centered on viewport when scrolled to top) var position = { x: 0, y: 0 }; var constrain = function constrain(val, minVal, maxVal) { if (val < minVal) return minVal; if (val > maxVal) return maxVal; return val; }; var constrainX = function constrainX(val) { // Don't too far horizontally (leave at least 100px visible) var limit = window.innerWidth / 2 + $frameEl.outerWidth / 2 - 100; return constrain(val, -1 * limit, limit); }; var constrainY = function constrainY(val) { // Can't take title bar off the viewport, since it's the drag handle var minLimit = -1 * (window.innerHeight - $frameEl.outerHeight) / 2; // Don't go too far down the page: (whole page height) - (initial position) var maxLimit = (document.documentElement || document).scrollHeight - window.innerHeight / 2; return constrain(val, minLimit, maxLimit); }; var pointerdown = false; var dragFrom = {}; var onDragStart = function onDragStart(event) { pointerdown = true; dragFrom.x = event.clientX; dragFrom.y = event.clientY; }; var onDragMove = function onDragMove(event) { if (!pointerdown || dragFrom.x == null || dragFrom.y === null) { return; }   var dx = event.clientX - dragFrom.x;    var dy = event.clientY - dragFrom.y;    dragFrom.x = event.clientX; dragFrom.y = event.clientY; position.x = constrainX(position.x + dx); position.y = constrainY(position.y + dy); $frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)")); }; var onDragEnd = function onDragEnd { pointerdown = false; delete dragFrom.x;   delete dragFrom.y;    // Make sure final positions are whole numbers position.x = Math.round(position.x); position.y = Math.round(position.y); $frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)")); };

// Use pointer events if available; otherwise use mouse events var pointer = "PointerEvent" in window ? "pointer" : "mouse"; $handleEl.on(pointer + "enter.raterMainWin", function {    return $frameEl.css("will-change", "transform");  }); // Tell browser to optimise transform $handleEl.on(pointer + "leave.raterMainWin", function {    if (!pointerdown) $frameEl.css("will-change", "");  }); // Remove optimisation if not dragging $handleEl.on(pointer + "down.raterMainWin", onDragStart); $("body").on(pointer + "move.raterMainWin", onDragMove); $("body").on(pointer + "up.raterMainWin", onDragEnd); };

// Override the getBodyHeight method to specify a custom height MainWindow.prototype.getBodyHeight = function { var currentlayout = this.contentArea.getCurrentItem; var layoutHeight = currentlayout && currentlayout.$element.outerHeight(true); var contentHeight = currentlayout && currentlayout.$element.children(":first-child").outerHeight(true); return Math.max(200, layoutHeight, contentHeight); };

// Use getSetupProcess to set up the window with data passed to it at the time // of opening MainWindow.prototype.getSetupProcess = function (data) { var _this = this; data = data || {}; return MainWindow["super"].prototype.getSetupProcess.call(this, data).next(function {    _this.makeDraggable;    // Set up preferences    _this.setPreferences(data.preferences);    _this.prefsForm.setPrefValues(data.preferences);    // Set subject page info    _this.subjectPage = data.subjectPage;    _this.pageInfo = {      redirect: data.redirectTarget,      isDisambig: data.disambig,      hasStubtag: data.stubtag,      isArticle: data.isArticle    };    // Set up edit mode banners    _this.actions.setMode("edit");    _this.bannerList.oresClass = data.isArticle && data.isList ? "List" : data.ores && data.ores.prediction;    _this.bannerList.pageInfo = _this.pageInfo;    _this.bannerList.addItems(data.banners.map(function (bannerTemplate) {      return new _BannerWidget["default"](bannerTemplate, { preferences: _this.preferences, $overlay: _this.$overlay, isArticle: _this.pageInfo.isArticle });   }));    var shellTemplateBanner = _this.bannerList.items.find(function (banner) { return banner.isShellTemplate; });   if (shellTemplateBanner && shellTemplateBanner.shellParam1Value) {      shellTemplateBanner.nonStandardTemplates = _this.bannerList.items.reduce(function (bannersList, curBanner) { return bannersList.replace(curBanner.wikitext, ""); }, shellTemplateBanner.shellParam1Value).trim.replace(/\n+/g, "\n");   }    _this.bannerList.addShellTemplateIfNeeeded.syncShellTemplateWithBiographyBanner;    // Show page type, or ORES prediction, if available    if (_this.pageInfo.redirect) {      _this.pagetypeLabel.setLabel("Redirect page").toggle(true);    } else if (_this.pageInfo.isDisambig) {      _this.pagetypeLabel.setLabel("Disambiguation page").toggle(true);    } else if (_this.pageInfo.isArticle && data.isGA) {      _this.pagetypeLabel.setLabel("Good article").toggle(true);    } else if (_this.pageInfo.isArticle && data.isFA) {      _this.pagetypeLabel.setLabel("Featured article").toggle(true);    } else if (_this.pageInfo.isArticle && data.isFL) {      _this.pagetypeLabel.setLabel("Featured list").toggle(true);    } else if (_this.pageInfo.isArticle && data.isList) {      _this.pagetypeLabel.setLabel("List article").toggle(true); } else if (data.ores) { _this.oresClass = data.ores.prediction; _this.oresLabel.toggle(true).$element.find(".oresPrediction").append("Prediction: ", $(" ").text(data.ores.prediction), " (" + data.ores.probability + ")"); } else if (_this.pageInfo.isArticle) { _this.pagetypeLabel.setLabel("Article page").toggle(true); } else { _this.pagetypeLabel.setLabel(_this.subjectPage.getNamespacePrefix.slice(0, -1) + " page").toggle(true); }   // Set props for use in making wikitext and edit summaries _this.talkWikitext = data.talkWikitext; _this.existingBannerNames = data.banners.map(function (bannerTemplate) {     return bannerTemplate.name;    }); _this.talkpage = data.talkpage; // Force a size update to ensure eveything fits okay _this.updateSize; }, this); };

// Set up the window it is ready: attached to the DOM, and opening animation completed MainWindow.prototype.getReadyProcess = function (data) { var _this2 = this; data = data || {}; return MainWindow["super"].prototype.getReadyProcess.call(this, data).next(function {    return _this2.topBar.searchBox.focus;  }); };

// Use the getActionProcess method to do things when actions are clicked MainWindow.prototype.getActionProcess = function (action) { var _this3 = this; if (action === "showPrefs") { this.actions.setMode("prefs"); this.contentArea.setItem(this.prefsLayout); this.topBar.setDisabled(true); this.updateSize; } else if (action === "savePrefs") { var updatedPrefs = this.prefsForm.getPrefs; return new OO.ui.Process.next((0, _prefs.setPrefs)(updatedPrefs).then( // Success function { _this3.setPreferences(updatedPrefs); _this3.actions.setMode("edit"); _this3.contentArea.setItem(_this3.editLayout); _this3.topBar.setDisabled(false); _this3.updateSize; },   // Failure function (code, err) { return $.Deferred.reject(new OO.ui.Error($(" ").append($("<strong style='display:block;'>").text("Could not save preferences."), $(" ").text((0, _api.makeErrorMsg)(code, err))))); })); } else if (action === "clearCache") { return new OO.ui.Process.next(function {      cache.clearAllItems;      _this3.close({ restart: true });   });  } else if (action === "closePrefs") { this.actions.setMode("edit"); this.contentArea.setItem(this.editLayout); this.topBar.setDisabled(false); this.prefsForm.setPrefValues(this.preferences); this.updateSize; } else if (action === "save") { return new OO.ui.Process.next(_api["default"].editWithRetry(this.talkpage.getPrefixedText, { rvsection: 0 }, function (revision) { return { section: 0, text: _this3.transformTalkWikitext(revision.content), summary: _this3.makeEditSummary, watchlist: _this3.preferences.watchlist };   })["catch"](function (code, err) { return $.Deferred.reject(new OO.ui.Error($(" ").append($("<strong style='display:block;'>").text("Could not save your changes."), $(" ").text((0, _api.makeErrorMsg)(code, err))))); })).next(function {      return _this3.close({ success: true, upgradedStub: _this3.pageInfo.hasStubtag && _this3.isRatedAndNotStub });   });  } else if (action === "preview") { return new OO.ui.Process.next(_api["default"].post({ action: "parse", contentmodel: "wikitext", text: this.transformTalkWikitext(this.talkWikitext) + "\n \n" + "Edit summary: " + this.makeEditSummary, title: this.talkpage.getPrefixedText, pst: 1 }).then(function (result) { if (!result || !result.parse || !result.parse.text || !result.parse.text["*"]) { return $.Deferred.reject("Empty result"); }     var previewHtmlSnippet = new OO.ui.HtmlSnippet(result.parse.text["*"]); _this3.parsedContentWidget.setLabel(previewHtmlSnippet); _this3.parsedContentContainer.setLabel("Preview:"); _this3.actions.setMode("preview"); _this3.contentArea.setItem(_this3.parsedContentLayout); _this3.topBar.setDisabled(true); _this3.updateSize; })["catch"](function (code, err) { return $.Deferred.reject(new OO.ui.Error($(" ").append($("<strong style='display:block;'>").text("Could not show changes."), $(" ").text((0, _api.makeErrorMsg)(code, err))))); })); } else if (action === "changes") { return new OO.ui.Process.next(_api["default"].post({ action: "compare", format: "json", fromtext: this.talkWikitext, fromcontentmodel: "wikitext", totext: this.transformTalkWikitext(this.talkWikitext), tocontentmodel: "wikitext", prop: "diff" }).then(function (result) { if (!result || !result.compare || !result.compare["*"]) { return $.Deferred.reject("Empty result"); }     var $diff = $(" ").addClass("diff").css("width", "100%").append($(" ").append($(" ").attr({        "colspan": "2",        "scope": "col"      }).css("width", "50%").text("Latest revision"), $(" ").attr({        "colspan": "2",        "scope": "col"      }).css("width", "50%").text("New text")), result.compare["*"], $(" ").append($(" ").append($("<td colspan='4'>").append($(" ").text("Edit summary: "), _this3.makeEditSummary)))); _this3.parsedContentWidget.setLabel($diff); _this3.parsedContentContainer.setLabel("Changes:"); _this3.actions.setMode("diff"); _this3.contentArea.setItem(_this3.parsedContentLayout); _this3.topBar.setDisabled(true); _this3.updateSize; })["catch"](function (code, err) { return $.Deferred.reject(new OO.ui.Error($(" ").append($("<strong style='display:block;'>").text("Could not show changes."), $(" ").text((0, _api.makeErrorMsg)(code, err))))); })); } else if (action === "back") { this.actions.setMode("edit"); this.contentArea.setItem(this.editLayout); this.topBar.setDisabled(false); this.updateSize; } else if (!action && this.bannerList.changed) { // Confirm closing of dialog if there have been changes return new OO.ui.Process.next(OO.ui.confirm("Changes made will be discarded.", { title: "Close Rater?" }).then(function (confirmed) { return confirmed ? _this3.close : null; })); }  return MainWindow["super"].prototype.getActionProcess.call(this, action); };

// Use the getTeardownProcess method to perform actions whenever the dialog is closed. // `data` is the data passed into the window's .close method. MainWindow.prototype.getTeardownProcess = function (data) { var _this4 = this; return MainWindow["super"].prototype.getTeardownProcess.call(this, data).first(function {    _this4.bannerList.clearItems;    _this4.topBar.searchBox.setValue("");    _this4.contentArea.setItem(_this4.editLayout);    _this4.topBar.setDisabled(false);    _this4.oresLabel.toggle(false).$element.find(".oresPrediction").empty;    _this4.pagetypeLabel.toggle(false).setLabel("");    _this4.$element.find(".oo-ui-window-frame").css("transform", "");    _this4.$element.find(".oo-ui-processDialog-location").off(".raterMainWin");    $("body").off(".raterMainWin");  }); }; MainWindow.prototype.setPreferences = function (prefs) { this.preferences = $.extend({}, _config["default"].defaultPrefs, prefs); // Applies preferences to existing items in the window: this.bannerList.setPreferences(this.preferences); }; MainWindow.prototype.onResetCache = function { this.executeAction("clearCache"); }; MainWindow.prototype.onSearchSelect = function (data) { var _this5 = this; this.topBar.searchBox.pushPending; var name = this.topBar.searchBox.getValue.trim; if (!name) { this.topBar.searchBox.popPending.focus; return; } var existingBanner = this.bannerList.items.find(function (banner) {    return banner.mainText === name || banner.redirectTargetMainText === name;  });

// Abort and show alert if banner already exists if (existingBanner) { this.topBar.searchBox.popPending; return OO.ui.alert("There is already a banner").then(this.searchBox.focus); }

// Confirmation required for banners missing WikiProject from name, and for uncreated disambiguation talk pages var confirmText; if (!/^[Ww](?:P|iki[Pp]roject)/.test(name)) { confirmText = new OO.ui.HtmlSnippet(" is not a recognised WikiProject banner. Do you want to continue?"); } else if (name === "WikiProject Disambiguation" && $("#ca-talk.new").length !== 0 && this.bannerList.items.length === 0) { // eslint-disable-next-line no-useless-escape confirmText = "New talk pages shouldn't be created if they will only contain the \{\{WikiProject Disambiguation\}\} banner. Continue?"; } $.when(confirmText ? OO.ui.confirm(confirmText) : true).then(function (confirmed) {    if (!confirmed) return;    // Create Template object    return _BannerWidget["default"].newFromTemplateName(name, data, { preferences: _this5.preferences, $overlay: _this5.$overlay, isArticle: _this5.pageInfo.isArticle }).then(function (banner) { _this5.bannerList.addItems([banner]); banner.setChanged; _this5.updateSize; }); }).then(function  {    return _this5.topBar.searchBox.setValue("").focus.popPending;  }); }; MainWindow.prototype.onSetClasses = function (classVal) { var shellTemplate = this.bannerList.items.find(function (banner) {   return banner.isShellTemplate;  }); if (shellTemplate) { shellTemplate.classDropdown.getMenu.selectItemByData(classVal); shellTemplate.classDropdown.setAutofilled(false); } this.bannerList.items.forEach(function (banner) {    if (banner.hasClassRatings && !banner.isShellTemplate) {      banner.classDropdown.getMenu.selectItemByData(shellTemplate ? null : classVal);     banner.classDropdown.setAutofilled(false);    }  }); }; MainWindow.prototype.onSetImportances = function (importanceVal) { this.bannerList.items.forEach(function (banner) {   if (banner.hasImportanceRatings) {      banner.importanceDropdown.getMenu.selectItemByData(importanceVal);      banner.importanceDropdown.setAutofilled(false);    }  }); }; MainWindow.prototype.onRemoveAll = function { this.bannerList.clearItems; }; MainWindow.prototype.onClearAll = function { this.bannerList.items.forEach(function (banner) {   return banner.onClearButtonClick;  }); }; MainWindow.prototype.transformTalkWikitext = function (talkWikitext) { var _this6 = this; var bannersWikitext = this.bannerList.makeWikitext; if (!talkWikitext) { return bannersWikitext.trim; } // Reparse templates, in case talkpage wikitext has changed var talkTemplates = (0, _Template.parseTemplates)(talkWikitext, true); // replace existing banners wikitext with a control character talkTemplates.forEach(function (template) {   if (_this6.existingBannerNames.includes(template.name)) {      talkWikitext = talkWikitext.replace(template.wikitext, "\x01");    }  }); // replace insertion point (first control character) with a different control character talkWikitext = talkWikitext.replace("\x01", "\x02"); // remove other control characters /* eslint-disable-next-line no-control-regex */ talkWikitext = talkWikitext.replace(/(?:\s|\n)*\x01(?:\s|\n)*/g, ""); // split into wikitext before/after the remaining control character (and trim each section) var talkWikitextSections = talkWikitext.split("\x02").map(function (t) {   return t.trim;  }); if (talkWikitextSections.length === 2) { // Found the insertion point for the banners return (talkWikitextSections[0] + "\n" + bannersWikitext.trim + "\n" + talkWikitextSections[1]).trim; } // Check if there's anything beside templates var tempStr = talkWikitext; talkTemplates.forEach(function (template) {   tempStr = tempStr.replace(template.wikitext, "");  }); if (/^#REDIRECT/i.test(talkWikitext) || !tempStr.trim) { // Is a redirect, or everything is a template: insert at the end return talkWikitext.trim + "\n" + bannersWikitext.trim; } else { // There is non-template content, so insert at the start return bannersWikitext.trim + "\n" + talkWikitext.trim; } }; MainWindow.prototype.isRatedAndNotStub = function { var nonStubRatinggs = this.bannerList.items.filter(function (banner) {   return banner.hasClassRatings && banner.classDropdown.getValue && banner.classDropdown.getValue !== "Stub";  }); return nonStubRatinggs.length > 0; }; MainWindow.prototype.makeEditSummary = function { var _this7 = this; var removedBanners = []; var editedBanners = []; var newBanners = []; var shortName = function shortName(name) { return name.replace("WikiProject ", "").replace("Subst:", ""); };

// Overall class/importance, if all the same var allClasses = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) { return banner.hasClassRatings || banner.isShellTemplate; }, function (banner) { return banner.classDropdown.getValue; })); var overallClass = allClasses.length === 1 && allClasses[0]; var allImportances = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) { return banner.hasImportanceRatings; }, function (banner) { return banner.importanceDropdown.getValue; })); var overallImportance = allImportances.length === 1 && allImportances[0]; // Don't use them unless some have changed var someClassesChanged = false; var someImportancesChanged = false;

// removed banners: this.existingBannerNames.forEach(function (name) {   var banner = _this7.bannerList.items.find(function (banner) { return banner.name === name || banner.bypassedName === name; });   if (!banner) {      removedBanners.push("−" + shortName(name));    }  }); // edited & new banners this.bannerList.items.forEach(function (banner) {   var isNew = !banner.wikitext; // not added from wikitext on page    if (!isNew && !banner.changed) {      // Not changed      return;    }    var newClass = banner.hasClassRatings && (isNew || banner.classChanged) && banner.classDropdown.getValue;    if (newClass) {      someClassesChanged = true;    }    if (overallClass) {      newClass = null;    }    var newImportance = banner.hasImportanceRatings && (isNew || banner.importanceChanged) && banner.importanceDropdown.getValue;    if (newImportance) {      someImportancesChanged = true;    }    if (overallImportance) {      newImportance = null;    }    var rating = newClass && newImportance ? newClass + "/" + newImportance : newClass || newImportance || "";    if (rating) {      rating = " (" + rating + ")";    }    if (isNew) {      newBanners.push("+" + shortName(banner.name) + rating); } else { editedBanners.push(shortName(banner.name) + rating); } });  // overall rating  var overallRating = someClassesChanged && overallClass && someImportancesChanged && overallImportance ? overallClass + "/" + overallImportance : someClassesChanged && overallClass || someImportancesChanged && overallImportance || "";  if (overallRating) {    overallRating = " (" + overallRating + ")";  }  return "Assessment".concat(overallRating, ": ").concat([].concat(editedBanners, newBanners, removedBanners).join(", ")).concat(_config["default"].script.advert); }; var _default = MainWindow; // exports["default"] = _default;

},{"../Template":3,"../api":15,"../cache":17,"../config":18,"../prefs":21,"../util":23,"./Components/BannerListWidget":4,"./Components/BannerWidget":5,"./Components/PrefsFormWidget":10,"./Components/TopBarWidget":12}],15:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports.makeErrorMsg = exports["default"] = void 0; var _config = _interopRequireDefault(require("./config")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } //

var API = new mw.Api({ ajax: {    headers: {      "Api-User-Agent": "Rater/" + _config["default"].script.version + " ( https://en.wikipedia.org/wiki/User:Evad37/Rater )"    }  } });

/* -- API for ORES -- */ API.getORES = function (revisionID) { return $.get("https://ores.wikimedia.org/v3/scores/enwiki?models=articlequality&revids=" + revisionID); };

/* -- Raw wikitext -- */ API.getRaw = function (page) { return $.get("https:" + _config["default"].mw.wgServer + mw.util.getUrl(page, { action: "raw" })).then(function (data) {   if (!data) {      return $.Deferred.reject("ok-but-empty");    }    return data;  }); };

/* -- Edit with retry --- */ /** * @param {String} title * @param {Object?} params additional params for the get request * @returns {Promise<Object, string>} page, starttime timestamp */ var getPage = function getPage(title, params) { return API.get($.extend({ "action": "query", "format": "json", "curtimestamp": 1, "titles": title, "prop": "revisions|info", "rvprop": "content|timestamp", "rvslots": "main" }, params)).then(function (response) {   var page = Object.values(response.query.pages)[0];    var starttime = response.curtimestamp;    return $.Deferred.resolve(page, starttime);  }); };

/** * @param {Object} page details object from API * @param {string} starttime timestamp * @param {Function} transform callback that prepares the edit: * {Object} simplifiedPage => {Object|Promise<Object>} edit params * @returns {Promise<Object>} params for edit query */ var processPage = function processPage(page, starttime, transform) { var basetimestamp = page.revisions && page.revisions[0].timestamp; var simplifiedPage = { pageid: page.pageid, missing: page.missing === "", redirect: page.redirect === "", categories: page.categories, ns: page.ns, title: page.title, content: page.revisions && page.revisions[0].slots.main["*"] }; return $.when(transform(simplifiedPage)).then(function (editParams) {    return $.extend({ action: "edit", title: page.title, // Protect against errors and conflicts assert: "user", basetimestamp: basetimestamp, starttimestamp: starttime }, editParams); }); };

/** editWithRetry * * Edits a page, resolving edit conflicts, and retrying edits that fail. The * tranform function may return a rejected promise if the page should not be * edited; the @returns {Promise} will will be rejected with the same rejection * values. * * Note: Unlike [mw.Api#Edit], a missing page will be created, unless the * transform callback includes the "nocreate" param. * * [mw.Api#Edit]: <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api.plugin.edit> * * @param {String} title page to be edited * @param {Object|null} getParams additional params for the get request * @param {Function} transform callback that prepares the edit: * {Object} simplifiedPage => {Object|Promise<Object>} params for API editing * @returns {Promise } promise, resolved on success, rejected if * page was not edited */ API.editWithRetry = function (title, getParams, transform) { return getPage(title, getParams).then( // Succes: process the page  function (page, starttime) {    return processPage(page, starttime, transform);  },  // Failure: try again  function  {    return getPage(title, getParams).then(processPage, transform);  }).then(function (editParams) {    return API.postWithToken("csrf", editParams)["catch"](function (errorCode) { if (errorCode === "editconflict") { // Try again, starting over return API.editWithRetry(title, getParams, transform); }     // Try again return API.postWithToken("csrf", editParams); }); }); }; var makeErrorMsg = function makeErrorMsg(first, second) { var code, xhr, message; if (_typeof(first) === "object" && typeof second === "string") { // Errors from $.get being rejected (ORES & Raw wikitext) var errorObj = first.responseJSON && first.responseJSON.error; if (errorObj) { // Got an api-specific error code/message code = errorObj.code; message = errorObj.message; } else { xhr = first; } } else if (typeof first === "string" && _typeof(second) === "object") { // Errors from mw.Api object var mwErrorObj = second.error; if (mwErrorObj) { // Got an api-specific error code/message code = errorObj.code; message = errorObj.info; } else if (first === "ok-but-empty") { code = null; message = "Got an empty response from the server"; } else { xhr = second && second.xhr; } }  if (code && message) { return "API error ".concat(code, ": ").concat(message); } else if (message) { return "API error: ".concat(message); } else if (xhr) { return "HTTP error ".concat(xhr.status); } else if (typeof first === "string" && first !== "error" && typeof second === "string" && second !== "error") { return "Error ".concat(first, ": ").concat(second); } else if (typeof first === "string" && first !== "error") { return "Error: ".concat(first); } else { return "Unknown API error"; } }; exports.makeErrorMsg = makeErrorMsg; var _default = API; // exports["default"] = _default;

},{"./config":18}],16:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _config = _interopRequireDefault(require("./config")); var _prefs = require("./prefs"); var _api = _interopRequireWildcard(require("./api")); var _setup = _interopRequireDefault(require("./setup")); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

var autoStart = function autoStart { return (0, _prefs.getPrefs).then(function (prefs) {   // Check if pref is turned off    if (!prefs.autostart) {      return;    }    // Check if pref is turned off for redirects, and current page is a redirect    if (!prefs.autostartRedirects && window.location.search.includes("redirect=no")) {      return;    }    // Check if viewing diff/history/old version    if (/(action|diff|oldid)/.test(window.location.search)) {      return;    }    var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage;    // Check if subject page is the main page    if (subjectTitle.getPrefixedText === "Main Page") {      return;    }    // Check subject page namespace    if (prefs.autostartNamespaces && prefs.autostartNamespaces.length && !prefs.autostartNamespaces.includes(_config["default"].mw.wgNamespaceNumber)) {      return;    }

// If talk page does not exist, can just autostart if ($("#ca-talk.new").length) { return (0, _setup["default"]); }

/* Check templates present on talk page. Fetches indirectly transcluded templates, so will find Template:WPBannerMeta (and its subtemplates). But some banners such as MILHIST don't use that meta template, so we also have to check for template titles containg 'WikiProject' */   var talkTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getTalkPage; return _api["default"].get({     action: "query",      format: "json",      prop: "templates",      titles: talkTitle.getPrefixedText,      tlnamespace: "10",      tllimit: "500",      indexpageids: 1    }).then(function (result) {      var id = result.query.pageids;      var templates = result.query.pages[id].templates;      if (!templates) {        return (0, _setup["default"]);      }      var hasWikiproject = templates.some(function (template) { return /(WikiProject|WPBanner)/.test(template.title); });     if (!hasWikiproject) {        return (0, _setup["default"]);      }    }, function (code, jqxhr) {      // Silently ignore failures (just log to console)      console.warn("[Rater] Error while checking whether to autostart." + (code == null) ? "" : " " + (0, _api.makeErrorMsg)(code, jqxhr));     return $.Deferred.reject;    }); }); }; var _default = autoStart; // exports["default"] = _default;

},{"./api":15,"./config":18,"./prefs":21,"./setup":22}],17:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports.clearAllItems = exports.clearInvalidItems = exports.clearItemIfInvalid = exports.read = exports.write = void 0; var _util = require("./util"); //

/** write * @param {String} key * @param {Array|Object} val * @param {Number} staleDays Number of days after which the data becomes stale (usable, but should * be updated for next time). * @param {Number} expiryDays Number of days after which the cached data may be deleted. */ var write = function write(key, val, staleDays, expiryDays) { try { var defaultStaleDays = 1; var defaultExpiryDays = 30; var millisecondsPerDay = 24 * 60 * 60 * 1000; var staleDuration = (staleDays || defaultStaleDays) * millisecondsPerDay; var expiryDuration = (expiryDays || defaultExpiryDays) * millisecondsPerDay; var stringVal = JSON.stringify({     value: val,      staleDate: new Date(Date.now + staleDuration).toISOString,      expiryDate: new Date(Date.now + expiryDuration).toISOString    }); localStorage.setItem("Rater-" + key, stringVal); } catch (e) {} // eslint-disable-line no-empty }; /** read * @param {String} key * @returns {Array|Object|String|Null} Cached array or object, or empty string if not yet cached, *         or null if there was error. */ exports.write = write; var read = function read(key) { var val; try { var stringVal = localStorage.getItem("Rater-" + key); if (stringVal !== "") { val = JSON.parse(stringVal); } } catch (e) { console.log("[Rater] error reading " + key + " from localStorage cache:"); console.log("\t" + e.name + " message: " + e.message + (e.at ? " at: " + e.at : "") + (e.text ? " text: " + e.text : "")); } return val || null; }; exports.read = read; var isRaterKey = function isRaterKey(key) { return key && key.indexOf("Rater-") === 0; }; var clearItemIfInvalid = function clearItemIfInvalid(key) { if (!isRaterKey(key)) { return; } var item = read(key.replace("Rater-", "")); var isInvalid = !item || !item.expiryDate || (0, _util.isAfterDate)(item.expiryDate); if (isInvalid) { localStorage.removeItem(key); } }; exports.clearItemIfInvalid = clearItemIfInvalid; var clearInvalidItems = function clearInvalidItems { // Loop backwards as localStorage length will decrease as items are removed for (var i = localStorage.length; i >= 0; i--) { setTimeout(clearItemIfInvalid, 100, localStorage.key(i)); } }; exports.clearInvalidItems = clearInvalidItems; var clearAllItems = function clearAllItems { // Loop backwards as localStorage length will decrease as items are removed for (var i = localStorage.length; i >= 0; i--) { var key = localStorage.key(i); if (isRaterKey(key)) { localStorage.removeItem(key); } } };

// exports.clearAllItems = clearAllItems;

},{"./util":23}],18:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; // var packagejson = require("../package.json"); var version = packagejson.version;

// A global object that stores all the page and user configuration and settings var config = { // Script info script: { // Advert to append to edit summaries advert: " (Rater)"), version: version }, // Default preferences, if user subpage raterPrefs.json does not exist defaultPrefs: { "autostart": false, "autostartRedirects": false, "autostartNamespaces": [0], "minForShell": 1, "bypassRedirects": true, "autofillClassFromOthers": true, "autofillClassFromOres": true, "autofillImportance": true, "collapseParamsLowerLimit": 6, "watchlist": "preferences" }, // MediaWiki configuration values mw: mw.config.get(["skin", "wgPageName", "wgNamespaceNumber", "wgUserName", "wgFormattedNamespaces", "wgMonthNames", "wgRevisionId", "wgScriptPath", "wgServer", "wgCategories", "wgIsMainPage"]), bannerDefaults: { classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List"], importances: ["Top", "High", "Mid", "Low"], extendedClasses: ["Category", "Draft", "File", "FM", "Portal", "Project", "Template", "Bplus", "Future", "Current", "Disambig", "NA", "Redirect", "Book"], extendedImportances: ["Top", "High", "Mid", "Low", "Bottom", "NA"] }, customBanners: { "WikiProject Military history": { classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List", "AL", "BL", "CL", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect", "Book"], importances: [] },   "WikiProject Portals": { classes: ["FPo", "Complete", "Substantial", "Basic", "Incomplete", "Meta", "List", "Category", "Draft", "File", "Project", "Template", "Disambig", "NA", "Redirect"], importances: ["Top", "High", "Mid", "Low", "Bottom", "NA"] },   "WikiProject Video games": { classes: ["FA", "FL", "FM", "GA", "B", "C", "Start", "Stub", "List", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect"], importances: ["Top", "High", "Mid", "Low", "NA"] } },  shellTemplates: ["WikiProject banner shell", "WikiProjectBanners", "WikiProject Banners", "WPB", "WPBS", "Wikiprojectbannershell", "WikiProject Banner Shell", "Wpb", "WPBannerShell", "Wpbs", "Wikiprojectbanners", "WP Banner Shell", "WP banner shell", "Bannershell", "Wikiproject banner shell", "WikiProject Banners Shell", "WikiProjectBanner Shell", "WikiProjectBannerShell", "WikiProject BannerShell", "WikiprojectBannerShell", "WikiProject banner shell/redirect", "WikiProject Shell", "Banner shell", "Scope shell", "Project shell", "WikiProject banner"], defaultParameterData: { "auto": { "label": { "en": "Auto-rated" },     "description": { "en": "Automatically rated by a bot. Allowed values: ['yes']." },     "autovalue": "yes" },   "listas": { "label": { "en": "List as" },     "description": { "en": "Sortkey for talk page" }   },    "small": { "label": { "en": "Small?" },     "description": { "en": "Display a small version. Allowed values: ['yes']." },     "autovalue": "yes" },   "attention": { "label": { "en": "Attention required?" },     "description": { "en": "Immediate attention required. Allowed values: ['yes']." },     "autovalue": "yes" },   "needs-image": { "label": { "en": "Needs image?" },     "description": { "en": "Request that an image or photograph of the subject be added to the article. Allowed values: ['yes']." },     "aliases": ["needs-photo"], "autovalue": "yes", "suggested": true },   "needs-infobox": { "label": { "en": "Needs infobox?" },     "description": { "en": "Request that an infobox be added to the article. Allowed values: ['yes']." },     "aliases": ["needs-photo"], "autovalue": "yes", "suggested": true } } }; var _default = config; // exports["default"] = _default;

},{"../package.json":1}],19:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; //

// Attribution: Diff styles based on <https://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/style.css> var styles = "table.diff, td.diff-otitle, td.diff-ntitle { table-layout: auto !important;; }\ntd.diff-otitle, td.diff-ntitle { text-align: center; }\ntd.diff-marker { text-align: right; font-weight: bold; font-size: 1.25em; }\ntd.diff-lineno { font-weight: bold; }\ntd.diff-addedline, td.diff-deletedline, td.diff-context { font-size: 88%; vertical-align: top; white-space: -moz-pre-wrap; white-space: pre-wrap; }\ntd.diff-addedline, td.diff-deletedline { border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; }\ntd.diff-addedline { border-color: #a3d3ff; }\ntd.diff-deletedline { border-color: #ffe49c; }\ntd.diff-context { background: #f3f3f3; color: #333333; border-style: solid; border-width: 1px 1px 1px 4px; border-color: #e6e6e6; border-radius: 0.33em; }\n.diffchange { font-weight: bold; text-decoration: none; }\ntable.diff {\n   border: none;\n    width: 98%; border-spacing: 4px;\n    table-layout: fixed; /* Ensures that colums are of equal width */\n}\ntd.diff-addedline .diffchange, td.diff-deletedline .diffchange { border-radius: 0.33em; padding: 0.25em 0; }\ntd.diff-addedline .diffchange {\tbackground: #d8ecff; }\ntd.diff-deletedline .diffchange { background: #feeec8; }\ntable.diff td {\tpadding: 0.33em 0.66em; }\ntable.diff col.diff-marker { width: 2%; }\ntable.diff col.diff-content { width: 48%; }\ntable.diff td div {\n    /* Force-wrap very long lines such as URLs or page-widening char strings. */\n   word-wrap: break-word;\n    /* As fallback (FF<3.5, Opera <10.5), scrollbars will be added for very wide cells\n        instead of text overflowing or widening */\n    overflow: auto;\n}" + // Override OOUI window manager preventing background scrolling/interaction "html body.rater-mainWindow-open {\n\tposition: unset;\n\toverflow: unset;\n}\nhtml body.rater-mainWindow-open .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-active {\n    position: static;\n    padding: 0;\n}" + // Increase z-index, to be above skin menus etc; smooth transition for dragging (transform:translate) "html body.rater-mainWindow-open .oo-ui-dialog.oo-ui-window-active > div {\n    z-index: 110;\n    transition: all 0.25s ease-out 0s, transform 0s !important\n}\n" + // Ensure close dialog is visible "html body.rater-mainWindow-open #mw-teleport-target {\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right:0;\n}\n"; var _default = styles; // exports["default"] = _default;

},{}],20:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.getBannerNames = void 0; var _api = _interopRequireWildcard(require("./api")); var _util = require("./util"); var cache = _interopRequireWildcard(require("./cache")); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } //

var cacheBanners = function cacheBanners(banners) { cache.write("banners", banners, 2, 60); };

/** * Gets banners/options from the Api * * @returns {Promise} Resolved with: banners object, bannerOptions array */ var getListOfBannersFromApi = function getListOfBannersFromApi { var finishedPromise = $.Deferred; var querySkeleton = { action: "query", format: "json", list: "categorymembers", cmprop: "title", cmnamespace: "10", cmlimit: "500" }; var categories = [{ title: "Category:WikiProject banners with quality assessment", abbreviation: "withRatings", banners: [], processed: $.Deferred }, {   title: "Category:WikiProject banners without quality assessment", abbreviation: "withoutRatings", banners: [], processed: $.Deferred }, {   title: "Category:WikiProject banner wrapper templates", abbreviation: "wrappers", banners: [], processed: $.Deferred }, {   title: "Category:WikiProject banner templates not based on WPBannerMeta", abbreviation: "notWPBM", banners: [], processed: $.Deferred }, {   title: "Category:Inactive WikiProject banners", abbreviation: "inactive", banners: [], processed: $.Deferred }, {   title: "Category:Wrapper templates for WikiProject Women in Red", abbreviation: "wir", banners: [], processed: $.Deferred }]; var processQuery = function processQuery(result, catIndex) { if (!result.query || !result.query.categorymembers) { // No results // TODO: error or warning ******** finishedPromise.reject; return; }

// Gather titles into array - excluding "Template:" prefix var resultTitles = result.query.categorymembers.map(function (info) {     return info.title.slice(9);    }); Array.prototype.push.apply(categories[catIndex].banners, resultTitles);

// Continue query if needed if (result["continue"]) { doApiQuery($.extend(categories[catIndex].query, result["continue"]), catIndex); return; }   categories[catIndex].processed.resolve; }; var doApiQuery = function doApiQuery(q, catIndex) { _api["default"].get(q).done(function (result) {     processQuery(result, catIndex);    }).fail(function (code, jqxhr) {      console.warn("[Rater] " + (0, _api.makeErrorMsg)(code, jqxhr, "Could not retrieve pages from " + q.cmtitle + ""));      finishedPromise.reject;    }); }; categories.forEach(function (cat, index, arr) {    cat.query = $.extend({ "cmtitle": cat.title }, querySkeleton);   $.when(arr[index - 1] && arr[index - 1].processed || true).then(function  { doApiQuery(cat.query, index); }); });  categories[categories.length - 1].processed.then(function  {    var banners = {};    categories.forEach(function (catObject) { banners[catObject.abbreviation] = catObject.banners; });   finishedPromise.resolve(banners);  }); return finishedPromise; };

/** * Gets banners from cache, if there and not too old * * @returns {Promise} Resolved with banners object */ var getBannersFromCache = function getBannersFromCache { var cachedBanners = cache.read("banners"); if (!cachedBanners || !cachedBanners.value || !cachedBanners.staleDate) { return $.Deferred.reject; } if ((0, _util.isAfterDate)(cachedBanners.staleDate)) { // Update in the background; still use old list until then getListOfBannersFromApi.then(cacheBanners); } return $.Deferred.resolve(cachedBanners.value); };

/** * Gets banner names, grouped by type (withRatings, withoutRatings, wrappers, notWPBM) * @returns {Promise<Object>} Object of string arrays keyed by type (withRatings, withoutRatings, wrappers, notWPBM) */ var getBannerNames = function getBannerNames { return getBannersFromCache.then(function (banners) {   // Ensure all keys exist    if (!banners.withRatings || !banners.withoutRatings || !banners.wrappers || !banners.notWPBM || !banners.inactive || !banners.wir) {      getListOfBannersFromApi.then(cacheBanners);      return $.extend({ withRatings: [], withoutRatings: [], wrappers: [], notWPBM: [], inactive: [], wir: [] }, banners);   }    // Success: pass through    return banners;  })["catch"](function  {    // Failure: get from Api, then cache them    var bannersPromise = getListOfBannersFromApi;    bannersPromise.then(cacheBanners);    return bannersPromise;  }); };

// exports.getBannerNames = getBannerNames;

},{"./api":15,"./cache":17,"./util":23}],21:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.setPrefs = exports.getPrefs = exports["default"] = void 0; var _api = _interopRequireDefault(require("./api")); var _util = require("./util"); var _config = _interopRequireDefault(require("./config")); var cache = _interopRequireWildcard(require("./cache")); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

var prefsPage = "User:".concat(mw.config.get("wgUserName"), "/raterPrefs.json"); var writePrefsToCache = function writePrefsToCache(prefs) { return cache.write("prefs", prefs, 1 / 24 / 60 * 1, // 1 min  1 / 24 / 60 * 1 // 1 min  ); }; var getPrefsFromApi = function getPrefsFromApi { return _api["default"].get({   "action": "query",    "format": "json",    "prop": "revisions",    "titles": prefsPage,    "rvprop": "content",    "rvslots": "main"  }).then(function (response) {    var page = response.query.pages[Object.keys(response.query.pages)[0]];    if (!page.pageid || page.missing === "") {      return _config["default"].defaultPrefs;    }    var prefs;    try {      prefs = JSON.parse(page.revisions[0].slots.main["*"]);    } catch (e) {      return $.Deferred.reject("JSON-parsing-error", e);    }    writePrefsToCache(prefs);    return prefs;  }); }; var getPrefsFromCache = function getPrefsFromCache { var cachedPrefs = cache.read("prefs"); if (!cachedPrefs || !cachedPrefs.value || !cachedPrefs.staleDate || (0, _util.isAfterDate)(cachedPrefs.staleDate)) { // No cached value, or is too old return $.Deferred.reject; } return $.Deferred.resolve(cachedPrefs.value); }; var getPrefs = function getPrefs { return getPrefsFromCache.then( // Success: pass through (first param only)  function (prefs) {    return $.Deferred.resolve(prefs);  },  // Failure: get from Api  function  {    return getPrefsFromApi;  }); };

/** * * @param {Object} updatedPrefs object with key:value pairs for preferences json. */ exports.getPrefs = getPrefs; var setPrefs = function setPrefs(updatedPrefs) { return _api["default"].editWithRetry(prefsPage, null, function {    return {      "text": JSON.stringify(updatedPrefs),      "summary": "Saving Rater preferences " + _config["default"].script.advert    };  }).then(function  {    return writePrefsToCache(updatedPrefs);  }); }; exports.setPrefs = setPrefs; var _default = { get: getPrefs, set: setPrefs }; // exports["default"] = _default;

},{"./api":15,"./cache":17,"./config":18,"./util":23}],22:[function(require,module,exports){ "use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _config = _interopRequireDefault(require("./config")); var _api = _interopRequireDefault(require("./api")); var _Template = require("./Template"); var _getBanners = require("./getBanners"); var cache = _interopRequireWildcard(require("./cache")); var _windowManager = _interopRequireDefault(require("./windowManager")); var _prefs = require("./prefs"); var _util = require("./util"); function _getRequireWildcardCache { if (typeof WeakMap !== "function") return null; var cache = new WeakMap; _getRequireWildcardCache = function _getRequireWildcardCache { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache; if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

var setupRater = function setupRater(clickEvent) { if (clickEvent) { clickEvent.preventDefault; } var setupCompletedPromise = $.Deferred; var currentPage = mw.Title.newFromText(_config["default"].mw.wgPageName); var talkPage = currentPage && currentPage.getTalkPage; var subjectPage = currentPage && currentPage.getSubjectPage; var subjectIsArticle = _config["default"].mw.wgNamespaceNumber <= 1;

// Get preferences (task 0) var prefsPromise = (0, _prefs.getPrefs);

// Get lists of all banners (task 1) var bannersPromise = (0, _getBanners.getBannerNames);

// Load talk page (task 2) var loadTalkPromise = _api["default"].get({   action: "query",    prop: "revisions",    rvprop: "content",    rvsection: "0",    titles: talkPage.getPrefixedText,    indexpageids: 1  }).then(function (result) {    var id = result.query.pageids;    var wikitext = id < 0 ? "" : result.query.pages[id].revisions[0]["*"];    return wikitext;  });

// Parse talk page for banners (task 3) var parseTalkPromise = loadTalkPromise.then(function (wikitext) {   return (0, _Template.parseTemplates)(wikitext, true);  }) // Get all templates .then(function (templates) {   return templates.filter(function (template) { return template.getTitle !== null; }); }) // Filter out invalid templates (e.g. parser functions) .then(function (templates) {   return (0, _Template.getWithRedirectTo)(templates);  }) // Check for redirects .then(function (templates) {   return bannersPromise.then(function (allBanners) { // Get list of all banner templates return (0, _util.filterAndMap)(templates,     // Filter out non-banners      function (template) {        if (template.isShellTemplate) {          return true;        }        var mainText = template.redirectTarget ? template.redirectTarget.getMainText : template.getTitle.getMainText;        return allBanners.withRatings.includes(mainText) || allBanners.withoutRatings.includes(mainText) || allBanners.wrappers.includes(mainText) || allBanners.notWPBM.includes(mainText) || allBanners.inactive.includes(mainText) || allBanners.wir.includes(mainText);      },      // Set additional properties if needed      function (template) {        var mainText = template.redirectTarget ? template.redirectTarget.getMainText : template.getTitle.getMainText;        if (allBanners.wrappers.includes(mainText)) {          template.redirectTarget = mw.Title.newFromText("Template:Subst:" + mainText); }       if (allBanners.withoutRatings.includes(mainText) || allBanners.wir.includes(mainText)) { template.withoutRatings = true; }       if (allBanners.inactive.includes(mainText)) { template.inactiveProject = true; }       return template; });   });  });

// Retrieve and store classes, importances, and TemplateData (task 4) var templateDetailsPromise = parseTalkPromise.then(function (templates) {   // Wait for all promises to resolve    return $.when.apply(null, [].concat(_toConsumableArray(templates.map(function (template) {      return template.isShellTemplate ? null : template.setClassesAndImportances;    })), _toConsumableArray(templates.map(function (template) {      return template.setParamDataAndSuggestions;    })))).then(function  { // Add missing required/suggested values templates.forEach(function (template) {       return template.addMissingParams;      }); // Return the now-modified templates return templates; }); });

// Check subject page features (task 5) - but don't error out if request fails var subjectPageCheckPromise = _api["default"].get({   action: "query",    format: "json",    formatversion: "2",    prop: "categories",    titles: subjectPage.getPrefixedText,    redirects: 1,    clcategories: ["Category:All disambiguation pages", "Category:All stub articles", "Category:Good articles", "Category:Featured articles", "Category:Featured lists"]  }).then(function (response) {    if (!response || !response.query || !response.query.pages) {      return null;    }    var redirectTarget = response.query.redirects && response.query.redirects[0].to || false;    if (redirectTarget || !subjectIsArticle) {      return {        redirectTarget: redirectTarget      };    }    var page = response.query.pages[0];    var hasCategory = function hasCategory(category) {      return page.categories && page.categories.find(function (cat) { return cat.title === "Category:" + category; });   };    return {      redirectTarget: redirectTarget,      disambig: hasCategory("All disambiguation pages"),      stubtag: hasCategory("All stub articles"),      isGA: hasCategory("Good articles"),      isFA: hasCategory("Featured articles"),      isFL: hasCategory("Featured lists"),      isList: !hasCategory("Featured lists") && /^Lists? of/.test(subjectPage.getPrefixedText)    };  })["catch"](function  {    return null;  }); // Failure ignored

// Retrieve rating from ORES (task 6, only needed for articles) - but don't error out if request fails var shouldGetOres = subjectIsArticle; // TODO: Don't need to get ORES for redirects or disambigs if (shouldGetOres) { var latestRevIdPromise = !currentPage.isTalkPage ? $.Deferred.resolve(_config["default"].mw.wgRevisionId) : _api["default"].get({     action: "query",      format: "json",      prop: "revisions",      titles: subjectPage.getPrefixedText,      rvprop: "ids",      indexpageids: 1    }).then(function (result) {      if (result.query.redirects) {        return false;      }      var id = result.query.pageids;      var page = result.query.pages[id];      if (page.missing === "") {        return false;      }      if (id < 0) {        return $.Deferred.reject;      }      return page.revisions[0].revid;    }); var oresPromise = latestRevIdPromise.then(function (latestRevId) {     if (!latestRevId) {        return false;      }      return _api["default"].getORES(latestRevId).then(function (result) { var data = result.enwiki.scores[latestRevId].articlequality; if (data.error) { return $.Deferred.reject(data.error.type, data.error.message); }       var prediction = data.score.prediction; var probabilities = data.score.probability; if (prediction === "FA" || prediction === "GA") { return { prediction: "B or higher", probability: ((probabilities.FA + probabilities.GA + probabilities.B) * 100).toFixed(1) + "%" };       }        return { prediction: prediction, probability: (probabilities[prediction] * 100).toFixed(1) + "%" };     })["catch"](function  { return null; }); // Failure ignored;   }); }

// Open the load dialog var isOpenedPromise = $.Deferred; var loadDialogWin = _windowManager["default"].openWindow("loadDialog", {   promises: [bannersPromise, loadTalkPromise, parseTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise],    ores: shouldGetOres,    isOpened: isOpenedPromise  }); loadDialogWin.opened.then(isOpenedPromise.resolve); $.when(prefsPromise, loadTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise).then( // All succeded  function (preferences, talkWikitext, banners, subjectPageCheck, oresPredicition) {    var result = {      success: true,      talkpage: talkPage,      subjectPage: subjectPage,      talkWikitext: talkWikitext,      banners: banners,      preferences: preferences,      isArticle: subjectIsArticle    };    if (subjectPageCheck) {      result = _objectSpread({}, result, {}, subjectPageCheck);    }    if (oresPredicition && subjectPageCheck && !subjectPageCheck.isGA && !subjectPageCheck.isFA && !subjectPageCheck.isFL) {      result.ores = oresPredicition;    }    _windowManager["default"].closeWindow("loadDialog", result);  }); // Any failures are handled by the loadDialog window itself

// On window closed, check data, and resolve/reject setupCompletedPromise loadDialogWin.closed.then(function (data) {   if (data && data.success) {      // Got everything needed: Resolve promise with this data      setupCompletedPromise.resolve(data);    } else if (data && data.error) {      // There was an error: Reject promise with error code/info      setupCompletedPromise.reject(data.error.code, data.error.info);    } else {      // Window closed before completion: resolve promise without any data      setupCompletedPromise.resolve(null);    }    cache.clearInvalidItems;  }); return setupCompletedPromise; }; var _default = setupRater; // exports["default"] = _default;

},{"./Template":3,"./api":15,"./cache":17,"./config":18,"./getBanners":20,"./prefs":21,"./util":23,"./windowManager":24}],23:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports.mostFrequent = mostFrequent; exports.uniqueArray = uniqueArray; exports.classMask = classMask; exports.importanceMask = importanceMask; exports.normaliseYesNo = exports.filterAndMap = exports.isAfterDate = void 0; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread; } function _nonIterableSpread { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator] method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } //

// Various utility functions and objects that might be used in multiple places

var isAfterDate = function isAfterDate(dateString) { return new Date(dateString) < new Date; }; exports.isAfterDate = isAfterDate; var yesWords = ["add", "added", "affirm", "affirmed", "include", "included", "on", "true", "yes", "y", "1"]; var noWords = ["decline", "declined", "exclude", "excluded", "false", "none", "not", "no", "n", "off", "omit", "omitted", "remove", "removed", "0"]; var normaliseYesNo = function normaliseYesNo(val) { if (val == null) { return val; } var trimmedLcVal = val.trim.toLowerCase; if (yesWords.includes(trimmedLcVal)) { return "yes"; } else if (noWords.includes(trimmedLcVal)) { return "no"; } else { return trimmedLcVal; } };

/** * * @param {Array} array * @param {Function} filterPredicate (currentVal, currentIndex, array) => {boolean} * @param {Function} mapTransform (currentVal, currentIndex, array) => {any} * @returns {Array} */ exports.normaliseYesNo = normaliseYesNo; var filterAndMap = function filterAndMap(array, filterPredicate, mapTransform) { return array.reduce(function (accumulated, currentVal, currentIndex) {   if (filterPredicate(currentVal, currentIndex, array)) {      return [].concat(_toConsumableArray(accumulated), [mapTransform(currentVal, currentIndex, array)]);    }    return accumulated;  }, []); };

/** * * @param {string[]|number[]} array * @returns {string|null} item with the highest frequency * e.g. `mostFrequent(["apple", "apple", "orange"])` returns `"apple"` */ exports.filterAndMap = filterAndMap; function mostFrequent(array) { if (!array || !Array.isArray(array) || array.length === 0) return null; var map = {}; var mostFreq = null; array.forEach(function (item) {   map[item] = (map[item] || 0) + 1;    if (mostFreq === null || map[item] > map[mostFreq]) {      mostFreq = item;    }  }); return mostFreq; }

/** * * @param {string[]|number[]} array * @returns {string[]|number[]} array with only unique values * e.g. `uniqueArray(["apple", "apple", "orange"])` returns `["apple", "orange"]` */ function uniqueArray(array) { if (!array || !Array.isArray(array) || array.length === 0) return []; var seen = {}; var unique = []; array.forEach(function (item) {   if (!seen[item]) {      unique.push(item);      seen[item] = true;    }  }); return unique; } function classMask(classVal) { if (!classVal) { return classVal; } switch (classVal.toLowerCase) { case "fa": case "fl": case "a": case "ga": case "b": case "c": case "na": case "fm": case "al": case "bl": case "cl": return classVal.toUpperCase; case "start": case "stub": case "list": case "portal": case "project": case "draft": case "book": case "future": case "current": case "complete": case "substantial": case "basic": case "incomplete": case "meta": return classVal.slice(0, 1).toUpperCase + classVal.slice(1).toLowerCase; case "image": case "img": case "file": return "File"; case "category": case "cat": case "categ": return "Category"; case "disambiguation": case "disambig": case "disamb": case "dab": return "Disambig"; case "redirect": case "redir": case "red": return "Redirect"; case "template": case "temp": case "tpl": return "Template"; case "bplus": case "b+": return "Bplus"; case "fpo": return "FPo"; default: return classVal; } } function importanceMask(importance) { if (!importance) { return importance; } if (importance.toLowerCase === "na") { return "NA"; } return importance.slice(0, 1).toUpperCase + importance.slice(1).toLowerCase; }

//

},{}],24:[function(require,module,exports){ "use strict";

Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _LoadDialog = _interopRequireDefault(require("./Windows/LoadDialog")); var _MainWindow = _interopRequireDefault(require("./Windows/MainWindow")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //

var factory = new OO.Factory;

// Register window constructors with the factory. factory.register(_LoadDialog["default"]); factory.register(_MainWindow["default"]); var manager = new OO.ui.WindowManager({ "factory": factory }); $(document.body).append(manager.$element); var _default = manager; // exports["default"] = _default;

},{"./Windows/LoadDialog":13,"./Windows/MainWindow":14}]},{},[2]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYWNrYWdlLmpzb24iLCJyYXRlci1zcmMvQXBwLmpzIiwicmF0ZXItc3JjL1RlbXBsYXRlLmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL1ByZWZzRm9ybVdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvVG9wQmFyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvTG9hZERpYWxvZy5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL01haW5XaW5kb3cuanMiLCJyYXRlci1zcmMvYXBpLmpzIiwicmF0ZXItc3JjL2F1dG9zdGFydC5qcyIsInJhdGVyLXNyYy9jYWNoZS5qcyIsInJhdGVyLXNyYy9jb25maWcuanMiLCJyYXRlci1zcmMvY3NzLmpzIiwicmF0ZXItc3JjL2dldEJhbm5lcnMuanMiLCJyYXRlci1zcmMvcHJlZnMuanMiLCJyYXRlci1zcmMvc2V0dXAuanMiLCJyYXRlci1zcmMvdXRpbC5qcyIsInJhdGVyLXNyYy93aW5kb3dNYW5hZ2VyLmpzIl0sIm5hbWVz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QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFdBQUEsa0JBQUEsQ0FBQSxHQUFBLEtBQUEsZ0JBQUEsQ0FBQSxHQUFBLEtBQUEsMkJBQUEsQ0FBQSxHQUFBLEtBQUEsa0JBQUE7QUFBQSxTQUFBLG1CQUFBLGNBQUEsU0FBQTtBQUFBLFNBQUEsNEJBQUEsQ0FBQSxFQUFBLE1BQUEsU0FBQSxDQUFBLHFCQUFBLENBQUEsc0JBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQSxPQUFBLENBQUEsR0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxFQUFBLEtBQUEsYUFBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQSxXQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxXQUFBLENBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLG1CQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsK0RBQUEsSUFBQSxDQUFBLENBQUEsVUFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBO0FB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QUFBLEVBQUEsTUFBQSxTQUFBLENBQUEscUJBQUEsQ0FBQSxzQkFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBLE9BQUEsQ0FBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsS0FBQSxhQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBLFdBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLFdBQUEsQ0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsbUJBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSwrREFBQSxJQUFBLENBQUEsQ0FBQSxVQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUE7QUFBQSxTQUFBLGtCQUFBLEdBQUEsRUFBQSxHQUFBLFFBQUEsR0FBQSxZQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxXQUFBLENBQUEsTUFBQSxJQUFBLE9BQUEsS0FBQSxDQUFBLEdBQUEsR0FBQSxDQUFBLEdBQUEsR0FBQSxFQUFBLENBQUEsTUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLEdBQUEsQ0FBQSxDQUFBLFlBQUEsSUFBQTtBQUFBLFNBQUEsc0JBQUEsR0FBQSxFQUFBLENBQUEsZUFBQSxNQUFBLHNCQUFBLE1BQUEsQ0FBQSxRQUFBLElBQUEsTUFBQSxDQUFBLEdBQUEsZ0JBQUEsSUFBQSxXQUFBLEVBQUEsYUFBQSxFQUFBLGNBQUEsRUFBQSxHQUFBLFNBQUEsaUJBQUEsRUFBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLENBQUEsUUFBQSxLQUFBLEVBQUEsSUFBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQUEsQ0FBQSxJQUFBLElBQUEsSUFBQSxHQUFBLEVBQUEsV0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxLQUFBLE9BQUEsQ0FBQSxJQUFBLElBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxvQkFBQSxHQUFBLElBQUEsRUFBQSxTQUFBLEVBQUEsR0FB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QTtBQUNBLElBQUEsd0JBQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLGdDQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxLQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsU0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLHVCQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxPQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQXdDLFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsV0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsV0FBQSxDQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxtQkFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsT0FBQSxDQUFBLCtEQUFBLElBQUEsQ0FBQSxDQUFBLFVBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQTtBQUFBLFNBQUEsaUJBQUEsSUFBQSxlQUFBLE1BQUEsb0JBQUEsTUFBQSxDQUFBLFFBQUEsSUFBQSxNQUFBLENBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxRQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxVQUFBLGlCQUFBLENBQUEs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QUFBLEdBQUEsd0JBQUEsUUFBQSxLQUFBLElBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxHQUFBLFlBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxHQUFBLFNBQUEsTUFBQSxXQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLGNBQUEsSUFBQSxNQUFBLENBQUEsd0JBQUEsV0FBQSxHQUFBLElBQUEsR0FBQSxRQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsY0FBQSxDQUFBLElBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxTQUFBLElBQUEsR0FBQSxxQkFBQSxHQUFBLE1BQUEsQ0FBQSx3QkFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLGNBQUEsSUFBQSxLQUFBLElBQUEsQ0FBQSxHQUFBLElBQUEsSUFBQSxDQUFBLEdBQUEsS0FBQSxNQUFBLENBQUEsY0FBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsSUFBQSxZQUFBLE1BQUEsQ0FBQSxHQUFBLElBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLGNBQUEsR0FBQSxNQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQTtBQUFBLFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUFBLFNBQUEsUUFBQSxNQUFBLEVBQUEsY0FBQSxRQUFBLElBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLE1BQUEsT0FBQSxNQUFBLENBQUEscUJBQUEsUUFBQSxPQUFBLEdBQUEsTUFBQSxDQUFBLHFCQUFBLENBQUEsTUFBQSxPQUFBLGNBQUEsRUFBQSxPQUFBLEdBQUEsT0FBQSxDQUFBLE1BQUEsV0FBQSxHQUFBLFdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxVQUFBLE1BQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLE9BQUEsWUFBQSxJQUFBO0FBQUEsU0FBQSxjQUFBLE1BQUEsYUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEVBQUEsQ0FBQSxVQUFBLE1BQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxZQUFBLFNBQUEsQ0FBQSxDQUFBLFlBQUEsQ0FBQSxRQUFBLE9BQUEsQ0FBQSxNQUFBLENBQUEsTUFBQSxTQUFBLE9BQUEsV0FBQSxHQUFBLElBQUEsZUFBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsbUJBQUEsTUFBQSxDQUFBLHlCQUFBLElBQUEsTUFBQSxDQUFBLGdCQUFBLENBQUEsTUFBQSxFQUFBLE1BQUEsQ0FBQSx5QkFBQSxDQUFBLE1BQUEsYUFBQSxPQUFBLENBQUEsTUFBQSxDQUFBLE1BQUEsR0FBQSxPQUFBLFdBQUEsR0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxtQkFBQSxNQUFBO0FBQUEsU0FBQSxnQkFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEtBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsSUFBQSxLQUFBLEVBQUEsS0FBQSxFQUFBLFVBQUEsUUFBQSxZQUFBLFFBQUEsUUFBQSxvQkFBQSxHQUFBLENBQUEsR0FBQSxJQUFBLEtBQUEsV0FBQSxHQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFdBQUEsa0JBQUEsQ0FBQSxHQUFBLEtBQUEsZ0JBQUEsQ0FBQSxHQUFBLEtBQUEsMkJBQUEsQ0FBQSxHQUFBLEtBQUEsa0JBQUE7QUFBQSxTQUFBLG1CQUFBLGNBQUEsU0FBQTtBQUFBLFNBQUEsNEJBQUEsQ0FBQSxFQUFBLE1BQUEsU0FBQSxDQUFBLHFCQUFBLENBQUEsc0JBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQSxPQUFBLENBQUEsR0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxFQUFBLEtBQUEsYUFB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QVEsQ0FBQyxzQkFBVSxDQUFDO0FBQzVCLE9BQU8sQ0FBQyxRQUFRLENBQUMsc0JBQVUsQ0FBQztBQUU1QixJQUFJLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFFO0VBQ3RDLFNBQVMsRUFBRTtBQUNaLENBQUUsQ0FBQztBQUNILENBQUMsQ0FBRSxRQUFRLENBQUMsSUFBSyxDQUFDLENBQUMsTUFBTSxDQUFFLE9BQU8sQ0FBQyxRQUFTLENBQUM7QUFBQyxJQUFBLFFBQUEsR0FFL0IsT0FBTyxFQUN0QjtBQUFBLE9BQUEsY0FBQSxRQUFBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIm5hbWVcIjogXCJyYXRlclwiLFxuICBcInZlcnNpb25cIjogXCIyLjcuMVwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiV2lraXBlZGlhIHVzZXJzY3JpcHQgdGhhdCBoZWxwcyBhc3Nlc3MgcGFnZXMgZm9yIFdpa2lQcm9qZWN0c1wiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2V2YWQzNy9yYXRlclwiLFxuICBcImJyb3dzZXJcIjogXCJpbmRleC5qc1wiLFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwidGVzdFwiOiBcImVjaG8gXFxcIkVycm9yOiBubyB0ZXN0IHNwZWNpZmllZFxcXCIgJiYgZXhpdCAxXCIsXG4gICAgXCJsaW50OmVzNVwiOiBcImpzaGludCBpbmRleC5qc1wiLFxuICAgIFwibGludDplczZcIjogXCJlc2xpbnQgaW5kZXguanMgXFxcInJhdGVyLXNyYy8qKlxcXCJcIixcbiAgICBcImxpbnQ6Zml4XCI6IFwiZXNsaW50IGluZGV4LmpzIFxcXCJyYXRlci1zcmMvKipcXFwiIC0tZml4XCIsXG4gICAgXCJsaW50XCI6IFwibnBtIHJ1biBsaW50OmVzNiAmJiBucG0gcnVuIGxpbnQ6ZXM1XCIsXG4gICAgXCJidWlsZDpidW5kbGVcIjogXCJicm93c2VyaWZ5IHJhdGVyLXNyYy9BcHAuanMgLS1kZWJ1ZyAtdCBiYWJlbGlmeSAtLW91dGZpbGUgZGlzdC9yYXRlci5qc1wiLFxuICAgIFwiYnVpbGQ6bWluaWZ5XCI6IFwidWdsaWZ5anMgZGlzdC9yYXRlci5qcyAtLWNvbXByZXNzIC1iIGFzY2lpX29ubHk9dHJ1ZSxiZWF1dGlmeT1mYWxzZSAtLW91dHB1dCBkaXN0L3JhdGVyLm1pbi5qc1wiLFxuICAgIFwiYnVpbGQ6Y29uY2F0XCI6IFwiY29uY2F0LWNsaSAtZiBcXFwiY29tbWVudC10b3AuanNcXFwiIGRpc3QvcmF0ZXIubWluLmpzIFxcXCJjb21tZW50LWJvdHRvbS5qc1xcXCIgLW8gZGlzdC9yYXRlci5taW4uanNcIixcbiAgICBcImJ1aWxkXCI6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gYnVpbGQ6YnVuZGxlICYmIG5wbSBydW4gYnVpbGQ6bWluaWZ5ICYmIG5wbSBydW4gYnVpbGQ6Y29uY2F0XCJcbiAgfSxcbiAgXCJhdXRob3JcIjoge1xuICAgIFwibmFtZVwiOiBcIkV2YWQzN1wiLFxuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpFdmFkMzdcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2V2YWQzNy9yYXRlci5naXRcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCIoTUlUIE9SIENDLUJZLTQuMClcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJhYmVsL2NvcmVcIjogXCJeNy45LjBcIixcbiAgICBcIkBiYWJlbC9wcmVzZXQtZW52XCI6IFwiXjcuOS4wXCIsXG4gICAgXCJiYWJlbGlmeVwiOiBcIl4xMC4wLjBcIixcbiAgICBcImJyb3dzZXJpZnlcIjogXCJeMTYuNS4wXCIsXG4gICAgXCJjb25jYXQtY2xpXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJlc2xpbnRcIjogXCJeNi44LjBcIixcbiAgICBcImpzaGludFwiOiBcIl4yLjExLjBcIixcbiAgICBcInVnbGlmeS1qc1wiOiBcIl4zLjguMFwiXG4gIH1cbn1cbiIsImltcG9ydCBzZXR1cFJhdGVyIGZyb20gXCIuL3NldHVwXCI7XHJcbmltcG9ydCBhdXRvU3RhcnQgZnJvbSBcIi4vYXV0b3N0YXJ0XCI7XHJcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vY3NzLmpzXCI7XHJcbmltcG9ydCB7IG1ha2VFcnJvck1zZyB9IGZyb20gXCIuL2FwaVwiO1xyXG5pbXBvcnQgd2luZG93TWFuYWdlciBmcm9tIFwiLi93aW5kb3dNYW5hZ2VyXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4oZnVuY3Rpb24gQXBwKCkge1xyXG5cdGxldCBzdHlsZXNoZWV0O1xyXG5cclxuXHRjb25zdCBzaG93TWFpbldpbmRvdyA9IGRhdGEgPT4ge1xyXG5cdFx0aWYgKCFkYXRhIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHN0eWxlc2hlZXQpIHtcclxuXHRcdFx0c3R5bGVzaGVldC5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c3R5bGVzaGVldCA9IG13LnV0aWwuYWRkQ1NTKHN0eWxlcyk7XHJcblx0XHR9XHJcblx0XHQvLyBBZGQgY3NzIGNsYXNzIHRvIGJvZHkgdG8gZW5hYmxlIGJhY2tncm91bmQgc2Nyb2xsaW5nXHJcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uY2xhc3NMaXN0LmFkZChcInJhdGVyLW1haW5XaW5kb3ctb3BlblwiKTtcclxuXHRcdC8vIE9wZW4gdGhlIHdpbmRvd1xyXG5cdFx0d2luZG93TWFuYWdlci5vcGVuV2luZG93KFwibWFpblwiLCBkYXRhKVxyXG5cdFx0XHQuY2xvc2VkLnRoZW4oIHJlc3VsdCA9PiB7XHJcblx0XHRcdFx0Ly8gRGlzYWJsZS9yZW1vdmUgdGhlIGNzcyBzdHlsZXMsIHNvIGFzIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBzY3JpcHRzL2NvbnRlbnQvT09VSSB3aW5kb3dzXHJcblx0XHRcdFx0aWYgKHN0eWxlc2hlZXQpIHsgc3R5bGVzaGVldC5kaXNhYmxlZCA9IHRydWU7IH1cclxuXHRcdFx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uY2xhc3NMaXN0LnJlbW92ZShcInJhdGVyLW1haW5XaW5kb3ctb3BlblwiKTtcclxuXHRcdFx0XHQvLyBSZXN0YXJ0IGlmIG5lZWRlZFxyXG5cdFx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LnJlc3RhcnQpIHtcclxuXHRcdFx0XHRcdHdpbmRvd01hbmFnZXIucmVtb3ZlV2luZG93cyhbXCJtYWluXCJdKVxyXG5cdFx0XHRcdFx0XHQudGhlbihzZXR1cFJhdGVyKVxyXG5cdFx0XHRcdFx0XHQudGhlbihzaG93TWFpbldpbmRvdywgc2hvd1NldHVwRXJyb3IpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBTaG93IG5vdGlmaWNhdGlvbiB3aGVuIHNhdmVkIHN1Y2Nlc3NmdWxseVxyXG5cdFx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LnN1Y2Nlc3MpIHtcclxuXHRcdFx0XHRcdGNvbnN0ICRtZXNzYWdlID0gJChcIjxzcGFuPlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdCQoXCI8c3Ryb25nPlwiKS50ZXh0KFwiUmF0aW5ncyBzYXZlZCBzdWNjZXNzZnVsbHkuXCIpXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKHJlc3VsdC51cGdyYWRlZFN0dWIpIHtcclxuXHRcdFx0XHRcdFx0JG1lc3NhZ2UuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8YnI+XCIpLFxyXG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IFRoZXJlIHNob3VsZCBiZSBhIGxpbmsgdGhhdCB3aWxsIGVkaXQgdGhlIGFydGljbGUgZm9yIHlvdVxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3Bhbj5cIikudGV4dChcIk5vdGUgdGhhdCB0aGUgYXJ0aWNsZSBhcHBlYXJzIHRvIGJlIHRhZ2dlZCBhcyBhIHN0dWIuXCIpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRtdy5ub3RpZnkoXHJcblx0XHRcdFx0XHRcdCRtZXNzYWdlLFxyXG5cdFx0XHRcdFx0XHR7IGF1dG9IaWRlOiB0cnVlLCBhdXRvSGlkZVNlY29uZHM6IFwibG9uZ1wiLCB0YWc6IFwiUmF0ZXItc2F2ZWRcIiB9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdH07XHJcblxyXG5cdGNvbnN0IHNob3dTZXR1cEVycm9yID0gKGNvZGUsIGpxeGhyKSA9PiBPTy51aS5hbGVydChcclxuXHRcdG1ha2VFcnJvck1zZyhjb2RlLCBqcXhociksXHR7XHJcblx0XHRcdHRpdGxlOiBcIlJhdGVyIGZhaWxlZCB0byBvcGVuXCJcclxuXHRcdH1cclxuXHQpO1xyXG5cclxuXHQvLyBJbnZvY2F0aW9uIGJ5IHBvcnRsZXQgbGluayBcclxuXHRtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxyXG5cdFx0XCJwLWNhY3Rpb25zXCIsXHJcblx0XHRcIiNcIixcclxuXHRcdFwiUmF0ZXJcIixcclxuXHRcdFwiY2EtcmF0ZXJcIixcclxuXHRcdFwiUmF0ZSBxdWFsaXR5IGFuZCBpbXBvcnRhbmNlXCIsXHJcblx0XHRcIjVcIlxyXG5cdCk7XHJcblx0JChcIiNjYS1yYXRlclwiKS5jbGljayhldmVudCA9PiB7XHJcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0c2V0dXBSYXRlcigpLnRoZW4oc2hvd01haW5XaW5kb3csIHNob3dTZXR1cEVycm9yKTtcclxuXHR9KTtcclxuXHJcblx0Ly8gSW52b2NhdGlvbiBieSBhdXRvLXN0YXJ0IChkbyBub3Qgc2hvdyBtZXNzYWdlIG9uIGVycm9yKVxyXG5cdGF1dG9TdGFydCgpLnRoZW4oc2hvd01haW5XaW5kb3cpO1xyXG59KSgpO1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgQVBJIGZyb20gXCIuL2FwaVwiO1xyXG5pbXBvcnQge2lzQWZ0ZXJEYXRlLCBtb3N0RnJlcXVlbnQsIGZpbHRlckFuZE1hcH0gZnJvbSBcIi4vdXRpbFwiO1xyXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZ1wiO1xyXG5pbXBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuLyoqIFRlbXBsYXRlXHJcbiAqXHJcbiAqIEBjbGFzc1xyXG4gKiBSZXByZXNlbnRzIHRoZSB3aWtpdGV4dCBvZiB0ZW1wbGF0ZSB0cmFuc2NsdXNpb24uIFVzZWQgYnkgI3BhcnNlVGVtcGxhdGVzLlxyXG4gKiBAcHJvcCB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHRlbXBsYXRlXHJcbiAqIEBwcm9wIHtTdHJpbmd9IHdpa2l0ZXh0IEZ1bGwgd2lraXRleHQgb2YgdGhlIHRyYW5zY2x1c2lvblxyXG4gKiBAcHJvcCB7T2JqZWN0W119IHBhcmFtZXRlcnMgUGFyYW1ldGVycyB1c2VkIGluIHRoZSB0cmFuc2xjdXNpb24sIGluIG9yZGVyLCBvZiBmb3JtOlxyXG5cdHtcclxuXHRcdG5hbWU6IHtTdHJpbmd8TnVtYmVyfSBwYXJhbWV0ZXIgbmFtZSwgb3IgcG9zaXRpb24gZm9yIHVubmFtZWQgcGFyYW1ldGVycyxcclxuXHRcdHZhbHVlOiB7U3RyaW5nfSBXaWtpdGV4dCBwYXNzZWQgdG8gdGhlIHBhcmFtZXRlciAod2hpdGVzcGFjZSB0cmltbWVkKSxcclxuXHRcdHdpa2l0ZXh0OiB7U3RyaW5nfSBGdWxsIHdpa2l0ZXh0IChpbmNsdWRpbmcgbGVhZGluZyBwaXBlLCBwYXJhbWV0ZXIgbmFtZS9lcXVhbHMgc2lnbiAoaWYgYXBwbGljYWJsZSksIHZhbHVlLCBhbmQgYW55IHdoaXRlc3BhY2UpXHJcblx0fVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHBhcmFtIHtTdHJpbmd9IHdpa2l0ZXh0IFdpa2l0ZXh0IG9mIGEgdGVtcGxhdGUgdHJhbnNjbHVzaW9uLCBzdGFydGluZyB3aXRoICd7eycgYW5kIGVuZGluZyB3aXRoICd9fScuXHJcbiAqL1xyXG52YXIgVGVtcGxhdGUgPSBmdW5jdGlvbih3aWtpdGV4dCkge1xyXG5cdHRoaXMud2lraXRleHQgPSB3aWtpdGV4dDtcclxuXHR0aGlzLnBhcmFtZXRlcnMgPSBbXTtcclxuXHQvLyBTcGFjaW5nIGFyb3VuZCBwaXBlcywgZXF1YWxzIHNpZ25zLCBlbmQgYnJhY2VzIChkZWZhdWx0cylcclxuXHR0aGlzLnBpcGVTdHlsZSA9IFwiIHxcIjtcclxuXHR0aGlzLmVxdWFsc1N0eWxlID0gXCI9XCI7XHJcblx0dGhpcy5lbmRCcmFjZXNTdHlsZSA9IFwifX1cIjtcclxufTtcclxuVGVtcGxhdGUucHJvdG90eXBlLmFkZFBhcmFtID0gZnVuY3Rpb24obmFtZSwgdmFsLCB3aWtpdGV4dCkge1xyXG5cdHRoaXMucGFyYW1ldGVycy5wdXNoKHtcclxuXHRcdFwibmFtZVwiOiBuYW1lLFxyXG5cdFx0XCJ2YWx1ZVwiOiB2YWwsIFxyXG5cdFx0XCJ3aWtpdGV4dFwiOiBcInxcIiArIHdpa2l0ZXh0XHJcblx0fSk7XHJcbn07XHJcbi8qKlxyXG4gKiBHZXQgYSBwYXJhbWV0ZXIgZGF0YSBieSBwYXJhbWV0ZXIgbmFtZVxyXG4gKi8gXHJcblRlbXBsYXRlLnByb3RvdHlwZS5nZXRQYXJhbSA9IGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZmluZChmdW5jdGlvbihwKSB7IHJldHVybiBwLm5hbWUgPT0gcGFyYW1OYW1lOyB9KTtcclxufTtcclxuVGVtcGxhdGUucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XHJcblx0dGhpcy5uYW1lID0gbmFtZS50cmltKCk7XHJcbn07XHJcblRlbXBsYXRlLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiBtdy5UaXRsZS5uZXdGcm9tVGV4dChcIlRlbXBsYXRlOlwiICsgdGhpcy5uYW1lKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBwYXJzZVRlbXBsYXRlc1xyXG4gKlxyXG4gKiBQYXJzZXMgdGVtcGxhdGVzIGZyb20gd2lraXRleHQuXHJcbiAqIEJhc2VkIG9uIFNEMDAwMSdzIHZlcnNpb24gYXQgPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VzZXI6U0QwMDAxL3BhcnNlQWxsVGVtcGxhdGVzLmpzPi5cclxuICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBkZXRhaWxzOlxyXG4gKiAgdmFyIHRlbXBsYXRlcyA9IHBhcnNlVGVtcGxhdGVzKFwiSGVsbG8ge3tmb28gfEJhcnxiYXo9cXV4IHwyPWxvcmVtaXBzdW18Mz19fSB3b3JsZFwiKTtcclxuICogIGNvbnNvbGUubG9nKHRlbXBsYXRlc1swXSk7IC8vIC0tPiBvYmplY3RcclxuXHR7XHJcblx0XHRuYW1lOiBcImZvb1wiLFxyXG5cdFx0d2lraXRleHQ6XCJ7e2ZvbyB8QmFyfGJhej1xdXggfCAyID0gbG9yZW1pcHN1bSAgfDM9fX1cIixcclxuXHRcdHBhcmFtZXRlcnM6IFtcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG5hbWU6IDEsXHJcblx0XHRcdFx0dmFsdWU6ICdCYXInLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfEJhcidcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG5hbWU6ICdiYXonLFxyXG5cdFx0XHRcdHZhbHVlOiAncXV4JyxcclxuXHRcdFx0XHR3aWtpdGV4dDogJ3xiYXo9cXV4ICdcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG5hbWU6ICcyJyxcclxuXHRcdFx0XHR2YWx1ZTogJ2xvcmVtaXBzdW0nLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfCAyID0gbG9yZW1pcHN1bSAgJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogJzMnLFxyXG5cdFx0XHRcdHZhbHVlOiAnJyxcclxuXHRcdFx0XHR3aWtpdGV4dDogJ3wzPSdcclxuXHRcdFx0fVxyXG5cdFx0XSxcclxuXHRcdGdldFBhcmFtOiBmdW5jdGlvbihwYXJhbU5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKGZ1bmN0aW9uKHApIHsgcmV0dXJuIHAubmFtZSA9PSBwYXJhbU5hbWU7IH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuICogICAgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1N0cmluZ30gd2lraXRleHRcclxuICogQHBhcmFtIHtCb29sZWFufSByZWN1cnNpdmUgU2V0IHRvIGB0cnVlYCB0byBhbHNvIHBhcnNlIHRlbXBsYXRlcyB0aGF0IG9jY3VyIHdpdGhpbiBvdGhlciB0ZW1wbGF0ZXMsXHJcbiAqICByYXRoZXIgdGhhbiBqdXN0IHRvcC1sZXZlbCB0ZW1wbGF0ZXMuIFxyXG4gKiBAcmV0dXJuIHtUZW1wbGF0ZVtdfSB0ZW1wbGF0ZXNcclxuKi9cclxudmFyIHBhcnNlVGVtcGxhdGVzID0gZnVuY3Rpb24od2lraXRleHQsIHJlY3Vyc2l2ZSkgeyAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXHJcblx0aWYgKCF3aWtpdGV4dCkge1xyXG5cdFx0cmV0dXJuIFtdO1xyXG5cdH1cclxuXHR2YXIgc3RyUmVwbGFjZUF0ID0gZnVuY3Rpb24oc3RyaW5nLCBpbmRleCwgY2hhcikge1xyXG5cdFx0cmV0dXJuIHN0cmluZy5zbGljZSgwLGluZGV4KSArIGNoYXIgKyBzdHJpbmcuc2xpY2UoaW5kZXggKyAxKTtcclxuXHR9O1xyXG5cclxuXHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHJcblx0dmFyIHByb2Nlc3NUZW1wbGF0ZVRleHQgPSBmdW5jdGlvbiAoc3RhcnRJZHgsIGVuZElkeCkge1xyXG5cdFx0dmFyIHRleHQgPSB3aWtpdGV4dC5zbGljZShzdGFydElkeCwgZW5kSWR4KTtcclxuXHJcblx0XHR2YXIgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoXCJ7e1wiICsgdGV4dC5yZXBsYWNlKC9cXHgwMS9nLFwifFwiKSArIFwifX1cIik7XHJcblx0XHRcclxuXHRcdC8vIHN3YXAgb3V0IHBpcGUgaW4gbGlua3Mgd2l0aCBcXHgwMSBjb250cm9sIGNoYXJhY3RlclxyXG5cdFx0Ly8gW1tGaWxlOiBdXSBjYW4gaGF2ZSBtdWx0aXBsZSBwaXBlcywgc28gbWlnaHQgbmVlZCBtdWx0aXBsZSBwYXNzZXNcclxuXHRcdHdoaWxlICggLyhcXFtcXFtbXlxcXV0qPylcXHwoLio/XFxdXFxdKS9nLnRlc3QodGV4dCkgKSB7XHJcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXFtcXFtbXlxcXV0qPylcXHwoLio/XFxdXFxdKS9nLCBcIiQxXFx4MDEkMlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaWd1cmUgb3V0IG1vc3QtdXNlZCBzcGFjaW5nIHN0eWxlcyBmb3IgcGlwZXMvZXF1YWxzXHJcblx0XHR0ZW1wbGF0ZS5waXBlU3R5bGUgPSBtb3N0RnJlcXVlbnQoIHRleHQubWF0Y2goL1tcXHNcXG5dKlxcfFtcXHNcXG5dKi9nKSApIHx8IFwiIHxcIjtcclxuXHRcdHRlbXBsYXRlLmVxdWFsc1N0eWxlID0gbW9zdEZyZXF1ZW50KCB0ZXh0LnJlcGxhY2UoLyg9W158XSopPSsvZywgXCIkMVwiKS5tYXRjaCgvW1xcc1xcbl0qPVtcXHNcXG5dKi9nKSApIHx8IFwiPVwiO1xyXG5cdFx0Ly8gRmlndXJlIG91dCBlbmQtYnJhY2VzIHN0eWxlXHJcblx0XHR2YXIgZW5kU3BhY2luZyA9IHRleHQubWF0Y2goL1tcXHNcXG5dKiQvKTtcclxuXHRcdHRlbXBsYXRlLmVuZEJyYWNlc1N0eWxlID0gKGVuZFNwYWNpbmcgPyBlbmRTcGFjaW5nWzBdIDogXCJcIikgKyBcIn19XCI7XHJcblxyXG5cdFx0dmFyIGNodW5rcyA9IHRleHQuc3BsaXQoXCJ8XCIpLm1hcChmdW5jdGlvbihjaHVuaykge1xyXG5cdFx0XHQvLyBjaGFuZ2UgJ1xceDAxJyBjb250cm9sIGNoYXJhY3RlcnMgYmFjayB0byBwaXBlc1xyXG5cdFx0XHRyZXR1cm4gY2h1bmsucmVwbGFjZSgvXFx4MDEvZyxcInxcIik7IFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGVtcGxhdGUuc2V0TmFtZShjaHVua3NbMF0pO1xyXG5cdFx0XHJcblx0XHR2YXIgcGFyYW1ldGVyQ2h1bmtzID0gY2h1bmtzLnNsaWNlKDEpO1xyXG5cclxuXHRcdHZhciB1bm5hbWVkSWR4ID0gMTtcclxuXHRcdHBhcmFtZXRlckNodW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGNodW5rKSB7XHJcblx0XHRcdHZhciBpbmRleE9mRXF1YWxUbyA9IGNodW5rLmluZGV4T2YoXCI9XCIpO1xyXG5cdFx0XHR2YXIgaW5kZXhPZk9wZW5CcmFjZXMgPSBjaHVuay5pbmRleE9mKFwie3tcIik7XHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgaXNXaXRob3V0RXF1YWxzID0gIWNodW5rLmluY2x1ZGVzKFwiPVwiKTtcclxuXHRcdFx0dmFyIGhhc0JyYWNlc0JlZm9yZUVxdWFscyA9IGNodW5rLmluY2x1ZGVzKFwie3tcIikgJiYgaW5kZXhPZk9wZW5CcmFjZXMgPCBpbmRleE9mRXF1YWxUbztcdFxyXG5cdFx0XHR2YXIgaXNVbm5hbWVkUGFyYW0gPSAoIGlzV2l0aG91dEVxdWFscyB8fCBoYXNCcmFjZXNCZWZvcmVFcXVhbHMgKTtcclxuXHRcdFx0XHJcblx0XHRcdHZhciBwTmFtZSwgcE51bSwgcFZhbDtcclxuXHRcdFx0aWYgKCBpc1VubmFtZWRQYXJhbSApIHtcclxuXHRcdFx0XHQvLyBHZXQgdGhlIG5leHQgbnVtYmVyIG5vdCBhbHJlYWR5IHVzZWQgYnkgZWl0aGVyIGFuIHVubmFtZWQgcGFyYW1ldGVyLCBvciBieSBhXHJcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW1ldGVyIGxpa2UgYHwxPXZhbGBcclxuXHRcdFx0XHR3aGlsZSAoIHRlbXBsYXRlLmdldFBhcmFtKHVubmFtZWRJZHgpICkge1xyXG5cdFx0XHRcdFx0dW5uYW1lZElkeCsrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRwTnVtID0gdW5uYW1lZElkeDtcclxuXHRcdFx0XHRwVmFsID0gY2h1bmsudHJpbSgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHBOYW1lID0gY2h1bmsuc2xpY2UoMCwgaW5kZXhPZkVxdWFsVG8pLnRyaW0oKTtcclxuXHRcdFx0XHRwVmFsID0gY2h1bmsuc2xpY2UoaW5kZXhPZkVxdWFsVG8gKyAxKS50cmltKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGVtcGxhdGUuYWRkUGFyYW0ocE5hbWUgfHwgcE51bSwgcFZhbCwgY2h1bmspO1xyXG5cdFx0fSk7XHJcblx0XHRcclxuXHRcdHJlc3VsdC5wdXNoKHRlbXBsYXRlKTtcclxuXHR9O1xyXG5cclxuXHRcclxuXHR2YXIgbiA9IHdpa2l0ZXh0Lmxlbmd0aDtcclxuXHRcclxuXHQvLyBudW1iZXIgb2YgdW5jbG9zZWQgYnJhY2VzXHJcblx0dmFyIG51bVVuY2xvc2VkID0gMDtcclxuXHJcblx0Ly8gYXJlIHdlIGluc2lkZSBhIGNvbW1lbnQsIG9yIGJldHdlZW4gbm93aWtpIHRhZ3MsIG9yIGluIGEge3t7cGFyYW1ldGVyfX19P1xyXG5cdHZhciBpbkNvbW1lbnQgPSBmYWxzZTtcclxuXHR2YXIgaW5Ob3dpa2kgPSBmYWxzZTtcclxuXHR2YXIgaW5QYXJhbWV0ZXIgPSBmYWxzZTtcclxuXHJcblx0dmFyIHN0YXJ0SWR4LCBlbmRJZHg7XHJcblx0XHJcblx0Zm9yICh2YXIgaT0wOyBpPG47IGkrKykge1xyXG5cdFx0XHJcblx0XHRpZiAoICFpbkNvbW1lbnQgJiYgIWluTm93aWtpICYmICFpblBhcmFtZXRlciApIHtcclxuXHJcblx0XHRcdGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ7XCIgJiYgd2lraXRleHRbaSsxXSA9PT0gXCJ7XCIgJiYgd2lraXRleHRbaSsyXSA9PT0gXCJ7XCIgJiYgd2lraXRleHRbaSszXSAhPT0gXCJ7XCIpIHtcclxuXHRcdFx0XHRpblBhcmFtZXRlciA9IHRydWU7XHJcblx0XHRcdFx0aSArPSAyO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHdpa2l0ZXh0W2ldID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIntcIikge1xyXG5cdFx0XHRcdGlmIChudW1VbmNsb3NlZCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0c3RhcnRJZHggPSBpKzI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG51bVVuY2xvc2VkICs9IDI7XHJcblx0XHRcdFx0aSsrO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHdpa2l0ZXh0W2ldID09PSBcIn1cIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIn1cIikge1xyXG5cdFx0XHRcdGlmIChudW1VbmNsb3NlZCA9PT0gMikge1xyXG5cdFx0XHRcdFx0ZW5kSWR4ID0gaTtcclxuXHRcdFx0XHRcdHByb2Nlc3NUZW1wbGF0ZVRleHQoc3RhcnRJZHgsIGVuZElkeCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG51bVVuY2xvc2VkIC09IDI7XHJcblx0XHRcdFx0aSsrO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHdpa2l0ZXh0W2ldID09PSBcInxcIiAmJiBudW1VbmNsb3NlZCA+IDIpIHtcclxuXHRcdFx0XHQvLyBzd2FwIG91dCBwaXBlcyBpbiBuZXN0ZWQgdGVtcGxhdGVzIHdpdGggXFx4MDEgY2hhcmFjdGVyXHJcblx0XHRcdFx0d2lraXRleHQgPSBzdHJSZXBsYWNlQXQod2lraXRleHQsIGksXCJcXHgwMVwiKTtcclxuXHRcdFx0fSBlbHNlIGlmICggL148IS0tLy50ZXN0KHdpa2l0ZXh0LnNsaWNlKGksIGkgKyA0KSkgKSB7XHJcblx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTtcclxuXHRcdFx0XHRpICs9IDM7XHJcblx0XHRcdH0gZWxzZSBpZiAoIC9ePG5vd2lraSA/Pi8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgOSkpICkge1xyXG5cdFx0XHRcdGluTm93aWtpID0gdHJ1ZTtcclxuXHRcdFx0XHRpICs9IDc7XHJcblx0XHRcdH0gXHJcblxyXG5cdFx0fSBlbHNlIHsgLy8gd2UgYXJlIGluIGEgY29tbWVudCBvciBub3dpa2kgb3Ige3t7cGFyYW1ldGVyfX19XHJcblx0XHRcdGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ8XCIpIHtcclxuXHRcdFx0XHQvLyBzd2FwIG91dCBwaXBlcyB3aXRoIFxceDAxIGNoYXJhY3RlclxyXG5cdFx0XHRcdHdpa2l0ZXh0ID0gc3RyUmVwbGFjZUF0KHdpa2l0ZXh0LCBpLFwiXFx4MDFcIik7XHJcblx0XHRcdH0gZWxzZSBpZiAoL14tLT4vLnRlc3Qod2lraXRleHQuc2xpY2UoaSwgaSArIDMpKSkge1xyXG5cdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdGkgKz0gMjtcclxuXHRcdFx0fSBlbHNlIGlmICgvXjxcXC9ub3dpa2kgPz4vLnRlc3Qod2lraXRleHQuc2xpY2UoaSwgaSArIDEwKSkpIHtcclxuXHRcdFx0XHRpbk5vd2lraSA9IGZhbHNlO1xyXG5cdFx0XHRcdGkgKz0gODtcclxuXHRcdFx0fSBlbHNlIGlmICh3aWtpdGV4dFtpXSA9PT0gXCJ9XCIgJiYgd2lraXRleHRbaSsxXSA9PT0gXCJ9XCIgJiYgd2lraXRleHRbaSsyXSA9PT0gXCJ9XCIpIHtcclxuXHRcdFx0XHRpblBhcmFtZXRlciA9IGZhbHNlO1xyXG5cdFx0XHRcdGkgKz0gMjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblx0XHJcblx0aWYgKCByZWN1cnNpdmUgKSB7XHJcblx0XHR2YXIgc3VidGVtcGxhdGVzID0gZmlsdGVyQW5kTWFwKHJlc3VsdCxcclxuXHRcdFx0dGVtcGxhdGUgPT4gL1xce1xceyg/Oi58XFxuKSpcXH1cXH0vLnRlc3QodGVtcGxhdGUud2lraXRleHQuc2xpY2UoMiwtMikpLFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZS53aWtpdGV4dC5zbGljZSgyLC0yKSwgdHJ1ZSlcclxuXHRcdCk7XHJcblx0XHRyZXR1cm4gcmVzdWx0LmNvbmNhdC5hcHBseShyZXN1bHQsIHN1YnRlbXBsYXRlcyk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmVzdWx0OyBcclxufTsgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtUZW1wbGF0ZXxUZW1wbGF0ZVtdfSB0ZW1wbGF0ZXNcclxuICogQHJldHVybiB7UHJvbWlzZTxUZW1wbGF0ZT58UHJvbWlzZTxUZW1wbGF0ZVtdPn1cclxuICovXHJcbnZhciBnZXRXaXRoUmVkaXJlY3RUbyA9IGZ1bmN0aW9uKHRlbXBsYXRlcykge1xyXG5cdHZhciB0ZW1wbGF0ZXNBcnJheSA9IEFycmF5LmlzQXJyYXkodGVtcGxhdGVzKSA/IHRlbXBsYXRlcyA6IFt0ZW1wbGF0ZXNdO1xyXG5cdGlmICh0ZW1wbGF0ZXNBcnJheS5sZW5ndGggPT09IDApIHtcclxuXHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShbXSk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gQVBJLmdldCh7XHJcblx0XHRcImFjdGlvblwiOiBcInF1ZXJ5XCIsXHJcblx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFwidGl0bGVzXCI6IGZpbHRlckFuZE1hcCh0ZW1wbGF0ZXNBcnJheSxcclxuXHRcdFx0dGVtcGxhdGUgPT4gdGVtcGxhdGUuZ2V0VGl0bGUoKSAhPT0gbnVsbCxcclxuXHRcdFx0dGVtcGxhdGUgPT4gdGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRQcmVmaXhlZFRleHQoKVxyXG5cdFx0KSxcclxuXHRcdFwicmVkaXJlY3RzXCI6IDFcclxuXHR9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG5cdFx0aWYgKCAhcmVzdWx0IHx8ICFyZXN1bHQucXVlcnkgKSB7XHJcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwiRW1wdHkgcmVzcG9uc2VcIik7XHJcblx0XHR9XHJcblx0XHRpZiAoIHJlc3VsdC5xdWVyeS5yZWRpcmVjdHMgKSB7XHJcblx0XHRcdHJlc3VsdC5xdWVyeS5yZWRpcmVjdHMuZm9yRWFjaChmdW5jdGlvbihyZWRpcmVjdCkge1xyXG5cdFx0XHRcdHZhciBpID0gdGVtcGxhdGVzQXJyYXkuZmluZEluZGV4KHRlbXBsYXRlID0+IHtcclxuXHRcdFx0XHRcdGxldCB0aXRsZSA9IHRlbXBsYXRlLmdldFRpdGxlKCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGl0bGUgJiYgdGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCkgPT09IHJlZGlyZWN0LmZyb207XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKGkgIT09IC0xKSB7XHJcblx0XHRcdFx0XHR0ZW1wbGF0ZXNBcnJheVtpXS5yZWRpcmVjdFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHJlZGlyZWN0LnRvKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkodGVtcGxhdGVzKSA/IHRlbXBsYXRlc0FycmF5IDogdGVtcGxhdGVzQXJyYXlbMF07XHJcblx0fSk7XHJcbn07XHJcblxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuZ2V0RGF0YUZvclBhcmFtID0gZnVuY3Rpb24oa2V5LCBwYXJhTmFtZSkge1xyXG5cdGlmICggIXRoaXMucGFyYW1EYXRhICkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdC8vIElmIGFsaWFzLCBzd2l0Y2ggZnJvbSBhbGlhcyB0byBwcmVmZXJyZWQgcGFyYW1ldGVyIG5hbWVcclxuXHR2YXIgcGFyYSA9IHRoaXMucGFyYW1BbGlhc2VzW3BhcmFOYW1lXSB8fCBwYXJhTmFtZTtcdFxyXG5cdGlmICggIXRoaXMucGFyYW1EYXRhW3BhcmFdICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHRcclxuXHR2YXIgZGF0YSA9IHRoaXMucGFyYW1EYXRhW3BhcmFdW2tleV07XHJcblx0Ly8gRGF0YSBtaWdodCBhY3R1YWxseSBiZSBhbiBvYmplY3Qgd2l0aCBrZXkgXCJlblwiXHJcblx0aWYgKCBkYXRhICYmIGRhdGEuZW4gJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgKSB7XHJcblx0XHRyZXR1cm4gZGF0YS5lbjtcclxuXHR9XHJcblx0cmV0dXJuIGRhdGE7XHJcbn07XHJcblxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuaXNTaGVsbFRlbXBsYXRlID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIG1haW5UZXh0ID0gdGhpcy5yZWRpcmVjdFRhcmdldFxyXG5cdFx0PyB0aGlzLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KClcclxuXHRcdDogdGhpcy5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0cmV0dXJuIGNvbmZpZy5zaGVsbFRlbXBsYXRlcy5pbmNsdWRlcyhtYWluVGV4dCk7XHJcbn07XHJcblxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuc2V0UGFyYW1EYXRhQW5kU3VnZ2VzdGlvbnMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgc2VsZiA9IHRoaXM7XHJcblx0dmFyIHBhcmFtRGF0YVNldCA9ICQuRGVmZXJyZWQoKTtcclxuXHRcclxuXHRpZiAoIHNlbGYucGFyYW1EYXRhICkgeyByZXR1cm4gcGFyYW1EYXRhU2V0LnJlc29sdmUoKTsgfVxyXG4gICAgXHJcblx0dmFyIHByZWZpeGVkVGV4dCA9IHNlbGYucmVkaXJlY3RUYXJnZXRcclxuXHRcdD8gc2VsZi5yZWRpcmVjdFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKVxyXG5cdFx0OiBzZWxmLmdldFRpdGxlKCkuZ2V0UHJlZml4ZWRUZXh0KCk7XHJcblxyXG5cdHZhciBjYWNoZWRJbmZvID0gY2FjaGUucmVhZChwcmVmaXhlZFRleHQgKyBcIi1wYXJhbXNcIik7XHJcblx0XHJcblx0aWYgKFxyXG5cdFx0Y2FjaGVkSW5mbyAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZSAmJlxyXG5cdFx0Y2FjaGVkSW5mby5zdGFsZURhdGUgJiZcclxuXHRcdGNhY2hlZEluZm8udmFsdWUucGFyYW1EYXRhICE9IG51bGwgJiZcclxuXHRcdGNhY2hlZEluZm8udmFsdWUucGFyYW1ldGVyU3VnZ2VzdGlvbnMgIT0gbnVsbCAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZS5wYXJhbUFsaWFzZXMgIT0gbnVsbFxyXG5cdCkge1xyXG5cdFx0c2VsZi5ub3RlbXBsYXRlZGF0YSA9IGNhY2hlZEluZm8udmFsdWUubm90ZW1wbGF0ZWRhdGE7XHJcblx0XHRzZWxmLnBhcmFtRGF0YSA9IGNhY2hlZEluZm8udmFsdWUucGFyYW1EYXRhO1xyXG5cdFx0c2VsZi5wYXJhbWV0ZXJTdWdnZXN0aW9ucyA9IGNhY2hlZEluZm8udmFsdWUucGFyYW1ldGVyU3VnZ2VzdGlvbnM7XHJcblx0XHRzZWxmLnBhcmFtQWxpYXNlcyA9IGNhY2hlZEluZm8udmFsdWUucGFyYW1BbGlhc2VzO1xyXG5cdFx0XHJcblx0XHRwYXJhbURhdGFTZXQucmVzb2x2ZSgpO1xyXG5cdFx0aWYgKCAhaXNBZnRlckRhdGUoY2FjaGVkSW5mby5zdGFsZURhdGUpICkge1xyXG5cdFx0XHQvLyBKdXN0IHVzZSB0aGUgY2FjaGVkIGRhdGFcclxuXHRcdFx0cmV0dXJuIHBhcmFtRGF0YVNldDtcclxuXHRcdH0gLy8gZWxzZTogVXNlIHRoZSBjYWNoZSBkYXRhIGZvciBub3csIGJ1dCBhbHNvIGZldGNoIG5ldyBkYXRhIGZyb20gQVBJXHJcblx0fVxyXG5cdFxyXG5cdEFQSS5nZXQoe1xyXG5cdFx0YWN0aW9uOiBcInRlbXBsYXRlZGF0YVwiLFxyXG5cdFx0dGl0bGVzOiBwcmVmaXhlZFRleHQsXHJcblx0XHRyZWRpcmVjdHM6IDEsXHJcblx0XHRpbmNsdWRlTWlzc2luZ1RpdGxlczogMVxyXG5cdH0pXHJcblx0XHQudGhlbihcclxuXHRcdFx0ZnVuY3Rpb24ocmVzcG9uc2UpIHsgcmV0dXJuIHJlc3BvbnNlOyB9LFxyXG5cdFx0XHRmdW5jdGlvbigvKmVycm9yKi8pIHsgcmV0dXJuIG51bGw7IH0gLy8gSWdub3JlIGVycm9ycywgd2lsbCB1c2UgZGVmYXVsdCBkYXRhXHJcblx0XHQpXHJcblx0XHQudGhlbiggZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHQvLyBGaWd1cmUgb3V0IHBhZ2UgaWQgKGJlYWN1c2UgYWN0aW9uPXRlbXBsYXRlZGF0YSBkb2Vzbid0IGhhdmUgYW4gaW5kZXhwYWdlaWRzIG9wdGlvbilcclxuXHRcdFx0dmFyIGlkID0gcmVzdWx0ICYmICQubWFwKHJlc3VsdC5wYWdlcywgZnVuY3Rpb24oIF92YWx1ZSwga2V5ICkgeyByZXR1cm4ga2V5OyB9KTtcclxuXHRcdFxyXG5cdFx0XHRpZiAoICFyZXN1bHQgfHwgIXJlc3VsdC5wYWdlc1tpZF0gfHwgcmVzdWx0LnBhZ2VzW2lkXS5ub3RlbXBsYXRlZGF0YSB8fCAhcmVzdWx0LnBhZ2VzW2lkXS5wYXJhbXMgKSB7XHJcblx0XHRcdC8vIE5vIFRlbXBsYXRlRGF0YSwgc28gdXNlIGRlZmF1bHRzIChndWVzc2VzKVxyXG5cdFx0XHRcdHNlbGYubm90ZW1wbGF0ZWRhdGEgPSB0cnVlO1xyXG5cdFx0XHRcdHNlbGYudGVtcGxhdGVkYXRhQXBpRXJyb3IgPSAhcmVzdWx0O1xyXG5cdFx0XHRcdHNlbGYucGFyYW1EYXRhID0gY29uZmlnLmRlZmF1bHRQYXJhbWV0ZXJEYXRhO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNlbGYucGFyYW1EYXRhID0gcmVzdWx0LnBhZ2VzW2lkXS5wYXJhbXM7XHJcblx0XHRcdH1cclxuICAgICAgICBcclxuXHRcdFx0c2VsZi5wYXJhbUFsaWFzZXMgPSB7fTtcclxuXHRcdFx0JC5lYWNoKHNlbGYucGFyYW1EYXRhLCBmdW5jdGlvbihwYXJhTmFtZSwgcGFyYURhdGEpIHtcclxuXHRcdFx0XHQvLyBFeHRyYWN0IGFsaWFzZXMgZm9yIGVhc2llciByZWZlcmVuY2UgbGF0ZXIgb25cclxuXHRcdFx0XHRpZiAoIHBhcmFEYXRhLmFsaWFzZXMgJiYgcGFyYURhdGEuYWxpYXNlcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRwYXJhRGF0YS5hbGlhc2VzLmZvckVhY2goZnVuY3Rpb24oYWxpYXMpe1xyXG5cdFx0XHRcdFx0XHRzZWxmLnBhcmFtQWxpYXNlc1thbGlhc10gPSBwYXJhTmFtZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBFeHRyYWN0IGFsbG93ZWQgdmFsdWVzIGFycmF5IGZyb20gZGVzY3JpcHRpb25cclxuXHRcdFx0XHRpZiAoIHBhcmFEYXRhLmRlc2NyaXB0aW9uICYmIC9cXFsuKicuKz8nLio/XFxdLy50ZXN0KHBhcmFEYXRhLmRlc2NyaXB0aW9uLmVuKSApIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdHZhciBhbGxvd2VkVmFscyA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0cGFyYURhdGEuZGVzY3JpcHRpb24uZW5cclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9eLipcXFsvLFwiW1wiKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1wiL2csIFwiXFxcXFxcXCJcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC8nL2csIFwiXFxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoLyxcXHMqXS8sIFwiXVwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL10uKiQvLCBcIl1cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0c2VsZi5wYXJhbURhdGFbcGFyYU5hbWVdLmFsbG93ZWRWYWx1ZXMgPSBhbGxvd2VkVmFscztcclxuXHRcdFx0XHRcdH0gY2F0Y2goZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJbUmF0ZXJdIENvdWxkIG5vdCBwYXJzZSBhbGxvd2VkIHZhbHVlcyBpbiBkZXNjcmlwdGlvbjpcXG4gIFwiK1xyXG5cdFx0XHRcdFx0cGFyYURhdGEuZGVzY3JpcHRpb24uZW4gKyBcIlxcbiBDaGVjayBUZW1wbGF0ZURhdGEgZm9yIHBhcmFtZXRlciB8XCIgKyBwYXJhTmFtZSArXHJcblx0XHRcdFx0XHRcIj0gaW4gXCIgKyBzZWxmLmdldFRpdGxlKCkuZ2V0UHJlZml4ZWRUZXh0KCkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcclxuXHRcdFx0Ly8gTWFrZSBzdWdnZXN0aW9ucyBmb3IgY29tYm9ib3hcclxuXHRcdFx0dmFyIGFsbFBhcmFtc0FycmF5ID0gKCAhc2VsZi5ub3RlbXBsYXRlZGF0YSAmJiByZXN1bHQucGFnZXNbaWRdLnBhcmFtT3JkZXIgKSB8fFxyXG5cdFx0XHQkLm1hcChzZWxmLnBhcmFtRGF0YSwgZnVuY3Rpb24oX3ZhbCwga2V5KXtcclxuXHRcdFx0XHRyZXR1cm4ga2V5O1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0c2VsZi5wYXJhbWV0ZXJTdWdnZXN0aW9ucyA9IGFsbFBhcmFtc0FycmF5LmZpbHRlcihmdW5jdGlvbihwYXJhbU5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBwYXJhbU5hbWUgJiYgcGFyYW1OYW1lICE9PSBcImNsYXNzXCIgJiYgcGFyYW1OYW1lICE9PSBcImltcG9ydGFuY2VcIiApO1xyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24ocGFyYW1OYW1lKSB7XHJcblx0XHRcdFx0XHR2YXIgb3B0aW9uT2JqZWN0ID0ge2RhdGE6IHBhcmFtTmFtZX07XHJcblx0XHRcdFx0XHR2YXIgbGFiZWwgPSBzZWxmLmdldERhdGFGb3JQYXJhbShsYWJlbCwgcGFyYW1OYW1lKTtcclxuXHRcdFx0XHRcdGlmICggbGFiZWwgKSB7XHJcblx0XHRcdFx0XHRcdG9wdGlvbk9iamVjdC5sYWJlbCA9IGxhYmVsICsgXCIgKHxcIiArIHBhcmFtTmFtZSArIFwiPSlcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBvcHRpb25PYmplY3Q7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcclxuXHRcdFx0aWYgKCBzZWxmLnRlbXBsYXRlZGF0YUFwaUVycm9yICkge1xyXG5cdFx0XHRcdC8vIERvbid0IHNhdmUgZGVmYXVsdHMvZ3Vlc3NlcyB0byBjYWNoZTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHJcblx0XHRcdGNhY2hlLndyaXRlKHByZWZpeGVkVGV4dCArIFwiLXBhcmFtc1wiLCB7XHJcblx0XHRcdFx0bm90ZW1wbGF0ZWRhdGE6IHNlbGYubm90ZW1wbGF0ZWRhdGEsXHJcblx0XHRcdFx0cGFyYW1EYXRhOiBzZWxmLnBhcmFtRGF0YSxcclxuXHRcdFx0XHRwYXJhbWV0ZXJTdWdnZXN0aW9uczogc2VsZi5wYXJhbWV0ZXJTdWdnZXN0aW9ucyxcclxuXHRcdFx0XHRwYXJhbUFsaWFzZXM6IHNlbGYucGFyYW1BbGlhc2VzXHJcblx0XHRcdH0sXHQxXHJcblx0XHRcdCk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSlcclxuXHRcdC50aGVuKFxyXG5cdFx0XHRwYXJhbURhdGFTZXQucmVzb2x2ZSxcclxuXHRcdFx0cGFyYW1EYXRhU2V0LnJlamVjdFxyXG5cdFx0KTtcclxuXHRcclxuXHRyZXR1cm4gcGFyYW1EYXRhU2V0O1x0XHJcbn07XHJcblxyXG52YXIgbWFrZUxpc3RBcyA9IGZ1bmN0aW9uKHN1YmplY3RUaXRsZSkge1xyXG5cdHZhciBuYW1lID0gc3ViamVjdFRpdGxlLmdldE1haW5UZXh0KCkucmVwbGFjZSgvXFxzXFwoLipcXCkvLCBcIlwiKTtcclxuXHRpZiAoIG5hbWUuaW5kZXhPZihcIiBcIikgPT09IC0xICkge1xyXG5cdFx0cmV0dXJuIG5hbWU7XHJcblx0fVxyXG5cdHZhciBnZW5lcmF0aW9uYWxTdWZmaXggPSBcIlwiO1xyXG5cdGlmICggLyAoPzpbSlNdci4/fFtJVlhdKykkLy50ZXN0KG5hbWUpICkge1xyXG5cdFx0Z2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKFwiIFwiKSk7XHJcblx0XHRuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFwiIFwiKSk7XHJcblx0XHRpZiAoIG5hbWUuaW5kZXhPZihcIiBcIikgPT09IC0xICkge1xyXG5cdFx0XHRyZXR1cm4gbmFtZSArIGdlbmVyYXRpb25hbFN1ZmZpeDtcclxuXHRcdH1cclxuXHR9XHJcblx0dmFyIGxhc3ROYW1lID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKFwiIFwiKSsxKS5yZXBsYWNlKC8sJC8sIFwiXCIpO1xyXG5cdHZhciBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFwiIFwiKSk7XHJcblx0cmV0dXJuIGxhc3ROYW1lICsgXCIsIFwiICsgb3RoZXJOYW1lcyArIGdlbmVyYXRpb25hbFN1ZmZpeDtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5hZGRNaXNzaW5nUGFyYW1zID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIHRoaXNUZW1wbGF0ZSA9IHRoaXM7XHJcblxyXG5cdC8vIEF1dG9maWxsIGxpc3RhcyBwYXJhbWV0ZXIgZm9yIFdQOkJJT1xyXG5cdHZhciBpc0Jpb2dyYXBoeUJhbm5lciA9IHRoaXMuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiIHx8XHJcblx0XHQodGhpcy5yZWRpcmVjdFRhcmdldCAmJiB0aGlzLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KCkgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIpO1xyXG5cclxuXHRpZiAoaXNCaW9ncmFwaHlCYW5uZXIgJiYgIXRoaXMuZ2V0UGFyYW0oXCJsaXN0YXNcIikpIHtcclxuXHRcdHZhciBzdWJqZWN0VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSkuZ2V0U3ViamVjdFBhZ2UoKTtcclxuXHRcdHRoaXMucGFyYW1ldGVycy5wdXNoKHtcclxuXHRcdFx0bmFtZTogXCJsaXN0YXNcIixcclxuXHRcdFx0dmFsdWU6IG1ha2VMaXN0QXMoc3ViamVjdFRpdGxlKSxcclxuXHRcdFx0YXV0b2ZpbGxlZDogdHJ1ZSxcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gTWFrZSBzdXJlIHJlcXVpcmVkL3N1Z2dlc3RlZCBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50XHJcblx0JC5lYWNoKHRoaXNUZW1wbGF0ZS5wYXJhbURhdGEsIGZ1bmN0aW9uKHBhcmFOYW1lLCBwYXJhRGF0YSkge1xyXG5cdFx0aWYgKCAocGFyYURhdGEucmVxdWlyZWQgfHwgcGFyYURhdGEuc3VnZ2VzdGVkKSAmJiAhdGhpc1RlbXBsYXRlLmdldFBhcmFtKHBhcmFOYW1lKSApIHtcclxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxyZWFkeSBwcmVzZW50IGluIGFuIGFsaWFzLCBpZiBhbnlcclxuXHRcdFx0aWYgKCBwYXJhRGF0YS5hbGlhc2VzLmxlbmd0aCApIHtcclxuXHRcdFx0XHR2YXIgYWxpYXNlcyA9IHRoaXNUZW1wbGF0ZS5wYXJhbWV0ZXJzLmZpbHRlcihwID0+IHtcclxuXHRcdFx0XHRcdHZhciBpc0FsaWFzID0gcGFyYURhdGEuYWxpYXNlcy5pbmNsdWRlcyhwLm5hbWUpO1xyXG5cdFx0XHRcdFx0dmFyIGlzRW1wdHkgPSAhcC52YWx1ZTtcclxuXHRcdFx0XHRcdHJldHVybiBpc0FsaWFzICYmICFpc0VtcHR5O1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmICggYWxpYXNlcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0Ly8gQXQgbGVhc3Qgb25lIG5vbi1lbXB0eSBhbGlhcywgc28gZG8gbm90aGluZ1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBObyBub24tZW1wdHkgYWxpYXNlcywgc28gYWRkIHRoaXMgdG8gdGhlIHBhcmFtZXRlcnMgbGlzdCAod2l0aFxyXG5cdFx0XHQvLyB2YWx1ZSBzZXQgcGFyYW1ldGVyIHRvIGVpdGhlciB0aGUgYXV0b3ZhdWxlLCBvciBhcyBudWxsKS5cclxuXHRcdFx0Ly8gQWxzbyBzZXQgdGhhdCBpdCB3YXMgYXV0b2ZpbGxlZC5cclxuXHRcdFx0dGhpc1RlbXBsYXRlLnBhcmFtZXRlcnMucHVzaCh7XHJcblx0XHRcdFx0bmFtZTpwYXJhTmFtZSxcclxuXHRcdFx0XHR2YWx1ZTogcGFyYURhdGEuYXV0b3ZhbHVlIHx8IG51bGwsXHJcblx0XHRcdFx0YXV0b2ZpbGxlZDogdHJ1ZSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdHJldHVybiB0aGlzVGVtcGxhdGU7XHJcbn07XHJcblxyXG5UZW1wbGF0ZS5wcm90b3R5cGUuc2V0Q2xhc3Nlc0FuZEltcG9ydGFuY2VzID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIHBhcnNlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcblx0Ly8gRG9uJ3QgcmUtcGFyc2UgaWYgYWxyZWFkeSBwYXJzZWQ7IG5vIG5lZWQgdG8gcGFyc2Ugc2hlbGwgdGVtcGxhdGVzIG9yIGJhbm5lcnMgd2l0aG91dCByYXRpbmdzXHJcblx0aWYgKCB0aGlzLmlzU2hlbGxUZW1wbGF0ZSgpICkge1xyXG5cdFx0dGhpcy5jbGFzc2VzID0gWy4uLmNvbmZpZy5iYW5uZXJEZWZhdWx0cy5jbGFzc2VzXTtcclxuXHRcdHJldHVybiBwYXJzZWQucmVzb2x2ZSgpO1xyXG5cdH0gZWxzZSBpZiAoICh0aGlzLmNsYXNzZXMgJiYgdGhpcy5pbXBvcnRhbmNlcykgfHwgdGhpcy53aXRob3V0UmF0aW5ncyApIHtcclxuXHRcdHJldHVybiBwYXJzZWQucmVzb2x2ZSgpO1xyXG5cdH0gXHJcblxyXG5cdHZhciBtYWluVGV4dCA9IHRoaXMuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpO1xyXG5cclxuXHQvLyBTb21lIHByb2plY3RzIGhhdmUgaGFyZGNvZGVkIHZhbHVlcywgdG8gYXZvaWQgc3RhbmRhcmQgY2xhc3NlcyBvciB0byBwcmV2ZW50IEFQSSBpc3N1ZXMgKHRpbWVvdXQgYW5kL29yIG5vZGUgY291bnQgZXhjZWVkZWQpXHJcblx0Y29uc3QgcmVkaXJlY3RUYXJnZXRPck1haW5UZXh0ID0gdGhpcy5yZWRpcmVjdFRhcmdldCA/IHRoaXMucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKSA6IG1haW5UZXh0O1xyXG5cdGlmICggY29uZmlnLmN1c3RvbUJhbm5lcnNbcmVkaXJlY3RUYXJnZXRPck1haW5UZXh0XSApIHtcclxuXHRcdHRoaXMuY2xhc3NlcyA9IGNvbmZpZy5jdXN0b21CYW5uZXJzW3JlZGlyZWN0VGFyZ2V0T3JNYWluVGV4dF0uY2xhc3NlcztcclxuXHRcdHRoaXMuaW1wb3J0YW5jZXMgPSBjb25maWcuY3VzdG9tQmFubmVyc1tyZWRpcmVjdFRhcmdldE9yTWFpblRleHRdLmltcG9ydGFuY2VzO1xyXG5cdFx0cmV0dXJuIHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBPdGhlcndpc2UgdHJ5IHJlYWRpbmcgZnJvbSBjYWNoZWQgZGF0YVxyXG5cdHZhciBjYWNoZWRSYXRpbmdzID0gY2FjaGUucmVhZChtYWluVGV4dCtcIi1yYXRpbmdzXCIpO1xyXG5cdGlmIChcclxuXHRcdGNhY2hlZFJhdGluZ3MgJiZcclxuXHRcdGNhY2hlZFJhdGluZ3MudmFsdWUgJiZcclxuXHRcdGNhY2hlZFJhdGluZ3Muc3RhbGVEYXRlICYmXHJcblx0XHRjYWNoZWRSYXRpbmdzLnZhbHVlLmNsYXNzZXMhPW51bGwgJiZcclxuXHRcdGNhY2hlZFJhdGluZ3MudmFsdWUuaW1wb3J0YW5jZXMhPW51bGxcclxuXHQpIHtcclxuXHRcdHRoaXMuY2xhc3NlcyA9IGNhY2hlZFJhdGluZ3MudmFsdWUuY2xhc3NlcztcclxuXHRcdHRoaXMuaW1wb3J0YW5jZXMgPSBjYWNoZWRSYXRpbmdzLnZhbHVlLmltcG9ydGFuY2VzO1xyXG5cdFx0cGFyc2VkLnJlc29sdmUoKTtcclxuXHRcdGlmICggIWlzQWZ0ZXJEYXRlKGNhY2hlZFJhdGluZ3Muc3RhbGVEYXRlKSApIHtcclxuXHRcdFx0Ly8gSnVzdCB1c2UgdGhlIGNhY2hlZCBkYXRhXHJcblx0XHRcdHJldHVybiBwYXJzZWQ7XHJcblx0XHR9IC8vIGVsc2U6IFVzZSB0aGUgY2FjaGUgZGF0YSBmb3Igbm93LCBidXQgYWxzbyBmZXRjaCBuZXcgZGF0YSBmcm9tIEFQSVxyXG5cdH1cclxuXHJcblx0dmFyIHdpa2l0ZXh0VG9QYXJzZSA9IFwiXCI7XHRcclxuXHRjb25maWcuYmFubmVyRGVmYXVsdHMuZXh0ZW5kZWRDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oY2xhc3NuYW1lLCBpbmRleCkge1xyXG5cdFx0d2lraXRleHRUb1BhcnNlICs9IFwie3tcIiArIG1haW5UZXh0ICsgXCJ8Y2xhc3M9XCIgKyBjbGFzc25hbWUgKyBcInxpbXBvcnRhbmNlPVwiICtcclxuXHRcdChjb25maWcuYmFubmVyRGVmYXVsdHMuZXh0ZW5kZWRJbXBvcnRhbmNlc1tpbmRleF0gfHwgXCJcIikgKyBcIn19L25cIjtcclxuXHR9KTtcclxuXHRcclxuXHRyZXR1cm4gQVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwicGFyc2VcIixcclxuXHRcdHRpdGxlOiBcIlRhbGs6U2FuZGJveFwiLFxyXG5cdFx0dGV4dDogd2lraXRleHRUb1BhcnNlLFxyXG5cdFx0cHJvcDogXCJjYXRlZ29yaWVzaHRtbFwiXHJcblx0fSlcclxuXHRcdC50aGVuKChyZXN1bHQpID0+IHtcclxuXHRcdFx0dmFyIGNhdHNIdG1sID0gcmVzdWx0LnBhcnNlLmNhdGVnb3JpZXNodG1sW1wiKlwiXTtcclxuXHRcdFx0dmFyIGV4dGVuZGVkQ2xhc3NlcyA9IGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZENsYXNzZXMuZmlsdGVyKGZ1bmN0aW9uKGNsKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhdHNIdG1sLmluZGV4T2YoY2wrXCItQ2xhc3NcIikgIT09IC0xO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5jbGFzc2VzID0gWy4uLmNvbmZpZy5iYW5uZXJEZWZhdWx0cy5jbGFzc2VzLCAuLi5leHRlbmRlZENsYXNzZXNdO1xyXG5cdFx0XHR0aGlzLmltcG9ydGFuY2VzID0gY29uZmlnLmJhbm5lckRlZmF1bHRzLmV4dGVuZGVkSW1wb3J0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uKGltcCkge1xyXG5cdFx0XHRcdHJldHVybiBjYXRzSHRtbC5pbmRleE9mKGltcCtcIi1pbXBvcnRhbmNlXCIpICE9PSAtMTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGNhY2hlLndyaXRlKG1haW5UZXh0K1wiLXJhdGluZ3NcIixcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjbGFzc2VzOiB0aGlzLmNsYXNzZXMsXHJcblx0XHRcdFx0XHRpbXBvcnRhbmNlczogdGhpcy5pbXBvcnRhbmNlc1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0MVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IHtUZW1wbGF0ZSwgcGFyc2VUZW1wbGF0ZXMsIGdldFdpdGhSZWRpcmVjdFRvfTtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi4vLi4vY29uZmlnXCI7XHJcbmltcG9ydCBCYW5uZXJXaWRnZXQgZnJvbSBcIi4vQmFubmVyV2lkZ2V0XCI7XHJcbmltcG9ydCB7IG5vcm1hbGlzZVllc05vLCBmaWx0ZXJBbmRNYXAsIHVuaXF1ZUFycmF5IH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IFBhcmFtZXRlcldpZGdldCBmcm9tIFwiLi9QYXJhbWV0ZXJXaWRnZXRcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBCYW5uZXJMaXN0V2lkZ2V0ID0gZnVuY3Rpb24gQmFubmVyTGlzdFdpZGdldCggY29uZmlnICkge1xyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRCYW5uZXJMaXN0V2lkZ2V0LnBhcmVudC5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQuY2FsbCggdGhpcywge1xyXG5cdFx0JGdyb3VwOiB0aGlzLiRlbGVtZW50XHJcblx0fSApO1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1iYW5uZXJMaXN0V2lkZ2V0XCIpLmNzcyh7XCJwYWRkaW5nXCI6XCIyMHB4IDEwcHggMTZweCAxMHB4XCJ9KTtcclxuXHJcblx0Ly8gUHJlZnNcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gY29uZmlnLnByZWZlcmVuY2VzO1xyXG5cdFxyXG5cdHRoaXMub3Jlc0NsYXNzID0gY29uZmlnLm9yZXNDbGFzcztcclxuXHRcclxuXHR0aGlzLmNoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Ly8gRXZlbnRzXHJcblx0dGhpcy5hZ2dyZWdhdGUoIHtcInJlbW92ZVwiOiBcImJhbm5lclJlbW92ZVwifSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywge1wiYmFubmVyUmVtb3ZlXCI6IFwib25CYW5uZXJSZW1vdmVcIn0gKTtcclxuXHJcblx0dGhpcy5hZ2dyZWdhdGUoIHtcImNoYW5nZWRcIjogXCJiYW5uZXJDaGFuZ2VkXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiYW5uZXJDaGFuZ2VkXCI6IFwic2V0Q2hhbmdlZFwifSApO1xyXG5cclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1wiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlXCI6IFwiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlZFwifSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywge1wiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlZFwiOiBcInN5bmNTaGVsbFRlbXBsYXRlV2l0aEJpb2dyYXBoeUJhbm5lclwifSApO1xyXG5cclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1widXBkYXRlZFNpemVcIjogXCJiYW5uZXJVcGRhdGVkU2l6ZVwifSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywge1wiYmFubmVyVXBkYXRlZFNpemVcIjogXCJvblVwZGF0ZWRTaXplXCJ9ICk7XHJcbn07XHJcblxyXG5PTy5pbmhlcml0Q2xhc3MoIEJhbm5lckxpc3RXaWRnZXQsIE9PLnVpLldpZGdldCApO1xyXG5PTy5taXhpbkNsYXNzKCBCYW5uZXJMaXN0V2lkZ2V0LCBPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQgKTtcclxuLypcclxubWV0aG9kcyBmcm9tIG1peGluOlxyXG4gLSBhZGRJdGVtcyggaXRlbXMsIFtpbmRleF0gKSA6IE9PLnVpLkVsZW1lbnQgIChDSEFJTkFCTEUpXHJcbiAtIGNsZWFySXRlbXMoICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4gLSBmaW5kSXRlbUZyb21EYXRhKCBkYXRhICkgOiBPTy51aS5FbGVtZW50fG51bGxcclxuIC0gZmluZEl0ZW1zRnJvbURhdGEoIGRhdGEgKSA6IE9PLnVpLkVsZW1lbnRbXVxyXG4gLSByZW1vdmVJdGVtcyggaXRlbXMgKSA6IE9PLnVpLkVsZW1lbnQgIChDSEFJTkFCTEUpXHJcbiovXHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vblVwZGF0ZWRTaXplID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gRW1pdCBhbiBcInVwZGF0ZWRTaXplXCIgZXZlbnQgc28gdGhlIHBhcmVudCB3aW5kb3cgY2FuIHVwZGF0ZSBzaXplLCBpZiBuZWVkZWRcclxuXHR0aGlzLmVtaXQoXCJ1cGRhdGVkU2l6ZVwiKTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLnNldENoYW5nZWQgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmNoYW5nZWQgPSB0cnVlO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUub25CYW5uZXJSZW1vdmUgPSBmdW5jdGlvbiAoIGJhbm5lciApIHtcclxuXHR0aGlzLnJlbW92ZUl0ZW1zKFtiYW5uZXJdKTtcclxuXHR0aGlzLnNldENoYW5nZWQoKTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLnN5bmNTaGVsbFRlbXBsYXRlV2l0aEJpb2dyYXBoeUJhbm5lciA9IGZ1bmN0aW9uKCBiaW9ncmFwaHlCYW5uZXIgKSB7XHJcblx0YmlvZ3JhcGh5QmFubmVyID0gYmlvZ3JhcGh5QmFubmVyIHx8IHRoaXMuaXRlbXMuZmluZChcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFpblRleHQgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHwgYmFubmVyLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCJcclxuXHQpO1xyXG5cdGlmICghYmlvZ3JhcGh5QmFubmVyKSByZXR1cm47XHJcblxyXG5cdGNvbnN0IGJhbm5lclNoZWxsVGVtcGxhdGUgPSB0aGlzLml0ZW1zLmZpbmQoXHJcblx0XHRiYW5uZXIgPT4gYmFubmVyLm1haW5UZXh0ID09PSBjb25maWcuc2hlbGxUZW1wbGF0ZXNbMF0gfHwgYmFubmVyLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPT09IGNvbmZpZy5zaGVsbFRlbXBsYXRlc1swXVxyXG5cdCk7XHJcblx0aWYgKCFiYW5uZXJTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjb25zdCBwYXJhbXNUb1N5bmMgPSBbXHJcblx0XHR7IG5hbWU6IFwibGl2aW5nXCIsIG5vcm1hbGlzZTogdHJ1ZSB9LFxyXG5cdFx0eyBuYW1lOiBcImJscG9cIiwgbm9ybWFsaXNlOiB0cnVlIH0sXHJcblx0XHR7IG5hbWU6IFwiYWN0aXZlcG9sXCIsIG5vcm1hbGlzZTogdHJ1ZSB9LFxyXG5cdFx0eyBuYW1lOiBcImxpc3Rhc1wiLCBub3JtYWxpc2U6IGZhbHNlIH0sXHJcblx0XTtcclxuXHRwYXJhbXNUb1N5bmMuZm9yRWFjaChwYXJhbVRvU3luYyA9PiB7XHJcblx0XHRjb25zdCBbYmlvZ3JhcGh5UGFyYW0sIHNoZWxsUGFyYW1dID0gW2Jpb2dyYXBoeUJhbm5lciwgYmFubmVyU2hlbGxUZW1wbGF0ZV0ubWFwKGJhbm5lciA9PlxyXG5cdFx0XHRiYW5uZXIucGFyYW1ldGVyTGlzdC5nZXRQYXJhbWV0ZXJJdGVtcygpXHJcblx0XHRcdFx0LmZpbmQocGFyYW1ldGVyID0+XHJcblx0XHRcdFx0XHRwYXJhbWV0ZXIubmFtZSA9PT0gcGFyYW1Ub1N5bmMubmFtZSB8fFxyXG5cdFx0XHRcdFx0YmFubmVyLnBhcmFtQWxpYXNlc1twYXJhbWV0ZXIubmFtZV0gPT09IHBhcmFtVG9TeW5jLm5hbWVcclxuXHRcdFx0XHQpXHJcblx0XHQpO1xyXG5cdFx0aWYgKCFiaW9ncmFwaHlQYXJhbSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtU3luY1ZhbHVlID0gcGFyYW1Ub1N5bmMubm9ybWFsaXNlID8gbm9ybWFsaXNlWWVzTm8oYmlvZ3JhcGh5UGFyYW0udmFsdWUpIDogYmlvZ3JhcGh5UGFyYW0udmFsdWU7XHJcblx0XHRiaW9ncmFwaHlQYXJhbS5kZWxldGUoKTtcclxuXHJcblx0XHRpZiAoIXNoZWxsUGFyYW0gJiYgcGFyYW1TeW5jVmFsdWUpIHtcclxuXHRcdFx0Y29uc3QgaW5kZXggPSBiYW5uZXJTaGVsbFRlbXBsYXRlLmFkZFBhcmFtZXRlckxheW91dC5pc1Zpc2libGUoKVxyXG5cdFx0XHRcdD8gLTEgLy8gSW5zZXJ0IGF0IHRoZSB2ZXJ5IGVuZFxyXG5cdFx0XHRcdDogYmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbWV0ZXJMaXN0Lml0ZW1zLmxlbmd0aC0xOyAvLyBJbnNlcnQgcHJpb3IgdG8gdGhlIFwiYWRkIHBhcmFtZXRlclwiIGJ1dHRvblxyXG5cdFx0XHRiYW5uZXJTaGVsbFRlbXBsYXRlLnBhcmFtZXRlckxpc3QuYWRkSXRlbXMoW1xyXG5cdFx0XHRcdG5ldyBQYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0XHRcdFwibmFtZVwiOiBwYXJhbVRvU3luYy5uYW1lLFxyXG5cdFx0XHRcdFx0XCJ2YWx1ZVwiOiBwYXJhbVN5bmNWYWx1ZSxcclxuXHRcdFx0XHRcdFwiYXV0b2ZpbGxlZFwiOiB0cnVlXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRiYW5uZXJTaGVsbFRlbXBsYXRlLnBhcmFtRGF0YSAmJiBiYW5uZXJTaGVsbFRlbXBsYXRlLnBhcmFtRGF0YVtwYXJhbVRvU3luYy5uYW1lXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XSwgaW5kZXgpO1xyXG5cdFx0fSBlbHNlIGlmICghYmlvZ3JhcGh5UGFyYW0uYXV0b2ZpbGxlZCAmJiBwYXJhbVN5bmNWYWx1ZSkge1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldFZhbHVlKCBwYXJhbVN5bmNWYWx1ZSApO1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldEF1dG9maWxsZWQoKTtcclxuXHRcdH1cclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmFkZFNoZWxsVGVtcGxhdGVJZk5lZWVkZWQgPSBmdW5jdGlvbiAoKSB7XHJcblx0aWYgKFxyXG5cdFx0IXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSlcclxuXHQpIHtcclxuXHRcdEJhbm5lcldpZGdldC5uZXdGcm9tVGVtcGxhdGVOYW1lKFxyXG5cdFx0XHRjb25maWcuc2hlbGxUZW1wbGF0ZXNbMF0sXHJcblx0XHRcdHt3aXRob3V0UmF0aW5nczogdHJ1ZX0sXHJcblx0XHRcdHtwcmVmZXJlbmNlczogdGhpcy5wcmVmZXJlbmNlcywgaXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZX1cclxuXHRcdCkudGhlbihzaGVsbEJhbm5lcldpZGdldCA9PiB7XHJcblx0XHRcdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5wcm90b3R5cGUuYWRkSXRlbXMuY2FsbCggdGhpcywgW3NoZWxsQmFubmVyV2lkZ2V0XSwgMCApO1xyXG5cdFx0XHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvKVxyXG5cdFx0XHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKHtmb3JCYW5uZXJTaGVsbDogdHJ1ZX0pO1xyXG5cdFx0XHQvLyBlbWl0IHVwZGF0ZWRTaXplIGV2ZW50IFxyXG5cdFx0XHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYWRkSXRlbXMgPSBmdW5jdGlvbiAoIGl0ZW1zLCBpbmRleCApIHtcclxuXHJcblx0aWYgKCBpdGVtcy5sZW5ndGggPT09IDAgKSB7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblxyXG5cdC8vIENhbGwgbWl4aW4gbWV0aG9kIHRvIGRvIHRoZSBhZGRpbmdcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZEl0ZW1zLmNhbGwoIHRoaXMsIGl0ZW1zLCBpbmRleCApO1xyXG5cclxuXHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvLCBhbmQgaWYgZW5hYmxlZCBpbiBwcmVmZXJlbmNlcylcclxuXHRpZiAoIXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkpIHtcclxuXHRcdHRoaXMuYXV0b2ZpbGxDbGFzc1JhdGluZ3MoKTtcclxuXHR9XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcblxyXG5cdC8vIGVtaXQgdXBkYXRlZFNpemUgZXZlbnQgXHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYXV0b2ZpbGxDbGFzc1JhdGluZ3MgPSBmdW5jdGlvbihjb25maWcpIHtcclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gT25seSBhdXRvZmlsbCBpZiBzZXQgaW4gcHJlZmVyZW5jZXNcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgJiYgIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PcmVzICYmICFjb25maWcuZm9yQmFubmVyU2hlbGwpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gQ2hlY2sgd2hhdCBiYW5uZXJzIGFscmVhZHkgaGF2ZVxyXG5cdGNvbnN0IHVuaXF1ZUNsYXNzUmF0aW5ncyA9IHVuaXF1ZUFycmF5KCBmaWx0ZXJBbmRNYXAoXHJcblx0XHR0aGlzLml0ZW1zLFxyXG5cdFx0YmFubmVyID0+IHtcclxuXHRcdFx0aWYgKGJhbm5lci5pc1NoZWxsVGVtcGxhdGUgfHwgIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdFx0cmV0dXJuIGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpO1xyXG5cdFx0fSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpLmdldERhdGEoKVxyXG5cdCkpO1xyXG5cdC8vIENhbid0IGF1dG9maWxsIGlmIHRoZXJlIGlzbid0IGVpdGhlciBhIHNpbmdsZSB2YWx1ZSwgb3Igbm8gdmFsdWVcclxuXHRpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA+IDEpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRGV0ZXJtaW5lIHdoYXQgdG8gYXV0b2ZpbGwgd2l0aFxyXG5cdGxldCBhdXRvQ2xhc3M7XHJcblx0aWYgKHVuaXF1ZUNsYXNzUmF0aW5ncy5sZW5ndGggPT09IDEgJiYgKHRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgfHwgY29uZmlnLmZvckJhbm5lclNoZWxsKSkge1xyXG5cdFx0YXV0b0NsYXNzID0gdW5pcXVlQ2xhc3NSYXRpbmdzWzBdO1xyXG5cdH0gZWxzZSBpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3JlcyAmJiB0aGlzLm9yZXNDbGFzcykge1xyXG5cdFx0Ly8gRG9uJ3QgYXV0b2ZpbGwgYWJvdmUgQy1jbGFzc1xyXG5cdFx0c3dpdGNoKHRoaXMub3Jlc0NsYXNzKSB7XHJcblx0XHRjYXNlIFwiU3R1YlwiOiBjYXNlIFwiU3RhcnRcIjogY2FzZSBcIkNcIjogY2FzZSBcIkxpc3RcIjpcclxuXHRcdFx0YXV0b0NsYXNzID0gdGhpcy5vcmVzQ2xhc3M7XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIG5vdGhpbmcgdG8gZG9cclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRG8gdGhlIGF1dG9maWxsaW5nXHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdGlmIChjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKSAmJiAhY29uZmlnLmZvckJhbm5lclNoZWxsKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcuZm9yQmFubmVyU2hlbGwgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUgJiYgY2xhc3NJdGVtLmdldERhdGEoKSA9PT0gYXV0b0NsYXNzKSB7XHJcblx0XHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKG51bGwpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShhdXRvQ2xhc3MpO1xyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmF1dG9maWxsSW1wb3J0YW5jZVJhdGluZ3MgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxJbXBvcnRhbmNlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGlzUmVndWxhckFydGljbGUgPSB0aGlzLnBhZ2VJbmZvICYmIHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmICF0aGlzLnBhZ2VJbmZvLnJlZGlyZWN0ICYmICF0aGlzLnBhZ2VJbmZvLmlzRGlzYW1iaWc7XHJcblx0aWYgKCFpc1JlZ3VsYXJBcnRpY2xlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIFRPRE86IFNob3VsZCB0cnkgdG8gZmluZCBhIHNtYXJ0ZXIsIGJhbm5lci1zcGVjaWZpYyB3YXkgb2YgZGV0ZXJtaW5pbmcgaW1wb3J0YW5jZS5cclxuXHQvLyBNYXliZSBkbyBzb21ldGhpbmcgd2l0aCAgT1JFUydzIFwiZHJhZnR0b3BpY1wiIG1vZGVsLlxyXG5cdGNvbnN0IGF1dG9JbXBvcnRhbmNlID0gXCJMb3dcIjtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2goYmFubmVyID0+IHtcclxuXHRcdGlmICghYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGltcG9ydGFuY2VJdGVtID0gYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0aWYgKGltcG9ydGFuY2VJdGVtICYmIGltcG9ydGFuY2VJdGVtLmdldERhdGEoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKGF1dG9JbXBvcnRhbmNlKTtcclxuXHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiBiYW5uZXIuc2V0UHJlZmVyZW5jZXMocHJlZnMpKTtcclxuXHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKCk7XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgYmFubmVyc1dpa2l0ZXh0ID0gZmlsdGVyQW5kTWFwKFxyXG5cdFx0dGhpcy5pdGVtcyxcclxuXHRcdGJhbm5lciA9PiAhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFrZVdpa2l0ZXh0KClcclxuXHQpLmpvaW4oXCJcXG5cIik7XHJcblx0dmFyIHNoZWxsVGVtcGxhdGUgPSB0aGlzLml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmICghc2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0cmV0dXJuIGJhbm5lcnNXaWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHNoZWxsUGFyYW0xID0gbmV3IFBhcmFtZXRlcldpZGdldCh7XHJcblx0XHRuYW1lOlwiMVwiLFxyXG5cdFx0dmFsdWU6IFwiXFxuXCIgKyBiYW5uZXJzV2lraXRleHQgKyBcIlxcblwiICtcclxuXHRcdFx0KHNoZWxsVGVtcGxhdGUubm9uU3RhbmRhcmRUZW1wbGF0ZXNcdD8gc2hlbGxUZW1wbGF0ZS5ub25TdGFuZGFyZFRlbXBsYXRlcyArIFwiXFxuXCIgOiBcIlwiKVxyXG5cdH0pO1xyXG5cdHNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5hZGRJdGVtcyhbIHNoZWxsUGFyYW0xIF0pO1xyXG5cdHZhciBzaGVsbFdpa2l0ZXh0ID0gc2hlbGxUZW1wbGF0ZS5tYWtlV2lraXRleHQoKTtcclxuXHRzaGVsbFRlbXBsYXRlLnBhcmFtZXRlckxpc3QucmVtb3ZlSXRlbXMoWyBzaGVsbFBhcmFtMSBdKTtcclxuXHRyZXR1cm4gc2hlbGxXaWtpdGV4dDtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhbm5lckxpc3RXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBQYXJhbWV0ZXJMaXN0V2lkZ2V0IGZyb20gXCIuL1BhcmFtZXRlckxpc3RXaWRnZXRcIjtcclxuaW1wb3J0IFBhcmFtZXRlcldpZGdldCBmcm9tIFwiLi9QYXJhbWV0ZXJXaWRnZXRcIjtcclxuaW1wb3J0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0IGZyb20gXCIuL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0XCI7XHJcbmltcG9ydCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0IGZyb20gXCIuL1N1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXRcIjtcclxuaW1wb3J0IHsgZmlsdGVyQW5kTWFwLCBjbGFzc01hc2ssIGltcG9ydGFuY2VNYXNrIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IHtUZW1wbGF0ZSwgZ2V0V2l0aFJlZGlyZWN0VG99IGZyb20gXCIuLi8uLi9UZW1wbGF0ZVwiO1xyXG5pbXBvcnQgSG9yaXpvbnRhbExheW91dFdpZGdldCBmcm9tIFwiLi9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0XCI7XHJcbmltcG9ydCBnbG9iYWxDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gQmFubmVyV2lkZ2V0KCB0ZW1wbGF0ZSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRCYW5uZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcblx0XHJcblx0LyogLS0tIFBST1BTIC0tLSAqL1xyXG5cdHRoaXMucGFyYW1EYXRhID0gdGVtcGxhdGUucGFyYW1EYXRhO1xyXG5cdHRoaXMucGFyYW1BbGlhc2VzID0gdGVtcGxhdGUucGFyYW1BbGlhc2VzIHx8IHt9O1xyXG5cdHRoaXMucGFyYW1ldGVyU3VnZ2VzdGlvbnMgPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucztcclxuXHR0aGlzLm5hbWUgPSB0ZW1wbGF0ZS5uYW1lO1xyXG5cdHRoaXMud2lraXRleHQgPSB0ZW1wbGF0ZS53aWtpdGV4dDtcclxuXHR0aGlzLnBpcGVTdHlsZSA9IHRlbXBsYXRlLnBpcGVTdHlsZTtcclxuXHR0aGlzLmVxdWFsc1N0eWxlID0gdGVtcGxhdGUuZXF1YWxzU3R5bGU7XHJcblx0dGhpcy5lbmRCcmFjZXNTdHlsZSA9IHRlbXBsYXRlLmVuZEJyYWNlc1N0eWxlO1xyXG5cdHRoaXMubWFpblRleHQgPSB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgJiYgdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKTtcclxuXHR0aGlzLmlzU2hlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpO1xyXG5cdHRoaXMuY2hhbmdlZCA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuc29tZShwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLmF1dG9maWxsZWQpOyAvLyBpbml0aWFsbHkgZmFsc2UsIHVubGVzcyBzb21lIHBhcmFtZXRlcnMgd2VyZSBhdXRvZmlsbGVkXHJcblx0dGhpcy5oYXNDbGFzc1JhdGluZ3MgPSB0ZW1wbGF0ZS5jbGFzc2VzICYmIHRlbXBsYXRlLmNsYXNzZXMubGVuZ3RoO1xyXG5cdHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MgPSB0ZW1wbGF0ZS5pbXBvcnRhbmNlcyAmJiB0ZW1wbGF0ZS5pbXBvcnRhbmNlcy5sZW5ndGg7XHJcblx0dGhpcy5pbmFjdGl2ZVByb2plY3QgPSB0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3Q7XHJcblxyXG5cdC8qIC0tLSBUSVRMRSBBTkQgUkFUSU5HUyAtLS0gKi9cclxuXHJcblx0dGhpcy5yZW1vdmVCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5jbGVhckJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiY2FuY2VsXCIsXHJcblx0XHRsYWJlbDogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHR0aXRsZTogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5yZW1vdmVCdXR0b24uJGVsZW1lbnQuZmluZChcImFcIikuY3NzKFwid2lkdGhcIixcIjEwMCVcIik7XHJcblx0dGhpcy5jbGVhckJ1dHRvbi4kZWxlbWVudC5maW5kKFwiYVwiKS5jc3MoXCJ3aWR0aFwiLFwiMTAwJVwiKTtcclxuXHJcblx0dGhpcy50aXRsZUJ1dHRvbnNHcm91cCA9IG5ldyBPTy51aS5CdXR0b25Hcm91cFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IFsgdGhpcy5yZW1vdmVCdXR0b24sXHR0aGlzLmNsZWFyQnV0dG9uIF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSd3aWR0aDoxMDAlOyc+XCIpLFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5tYWluTGFiZWxQb3B1cEJ1dHRvbiA9IG5ldyBPTy51aS5Qb3B1cEJ1dHRvbldpZGdldCgge1xyXG5cdFx0bGFiZWw6IGB7eyR7dGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpfX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQ4JTttYXJnaW4tcmlnaHQ6MDtwYWRkaW5nLXJpZ2h0OjhweCc+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRpbmRpY2F0b3I6XCJkb3duXCIsXHJcblx0XHRmcmFtZWQ6ZmFsc2UsXHJcblx0XHRwb3B1cDoge1xyXG5cdFx0XHQkY29udGVudDogdGhpcy50aXRsZUJ1dHRvbnNHcm91cC4kZWxlbWVudCxcclxuXHRcdFx0d2lkdGg6IDIwMCxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZSxcclxuXHRcdFx0YWxpZ246IFwiZm9yY2UtcmlnaHRcIixcclxuXHRcdFx0YW5jaG9yOiBmYWxzZVxyXG5cdFx0fVxyXG5cdH0gKTtcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLiRlbGVtZW50XHJcblx0XHQuY2hpbGRyZW4oXCJhXCIpLmZpcnN0KCkuY3NzKHtcImZvbnQtc2l6ZVwiOlwiMTEwJVwifSlcclxuXHRcdC5maW5kKFwic3Bhbi5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWxcIikuY3NzKHtcIndoaXRlLXNwYWNlXCI6XCJub3JtYWxcIn0pO1xyXG5cclxuXHQvLyBSYXRpbmcgZHJvcGRvd25zXHJcblx0aWYgKHRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5DbGFzczwvc3Bhbj5cIiksXHJcblx0XHRcdG1lbnU6IHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCxcclxuXHRcdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gc3R5bGU9XCJjb2xvcjojNzc3XCI+KCR7Y29uZmlnLmlzQXJ0aWNsZSA/IFwibm8gY2xhc3NcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi5nbG9iYWxDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoIGNsYXNzbmFtZSA9PlxyXG5cdFx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGNsYXNzbmFtZSxcclxuXHRcdFx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0fSApO1xyXG5cdFx0dmFyIHNoZWxsQ2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIHNoZWxsQ2xhc3NQYXJhbSAmJiBjbGFzc01hc2soc2hlbGxDbGFzc1BhcmFtLnZhbHVlKSApO1xyXG5cdH0gZWxzZSBpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93biA9IG5ldyBEcm9wZG93blBhcmFtZXRlcldpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFwiPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM3NzdcXFwiPkNsYXNzPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJpbmhlcml0IGZyb20gc2hlbGxcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi50ZW1wbGF0ZS5jbGFzc2VzLm1hcCggY2xhc3NuYW1lID0+XHJcblx0XHRcdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YTogY2xhc3NuYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBjbGFzc25hbWVcclxuXHRcdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgY2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGNsYXNzUGFyYW0gJiYgY2xhc3NNYXNrKGNsYXNzUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5JbXBvcnRhbmNlPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLCBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJubyBpbXBvcnRhbmNlXCIgOiBcImF1dG8tZGV0ZWN0XCJ9KTwvc3Bhbj5gKVxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0Li4udGVtcGxhdGUuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT5cclxuXHRcdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBpbXBvcnRhbmNlLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgaW1wb3J0YW5jZVBhcmFtID0gdGVtcGxhdGUucGFyYW1ldGVycy5maW5kKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gXCJpbXBvcnRhbmNlXCIpO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGltcG9ydGFuY2VQYXJhbSAmJiBpbXBvcnRhbmNlTWFzayhpbXBvcnRhbmNlUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnRpdGxlTGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoIHtcclxuXHRcdGl0ZW1zOiBbIHRoaXMubWFpbkxhYmVsUG9wdXBCdXR0b24gXVxyXG5cdH0gKTtcclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MgfHwgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHRoaXMudGl0bGVMYXlvdXQuYWRkSXRlbXMoWyB0aGlzLmNsYXNzRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cdGlmICh0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHR0aGlzLnRpdGxlTGF5b3V0LmFkZEl0ZW1zKFsgdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cclxuXHQvKiAtLS0gUEFSQU1FVEVSUyBMSVNUIC0tLSAqL1xyXG5cclxuXHR2YXIgcGFyYW1ldGVyV2lkZ2V0cyA9IGZpbHRlckFuZE1hcChcclxuXHRcdHRlbXBsYXRlLnBhcmFtZXRlcnMsXHJcblx0XHRwYXJhbSA9PiB7XHJcblx0XHRcdGlmICggdGhpcy5pc1NoZWxsVGVtcGxhdGUgKSB7XHJcblx0XHRcdFx0aWYgKHBhcmFtLm5hbWUgPT0gXCIxXCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2hlbGxQYXJhbTFWYWx1ZSA9IHBhcmFtLnZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcGFyYW0ubmFtZSAhPT0gXCJjbGFzc1wiO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBwYXJhbS5uYW1lICE9PSBcImNsYXNzXCIgJiYgcGFyYW0ubmFtZSAhPT0gXCJpbXBvcnRhbmNlXCI7XHJcblx0XHR9LFxyXG5cdFx0cGFyYW0gPT4gbmV3IFBhcmFtZXRlcldpZGdldChwYXJhbSwgdGVtcGxhdGUucGFyYW1EYXRhW3BhcmFtLm5hbWVdLCB7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9KVxyXG5cdCk7XHJcblxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdCA9IG5ldyBQYXJhbWV0ZXJMaXN0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogcGFyYW1ldGVyV2lkZ2V0cyxcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSApO1xyXG5cclxuXHQvKiAtLS0gQUREIFBBUkFNRVRFUiBTRUNUSU9OIC0tLSAqL1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KHtcclxuXHRcdHN1Z2dlc3Rpb25zOiB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucyxcclxuXHRcdHBsYWNlaG9sZGVyOiBcInBhcmFtZXRlciBuYW1lXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQwJSc+XCIpLFxyXG5cdFx0dmFsaWRhdGU6IGZ1bmN0aW9uKHZhbCkge1xyXG5cdFx0XHRsZXQge3ZhbGlkTmFtZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyh2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWROYW1lO1xyXG5cdFx0fS5iaW5kKHRoaXMpLFxyXG5cdFx0YWxsb3dTdWdnZXN0aW9uc1doZW5FbXB0eTogdHJ1ZSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSk7XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQgPSBuZXcgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCh7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJwYXJhbWV0ZXIgdmFsdWVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDAlJz5cIiksXHJcblx0XHR2YWxpZGF0ZTogZnVuY3Rpb24odmFsKSB7XHJcblx0XHRcdGxldCB7dmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyhudWxsLCB2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWRWYWx1ZTtcclxuXHRcdH0uYmluZCh0aGlzKSxcclxuXHRcdGFsbG93U3VnZ2VzdGlvbnNXaGVuRW1wdHk6IHRydWUsXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGRcIixcclxuXHRcdGljb246IFwiYWRkXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiXHJcblx0fSkuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCxcclxuXHRcdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KHtsYWJlbDpcIj1cIn0pLFxyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQsXHJcblx0XHRcdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uXHJcblx0XHRdXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlckxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmFkZFBhcmFtZXRlckNvbnRyb2xzLCB7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyOlwiLFxyXG5cdFx0YWxpZ246IFwidG9wXCJcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdC8vIEEgaGFjayB0byBtYWtlIG1lc3NhZ2VzIGFwcGVhciBvbiB0aGVpciBvd24gbGluZVxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50LmZpbmQoXCIub28tdWktZmllbGRMYXlvdXQtbWVzc2FnZXNcIikuY3NzKHtcclxuXHRcdFwiY2xlYXJcIjogXCJib3RoXCIsXHJcblx0XHRcInBhZGRpbmctdG9wXCI6IDBcclxuXHR9KTtcclxuXHJcblx0LyogLS0tIE9WRVJBTEwgTEFZT1VUL0RJU1BMQVkgLS0tICovXHJcblxyXG5cdC8vIERpc3BsYXkgdGhlIGxheW91dCBlbGVtZW50cywgYW5kIGEgcnVsZVxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1iYW5uZXJXaWRnZXRcIikuYXBwZW5kKFxyXG5cdFx0dGhpcy50aXRsZUxheW91dC4kZWxlbWVudCxcclxuXHRcdHRoaXMucGFyYW1ldGVyTGlzdC4kZWxlbWVudCxcclxuXHRcdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50XHJcblx0KTtcclxuXHRpZiAoIXRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLiRlbGVtZW50LmFwcGVuZCggJChcIjxocj5cIikgKTtcclxuXHR9XHJcblxyXG5cdGlmICh0aGlzLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0dGhpcy4kZWxlbWVudC5jc3Moe1xyXG5cdFx0XHRcImJhY2tncm91bmRcIjogXCIjZWVlXCIsXHJcblx0XHRcdFwiYm9yZGVyLXJhZGl1c1wiOiBcIjEwcHhcIixcclxuXHRcdFx0XCJwYWRkaW5nXCI6IFwiMCAxMHB4IDVweFwiLFxyXG5cdFx0XHRcIm1hcmdpbi1ib3R0b21cIjogXCIxMnB4XCIsXHJcblx0XHRcdFwiZm9udC1zaXplXCI6IFwiOTIlXCJcdFx0XHRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5jb25uZWN0KCB0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNsYXNzQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uY29ubmVjdCggdGhpcywge1wiY2hhbmdlXCI6IFwib25JbXBvcnRhbmNlQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuY29ubmVjdCggdGhpcywge1xyXG5cdFx0XCJjaGFuZ2VcIjogXCJvblBhcmFtZXRlckNoYW5nZVwiLFxyXG5cdFx0XCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIjogXCJzaG93QWRkUGFyYW1ldGVySW5wdXRzXCIsXHJcblx0XHRcInVwZGF0ZWRTaXplXCI6IFwib25VcGRhdGVkU2l6ZVwiXHJcblx0fSApO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLmNvbm5lY3QodGhpcywgeyBcImNsaWNrXCI6IFwib25QYXJhbWV0ZXJBZGRcIiB9KTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lQ2hhbmdlXCIsXHJcblx0XHRcImVudGVyXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIixcclxuXHRcdFwiY2hvb3NlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJWYWx1ZUNoYW5nZVwiLFxyXG5cdFx0XCJlbnRlclwiOiBcIm9uQWRkUGFyYW1ldGVyVmFsdWVFbnRlclwiLFxyXG5cdFx0XCJjaG9vc2VcIjogXCJvbkFkZFBhcmFtZXRlclZhbHVlRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMucmVtb3ZlQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUJ1dHRvbkNsaWNrXCJ9LCApO1xyXG5cdHRoaXMuY2xlYXJCdXR0b24uY29ubmVjdCggdGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQnV0dG9uQ2xpY2tcIn0gKTtcclxuXHJcblx0LyogLS0tIEFQUExZIFBSRUYgLS0gKi9cclxuXHRpZiAodGhpcy5wcmVmZXJlbmNlcy5ieXBhc3NSZWRpcmVjdHMpIHtcclxuXHRcdHRoaXMuYnlwYXNzUmVkaXJlY3QoKTtcclxuXHR9XHJcblxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggQmFubmVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV1cclxuICogQHBhcmFtIHtCb29sZWFufSBkYXRhLndpdGhvdXRSYXRpbmdzXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGF0YS5pc1dyYXBwZXJcclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCYW5uZXJXaWRnZXQ+fVxyXG4gKi9cclxuQmFubmVyV2lkZ2V0Lm5ld0Zyb21UZW1wbGF0ZU5hbWUgPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIGRhdGEsIGNvbmZpZykge1xyXG5cdHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZSgpO1xyXG5cdHRlbXBsYXRlLm5hbWUgPSB0ZW1wbGF0ZU5hbWU7XHJcblx0aWYgKGRhdGEgJiYgZGF0YS53aXRob3V0UmF0aW5ncykge1xyXG5cdFx0dGVtcGxhdGUud2l0aG91dFJhdGluZ3MgPSB0cnVlO1xyXG5cdH1cclxuXHRyZXR1cm4gZ2V0V2l0aFJlZGlyZWN0VG8odGVtcGxhdGUpXHJcblx0XHQudGhlbihmdW5jdGlvbih0ZW1wbGF0ZSkge1xyXG5cdFx0XHRyZXR1cm4gJC53aGVuKFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpLFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldFBhcmFtRGF0YUFuZFN1Z2dlc3Rpb25zKClcclxuXHRcdFx0KS50aGVuKCgpID0+IHtcclxuXHRcdFx0XHQvLyBBZGQgbWlzc2luZyByZXF1aXJlZC9zdWdnZXN0ZWQgdmFsdWVzXHJcblx0XHRcdFx0dGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpO1xyXG5cdFx0XHRcdC8vIFJldHVybiB0aGUgbm93LW1vZGlmaWVkIHRlbXBsYXRlXHJcblx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pXHJcblx0XHQudGhlbih0ZW1wbGF0ZSA9PiBuZXcgQmFubmVyV2lkZ2V0KHRlbXBsYXRlLCBjb25maWcpKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldENoYW5nZWQgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmNoYW5nZWQgPSB0cnVlO1xyXG5cdHRoaXMuZW1pdChcImNoYW5nZWRcIik7XHJcblx0aWYgKHRoaXMubWFpblRleHQgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHwgdGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiKSB7XHJcblx0XHQvLyBFbWl0IGV2ZW50IHNvIEJhbm5lckxpc3RXaWRnZXQgY2FuIHVwZGF0ZSB0aGUgYmFubmVyIHNoZWxsIHRlbXBsYXRlIChpZiBwcmVzZW50KVxyXG5cdFx0dGhpcy5lbWl0KFwiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlXCIpO1x0XHRcclxuXHR9XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25DbGFzc0NoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG5cdHRoaXMuY2xhc3NDaGFuZ2VkID0gdHJ1ZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gdGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0aWYgKGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbSgpO1xyXG5cdH1cclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25JbXBvcnRhbmNlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0dGhpcy5pbXBvcnRhbmNlQ2hhbmdlZCA9IHRydWU7XHJcblx0dmFyIGltcG9ydGFuY2VJdGVtID0gdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRpZiAoaW1wb3J0YW5jZUl0ZW0gJiYgaW1wb3J0YW5jZUl0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtKCk7XHJcblx0fVxyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5zaG93QWRkUGFyYW1ldGVySW5wdXRzID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LmZvY3VzKCk7XHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmdldEFkZFBhcmFtZXRlcnNJbmZvID0gZnVuY3Rpb24obmFtZUlucHV0VmFsLCB2YWx1ZUlucHV0VmFsKSB7XHJcblx0dmFyIG5hbWUgPSBuYW1lSW5wdXRWYWwgJiYgbmFtZUlucHV0VmFsLnRyaW0oKSB8fCB0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcclxuXHR2YXIgcGFyYW1BbHJlYWR5SW5jbHVkZWQgPSBuYW1lID09PSBcImNsYXNzXCIgfHxcclxuXHRcdG5hbWUgPT09IFwiaW1wb3J0YW5jZVwiIHx8XHJcblx0XHQobmFtZSA9PT0gXCIxXCIgJiYgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHx8XHJcblx0XHR0aGlzLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKS5zb21lKHBhcmFtV2lkZ2V0ID0+IHBhcmFtV2lkZ2V0Lm5hbWUgPT09IG5hbWUpO1xyXG5cdHZhciB2YWx1ZSA9IHZhbHVlSW5wdXRWYWwgJiYgdmFsdWVJbnB1dFZhbC50cmltKCkgfHwgdGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdHZhciBhdXRvdmFsdWUgPSBuYW1lICYmIHRoaXMucGFyYW1EYXRhW25hbWVdICYmIHRoaXMucGFyYW1EYXRhW25hbWVdLmF1dG92YWx1ZSB8fCBudWxsO1xyXG5cdHJldHVybiB7XHJcblx0XHR2YWxpZE5hbWU6ICEhKG5hbWUgJiYgIXBhcmFtQWxyZWFkeUluY2x1ZGVkKSxcclxuXHRcdHZhbGlkVmFsdWU6ICEhKHZhbHVlIHx8IGF1dG92YWx1ZSksXHJcblx0XHRpc0F1dG92YWx1ZTogISEoIXZhbHVlICYmIGF1dG92YWx1ZSksXHJcblx0XHRpc0FscmVhZHlJbmNsdWRlZDogISEobmFtZSAmJiBwYXJhbUFscmVhZHlJbmNsdWRlZCksXHJcblx0XHRuYW1lLFxyXG5cdFx0dmFsdWUsXHJcblx0XHRhdXRvdmFsdWVcclxuXHR9O1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgeyB2YWxpZE5hbWUsIHZhbGlkVmFsdWUsIGlzQXV0b3ZhbHVlLCBpc0FscmVhZHlJbmNsdWRlZCwgbmFtZSwgYXV0b3ZhbHVlIH0gPSB0aGlzLmdldEFkZFBhcmFtZXRlcnNJbmZvKCk7XHJcblx0Ly8gU2V0IHZhbHVlIGlucHV0IHBsYWNlaG9sZGVyIGFzIHRoZSBhdXRvdmFsdWVcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuJGlucHV0LmF0dHIoIFwicGxhY2Vob2xkZXJcIiwgIGF1dG92YWx1ZSB8fCBcIlwiICk7XHJcblx0Ly8gU2V0IHN1Z2dlc3Rpb25zLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyBhIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXNcclxuXHR2YXIgYWxsb3dlZFZhbHVlcyA9IHRoaXMucGFyYW1EYXRhW25hbWVdICYmXHJcblx0XHR0aGlzLnBhcmFtRGF0YVtuYW1lXS5hbGxvd2VkVmFsdWVzICYmIFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0uYWxsb3dlZFZhbHVlcy5tYXAodmFsID0+IHtyZXR1cm4ge2RhdGE6IHZhbCwgbGFiZWw6dmFsfTsgfSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LnNldFN1Z2dlc3Rpb25zKGFsbG93ZWRWYWx1ZXMgfHwgW10pO1xyXG5cdC8vIFNldCBidXR0b24gZGlzYWJsZWQgc3RhdGUgYmFzZWQgb24gdmFsaWRpdHlcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5zZXREaXNhYmxlZCghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKTtcclxuXHQvLyBTaG93IG5vdGljZSBpZiBhdXRvdmFsdWUgd2lsbCBiZSB1c2VkXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0Tm90aWNlcyggdmFsaWROYW1lICYmIGlzQXV0b3ZhbHVlID8gW1wiUGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXV0b2ZpbGxlZFwiXSA6IFtdICk7XHJcblx0Ly8gU2hvdyBlcnJvciBpcyB0aGUgYmFubmVyIGFscmVhZHkgaGFzIHRoZSBwYXJhbWV0ZXIgc2V0XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0RXJyb3JzKCBpc0FscmVhZHlJbmNsdWRlZCA/IFtcIlBhcmFtZXRlciBpcyBhbHJlYWR5IHByZXNlbnRcIl0gOiBbXSApO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVFbnRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5mb2N1cygpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBpc0F1dG92YWx1ZSB9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLnNldERpc2FibGVkKCF2YWxpZE5hbWUgfHwgIXZhbGlkVmFsdWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnNldE5vdGljZXMoIHZhbGlkTmFtZSAmJiBpc0F1dG92YWx1ZSA/IFtcIlBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIGF1dG9maWxsZWRcIl0gOiBbXSApOyBcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJWYWx1ZUVudGVyID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gTWFrZSBzdXJlIGJ1dHRvbiBzdGF0ZSBoYXMgYmVlbiB1cGRhdGVkXHJcblx0dGhpcy5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlKCk7XHJcblx0Ly8gRG8gbm90aGluZyBpZiBidXR0b24gaXMgZGlzYWJsZWQgKGkuZS4gbmFtZSBhbmQvb3IgdmFsdWUgYXJlIGludmFsaWQpXHJcblx0aWYgKCB0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5pc0Rpc2FibGVkKCkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIEFkZCBwYXJhbWV0ZXJcclxuXHR0aGlzLm9uUGFyYW1ldGVyQWRkKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQWRkID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSwgYXV0b3ZhbHVlIH0gID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdGlmICghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKSB7XHJcblx0XHQvLyBFcnJvciBzaG91bGQgYWxyZWFkeSBiZSBzaG93biB2aWEgb25BZGRQYXJhbWV0ZXIuLi5DaGFuZ2UgbWV0aG9kc1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgbmV3UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcldpZGdldChcclxuXHRcdHtcclxuXHRcdFx0XCJuYW1lXCI6IG5hbWUsXHJcblx0XHRcdFwidmFsdWVcIjogdmFsdWUgfHwgYXV0b3ZhbHVlXHJcblx0XHR9LFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0sXHJcblx0XHR7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9XHJcblx0KTtcclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuYWRkSXRlbXMoW25ld1BhcmFtZXRlcl0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LnNldFZhbHVlKFwiXCIpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5zZXRWYWx1ZShcIlwiKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC4kaW5wdXQuZm9jdXMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUudXBkYXRlQWRkUGFyYW1ldGVyTmFtZVN1Z2dlc3Rpb25zID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHBhcmFtc0luVXNlID0ge307XHJcblx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKCkuZm9yRWFjaChcclxuXHRcdHBhcmFtV2lkZ2V0ID0+IHBhcmFtc0luVXNlW3BhcmFtV2lkZ2V0Lm5hbWVdID0gdHJ1ZVxyXG5cdCk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuc2V0U3VnZ2VzdGlvbnMoXHJcblx0XHR0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25zLmZpbHRlcihcclxuXHRcdFx0c3VnZ2VzdGlvbiA9PiAhcGFyYW1zSW5Vc2Vbc3VnZ2VzdGlvbi5kYXRhXVxyXG5cdFx0KVxyXG5cdCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUmVtb3ZlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJyZW1vdmVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uQ2xlYXJCdXR0b25DbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5jbGVhckl0ZW1zKFxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHQpO1xyXG5cdGlmICggdGhpcy5oYXNDbGFzc1JhdGluZ3MgKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcblx0aWYgKCB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICkge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmJ5cGFzc1JlZGlyZWN0ID0gZnVuY3Rpb24oKSB7XHJcblx0aWYgKCF0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gU3RvcmUgdGhlIGJ5cGFzc2VkIG5hbWVcclxuXHR0aGlzLmJ5cGFzc2VkTmFtZSA9IHRoaXMubmFtZTtcclxuXHQvLyBVcGRhdGUgdGl0bGUgbGFiZWxcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLnNldExhYmVsKGB7eyR7dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0fX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCk7XHJcblx0Ly8gVXBkYXRlIHByb3BlcnRpZXNcclxuXHR0aGlzLm5hbWUgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQ7XHJcblx0dGhpcy5tYWluVGV4dCA9IHRoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dDtcclxuXHR0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPSBudWxsO1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMuY2hhbmdlZCAmJiB0aGlzLndpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gdGhpcy53aWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHBpcGUgPSB0aGlzLnBpcGVTdHlsZTtcclxuXHR2YXIgZXF1YWxzID0gdGhpcy5lcXVhbHNTdHlsZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gKHRoaXMuaGFzQ2xhc3NSYXRpbmdzIHx8IHRoaXMuaXNTaGVsbFRlbXBsYXRlKSAmJiB0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHR2YXIgY2xhc3NWYWwgPSBjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKTtcclxuXHR2YXIgaW1wb3J0YW5jZUl0ZW0gPSB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICYmIHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0dmFyIGltcG9ydGFuY2VWYWwgPSBpbXBvcnRhbmNlSXRlbSAmJiBpbXBvcnRhbmNlSXRlbS5nZXREYXRhKCk7XHJcblxyXG5cdHJldHVybiAoXCJ7e1wiICtcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQoICh0aGlzLmhhc0NsYXNzUmF0aW5ncyB8fCB0aGlzLmlzU2hlbGxUZW1wbGF0ZSkgJiYgY2xhc3NWYWwhPW51bGwgPyBgJHtwaXBlfWNsYXNzJHtlcXVhbHN9JHtjbGFzc1ZhbHx8XCJcIn1gIDogXCJcIiApICtcclxuXHRcdCggdGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncyAmJiBpbXBvcnRhbmNlVmFsIT1udWxsID8gYCR7cGlwZX1pbXBvcnRhbmNlJHtlcXVhbHN9JHtpbXBvcnRhbmNlVmFsfHxcIlwifWAgOiBcIlwiICkgK1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHRcdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlLCBlcXVhbHMpKVxyXG5cdFx0XHQuam9pbihcIlwiKSArXHJcblx0XHR0aGlzLmVuZEJyYWNlc1N0eWxlKVxyXG5cdFx0LnJlcGxhY2UoL1xcbit9fSQvLCBcIlxcbn19XCIpOyAvLyBhdm9pZCBlbXB0eSBsaW5lIGF0IGVuZCBsaWtlIFtbU3BlY2lhbDpEaWZmLzkyNTk4MjE0Ml1dXHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0aWYgKHRoaXMucHJlZmVyZW5jZXMuYnlwYXNzUmVkaXJlY3RzKSB7XHJcblx0XHR0aGlzLmJ5cGFzc1JlZGlyZWN0KCk7XHJcblx0fVxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5zZXRQcmVmZXJlbmNlcyhwcmVmcyk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYW5uZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBEcm9wZG93blBhcmFtZXRlcldpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSAkLmV4dGVuZCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyNCUnPlwiKVxyXG5cdH0sIGNvbmZpZyB8fCB7fSApO1xyXG5cclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cclxuXHR0aGlzLiRvdmVybGF5ID0gY29uZmlnLiRvdmVybGF5O1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1kcm9wZG93blBhcmFtZXRlcldpZGdldFwiKTtcclxuICAgIFxyXG5cdC8vIEF1dG9maWxsZWQgaWNvblxyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9ICEhY29uZmlnLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbiA9IG5ldyBPTy51aS5JY29uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInJvYm90XCIsXHJcblx0XHR0aXRsZTogXCJBdXRvZmlsbGVkIGJ5IFJhdGVyXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIC01cHggMCA1cHg7bWluLXdpZHRoOiAxNnB4O3dpZHRoOiAxNnB4O2xlZnQ6dW5zZXQ7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLWluZGljYXRvckVsZW1lbnQtaW5kaWNhdG9yXCIpLmJlZm9yZShcclxuXHRcdHRoaXMuYXV0b2ZpbGxlZEljb24uJGVsZW1lbnRcclxuXHQpO1xyXG5cclxuXHQvLyBFdmVudHNcclxuXHR0aGlzLm1lbnUuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcImNob29zZVwiOiBcIm9uRHJvcGRvd25NZW51Q2hvb3NlXCIsXHJcblx0XHRcInNlbGVjdFwiOiBcIm9uRHJvcGRvd25NZW51U2VsZWN0XCJcclxuXHR9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5Ecm9wZG93bldpZGdldCApO1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLnNldEF1dG9maWxsZWQgPSBmdW5jdGlvbihzZXRBdXRvZmlsbCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZEljb24udG9nZ2xlKCEhc2V0QXV0b2ZpbGwpO1xyXG5cdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS1kcm9wZG93bldpZGdldC1oYW5kbGVcIikuY3NzKHtcclxuXHRcdFwiYm9yZGVyXCI6IHNldEF1dG9maWxsID8gXCIxcHggZGFzaGVkICMzNmNcIiA6IFwiXCJcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWQgPSAhIXNldEF1dG9maWxsO1xyXG59O1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRHJvcGRvd25NZW51Q2hvb3NlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRBdXRvZmlsbGVkKGZhbHNlKTtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Ecm9wZG93bk1lbnVTZWxlY3QgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnUuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdHJldHVybiBzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmdldERhdGEoKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuLyoqXHJcbiAqIEEgSG9yaXpvbnRhbExheW91dCB0aGF0IGlzIGFsc28gYSB3aWRnZXQsIGFuZCBjYW4gdGh1cyBiZSBwbGFjZWQgd2l0aGluXHJcbiAqIGZpZWxkIGxheW91dHMuXHJcbiAqIFxyXG4gKiBAY2xhc3NcclxuICogQHBhcmFtIHsqfSBjb25maWcgY29uZmlndXJhdGlvbiBmb3IgT08udWkuSG9yaXpvbnRhbExheW91dFxyXG4gKi9cclxuZnVuY3Rpb24gSG9yaXpvbnRhbExheW91dFdpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRIb3Jpem9udGFsTGF5b3V0V2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIHt9ICk7XHJcbiAgICBcclxuXHR0aGlzLmxheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KCB7XHJcblx0XHQuLi5jb25maWcsXHJcblx0XHQkZWxlbWVudDogdGhpcy4kZWxlbWVudFxyXG5cdH0pO1xyXG5cclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIEhvcml6b250YWxMYXlvdXRXaWRnZXQsIE9PLnVpLldpZGdldCApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSG9yaXpvbnRhbExheW91dFdpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiLy8gPG5vd2lraT5cclxuXHJcbi8qKlxyXG4gKiBAY2ZnIHtPTy51aS5FbGVtZW50W119IGl0ZW1zIEl0ZW1zIHRvIGJlIGFkZGVkXHJcbiAqIEBjZmcge051bWJlcn0gZGlzcGxheUxpbWl0IFRoZSBtb3N0IHRvIHNob3cgYXQgb25jZS4gSWYgdGhlIG51bWJlciBvZiBpdGVtc1xyXG4gKiAgaXMgbW9yZSB0aGFuIHRoaXMsIHRoZW4gb25seSB0aGUgZmlyc3QgKGRpc3BsYXlMaW1pdCAtIDEpIGl0ZW1zIGFyZSBzaG93bi5cclxuICovXHJcbnZhciBQYXJhbWV0ZXJMaXN0V2lkZ2V0ID0gZnVuY3Rpb24gUGFyYW1ldGVyTGlzdFdpZGdldCggY29uZmlnICkge1xyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJMaXN0V2lkZ2V0LnBhcmVudC5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQuY2FsbCggdGhpcywge1xyXG5cdFx0JGdyb3VwOiB0aGlzLiRlbGVtZW50XHJcblx0fSApO1xyXG5cdHRoaXMuYWRkSXRlbXMoIGNvbmZpZy5pdGVtcyApO1xyXG5cclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyTGlzdFdpZGdldFwiKTtcclxuICAgIFxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcbiAgIFxyXG5cdC8vIEhpZGUgc29tZSBwYXJhbWV0ZXJzIChpbml0aWFsbHkpLCBpZiBtb3JlIHRoYW4gc2V0IGRpc3BsYXkgbGltaXQgLS0gd2hpY2ggaXMgdGhlIFxyXG5cdC8vIG9uZSBtb3JlIHRoYW4gY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0LCB0byBwcmV2ZW50IG9ubHkgb25lIHBhcmFtIGJlaW5nIGhpZGRlblxyXG5cdC8vIChtb3N0bHk6IG1heSBvY2Nhc2lvbmFsbHkgb2NjdXIgaWYgcGFyYW1zIHdlcmUgYXV0by1maWxsZWQpLlxyXG5cdGxldCBkaXNwbGF5TGltaXQgPSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCArIDE7XHJcblx0aWYgKGRpc3BsYXlMaW1pdCAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IGRpc3BsYXlMaW1pdCApIHtcclxuXHRcdHZhciBoaWRlRnJvbU51bWJlciA9IGRpc3BsYXlMaW1pdCAtIDE7IC8vIE9uZS1pbmRleGVkXHJcblx0XHR2YXIgaGlkZUZyb21JbmRleCA9IGhpZGVGcm9tTnVtYmVyIC0gMTsgLy8gWmVyby1pbmRleGVkXHJcblx0XHR2YXIgaGlkZGVuQ291bnQgPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IGhpZGVGcm9tSW5kZXg7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmICghdGhpcy5pdGVtc1tpXS5hdXRvZmlsbGVkKSB7IC8vIERvbid0IGhpZGUgYXV0by1maWxsZWQgcGFyYW1zXHJcblx0XHRcdFx0dGhpcy5pdGVtc1tpXS50b2dnbGUoZmFsc2UpO1xyXG5cdFx0XHRcdGhpZGRlbkNvdW50Kys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChoaWRkZW5Db3VudD4wKSB7XHJcblx0XHRcdC8vIEFkZCBidXR0b24gdG8gc2hvdyB0aGUgaGlkZGVuIHBhcmFtc1xyXG5cdFx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0XHRcdGxhYmVsOiBcIlNob3cgXCIgKyBoaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoaGlkZGVuQ291bnQ9PT0xID8gXCJwYXJhbWV0ZXJcIiA6IFwicGFyYW1ldGVyc1wiKSxcclxuXHRcdFx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0XHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmFkZEl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQWRkIHRoZSBidXR0b24gdGhhdCBhbGxvd3MgdXNlciB0byBhZGQgbW9yZSBwYXJhbWV0ZXJzXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyXCIsXHJcblx0XHRpY29uOiBcImFkZFwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5hZGRJdGVtcyhbdGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uXSk7XHJcblxyXG5cdC8qIC0tLSBFdmVudHMgLS0tICovXHJcblxyXG5cdC8vIEhhbmRsZSBkZWxldGUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7IGRlbGV0ZTogXCJwYXJhbWV0ZXJEZWxldGVcIlx0fSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywgeyBwYXJhbWV0ZXJEZWxldGU6IFwib25QYXJhbWV0ZXJEZWxldGVcIiB9ICk7XHJcbiAgICBcclxuXHQvLyBIYW5kbGUgY2hhbmdlIGV2ZW50cyBmcm9tIFBhcmFtZXRlcldpZGdldHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSggeyBjaGFuZ2U6IFwicGFyYW1ldGVyQ2hhbmdlXCJcdH0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHsgcGFyYW1ldGVyQ2hhbmdlOiBcIm9uUGFyYW1ldGVyQ2hhbmdlXCIgfSApO1xyXG5cclxuXHQvLyBIYW5kbGUgdXBkYXRlZFNpemUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJ1cGRhdGVkU2l6ZVwiOiBcInBhcmFtZXRlclVwZGF0ZWRTaXplXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJwYXJhbWV0ZXJVcGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIn0gKTtcclxuICAgIFxyXG5cdC8vIEhhbmRsZSBidXR0b24gY2xpY2tzXHJcblx0aWYgKHRoaXMuc2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uICkge1xyXG5cdFx0dGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25TaG93TW9yZVBhcmFtZXRlcnNCdXR0b25DbGlja1wiIH0gKTtcclxuXHR9XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uQWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrXCIgfSApO1xyXG59O1xyXG5cclxuT08uaW5oZXJpdENsYXNzKCBQYXJhbWV0ZXJMaXN0V2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuT08ubWl4aW5DbGFzcyggUGFyYW1ldGVyTGlzdFdpZGdldCwgT08udWkubWl4aW4uR3JvdXBFbGVtZW50ICk7XHJcbi8qXHJcbm1ldGhvZHMgZnJvbSBtaXhpbjpcclxuIC0gYWRkSXRlbXMoIGl0ZW1zLCBbaW5kZXhdICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4gLSBjbGVhckl0ZW1zKCApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gZmluZEl0ZW1Gcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudHxudWxsXHJcbiAtIGZpbmRJdGVtc0Zyb21EYXRhKCBkYXRhICkgOiBPTy51aS5FbGVtZW50W11cclxuIC0gcmVtb3ZlSXRlbXMoIGl0ZW1zICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4qL1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5hZGRJdGVtcyA9IGZ1bmN0aW9uICggaXRlbXMsIGluZGV4ICkge1xyXG5cdGlmICggaXRlbXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHQvLyBDYWxsIG1peGluIG1ldGhvZCB0byBkbyB0aGUgYWRkaW5nXHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LnByb3RvdHlwZS5hZGRJdGVtcy5jYWxsKCB0aGlzLCBpdGVtcywgaW5kZXggKTtcclxuXHJcblx0Ly8gZW1pdCB1cGRhdGVkU2l6ZSBldmVudCBcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHRcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyRGVsZXRlID0gZnVuY3Rpb24ocGFyYW1ldGVyKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbcGFyYW1ldGVyXSk7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25QYXJhbWV0ZXJDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5nZXRQYXJhbWV0ZXJJdGVtcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29uc3RydWN0b3IubmFtZSA9PT0gXCJQYXJhbWV0ZXJXaWRnZXRcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vblNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbdGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2gocGFyYW1ldGVyV2lkZ2V0ID0+IHBhcmFtZXRlcldpZGdldC50b2dnbGUodHJ1ZSkpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLmFkZFBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLmVtaXQoXCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbihwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSB7XHJcblx0cmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSlcclxuXHRcdC5qb2luKFwiXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUuc2V0UHJlZmVyZW5jZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBwcmVmcztcclxuXHR2YXIgcGFyYW1zID0gdGhpcy5nZXRQYXJhbWV0ZXJJdGVtcygpO1xyXG5cdC8vIFVuaGlkZSBzb21lIHBhcmFtZXRlcnMgb2YgdGhlIGNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCBoYXMgaW5jcmVhc2VkLlxyXG5cdC8vIChOb3QgaGlkaW5nIGFueSBpZiBpdCBkZWNyZWFzZWQsIHNpbmNlIGl0J3MgYSAqbG93ZXIqIGxpbWl0IG9mIHdoYXQgbmVlZHMgdG8gYmUgc2hvd24uKVxyXG5cdGlmICggcGFyYW1zLmxlbmd0aCA8PSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dmFyIGhpZGRlblBhcmFtcyA9IHBhcmFtcy5maWx0ZXIocGFyYW0gPT4gIXBhcmFtLmlzVmlzaWJsZSgpKTtcclxuXHR2YXIgdmlzaWJsZVBhcmFtc0NvdW50ID0gcGFyYW1zLmxlbmd0aCAtIGhpZGRlblBhcmFtcy5sZW5ndGg7XHJcblx0aWYgKFxyXG5cdFx0aGlkZGVuUGFyYW1zID09PSAwIHx8XHJcbiAgICAgICAgdmlzaWJsZVBhcmFtc0NvdW50ID49IHRoaXMucHJlZmVyZW5jZXMuY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0XHJcblx0KSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHZhciBudW1Ub1VuaGlkZSA9IE1hdGgubWluKFxyXG5cdFx0dGhpcy5wcmVmZXJlbmNlcy5jb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgLSB2aXNpYmxlUGFyYW1zQ291bnQsXHJcblx0XHRoaWRkZW5QYXJhbXMubGVuZ3RoXHJcblx0KTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IG51bVRvVW5oaWRlOyBpKyspIHtcclxuXHRcdGhpZGRlblBhcmFtc1tpXS50b2dnbGUodHJ1ZSk7XHJcblx0fVxyXG5cdHZhciBzdGlsbEhpZGRlbkNvdW50ID0gaGlkZGVuUGFyYW1zLmxlbmd0aCAtIG51bVRvVW5oaWRlO1xyXG5cdGlmIChzdGlsbEhpZGRlbkNvdW50ID09PSAwKSB7XHJcblx0XHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbi5zZXRMYWJlbChcclxuXHRcdFx0XCJTaG93IFwiICsgc3RpbGxIaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoc3RpbGxIaWRkZW5Db3VudD09PTEgPyBcInBhcmFtdGVyXCIgOiBcInBhcmFtdGVyc1wiKVxyXG5cdFx0KTtcclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJMaXN0V2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBub3JtYWxpc2VZZXNObywgZmlsdGVyQW5kTWFwIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IEhvcml6b250YWxMYXlvdXRXaWRnZXQgZnJvbSBcIi4vSG9yaXpvbnRhbExheW91dFdpZGdldFwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUGFyYW1ldGVyV2lkZ2V0KCBwYXJhbWV0ZXIsIHBhcmFtRGF0YSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdHRoaXMubmFtZSA9IHBhcmFtZXRlci5uYW1lO1xyXG5cdHRoaXMudmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkID0gcGFyYW1ldGVyLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5pc0ludmFsaWQgPSBwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbDtcclxuXHR0aGlzLnBhcmFtRGF0YSA9IHBhcmFtRGF0YSB8fCB7fTtcclxuXHR0aGlzLmFsbG93ZWRWYWx1ZXMgPSB0aGlzLnBhcmFtRGF0YS5hbGxvd2VkVmFsdWVzIHx8IFtdO1xyXG5cdHRoaXMuaXNSZXF1aXJlZCA9IHRoaXMucGFyYW1EYXRhLnJlcXVpcmVkO1xyXG5cdHRoaXMuaXNTdWdnZXN0ZWQgPSB0aGlzLnBhcmFtRGF0YS5zdWdnZXN0ZWQ7XHJcblxyXG5cdC8vIE1ha2UgYSBjaGVja2JveCBpZiBvbmx5IDEgb3IgMiBhbGxvd2VkIHZhbHVlc1xyXG5cdHN3aXRjaCh0aGlzLmFsbG93ZWRWYWx1ZXMubGVuZ3RoKSB7XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xyXG5cdGNhc2UgMTpcclxuXHRcdHRoaXMuYWxsb3dlZFZhbHVlc1sxXSA9IG51bGw7XHJcblx0XHQvKiBmYWxsLXRocm91Z2ggKi9cclxuXHRjYXNlIDI6XHJcblx0XHR2YXIgaXNGaXJzdEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgKSA9PT0gMCB8fFxyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIG5vcm1hbGlzZVllc05vKHBhcmFtZXRlci52YWx1ZSkgKSA9PT0gMFxyXG5cdFx0KTtcclxuXHRcdHZhciBpc1NlY29uZEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgfHwgbnVsbCApID09PSAxIHx8XHJcblx0XHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggcGFyYW1ldGVyLnZhbHVlID8gbm9ybWFsaXNlWWVzTm8ocGFyYW1ldGVyLnZhbHVlKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KCB7XHJcblx0XHRcdHNlbGVjdGVkOiBpc0luZGV0ZXJtaW5hdGUgPyB1bmRlZmluZWQgOiBpc0ZpcnN0QWxsb3dlZFZhbCxcclxuXHRcdFx0aW5kZXRlcm1pbmF0ZTogaXNJbmRldGVybWluYXRlID8gdHJ1ZSA6IHVuZGVmaW5lZCxcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8bGFiZWwgc3R5bGU9J21hcmdpbjowIDAgMCA1cHgnPlwiKVxyXG5cdFx0fSApO1xyXG5cdFx0YnJlYWs7XHJcblx0ZGVmYXVsdDpcclxuXHRcdFx0Ly8gTm8gY2hlY2tib3hcclxuXHR9IC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi9cclxuXHJcblx0LyogLS0tIEVESVQgUEFSQU1FVEVSIExBWU9VVCAtLS0gKi9cclxuXHJcblx0dGhpcy5pbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KCB7XHJcblx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcclxuXHRcdC8vIGxhYmVsOiBwYXJhbWV0ZXIubmFtZSArIFwiID1cIixcclxuXHRcdC8vIGxhYmVsUG9zaXRpb246IFwiYmVmb3JlXCIsXHJcblx0XHRvcHRpb25zOiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcyxcclxuXHRcdFx0dmFsID0+IHZhbCE9PW51bGwsXHJcblx0XHRcdHZhbCA9PiAoe2RhdGE6IHZhbCwgbGFiZWw6dmFsfSlcclxuXHRcdCksXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206MDsnPlwiKSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSApO1xyXG5cdC8vIFJlZHVjZSB0aGUgZXhjZXNzaXZlIHdoaXRlc3BhY2UvaGVpZ2h0XHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiaW5wdXRcIikuY3NzKHtcclxuXHRcdFwicGFkZGluZy10b3BcIjogMCxcclxuXHRcdFwicGFkZGluZy1ib3R0b21cIjogXCIycHhcIixcclxuXHRcdFwiaGVpZ2h0XCI6IFwiMjRweFwiXHJcblx0fSk7XHJcblx0Ly8gRml4IGxhYmVsIHBvc2l0aW9uaW5nIHdpdGhpbiB0aGUgcmVkdWNlZCBoZWlnaHRcclxuXHR0aGlzLmlucHV0LiRlbGVtZW50LmZpbmQoXCJzcGFuLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbFwiKS5jc3Moe1wibGluZS1oZWlnaHRcIjogXCJub3JtYWxcIn0pO1xyXG5cdC8vIEFsc28gcmVkdWNlIGhlaWdodCBvZiBkcm9wZG93biBidXR0b24gKGlmIG9wdGlvbnMgYXJlIHByZXNlbnQpXHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiYS5vby11aS1idXR0b25FbGVtZW50LWJ1dHRvblwiKS5jc3Moe1xyXG5cdFx0XCJwYWRkaW5nLXRvcFwiOiAwLFxyXG5cdFx0XCJoZWlnaHRcIjogXCIyNHB4XCIsXHJcblx0XHRcIm1pbi1oZWlnaHRcIjogXCIwXCJcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jb25maXJtQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImNoZWNrXCIsXHJcblx0XHRsYWJlbDogXCJEb25lXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1yaWdodDowJz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jYW5jZWxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcclxuXHRcdGljb246IFwidW5kb1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmRlbGV0ZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0aWNvbjogdGhpcy5pc1JlcXVpcmVkID8gXCJyZXN0b3JlXCIgOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogdGhpcy5pc1JlcXVpcmVkID8gXCJSZXF1aXJlZCBwYXJhbWV0ZXJcIiA6IFwiRGVsZXRlXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdGRpc2FibGVkOiB0aGlzLmlzUmVxdWlyZWRcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0QnV0dG9uQ29udHJvbHMgPSBuZXcgT08udWkuQnV0dG9uR3JvdXBXaWRnZXQoe1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5jb25maXJtQnV0dG9uLFxyXG5cdFx0XHR0aGlzLmNhbmNlbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5kZWxldGVCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmb250LXNpemU6OTIlJz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b25Db250cm9scy4kZWxlbWVudC5maW5kKFwiYSBzcGFuOmZpcnN0LWNoaWxkXCIpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiLFxyXG5cdFx0XCJtYXJnaW4tcmlnaHRcIjogMFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmVkaXRMYXlvdXRDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW5wdXQsXHJcblx0XHRcdHRoaXMuZWRpdEJ1dHRvbkNvbnRyb2xzXHJcblx0XHRdLFxyXG5cdFx0Ly8kZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J3dpZHRoOiA0OCU7bWFyZ2luOjA7Jz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLmVkaXRMYXlvdXRDb250cm9scywge1xyXG5cdFx0bGFiZWw6IHRoaXMubmFtZSArIFwiID1cIixcclxuXHRcdGFsaWduOiBcInRvcFwiLFxyXG5cdFx0aGVscDogdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24gJiYgdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24uZW4gfHwgZmFsc2UsXHJcblx0XHRoZWxwSW5saW5lOiB0cnVlXHJcblx0fSkudG9nZ2xlKCk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LiRlbGVtZW50LmZpbmQoXCJsYWJlbC5vby11aS1pbmxpbmUtaGVscFwiKS5jc3Moe1wibWFyZ2luXCI6IFwiLTEwcHggMCA1cHggMTBweFwifSk7XHJcblxyXG5cdC8qIC0tLSBSRUFEIChDT0xMQVBTRUQpIERJU1BMQVkgT0YgUEFSQU1FVEVSIC0tLSAqL1xyXG5cclxuXHR0aGlzLmludmFsaWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiYmxvY2tcIixcclxuXHRcdHRpdGxlOiBcIkludmFsaWQgcGFyYW1ldGVyOiBubyB2YWx1ZSBzcGVjaWZpZWQhXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIDVweCAwIC01cHg7IG1pbi13aWR0aDogMTZweDsgd2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLmZ1bGxMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHRsYWJlbDp0aGlzLm5hbWUgK1xyXG5cdFx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHRcdD8gXCIgPSBcIiArIHRoaXMudmFsdWVcclxuXHRcdFx0XHQ6IFwiIFwiXHJcblx0XHRcdCksXHRcclxuXHRcdCRlbGVtZW50OiAkKFwiPGxhYmVsIHN0eWxlPSdtYXJnaW46IDA7Jz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwicm9ib3RcIixcclxuXHRcdHRpdGxlOiBcIkF1dG9maWxsZWQgYnkgUmF0ZXJcIixcclxuXHRcdGZsYWdzOiBcInByb2dyZXNzaXZlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46IDAgLTVweCAwIDVweDttaW4td2lkdGg6IDE2cHg7d2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy5lZGl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImVkaXRcIixcclxuXHRcdGZyYW1lZDogZmFsc2UsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tYm90dG9tOiAwOyc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0QnV0dG9uLiRlbGVtZW50LmZpbmQoXCJhXCIpLmNzcyh7XHJcblx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIwIDEwcHggMTBweCAwXCIsXHJcblx0XHRcIm1hcmdpbi1sZWZ0XCI6IFwiNXB4XCJcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b24uJGVsZW1lbnQuZmluZChcImEgc3BhblwiKS5maXJzdCgpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiXHJcblx0fSk7XHJcblxyXG5cdHRoaXMucmVhZExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW52YWxpZEljb24sXHJcblx0XHRcdHRoaXMuZnVsbExhYmVsLFxyXG5cdFx0XHR0aGlzLmF1dG9maWxsZWRJY29uLFxyXG5cdFx0XHR0aGlzLmVkaXRCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46MDt3aWR0aDp1bnNldDsnPlwiKVxyXG5cdH0pO1xyXG5cdGlmICh0aGlzLmNoZWNrYm94KSB7XHJcblx0XHR0aGlzLnJlYWRMYXlvdXQuYWRkSXRlbXMoW3RoaXMuY2hlY2tib3hdLCAyKTtcclxuXHR9XHJcblxyXG5cdC8qIC0tLSBDT05UQUlORVIgRk9SIEJPVEggTEFZT1VUUyAtLS0gKi9cclxuXHR0aGlzLiRlbGVtZW50ID0gJChcIjxkaXY+XCIpLmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyV2lkZ2V0XCIpXHJcblx0XHQuY3NzKHtcclxuXHRcdFx0XCJ3aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcdFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiLFxyXG5cdFx0XHRcImJvcmRlclwiOiB0aGlzLmF1dG9maWxsZWQgPyBcIjFweCBkYXNoZWQgIzM2Y1wiIDogXCIxcHggc29saWQgI2RkZFwiLFxyXG5cdFx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIxMHB4XCIsXHJcblx0XHRcdFwicGFkZGluZy1sZWZ0XCI6IFwiMTBweFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIjAgOHB4IDhweCAwXCIsXHJcblx0XHRcdFwiYmFja2dyb3VuZFwiOiB0aGlzLmlzSW52YWxpZCA/IFwiI2ZkZGRcIiA6IFwiI2ZmZmVcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQodGhpcy5yZWFkTGF5b3V0LiRlbGVtZW50LCB0aGlzLmVkaXRMYXlvdXQuJGVsZW1lbnQpO1xyXG4gICAgXHJcblx0dGhpcy5lZGl0QnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRWRpdENsaWNrXCIgfSApO1xyXG5cdHRoaXMuY29uZmlybUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNvbmZpcm1DbGlja1wiIH0gKTtcclxuXHR0aGlzLmNhbmNlbEJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNhbmNlbENsaWNrXCIgfSApO1xyXG5cdHRoaXMuZGVsZXRlQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRGVsZXRlQ2xpY2tcIiB9ICk7XHJcblx0aWYgKHRoaXMuY2hlY2tib3gpIHtcclxuXHRcdHRoaXMuY2hlY2tib3guY29ubmVjdCh0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNoZWNrYm94Q2hhbmdlXCJ9ICk7XHJcblx0fVxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRWRpdENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZWFkTGF5b3V0LnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IFwiI2ZmZmVcIn0pO1xyXG5cdHRoaXMuaW5wdXQuZm9jdXMoKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Db25maXJtQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnNldFZhbHVlKFxyXG5cdFx0dGhpcy5pbnB1dC5nZXRWYWx1ZSgpXHJcblx0KTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkNhbmNlbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5pbnB1dC5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkRlbGV0ZUNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5kZWxldGUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25DaGVja2JveENoYW5nZSA9IGZ1bmN0aW9uKGlzU2VsZWN0ZWQsIGlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdGlmIChpc0luZGV0ZXJtaW5hdGUpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0aWYgKGlzU2VsZWN0ZWQpIHtcclxuXHRcdHRoaXMuc2V0VmFsdWUodGhpcy5hbGxvd2VkVmFsdWVzWzBdKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSh0aGlzLmFsbG93ZWRWYWx1ZXNbMV0pO1xyXG5cdH1cclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiZGVsZXRlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xyXG5cdC8vIFR1cm4gb2ZmIGF1dG9maWxsIHN0eWxpbmdzL2ljb25cclxuXHR0aGlzLmF1dG9maWxsZWQgPSBmYWxzZTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IHNvbGlkICNkZGRcIn0pO1xyXG5cclxuXHQvLyBVcGRhdGUgdGhlIHN0b3JlZCB2YWx1ZVxyXG5cdHRoaXMudmFsdWUgPSB2YWw7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgaW5wdXQgdmFsdWUgZm9yIGVkaXQgbW9kZVxyXG5cdHRoaXMuaW5wdXQuc2V0VmFsdWUodGhpcy52YWx1ZSk7XHJcblxyXG5cdC8vIFVwZGF0ZSB2YWxpZGl0eVxyXG5cdHRoaXMuaXNJbnZhbGlkID0gdGhpcy52YWx1ZSA9PSBudWxsO1xyXG5cdHRoaXMuaW52YWxpZEljb24udG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IHRoaXMuaXNJbnZhbGlkID8gXCIjZmRkZFwiIDogXCIjZmZmZVwifSk7XHJcblxyXG5cdC8vIFVwZGF0ZWQgdGhlIGxhYmVsIGZvciByZWFkIG1vZGVcclxuXHR0aGlzLmZ1bGxMYWJlbC5zZXRMYWJlbChcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHQ/IFwiID0gXCIgKyB0aGlzLnZhbHVlXHJcblx0XHRcdDogXCJcIlxyXG5cdFx0KVxyXG5cdCk7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgY2hlY2tib3ggKGlmIHRoZXJlIGlzIG9uZSlcclxuXHRpZiAodGhpcy5jaGVja2JveCkge1xyXG5cdFx0dmFyIGlzRmlyc3RBbGxvd2VkVmFsID0gKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMuaW5kZXhPZiggdmFsICkgPT09IDAgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggbm9ybWFsaXNlWWVzTm8odmFsKSApID09PSAwXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzU2Vjb25kQWxsb3dlZFZhbCA9IChcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLmluZGV4T2YoIHZhbCB8fCBudWxsICkgPT09IDEgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggdmFsID8gbm9ybWFsaXNlWWVzTm8odmFsKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveC5zZXRJbmRldGVybWluYXRlKGlzSW5kZXRlcm1pbmF0ZSwgdHJ1ZSk7XHJcblx0XHRpZiAoIWlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdFx0XHR2YXIgaXNTZWxlY3RlZCA9IGlzRmlyc3RBbGxvd2VkVmFsO1xyXG5cdFx0XHR0aGlzLmNoZWNrYm94LnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQsIHRydWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gRW1pdCBhIGNoYW5nZSBldmVudFxyXG5cdHRoaXMuZW1pdChcImNoYW5nZVwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuc2V0QXV0b2ZpbGxlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9IHRydWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbi50b2dnbGUodHJ1ZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IGRhc2hlZCAjMzZjXCJ9KTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24ocGlwZVN0eWxlLCBlcXVhbHNTdHlsZSkge1xyXG5cdGlmICh0aGlzLmlzSW52YWxpZCkge1xyXG5cdFx0cmV0dXJuIFwiXCI7XHJcblx0fVxyXG5cdHJldHVybiBwaXBlU3R5bGUgKyB0aGlzLm5hbWUgKyBlcXVhbHNTdHlsZSArICh0aGlzLnZhbHVlfHxcIlwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZm9jdXNJbnB1dCA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLmlucHV0LmZvY3VzKCk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUHJlZnNGb3JtV2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Ly8gQ29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvblxyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdFByZWZzRm9ybVdpZGdldC5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLXByZWZzRm9ybVdpZGdldFwiKTtcclxuXHJcblx0dGhpcy5sYXlvdXQgPSAgbmV3IE9PLnVpLkZpZWxkc2V0TGF5b3V0KCB7XHJcblx0XHRsYWJlbDogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0JGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSB7XHJcblx0XHRcImF1dG9zdGFydFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBSYXRlclwiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvc3RhcnRSZWRpcmVjdHNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvc3RhcnQgb24gcmVkaXJlY3RzXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9zdGFydE5hbWVzcGFjZXNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IG13LndpZGdldHMuTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBpbiB0aGVzZSBuYW1lc3BhY2VzXCJcclxuXHRcdH0sXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkJ5cGFzcyByZWRpcmVjdHMgdG8gYmFubmVyc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiAge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvZmlsbCBjbGFzcyBmcm9tIG90aGVyIGJhbm5lcnNcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PcmVzXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5Ub2dnbGVTd2l0Y2hXaWRnZXQoKSxcclxuXHRcdFx0bGFiZWw6IFwiQXV0b2ZpbGwgY2xhc3MgYmFzZWQgb24gT1JFUyBwcmVkaWN0aW9uXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9maWxsSW1wb3J0YW5jZVwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9maWxsIGxvdyBpbXBvcnRhbmNlXCJcclxuXHRcdH0sXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuTnVtYmVySW5wdXRXaWRnZXQoIHsgXCJtaW5cIjogMSB9ICksXHJcblx0XHRcdGxhYmVsOiBcIk1pbmltdW0gbnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gc2hvdyB1bmNvbGxhcHNlZFwiXHJcblx0XHR9LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvblNlbGVjdFdpZGdldCgge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuQnV0dG9uT3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IFwicHJlZmVyZW5jZXNcIixcclxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiRGVmYXVsdFwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJVc2VzIHRoZSBzYW1lIHNldHRpbmcgYXMgaWYgeW91IG1hbnVhbGx5IGVkaXRlZCB0aGUgcGFnZSwgYXMgcGVyIFNwZWNpYWw6UHJlZmVyZW5jZXNcIlxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkJ1dHRvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBcIndhdGNoXCIsXHJcblx0XHRcdFx0XHRcdGxhYmVsOiBcIkFsd2F5c1wiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJBbHdheXMgYWRkIHBhZ2VzIFJhdGVyIGVkaXRzIHRvIHlvdXIgd2F0Y2hsaXN0XCJcclxuXHRcdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5CdXR0b25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogXCJub2NoYW5nZVwiLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogXCJOZXZlclwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJOZXZlciBhZGQgcGFnZXMgUmF0ZXIgZWRpdCB0byB5b3VyIHdhdGNobGlzdFwiXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XVxyXG5cdFx0XHR9KS5zZWxlY3RJdGVtQnlEYXRhKFwicHJlZmVyZW5jZXNcIiksXHJcblx0XHRcdGxhYmVsOiBcIkFkZCBlZGl0ZWQgcGFnZXMgdG8gd2F0Y2hsaXN0XCJcclxuXHRcdH0sXHJcblx0XHRcInJlc2V0Q2FjaGVcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0XHRcdGxhYmVsOiBcIlJlc2V0IGNhY2hlXCIsXHJcblx0XHRcdFx0dGl0bGU6IFwiUmVtb3ZlIGNhY2hlZCBkYXRhLCBpbmNsdWRpbmcgbGlzdCBvZiBXaWtpUHJvamVjdHMgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnNcIixcclxuXHRcdFx0XHRmbGFnczogW1wiZGVzdHJ1Y3RpdmVcIl1cclxuXHRcdFx0fSApXHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Zm9yIChsZXQgcHJlZk5hbWUgaW4gdGhpcy5wcmVmZXJlbmNlcyApIHtcclxuXHRcdHRoaXMubGF5b3V0LmFkZEl0ZW1zKFtcclxuXHRcdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dCwge1xyXG5cdFx0XHRcdGxhYmVsOiB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5sYWJlbCxcclxuXHRcdFx0XHRhbGlnbjogXCJyaWdodFwiXHJcblx0XHRcdH0gKVxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnByZWZlcmVuY2VzLnJlc2V0Q2FjaGUuaW5wdXQuY29ubmVjdCh0aGlzLCB7XCJjbGlja1wiOiBcIm9uUmVzZXRDYWNoZUNsaWNrXCJ9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIFByZWZzRm9ybVdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcblxyXG5QcmVmc0Zvcm1XaWRnZXQucHJvdG90eXBlLnNldFByZWZWYWx1ZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHByZWZzICkge1xyXG5cdFx0bGV0IHZhbHVlID0gcHJlZnNbcHJlZk5hbWVdO1xyXG5cdFx0bGV0IGlucHV0ID0gdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0gJiYgdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0uaW5wdXQ7XHJcblx0XHRzd2l0Y2ggKGlucHV0ICYmIGlucHV0LmNvbnN0cnVjdG9yLm5hbWUpIHtcclxuXHRcdGNhc2UgXCJPb1VpQnV0dG9uU2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNlbGVjdEl0ZW1CeURhdGEodmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpTnVtYmVySW5wdXRXaWRnZXRcIjpcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNldFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LmNsZWFySXRlbXMoKTtcclxuXHRcdFx0dmFsdWUuZm9yRWFjaChucyA9PlxyXG5cdFx0XHRcdGlucHV0LmFkZFRhZyhcclxuXHRcdFx0XHRcdG5zLnRvU3RyaW5nKCksXHJcblx0XHRcdFx0XHRucyA9PT0gMFxyXG5cdFx0XHRcdFx0XHQ/IFwiKE1haW4pXCJcclxuXHRcdFx0XHRcdFx0OiBjb25maWcubXcud2dGb3JtYXR0ZWROYW1lc3BhY2VzW25zXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuUHJlZnNGb3JtV2lkZ2V0LnByb3RvdHlwZS5nZXRQcmVmcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBwcmVmcyA9IHt9O1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHRoaXMucHJlZmVyZW5jZXMgKSB7XHJcblx0XHRsZXQgaW5wdXQgPSB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dDtcclxuXHRcdGxldCB2YWx1ZTtcclxuXHRcdHN3aXRjaCAoaW5wdXQuY29uc3RydWN0b3IubmFtZSkge1xyXG5cdFx0Y2FzZSBcIk9vVWlCdXR0b25TZWxlY3RXaWRnZXRcIjpcclxuXHRcdFx0dmFsdWUgPSBpbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkuZ2V0RGF0YSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiT29VaU51bWJlcklucHV0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gTnVtYmVyKGlucHV0LmdldFZhbHVlKCkpOyAvLyB3aWRnZXQgdXNlcyBzdHJpbmdzLCBub3QgbnVtYmVycyFcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKS5tYXAoTnVtYmVyKTsgLy8gd2lkZ2V0IHVzZXMgc3RyaW5ncywgbm90IG51bWJlcnMhXHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0cHJlZnNbcHJlZk5hbWVdID0gdmFsdWU7XHJcblx0fVxyXG5cdHJldHVybiBwcmVmcztcclxufTtcclxuXHJcblByZWZzRm9ybVdpZGdldC5wcm90b3R5cGUub25SZXNldENhY2hlQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHRPTy51aS5jb25maXJtKFwiQWZ0ZXIgcmVzZXRpbmcgY2FjaGUsIFJhdGVyIHdpbGwgY2xvc2UgYW5kIHJlc3RhcnQuIEFueSBjaGFuZ2VzIG1hZGUgd2lsbCBiZSBkaXNjYXJkZWQuXCIpXHJcblx0XHQudGhlbihjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoY29uZmlybWVkKSB7IFxyXG5cdFx0XHRcdHRoaXMuZW1pdChcInJlc2V0Q2FjaGVcIik7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJlZnNGb3JtV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxudmFyIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQgPSBmdW5jdGlvbiBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCBjb25maWcgKSB7XHJcblx0T08udWkuVGV4dElucHV0V2lkZ2V0LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy5zdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnN1Z2dlc3Rpb25zKSA/IGNvbmZpZy5zdWdnZXN0aW9ucyA6IFtdO1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1zdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCIpO1xyXG59O1xyXG5PTy5pbmhlcml0Q2xhc3MoIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQsIE9PLnVpLlRleHRJbnB1dFdpZGdldCApO1xyXG5PTy5taXhpbkNsYXNzKCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50ICk7XHJcblxyXG4vLyBTZXQgc3VnZ2VzdGlvbi4gcGFyYW06IE9iamVjdFtdIHdpdGggb2JqZWN0cyBvZiB0aGUgZm9ybSB7IGRhdGE6IC4uLiAsIGxhYmVsOiAuLi4gfVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKHN1Z2dlc3Rpb25zKSB7XHJcblx0aWYgKCFBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSkge1xyXG5cdFx0aWYgKHN1Z2dlc3Rpb25zICE9IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKFwiW1JhdGVyXSBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyBjYWxsZWQgd2l0aCBhIG5vbi1hcnJheSB2YWx1ZTpcIiwgc3VnZ2VzdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR0aGlzLnN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnM7XHJcbn07XHJcblxyXG4vLyBSZXR1cm5zIGRhdGEsIGFzIGEgcmVzb2x1dGlvbiB0byBhIHByb21pc2UsIHRvIGJlIHBhc3NlZCB0byAjZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5nZXRMb29rdXBSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlKG5ldyBSZWdFeHAoXCJcXFxcYlwiICsgbXcudXRpbC5lc2NhcGVSZWdFeHAodGhpcy5nZXRWYWx1ZSgpKSwgXCJpXCIpKTtcclxuXHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSggeyBhYm9ydDogZnVuY3Rpb24gKCkge30gfSApO1xyXG59O1xyXG5cclxuLy8gPz8/XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLmdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IGZ1bmN0aW9uICggcmVzcG9uc2UgKSB7XHJcblx0cmV0dXJuIHJlc3BvbnNlIHx8IFtdO1xyXG59O1xyXG5cclxuLy8gSXMgcGFzc2VkIGRhdGEgZnJvbSAjZ2V0TG9va3VwUmVxdWVzdCwgcmV0dXJucyBhbiBhcnJheSBvZiBtZW51IGl0ZW0gd2lkZ2V0cyBcclxuU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IGZ1bmN0aW9uICggcGF0dGVybiApIHtcclxuXHR2YXIgbGFiZWxNYXRjaGVzSW5wdXRWYWwgPSBmdW5jdGlvbihzdWdnZXN0aW9uSXRlbSkge1xyXG5cdFx0cmV0dXJuIHBhdHRlcm4udGVzdChzdWdnZXN0aW9uSXRlbS5sYWJlbCkgfHwgKCAhc3VnZ2VzdGlvbkl0ZW0ubGFiZWwgJiYgcGF0dGVybi50ZXN0KHN1Z2dlc3Rpb25JdGVtLmRhdGEpICk7XHJcblx0fTtcclxuXHR2YXIgbWFrZU1lbnVPcHRpb25XaWRnZXQgPSBmdW5jdGlvbihvcHRpb25JdGVtKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0ZGF0YTogb3B0aW9uSXRlbS5kYXRhLFxyXG5cdFx0XHRsYWJlbDogb3B0aW9uSXRlbS5sYWJlbCB8fCBvcHRpb25JdGVtLmRhdGFcclxuXHRcdH0gKTtcclxuXHR9O1xyXG5cdHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihsYWJlbE1hdGNoZXNJbnB1dFZhbCkubWFwKG1ha2VNZW51T3B0aW9uV2lkZ2V0KTtcclxufTtcclxuXHJcbi8vIEV4dGVuZCBvbkxvb2t1cE1lbnVDaG9vc2UgbWV0aG9kIHRvIGVtaXQgYW4gY2hvb3NlIGV2ZW50XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLm9uTG9va3VwTWVudUNob29zZSA9IGZ1bmN0aW9uICggaXRlbSApIHtcclxuXHQvLyBHZXQgZGF0YVxyXG5cdGNvbnN0IGl0ZW1EYXRhID0gaXRlbS5nZXREYXRhKCk7XHJcblx0Ly8gU2ltcGxpZnkgaXRlbSBkYXRhIGlmIGl0IGlzIGFuIG9iamVjdCB3aXRoIGEgbmFtZSBwcm9wZXJ0eVxyXG5cdGlmIChpdGVtRGF0YSAmJiBpdGVtRGF0YS5uYW1lKSB7XHJcblx0XHRpdGVtLnNldERhdGEoaXRlbURhdGEubmFtZSk7XHJcblx0fVxyXG5cdC8vIEZpcnN0IGJsdXIgdGhlIGlucHV0LCB0byBwcmV2ZW50IHRoZSBtZW51IHBvcHBpbmcgYmFjayB1cFxyXG5cdHRoaXMuJGlucHV0LmJsdXIoKTtcclxuXHRPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZS5vbkxvb2t1cE1lbnVDaG9vc2UuY2FsbCh0aGlzLCBpdGVtKTtcclxuXHR0aGlzLmVtaXQoXCJjaG9vc2VcIiwgaXRlbURhdGEgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBhcHBDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCBmcm9tIFwiLi9TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuLi8uLi9nZXRCYW5uZXJzXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBUb3BCYXJXaWRnZXQoIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gJC5leHRlbmQoXHJcblx0XHR7XHJcblx0XHRcdGV4cGFuZGVkOiBmYWxzZSxcclxuXHRcdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZVxyXG5cdFx0fSxcclxuXHRcdGNvbmZpZyB8fCB7fVxyXG5cdCk7XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRUb3BCYXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdC8vIFNlYXJjaCBib3hcclxuXHR0aGlzLnNlYXJjaEJveCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCB7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJBZGQgYSBXaWtpUHJvamVjdC4uLlwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luOjAgLTFweDsgd2lkdGg6Y2FsYygxMDAlIC0gNTVweCk7Jz5cIiksXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcclxuXHR9ICk7XHJcblx0Z2V0QmFubmVyTmFtZXMoKVxyXG5cdFx0LnRoZW4oYmFubmVycyA9PiBbXHJcblx0XHRcdC4uLmJhbm5lcnMud2l0aFJhdGluZ3MubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy53aXRob3V0UmF0aW5ncy5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lLnJlcGxhY2UoXCJXaWtpUHJvamVjdCBcIiwgXCJcIiksXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdpdGhvdXRSYXRpbmdzOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMud3JhcHBlcnMubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW3RlbXBsYXRlIHdyYXBwZXJdXCIsXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdyYXBwZXI6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy5ub3RXUEJNLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMuaW5hY3RpdmUubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW2luYWN0aXZlXVwiLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWUsXHJcblx0XHRcdFx0XHR3aXRob3V0UmF0aW5nczogdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLFxyXG5cdFx0XHQuLi5iYW5uZXJzLndpci5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lICsgXCIgW1dvbWVuIEluIFJlZCBtZWV0dXAvaW5pdGlhdGl2ZV1cIixcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lLFxyXG5cdFx0XHRcdFx0d2l0aG91dFJhdGluZ3M6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKVxyXG5cdFx0XSlcclxuXHRcdC50aGVuKGJhbm5lck9wdGlvbnMgPT4gdGhpcy5zZWFyY2hCb3guc2V0U3VnZ2VzdGlvbnMoYmFubmVyT3B0aW9ucykpO1xyXG4gICAgXHJcblx0Ly8gQWRkIGJ1dHRvblxyXG5cdHRoaXMuYWRkQmFubmVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJhZGRcIixcclxuXHRcdHRpdGxlOiBcIkFkZFwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Zsb2F0OnJpZ2h0O21hcmdpbjogMDt0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEycHgpOyc+XCIpLFxyXG5cdH0gKTtcclxuXHR2YXIgJHNlYXJjaENvbnRhaW5lciA9ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgZmxleC1zaHJpbms6MTsgZmxleC1ncm93OjEwMDsgbWluLXdpZHRoOjI1MHB4OyB3aWR0aDo1MCU7Jz5cIilcclxuXHRcdC5hcHBlbmQodGhpcy5zZWFyY2hCb3guJGVsZW1lbnQsIHRoaXMuYWRkQmFubmVyQnV0dG9uLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gU2V0IGFsbCBjbGFzc2VzL2ltcG9ydGFuY2VzXHJcblx0Ly8gaW4gdGhlIHN0eWxlIG9mIGEgcG9wdXAgYnV0dG9uIHdpdGggYSBtZW51IChpcyBhY3R1YWxseSBhIGRyb3Bkb3duIHdpdGggYSBoaWRkZW4gbGFiZWwsIGJlY2F1c2UgdGhhdCBtYWtlcyB0aGUgY29kaW5nIGVhc2llci4pXHJcblx0dGhpcy5zZXRBbGxEcm9wRG93biA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJ0YWdcIixcclxuXHRcdGxhYmVsOiBcIlNldCBhbGwuLi5cIixcclxuXHRcdGludmlzaWJsZUxhYmVsOiB0cnVlLFxyXG5cdFx0bWVudToge1xyXG5cdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51U2VjdGlvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ2xhc3Nlc1wiXHJcblx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IG51bGx9LFxyXG5cdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj4obm8gY2xhc3MpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoY2xhc3NuYW1lID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IGNsYXNzbmFtZX0sXHJcblx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRuZXcgT08udWkuTWVudVNlY3Rpb25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGxhYmVsOiBcIkltcG9ydGFuY2VzXCJcclxuXHRcdFx0XHR9ICksXHJcblx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBudWxsfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+KG5vIGltcG9ydGFuY2UpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBpbXBvcnRhbmNlfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRdXHJcblx0XHR9LFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT1cXFwid2lkdGg6YXV0bztkaXNwbGF5OmlubGluZS1ibG9jaztmbG9hdDpsZWZ0O21hcmdpbjowXFxcIiB0aXRsZT0nU2V0IGFsbC4uLic+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0fSApO1xyXG5cclxuXHQvLyBSZW1vdmUgYWxsIGJhbm5lcnMgYnV0dG9uXHJcblx0dGhpcy5yZW1vdmVBbGxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYWxsXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiXHJcblx0fSApO1xyXG5cclxuXHQvLyBDbGVhciBhbGwgcGFyYW1ldGVycyBidXR0b25cclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJjYW5jZWxcIixcclxuXHRcdHRpdGxlOiBcIkNsZWFyIGFsbFwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIlxyXG5cdH0gKTtcclxuXHJcblx0Ly8gR3JvdXAgdGhlIGJ1dHRvbnMgdG9nZXRoZXJcclxuXHR0aGlzLm1lbnVCdXR0b25zID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLnJlbW92ZUFsbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5jbGVhckFsbEJ1dHRvblxyXG5cdFx0XSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2ZsZXg6MSAwIGF1dG87Jz5cIiksXHJcblx0fSApO1xyXG5cdC8vIEluY2x1ZGUgdGhlIGRyb3Bkb3duIGluIHRoZSBncm91cFxyXG5cdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnQucHJlcGVuZCh0aGlzLnNldEFsbERyb3BEb3duLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gUHV0IGV2ZXJ5dGhpbmcgaW50byBhIGxheW91dFxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci10b3BCYXJXaWRnZXRcIilcclxuXHRcdC5jc3Moe1xyXG5cdFx0XHRcInBvc2l0aW9uXCI6IFwiZml4ZWRcIixcclxuXHRcdFx0XCJ3aWR0aFwiOiBcIjEwMCVcIixcclxuXHRcdFx0XCJiYWNrZ3JvdW5kXCI6IFwiI2NjY1wiLFxyXG5cdFx0XHRcImRpc3BsYXlcIjogXCJmbGV4XCIsXHJcblx0XHRcdFwiZmxleC13cmFwXCI6IFwid3JhcFwiLFxyXG5cdFx0XHRcImp1c3RpZnktY29udGVudFwiOiBcInNwYWNlLWFyb3VuZFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIi0ycHggMCAwIDBcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQoXHJcblx0XHRcdCRzZWFyY2hDb250YWluZXIsXHJcblx0XHRcdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnRcclxuXHRcdCk7XHJcblxyXG5cdC8qIC0tLSBFdmVudCBoYW5kbGluZyAtLS0gKi9cclxuICAgIFxyXG5cdHRoaXMuc2VhcmNoQm94LmNvbm5lY3QodGhpcywge1xyXG5cdFx0XCJlbnRlclwiOiBcIm9uU2VhcmNoU2VsZWN0XCIsXHJcblx0XHRcImNob29zZVwiOiBcIm9uU2VhcmNoU2VsZWN0XCJcclxuXHR9KTtcclxuXHR0aGlzLmFkZEJhbm5lckJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25TZWFyY2hTZWxlY3RcIn0pO1xyXG5cdHRoaXMuc2V0QWxsRHJvcERvd24uZ2V0TWVudSgpLmNvbm5lY3QodGhpcywge1wiY2hvb3NlXCI6IFwib25SYXRpbmdDaG9vc2VcIn0pO1xyXG5cdHRoaXMucmVtb3ZlQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUFsbENsaWNrXCJ9KTtcclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQWxsQ2xpY2tcIn0pO1xyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggVG9wQmFyV2lkZ2V0LCBPTy51aS5QYW5lbExheW91dCApO1xyXG5cclxuVG9wQmFyV2lkZ2V0LnByb3RvdHlwZS5vblNlYXJjaFNlbGVjdCA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHR0aGlzLmVtaXQoXCJzZWFyY2hTZWxlY3RcIiwgZGF0YSk7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLm9uUmF0aW5nQ2hvb3NlID0gZnVuY3Rpb24oaXRlbSkge1xyXG5cdGNvbnN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTtcclxuXHRpZiAoZGF0YS5jbGFzcyB8fCBkYXRhLmNsYXNzPT09bnVsbCkge1xyXG5cdFx0dGhpcy5lbWl0KFwic2V0Q2xhc3Nlc1wiLCBkYXRhLmNsYXNzKTtcclxuXHR9XHJcblx0aWYgKGRhdGEuaW1wb3J0YW5jZSB8fCBkYXRhLmltcG9ydGFuY2U9PT1udWxsKSB7XHJcblx0XHR0aGlzLmVtaXQoXCJzZXRJbXBvcnRhbmNlc1wiLCBkYXRhLmltcG9ydGFuY2UpO1xyXG5cdH1cclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25SZW1vdmVBbGxDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZW1pdChcInJlbW92ZUFsbFwiKTtcclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25DbGVhckFsbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiY2xlYXJBbGxcIik7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLnNldERpc2FibGVkID0gZnVuY3Rpb24oZGlzYWJsZSkge1xyXG5cdFtcclxuXHRcdHRoaXMuc2VhcmNoQm94LFxyXG5cdFx0dGhpcy5hZGRCYW5uZXJCdXR0b24sXHJcblx0XHR0aGlzLnNldEFsbERyb3BEb3duLFxyXG5cdFx0dGhpcy5yZW1vdmVBbGxCdXR0b24sXHJcblx0XHR0aGlzLmNsZWFyQWxsQnV0dG9uXHJcblx0XS5mb3JFYWNoKHdpZGdldCA9PiB3aWRnZXQuc2V0RGlzYWJsZWQoZGlzYWJsZSkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9wQmFyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiB2YXIgaW5jcmVtZW50UHJvZ3Jlc3NCeUludGVydmFsID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsRGVsYXkgPSAxMDA7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsQW1vdW50ID0gMC4xO1xyXG5cdHZhciBpbmNyZW1lbnRJbnRlcnZhbE1heHZhbCA9IDk4O1xyXG5cdHJldHVybiB3aW5kb3cuc2V0SW50ZXJ2YWwoXHJcblx0XHRpbmNyZW1lbnRQcm9ncmVzcyxcclxuXHRcdGluY3JlbWVudEludGVydmFsRGVsYXksXHJcblx0XHRpbmNyZW1lbnRJbnRlcnZhbEFtb3VudCxcclxuXHRcdGluY3JlbWVudEludGVydmFsTWF4dmFsXHJcblx0KTtcclxufTsgKi9cclxuXHJcbnZhciBMb2FkRGlhbG9nID0gZnVuY3Rpb24gTG9hZERpYWxvZyggY29uZmlnICkge1xyXG5cdExvYWREaWFsb2cuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcbn07XHJcbk9PLmluaGVyaXRDbGFzcyggTG9hZERpYWxvZywgT08udWkuRGlhbG9nICk7IFxyXG5cclxuTG9hZERpYWxvZy5zdGF0aWMubmFtZSA9IFwibG9hZERpYWxvZ1wiO1xyXG5Mb2FkRGlhbG9nLnN0YXRpYy50aXRsZSA9IFwiTG9hZGluZyBSYXRlci4uLlwiO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHQvLyBDcmVhdGUgYSBsYXlvdXRcclxuXHR0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoIHsgXHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UgXHJcblx0fSApO1xyXG5cdC8vIENyZWF0ZSBjb250ZW50XHJcblx0dGhpcy5wcm9ncmVzc0JhciA9IG5ldyBPTy51aS5Qcm9ncmVzc0JhcldpZGdldCgge1xyXG5cdFx0cHJvZ3Jlc3M6IDFcclxuXHR9ICk7XHJcblx0dGhpcy5zZXR1cHRhc2tzID0gW1xyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgeW91ciBSYXRlciBwcmVmZXJlbmNlcy4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLFxyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgbGlzdCBvZiBwcm9qZWN0IGJhbm5lcnMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJMb2FkaW5nIHRhbGtwYWdlIHdpa2l0ZXh0Li4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiUGFyc2luZyB0YWxrcGFnZSB0ZW1wbGF0ZXMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJHZXR0aW5nIHRlbXBsYXRlcycgcGFyYW1ldGVyIGRhdGEuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJDaGVja2luZyBzdWJqZWN0IHBhZ2UuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJSZXRyaWV2aW5nIHF1YWxpdHkgcHJlZGljdGlvbi4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLnRvZ2dsZSgpLFxyXG5cdF07XHJcblx0dGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGxhYmVsOiBcIkNsb3NlXCJcclxuXHR9KS50b2dnbGUoKTtcclxuXHR0aGlzLnNldHVwUHJvbWlzZXMgPSBbXTtcclxuXHJcblx0Ly8gQXBwZW5kIGNvbnRlbnQgdG8gbGF5b3V0XHJcblx0dGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChcclxuXHRcdHRoaXMucHJvZ3Jlc3NCYXIuJGVsZW1lbnQsXHJcblx0XHQobmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkluaXRpYWxpc2luZzpcIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8c3Ryb25nIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pKS4kZWxlbWVudCxcclxuXHRcdC4uLnRoaXMuc2V0dXB0YXNrcy5tYXAod2lkZ2V0ID0+IHdpZGdldC4kZWxlbWVudCksXHJcblx0XHR0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50XHJcblx0KTtcclxuXHJcblx0Ly8gQXBwZW5kIGxheW91dCB0byBkaWFsb2dcclxuXHR0aGlzLiRib2R5LmFwcGVuZCggdGhpcy5jb250ZW50LiRlbGVtZW50ICk7XHJcblxyXG5cdC8vIENvbm5lY3QgZXZlbnRzIHRvIGhhbmRsZXJzXHJcblx0dGhpcy5jbG9zZUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNsb3NlQnV0dG9uQ2xpY2tcIiB9ICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5vbkNsb3NlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBDbG9zZSB0aGlzIGRpYWxvZywgd2l0aG91dCBwYXNzaW5nIGFueSBkYXRhXHJcblx0dGhpcy5jbG9zZSgpO1xyXG59O1xyXG5cclxuLy8gT3ZlcnJpZGUgdGhlIGdldEJvZHlIZWlnaHQoKSBtZXRob2QgdG8gc3BlY2lmeSBhIGN1c3RvbSBoZWlnaHQgKG9yIGRvbid0IHRvIHVzZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaGVpZ2h0KS5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0Qm9keUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gdGhpcy5jb250ZW50LiRlbGVtZW50Lm91dGVySGVpZ2h0KCB0cnVlICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5pbmNyZW1lbnRQcm9ncmVzcyA9IGZ1bmN0aW9uKGFtb3VudCwgbWF4aW11bSkge1xyXG5cdHZhciBwcmlvclByb2dyZXNzID0gdGhpcy5wcm9ncmVzc0Jhci5nZXRQcm9ncmVzcygpO1xyXG5cdHZhciBpbmNyZW1lbnRlZFByb2dyZXNzID0gTWF0aC5taW4obWF4aW11bSB8fCAxMDAsIHByaW9yUHJvZ3Jlc3MgKyBhbW91bnQpO1xyXG5cdHRoaXMucHJvZ3Jlc3NCYXIuc2V0UHJvZ3Jlc3MoaW5jcmVtZW50ZWRQcm9ncmVzcyk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5hZGRUYXNrUHJvbWlzZUhhbmRsZXJzID0gZnVuY3Rpb24odGFza1Byb21pc2VzKSB7XHJcblx0dmFyIG9uVGFza0RvbmUgPSBpbmRleCA9PiB7XHJcblx0XHQvLyBBZGQgXCJEb25lIVwiIHRvIGxhYmVsXHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbCh3aWRnZXQuZ2V0TGFiZWwoKSArIFwiIERvbmUhXCIpO1xyXG5cdFx0Ly8gSW5jcmVtZW50IHN0YXR1cyBiYXIuIFNob3cgYSBzbW9vdGggdHJhbnNpdGlvbiBieVxyXG5cdFx0Ly8gdXNpbmcgc21hbGwgc3RlcHMgb3ZlciBhIHNob3J0IGR1cmF0aW9uLlxyXG5cdFx0dmFyIHRvdGFsSW5jcmVtZW50ID0gMTAwIC8gdGhpcy5zZXR1cHRhc2tzLmxlbmd0aDsgLy8gcGVyY2VudFxyXG5cdFx0dmFyIHRvdGFsVGltZSA9IDQwMDsgLy8gbWlsbGlzZWNvbmRzXHJcblx0XHR2YXIgdG90YWxTdGVwcyA9IDEwO1xyXG5cdFx0dmFyIGluY3JlbWVudFBlclN0ZXAgPSB0b3RhbEluY3JlbWVudCAvIHRvdGFsU3RlcHM7XHJcblxyXG5cdFx0Zm9yICggdmFyIHN0ZXA9MDsgc3RlcCA8IHRvdGFsU3RlcHM7IHN0ZXArKykge1xyXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChcclxuXHRcdFx0XHR0aGlzLmluY3JlbWVudFByb2dyZXNzLmJpbmQodGhpcyksXHJcblx0XHRcdFx0dG90YWxUaW1lICogc3RlcCAvIHRvdGFsU3RlcHMsXHJcblx0XHRcdFx0aW5jcmVtZW50UGVyU3RlcFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH07XHJcblx0dmFyIG9uVGFza0Vycm9yID0gKGluZGV4LCBjb2RlLCBpbmZvKSA9PiB7XHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbChcclxuXHRcdFx0d2lkZ2V0LmdldExhYmVsKCkgKyBcIiBGYWlsZWQuIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdFx0dGhpcy5jbG9zZUJ1dHRvbi50b2dnbGUodHJ1ZSk7XHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHR9O1xyXG5cdHRhc2tQcm9taXNlcy5mb3JFYWNoKGZ1bmN0aW9uKHByb21pc2UsIGluZGV4KSB7XHJcblx0XHRwcm9taXNlLnRoZW4oXHJcblx0XHRcdCgpID0+IG9uVGFza0RvbmUoaW5kZXgpLFxyXG5cdFx0XHQoY29kZSwgaW5mbykgPT4gb25UYXNrRXJyb3IoaW5kZXgsIGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuLy8gVXNlIGdldFNldHVwUHJvY2VzcygpIHRvIHNldCB1cCB0aGUgd2luZG93IHdpdGggZGF0YSBwYXNzZWQgdG8gaXQgYXQgdGhlIHRpbWUgXHJcbi8vIG9mIG9wZW5pbmdcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4ge1xyXG5cdFx0XHR2YXIgc2hvd09yZXNUYXNrID0gISFkYXRhLm9yZXM7XHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrc1s2XS50b2dnbGUoc2hvd09yZXNUYXNrKTtcclxuXHRcdFx0dmFyIHRhc2tQcm9taXNlcyA9IGRhdGEub3JlcyA/IGRhdGEucHJvbWlzZXMgOiBkYXRhLnByb21pc2VzLnNsaWNlKDAsIC0xKTtcclxuXHRcdFx0ZGF0YS5pc09wZW5lZC50aGVuKCgpID0+IHRoaXMuYWRkVGFza1Byb21pc2VIYW5kbGVycyh0YXNrUHJvbWlzZXMpKTtcclxuXHRcdH0sIHRoaXMgKTtcclxufTtcclxuXHJcbi8vIFByZXZlbnQgd2luZG93IGZyb20gY2xvc2luZyB0b28gcXVpY2tseSwgdXNpbmcgZ2V0SG9sZFByb2Nlc3MoKVxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5nZXRIb2xkUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRpZiAoZGF0YS5zdWNjZXNzKSB7XHJcblx0XHQvLyBXYWl0IGEgYml0IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBjbG9zZSwgd2hpY2ggaGFwcGVucyBhdXRvbWF0aWNhbGx5XHJcblx0XHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHRcdC5uZXh0KDgwMCk7XHJcblx0fVxyXG5cdC8vIE5vIG5lZWQgdG8gd2FpdCBpZiBjbG9zZWQgbWFudWFsbHlcclxuXHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApO1xyXG59O1xyXG5cclxuLy8gVXNlIHRoZSBnZXRUZWFyZG93blByb2Nlc3MoKSBtZXRob2QgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW5ldmVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQuZmlyc3QoICgpID0+IHtcclxuXHRcdC8vIFBlcmZvcm0gY2xlYW51cDogcmVzZXQgbGFiZWxzXHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrcy5mb3JFYWNoKCBzZXR1cHRhc2sgPT4ge1xyXG5cdFx0XHRcdHZhciBjdXJyZW50TGFiZWwgPSBzZXR1cHRhc2suZ2V0TGFiZWwoKTtcclxuXHRcdFx0XHRzZXR1cHRhc2suc2V0TGFiZWwoXHJcblx0XHRcdFx0XHRjdXJyZW50TGFiZWwuc2xpY2UoMCwgY3VycmVudExhYmVsLmluZGV4T2YoXCIuLi5cIikrMylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LCB0aGlzICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkRGlhbG9nO1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgQmFubmVyV2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyV2lkZ2V0XCI7XHJcbmltcG9ydCBCYW5uZXJMaXN0V2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyTGlzdFdpZGdldFwiO1xyXG5pbXBvcnQgYXBwQ29uZmlnIGZyb20gXCIuLi9jb25maWdcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbmltcG9ydCBQcmVmc0Zvcm1XaWRnZXQgZnJvbSBcIi4vQ29tcG9uZW50cy9QcmVmc0Zvcm1XaWRnZXRcIjtcclxuaW1wb3J0IHsgc2V0UHJlZnMgYXMgQXBpU2V0UHJlZnMgfSBmcm9tIFwiLi4vcHJlZnNcIjtcclxuaW1wb3J0IHsgcGFyc2VUZW1wbGF0ZXMgfSBmcm9tIFwiLi4vVGVtcGxhdGVcIjtcclxuaW1wb3J0IFRvcEJhcldpZGdldCBmcm9tIFwiLi9Db21wb25lbnRzL1RvcEJhcldpZGdldFwiO1xyXG5pbXBvcnQgeyBmaWx0ZXJBbmRNYXAsIHVuaXF1ZUFycmF5IH0gZnJvbSBcIi4uL3V0aWxcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4uL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBNYWluV2luZG93KCBjb25maWcgKSB7XHJcblx0TWFpbldpbmRvdy5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIE1haW5XaW5kb3csIE9PLnVpLlByb2Nlc3NEaWFsb2cgKTtcclxuXHJcbk1haW5XaW5kb3cuc3RhdGljLm5hbWUgPSBcIm1haW5cIjtcclxuTWFpbldpbmRvdy5zdGF0aWMudGl0bGUgPSAkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXdlaWdodFwiOlwibm9ybWFsXCJ9KS5hcHBlbmQoXHJcblx0JChcIjxhPlwiKS5jc3Moe1wiZm9udC13ZWlnaHRcIjogXCJib2xkXCJ9KS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXUDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJSYXRlclwiKSxcclxuXHRcIiAoXCIsXHJcblx0JChcIjxhPlwiKS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXVDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJ0YWxrXCIpLFxyXG5cdFwiKSBcIixcclxuXHQkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXNpemVcIjpcIjkwJVwifSkudGV4dChcInZcIithcHBDb25maWcuc2NyaXB0LnZlcnNpb24pXHJcbik7XHJcbk1haW5XaW5kb3cuc3RhdGljLnNpemUgPSBcImxhcmdlXCI7XHJcbk1haW5XaW5kb3cuc3RhdGljLmFjdGlvbnMgPSBbXHJcblx0Ly8gUHJpbWFyeSAodG9wIHJpZ2h0KTpcclxuXHR7XHJcblx0XHRsYWJlbDogXCJYXCIsIC8vIG5vdCB1c2luZyBhbiBpY29uIHNpbmNlIGNvbG9yIGJlY29tZXMgaW52ZXJ0ZWQsIGkuZS4gd2hpdGUgb24gbGlnaHQtZ3JleVxyXG5cdFx0dGl0bGU6IFwiQ2xvc2UgKGFuZCBkaXNjYXJkIGFueSBjaGFuZ2VzKVwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJpbWFyeVwiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBTYWZlICh0b3AgbGVmdClcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2hvd1ByZWZzXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRpY29uOiBcInNldHRpbmdzXCIsXHJcblx0XHR0aXRsZTogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBPdGhlcnMgKGJvdHRvbSlcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2F2ZVwiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInNcIixcclxuXHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT0ncGFkZGluZzowIDFlbTsnPlNhdmU8L3NwYW4+XCIpLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJlZnNcIlxyXG5cdH0sXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcInByZXZpZXdcIixcclxuXHRcdGFjY2Vzc0tleTogXCJwXCIsXHJcblx0XHRsYWJlbDogXCJTaG93IHByZXZpZXdcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmV2aWV3XCIgb3IgXCJwcmVmc1wiXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2hhbmdlc1wiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInZcIixcclxuXHRcdGxhYmVsOiBcIlNob3cgY2hhbmdlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJwcmV2aWV3XCJdIC8vIGF2YWlsYWJsZSB3aGVuIGN1cnJlbnQgbW9kZSBpc24ndCBcImRpZmZcIiBvciBcInByZWZzXCJcclxuXHR9LFxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJiYWNrXCIsXHJcblx0XHRsYWJlbDogXCJCYWNrXCIsXHJcblx0XHRtb2RlczogW1wiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzIFwiZGlmZlwiIG9yIFwicHJlZnNcIlxyXG5cdH0sXHJcblx0XHJcblx0Ly8gXCJwcmVmc1wiIG1vZGUgb25seVxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJzYXZlUHJlZnNcIixcclxuXHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBcInByZWZzXCIgXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2xvc2VQcmVmc1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRtb2RlczogXCJwcmVmc1wiXHJcblx0fVxyXG5dO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBhcHBDb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFxyXG5cdC8qIC0tLSBUT1AgQkFSIC0tLSAqL1xyXG5cdHRoaXMudG9wQmFyID0gbmV3IFRvcEJhcldpZGdldCh7XHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0gKTtcclxuXHR0aGlzLiRoZWFkLmNzcyh7XCJoZWlnaHRcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLnRvcEJhci4kZWxlbWVudCk7XHJcblxyXG5cdC8qIC0tLSBGT09URVIgLS0tICovXHJcblx0dGhpcy5vcmVzTGFiZWwgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoe1xyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7IHBhZGRpbmc6IDEwcHg7IG1heC13aWR0aDogNTAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Jz5cIiksXHJcblx0XHRsYWJlbDogJChcIjxzcGFuPlwiKS5hcHBlbmQoXHJcblx0XHRcdCQoXCI8YT5cIilcclxuXHRcdFx0XHQuYXR0cih7XCJocmVmXCI6bXcudXRpbC5nZXRVcmwoXCJtdzpPUkVTXCIpLCBcInRhcmdldFwiOlwiX2JsYW5rXCJ9KVxyXG5cdFx0XHRcdC5hcHBlbmQoXHJcblx0XHRcdFx0XHQkKFwiPGltZz5cIilcclxuXHRcdFx0XHRcdFx0LmNzcyh7XCJ2ZXJ0aWNhbC1hbGlnblwiOiBcInRleHQtYm90dG9tO1wifSlcclxuXHRcdFx0XHRcdFx0LmF0dHIoe1xyXG5cdFx0XHRcdFx0XHRcdFwic3JjXCI6IFwiLy91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi81LzUxL09iamVjdGl2ZV9SZXZpc2lvbl9FdmFsdWF0aW9uX1NlcnZpY2VfbG9nby5zdmcvNDBweC1PYmplY3RpdmVfUmV2aXNpb25fRXZhbHVhdGlvbl9TZXJ2aWNlX2xvZ28uc3ZnLnBuZ1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwidGl0bGVcIjogXCJNYWNoaW5lIHByZWRpY3RlZCBxdWFsaXR5IGZyb20gT1JFU1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYWx0XCI6IFwiT1JFUyBsb2dvXCIsXHJcblx0XHRcdFx0XHRcdFx0XCJ3aWR0aFwiOiBcIjIwcHhcIixcclxuXHRcdFx0XHRcdFx0XHRcImhlaWdodFwiOiBcIjIwcHhcIlxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCksXHJcblx0XHRcdFwiIFwiLFxyXG5cdFx0XHQkKFwiPHNwYW4gY2xhc3M9J29yZXNQcmVkaWN0aW9uJz5cIilcclxuXHRcdClcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMucGFnZXR5cGVMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmbG9hdDpyaWdodDsgcGFkZGluZzogMTBweDsgbWF4LXdpZHRoOiAzMy4zMyU7IHRleHQtYWxpZ246IGNlbnRlcjsnPlwiKVxyXG5cdH0pLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZm9vdC5wcmVwZW5kKHRoaXMub3Jlc0xhYmVsLiRlbGVtZW50LCB0aGlzLnBhZ2V0eXBlTGFiZWwuJGVsZW1lbnQpO1xyXG5cclxuXHQvKiAtLS0gQ09OVEVOVCBBUkVBIC0tLSAqL1xyXG5cclxuXHQvLyBCYW5uZXJzIGFkZGVkIGR5bmFtaWNhbGx5IHVwb24gb3BlbmluZywgc28ganVzdCBuZWVkIGEgbGF5b3V0IHdpdGggYW4gZW1wdHkgbGlzdFxyXG5cdHRoaXMuYmFubmVyTGlzdCA9IG5ldyBCYW5uZXJMaXN0V2lkZ2V0KHtcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMuYmFubmVyTGlzdC4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0Ly8gUHJlZmVyZW5jZXMsIGZpbGxlZCBpbiB3aXRoIGN1cnJlbnQgcHJlZnMgdXBvbiBsb2FkaW5nLlxyXG5cdC8vIFRPRE86IE1ha2UgdGhpcyBpbnRvIGEgY29tcG9uZW50LCBhZGQgZmllbGRzIGFuZCBpbnB1dHNcclxuXHR0aGlzLnByZWZzRm9ybSA9IG5ldyBQcmVmc0Zvcm1XaWRnZXQoKTtcclxuXHR0aGlzLnByZWZzTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UsXHJcblx0XHQkY29udGVudDogdGhpcy5wcmVmc0Zvcm0uJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdC8vIFByZXZpZXcsIFNob3cgY2hhbmdlc1xyXG5cdHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lciA9IG5ldyBPTy51aS5GaWVsZHNldExheW91dCgge1xyXG5cdFx0bGFiZWw6IFwiUHJldmlld1wiXHJcblx0fSApO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudFdpZGdldCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCgge2xhYmVsOiBcIlwiLFx0JGVsZW1lbnQ6JChcIjxkaXY+XCIpXHR9KTtcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuYWRkSXRlbXMoW1xyXG5cdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRXaWRnZXQsXHRcdFx0XHJcblx0XHRcdHsgYWxpZ246IFwidG9wXCIgfVxyXG5cdFx0KVxyXG5cdF0pO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCgge1xyXG5cdFx0cGFkZGVkOiB0cnVlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lci4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5jb250ZW50QXJlYSA9IG5ldyBPTy51aS5TdGFja0xheW91dCgge1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5lZGl0TGF5b3V0LFxyXG5cdFx0XHR0aGlzLnByZWZzTGF5b3V0LFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRMYXlvdXRcclxuXHRcdF0sXHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLiRib2R5LmNzcyh7XCJ0b3BcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLmNvbnRlbnRBcmVhLiRlbGVtZW50KTtcclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHR0aGlzLnRvcEJhci5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwic2VhcmNoU2VsZWN0XCI6IFwib25TZWFyY2hTZWxlY3RcIixcclxuXHRcdFwic2V0Q2xhc3Nlc1wiOiBcIm9uU2V0Q2xhc3Nlc1wiLFxyXG5cdFx0XCJzZXRJbXBvcnRhbmNlc1wiOiBcIm9uU2V0SW1wb3J0YW5jZXNcIixcclxuXHRcdFwicmVtb3ZlQWxsXCI6IFwib25SZW1vdmVBbGxcIixcclxuXHRcdFwiY2xlYXJBbGxcIjogXCJvbkNsZWFyQWxsXCJcclxuXHR9KTtcclxuXHR0aGlzLmJhbm5lckxpc3QuY29ubmVjdCh0aGlzLCB7XCJ1cGRhdGVkU2l6ZVwiOiBcIm9uQmFubmVyTGlzdFVwZGF0ZVNpemVcIn0pO1xyXG5cclxuXHQvLyBIYW5kbGUgY2VydGFpbiBrZXlib2FyZCBldmVudHMuIFJlcXVpcmVzIHNvbWV0aGluZyBpbiB0aGUgUmF0ZXIgd2luZG93IHRvIGJlIGZvY3VzZWQsXHJcblx0Ly8gc28gYWRkIGEgdGFiaW5kZXggdG8gdGhlIGJvZHkgYW5kIGl0J3MgcGFyZW50IGNvbnRhaW5lci5cclxuXHR0aGlzLiRib2R5LmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKVxyXG5cdFx0LnBhcmVudCgpLmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKS5rZXlkb3duKGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0bGV0IHNjcm9sbEFtb3VudDtcclxuXHRcdFx0c3dpdGNoKGV2ZW50LndoaWNoKSB7XHJcblx0XHRcdGNhc2UgMzM6IC8vIHBhZ2UgdXBcclxuXHRcdFx0XHRzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpIC0gdGhpcy4kYm9keS5oZWlnaHQoKSowLjk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgMzQ6IC8vIHBhZ2UgZG93blxyXG5cdFx0XHRcdHNjcm9sbEFtb3VudCA9IHRoaXMuJGJvZHkuc2Nyb2xsVG9wKCkgKyB0aGlzLiRib2R5LmhlaWdodCgpKjAuOTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0uYmluZCh0aGlzKSk7XHJcblxyXG5cdHRoaXMucHJlZnNGb3JtLmNvbm5lY3QodGhpcywge1wicmVzZXRDYWNoZVwiOiBcIm9uUmVzZXRDYWNoZVwifSk7XHJcblx0XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkJhbm5lckxpc3RVcGRhdGVTaXplID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gR2V0IHRoZSBjdXJyZW50IHNjcm9sbCBhbW91bnRcclxuXHRjb25zdCBzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpO1xyXG5cdC8vIFVwZGF0ZSBzaXplICh3aGljaCByZXNldHMgdGhlIHNjcm9sbCB0byAwKVxyXG5cdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdC8vIFNjcm9sbCB0byB3aGVyZSBpdCB3YXMgYmVmb3JlXHJcblx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VEcmFnZ2FibGUgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgJGZyYW1lRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktd2luZG93LWZyYW1lXCIpO1xyXG5cdGxldCAkaGFuZGxlRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktcHJvY2Vzc0RpYWxvZy1sb2NhdGlvblwiKS5jc3Moe1wiY3Vyc29yXCI6XCJtb3ZlXCJ9KTtcclxuXHQvLyBQb3NpdGlvbiBmb3IgY3NzIHRyYW5zbGF0ZSB0cmFuc2Zvcm1hdGlvbnMsIHJlbGF0aXZlIHRvIGluaXRpYWwgcG9zaXRpb25cclxuXHQvLyAod2hpY2ggaXMgY2VudGVyZWQgb24gdmlld3BvcnQgd2hlbiBzY3JvbGxlZCB0byB0b3ApXHJcblx0bGV0IHBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcblx0Y29uc3QgY29uc3RyYWluID0gZnVuY3Rpb24odmFsLCBtaW5WYWwsIG1heFZhbCkge1xyXG5cdFx0aWYgKHZhbCA8IG1pblZhbCkgcmV0dXJuIG1pblZhbDtcclxuXHRcdGlmICh2YWwgPiBtYXhWYWwpIHJldHVybiBtYXhWYWw7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH07XHJcblx0Y29uc3QgY29uc3RyYWluWCA9ICh2YWwpID0+IHtcclxuXHRcdC8vIERvbid0IHRvbyBmYXIgaG9yaXpvbnRhbGx5IChsZWF2ZSBhdCBsZWFzdCAxMDBweCB2aXNpYmxlKVxyXG5cdFx0bGV0IGxpbWl0ID0gd2luZG93LmlubmVyV2lkdGgvMiArICRmcmFtZUVsLm91dGVyV2lkdGgoKS8yIC0gMTAwO1xyXG5cdFx0cmV0dXJuIGNvbnN0cmFpbih2YWwsIC0xKmxpbWl0LCBsaW1pdCk7XHJcblx0fTtcclxuXHRjb25zdCBjb25zdHJhaW5ZID0gKHZhbCkgPT4ge1xyXG5cdFx0Ly8gQ2FuJ3QgdGFrZSB0aXRsZSBiYXIgb2ZmIHRoZSB2aWV3cG9ydCwgc2luY2UgaXQncyB0aGUgZHJhZyBoYW5kbGVcclxuXHRcdGxldCBtaW5MaW1pdCA9IC0xKih3aW5kb3cuaW5uZXJIZWlnaHQgLSAkZnJhbWVFbC5vdXRlckhlaWdodCgpKS8yO1xyXG5cdFx0Ly8gRG9uJ3QgZ28gdG9vIGZhciBkb3duIHRoZSBwYWdlOiAod2hvbGUgcGFnZSBoZWlnaHQpIC0gKGluaXRpYWwgcG9zaXRpb24pXHJcblx0XHRsZXQgbWF4TGltaXQgPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudCkuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0LzI7XHJcblx0XHRyZXR1cm4gY29uc3RyYWluKHZhbCwgbWluTGltaXQsIG1heExpbWl0KTtcclxuXHR9O1xyXG5cclxuXHRsZXQgcG9pbnRlcmRvd24gPSBmYWxzZTtcclxuXHRsZXQgZHJhZ0Zyb20gPSB7fTtcclxuXHJcblx0bGV0IG9uRHJhZ1N0YXJ0ID0gZXZlbnQgPT4ge1xyXG5cdFx0cG9pbnRlcmRvd24gPSB0cnVlO1xyXG5cdFx0ZHJhZ0Zyb20ueCA9IGV2ZW50LmNsaWVudFg7XHJcblx0XHRkcmFnRnJvbS55ID0gZXZlbnQuY2xpZW50WTtcclxuXHR9O1xyXG5cdGxldCBvbkRyYWdNb3ZlID0gZXZlbnQgPT4ge1xyXG5cdFx0aWYgKCFwb2ludGVyZG93biB8fCBkcmFnRnJvbS54ID09IG51bGwgfHwgZHJhZ0Zyb20ueSA9PT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSBkcmFnRnJvbS54O1xyXG5cdFx0Y29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gZHJhZ0Zyb20ueTtcclxuXHRcdGRyYWdGcm9tLnggPSBldmVudC5jbGllbnRYO1xyXG5cdFx0ZHJhZ0Zyb20ueSA9IGV2ZW50LmNsaWVudFk7XHJcblx0XHRwb3NpdGlvbi54ID0gY29uc3RyYWluWChwb3NpdGlvbi54ICsgZHgpO1xyXG5cdFx0cG9zaXRpb24ueSA9IGNvbnN0cmFpblkocG9zaXRpb24ueSArIGR5KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblx0bGV0IG9uRHJhZ0VuZCA9ICgpID0+IHtcclxuXHRcdHBvaW50ZXJkb3duID0gZmFsc2U7XHJcblx0XHRkZWxldGUgZHJhZ0Zyb20ueDtcclxuXHRcdGRlbGV0ZSBkcmFnRnJvbS55O1xyXG5cdFx0Ly8gTWFrZSBzdXJlIGZpbmFsIHBvc2l0aW9ucyBhcmUgd2hvbGUgbnVtYmVyc1xyXG5cdFx0cG9zaXRpb24ueCA9IE1hdGgucm91bmQocG9zaXRpb24ueCk7XHJcblx0XHRwb3NpdGlvbi55ID0gTWF0aC5yb3VuZChwb3NpdGlvbi55KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblxyXG5cdC8vIFVzZSBwb2ludGVyIGV2ZW50cyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSB1c2UgbW91c2UgZXZlbnRzXHJcblx0Y29uc3QgcG9pbnRlciA9IChcIlBvaW50ZXJFdmVudFwiIGluIHdpbmRvdykgPyBcInBvaW50ZXJcIiA6IFwibW91c2VcIjtcclxuXHQkaGFuZGxlRWwub24ocG9pbnRlcitcImVudGVyLnJhdGVyTWFpbldpblwiLCAoKSA9PiAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcInRyYW5zZm9ybVwiKSApOyAvLyBUZWxsIGJyb3dzZXIgdG8gb3B0aW1pc2UgdHJhbnNmb3JtXHJcblx0JGhhbmRsZUVsLm9uKHBvaW50ZXIrXCJsZWF2ZS5yYXRlck1haW5XaW5cIiwgKCkgPT4geyBpZiAoIXBvaW50ZXJkb3duKSAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcIlwiKTsgfSApOyAvLyBSZW1vdmUgb3B0aW1pc2F0aW9uIGlmIG5vdCBkcmFnZ2luZ1xyXG5cdCRoYW5kbGVFbC5vbihwb2ludGVyK1wiZG93bi5yYXRlck1haW5XaW5cIiwgb25EcmFnU3RhcnQpO1xyXG5cdCQoXCJib2R5XCIpLm9uKHBvaW50ZXIrXCJtb3ZlLnJhdGVyTWFpbldpblwiLCBvbkRyYWdNb3ZlKTtcclxuXHQkKFwiYm9keVwiKS5vbihwb2ludGVyK1widXAucmF0ZXJNYWluV2luXCIsIG9uRHJhZ0VuZCk7XHJcbn07XHJcblxyXG4vLyBPdmVycmlkZSB0aGUgZ2V0Qm9keUhlaWdodCgpIG1ldGhvZCB0byBzcGVjaWZ5IGEgY3VzdG9tIGhlaWdodFxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRCb2R5SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBjdXJyZW50bGF5b3V0ID0gdGhpcy5jb250ZW50QXJlYS5nZXRDdXJyZW50SXRlbSgpO1xyXG5cdHZhciBsYXlvdXRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0dmFyIGNvbnRlbnRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQuY2hpbGRyZW4oXCI6Zmlyc3QtY2hpbGRcIikub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0cmV0dXJuIE1hdGgubWF4KDIwMCwgbGF5b3V0SGVpZ2h0LCBjb250ZW50SGVpZ2h0KTtcclxufTtcclxuXHJcbi8vIFVzZSBnZXRTZXR1cFByb2Nlc3MoKSB0byBzZXQgdXAgdGhlIHdpbmRvdyB3aXRoIGRhdGEgcGFzc2VkIHRvIGl0IGF0IHRoZSB0aW1lIFxyXG4vLyBvZiBvcGVuaW5nXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldFNldHVwUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRyZXR1cm4gTWFpbldpbmRvdy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0Lm5leHQoICgpID0+IHtcclxuXHRcdFx0dGhpcy5tYWtlRHJhZ2dhYmxlKCk7XHJcblx0XHRcdC8vIFNldCB1cCBwcmVmZXJlbmNlc1xyXG5cdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHQvLyBTZXQgc3ViamVjdCBwYWdlIGluZm9cclxuXHRcdFx0dGhpcy5zdWJqZWN0UGFnZSA9IGRhdGEuc3ViamVjdFBhZ2U7XHJcblx0XHRcdHRoaXMucGFnZUluZm8gPSB7XHJcblx0XHRcdFx0cmVkaXJlY3Q6IGRhdGEucmVkaXJlY3RUYXJnZXQsXHJcblx0XHRcdFx0aXNEaXNhbWJpZzogZGF0YS5kaXNhbWJpZyxcclxuXHRcdFx0XHRoYXNTdHVidGFnOiBkYXRhLnN0dWJ0YWcsXHJcblx0XHRcdFx0aXNBcnRpY2xlOiBkYXRhLmlzQXJ0aWNsZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBTZXQgdXAgZWRpdCBtb2RlIGJhbm5lcnNcclxuXHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3Qub3Jlc0NsYXNzID0gKGRhdGEuaXNBcnRpY2xlICYmIGRhdGEuaXNMaXN0KVxyXG5cdFx0XHRcdD8gXCJMaXN0XCJcclxuXHRcdFx0XHQ6IGRhdGEub3JlcyAmJiBkYXRhLm9yZXMucHJlZGljdGlvbjtcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LmFkZEl0ZW1zKFxyXG5cdFx0XHRcdGRhdGEuYmFubmVycy5tYXAoIGJhbm5lclRlbXBsYXRlID0+IG5ldyBCYW5uZXJXaWRnZXQoXHJcblx0XHRcdFx0XHRiYW5uZXJUZW1wbGF0ZSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0XHRcdFx0XHRpc0FydGljbGU6IHRoaXMucGFnZUluZm8uaXNBcnRpY2xlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KSApXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzaGVsbFRlbXBsYXRlQmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdFx0XHRpZiAoc2hlbGxUZW1wbGF0ZUJhbm5lciAmJiBzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWUpIHtcclxuXHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLm5vblN0YW5kYXJkVGVtcGxhdGVzID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLnJlZHVjZShcclxuXHRcdFx0XHRcdChiYW5uZXJzTGlzdCwgY3VyQmFubmVyKSA9PiBiYW5uZXJzTGlzdC5yZXBsYWNlKGN1ckJhbm5lci53aWtpdGV4dCwgXCJcIiksXHJcblx0XHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWVcclxuXHRcdFx0XHQpLnRyaW0oKS5yZXBsYWNlKC9cXG4rL2csIFwiXFxuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYmFubmVyTGlzdC5hZGRTaGVsbFRlbXBsYXRlSWZOZWVlZGVkKClcclxuXHRcdFx0XHQuc3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyKCk7XHJcblx0XHRcdC8vIFNob3cgcGFnZSB0eXBlLCBvciBPUkVTIHByZWRpY3Rpb24sIGlmIGF2YWlsYWJsZVxyXG5cdFx0XHRpZiAodGhpcy5wYWdlSW5mby5yZWRpcmVjdCkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIlJlZGlyZWN0IHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNEaXNhbWJpZykge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkRpc2FtYmlndWF0aW9uIHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNHQSkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkdvb2QgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZBKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZMKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgbGlzdFwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0xpc3QpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJMaXN0IGFydGljbGVcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGRhdGEub3Jlcykge1xyXG5cdFx0XHRcdHRoaXMub3Jlc0NsYXNzID0gZGF0YS5vcmVzLnByZWRpY3Rpb247XHJcblx0XHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKHRydWUpLiRlbGVtZW50LmZpbmQoXCIub3Jlc1ByZWRpY3Rpb25cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XCJQcmVkaWN0aW9uOiBcIixcclxuXHRcdFx0XHRcdCQoXCI8c3Ryb25nPlwiKS50ZXh0KGRhdGEub3Jlcy5wcmVkaWN0aW9uKSxcclxuXHRcdFx0XHRcdFwiJm5ic3A7KFwiICsgZGF0YS5vcmVzLnByb2JhYmlsaXR5ICsgXCIpXCJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiQXJ0aWNsZSBwYWdlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoIHRoaXMuc3ViamVjdFBhZ2UuZ2V0TmFtZXNwYWNlUHJlZml4KCkuc2xpY2UoMCwtMSkgKyBcIiBwYWdlXCIgKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gU2V0IHByb3BzIGZvciB1c2UgaW4gbWFraW5nIHdpa2l0ZXh0IGFuZCBlZGl0IHN1bW1hcmllc1xyXG5cdFx0XHR0aGlzLnRhbGtXaWtpdGV4dCA9IGRhdGEudGFsa1dpa2l0ZXh0O1xyXG5cdFx0XHR0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMgPSBkYXRhLmJhbm5lcnMubWFwKCBiYW5uZXJUZW1wbGF0ZSA9PiBiYW5uZXJUZW1wbGF0ZS5uYW1lICk7XHJcblx0XHRcdHRoaXMudGFsa3BhZ2UgPSBkYXRhLnRhbGtwYWdlO1xyXG5cdFx0XHQvLyBGb3JjZSBhIHNpemUgdXBkYXRlIHRvIGVuc3VyZSBldmV5dGhpbmcgZml0cyBva2F5XHJcblx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0fSwgdGhpcyApO1xyXG59O1xyXG5cclxuLy8gU2V0IHVwIHRoZSB3aW5kb3cgaXQgaXMgcmVhZHk6IGF0dGFjaGVkIHRvIHRoZSBET00sIGFuZCBvcGVuaW5nIGFuaW1hdGlvbiBjb21wbGV0ZWRcclxuTWFpbldpbmRvdy5wcm90b3R5cGUuZ2V0UmVhZHlQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5nZXRSZWFkeVByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4gdGhpcy50b3BCYXIuc2VhcmNoQm94LmZvY3VzKCkgKTtcclxufTtcclxuXHJcbi8vIFVzZSB0aGUgZ2V0QWN0aW9uUHJvY2VzcygpIG1ldGhvZCB0byBkbyB0aGluZ3Mgd2hlbiBhY3Rpb25zIGFyZSBjbGlja2VkXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MgPSBmdW5jdGlvbiAoIGFjdGlvbiApIHtcclxuXHRpZiAoIGFjdGlvbiA9PT0gXCJzaG93UHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwicHJlZnNcIik7XHJcblx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMucHJlZnNMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKHRydWUpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlUHJlZnNcIiApIHtcclxuXHRcdHZhciB1cGRhdGVkUHJlZnMgPSB0aGlzLnByZWZzRm9ybS5nZXRQcmVmcygpO1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QXBpU2V0UHJlZnModXBkYXRlZFByZWZzKS50aGVuKFxyXG5cdFx0XHRcdC8vIFN1Y2Nlc3NcclxuXHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKHVwZGF0ZWRQcmVmcyk7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcImVkaXRcIik7XHJcblx0XHRcdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMuZWRpdExheW91dCApO1xyXG5cdFx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQoZmFsc2UpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvLyBGYWlsdXJlXHJcblx0XHRcdFx0KGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgcHJlZmVyZW5jZXMuXCIpLFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3BhbiBzdHlsZT0nY29sb3I6Izc3Nyc+XCIpLnRleHQoIG1ha2VFcnJvck1zZyhjb2RlLCBlcnIpIClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsZWFyQ2FjaGVcIiApIHtcclxuXHRcdHJldHVybiBuZXcgT08udWkuUHJvY2VzcygpLm5leHQoKCkgPT4ge1xyXG5cdFx0XHRjYWNoZS5jbGVhckFsbEl0ZW1zKCk7XHJcblx0XHRcdHRoaXMuY2xvc2Uoe3Jlc3RhcnQ6IHRydWV9KTtcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsb3NlUHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZWRpdFwiKTtcclxuXHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZChmYWxzZSk7XHJcblx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkuZWRpdFdpdGhSZXRyeShcclxuXHRcdFx0XHR0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHtydnNlY3Rpb246IDB9LFxyXG5cdFx0XHRcdHJldmlzaW9uID0+ICh7XHJcblx0XHRcdFx0XHRzZWN0aW9uOiAwLFxyXG5cdFx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQocmV2aXNpb24uY29udGVudCksXHJcblx0XHRcdFx0XHRzdW1tYXJ5OiB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdFx0d2F0Y2hsaXN0OiB0aGlzLnByZWZlcmVuY2VzLndhdGNobGlzdFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCkuY2F0Y2goKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRuZXcgT08udWkuRXJyb3IoXHJcblx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgeW91ciBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KSApXHJcblx0XHQpLm5leHQoICgpID0+IHRoaXMuY2xvc2Uoe1xyXG5cdFx0XHRzdWNjZXNzOiB0cnVlLFxyXG5cdFx0XHR1cGdyYWRlZFN0dWI6IHRoaXMucGFnZUluZm8uaGFzU3R1YnRhZyAmJiB0aGlzLmlzUmF0ZWRBbmROb3RTdHViKClcclxuXHRcdH0pICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJwcmV2aWV3XCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcInBhcnNlXCIsXHJcblx0XHRcdFx0Y29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQodGhpcy50YWxrV2lraXRleHQpICsgXCJcXG48aHI+XFxuXCIgKyBcIicnJ0VkaXQgc3VtbWFyeTonJycgXCIgKyB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdHRpdGxlOiB0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHBzdDogMVxyXG5cdFx0XHR9KS50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnBhcnNlIHx8ICFyZXN1bHQucGFyc2UudGV4dCB8fCAhcmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXN1bHRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBwcmV2aWV3SHRtbFNuaXBwZXQgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQocmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdKTtcclxuXHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50V2lkZ2V0LnNldExhYmVsKHByZXZpZXdIdG1sU25pcHBldCk7XHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50Q29udGFpbmVyLnNldExhYmVsKFwiUHJldmlldzpcIik7XHJcblx0XHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJwcmV2aWV3XCIpO1xyXG5cdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdFx0LmNhdGNoKCAoY29kZSwgZXJyKSA9PiAkLkRlZmVycmVkKCkucmVqZWN0KFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkVycm9yKFxyXG5cdFx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3Ryb25nIHN0eWxlPSdkaXNwbGF5OmJsb2NrOyc+XCIpLnRleHQoXCJDb3VsZCBub3Qgc2hvdyBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHNwYW4gc3R5bGU9J2NvbG9yOiM3NzcnPlwiKS50ZXh0KCBtYWtlRXJyb3JNc2coY29kZSwgZXJyKSApXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIClcclxuXHRcdCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJjaGFuZ2VzXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcImNvbXBhcmVcIixcclxuXHRcdFx0XHRmb3JtYXQ6IFwianNvblwiLFxyXG5cdFx0XHRcdGZyb210ZXh0OiB0aGlzLnRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRmcm9tY29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dG90ZXh0OiB0aGlzLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCh0aGlzLnRhbGtXaWtpdGV4dCksXHJcblx0XHRcdFx0dG9jb250ZW50bW9kZWw6IFwid2lraXRleHRcIixcclxuXHRcdFx0XHRwcm9wOiBcImRpZmZcIlxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCAhcmVzdWx0IHx8ICFyZXN1bHQuY29tcGFyZSB8fCAhcmVzdWx0LmNvbXBhcmVbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChcIkVtcHR5IHJlc3VsdFwiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciAkZGlmZiA9ICQoXCI8dGFibGU+XCIpLmFkZENsYXNzKFwiZGlmZlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRyPlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0aD5cIikuYXR0cih7XCJjb2xzcGFuXCI6XCIyXCIsIFwic2NvcGVcIjpcImNvbFwifSkuY3NzKFwid2lkdGhcIiwgXCI1MCVcIikudGV4dChcIkxhdGVzdCByZXZpc2lvblwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHRoPlwiKS5hdHRyKHtcImNvbHNwYW5cIjpcIjJcIiwgXCJzY29wZVwiOlwiY29sXCJ9KS5jc3MoXCJ3aWR0aFwiLCBcIjUwJVwiKS50ZXh0KFwiTmV3IHRleHRcIilcclxuXHRcdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdFx0cmVzdWx0LmNvbXBhcmVbXCIqXCJdLFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRmb290PlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0cj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0JChcIjx0ZCBjb2xzcGFuPSc0Jz5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZz5cIikudGV4dChcIkVkaXQgc3VtbWFyeTogXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLm1ha2VFZGl0U3VtbWFyeSgpXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMucGFyc2VkQ29udGVudFdpZGdldC5zZXRMYWJlbCgkZGlmZik7XHJcblx0XHRcdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuc2V0TGFiZWwoXCJDaGFuZ2VzOlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZGlmZlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZCh0cnVlKTtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHRcdH0gKVxyXG5cdFx0XHRcdC5jYXRjaCggKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNob3cgY2hhbmdlcy5cIiksXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSApXHJcblx0XHQpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwiYmFja1wiICkge1xyXG5cdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0dGhpcy5jb250ZW50QXJlYS5zZXRJdGVtKCB0aGlzLmVkaXRMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCFhY3Rpb24gJiYgdGhpcy5iYW5uZXJMaXN0LmNoYW5nZWQpIHtcclxuXHRcdC8vIENvbmZpcm0gY2xvc2luZyBvZiBkaWFsb2cgaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMgXHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRPTy51aS5jb25maXJtKFwiQ2hhbmdlcyBtYWRlIHdpbGwgYmUgZGlzY2FyZGVkLlwiLCB7dGl0bGU6XCJDbG9zZSBSYXRlcj9cIn0pXHJcblx0XHRcdFx0LnRoZW4oY29uZmlybWVkID0+IGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCggdGhpcywgYWN0aW9uICk7XHJcbn07XHJcblxyXG4vLyBVc2UgdGhlIGdldFRlYXJkb3duUHJvY2VzcygpIG1ldGhvZCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbmV2ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuXHJcbi8vIGBkYXRhYCBpcyB0aGUgZGF0YSBwYXNzZWQgaW50byB0aGUgd2luZG93J3MgLmNsb3NlKCkgbWV0aG9kLlxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKCB0aGlzLCBkYXRhIClcclxuXHRcdC5maXJzdCggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3QuY2xlYXJJdGVtcygpO1xyXG5cdFx0XHR0aGlzLnRvcEJhci5zZWFyY2hCb3guc2V0VmFsdWUoXCJcIik7XHJcblx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKGZhbHNlKS4kZWxlbWVudC5maW5kKFwiLm9yZXNQcmVkaWN0aW9uXCIpLmVtcHR5KCk7XHJcblx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC50b2dnbGUoZmFsc2UpLnNldExhYmVsKFwiXCIpO1xyXG5cclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXdpbmRvdy1mcmFtZVwiKS5jc3MoXCJ0cmFuc2Zvcm1cIixcIlwiKTtcclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXByb2Nlc3NEaWFsb2ctbG9jYXRpb25cIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdFx0JChcImJvZHlcIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdH0gKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gJC5leHRlbmQoe30sIGFwcENvbmZpZy5kZWZhdWx0UHJlZnMsIHByZWZzKTtcclxuXHQvLyBBcHBsaWVzIHByZWZlcmVuY2VzIHRvIGV4aXN0aW5nIGl0ZW1zIGluIHRoZSB3aW5kb3c6XHJcblx0dGhpcy5iYW5uZXJMaXN0LnNldFByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25SZXNldENhY2hlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5leGVjdXRlQWN0aW9uKFwiY2xlYXJDYWNoZVwiKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm9uU2VhcmNoU2VsZWN0ID0gZnVuY3Rpb24oZGF0YSkge1xyXG5cdHRoaXMudG9wQmFyLnNlYXJjaEJveC5wdXNoUGVuZGluZygpO1xyXG5cdHZhciBuYW1lID0gdGhpcy50b3BCYXIuc2VhcmNoQm94LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdGlmICghbmFtZSkge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKS5mb2N1cygpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgZXhpc3RpbmdCYW5uZXIgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmluZChiYW5uZXIgPT4ge1xyXG5cdFx0cmV0dXJuIGJhbm5lci5tYWluVGV4dCA9PT0gbmFtZSB8fFx0YmFubmVyLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPT09IG5hbWU7XHJcblx0fSk7XHJcblxyXG5cdC8vIEFib3J0IGFuZCBzaG93IGFsZXJ0IGlmIGJhbm5lciBhbHJlYWR5IGV4aXN0c1xyXG5cdGlmIChleGlzdGluZ0Jhbm5lcikge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKTtcclxuXHRcdHJldHVybiBPTy51aS5hbGVydChcIlRoZXJlIGlzIGFscmVhZHkgYSB7e1wiICsgbmFtZSArIFwifX0gYmFubmVyXCIpLnRoZW4odGhpcy5zZWFyY2hCb3guZm9jdXMoKSk7XHJcblx0fVxyXG5cclxuXHQvLyBDb25maXJtYXRpb24gcmVxdWlyZWQgZm9yIGJhbm5lcnMgbWlzc2luZyBXaWtpUHJvamVjdCBmcm9tIG5hbWUsIGFuZCBmb3IgdW5jcmVhdGVkIGRpc2FtYmlndWF0aW9uIHRhbGsgcGFnZXNcclxuXHR2YXIgY29uZmlybVRleHQ7XHJcblx0aWYgKCEvXltXd10oPzpQfGlraVtQcF1yb2plY3QpLy50ZXN0KG5hbWUpKSB7XHJcblx0XHRjb25maXJtVGV4dCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcclxuXHRcdFx0XCJ7e1wiICsgbXcuaHRtbC5lc2NhcGUobmFtZSkgKyBcIn19IGlzIG5vdCBhIHJlY29nbmlzZWQgV2lraVByb2plY3QgYmFubmVyLjxici8+RG8geW91IHdhbnQgdG8gY29udGludWU/XCJcclxuXHRcdCk7XHJcblx0fSBlbHNlIGlmIChuYW1lID09PSBcIldpa2lQcm9qZWN0IERpc2FtYmlndWF0aW9uXCIgJiYgJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggIT09IDAgJiYgdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXHJcblx0XHRjb25maXJtVGV4dCA9IFwiTmV3IHRhbGsgcGFnZXMgc2hvdWxkbid0IGJlIGNyZWF0ZWQgaWYgdGhleSB3aWxsIG9ubHkgY29udGFpbiB0aGUgXFx7XFx7V2lraVByb2plY3QgRGlzYW1iaWd1YXRpb25cXH1cXH0gYmFubmVyLiBDb250aW51ZT9cIjtcclxuXHR9XHJcblx0JC53aGVuKCBjb25maXJtVGV4dCA/IE9PLnVpLmNvbmZpcm0oY29uZmlybVRleHQpIDogdHJ1ZSlcclxuXHRcdC50aGVuKCBjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xyXG5cdFx0XHQvLyBDcmVhdGUgVGVtcGxhdGUgb2JqZWN0XHJcblx0XHRcdHJldHVybiBCYW5uZXJXaWRnZXQubmV3RnJvbVRlbXBsYXRlTmFtZShuYW1lLCBkYXRhLCB7XHJcblx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRcdFx0aXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKGJhbm5lciA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmJhbm5lckxpc3QuYWRkSXRlbXMoIFtiYW5uZXJdICk7XHJcblx0XHRcdFx0XHRiYW5uZXIuc2V0Q2hhbmdlZCgpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4oICgpID0+IHRoaXMudG9wQmFyLnNlYXJjaEJveC5zZXRWYWx1ZShcIlwiKS5mb2N1cygpLnBvcFBlbmRpbmcoKSApO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25TZXRDbGFzc2VzID0gZnVuY3Rpb24oY2xhc3NWYWwpIHtcclxuXHRjb25zdCBzaGVsbFRlbXBsYXRlID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmIChzaGVsbFRlbXBsYXRlKSB7XHJcblx0XHRzaGVsbFRlbXBsYXRlLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoY2xhc3NWYWwpO1xyXG5cdFx0c2hlbGxUZW1wbGF0ZS5jbGFzc0Ryb3Bkb3duLnNldEF1dG9maWxsZWQoZmFsc2UpO1xyXG5cdH1cclxuXHR0aGlzLmJhbm5lckxpc3QuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4ge1xyXG5cdFx0aWYgKGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShzaGVsbFRlbXBsYXRlID8gbnVsbCA6IGNsYXNzVmFsKTtcclxuXHRcdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblNldEltcG9ydGFuY2VzID0gZnVuY3Rpb24oaW1wb3J0YW5jZVZhbCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoaW1wb3J0YW5jZVZhbCk7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblJlbW92ZUFsbCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5jbGVhckl0ZW1zKCk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkNsZWFyQWxsID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiBiYW5uZXIub25DbGVhckJ1dHRvbkNsaWNrKCkgKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCA9IGZ1bmN0aW9uKHRhbGtXaWtpdGV4dCkge1xyXG5cdHZhciBiYW5uZXJzV2lraXRleHQgPSB0aGlzLmJhbm5lckxpc3QubWFrZVdpa2l0ZXh0KCk7XHJcblx0aWYgKCF0YWxrV2lraXRleHQpIHtcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBSZXBhcnNlIHRlbXBsYXRlcywgaW4gY2FzZSB0YWxrcGFnZSB3aWtpdGV4dCBoYXMgY2hhbmdlZFxyXG5cdHZhciB0YWxrVGVtcGxhdGVzID0gcGFyc2VUZW1wbGF0ZXModGFsa1dpa2l0ZXh0LCB0cnVlKTtcclxuXHQvLyByZXBsYWNlIGV4aXN0aW5nIGJhbm5lcnMgd2lraXRleHQgd2l0aCBhIGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1RlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcclxuXHRcdGlmICh0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMuaW5jbHVkZXModGVtcGxhdGUubmFtZSkpIHtcclxuXHRcdFx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UodGVtcGxhdGUud2lraXRleHQsIFwiXFx4MDFcIik7XHJcblx0XHR9XHJcblx0fSk7XHJcblx0Ly8gcmVwbGFjZSBpbnNlcnRpb24gcG9pbnQgKGZpcnN0IGNvbnRyb2wgY2hhcmFjdGVyKSB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UoXCJcXHgwMVwiLCBcIlxceDAyXCIpO1xyXG5cdC8vIHJlbW92ZSBvdGhlciBjb250cm9sIGNoYXJhY3RlcnNcclxuXHQvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAqL1xyXG5cdHRhbGtXaWtpdGV4dCA9IHRhbGtXaWtpdGV4dC5yZXBsYWNlKC8oPzpcXHN8XFxuKSpcXHgwMSg/Olxcc3xcXG4pKi9nLFwiXCIpO1xyXG5cdC8vIHNwbGl0IGludG8gd2lraXRleHQgYmVmb3JlL2FmdGVyIHRoZSByZW1haW5pbmcgY29udHJvbCBjaGFyYWN0ZXIgKGFuZCB0cmltIGVhY2ggc2VjdGlvbilcclxuXHR2YXIgdGFsa1dpa2l0ZXh0U2VjdGlvbnMgPSB0YWxrV2lraXRleHQuc3BsaXQoXCJcXHgwMlwiKS5tYXAodCA9PiB0LnRyaW0oKSk7XHJcblx0aWYgKHRhbGtXaWtpdGV4dFNlY3Rpb25zLmxlbmd0aCA9PT0gMikge1xyXG5cdFx0Ly8gRm91bmQgdGhlIGluc2VydGlvbiBwb2ludCBmb3IgdGhlIGJhbm5lcnNcclxuXHRcdHJldHVybiAodGFsa1dpa2l0ZXh0U2VjdGlvbnNbMF0gKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKSArIFwiXFxuXCIgKyB0YWxrV2lraXRleHRTZWN0aW9uc1sxXSkudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBDaGVjayBpZiB0aGVyZSdzIGFueXRoaW5nIGJlc2lkZSB0ZW1wbGF0ZXNcclxuXHR2YXIgdGVtcFN0ciA9IHRhbGtXaWtpdGV4dDtcclxuXHR0YWxrVGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xyXG5cdFx0dGVtcFN0ciA9IHRlbXBTdHIucmVwbGFjZSh0ZW1wbGF0ZS53aWtpdGV4dCwgXCJcIik7XHJcblx0fSk7XHJcblx0aWYgKC9eI1JFRElSRUNUL2kudGVzdCh0YWxrV2lraXRleHQpIHx8ICF0ZW1wU3RyLnRyaW0oKSkge1xyXG5cdFx0Ly8gSXMgYSByZWRpcmVjdCwgb3IgZXZlcnl0aGluZyBpcyBhIHRlbXBsYXRlOiBpbnNlcnQgYXQgdGhlIGVuZFxyXG5cdFx0cmV0dXJuIHRhbGtXaWtpdGV4dC50cmltKCkgKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gVGhlcmUgaXMgbm9uLXRlbXBsYXRlIGNvbnRlbnQsIHNvIGluc2VydCBhdCB0aGUgc3RhcnRcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpICsgXCJcXG5cIiArIHRhbGtXaWtpdGV4dC50cmltKCk7XHJcblx0fVxyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUuaXNSYXRlZEFuZE5vdFN0dWIgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBub25TdHViUmF0aW5nZ3MgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmlsdGVyKGJhbm5lciA9PlxyXG5cdFx0YmFubmVyLmhhc0NsYXNzUmF0aW5ncyAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAhPT0gXCJTdHViXCJcclxuXHQpO1xyXG5cdHJldHVybiBub25TdHViUmF0aW5nZ3MubGVuZ3RoID4gMDtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VFZGl0U3VtbWFyeSA9IGZ1bmN0aW9uKCkge1xyXG5cdGNvbnN0IHJlbW92ZWRCYW5uZXJzID0gW107XHJcblx0Y29uc3QgZWRpdGVkQmFubmVycyA9IFtdO1xyXG5cdGNvbnN0IG5ld0Jhbm5lcnMgPSBbXTtcclxuXHRjb25zdCBzaG9ydE5hbWUgPSBuYW1lID0+IG5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLFwiXCIpLnJlcGxhY2UoXCJTdWJzdDpcIixcIlwiKTtcclxuXHJcblx0Ly8gT3ZlcmFsbCBjbGFzcy9pbXBvcnRhbmNlLCBpZiBhbGwgdGhlIHNhbWVcclxuXHRjb25zdCBhbGxDbGFzc2VzID0gdW5pcXVlQXJyYXkoXHJcblx0XHRmaWx0ZXJBbmRNYXAodGhpcy5iYW5uZXJMaXN0Lml0ZW1zLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmhhc0NsYXNzUmF0aW5ncyB8fCBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKVxyXG5cdFx0KVxyXG5cdCk7XHJcblx0bGV0IG92ZXJhbGxDbGFzcyA9IGFsbENsYXNzZXMubGVuZ3RoID09PSAxICYmIGFsbENsYXNzZXNbMF07XHJcblx0Y29uc3QgYWxsSW1wb3J0YW5jZXMgPSB1bmlxdWVBcnJheShcclxuXHRcdGZpbHRlckFuZE1hcCh0aGlzLmJhbm5lckxpc3QuaXRlbXMsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldFZhbHVlKClcclxuXHRcdClcclxuXHQpO1xyXG5cdGxldCBvdmVyYWxsSW1wb3J0YW5jZSA9IGFsbEltcG9ydGFuY2VzLmxlbmd0aCA9PT0gMSAmJiBhbGxJbXBvcnRhbmNlc1swXTtcclxuXHQvLyBEb24ndCB1c2UgdGhlbSB1bmxlc3Mgc29tZSBoYXZlIGNoYW5nZWRcclxuXHRsZXQgc29tZUNsYXNzZXNDaGFuZ2VkID0gZmFsc2U7XHJcblx0bGV0IHNvbWVJbXBvcnRhbmNlc0NoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Ly8gcmVtb3ZlZCBiYW5uZXJzOlxyXG5cdHRoaXMuZXhpc3RpbmdCYW5uZXJOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG5cdFx0Y29uc3QgYmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoIGJhbm5lciA9PiBiYW5uZXIubmFtZSA9PT0gbmFtZSB8fCBiYW5uZXIuYnlwYXNzZWROYW1lID09PSBuYW1lICk7XHJcblx0XHRpZiAoIWJhbm5lcikge1xyXG5cdFx0XHRyZW1vdmVkQmFubmVycy5wdXNoKFwi4oiSXCIgKyBzaG9ydE5hbWUobmFtZSkpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIGVkaXRlZCAmIG5ldyBiYW5uZXJzXHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiB7XHJcblx0XHRjb25zdCBpc05ldyA9ICFiYW5uZXIud2lraXRleHQ7IC8vIG5vdCBhZGRlZCBmcm9tIHdpa2l0ZXh0IG9uIHBhZ2VcclxuXHRcdGlmICghaXNOZXcgJiYgIWJhbm5lci5jaGFuZ2VkKSB7XHJcblx0XHRcdC8vIE5vdCBjaGFuZ2VkXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGxldCBuZXdDbGFzcyA9IGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIChpc05ldyB8fCBiYW5uZXIuY2xhc3NDaGFuZ2VkKSAmJiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0NsYXNzKSB7IHNvbWVDbGFzc2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsQ2xhc3MpIHsgbmV3Q2xhc3MgPSBudWxsOyB9XHJcblxyXG5cdFx0bGV0IG5ld0ltcG9ydGFuY2UgPSBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MgJiYgKGlzTmV3IHx8IGJhbm5lci5pbXBvcnRhbmNlQ2hhbmdlZCkgJiYgYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0ltcG9ydGFuY2UpIHsgc29tZUltcG9ydGFuY2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsSW1wb3J0YW5jZSkgeyBuZXdJbXBvcnRhbmNlID0gbnVsbDsgfVxyXG5cclxuXHRcdGxldCByYXRpbmcgPSAobmV3Q2xhc3MgJiYgbmV3SW1wb3J0YW5jZSlcclxuXHRcdFx0PyBuZXdDbGFzcyArIFwiL1wiICsgbmV3SW1wb3J0YW5jZVxyXG5cdFx0XHQ6IG5ld0NsYXNzIHx8IG5ld0ltcG9ydGFuY2UgfHwgXCJcIjtcclxuXHRcdGlmIChyYXRpbmcpIHsgcmF0aW5nID0gXCIgKFwiICsgcmF0aW5nICsgXCIpXCI7IH1cclxuXHRcdFxyXG5cdFx0aWYgKGlzTmV3KSB7XHJcblx0XHRcdG5ld0Jhbm5lcnMucHVzaChcIitcIiArIHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZWRpdGVkQmFubmVycy5wdXNoKHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIG92ZXJhbGwgcmF0aW5nXHJcblx0bGV0IG92ZXJhbGxSYXRpbmcgPSAoc29tZUNsYXNzZXNDaGFuZ2VkICYmIG92ZXJhbGxDbGFzcyAmJiBzb21lSW1wb3J0YW5jZXNDaGFuZ2VkICYmIG92ZXJhbGxJbXBvcnRhbmNlKVxyXG5cdFx0PyBvdmVyYWxsQ2xhc3MgKyBcIi9cIiArIG92ZXJhbGxJbXBvcnRhbmNlXHJcblx0XHQ6IChzb21lQ2xhc3Nlc0NoYW5nZWQgJiYgb3ZlcmFsbENsYXNzKSB8fCAoc29tZUltcG9ydGFuY2VzQ2hhbmdlZCAmJiBvdmVyYWxsSW1wb3J0YW5jZSkgfHwgXCJcIjtcclxuXHRpZiAob3ZlcmFsbFJhdGluZykgeyBvdmVyYWxsUmF0aW5nID0gXCIgKFwiICsgb3ZlcmFsbFJhdGluZyArIFwiKVwiOyB9XHJcblxyXG5cdHJldHVybiBgQXNzZXNzbWVudCR7b3ZlcmFsbFJhdGluZ306ICR7Wy4uLmVkaXRlZEJhbm5lcnMsIC4uLm5ld0Jhbm5lcnMsIC4uLnJlbW92ZWRCYW5uZXJzXS5qb2luKFwiLCBcIil9JHthcHBDb25maWcuc2NyaXB0LmFkdmVydH1gO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWFpbldpbmRvdztcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBBUEkgPSBuZXcgbXcuQXBpKCB7XHJcblx0YWpheDoge1xyXG5cdFx0aGVhZGVyczogeyBcclxuXHRcdFx0XCJBcGktVXNlci1BZ2VudFwiOiBcIlJhdGVyL1wiICsgY29uZmlnLnNjcmlwdC52ZXJzaW9uICsgXHJcblx0XHRcdFx0XCIgKCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOkV2YWQzNy9SYXRlciApXCJcclxuXHRcdH1cclxuXHR9XHJcbn0gKTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gQVBJIGZvciBPUkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuQVBJLmdldE9SRVMgPSBmdW5jdGlvbihyZXZpc2lvbklEKSB7XHJcblx0cmV0dXJuICQuZ2V0KFwiaHR0cHM6Ly9vcmVzLndpa2ltZWRpYS5vcmcvdjMvc2NvcmVzL2Vud2lraT9tb2RlbHM9YXJ0aWNsZXF1YWxpdHkmcmV2aWRzPVwiK3JldmlzaW9uSUQpO1xyXG59O1xyXG5cclxuLyogLS0tLS0tLS0tLSBSYXcgd2lraXRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5BUEkuZ2V0UmF3ID0gZnVuY3Rpb24ocGFnZSkge1xyXG5cdHJldHVybiAkLmdldChcImh0dHBzOlwiICsgY29uZmlnLm13LndnU2VydmVyICsgbXcudXRpbC5nZXRVcmwocGFnZSwge2FjdGlvbjpcInJhd1wifSkpXHJcblx0XHQudGhlbihmdW5jdGlvbihkYXRhKSB7XHJcblx0XHRcdGlmICggIWRhdGEgKSB7XHJcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJvay1idXQtZW1wdHlcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGE7XHJcblx0XHR9KTtcclxufTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gRWRpdCB3aXRoIHJldHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuLyoqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVxyXG4gKiBAcGFyYW0ge09iamVjdD99IHBhcmFtcyBhZGRpdGlvbmFsIHBhcmFtcyBmb3IgdGhlIGdldCByZXF1ZXN0XHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCwgc3RyaW5nPn0gcGFnZSwgc3RhcnR0aW1lIHRpbWVzdGFtcFxyXG4gKi9cclxudmFyIGdldFBhZ2UgPSBmdW5jdGlvbih0aXRsZSwgcGFyYW1zKSB7XHJcblx0cmV0dXJuIEFQSS5nZXQoXHJcblx0XHQkLmV4dGVuZChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdFwiYWN0aW9uXCI6IFwicXVlcnlcIixcclxuXHRcdFx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFx0XHRcImN1cnRpbWVzdGFtcFwiOiAxLFxyXG5cdFx0XHRcdFwidGl0bGVzXCI6IHRpdGxlLFxyXG5cdFx0XHRcdFwicHJvcFwiOiBcInJldmlzaW9uc3xpbmZvXCIsXHJcblx0XHRcdFx0XCJydnByb3BcIjogXCJjb250ZW50fHRpbWVzdGFtcFwiLFxyXG5cdFx0XHRcdFwicnZzbG90c1wiOiBcIm1haW5cIlx0XHRcdFx0XHRcclxuXHRcdFx0fSxcclxuXHRcdFx0cGFyYW1zXHJcblx0XHQpXHJcblx0KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdHZhciBwYWdlID0gT2JqZWN0LnZhbHVlcyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF07XHJcblx0XHR2YXIgc3RhcnR0aW1lID0gcmVzcG9uc2UuY3VydGltZXN0YW1wO1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKHBhZ2UsIHN0YXJ0dGltZSk7XHJcblx0fSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgZGV0YWlscyBvYmplY3QgZnJvbSBBUElcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0dGltZSB0aW1lc3RhbXBcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIGNhbGxiYWNrIHRoYXQgcHJlcGFyZXMgdGhlIGVkaXQ6XHJcbiAqICB7T2JqZWN0fSBzaW1wbGlmaWVkUGFnZSA9PiB7T2JqZWN0fFByb21pc2U8T2JqZWN0Pn0gZWRpdCBwYXJhbXNcclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gcGFyYW1zIGZvciBlZGl0IHF1ZXJ5XHJcbiAqL1xyXG52YXIgcHJvY2Vzc1BhZ2UgPSBmdW5jdGlvbihwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSkge1xyXG5cdHZhciBiYXNldGltZXN0YW1wID0gcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0udGltZXN0YW1wO1xyXG5cdHZhciBzaW1wbGlmaWVkUGFnZSA9IHtcclxuXHRcdHBhZ2VpZDogcGFnZS5wYWdlaWQsXHJcblx0XHRtaXNzaW5nOiBwYWdlLm1pc3NpbmcgPT09IFwiXCIsXHJcblx0XHRyZWRpcmVjdDogcGFnZS5yZWRpcmVjdCA9PT0gXCJcIixcclxuXHRcdGNhdGVnb3JpZXM6IHBhZ2UuY2F0ZWdvcmllcyxcclxuXHRcdG5zOiBwYWdlLm5zLFxyXG5cdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRjb250ZW50OiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXVxyXG5cdH07XHJcblx0cmV0dXJuICQud2hlbiggdHJhbnNmb3JtKHNpbXBsaWZpZWRQYWdlKSApXHJcblx0XHQudGhlbiggZWRpdFBhcmFtcyA9PlxyXG5cdFx0XHQkLmV4dGVuZCgge1xyXG5cdFx0XHRcdGFjdGlvbjogXCJlZGl0XCIsXHJcblx0XHRcdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRcdFx0Ly8gUHJvdGVjdCBhZ2FpbnN0IGVycm9ycyBhbmQgY29uZmxpY3RzXHJcblx0XHRcdFx0YXNzZXJ0OiBcInVzZXJcIixcclxuXHRcdFx0XHRiYXNldGltZXN0YW1wOiBiYXNldGltZXN0YW1wLFxyXG5cdFx0XHRcdHN0YXJ0dGltZXN0YW1wOiBzdGFydHRpbWVcclxuXHRcdFx0fSwgZWRpdFBhcmFtcyApXHJcblx0XHQpO1xyXG59O1xyXG5cclxuLyoqIGVkaXRXaXRoUmV0cnlcclxuICogXHJcbiAqIEVkaXRzIGEgcGFnZSwgcmVzb2x2aW5nIGVkaXQgY29uZmxpY3RzLCBhbmQgcmV0cnlpbmcgZWRpdHMgdGhhdCBmYWlsLiBUaGVcclxuICogdHJhbmZvcm0gZnVuY3Rpb24gbWF5IHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgaWYgdGhlIHBhZ2Ugc2hvdWxkIG5vdCBiZVxyXG4gKiBlZGl0ZWQ7IHRoZSBAcmV0dXJucyB7UHJvbWlzZX0gd2lsbCB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uXHJcbiAqIHZhbHVlcy5cclxuICogXHJcbiAqIE5vdGU6IFVubGlrZSBbbXcuQXBpI0VkaXRdLCBhIG1pc3NpbmcgcGFnZSB3aWxsIGJlIGNyZWF0ZWQsIHVubGVzcyB0aGVcclxuICogdHJhbnNmb3JtIGNhbGxiYWNrIGluY2x1ZGVzIHRoZSBcIm5vY3JlYXRlXCIgcGFyYW0uXHJcbiAqIFxyXG4gKiBbbXcuQXBpI0VkaXRdOiA8aHR0cHM6Ly9kb2Mud2lraW1lZGlhLm9yZy9tZWRpYXdpa2ktY29yZS9tYXN0ZXIvanMvIyEvYXBpL213LkFwaS5wbHVnaW4uZWRpdD5cclxuICogXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSBwYWdlIHRvIGJlIGVkaXRlZFxyXG4gKiBAcGFyYW0ge09iamVjdHxudWxsfSBnZXRQYXJhbXMgYWRkaXRpb25hbCBwYXJhbXMgZm9yIHRoZSBnZXQgcmVxdWVzdFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gY2FsbGJhY2sgdGhhdCBwcmVwYXJlcyB0aGUgZWRpdDpcclxuICogIHtPYmplY3R9IHNpbXBsaWZpZWRQYWdlID0+IHtPYmplY3R8UHJvbWlzZTxPYmplY3Q+fSBwYXJhbXMgZm9yIEFQSSBlZGl0aW5nXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IHByb21pc2UsIHJlc29sdmVkIG9uIHN1Y2Nlc3MsIHJlamVjdGVkIGlmXHJcbiAqICBwYWdlIHdhcyBub3QgZWRpdGVkXHJcbiAqL1xyXG5BUEkuZWRpdFdpdGhSZXRyeSA9IGZ1bmN0aW9uKHRpdGxlLCBnZXRQYXJhbXMsIHRyYW5zZm9ybSkge1xyXG5cdHJldHVybiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpXHJcblx0XHQudGhlbihcclxuXHRcdC8vIFN1Y2NlczogcHJvY2VzcyB0aGUgcGFnZVxyXG5cdFx0XHQocGFnZSwgc3RhcnR0aW1lKSA9PiBwcm9jZXNzUGFnZShwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSksXHJcblx0XHRcdC8vIEZhaWx1cmU6IHRyeSBhZ2FpblxyXG5cdFx0XHQoKSA9PiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpLnRoZW4ocHJvY2Vzc1BhZ2UsIHRyYW5zZm9ybSlcclxuXHRcdClcclxuXHRcdC50aGVuKGVkaXRQYXJhbXMgPT5cclxuXHRcdFx0QVBJLnBvc3RXaXRoVG9rZW4oXCJjc3JmXCIsIGVkaXRQYXJhbXMpXHJcblx0XHRcdFx0LmNhdGNoKCBlcnJvckNvZGUgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCBlcnJvckNvZGUgPT09IFwiZWRpdGNvbmZsaWN0XCIgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFRyeSBhZ2Fpbiwgc3RhcnRpbmcgb3ZlclxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gQVBJLmVkaXRXaXRoUmV0cnkodGl0bGUsIGdldFBhcmFtcywgdHJhbnNmb3JtKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIFRyeSBhZ2FpblxyXG5cdFx0XHRcdFx0cmV0dXJuIEFQSS5wb3N0V2l0aFRva2VuKFwiY3NyZlwiLCBlZGl0UGFyYW1zKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxufTtcclxuXHJcbnZhciBtYWtlRXJyb3JNc2cgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XHJcblx0dmFyIGNvZGUsIHhociwgbWVzc2FnZTtcclxuXHRpZiAoIHR5cGVvZiBmaXJzdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0Ly8gRXJyb3JzIGZyb20gJC5nZXQgYmVpbmcgcmVqZWN0ZWQgKE9SRVMgJiBSYXcgd2lraXRleHQpXHJcblx0XHR2YXIgZXJyb3JPYmogPSBmaXJzdC5yZXNwb25zZUpTT04gJiYgZmlyc3QucmVzcG9uc2VKU09OLmVycm9yO1xyXG5cdFx0aWYgKCBlcnJvck9iaiApIHtcclxuXHRcdFx0Ly8gR290IGFuIGFwaS1zcGVjaWZpYyBlcnJvciBjb2RlL21lc3NhZ2VcclxuXHRcdFx0Y29kZSA9IGVycm9yT2JqLmNvZGU7XHJcblx0XHRcdG1lc3NhZ2UgPSBlcnJvck9iai5tZXNzYWdlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0eGhyID0gZmlyc3Q7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICggdHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBzZWNvbmQgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHQvLyBFcnJvcnMgZnJvbSBtdy5BcGkgb2JqZWN0XHJcblx0XHR2YXIgbXdFcnJvck9iaiA9IHNlY29uZC5lcnJvcjtcclxuXHRcdGlmIChtd0Vycm9yT2JqKSB7XHJcblx0XHRcdC8vIEdvdCBhbiBhcGktc3BlY2lmaWMgZXJyb3IgY29kZS9tZXNzYWdlXHJcblx0XHRcdGNvZGUgPSBlcnJvck9iai5jb2RlO1xyXG5cdFx0XHRtZXNzYWdlID0gZXJyb3JPYmouaW5mbztcclxuXHRcdH0gZWxzZSBpZiAoZmlyc3QgPT09IFwib2stYnV0LWVtcHR5XCIpIHtcclxuXHRcdFx0Y29kZSA9IG51bGw7XHJcblx0XHRcdG1lc3NhZ2UgPSBcIkdvdCBhbiBlbXB0eSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcIjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHhociA9IHNlY29uZCAmJiBzZWNvbmQueGhyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKGNvZGUgJiYgbWVzc2FnZSkge1xyXG5cdFx0cmV0dXJuIGBBUEkgZXJyb3IgJHtjb2RlfTogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmIChtZXNzYWdlKSB7XHJcblx0XHRyZXR1cm4gYEFQSSBlcnJvcjogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmICh4aHIpIHtcclxuXHRcdHJldHVybiBgSFRUUCBlcnJvciAke3hoci5zdGF0dXN9YDtcclxuXHR9IGVsc2UgaWYgKFxyXG5cdFx0dHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIGZpcnN0ICE9PSBcImVycm9yXCIgJiZcclxuXHRcdHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIgJiYgc2Vjb25kICE9PSBcImVycm9yXCJcclxuXHQpIHtcclxuXHRcdHJldHVybiBgRXJyb3IgJHtmaXJzdH06ICR7c2Vjb25kfWA7XHJcblx0fSBlbHNlIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgZmlyc3QgIT09IFwiZXJyb3JcIikge1xyXG5cdFx0cmV0dXJuIGBFcnJvcjogJHtmaXJzdH1gO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gXCJVbmtub3duIEFQSSBlcnJvclwiO1xyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFQSTtcclxuZXhwb3J0IHsgbWFrZUVycm9yTXNnIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFByZWZzIH0gZnJvbSBcIi4vcHJlZnNcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHNldHVwUmF0ZXIgZnJvbSBcIi4vc2V0dXBcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBhdXRvU3RhcnQgPSBmdW5jdGlvbiBhdXRvU3RhcnQoKSB7XHJcblxyXG5cdHJldHVybiBnZXRQcmVmcygpLnRoZW4ocHJlZnMgPT4ge1xyXG5cdFx0Ly8gQ2hlY2sgaWYgcHJlZiBpcyB0dXJuZWQgb2ZmXHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBpZiBwcmVmIGlzIHR1cm5lZCBvZmYgZm9yIHJlZGlyZWN0cywgYW5kIGN1cnJlbnQgcGFnZSBpcyBhIHJlZGlyZWN0XHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydFJlZGlyZWN0cyAmJiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFwicmVkaXJlY3Q9bm9cIikpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQ2hlY2sgaWYgdmlld2luZyBkaWZmL2hpc3Rvcnkvb2xkIHZlcnNpb25cclxuXHRcdGlmICgvKGFjdGlvbnxkaWZmfG9sZGlkKS8udGVzdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBzdWJqZWN0VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSkuZ2V0U3ViamVjdFBhZ2UoKTtcclxuXHRcdC8vIENoZWNrIGlmIHN1YmplY3QgcGFnZSBpcyB0aGUgbWFpbiBwYWdlXHJcblx0XHRpZiAoc3ViamVjdFRpdGxlLmdldFByZWZpeGVkVGV4dCgpID09PSBcIk1haW4gUGFnZVwiKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIENoZWNrIHN1YmplY3QgcGFnZSBuYW1lc3BhY2VcclxuXHRcdGlmIChcclxuXHRcdFx0cHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcyAmJlxyXG5cdFx0XHRwcmVmcy5hdXRvc3RhcnROYW1lc3BhY2VzLmxlbmd0aCAmJlxyXG5cdFx0XHQhcHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcy5pbmNsdWRlcyhjb25maWcubXcud2dOYW1lc3BhY2VOdW1iZXIpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0Ly8gSWYgdGFsayBwYWdlIGRvZXMgbm90IGV4aXN0LCBjYW4ganVzdCBhdXRvc3RhcnRcclxuXHRcdGlmICggJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggKSB7XHJcblx0XHRcdHJldHVybiBzZXR1cFJhdGVyKCk7XHJcblx0XHR9XHRcclxuXHJcblx0XHQvKiBDaGVjayB0ZW1wbGF0ZXMgcHJlc2VudCBvbiB0YWxrIHBhZ2UuIEZldGNoZXMgaW5kaXJlY3RseSB0cmFuc2NsdWRlZCB0ZW1wbGF0ZXMsIHNvIHdpbGwgZmluZFxyXG5cdFx0XHRUZW1wbGF0ZTpXUEJhbm5lck1ldGEgKGFuZCBpdHMgc3VidGVtcGxhdGVzKS4gQnV0IHNvbWUgYmFubmVycyBzdWNoIGFzIE1JTEhJU1QgZG9uJ3QgdXNlIHRoYXRcclxuXHRcdFx0bWV0YSB0ZW1wbGF0ZSwgc28gd2UgYWxzbyBoYXZlIHRvIGNoZWNrIGZvciB0ZW1wbGF0ZSB0aXRsZXMgY29udGFpbmcgJ1dpa2lQcm9qZWN0J1xyXG5cdFx0Ki9cclxuXHRcdGNvbnN0IHRhbGtUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGNvbmZpZy5tdy53Z1BhZ2VOYW1lKS5nZXRUYWxrUGFnZSgpO1xyXG5cdFx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0cHJvcDogXCJ0ZW1wbGF0ZXNcIixcclxuXHRcdFx0dGl0bGVzOiB0YWxrVGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdHRsbmFtZXNwYWNlOiBcIjEwXCIsXHJcblx0XHRcdHRsbGltaXQ6IFwiNTAwXCIsXHJcblx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0fSlcclxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHJcblx0XHRcdFx0dmFyIHRlbXBsYXRlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF0udGVtcGxhdGVzO1xyXG5cdFx0XHRcclxuXHRcdFx0XHRpZiAoICF0ZW1wbGF0ZXMgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdFx0dmFyIGhhc1dpa2lwcm9qZWN0ID0gdGVtcGxhdGVzLnNvbWUodGVtcGxhdGUgPT4gLyhXaWtpUHJvamVjdHxXUEJhbm5lcikvLnRlc3QodGVtcGxhdGUudGl0bGUpKTtcclxuXHRcdFx0XHJcblx0XHRcdFx0aWYgKCAhaGFzV2lraXByb2plY3QgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdH0sXHJcblx0XHRcdGZ1bmN0aW9uKGNvZGUsIGpxeGhyKSB7XHJcblx0XHRcdC8vIFNpbGVudGx5IGlnbm9yZSBmYWlsdXJlcyAoanVzdCBsb2cgdG8gY29uc29sZSlcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0XHRcIltSYXRlcl0gRXJyb3Igd2hpbGUgY2hlY2tpbmcgd2hldGhlciB0byBhdXRvc3RhcnQuXCIgK1xyXG5cdFx0XHRcdCggY29kZSA9PSBudWxsICkgPyBcIlwiIDogXCIgXCIgKyBtYWtlRXJyb3JNc2coY29kZSwganF4aHIpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdFx0XHR9KTtcclxuXHR9KTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhdXRvU3RhcnQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCB7aXNBZnRlckRhdGV9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbi8qKiB3cml0ZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XHJcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSB2YWxcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YWxlRGF5cyBOdW1iZXIgb2YgZGF5cyBhZnRlciB3aGljaCB0aGUgZGF0YSBiZWNvbWVzIHN0YWxlICh1c2FibGUsIGJ1dCBzaG91bGRcclxuICogIGJlIHVwZGF0ZWQgZm9yIG5leHQgdGltZSkuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBleHBpcnlEYXlzIE51bWJlciBvZiBkYXlzIGFmdGVyIHdoaWNoIHRoZSBjYWNoZWQgZGF0YSBtYXkgYmUgZGVsZXRlZC5cclxuICovXHJcbmNvbnN0IHdyaXRlID0gZnVuY3Rpb24oa2V5LCB2YWwsIHN0YWxlRGF5cywgZXhwaXJ5RGF5cykge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBkZWZhdWx0U3RhbGVEYXlzID0gMTtcclxuXHRcdGNvbnN0IGRlZmF1bHRFeHBpcnlEYXlzID0gMzA7XHJcblx0XHRjb25zdCBtaWxsaXNlY29uZHNQZXJEYXkgPSAyNCo2MCo2MCoxMDAwO1xyXG5cclxuXHRcdGNvbnN0IHN0YWxlRHVyYXRpb24gPSAoc3RhbGVEYXlzIHx8IGRlZmF1bHRTdGFsZURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHRcdGNvbnN0IGV4cGlyeUR1cmF0aW9uID0gKGV4cGlyeURheXMgfHwgZGVmYXVsdEV4cGlyeURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdHZhbHVlOiB2YWwsXHJcblx0XHRcdHN0YWxlRGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIHN0YWxlRHVyYXRpb24pLnRvSVNPU3RyaW5nKCksXHJcblx0XHRcdGV4cGlyeURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyBleHBpcnlEdXJhdGlvbikudG9JU09TdHJpbmcoKVxyXG5cdFx0fSk7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlJhdGVyLVwiK2tleSwgc3RyaW5nVmFsKTtcclxuXHR9ICBjYXRjaChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XHJcbn07XHJcbi8qKiByZWFkXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcclxuICogQHJldHVybnMge0FycmF5fE9iamVjdHxTdHJpbmd8TnVsbH0gQ2FjaGVkIGFycmF5IG9yIG9iamVjdCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdCB5ZXQgY2FjaGVkLFxyXG4gKiAgICAgICAgICBvciBudWxsIGlmIHRoZXJlIHdhcyBlcnJvci5cclxuICovXHJcbmNvbnN0IHJlYWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRsZXQgdmFsO1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJhdGVyLVwiK2tleSk7XHJcblx0XHRpZiAoIHN0cmluZ1ZhbCAhPT0gXCJcIiApIHtcclxuXHRcdFx0dmFsID0gSlNPTi5wYXJzZShzdHJpbmdWYWwpO1xyXG5cdFx0fVxyXG5cdH0gIGNhdGNoKGUpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwiW1JhdGVyXSBlcnJvciByZWFkaW5nIFwiICsga2V5ICsgXCIgZnJvbSBsb2NhbFN0b3JhZ2UgY2FjaGU6XCIpO1xyXG5cdFx0Y29uc29sZS5sb2coXHJcblx0XHRcdFwiXFx0XCIgKyBlLm5hbWUgKyBcIiBtZXNzYWdlOiBcIiArIGUubWVzc2FnZSArXHJcblx0XHRcdCggZS5hdCA/IFwiIGF0OiBcIiArIGUuYXQgOiBcIlwiKSArXHJcblx0XHRcdCggZS50ZXh0ID8gXCIgdGV4dDogXCIgKyBlLnRleHQgOiBcIlwiKVxyXG5cdFx0KTtcclxuXHR9XHJcblx0cmV0dXJuIHZhbCB8fCBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgaXNSYXRlcktleSA9IGtleSA9PiBrZXkgJiYga2V5LmluZGV4T2YoXCJSYXRlci1cIikgPT09IDA7XHJcblxyXG5jb25zdCBjbGVhckl0ZW1JZkludmFsaWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRpZiAoICFpc1JhdGVyS2V5KGtleSkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGl0ZW0gPSByZWFkKGtleS5yZXBsYWNlKFwiUmF0ZXItXCIsXCJcIikpO1xyXG5cdGNvbnN0IGlzSW52YWxpZCA9ICFpdGVtIHx8ICFpdGVtLmV4cGlyeURhdGUgfHwgaXNBZnRlckRhdGUoaXRlbS5leHBpcnlEYXRlKTtcclxuXHRpZiAoIGlzSW52YWxpZCApIHtcclxuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcblx0fVxyXG59O1xyXG5cclxuY29uc3QgY2xlYXJJbnZhbGlkSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdHNldFRpbWVvdXQoY2xlYXJJdGVtSWZJbnZhbGlkLCAxMDAsIGxvY2FsU3RvcmFnZS5rZXkoaSkpO1xyXG5cdH1cclxufTtcclxuXHJcbmNvbnN0IGNsZWFyQWxsSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdGxldCBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xyXG5cdFx0aWYgKGlzUmF0ZXJLZXkoa2V5KSkge1xyXG5cdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCB7IHdyaXRlLCByZWFkLCBjbGVhckl0ZW1JZkludmFsaWQsIGNsZWFySW52YWxpZEl0ZW1zLCBjbGVhckFsbEl0ZW1zIH07XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcbmNvbnN0IHBhY2thZ2Vqc29uID0gcmVxdWlyZShcIi4uL3BhY2thZ2UuanNvblwiKTtcclxudmFyIHZlcnNpb24gPSBwYWNrYWdlanNvbi52ZXJzaW9uO1xyXG5cclxuLy8gQSBnbG9iYWwgb2JqZWN0IHRoYXQgc3RvcmVzIGFsbCB0aGUgcGFnZSBhbmQgdXNlciBjb25maWd1cmF0aW9uIGFuZCBzZXR0aW5nc1xyXG52YXIgY29uZmlnID0ge1xyXG5cdC8vIFNjcmlwdCBpbmZvXHJcblx0c2NyaXB0OiB7XHJcblx0XHQvLyBBZHZlcnQgdG8gYXBwZW5kIHRvIGVkaXQgc3VtbWFyaWVzXHJcblx0XHRhZHZlcnQ6ICBgIChbW1dQOlJBVEVSIyR7dmVyc2lvbn18UmF0ZXJdXSlgLFxyXG5cdFx0dmVyc2lvbjogdmVyc2lvblxyXG5cdH0sXHJcblx0Ly8gRGVmYXVsdCBwcmVmZXJlbmNlcywgaWYgdXNlciBzdWJwYWdlIHJhdGVyUHJlZnMuanNvbiBkb2VzIG5vdCBleGlzdFxyXG5cdGRlZmF1bHRQcmVmczoge1xyXG5cdFx0XCJhdXRvc3RhcnRcIjogZmFsc2UsXHJcblx0XHRcImF1dG9zdGFydFJlZGlyZWN0c1wiOiBmYWxzZSxcclxuXHRcdFwiYXV0b3N0YXJ0TmFtZXNwYWNlc1wiOiBbMF0sXHJcblx0XHRcIm1pbkZvclNoZWxsXCI6IDEsXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU9yZXNcIjogdHJ1ZSxcclxuXHRcdFwiYXV0b2ZpbGxJbXBvcnRhbmNlXCI6IHRydWUsXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiA2LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjogXCJwcmVmZXJlbmNlc1wiXHJcblx0fSxcclxuXHQvLyBNZWRpYVdpa2kgY29uZmlndXJhdGlvbiB2YWx1ZXNcclxuXHRtdzogbXcuY29uZmlnLmdldCggW1xyXG5cdFx0XCJza2luXCIsXHJcblx0XHRcIndnUGFnZU5hbWVcIixcclxuXHRcdFwid2dOYW1lc3BhY2VOdW1iZXJcIixcclxuXHRcdFwid2dVc2VyTmFtZVwiLFxyXG5cdFx0XCJ3Z0Zvcm1hdHRlZE5hbWVzcGFjZXNcIixcclxuXHRcdFwid2dNb250aE5hbWVzXCIsXHJcblx0XHRcIndnUmV2aXNpb25JZFwiLFxyXG5cdFx0XCJ3Z1NjcmlwdFBhdGhcIixcclxuXHRcdFwid2dTZXJ2ZXJcIixcclxuXHRcdFwid2dDYXRlZ29yaWVzXCIsXHJcblx0XHRcIndnSXNNYWluUGFnZVwiXHJcblx0XSApLFxyXG5cdGJhbm5lckRlZmF1bHRzOiB7XHJcblx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFwiRkFcIixcclxuXHRcdFx0XCJGTFwiLFxyXG5cdFx0XHRcIkFcIixcclxuXHRcdFx0XCJHQVwiLFxyXG5cdFx0XHRcIkJcIixcclxuXHRcdFx0XCJDXCIsXHJcblx0XHRcdFwiU3RhcnRcIixcclxuXHRcdFx0XCJTdHViXCIsXHJcblx0XHRcdFwiTGlzdFwiXHJcblx0XHRdLFxyXG5cdFx0aW1wb3J0YW5jZXM6IFtcclxuXHRcdFx0XCJUb3BcIixcclxuXHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFwiTWlkXCIsXHJcblx0XHRcdFwiTG93XCJcclxuXHRcdF0sXHJcblx0XHRleHRlbmRlZENsYXNzZXM6IFtcclxuXHRcdFx0XCJDYXRlZ29yeVwiLFxyXG5cdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcIkZNXCIsXHJcblx0XHRcdFwiUG9ydGFsXCIsXHJcblx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFwiQnBsdXNcIixcclxuXHRcdFx0XCJGdXR1cmVcIixcclxuXHRcdFx0XCJDdXJyZW50XCIsXHJcblx0XHRcdFwiRGlzYW1iaWdcIixcclxuXHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcIlJlZGlyZWN0XCIsXHJcblx0XHRcdFwiQm9va1wiXHJcblx0XHRdLFxyXG5cdFx0ZXh0ZW5kZWRJbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcIlRvcFwiLFxyXG5cdFx0XHRcIkhpZ2hcIixcclxuXHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XCJMb3dcIixcclxuXHRcdFx0XCJCb3R0b21cIixcclxuXHRcdFx0XCJOQVwiXHJcblx0XHRdXHJcblx0fSxcclxuXHRjdXN0b21CYW5uZXJzOiB7XHJcblx0XHRcIldpa2lQcm9qZWN0IE1pbGl0YXJ5IGhpc3RvcnlcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGQVwiLFxyXG5cdFx0XHRcdFwiRkxcIixcclxuXHRcdFx0XHRcIkFcIixcclxuXHRcdFx0XHRcIkdBXCIsXHJcblx0XHRcdFx0XCJCXCIsXHJcblx0XHRcdFx0XCJDXCIsXHJcblx0XHRcdFx0XCJTdGFydFwiLFxyXG5cdFx0XHRcdFwiU3R1YlwiLFxyXG5cdFx0XHRcdFwiTGlzdFwiLFxyXG5cdFx0XHRcdFwiQUxcIixcclxuXHRcdFx0XHRcIkJMXCIsXHJcblx0XHRcdFx0XCJDTFwiLFxyXG5cdFx0XHRcdFwiQ2F0ZWdvcnlcIixcclxuXHRcdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFx0XCJGaWxlXCIsXHJcblx0XHRcdFx0XCJQb3J0YWxcIixcclxuXHRcdFx0XHRcIlByb2plY3RcIixcclxuXHRcdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFx0XCJEaXNhbWJpZ1wiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIixcclxuXHRcdFx0XHRcIkJvb2tcIlx0XHRcdFxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW11cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFBvcnRhbHNcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGUG9cIixcclxuXHRcdFx0XHRcIkNvbXBsZXRlXCIsXHJcblx0XHRcdFx0XCJTdWJzdGFudGlhbFwiLFxyXG5cdFx0XHRcdFwiQmFzaWNcIixcclxuXHRcdFx0XHRcIkluY29tcGxldGVcIixcclxuXHRcdFx0XHRcIk1ldGFcIixcclxuXHRcdFx0XHRcIkxpc3RcIixcclxuXHRcdFx0XHRcIkNhdGVnb3J5XCIsXHJcblx0XHRcdFx0XCJEcmFmdFwiLFxyXG5cdFx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcdFwiVGVtcGxhdGVcIixcclxuXHRcdFx0XHRcIkRpc2FtYmlnXCIsXHJcblx0XHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIlxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcdFwiVG9wXCIsXHJcblx0XHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XHRcIkxvd1wiLFxyXG5cdFx0XHRcdFwiQm90dG9tXCIsXHJcblx0XHRcdFx0XCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFZpZGVvIGdhbWVzXCI6IHtcclxuXHRcdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcdFwiRkFcIixcIkZMXCIsXCJGTVwiLFwiR0FcIixcIkJcIixcIkNcIixcIlN0YXJ0XCIsXCJTdHViXCIsXCJMaXN0XCIsXCJDYXRlZ29yeVwiLFwiRHJhZnRcIixcIkZpbGVcIixcIlBvcnRhbFwiLFwiUHJvamVjdFwiLFwiVGVtcGxhdGVcIixcIkRpc2FtYmlnXCIsXCJSZWRpcmVjdFwiXHJcblx0XHRcdF0sXHJcblx0XHRcdGltcG9ydGFuY2VzOiBbXHJcblx0XHRcdFx0XCJUb3BcIixcIkhpZ2hcIixcIk1pZFwiLFwiTG93XCIsXCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHNoZWxsVGVtcGxhdGVzOiBbXHJcblx0XHRcIldpa2lQcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdEJhbm5lcnNcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyc1wiLFxyXG5cdFx0XCJXUEJcIixcclxuXHRcdFwiV1BCU1wiLFxyXG5cdFx0XCJXaWtpcHJvamVjdGJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IEJhbm5lciBTaGVsbFwiLFxyXG5cdFx0XCJXcGJcIixcclxuXHRcdFwiV1BCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXcGJzXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0YmFubmVyc1wiLFxyXG5cdFx0XCJXUCBCYW5uZXIgU2hlbGxcIixcclxuXHRcdFwiV1AgYmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIkJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBCYW5uZXJzIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraXByb2plY3RCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGwvcmVkaXJlY3RcIixcclxuXHRcdFwiV2lraVByb2plY3QgU2hlbGxcIixcclxuXHRcdFwiQmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIlNjb3BlIHNoZWxsXCIsXHJcblx0XHRcIlByb2plY3Qgc2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgYmFubmVyXCJcclxuXHRdLFxyXG5cdGRlZmF1bHRQYXJhbWV0ZXJEYXRhOiB7XHJcblx0XHRcImF1dG9cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXV0by1yYXRlZFwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJBdXRvbWF0aWNhbGx5IHJhdGVkIGJ5IGEgYm90LiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJsaXN0YXNcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTGlzdCBhc1wiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTb3J0a2V5IGZvciB0YWxrIHBhZ2VcIlxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0XCJzbWFsbFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTbWFsbD9cIixcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkRpc3BsYXkgYSBzbWFsbCB2ZXJzaW9uLiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdHRlbnRpb25cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXR0ZW50aW9uIHJlcXVpcmVkP1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiSW1tZWRpYXRlIGF0dGVudGlvbiByZXF1aXJlZC4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIlxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW1hZ2VcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTmVlZHMgaW1hZ2U/XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJSZXF1ZXN0IHRoYXQgYW4gaW1hZ2Ugb3IgcGhvdG9ncmFwaCBvZiB0aGUgc3ViamVjdCBiZSBhZGRlZCB0byB0aGUgYXJ0aWNsZS4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhbGlhc2VzXCI6IFtcclxuXHRcdFx0XHRcIm5lZWRzLXBob3RvXCJcclxuXHRcdFx0XSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIixcclxuXHRcdFx0XCJzdWdnZXN0ZWRcIjogdHJ1ZVxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW5mb2JveFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJOZWVkcyBpbmZvYm94P1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiUmVxdWVzdCB0aGF0IGFuIGluZm9ib3ggYmUgYWRkZWQgdG8gdGhlIGFydGljbGUuIEFsbG93ZWQgdmFsdWVzOiBbJ3llcyddLlwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiYWxpYXNlc1wiOiBbXHJcblx0XHRcdFx0XCJuZWVkcy1waG90b1wiXHJcblx0XHRcdF0sXHJcblx0XHRcdFwiYXV0b3ZhbHVlXCI6IFwieWVzXCIsXHJcblx0XHRcdFwic3VnZ2VzdGVkXCI6IHRydWVcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBBdHRyaWJ1dGlvbjogRGlmZiBzdHlsZXMgYmFzZWQgb24gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpa2lwZWRpYTpBdXRvV2lraUJyb3dzZXIvc3R5bGUuY3NzPlxyXG5jb25zdCBzdHlsZXMgPSBgdGFibGUuZGlmZiwgdGQuZGlmZi1vdGl0bGUsIHRkLmRpZmYtbnRpdGxlIHsgdGFibGUtbGF5b3V0OiBhdXRvICFpbXBvcnRhbnQ7OyB9XHJcbnRkLmRpZmYtb3RpdGxlLCB0ZC5kaWZmLW50aXRsZSB7IHRleHQtYWxpZ246IGNlbnRlcjsgfVxyXG50ZC5kaWZmLW1hcmtlciB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxLjI1ZW07IH1cclxudGQuZGlmZi1saW5lbm8geyBmb250LXdlaWdodDogYm9sZDsgfVxyXG50ZC5kaWZmLWFkZGVkbGluZSwgdGQuZGlmZi1kZWxldGVkbGluZSwgdGQuZGlmZi1jb250ZXh0IHsgZm9udC1zaXplOiA4OCU7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUsIHRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweCAxcHggMXB4IDRweDsgYm9yZGVyLXJhZGl1czogMC4zM2VtOyB9XHJcbnRkLmRpZmYtYWRkZWRsaW5lIHsgYm9yZGVyLWNvbG9yOiAjYTNkM2ZmOyB9XHJcbnRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItY29sb3I6ICNmZmU0OWM7IH1cclxudGQuZGlmZi1jb250ZXh0IHsgYmFja2dyb3VuZDogI2YzZjNmMzsgY29sb3I6ICMzMzMzMzM7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4IDFweCAxcHggNHB4OyBib3JkZXItY29sb3I6ICNlNmU2ZTY7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgfVxyXG4uZGlmZmNoYW5nZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH1cclxudGFibGUuZGlmZiB7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogOTglOyBib3JkZXItc3BhY2luZzogNHB4O1xyXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDsgLyogRW5zdXJlcyB0aGF0IGNvbHVtcyBhcmUgb2YgZXF1YWwgd2lkdGggKi9cclxufVxyXG50ZC5kaWZmLWFkZGVkbGluZSAuZGlmZmNoYW5nZSwgdGQuZGlmZi1kZWxldGVkbGluZSAuZGlmZmNoYW5nZSB7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgcGFkZGluZzogMC4yNWVtIDA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUgLmRpZmZjaGFuZ2Uge1x0YmFja2dyb3VuZDogI2Q4ZWNmZjsgfVxyXG50ZC5kaWZmLWRlbGV0ZWRsaW5lIC5kaWZmY2hhbmdlIHsgYmFja2dyb3VuZDogI2ZlZWVjODsgfVxyXG50YWJsZS5kaWZmIHRkIHtcdHBhZGRpbmc6IDAuMzNlbSAwLjY2ZW07IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1tYXJrZXIgeyB3aWR0aDogMiU7IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1jb250ZW50IHsgd2lkdGg6IDQ4JTsgfVxyXG50YWJsZS5kaWZmIHRkIGRpdiB7XHJcbiAgICAvKiBGb3JjZS13cmFwIHZlcnkgbG9uZyBsaW5lcyBzdWNoIGFzIFVSTHMgb3IgcGFnZS13aWRlbmluZyBjaGFyIHN0cmluZ3MuICovXHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICAvKiBBcyBmYWxsYmFjayAoRkY8My41LCBPcGVyYSA8MTAuNSksIHNjcm9sbGJhcnMgd2lsbCBiZSBhZGRlZCBmb3IgdmVyeSB3aWRlIGNlbGxzXHJcbiAgICAgICAgaW5zdGVhZCBvZiB0ZXh0IG92ZXJmbG93aW5nIG9yIHdpZGVuaW5nICovXHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxufWAgK1xyXG5cclxuLy8gT3ZlcnJpZGUgT09VSSB3aW5kb3cgbWFuYWdlciBwcmV2ZW50aW5nIGJhY2tncm91bmQgc2Nyb2xsaW5nL2ludGVyYWN0aW9uXHJcbmBodG1sIGJvZHkucmF0ZXItbWFpbldpbmRvdy1vcGVuIHtcclxuXHRwb3NpdGlvbjogdW5zZXQ7XHJcblx0b3ZlcmZsb3c6IHVuc2V0O1xyXG59XHJcbmh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLXdpbmRvd01hbmFnZXItbW9kYWwgPiAub28tdWktZGlhbG9nLm9vLXVpLXdpbmRvdy1hY3RpdmUge1xyXG4gICAgcG9zaXRpb246IHN0YXRpYztcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1gICtcclxuLy8gSW5jcmVhc2Ugei1pbmRleCwgdG8gYmUgYWJvdmUgc2tpbiBtZW51cyBldGM7IHNtb290aCB0cmFuc2l0aW9uIGZvciBkcmFnZ2luZyAodHJhbnNmb3JtOnRyYW5zbGF0ZSlcclxuYGh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLWRpYWxvZy5vby11aS13aW5kb3ctYWN0aXZlID4gZGl2IHtcclxuICAgIHotaW5kZXg6IDExMDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dCAwcywgdHJhbnNmb3JtIDBzICFpbXBvcnRhbnRcclxufVxyXG5gICsgXHJcbi8vIEVuc3VyZSBjbG9zZSBkaWFsb2cgaXMgdmlzaWJsZVxyXG5gaHRtbCBib2R5LnJhdGVyLW1haW5XaW5kb3ctb3BlbiAjbXctdGVsZXBvcnQtdGFyZ2V0IHtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDowO1xyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzdHlsZXM7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEksIHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IGlzQWZ0ZXJEYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xyXG5pbXBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxudmFyIGNhY2hlQmFubmVycyA9IGZ1bmN0aW9uKGJhbm5lcnMpIHtcclxuXHRjYWNoZS53cml0ZShcImJhbm5lcnNcIiwgYmFubmVycywgMiwgNjApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgYmFubmVycy9vcHRpb25zIGZyb20gdGhlIEFwaVxyXG4gKiBcclxuICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVkIHdpdGg6IGJhbm5lcnMgb2JqZWN0LCBiYW5uZXJPcHRpb25zIGFycmF5XHJcbiAqL1xyXG52YXIgZ2V0TGlzdE9mQmFubmVyc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHJcblx0dmFyIGZpbmlzaGVkUHJvbWlzZSA9ICQuRGVmZXJyZWQoKTtcclxuXHJcblx0dmFyIHF1ZXJ5U2tlbGV0b24gPSB7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRsaXN0OiBcImNhdGVnb3J5bWVtYmVyc1wiLFxyXG5cdFx0Y21wcm9wOiBcInRpdGxlXCIsXHJcblx0XHRjbW5hbWVzcGFjZTogXCIxMFwiLFxyXG5cdFx0Y21saW1pdDogXCI1MDBcIlxyXG5cdH07XHJcblxyXG5cdHZhciBjYXRlZ29yaWVzID0gW1xyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpXaWtpUHJvamVjdCBiYW5uZXJzIHdpdGggcXVhbGl0eSBhc3Nlc3NtZW50XCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3aXRoUmF0aW5nc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lcnMgd2l0aG91dCBxdWFsaXR5IGFzc2Vzc21lbnRcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcIndpdGhvdXRSYXRpbmdzXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V2lraVByb2plY3QgYmFubmVyIHdyYXBwZXIgdGVtcGxhdGVzXCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3cmFwcGVyc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lciB0ZW1wbGF0ZXMgbm90IGJhc2VkIG9uIFdQQmFubmVyTWV0YVwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwibm90V1BCTVwiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5OkluYWN0aXZlIFdpa2lQcm9qZWN0IGJhbm5lcnNcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcImluYWN0aXZlXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V3JhcHBlciB0ZW1wbGF0ZXMgZm9yIFdpa2lQcm9qZWN0IFdvbWVuIGluIFJlZFwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwid2lyXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHZhciBwcm9jZXNzUXVlcnkgPSBmdW5jdGlvbihyZXN1bHQsIGNhdEluZGV4KSB7XHJcblx0XHRpZiAoICFyZXN1bHQucXVlcnkgfHwgIXJlc3VsdC5xdWVyeS5jYXRlZ29yeW1lbWJlcnMgKSB7XHJcblx0XHRcdC8vIE5vIHJlc3VsdHNcclxuXHRcdFx0Ly8gVE9ETzogZXJyb3Igb3Igd2FybmluZyAqKioqKioqKlxyXG5cdFx0XHRmaW5pc2hlZFByb21pc2UucmVqZWN0KCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gR2F0aGVyIHRpdGxlcyBpbnRvIGFycmF5IC0gZXhjbHVkaW5nIFwiVGVtcGxhdGU6XCIgcHJlZml4XHJcblx0XHR2YXIgcmVzdWx0VGl0bGVzID0gcmVzdWx0LnF1ZXJ5LmNhdGVnb3J5bWVtYmVycy5tYXAoZnVuY3Rpb24oaW5mbykge1xyXG5cdFx0XHRyZXR1cm4gaW5mby50aXRsZS5zbGljZSg5KTtcclxuXHRcdH0pO1xyXG5cdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY2F0ZWdvcmllc1tjYXRJbmRleF0uYmFubmVycywgcmVzdWx0VGl0bGVzKTtcclxuXHRcdFxyXG5cdFx0Ly8gQ29udGludWUgcXVlcnkgaWYgbmVlZGVkXHJcblx0XHRpZiAoIHJlc3VsdC5jb250aW51ZSApIHtcclxuXHRcdFx0ZG9BcGlRdWVyeSgkLmV4dGVuZChjYXRlZ29yaWVzW2NhdEluZGV4XS5xdWVyeSwgcmVzdWx0LmNvbnRpbnVlKSwgY2F0SW5kZXgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNhdGVnb3JpZXNbY2F0SW5kZXhdLnByb2Nlc3NlZC5yZXNvbHZlKCk7XHJcblx0fTtcclxuXHJcblx0dmFyIGRvQXBpUXVlcnkgPSBmdW5jdGlvbihxLCBjYXRJbmRleCkge1xyXG5cdFx0QVBJLmdldCggcSApXHJcblx0XHRcdC5kb25lKCBmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRwcm9jZXNzUXVlcnkocmVzdWx0LCBjYXRJbmRleCk7XHJcblx0XHRcdH0gKVxyXG5cdFx0XHQuZmFpbCggZnVuY3Rpb24oY29kZSwganF4aHIpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXCJbUmF0ZXJdIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyLCBcIkNvdWxkIG5vdCByZXRyaWV2ZSBwYWdlcyBmcm9tIFtbOlwiICsgcS5jbXRpdGxlICsgXCJdXVwiKSk7XHJcblx0XHRcdFx0ZmluaXNoZWRQcm9taXNlLnJlamVjdCgpO1xyXG5cdFx0XHR9ICk7XHJcblx0fTtcclxuXHRcclxuXHRjYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24oY2F0LCBpbmRleCwgYXJyKSB7XHJcblx0XHRjYXQucXVlcnkgPSAkLmV4dGVuZCggeyBcImNtdGl0bGVcIjpjYXQudGl0bGUgfSwgcXVlcnlTa2VsZXRvbiApO1xyXG5cdFx0JC53aGVuKCBhcnJbaW5kZXgtMV0gJiYgYXJyW2luZGV4LTFdLnByb2Nlc3NlZCB8fCB0cnVlICkudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0XHRkb0FwaVF1ZXJ5KGNhdC5xdWVyeSwgaW5kZXgpO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblx0XHJcblx0Y2F0ZWdvcmllc1tjYXRlZ29yaWVzLmxlbmd0aC0xXS5wcm9jZXNzZWQudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0bGV0IGJhbm5lcnMgPSB7fTtcclxuXHRcdGNhdGVnb3JpZXMuZm9yRWFjaChjYXRPYmplY3QgPT4ge1xyXG5cdFx0XHRiYW5uZXJzW2NhdE9iamVjdC5hYmJyZXZpYXRpb25dID0gY2F0T2JqZWN0LmJhbm5lcnM7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0ZmluaXNoZWRQcm9taXNlLnJlc29sdmUoYmFubmVycyk7XHJcblx0fSk7XHJcblx0XHJcblx0cmV0dXJuIGZpbmlzaGVkUHJvbWlzZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lcnMgZnJvbSBjYWNoZSwgaWYgdGhlcmUgYW5kIG5vdCB0b28gb2xkXHJcbiAqIFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZWQgd2l0aCBiYW5uZXJzIG9iamVjdFxyXG4gKi9cclxudmFyIGdldEJhbm5lcnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkQmFubmVycyA9IGNhY2hlLnJlYWQoXCJiYW5uZXJzXCIpO1xyXG5cdGlmIChcclxuXHRcdCFjYWNoZWRCYW5uZXJzIHx8XHJcblx0XHQhY2FjaGVkQmFubmVycy52YWx1ZSB8fFxyXG5cdFx0IWNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlXHJcblx0KSB7XHJcblx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdH1cclxuXHRpZiAoIGlzQWZ0ZXJEYXRlKGNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlKSApIHtcclxuXHRcdC8vIFVwZGF0ZSBpbiB0aGUgYmFja2dyb3VuZDsgc3RpbGwgdXNlIG9sZCBsaXN0IHVudGlsIHRoZW4gIFxyXG5cdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0fVxyXG5cdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShjYWNoZWRCYW5uZXJzLnZhbHVlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lciBuYW1lcywgZ3JvdXBlZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qgb2Ygc3RyaW5nIGFycmF5cyBrZXllZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKi9cclxudmFyIGdldEJhbm5lck5hbWVzID0gKCkgPT4gZ2V0QmFubmVyc0Zyb21DYWNoZSgpXHJcblx0LnRoZW4oIGJhbm5lcnMgPT4ge1xyXG5cdFx0Ly8gRW5zdXJlIGFsbCBrZXlzIGV4aXN0XHJcblx0XHRpZiAoIWJhbm5lcnMud2l0aFJhdGluZ3MgfHwgIWJhbm5lcnMud2l0aG91dFJhdGluZ3MgfHwgIWJhbm5lcnMud3JhcHBlcnMgfHwgIWJhbm5lcnMubm90V1BCTSB8fCAhYmFubmVycy5pbmFjdGl2ZSB8fCAhYmFubmVycy53aXIpIHtcclxuXHRcdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRcdHJldHVybiAkLmV4dGVuZChcclxuXHRcdFx0XHR7IHdpdGhSYXRpbmdzOiBbXSwgd2l0aG91dFJhdGluZ3M6IFtdLCB3cmFwcGVyczogW10sIG5vdFdQQk06IFtdLCBpbmFjdGl2ZTogW10sIHdpcjogW10gfSxcclxuXHRcdFx0XHRiYW5uZXJzXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHQvLyBTdWNjZXNzOiBwYXNzIHRocm91Z2hcclxuXHRcdHJldHVybiBiYW5uZXJzO1xyXG5cdH0gKVxyXG5cdC5jYXRjaCggKCkgPT4ge1xyXG5cdFx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpLCB0aGVuIGNhY2hlIHRoZW1cclxuXHRcdGxldCBiYW5uZXJzUHJvbWlzZSA9IGdldExpc3RPZkJhbm5lcnNGcm9tQXBpKCk7XHJcblx0XHRiYW5uZXJzUHJvbWlzZS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2U7XHJcblx0fSApO1xyXG5cclxuZXhwb3J0IHsgZ2V0QmFubmVyTmFtZXMgfTtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IEFQSSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHsgaXNBZnRlckRhdGUgfSBmcm9tIFwiLi91dGlsXCI7XHJcbmltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5jb25zdCBwcmVmc1BhZ2UgPSBgVXNlcjoke213LmNvbmZpZy5nZXQoXCJ3Z1VzZXJOYW1lXCIpfS9yYXRlclByZWZzLmpzb25gO1xyXG5cclxuY29uc3Qgd3JpdGVQcmVmc1RvQ2FjaGUgPSBwcmVmcyA9PiBjYWNoZS53cml0ZShcclxuXHRcInByZWZzXCIsXHJcblx0cHJlZnMsXHJcblx0KDEvMjQvNjApKjEsIC8vIDEgbWluXHJcblx0KDEvMjQvNjApKjEgIC8vIDEgbWluXHJcbik7XHJcblxyXG5jb25zdCBnZXRQcmVmc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gQVBJLmdldCh7XHJcblx0XHRcImFjdGlvblwiOiBcInF1ZXJ5XCIsXHJcblx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFwicHJvcFwiOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XCJ0aXRsZXNcIjogcHJlZnNQYWdlLFxyXG5cdFx0XCJydnByb3BcIjogXCJjb250ZW50XCIsXHJcblx0XHRcInJ2c2xvdHNcIjogXCJtYWluXCJcclxuXHR9KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdGNvbnN0IHBhZ2UgPSByZXNwb25zZS5xdWVyeS5wYWdlc1tPYmplY3Qua2V5cyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF1dO1xyXG5cdFx0aWYgKCFwYWdlLnBhZ2VpZCB8fCBwYWdlLm1pc3Npbmc9PT1cIlwiKSB7XHJcblx0XHRcdHJldHVybiBjb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHByZWZzO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cHJlZnMgPSBKU09OLnBhcnNlKCBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXSApO1xyXG5cdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwiSlNPTi1wYXJzaW5nLWVycm9yXCIsIGUpO1xyXG5cdFx0fVxyXG5cdFx0d3JpdGVQcmVmc1RvQ2FjaGUocHJlZnMpO1xyXG5cdFx0cmV0dXJuIHByZWZzO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0UHJlZnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkUHJlZnMgPSBjYWNoZS5yZWFkKFwicHJlZnNcIik7XHJcblx0aWYgKFxyXG5cdFx0IWNhY2hlZFByZWZzIHx8XHJcblx0XHQhY2FjaGVkUHJlZnMudmFsdWUgfHxcclxuXHRcdCFjYWNoZWRQcmVmcy5zdGFsZURhdGUgfHxcclxuXHRcdGlzQWZ0ZXJEYXRlKGNhY2hlZFByZWZzLnN0YWxlRGF0ZSlcclxuXHQpIHtcclxuXHRcdC8vIE5vIGNhY2hlZCB2YWx1ZSwgb3IgaXMgdG9vIG9sZFxyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKTtcclxuXHR9XHJcblx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKGNhY2hlZFByZWZzLnZhbHVlKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFByZWZzID0gKCkgPT4gZ2V0UHJlZnNGcm9tQ2FjaGUoKS50aGVuKFxyXG5cdC8vIFN1Y2Nlc3M6IHBhc3MgdGhyb3VnaCAoZmlyc3QgcGFyYW0gb25seSlcclxuXHRwcmVmcyA9PiAkLkRlZmVycmVkKCkucmVzb2x2ZShwcmVmcyksXHJcblx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpXHJcblx0KCkgPT4gZ2V0UHJlZnNGcm9tQXBpKClcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZWRQcmVmcyBvYmplY3Qgd2l0aCBrZXk6dmFsdWUgcGFpcnMgZm9yIHByZWZlcmVuY2VzIGpzb24uXHJcbiAqL1xyXG5jb25zdCBzZXRQcmVmcyA9IGZ1bmN0aW9uKHVwZGF0ZWRQcmVmcykge1xyXG5cdHJldHVybiBBUEkuZWRpdFdpdGhSZXRyeShwcmVmc1BhZ2UsXHRudWxsLFxyXG5cdFx0KCkgPT4gKHtcclxuXHRcdFx0XCJ0ZXh0XCI6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZWRQcmVmcyksXHJcblx0XHRcdFwic3VtbWFyeVwiOiBcIlNhdmluZyBSYXRlciBwcmVmZXJlbmNlcyBcIiArIGNvbmZpZy5zY3JpcHQuYWR2ZXJ0XHJcblx0XHR9KVxyXG5cdClcclxuXHRcdC50aGVuKCAoKSA9PiB3cml0ZVByZWZzVG9DYWNoZSh1cGRhdGVkUHJlZnMpICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoe2dldDogZ2V0UHJlZnMsIHNldDogc2V0UHJlZnN9KTtcclxuZXhwb3J0IHsgZ2V0UHJlZnMsIHNldFByZWZzIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IHBhcnNlVGVtcGxhdGVzLCBnZXRXaXRoUmVkaXJlY3RUbyB9IGZyb20gXCIuL1RlbXBsYXRlXCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuL2dldEJhbm5lcnNcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vY2FjaGVcIjtcclxuaW1wb3J0IHdpbmRvd01hbmFnZXIgZnJvbSBcIi4vd2luZG93TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBnZXRQcmVmcyB9IGZyb20gXCIuL3ByZWZzXCI7XHJcbmltcG9ydCB7IGZpbHRlckFuZE1hcCB9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBzZXR1cFJhdGVyID0gZnVuY3Rpb24oY2xpY2tFdmVudCkge1xyXG5cdGlmICggY2xpY2tFdmVudCApIHtcclxuXHRcdGNsaWNrRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHR9XHJcblxyXG5cdHZhciBzZXR1cENvbXBsZXRlZFByb21pc2UgPSAkLkRlZmVycmVkKCk7XHJcbiAgICBcclxuXHR2YXIgY3VycmVudFBhZ2UgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSk7XHJcblx0dmFyIHRhbGtQYWdlID0gY3VycmVudFBhZ2UgJiYgY3VycmVudFBhZ2UuZ2V0VGFsa1BhZ2UoKTtcclxuXHR2YXIgc3ViamVjdFBhZ2UgPSBjdXJyZW50UGFnZSAmJiBjdXJyZW50UGFnZS5nZXRTdWJqZWN0UGFnZSgpO1xyXG5cdHZhciBzdWJqZWN0SXNBcnRpY2xlID0gY29uZmlnLm13LndnTmFtZXNwYWNlTnVtYmVyIDw9IDE7XHJcbiBcclxuXHQvLyBHZXQgcHJlZmVyZW5jZXMgKHRhc2sgMClcclxuXHR2YXIgcHJlZnNQcm9taXNlID0gZ2V0UHJlZnMoKTtcclxuXHJcblx0Ly8gR2V0IGxpc3RzIG9mIGFsbCBiYW5uZXJzICh0YXNrIDEpXHJcblx0dmFyIGJhbm5lcnNQcm9taXNlID0gZ2V0QmFubmVyTmFtZXMoKTtcclxuXHJcblx0Ly8gTG9hZCB0YWxrIHBhZ2UgKHRhc2sgMilcclxuXHR2YXIgbG9hZFRhbGtQcm9taXNlID0gQVBJLmdldCgge1xyXG5cdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0cnZwcm9wOiBcImNvbnRlbnRcIixcclxuXHRcdHJ2c2VjdGlvbjogXCIwXCIsXHJcblx0XHR0aXRsZXM6IHRhbGtQYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0aW5kZXhwYWdlaWRzOiAxXHJcblx0fSApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHRcdFxyXG5cdFx0dmFyIHdpa2l0ZXh0ID0gKCBpZCA8IDAgKSA/IFwiXCIgOiByZXN1bHQucXVlcnkucGFnZXNbaWRdLnJldmlzaW9uc1swXVtcIipcIl07XHJcblx0XHRyZXR1cm4gd2lraXRleHQ7XHJcblx0fSk7XHJcblxyXG5cdC8vIFBhcnNlIHRhbGsgcGFnZSBmb3IgYmFubmVycyAodGFzayAzKVxyXG5cdHZhciBwYXJzZVRhbGtQcm9taXNlID0gbG9hZFRhbGtQcm9taXNlLnRoZW4od2lraXRleHQgPT4gcGFyc2VUZW1wbGF0ZXMod2lraXRleHQsIHRydWUpKSAvLyBHZXQgYWxsIHRlbXBsYXRlc1xyXG5cdFx0LnRoZW4odGVtcGxhdGVzID0+IHRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuZ2V0VGl0bGUoKSAhPT0gbnVsbCkpIC8vIEZpbHRlciBvdXQgaW52YWxpZCB0ZW1wbGF0ZXMgKGUuZy4gcGFyc2VyIGZ1bmN0aW9ucylcclxuXHRcdC50aGVuKHRlbXBsYXRlcyA9PiBnZXRXaXRoUmVkaXJlY3RUbyh0ZW1wbGF0ZXMpKSAvLyBDaGVjayBmb3IgcmVkaXJlY3RzXHJcblx0XHQudGhlbih0ZW1wbGF0ZXMgPT4ge1xyXG5cdFx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2UudGhlbigoYWxsQmFubmVycykgPT4geyAvLyBHZXQgbGlzdCBvZiBhbGwgYmFubmVyIHRlbXBsYXRlc1xyXG5cdFx0XHRcdHJldHVybiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdFx0XHR0ZW1wbGF0ZXMsIFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gRmlsdGVyIG91dCBub24tYmFubmVyc1xyXG5cdFx0XHRcdFx0dGVtcGxhdGUgPT4geyBcclxuXHRcdFx0XHRcdFx0aWYgKHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpKSB7IHJldHVybiB0cnVlOyB9XHJcblx0XHRcdFx0XHRcdHZhciBtYWluVGV4dCA9IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHRcdFx0XHRcdFx0PyB0ZW1wbGF0ZS5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpXHJcblx0XHRcdFx0XHRcdFx0OiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhbGxCYW5uZXJzLndpdGhSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fCBcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53aXRob3V0UmF0aW5ncy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53cmFwcGVycy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy5ub3RXUEJNLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpci5pbmNsdWRlcyhtYWluVGV4dCk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0Ly8gU2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZiBuZWVkZWRcclxuXHRcdFx0XHRcdHRlbXBsYXRlID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIG1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXRcclxuXHRcdFx0XHRcdFx0XHQ/IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KClcclxuXHRcdFx0XHRcdFx0XHQ6IHRlbXBsYXRlLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHRcdFx0XHRcdFx0aWYgKGFsbEJhbm5lcnMud3JhcHBlcnMuaW5jbHVkZXMobWFpblRleHQpKSB7XHJcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChcIlRlbXBsYXRlOlN1YnN0OlwiICsgbWFpblRleHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpdGhvdXRSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdGFsbEJhbm5lcnMud2lyLmluY2x1ZGVzKG1haW5UZXh0KVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS53aXRob3V0UmF0aW5ncyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCBhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSApIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3QgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybiB0ZW1wbGF0ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFxyXG5cdC8vIFJldHJpZXZlIGFuZCBzdG9yZSBjbGFzc2VzLCBpbXBvcnRhbmNlcywgYW5kIFRlbXBsYXRlRGF0YSAodGFzayA0KVxyXG5cdHZhciB0ZW1wbGF0ZURldGFpbHNQcm9taXNlID0gcGFyc2VUYWxrUHJvbWlzZS50aGVuKGZ1bmN0aW9uKHRlbXBsYXRlcykge1xyXG5cdFx0Ly8gV2FpdCBmb3IgYWxsIHByb21pc2VzIHRvIHJlc29sdmVcclxuXHRcdHJldHVybiAkLndoZW4uYXBwbHkobnVsbCwgW1xyXG5cdFx0XHQuLi50ZW1wbGF0ZXMubWFwKHRlbXBsYXRlID0+IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpID8gbnVsbCA6IHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpKSxcclxuXHRcdFx0Li4udGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucygpKVxyXG5cdFx0XSkudGhlbigoKSA9PiB7XHJcblx0XHRcdC8vIEFkZCBtaXNzaW5nIHJlcXVpcmVkL3N1Z2dlc3RlZCB2YWx1ZXNcclxuXHRcdFx0dGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4gdGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpKTtcclxuXHRcdFx0Ly8gUmV0dXJuIHRoZSBub3ctbW9kaWZpZWQgdGVtcGxhdGVzXHJcblx0XHRcdHJldHVybiB0ZW1wbGF0ZXM7XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gQ2hlY2sgc3ViamVjdCBwYWdlIGZlYXR1cmVzICh0YXNrIDUpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlID0gQVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRmb3JtYXR2ZXJzaW9uOiBcIjJcIixcclxuXHRcdHByb3A6IFwiY2F0ZWdvcmllc1wiLFxyXG5cdFx0dGl0bGVzOiBzdWJqZWN0UGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdHJlZGlyZWN0czogMSxcclxuXHRcdGNsY2F0ZWdvcmllczogW1xyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBkaXNhbWJpZ3VhdGlvbiBwYWdlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBzdHViIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6R29vZCBhcnRpY2xlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkZlYXR1cmVkIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6RmVhdHVyZWQgbGlzdHNcIlxyXG5cdFx0XVxyXG5cdH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG5cdFx0aWYgKCAhcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnF1ZXJ5IHx8ICFyZXNwb25zZS5xdWVyeS5wYWdlcyApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZWRpcmVjdFRhcmdldCA9IHJlc3BvbnNlLnF1ZXJ5LnJlZGlyZWN0cyAmJiByZXNwb25zZS5xdWVyeS5yZWRpcmVjdHNbMF0udG8gfHwgZmFsc2U7XHJcblx0XHRpZiAoIHJlZGlyZWN0VGFyZ2V0IHx8ICFzdWJqZWN0SXNBcnRpY2xlICkge1xyXG5cdFx0XHRyZXR1cm4geyByZWRpcmVjdFRhcmdldCB9O1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcGFnZSA9IHJlc3BvbnNlLnF1ZXJ5LnBhZ2VzWzBdO1xyXG5cdFx0Y29uc3QgaGFzQ2F0ZWdvcnkgPSBjYXRlZ29yeSA9PiBwYWdlLmNhdGVnb3JpZXMgJiYgcGFnZS5jYXRlZ29yaWVzLmZpbmQoY2F0ID0+IGNhdC50aXRsZSA9PT0gXCJDYXRlZ29yeTpcIitjYXRlZ29yeSk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRyZWRpcmVjdFRhcmdldCxcclxuXHRcdFx0ZGlzYW1iaWc6IGhhc0NhdGVnb3J5KFwiQWxsIGRpc2FtYmlndWF0aW9uIHBhZ2VzXCIpLFxyXG5cdFx0XHRzdHVidGFnOiBoYXNDYXRlZ29yeShcIkFsbCBzdHViIGFydGljbGVzXCIpLFxyXG5cdFx0XHRpc0dBOiBoYXNDYXRlZ29yeShcIkdvb2QgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkE6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkw6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIiksXHJcblx0XHRcdGlzTGlzdDogIWhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIikgJiYgL15MaXN0cz8gb2YvLnRlc3Qoc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCkpXHJcblx0XHR9O1xyXG5cdH0pLmNhdGNoKCgpID0+IG51bGwpOyAvLyBGYWlsdXJlIGlnbm9yZWRcclxuXHJcblx0Ly8gUmV0cmlldmUgcmF0aW5nIGZyb20gT1JFUyAodGFzayA2LCBvbmx5IG5lZWRlZCBmb3IgYXJ0aWNsZXMpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHNob3VsZEdldE9yZXMgPSAoIHN1YmplY3RJc0FydGljbGUgKTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBnZXQgT1JFUyBmb3IgcmVkaXJlY3RzIG9yIGRpc2FtYmlnc1xyXG5cdGlmICggc2hvdWxkR2V0T3JlcyApIHtcclxuXHRcdHZhciBsYXRlc3RSZXZJZFByb21pc2UgPSAhY3VycmVudFBhZ2UuaXNUYWxrUGFnZSgpXHJcblx0XHRcdD8gJC5EZWZlcnJlZCgpLnJlc29sdmUoY29uZmlnLm13LndnUmV2aXNpb25JZClcclxuXHRcdFx0OiBBUEkuZ2V0KCB7XHJcblx0XHRcdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XHRcdHRpdGxlczogc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdFx0cnZwcm9wOiBcImlkc1wiLFxyXG5cdFx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0XHR9ICkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRpZiAocmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaWQgPSByZXN1bHQucXVlcnkucGFnZWlkcztcclxuXHRcdFx0XHR2YXIgcGFnZSA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF07XHJcblx0XHRcdFx0aWYgKHBhZ2UubWlzc2luZyA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGlkIDwgMCApIHtcclxuXHRcdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBwYWdlLnJldmlzaW9uc1swXS5yZXZpZDtcclxuXHRcdFx0fSk7XHJcblx0XHR2YXIgb3Jlc1Byb21pc2UgPSBsYXRlc3RSZXZJZFByb21pc2UudGhlbihmdW5jdGlvbihsYXRlc3RSZXZJZCkge1xyXG5cdFx0XHRpZiAoIWxhdGVzdFJldklkKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBBUEkuZ2V0T1JFUyhsYXRlc3RSZXZJZClcclxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRcdHZhciBkYXRhID0gcmVzdWx0LmVud2lraS5zY29yZXNbbGF0ZXN0UmV2SWRdLmFydGljbGVxdWFsaXR5O1xyXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmVycm9yICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChkYXRhLmVycm9yLnR5cGUsIGRhdGEuZXJyb3IubWVzc2FnZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBwcmVkaWN0aW9uID0gZGF0YS5zY29yZS5wcmVkaWN0aW9uO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJvYmFiaWxpdGllcyA9IGRhdGEuc2NvcmUucHJvYmFiaWxpdHk7XHJcblx0XHRcdFx0XHRpZiAocHJlZGljdGlvbiA9PT0gXCJGQVwiIHx8IHByZWRpY3Rpb24gPT09IFwiR0FcIikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdHByZWRpY3Rpb246IFwiQiBvciBoaWdoZXJcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKChwcm9iYWJpbGl0aWVzLkZBICsgcHJvYmFiaWxpdGllcy5HQSArIHByb2JhYmlsaXRpZXMuQikqMTAwKS50b0ZpeGVkKDEpK1wiJVwiXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRwcmVkaWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKHByb2JhYmlsaXRpZXNbIHByZWRpY3Rpb24gXSoxMDApLnRvRml4ZWQoMSkrXCIlXCJcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSkuY2F0Y2goKCkgPT4gbnVsbCk7IC8vIEZhaWx1cmUgaWdub3JlZDtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gT3BlbiB0aGUgbG9hZCBkaWFsb2dcclxuXHR2YXIgaXNPcGVuZWRQcm9taXNlID0gJC5EZWZlcnJlZCgpO1xyXG5cdHZhciBsb2FkRGlhbG9nV2luID0gd2luZG93TWFuYWdlci5vcGVuV2luZG93KFwibG9hZERpYWxvZ1wiLCB7XHJcblx0XHRwcm9taXNlczogW1xyXG5cdFx0XHRiYW5uZXJzUHJvbWlzZSxcclxuXHRcdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0XHRwYXJzZVRhbGtQcm9taXNlLFxyXG5cdFx0XHR0ZW1wbGF0ZURldGFpbHNQcm9taXNlLFxyXG5cdFx0XHRzdWJqZWN0UGFnZUNoZWNrUHJvbWlzZSxcclxuXHRcdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdFx0XSxcclxuXHRcdG9yZXM6IHNob3VsZEdldE9yZXMsXHJcblx0XHRpc09wZW5lZDogaXNPcGVuZWRQcm9taXNlXHJcblx0fSk7XHJcblxyXG5cdGxvYWREaWFsb2dXaW4ub3BlbmVkLnRoZW4oaXNPcGVuZWRQcm9taXNlLnJlc29sdmUpO1xyXG5cclxuXHJcblx0JC53aGVuKFxyXG5cdFx0cHJlZnNQcm9taXNlLFxyXG5cdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0dGVtcGxhdGVEZXRhaWxzUHJvbWlzZSxcclxuXHRcdHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlLFxyXG5cdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdCkudGhlbihcclxuXHRcdC8vIEFsbCBzdWNjZWRlZFxyXG5cdFx0ZnVuY3Rpb24ocHJlZmVyZW5jZXMsIHRhbGtXaWtpdGV4dCwgYmFubmVycywgc3ViamVjdFBhZ2VDaGVjaywgb3Jlc1ByZWRpY2l0aW9uICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0ge1xyXG5cdFx0XHRcdHN1Y2Nlc3M6IHRydWUsXHJcblx0XHRcdFx0dGFsa3BhZ2U6IHRhbGtQYWdlLFxyXG5cdFx0XHRcdHN1YmplY3RQYWdlOiBzdWJqZWN0UGFnZSxcclxuXHRcdFx0XHR0YWxrV2lraXRleHQ6IHRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRiYW5uZXJzOiBiYW5uZXJzLFxyXG5cdFx0XHRcdHByZWZlcmVuY2VzOiBwcmVmZXJlbmNlcyxcclxuXHRcdFx0XHRpc0FydGljbGU6IHN1YmplY3RJc0FydGljbGVcclxuXHRcdFx0fTtcclxuXHRcdFx0aWYgKHN1YmplY3RQYWdlQ2hlY2spIHtcclxuXHRcdFx0XHRyZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4uc3ViamVjdFBhZ2VDaGVjayB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvcmVzUHJlZGljaXRpb24gJiYgc3ViamVjdFBhZ2VDaGVjayAmJiAhc3ViamVjdFBhZ2VDaGVjay5pc0dBICYmICFzdWJqZWN0UGFnZUNoZWNrLmlzRkEgJiYgIXN1YmplY3RQYWdlQ2hlY2suaXNGTCkge1xyXG5cdFx0XHRcdHJlc3VsdC5vcmVzID0gb3Jlc1ByZWRpY2l0aW9uO1xyXG5cdFx0XHR9XHJcblx0XHRcdHdpbmRvd01hbmFnZXIuY2xvc2VXaW5kb3coXCJsb2FkRGlhbG9nXCIsIHJlc3VsdCk7XHJcblx0XHRcdFxyXG5cdFx0fVxyXG5cdCk7IC8vIEFueSBmYWlsdXJlcyBhcmUgaGFuZGxlZCBieSB0aGUgbG9hZERpYWxvZyB3aW5kb3cgaXRzZWxmXHJcblxyXG5cdC8vIE9uIHdpbmRvdyBjbG9zZWQsIGNoZWNrIGRhdGEsIGFuZCByZXNvbHZlL3JlamVjdCBzZXR1cENvbXBsZXRlZFByb21pc2VcclxuXHRsb2FkRGlhbG9nV2luLmNsb3NlZC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdGlmIChkYXRhICYmIGRhdGEuc3VjY2Vzcykge1xyXG5cdFx0XHQvLyBHb3QgZXZlcnl0aGluZyBuZWVkZWQ6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHRoaXMgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShkYXRhKTtcclxuXHRcdH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLmVycm9yKSB7XHJcblx0XHRcdC8vIFRoZXJlIHdhcyBhbiBlcnJvcjogUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvciBjb2RlL2luZm9cclxuXHRcdFx0c2V0dXBDb21wbGV0ZWRQcm9taXNlLnJlamVjdChkYXRhLmVycm9yLmNvZGUsIGRhdGEuZXJyb3IuaW5mbyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBXaW5kb3cgY2xvc2VkIGJlZm9yZSBjb21wbGV0aW9uOiByZXNvbHZlIHByb21pc2Ugd2l0aG91dCBhbnkgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuXHRcdH1cclxuXHRcdGNhY2hlLmNsZWFySW52YWxpZEl0ZW1zKCk7XHJcblx0fSk7XHJcblx0cmV0dXJuIHNldHVwQ29tcGxldGVkUHJvbWlzZTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHVwUmF0ZXI7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBvYmplY3RzIHRoYXQgbWlnaHQgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXNcclxuXHJcbnZhciBpc0FmdGVyRGF0ZSA9IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoZGF0ZVN0cmluZykgPCBuZXcgRGF0ZSgpO1xyXG59O1xyXG5cclxudmFyIHllc1dvcmRzID0gW1xyXG5cdFwiYWRkXCIsXHJcblx0XCJhZGRlZFwiLFxyXG5cdFwiYWZmaXJtXCIsXHJcblx0XCJhZmZpcm1lZFwiLFxyXG5cdFwiaW5jbHVkZVwiLFxyXG5cdFwiaW5jbHVkZWRcIixcclxuXHRcIm9uXCIsXHJcblx0XCJ0cnVlXCIsXHJcblx0XCJ5ZXNcIixcclxuXHRcInlcIixcclxuXHRcIjFcIlxyXG5dO1xyXG52YXIgbm9Xb3JkcyA9IFtcclxuXHRcImRlY2xpbmVcIixcclxuXHRcImRlY2xpbmVkXCIsXHJcblx0XCJleGNsdWRlXCIsXHJcblx0XCJleGNsdWRlZFwiLFxyXG5cdFwiZmFsc2VcIixcclxuXHRcIm5vbmVcIixcclxuXHRcIm5vdFwiLFxyXG5cdFwibm9cIixcclxuXHRcIm5cIixcclxuXHRcIm9mZlwiLFxyXG5cdFwib21pdFwiLFxyXG5cdFwib21pdHRlZFwiLFxyXG5cdFwicmVtb3ZlXCIsXHJcblx0XCJyZW1vdmVkXCIsXHJcblx0XCIwXCJcclxuXTtcclxudmFyIG5vcm1hbGlzZVllc05vID0gZnVuY3Rpb24odmFsKSB7XHJcblx0aWYgKHZhbCA9PSBudWxsKSB7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH1cclxuXHR2YXIgdHJpbW1lZExjVmFsID0gdmFsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cdGlmICh5ZXNXb3Jkcy5pbmNsdWRlcyh0cmltbWVkTGNWYWwpKSB7XHJcblx0XHRyZXR1cm4gXCJ5ZXNcIjtcclxuXHR9IGVsc2UgaWYgKG5vV29yZHMuaW5jbHVkZXModHJpbW1lZExjVmFsKSkge1xyXG5cdFx0cmV0dXJuIFwibm9cIjtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHRyaW1tZWRMY1ZhbDtcclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJQcmVkaWNhdGUgKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHtib29sZWFufVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXBUcmFuc2Zvcm0gKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHthbnl9XHJcbiAqIEByZXR1cm5zIHtBcnJheX1cclxuICovXHJcbnZhciBmaWx0ZXJBbmRNYXAgPSBmdW5jdGlvbihhcnJheSwgZmlsdGVyUHJlZGljYXRlLCBtYXBUcmFuc2Zvcm0pIHtcclxuXHRyZXR1cm4gYXJyYXkucmVkdWNlKFxyXG5cdFx0KGFjY3VtdWxhdGVkLCBjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKGZpbHRlclByZWRpY2F0ZShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KSkge1xyXG5cdFx0XHRcdHJldHVybiBbLi4uYWNjdW11bGF0ZWQsIG1hcFRyYW5zZm9ybShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KV07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdGVkO1xyXG5cdFx0fSxcclxuXHRcdFtdXHJcblx0KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gYXJyYXkgXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gaXRlbSB3aXRoIHRoZSBoaWdoZXN0IGZyZXF1ZW5jeVxyXG4gKiBlLmcuIGBtb3N0RnJlcXVlbnQoW1wiYXBwbGVcIiwgXCJhcHBsZVwiLCBcIm9yYW5nZVwiXSlgIHJldHVybnMgYFwiYXBwbGVcImBcclxuICovXHJcbmZ1bmN0aW9uIG1vc3RGcmVxdWVudChhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdHZhciBtYXAgPSB7fTtcclxuXHR2YXIgbW9zdEZyZXEgPSBudWxsO1xyXG5cdGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHRcdG1hcFtpdGVtXSA9IChtYXBbaXRlbV0gfHwgMCkgKyAxO1xyXG5cdFx0aWYgKG1vc3RGcmVxID09PSBudWxsIHx8IG1hcFtpdGVtXSA+IG1hcFttb3N0RnJlcV0pIHtcclxuXHRcdFx0bW9zdEZyZXEgPSBpdGVtO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiBtb3N0RnJlcTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSBcclxuICogQHJldHVybnMge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSB3aXRoIG9ubHkgdW5pcXVlIHZhbHVlc1xyXG4gKiBlLmcuIGB1bmlxdWVBcnJheShbXCJhcHBsZVwiLCBcImFwcGxlXCIsIFwib3JhbmdlXCJdKWAgcmV0dXJucyBgW1wiYXBwbGVcIiwgXCJvcmFuZ2VcIl1gXHJcbiAqL1xyXG5mdW5jdGlvbiB1bmlxdWVBcnJheShhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBbXTtcclxuXHR2YXIgc2VlbiA9IHt9O1xyXG5cdHZhciB1bmlxdWUgPSBbXTtcclxuXHRhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRpZiAoIXNlZW5baXRlbV0pIHtcclxuXHRcdFx0dW5pcXVlLnB1c2goaXRlbSk7XHJcblx0XHRcdHNlZW5baXRlbV0gPSB0cnVlO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiB1bmlxdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsYXNzTWFzayhjbGFzc1ZhbCkge1xyXG5cdGlmICghY2xhc3NWYWwpIHtcclxuXHRcdHJldHVybiBjbGFzc1ZhbDtcclxuXHR9XHJcblx0c3dpdGNoIChjbGFzc1ZhbC50b0xvd2VyQ2FzZSgpKSB7XHJcblx0Y2FzZSBcImZhXCI6XHJcblx0Y2FzZSBcImZsXCI6XHJcblx0Y2FzZSBcImFcIjpcclxuXHRjYXNlIFwiZ2FcIjpcclxuXHRjYXNlIFwiYlwiOlxyXG5cdGNhc2UgXCJjXCI6XHJcblx0Y2FzZSBcIm5hXCI6XHJcblx0Y2FzZSBcImZtXCI6XHJcblx0Y2FzZSBcImFsXCI6XHJcblx0Y2FzZSBcImJsXCI6XHJcblx0Y2FzZSBcImNsXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwudG9VcHBlckNhc2UoKTtcclxuXHRjYXNlIFwic3RhcnRcIjpcclxuXHRjYXNlIFwic3R1YlwiOlxyXG5cdGNhc2UgXCJsaXN0XCI6XHJcblx0Y2FzZSBcInBvcnRhbFwiOlxyXG5cdGNhc2UgXCJwcm9qZWN0XCI6XHJcblx0Y2FzZSBcImRyYWZ0XCI6XHJcblx0Y2FzZSBcImJvb2tcIjpcclxuXHRjYXNlIFwiZnV0dXJlXCI6XHJcblx0Y2FzZSBcImN1cnJlbnRcIjpcclxuXHRjYXNlIFwiY29tcGxldGVcIjpcclxuXHRjYXNlIFwic3Vic3RhbnRpYWxcIjpcclxuXHRjYXNlIFwiYmFzaWNcIjpcclxuXHRjYXNlIFwiaW5jb21wbGV0ZVwiOlxyXG5cdGNhc2UgXCJtZXRhXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgY2xhc3NWYWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuXHRjYXNlIFwiaW1hZ2VcIjpcclxuXHRjYXNlIFwiaW1nXCI6XHJcblx0Y2FzZSBcImZpbGVcIjpcclxuXHRcdHJldHVybiBcIkZpbGVcIjtcclxuXHRjYXNlIFwiY2F0ZWdvcnlcIjpcclxuXHRjYXNlIFwiY2F0XCI6XHJcblx0Y2FzZSBcImNhdGVnXCI6XHJcblx0XHRyZXR1cm4gXCJDYXRlZ29yeVwiO1xyXG5cdGNhc2UgXCJkaXNhbWJpZ3VhdGlvblwiOlxyXG5cdGNhc2UgXCJkaXNhbWJpZ1wiOlxyXG5cdGNhc2UgXCJkaXNhbWJcIjpcclxuXHRjYXNlIFwiZGFiXCI6XHJcblx0XHRyZXR1cm4gXCJEaXNhbWJpZ1wiO1xyXG5cdGNhc2UgXCJyZWRpcmVjdFwiOlxyXG5cdGNhc2UgXCJyZWRpclwiOlxyXG5cdGNhc2UgXCJyZWRcIjpcclxuXHRcdHJldHVybiBcIlJlZGlyZWN0XCI7XHJcblx0Y2FzZSBcInRlbXBsYXRlXCI6XHJcblx0Y2FzZSBcInRlbXBcIjpcclxuXHRjYXNlIFwidHBsXCI6XHJcblx0XHRyZXR1cm4gXCJUZW1wbGF0ZVwiO1xyXG5cdGNhc2UgXCJicGx1c1wiOlxyXG5cdGNhc2UgXCJiK1wiOlxyXG5cdFx0cmV0dXJuIFwiQnBsdXNcIjtcclxuXHRjYXNlIFwiZnBvXCI6XHJcblx0XHRyZXR1cm4gXCJGUG9cIjtcclxuXHRkZWZhdWx0OlxyXG5cdFx0cmV0dXJuIGNsYXNzVmFsO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0YW5jZU1hc2soaW1wb3J0YW5jZSkge1xyXG5cdGlmICghaW1wb3J0YW5jZSkge1xyXG5cdFx0cmV0dXJuIGltcG9ydGFuY2U7XHJcblx0fVxyXG5cdGlmIChpbXBvcnRhbmNlLnRvTG93ZXJDYXNlKCkgPT09IFwibmFcIikge1xyXG5cdFx0cmV0dXJuIFwiTkFcIjtcclxuXHR9XHJcblx0cmV0dXJuIGltcG9ydGFuY2Uuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgaW1wb3J0YW5jZS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGlzQWZ0ZXJEYXRlLFxyXG5cdGZpbHRlckFuZE1hcCxcclxuXHRub3JtYWxpc2VZZXNObyxcclxuXHRtb3N0RnJlcXVlbnQsXHJcblx0dW5pcXVlQXJyYXksXHJcblx0Y2xhc3NNYXNrLFxyXG5cdGltcG9ydGFuY2VNYXNrXHJcbn07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBMb2FkRGlhbG9nIGZyb20gXCIuL1dpbmRvd3MvTG9hZERpYWxvZ1wiO1xyXG5pbXBvcnQgTWFpbldpbmRvdyBmcm9tIFwiLi9XaW5kb3dzL01haW5XaW5kb3dcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBmYWN0b3J5ID0gbmV3IE9PLkZhY3RvcnkoKTtcclxuXHJcbi8vIFJlZ2lzdGVyIHdpbmRvdyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgZmFjdG9yeS5cclxuZmFjdG9yeS5yZWdpc3RlcihMb2FkRGlhbG9nKTtcclxuZmFjdG9yeS5yZWdpc3RlcihNYWluV2luZG93KTtcclxuXHJcbnZhciBtYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoIHtcclxuXHRcImZhY3RvcnlcIjogZmFjdG9yeVxyXG59ICk7XHJcbiQoIGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoIG1hbmFnZXIuJGVsZW1lbnQgKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1hbmFnZXI7XHJcbi8vIDwvbm93aWtpPiJdfQ==