User:Evad37/rater/sandbox/app.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
(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 }; }
// <nowiki>

(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 = $("<span>").append($("<strong>").text("Ratings saved successfully."));
        if (result.upgradedStub) {
          $message.append($("<br>"),
          // TODO: There should be a link that will edit the article for you
          $("<span>").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);
})();
// </nowiki>

},{"./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; }
// <nowiki>

/** 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 '{{' and ending 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 <https://en.wikipedia.org/wiki/User:SD0001/parseAllTemplates.js>.
 * Returns an array containing the template details:
 *  var templates = parseTemplates("Hello {{foo |Bar|baz=qux |2=loremipsum|3=}} world");
 *  console.log(templates[0]); // --> object
	{
		name: "foo",
		wikitext:"{{foo |Bar|baz=qux | 2 = loremipsum  |3=}}",
		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("{{" + text.replace(/\x01/g, "|") + "}}");

    // swap out pipe in links with \x01 control character
    // [[File: ]] 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 + 4))) {
        inComment = true;
        i += 3;
      } else if (/^<nowiki ?>/.test(wikitext.slice(i, i + 9))) {
        inNowiki = true;
        i += 7;
      }
    } else {
      // we are in a comment or nowiki or {{{parameter}}}
      if (wikitext[i] === "|") {
        // swap out pipes 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<Template>|Promise<Template[]>}
 */
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;
  });
};

// </nowiki>

},{"./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; }
// <nowiki>

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; // </nowiki>
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; }
// <nowiki>

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: $("<div style=\"width:100%\">")
  });
  this.clearButton = new OO.ui.ButtonWidget({
    icon: "cancel",
    label: "Clear parameters",
    title: "Clear parameters",
    flags: "destructive",
    $element: $("<div style=\"width:100%\">")
  });
  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: $("<span style='width:100%;'>")
  });
  this.mainLabelPopupButton = new OO.ui.PopupButtonWidget({
    label: "{{".concat(template.getTitle().getMainText(), "}}").concat(this.inactiveProject ? " (inactive)" : ""),
    $element: $("<span style='display:inline-block;width:48%;margin-right:0;padding-right:8px'>"),
    $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("<span style=\"color:#777\">Class</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no class" : "auto-detect", ")</span>"))
        })].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("<span style=\"color:#777\">Class</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "inherit from shell" : "auto-detect", ")</span>"))
        })].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("<span style=\"color:#777\">Importance</span>"),
      menu: {
        items: [new OO.ui.MenuOptionWidget({
          data: null,
          label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no importance" : "auto-detect", ")</span>"))
        })].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: $("<div style='display:inline-block;width:40%'>"),
    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: $("<div style='display:inline-block;width:40%'>"),
    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($("<hr>"));
  }
  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>}
 */
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.redirectTargetMainText, "}}").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 ("{{" + this.name + ((this.hasClassRatings || this.isShellTemplate) && classVal != null ? "".concat(pipe, "class").concat(equals).concat(classVal || "") : "") + (this.hasImportanceRatings && importanceVal != null ? "".concat(pipe, "importance").concat(equals).concat(importanceVal || "") : "") + this.parameterList.getParameterItems().map(function (parameter) {
    return parameter.makeWikitext(pipe, equals);
  }).join("") + this.endBracesStyle).replace(/\n+}}$/, "\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; // </nowiki>
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;
// <nowiki>

function DropdownParameterWidget(config) {
  // Configuration initialization
  config = $.extend({
    $element: $("<span style='display:inline-block;width:24%'>")
  }, 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: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;left:unset;'>")
  }).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; // </nowiki>
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; }
// <nowiki>

/**
 * 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; // </nowiki>
exports["default"] = _default;

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

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

/**
 * @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: $("<span style='margin-bottom:0'>")
      });
      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: $("<span style='margin-bottom:0'>")
  });
  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; // </nowiki>
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 }; }
// <nowiki>

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: $("<label style='margin:0 0 0 5px'>")
      });
      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: $("<div style='margin-bottom:0;'>"),
    $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: $("<span style='margin-right:0'>")
  });
  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: $("<span style='font-size:92%'>")
  });
  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: $("<div style='width: 48%;margin:0;'>")
  });
  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: $("<span style='margin: 0 5px 0 -5px; min-width: 16px; width: 16px;'>")
  }).toggle(this.isInvalid);
  this.fullLabel = new OO.ui.LabelWidget({
    label: this.name + (this.value ? " = " + this.value : " "),
    $element: $("<label style='margin: 0;'>")
  });
  this.autofilledIcon = new OO.ui.IconWidget({
    icon: "robot",
    title: "Autofilled by Rater",
    flags: "progressive",
    $element: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;'>")
  }).toggle(this.autofilled);
  this.editButton = new OO.ui.ButtonWidget({
    icon: "edit",
    framed: false,
    $element: $("<span style='margin-bottom: 0;'>")
  });
  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: $("<span style='margin:0;width:unset;'>")
  });
  if (this.checkbox) {
    this.readLayout.addItems([this.checkbox], 2);
  }

  /* --- CONTAINER FOR BOTH LAYOUTS --- */
  this.$element = $("<div>").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; // </nowiki>
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 }; }
// <nowiki>

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; // </nowiki>
exports["default"] = _default;

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

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

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; // </nowiki>
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; }
// <nowiki>

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: $("<div style='display:inline-block; margin:0 -1px; width:calc(100% - 55px);'>"),
    $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: $("<span style='float:right;margin: 0;transform: translateX(-12px);'>")
  });
  var $searchContainer = $("<div style='display:inline-block; flex-shrink:1; flex-grow:100; min-width:250px; width:50%;'>").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)</span>")
      })].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)</span>")
      })], _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: $("<span style='flex:1 0 auto;'>")
  });
  // 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; // </nowiki>
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; }
// <nowiki>

/* 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; // </nowiki>
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 }; }
// <nowiki>

function MainWindow(config) {
  MainWindow["super"].call(this, config);
}
OO.inheritClass(MainWindow, OO.ui.ProcessDialog);
MainWindow["static"].name = "main";
MainWindow["static"].title = $("<span>").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"), ") ", $("<span>").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("<span style='padding:0 1em;'>Save</span>"),
  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: $("<span style='float:right; padding: 10px; max-width: 50%; text-align: center;'>"),
    label: $("<span>").append($("<a>").attr({
      "href": mw.util.getUrl("mw:ORES"),
      "target": "_blank"
    }).append($("<img>").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"
    })), " ", $("<span class='oresPrediction'>"))
  }).toggle(false);
  this.pagetypeLabel = new OO.ui.LabelWidget({
    $element: $("<span style='float:right; padding: 10px; max-width: 33.33%; text-align: center;'>")
  }).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: $("<div>")
  });
  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: ", $("<strong>").text(data.ores.prediction), "&nbsp;(" + 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($("<div>").append($("<strong style='display:block;'>").text("Could not save preferences."), $("<span style='color:#777'>").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($("<div>").append($("<strong style='display:block;'>").text("Could not save your changes."), $("<span style='color:#777'>").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<hr>\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($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").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 = $("<table>").addClass("diff").css("width", "100%").append($("<tr>").append($("<th>").attr({
        "colspan": "2",
        "scope": "col"
      }).css("width", "50%").text("Latest revision"), $("<th>").attr({
        "colspan": "2",
        "scope": "col"
      }).css("width", "50%").text("New text")), result.compare["*"], $("<tfoot>").append($("<tr>").append($("<td colspan='4'>").append($("<strong>").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($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").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 {{" + name + "}} 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("{{" + mw.html.escape(name) + "}} is not a recognised WikiProject banner.<br/>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; // </nowiki>
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); }
// <nowiki>

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<object>} 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; // </nowiki>
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 }; }
// <nowiki>

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; // </nowiki>
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");
// <nowiki>

/** 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);
    }
  }
};

// </nowiki>
exports.clearAllItems = clearAllItems;

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

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
// <nowiki>
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: " ([[WP:RATER#".concat(version, "|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; // </nowiki>
exports["default"] = _default;

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

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

// 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; // </nowiki>
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; }
// <nowiki>

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;
  });
};

// </nowiki>
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 }; }
// <nowiki>

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
}; // </nowiki>
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; }
// <nowiki>

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; // </nowiki>
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; }
// <nowiki>

// 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();
}

// </nowiki>

},{}],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 }; }
// <nowiki>

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; // </nowiki>
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==