survey-analytics 1.9.129 → 1.9.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS Dashboard library v1.9.129
2
+ * surveyjs - SurveyJS Dashboard library v1.9.130
3
3
  * Copyright (c) 2015-2024 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -9984,7 +9984,7 @@ var PlotlySetup = /** @class */ (function () {
9984
9984
  PlotlySetup.setupPie = function (model) {
9985
9985
  var _a = model.getAnswersData(), datasets = _a.datasets, labels = _a.labels, colors = _a.colors, texts = _a.texts, seriesLabels = _a.seriesLabels;
9986
9986
  var traces = [];
9987
- var hasSeries = seriesLabels.length > 0 || model.question.getType() === "matrix";
9987
+ var hasSeries = seriesLabels.length > 1 || model.question.getType() === "matrix";
9988
9988
  var traceConfig = {
9989
9989
  type: model.chartType,
9990
9990
  y: hasSeries ? seriesLabels : labels,
@@ -10061,7 +10061,7 @@ var PlotlySetup = /** @class */ (function () {
10061
10061
  var bottomMargin = 30;
10062
10062
  var _a = model.getAnswersData(), datasets = _a.datasets, labels = _a.labels, colors = _a.colors, texts = _a.texts, seriesLabels = _a.seriesLabels;
10063
10063
  var traces = [];
10064
- var hasSeries = seriesLabels.length > 0 || model.question.getType() === "matrix";
10064
+ var hasSeries = seriesLabels.length > 1 || model.question.getType() === "matrix";
10065
10065
  var yFullTexts = hasSeries ? seriesLabels : labels;
10066
10066
  var traceConfig = {
10067
10067
  type: model.chartType,
@@ -10166,7 +10166,7 @@ var PlotlySetup = /** @class */ (function () {
10166
10166
  var bottomMargin = 30;
10167
10167
  var _a = model.getAnswersData(), datasets = _a.datasets, labels = _a.labels, colors = _a.colors, texts = _a.texts, seriesLabels = _a.seriesLabels;
10168
10168
  var traces = [];
10169
- var hasSeries = seriesLabels.length > 0 || model.question.getType() === "matrix";
10169
+ var hasSeries = seriesLabels.length > 1 || model.question.getType() === "matrix";
10170
10170
  var layout = {
10171
10171
  font: {
10172
10172
  family: "Segoe UI, sans-serif",
@@ -10227,7 +10227,7 @@ var PlotlySetup = /** @class */ (function () {
10227
10227
  var topMargin = 30;
10228
10228
  var bottomMargin = 30;
10229
10229
  var _a = model.getAnswersData(), datasets = _a.datasets, labels = _a.labels, colors = _a.colors, texts = _a.texts, seriesLabels = _a.seriesLabels;
10230
- var hasSeries = seriesLabels.length > 0 || model.question.getType() === "matrix";
10230
+ var hasSeries = seriesLabels.length > 1 || model.question.getType() === "matrix";
10231
10231
  var traces = [];
10232
10232
  var traceConfig = {
10233
10233
  type: "scatter",
@@ -14796,4 +14796,4 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_wordcloud__;
14796
14796
 
14797
14797
  /******/ });
14798
14798
  });
14799
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcG9ydHVndWVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUuc2Nzcz9hNjhlIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9jaG9pY2VzLXRhYmxlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9kYXRhUHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2VudHJpZXMvc3VtbWFyeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZmlsdGVySW5mby50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9sYXlvdXRFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xvY2FsaXphdGlvbk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4RHJvcGRvd25Hcm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9udW1iZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9ib29sZWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXhkcm9wZG93bi1ncm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmFua2luZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3JhdGluZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NlbGVjdEJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9zZXR1cC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC5zY3NzPzJjNGUiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3RleHQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWFuYWdlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHluYW1pYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnNjc3M/M2M4MiIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyQmFzZS5zY3NzP2FmYmQiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9zcGFuaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvd29yZGNsb3VkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJQbG90bHlcIixcImNvbW1vbmpzMlwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJjb21tb25qc1wiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJhbWRcIjpcInBsb3RseS5qcy1kaXN0LW1pblwifSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdL2V4dGVybmFsIHtcInJvb3RcIjpcIldvcmRDbG91ZFwiLFwiY29tbW9uanMyXCI6XCJ3b3JkY2xvdWRcIixcImNvbW1vbmpzXCI6XCJ3b3JkY2xvdWRcIixcImFtZFwiOlwid29yZGNsb3VkXCJ9Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSw0Q0FBNEMsZ3VFOzs7Ozs7Ozs7OztBQ0E1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsS0FBNEQ7QUFDOUQsRUFBRSxTQUNtRDtBQUNyRCxDQUFDLG9CQUFvQjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLGFBQWE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxFQUFFO0FBQ2Ys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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQ0FBaUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxxQ0FBcUM7QUFDbEQsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsc0JBQXNCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQix5REFBeUQ7QUFDeEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIseURBQXlEO0FBQ25GOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsS0FBSztBQUNsQixhQUFhLE9BQU87QUFDcEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZixhQUFhLEVBQUU7QUFDZixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsb0JBQW9CO0FBQ2pDLGFBQWEsWUFBWTtBQUN6QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQix3REFBd0Q7QUFDdkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0RBQXdEO0FBQy9FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUF3RDtBQUN4Rjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhLE9BQU87QUFDcEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQixhQUFhLFlBQVk7QUFDekIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpQkFBaUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLElBQUk7SUFDSixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1B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QVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLEtBQUs7SUFDTCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixXQUFXO0lBQ1gsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVB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Ozs7QUNBQSx1RCIsImZpbGUiOiJzdXJ2ZXkuYW5hbHl0aWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicGxvdGx5LmpzLWRpc3QtbWluXCIpLCByZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJ3b3JkY2xvdWRcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlBbmFseXRpY3NcIiwgW1wicGxvdGx5LmpzLWRpc3QtbWluXCIsIFwic3VydmV5LWNvcmVcIiwgXCJ3b3JkY2xvdWRcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5QW5hbHl0aWNzXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicGxvdGx5LmpzLWRpc3QtbWluXCIpLCByZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJ3b3JkY2xvdWRcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleUFuYWx5dGljc1wiXSA9IGZhY3Rvcnkocm9vdFtcIlBsb3RseVwiXSwgcm9vdFtcIlN1cnZleVwiXSwgcm9vdFtcIldvcmRDbG91ZFwiXSk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2NvcmVfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV93b3JkY2xvdWRfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2VudHJpZXMvc3VtbWFyeS50c1wiKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHN0eWxlPVxcXCJkaXNwbGF5Om5vbmU7XFxcIj48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kZXRhaWxcXFwiPjxjaXJjbGUgY3g9XFxcIjEuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCI4LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kcmFnXFxcIj48cGF0aCBkPVxcXCJNMTMgNWwtMSAxIDEgMUg5VjNsMSAxIDEtMS0zLTMtMyAzIDEgMSAxLTF2NEgzbDEtMS0xLTEtMyAzIDMgMyAxLTEtMS0xaDR2NGwtMS0xLTEgMSAzIDMgMy0zLTEtMS0xIDFWOWg0bC0xIDEgMSAxIDMtM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1oaWRlXFxcIj48cGF0aCBkPVxcXCJNMTIuNzkgNC4yTDE2IDFsLTEtMS0zLjMyIDMuMzJDMTAuNTcgMi41NSA5LjMyIDIgOCAyIDMuNjMgMiAwIDcuOTcgMCA3Ljk3czEuMjcgMi4xIDMuMjEgMy44MmwtMy4yMyAzLjIzLjk4Ljk4IDMuMzUtMy4zNEM1LjQxIDEzLjQ0IDYuNjcgMTQgOCAxNGM0LjM3IDAgOC02IDgtNnMtMS4yNy0yLjA5LTMuMjEtMy44ek0yIDcuOTdjMS4wNy0xLjQ3IDMuNjEtNCA2LTQgLjggMCAxLjYuMjcgMi4zNS42OGwtLjc4Ljc4Yy0uNDYtLjI5LS45OS0uNDYtMS41Ny0uNDYtMS42NiAwLTMgMS4zNC0zIDMgMCAuNTguMTcgMS4xMS40NiAxLjU3bC0uOTcuOTdBMTMuMzggMTMuMzggMCAwIDEgMiA3Ljk3em02IDRjLS44IDAtMS41OS0uMjctMi4zMy0uNjdsLjc4LS43N2MuNDUuMjcuOTguNDQgMS41NS40NCAxLjY2IDAgMy0xLjM0IDMtMyAwLS41Ny0uMTctMS4wOS0uNDQtMS41NWwuOTgtLjk4YzEuMTEuODcgMi4wMSAxLjkxIDIuNDYgMi41Mi0xLjA3IDEuNDgtMy42MSA0LjAxLTYgNC4wMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHJpdmF0ZVxcXCI+PGNpcmNsZSBjeD1cXFwiOFxcXCIgY3k9XFxcIjRcXFwiIHI9XFxcIjNcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk04IDhjLTMuMzEgMC02IDIuNzMtNiA0LjY3UzUuMjcgMTUgOCAxNXM2LS40IDYtMi4zM1MxMS4zMSA4IDggOHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHVibGljXFxcIj48Y2lyY2xlIGN4PVxcXCI2XFxcIiBjeT1cXFwiNVxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEwIDVjMCAuMzQtLjA2LjY3LS4xNC45OS4wNSAwIC4wOS4wMS4xNC4wMSAxLjY2IDAgMy0xLjM0IDMtM3MtMS4zNC0zLTMtM0M4Ljk3IDAgOC4wNy41MiA3LjUzIDEuMyA4Ljk4IDEuOTEgMTAgMy4zMyAxMCA1ek02IDljLTMuMzEgMC02IDIuNzMtNiA0LjY3UzMuMjcgMTYgNiAxNnM2LS40IDYtMi4zM1M5LjMxIDkgNiA5ek0xMCA3Yy0uMTkgMC0uMzguMDEtLjU3LjAzYTQuMTQgNC4xNCAwIDAgMS0xLjM3IDEuMzljMyAuODMgNS4yMyAzLjMxIDUuNDIgNS4yOCAxLjQ0LS4zMSAyLjUyLS45MiAyLjUyLTIuMDNDMTYgOS43NCAxMy4zMSA3IDEwIDd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbW92ZXRvZGV0YWlsc1xcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiMTQuNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjEzLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk0xMiAxaDN2OWgtM3pNMi4wMiA3LjAyTDEgNiAwIDdsMyAzIDMtMy0xLTEtLjk0Ljk0QzQuMzMgNC43MyA2LjIxIDMgOC41IDNjLjE3IDAgLjMzLjAzLjUuMDVWMS4wM0M4LjgzIDEuMDEgOC42NyAxIDguNSAxIDUuMDggMSAyLjI3IDMuNjYgMi4wMiA3LjAyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW5vbmNvbW1lcmNpYWxcXFwiPjxwYXRoIGQ9XFxcIk04IDBMMCAxNWgxNkw4IDB6bTEgMTNIN3YtMmgydjJ6bS0yLTNWNWgydjVIN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1zb3J0aW5nXFxcIj48cGF0aCBkPVxcXCJNOCAzbDIgMiAxLTEtMy0zLTMgMyAxIDF6TTggMTNsLTItMi0xIDEgMyAzIDMtMy0xLTF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PC9zdmc+XCI7IiwiLyoqXG4qIE11dXJpIHYwLjguMFxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmlcbiogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEhhbHR1IE95XG4qIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmkvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgUGFja2VyXG4qIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgVGlja2VyIC8gTXV1cmkgRW1pdHRlciAvIE11dXJpIFF1ZXVlXG4qIENvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbiovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTXV1cmkgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbmFtZXNwYWNlID0gJ011dXJpJztcbiAgdmFyIGdyaWRJbnN0YW5jZXMgPSB7fTtcblxuICB2YXIgYWN0aW9uU3dhcCA9ICdzd2FwJztcbiAgdmFyIGFjdGlvbk1vdmUgPSAnbW92ZSc7XG5cbiAgdmFyIGV2ZW50U3luY2hyb25pemUgPSAnc3luY2hyb25pemUnO1xuICB2YXIgZXZlbnRMYXlvdXRTdGFydCA9ICdsYXlvdXRTdGFydCc7XG4gIHZhciBldmVudExheW91dEVuZCA9ICdsYXlvdXRFbmQnO1xuICB2YXIgZXZlbnRBZGQgPSAnYWRkJztcbiAgdmFyIGV2ZW50UmVtb3ZlID0gJ3JlbW92ZSc7XG4gIHZhciBldmVudFNob3dTdGFydCA9ICdzaG93U3RhcnQnO1xuICB2YXIgZXZlbnRTaG93RW5kID0gJ3Nob3dFbmQnO1xuICB2YXIgZXZlbnRIaWRlU3RhcnQgPSAnaGlkZVN0YXJ0JztcbiAgdmFyIGV2ZW50SGlkZUVuZCA9ICdoaWRlRW5kJztcbiAgdmFyIGV2ZW50RmlsdGVyID0gJ2ZpbHRlcic7XG4gIHZhciBldmVudFNvcnQgPSAnc29ydCc7XG4gIHZhciBldmVudE1vdmUgPSAnbW92ZSc7XG4gIHZhciBldmVudFNlbmQgPSAnc2VuZCc7XG4gIHZhciBldmVudEJlZm9yZVNlbmQgPSAnYmVmb3JlU2VuZCc7XG4gIHZhciBldmVudFJlY2VpdmUgPSAncmVjZWl2ZSc7XG4gIHZhciBldmVudEJlZm9yZVJlY2VpdmUgPSAnYmVmb3JlUmVjZWl2ZSc7XG4gIHZhciBldmVudERyYWdJbml0ID0gJ2RyYWdJbml0JztcbiAgdmFyIGV2ZW50RHJhZ1N0YXJ0ID0gJ2RyYWdTdGFydCc7XG4gIHZhciBldmVudERyYWdNb3ZlID0gJ2RyYWdNb3ZlJztcbiAgdmFyIGV2ZW50RHJhZ1Njcm9sbCA9ICdkcmFnU2Nyb2xsJztcbiAgdmFyIGV2ZW50RHJhZ0VuZCA9ICdkcmFnRW5kJztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VTdGFydCA9ICdkcmFnUmVsZWFzZVN0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VFbmQgPSAnZHJhZ1JlbGVhc2VFbmQnO1xuICB2YXIgZXZlbnREZXN0cm95ID0gJ2Rlc3Ryb3knO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVyIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgcXVldWUgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XSA9IFtdO1xuXG4gICAgLy8gQWRkIHRoZSBsaXN0ZW5lciB0byB0aGUgcXVldWUuXG4gICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBhbGwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2xpc3RlbmVyXVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBHZXQgbGlzdGVuZXJzIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm9uZSBpcyBmb3VuZC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBJZiBubyBzcGVjaWZpYyBsaXN0ZW5lciBpcyBwcm92aWRlZCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzLlxuICAgIHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhbGwgbGlzdGVuZXJzIGluIGEgc3BlY2lmaWVkIGV2ZW50IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Kn0gW2FyZzFdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzJdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBldmVudCBsaXN0ZW5lcnMgYW5kIHF1aXQgZWFybHkgaWYgdGhlcmUncyBubyBsaXN0ZW5lcnMuXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHFMZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGFMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB2YXIgaTtcblxuICAgIC8vIEFkZCB0aGUgY3VycmVudCBsaXN0ZW5lcnMgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIG9mIHRoZSBsaXN0ZW5lcnMgYXJlIGNhbGxlZCBpblxuICAgIC8vIGNvcnJlY3Qgb3JkZXIgZXZlbiBpZiBuZXcgZXZlbnQgbGlzdGVuZXJzIGFyZSByZW1vdmVkL2FkZGVkIGR1cmluZ1xuICAgIC8vIHByb2Nlc3NpbmcgYW5kL29yIGV2ZW50cyBhcmUgZW1pdHRlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gSW5jcmVtZW50IHF1ZXVlIGNvdW50ZXIuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc2NlbmFyaW9zIHdoZXJlIGVtaXQgaXNcbiAgICAvLyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mXG4gICAgLy8gaG93IG1hbnkgXCJxdWV1ZSBwcm9jZXNzb3JzXCIgdGhlcmUgYXJlIGFjdGl2ZSBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVzZXRcbiAgICAvLyB0aGUgcXVldWUgaW4gdGhlIGVuZCB3aGVuIHRoZSBsYXN0IHF1ZXVlIHByb2Nlc3NvciBpcyBmaW5pc2hlZC5cbiAgICArK3RoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBxdWV1ZSAodGhlIHNwZWNpZmljIHBhcnQgb2YgaXQgZm9yIHRoaXMgZW1pdCkuXG4gICAgZm9yIChpID0gcUxlbmd0aCwgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDsgaSA8IHFMZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICBhTGVuZ3RoID09PSAwID8gcXVldWVbaV0oKSA6XG4gICAgICBhTGVuZ3RoID09PSAxID8gcXVldWVbaV0oYXJnMSkgOlxuICAgICAgYUxlbmd0aCA9PT0gMiA/IHF1ZXVlW2ldKGFyZzEsIGFyZzIpIDpcbiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZVtpXShhcmcxLCBhcmcyLCBhcmczKTtcblxuICAgICAgLy8gU3RvcCBwcm9jZXNzaW5nIGlmIHRoZSBlbWl0dGVyIGlzIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRGVjcmVtZW50IHF1ZXVlIHByb2Nlc3MgY291bnRlci5cbiAgICAtLXRoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBSZXNldCB0aGUgcXVldWUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcXVldWUgcHJvY2Vzc2VzIHJ1bm5pbmcuXG4gICAgaWYgKCF0aGlzLl9jb3VudGVyKSBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZW1pdHRlciBpbnN0YW5jZS4gQmFzaWNhbGx5IGp1c3QgcmVtb3ZlcyBhbGwgYm91bmQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICB2YXIgZXZlbnQ7XG5cbiAgICAvLyBGbGFnIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCBxdWV1ZSAoaWYgcXVldWUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgdGhpcyB3aWxsIGFsc28gc3RvcCB0aGF0KS5cbiAgICB0aGlzLl9xdWV1ZS5sZW5ndGggPSB0aGlzLl9jb3VudGVyID0gMDtcblxuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoZXZlbnQgaW4gZXZlbnRzKSB7XG4gICAgICBpZiAoZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICBldmVudHNbZXZlbnRdLmxlbmd0aCA9IDA7XG4gICAgICAgIGV2ZW50c1tldmVudF0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU2V0IHVwIHRoZSBkZWZhdWx0IGV4cG9ydCB2YWx1ZXMuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtUHJvcCA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8vIEZpbmQgdGhlIHN1cHBvcnRlZCB0cmFuc2Zvcm0gcHJvcCBhbmQgc3R5bGUgbmFtZXMuXG4gIHZhciBkb2NFbGVtU3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICB2YXIgc3R5bGUgPSAndHJhbnNmb3JtJztcbiAgdmFyIHN0eWxlQ2FwID0gJ1RyYW5zZm9ybSc7XG4gIHZhciBmb3VuZCA9IGZhbHNlO1xuICBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXS5mb3JFYWNoKGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIHZhciBwcm9wTmFtZSA9IHByZWZpeCA/IHByZWZpeCArIHN0eWxlQ2FwIDogc3R5bGU7XG4gICAgaWYgKGRvY0VsZW1TdHlsZVtwcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gcHJlZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICB0cmFuc2Zvcm1TdHlsZSA9IHByZWZpeCA/ICctJyArIHByZWZpeCArICctJyArIHN0eWxlIDogc3R5bGU7XG4gICAgICB0cmFuc2Zvcm1Qcm9wID0gcHJvcE5hbWU7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICB2YXIgc3R5bGVzQ2FjaGUgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBXZWFrTWFwKCkgOiBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZShlbGVtZW50LCBzdHlsZSkge1xuICAgIHZhciBzdHlsZXMgPSBzdHlsZXNDYWNoZSAmJiBzdHlsZXNDYWNoZS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgaWYgKHN0eWxlc0NhY2hlKSBzdHlsZXNDYWNoZS5zZXQoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVN0eWxlIDogc3R5bGUpO1xuICB9XG5cbiAgdmFyIHN0eWxlTmFtZVJlZ0V4ID0gLyhbQS1aXSkvZztcblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3R5bGUgcHJvcGVydHkgdG8ga2ViYWIgY2FzZSBzdHlsZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3R5bGVOYW1lKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShzdHlsZU5hbWVSZWdFeCwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgc3RyRnVuY3Rpb24gPSAnZnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gc3RyRnVuY3Rpb247XG4gIH1cblxuICB2YXIgdHJhbnNmb3JtU3R5bGUkMSA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8qKlxuICAgKiBTZXQgaW5saW5lIHN0eWxlcyB0byBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZXNcbiAgICovXG4gIGZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wID09PSB0cmFuc2Zvcm1TdHlsZSQxID8gdHJhbnNmb3JtUHJvcCA6IHByb3BdID0gc3R5bGVzW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVtIGFuaW1hdGlvbiBoYW5kbGVyIHBvd2VyZWQgYnkgV2ViIEFuaW1hdGlvbnMgQVBJLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUFuaW1hdGUoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IG51bGw7XG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fa2V5ZnJhbWVzID0gW107XG4gICAgdGhpcy5fb3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fb25GaW5pc2ggPSB0aGlzLl9vbkZpbmlzaC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGluc3RhbmNlJ3MgYW5pbWF0aW9uLiBBdXRvbWF0aWNhbGx5IHN0b3BzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzXG4gICAqIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNGcm9tXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1RvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVhc2luZz0nZWFzZSddXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ocHJvcHNGcm9tLCBwcm9wc1RvLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0aW9uO1xuICAgIHZhciBjdXJyZW50UHJvcHMgPSB0aGlzLl9wcm9wcztcbiAgICB2YXIgY3VycmVudFZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uID0gZmFsc2U7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGFuaW1hdGlvbiBydW5uaW5nLCBsZXQncyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZVxuICAgIC8vIGNhbmNlbGxlZCBvciBpZiBpdCBjYW4gY29udGludWUgcnVubmluZy5cbiAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICB2YXIgcHJvcENvdW50ID0gMDtcbiAgICAgIHZhciBwcm9wSW5kZXg7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIG1hdGNoIHdpdGggdGhlXG4gICAgICAvLyBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICAgICsrcHJvcENvdW50O1xuICAgICAgICBwcm9wSW5kZXggPSBjdXJyZW50UHJvcHMuaW5kZXhPZihwcm9wTmFtZSk7XG4gICAgICAgIGlmIChwcm9wSW5kZXggPT09IC0xIHx8IHByb3BzVG9bcHJvcE5hbWVdICE9PSBjdXJyZW50VmFsdWVzW3Byb3BJbmRleF0pIHtcbiAgICAgICAgICBjYW5jZWxBbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcHJvcHMgY291bnQgbWF0Y2hlcyBjdXJyZW50IHByb3BzIGNvdW50LiBUaGlzIGlzXG4gICAgICAvLyBuZWVkZWQgZm9yIHRoZSBlZGdlIGNhc2Ugc2NlbmFyaW8gd2hlcmUgdGFyZ2V0IHByb3BzIGNvbnRhaW4gdGhlIHNhbWVcbiAgICAgIC8vIHN0eWxlcyBhcyBjdXJyZW50IHByb3BzLCBidXQgdGhlIGN1cnJlbnQgcHJvcHMgaGF2ZSBzb21lIGFkZGl0aW9uYWxcbiAgICAgIC8vIHByb3BzLlxuICAgICAgaWYgKCFjYW5jZWxBbmltYXRpb24gJiYgcHJvcENvdW50ICE9PSBjdXJyZW50UHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIGFuaW1hdGlvbiAoaWYgcmVxdWlyZWQpLlxuICAgIGlmIChjYW5jZWxBbmltYXRpb24pIGFuaW1hdGlvbi5jYW5jZWwoKTtcblxuICAgIC8vIFN0b3JlIGFuaW1hdGlvbiBjYWxsYmFjay5cbiAgICB0aGlzLl9jYWxsYmFjayA9IGlzRnVuY3Rpb24ob3B0cy5vbkZpbmlzaCkgPyBvcHRzLm9uRmluaXNoIDogbnVsbDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBydW5uaW5nIGFuaW1hdGlvbiB0aGF0IGRvZXMgbm90IG5lZWQgdG8gYmUgY2FuY2VsbGVkLCBsZXQnc1xuICAgIC8vIGNhbGwgaXQgYSBkYXkgaGVyZSBhbmQgbGV0IGl0IHJ1bi5cbiAgICBpZiAoYW5pbWF0aW9uICYmICFjYW5jZWxBbmltYXRpb24pIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIHRvIGluc3RhbmNlLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICBjdXJyZW50UHJvcHMucHVzaChwcm9wTmFtZSk7XG4gICAgICBjdXJyZW50VmFsdWVzLnB1c2gocHJvcHNUb1twcm9wTmFtZV0pO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBrZXlmcmFtZXMuXG4gICAgdmFyIGFuaW1LZXlmcmFtZXMgPSB0aGlzLl9rZXlmcmFtZXM7XG4gICAgYW5pbUtleWZyYW1lc1swXSA9IHByb3BzRnJvbTtcbiAgICBhbmltS2V5ZnJhbWVzWzFdID0gcHJvcHNUbztcblxuICAgIC8vIFNldCB1cCBvcHRpb25zLlxuICAgIHZhciBhbmltT3B0aW9ucyA9IHRoaXMuX29wdGlvbnM7XG4gICAgYW5pbU9wdGlvbnMuZHVyYXRpb24gPSBvcHRzLmR1cmF0aW9uIHx8IDMwMDtcbiAgICBhbmltT3B0aW9ucy5lYXNpbmcgPSBvcHRzLmVhc2luZyB8fCAnZWFzZSc7XG5cbiAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGFuaW1hdGlvbiA9IGVsZW1lbnQuYW5pbWF0ZShhbmltS2V5ZnJhbWVzLCBhbmltT3B0aW9ucyk7XG4gICAgYW5pbWF0aW9uLm9uZmluaXNoID0gdGhpcy5fb25GaW5pc2g7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gYW5pbWF0aW9uO1xuXG4gICAgLy8gU2V0IHRoZSBlbmQgc3R5bGVzLiBUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgZWxlbWVudCBzdGF5cyBhdCB0aGUgZW5kXG4gICAgLy8gdmFsdWVzIGFmdGVyIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAgICBzZXRTdHlsZXMoZWxlbWVudCwgcHJvcHNUbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaW5zdGFuY2UncyBjdXJyZW50IGFuaW1hdGlvbiBpZiBydW5uaW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZXNdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fYW5pbWF0aW9uKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgcHJvcFZhbHVlO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIChpZiBub3QgcHJvdmlkZWQpIGFuZCBzZXQgc3R5bGVzLlxuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudFByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb3BOYW1lID0gY3VycmVudFByb3BzW2ldO1xuICAgICAgICBwcm9wVmFsdWUgPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcE5hbWUpKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wTmFtZSA9PT0gJ3RyYW5zZm9ybScgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyAgQ2FuY2VsIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcyBhbmQgdmFsdWVzLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBpdGVtIGlzIGJlaW5nIGFuaW1hdGVkIGN1cnJlbnRseS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuaXNBbmltYXRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9hbmltYXRpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fb3B0aW9ucyA9IHRoaXMuX2tleWZyYW1lcyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFuaW1hdGlvbiBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrO1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IHRoaXMuX2NhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9wcm9wcy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICB9O1xuXG4gIHZhciB2ZW5kb3JQcmVmaXhlcyA9IFsnJywgJ3dlYmtpdCcsICdtb3onLCAnbXMnLCAnbycsICdXZWJraXQnLCAnTW96JywgJ01TJywgJ08nXTtcblxuICAvKipcbiAgICogR2V0IHByZWZpeGVkIENTUyBwcm9wZXJ0eSBuYW1lIHdoZW4gZ2l2ZW4gYSBub24tcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtU3R5bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICAqIEByZXR1cm5zIHshU3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtU3R5bGUsIHByb3BOYW1lKSB7XG4gICAgdmFyIGNhbWVsUHJvcE5hbWUgPSBwcm9wTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcE5hbWUuc2xpY2UoMSk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwcmVmaXg7XG4gICAgdmFyIHByZWZpeGVkUHJvcE5hbWU7XG5cbiAgICB3aGlsZSAoaSA8IHZlbmRvclByZWZpeGVzLmxlbmd0aCkge1xuICAgICAgcHJlZml4ID0gdmVuZG9yUHJlZml4ZXNbaV07XG4gICAgICBwcmVmaXhlZFByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgY2FtZWxQcm9wTmFtZSA6IHByb3BOYW1lO1xuICAgICAgaWYgKHByZWZpeGVkUHJvcE5hbWUgaW4gZWxlbVN0eWxlKSByZXR1cm4gcHJlZml4ZWRQcm9wTmFtZTtcbiAgICAgICsraTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBkdCA9IDEwMDAgLyA2MDtcblxuICB2YXIgcmFmID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhkdCk7XG4gICAgICB9LCBkdCk7XG4gICAgfVxuICApLmJpbmQod2luZG93KTtcblxuICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgcGFzc2l2ZSBldmVudHM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gIHZhciBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgcGFzc2l2ZU9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgcGFzc2l2ZU9wdHMpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIC8vIERyYWdnZXIgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnc3RhcnQnLFxuICAgIG1vdmU6ICdtb3ZlJyxcbiAgICBlbmQ6ICdlbmQnLFxuICAgIGNhbmNlbDogJ2NhbmNlbCdcbiAgfTtcblxuICB2YXIgaGFzVG91Y2hFdmVudHMgPSAhISgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgd2luZG93LlRvdWNoRXZlbnQpO1xuICB2YXIgaGFzUG9pbnRlckV2ZW50cyA9ICEhd2luZG93LlBvaW50ZXJFdmVudDtcbiAgdmFyIGhhc01zUG9pbnRlckV2ZW50cyA9ICEhd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkO1xuICB2YXIgaXNBbmRyb2lkID0gLyhhbmRyb2lkKS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB2YXIgbGlzdGVuZXJPcHRpb25zID0gaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID8geyBwYXNzaXZlOiB0cnVlIH0gOiBmYWxzZTtcblxuICB2YXIgdGFQcm9wID0gJ3RvdWNoQWN0aW9uJztcbiAgdmFyIHRhUHJvcFByZWZpeGVkID0gZ2V0UHJlZml4ZWRQcm9wTmFtZSh3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLCB0YVByb3ApO1xuICB2YXIgdGFEZWZhdWx0VmFsdWUgPSAnYXV0byc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRHJhZ2dlciBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2Nzc1Byb3BzXVxuICAgKi9cbiAgZnVuY3Rpb24gRHJhZ2dlcihlbGVtZW50LCBjc3NQcm9wcykge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3NzUHJvcHMgPSB7fTtcbiAgICB0aGlzLl90b3VjaEFjdGlvbiA9ICcnO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUgPSB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblN0YXJ0ID0gdGhpcy5fb25TdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTW92ZSA9IHRoaXMuX29uTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQ2FuY2VsID0gdGhpcy5fb25DYW5jZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkVuZCA9IHRoaXMuX29uRW5kLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBcHBseSBpbml0aWFsIGNzcyBwcm9wcy5cbiAgICB0aGlzLnNldENzc1Byb3BzKGNzc1Byb3BzKTtcblxuICAgIC8vIElmIHRvdWNoIGFjdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdpdGggaW5pdGlhbCBjc3MgcHJvcHMgbGV0J3MgYXNzdW1lIGl0J3NcbiAgICAvLyBhdXRvLlxuICAgIGlmICghdGhpcy5fdG91Y2hBY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24odGFEZWZhdWx0VmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgbmF0aXZlIGxpbmsvaW1hZ2UgZHJhZ2dpbmcgZm9yIHRoZSBpdGVtIGFuZCBpdCdzIGFuY2VzdG9ycy5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gc3RhcnQgZXZlbnQuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX2V2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcblxuICAgIC8vIElmIHdlIGhhdmUgdG91Y2ggZXZlbnRzLCBidXQgbm8gcG9pbnRlciBldmVudHMgd2UgbmVlZCB0byBhbHNvIGxpc3RlbiBmb3JcbiAgICAvLyBtb3VzZSBldmVudHMgaW4gYWRkaXRpb24gdG8gdG91Y2ggZXZlbnRzIGZvciBkZXZpY2VzIHdoaWNoIHN1cHBvcnQgYm90aFxuICAgIC8vIG1vdXNlIGFuZCB0b3VjaCBpbnRlcmFjdGlvbi5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgIWhhc1BvaW50ZXJFdmVudHMgJiYgIWhhc01zUG9pbnRlckV2ZW50cykge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAncG9pbnRlcmRvd24nLFxuICAgIG1vdmU6ICdwb2ludGVybW92ZScsXG4gICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgZW5kOiAncG9pbnRlcnVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX21zUG9pbnRlckV2ZW50cyA9IHtcbiAgICBzdGFydDogJ01TUG9pbnRlckRvd24nLFxuICAgIG1vdmU6ICdNU1BvaW50ZXJNb3ZlJyxcbiAgICBjYW5jZWw6ICdNU1BvaW50ZXJDYW5jZWwnLFxuICAgIGVuZDogJ01TUG9pbnRlclVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX3RvdWNoRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAndG91Y2hzdGFydCcsXG4gICAgbW92ZTogJ3RvdWNobW92ZScsXG4gICAgY2FuY2VsOiAndG91Y2hjYW5jZWwnLFxuICAgIGVuZDogJ3RvdWNoZW5kJ1xuICB9O1xuXG4gIERyYWdnZXIuX21vdXNlRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICBtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBjYW5jZWw6ICcnLFxuICAgIGVuZDogJ21vdXNldXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fZXZlbnRzID0gKGZ1bmN0aW9uKCkge1xuICAgIGlmIChoYXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fcG9pbnRlckV2ZW50cztcbiAgICBpZiAoaGFzTXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNUb3VjaEV2ZW50cykgcmV0dXJuIERyYWdnZXIuX3RvdWNoRXZlbnRzO1xuICAgIHJldHVybiBEcmFnZ2VyLl9tb3VzZUV2ZW50cztcbiAgfSkoKTtcblxuICBEcmFnZ2VyLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMgPSBbXTtcblxuICAvKipcbiAgICogUHJvdGVjdGVkIHN0YXRpYyBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmNhbmNlbGFibGUgIT09IGZhbHNlKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm47XG5cbiAgICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMubW92ZSwgaW5zdGFuY2UuX29uTW92ZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub24oZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmIChEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9mZihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5lbmQsIGluc3RhbmNlLl9vbkVuZCk7XG5cbiAgICBpZiAoIURyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgIERyYWdnZXIuX3VuYmluZExpc3RlbmVycygpO1xuICAgIH1cbiAgfTtcblxuICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0RXZlbnRQb2ludGVySWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIElmIHdlIGhhdmUgcG9pbnRlciBpZCBhdmFpbGFibGUgbGV0J3MgdXNlIGl0LlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGdldCB0aGUgZmlyc3QgY2hhbmdlZCB0b3VjaCdzIGlkZW50aWZpZXIuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbW91c2Uvb3RoZXIgZXZlbnRzIGxldCdzIHByb3ZpZGUgYSBzdGF0aWMgaWQuXG4gICAgcmV0dXJuIDE7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0VG91Y2hCeUlkID0gZnVuY3Rpb24oZXZlbnQsIGlkKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHBvaW50ZXIgZXZlbnQgcmV0dXJuIHRoZSB3aG9sZSBldmVudCBpZiB0aGVyZSdzIGEgbWF0Y2gsIGFuZFxuICAgIC8vIG51bGwgb3RoZXJ3aXNlLlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZCA9PT0gaWQgPyBldmVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRvdWNoIGV2ZW50cyBsZXQncyBjaGVjayBpZiB0aGVyZSdzIGEgY2hhbmdlZCB0b3VjaCBvYmplY3QgdGhhdCBtYXRjaGVzXG4gICAgLy8gdGhlIHBvaW50ZXJJZCBpbiB3aGljaCBjYXNlIHJldHVybiB0aGUgdG91Y2ggb2JqZWN0LlxuICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllciA9PT0gaWQpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgYXNzdW1lIHRoZXJlJ3Mgb25seSBvbmUgcG9pbnRlciBhbmQganVzdFxuICAgIC8vIHJldHVybiB0aGUgZXZlbnQuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9O1xuXG4gIERyYWdnZXIuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuY2FuY2VsLCBlKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLmVuZCwgZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVzZXQgY3VycmVudCBkcmFnIG9wZXJhdGlvbiAoaWYgYW55KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLl9zdGFydFggPSAwO1xuICAgIHRoaXMuX3N0YXJ0WSA9IDA7XG4gICAgdGhpcy5fY3VycmVudFggPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gMDtcbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgbGlzdGVuZXJPcHRpb25zXG4gICAgKTtcblxuICAgIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgY3VzdG9tIGRyYWdnZXIgZXZlbnQgZnJvbSBhIHJhdyBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqIEByZXR1cm5zIHtEcmFnZ2VyRXZlbnR9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fY3JlYXRlRXZlbnQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdmFyIHRvdWNoID0gdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBIYW1tZXIuanMgY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UuXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgc3JjRXZlbnQ6IGUsXG4gICAgICBkaXN0YW5jZTogdGhpcy5nZXREaXN0YW5jZSgpLFxuICAgICAgZGVsdGFYOiB0aGlzLmdldERlbHRhWCgpLFxuICAgICAgZGVsdGFZOiB0aGlzLmdldERlbHRhWSgpLFxuICAgICAgZGVsdGFUaW1lOiB0eXBlID09PSBldmVudHMuc3RhcnQgPyAwIDogdGhpcy5nZXREZWx0YVRpbWUoKSxcbiAgICAgIGlzRmlyc3Q6IHR5cGUgPT09IGV2ZW50cy5zdGFydCxcbiAgICAgIGlzRmluYWw6IHR5cGUgPT09IGV2ZW50cy5lbmQgfHwgdHlwZSA9PT0gZXZlbnRzLmNhbmNlbCxcbiAgICAgIC8vIFBhcnRpYWwgVG91Y2ggQVBJIGludGVyZmFjZS5cbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX3BvaW50ZXJJZCxcbiAgICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgICBwYWdlWTogdG91Y2gucGFnZVksXG4gICAgICB0YXJnZXQ6IHRvdWNoLnRhcmdldFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSByYXcgZXZlbnQgYXMgZHJhZ2dlciBldmVudCBpbnRlcm5hbGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24odHlwZSwgZSkge1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCh0eXBlLCB0aGlzLl9jcmVhdGVFdmVudCh0eXBlLCBlKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwcm92aWRlZCBldmVudCBpcyBhIFBvaW50ZXJFdmVudCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBpdCBpZiBpdCBoYXNcbiAgICogdGhlIHNhbWUgcG9pbnRlcklkIGFzIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgVG91Y2hFdmVudFxuICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBsb29rIGZvciBhIFRvdWNoIGluc3RhbmNlIGluIHRoZSBjaGFuZ2VkVG91Y2hlcyB0aGF0XG4gICAqIGhhcyBhbiBpZGVudGlmaWVyIG1hdGNoaW5nIHRoaXMgaW5zdGFuY2UncyBwb2ludGVySWQuIElmIHRoZSBwcm92aWRlZCBldmVudFxuICAgKiBpcyBhIE1vdXNlRXZlbnQgKG9yIGp1c3QgYW55IG90aGVyIGV2ZW50IHRoYW4gUG9pbnRlckV2ZW50IG9yIFRvdWNoRXZlbnQpXG4gICAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX1cbiAgICogQHJldHVybnMgez8oVG91Y2h8UG9pbnRlckV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2dldFRyYWNrZWRUb3VjaCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIERyYWdnZXIuX2dldFRvdWNoQnlJZChlLCB0aGlzLl9wb2ludGVySWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQSBwcmUtaGFuZGxlciBmb3Igc3RhcnQgZXZlbnQgdGhhdCBjaGVja3MgaWYgd2UgY2FuIHN0YXJ0IGRyYWdnaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBiZWluZyBkcmFnZ2VkIGN1cnJlbnRseS5cbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKCkpIHJldHVybjtcblxuICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAvLyBzdGFydGluZyBpZiBuYXRpdmUgc2Nyb2xsaW5nIGlzIGluIHByb2dyZXNzLiBQYXJ0IDEuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgbGVmdCBidXR0b24gaXMgcHJlc3NlZCBvbiBtb3VzZS5cbiAgICBpZiAoZS5idXR0b24pIHJldHVybjtcblxuICAgIC8vIEdldCAoYW5kIHNldCkgcG9pbnRlciBpZC5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZChlKTtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSB0aGUgc3RhcnQgZXZlbnQgYW5kIHRyaWdnZXIgc3RhcnQgKGFzeW5jIG9yIHN5bmMpLiBQb2ludGVyIGV2ZW50c1xuICAgIC8vIGFyZSBlbWl0dGVkIGJlZm9yZSB0b3VjaCBldmVudHMgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgYm90aCBvZiB0aGVtLiBBbmRcbiAgICAvLyBpZiB5b3UgdHJ5IHRvIG1vdmUgYW4gZWxlbWVudCBiZWZvcmUgYHRvdWNoc3RhcnRgIGlzIGVtaXR0ZWQgdGhlIHBvaW50ZXJcbiAgICAvLyBldmVudHMgZm9yIHRoYXQgZWxlbWVudCB3aWxsIGJlIGNhbmNlbGVkLiBUaGUgZml4IGlzIHRvIGRlbGF5IHRoZSBlbWl0dGVkXG4gICAgLy8gcG9pbnRlciBldmVudHMgaW4gc3VjaCBhIHNjZW5hcmlvIGJ5IG9uZSBmcmFtZSBzbyB0aGF0IGB0b3VjaHN0YXJ0YCBoYXNcbiAgICAvLyB0aW1lIHRvIGJlIGVtaXR0ZWQgYmVmb3JlIHRoZSBlbGVtZW50IGlzIChwb3RlbnRpYWxseSkgbW92ZWQuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IGU7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzICYmIChoYXNQb2ludGVyRXZlbnRzIHx8IGhhc01zUG9pbnRlckV2ZW50cykpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMi5cbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJhZih0aGlzLl9vblN0YXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25TdGFydCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWJvcnQgc3RhcnQgZXZlbnQgaWYgaXQgdHVybnMgb3V0IHRvIGJlIG5vbi1jYW5jZWxhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9hYm9ydE5vbkNhbmNlbGFibGUgPSBmdW5jdGlvbihlKSB7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX3N0YXJ0RXZlbnQgJiYgZS5jYW5jZWxhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIGRyYWcgcHJvY2VkdXJlIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGUgPSB0aGlzLl9zdGFydEV2ZW50O1xuICAgIGlmICghZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgLy8gU2V0IHVwIGluaXQgZGF0YSBhbmQgZW1pdCBzdGFydCBldmVudC5cbiAgICB0aGlzLl9zdGFydFggPSB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fc3RhcnRZID0gdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZW1pdChldmVudHMuc3RhcnQsIGUpO1xuICAgIERyYWdnZXIuX2FjdGl2YXRlSW5zdGFuY2UodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIG1vdmUgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5tb3ZlLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBjYW5jZWwgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICghdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpKSByZXR1cm47XG5cbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGVuZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25FbmQgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmVuZCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYmVpbmcgZHJhZ2dlZCBhdCB0aGUgbW9tZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRlcklkICE9PSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgZWxlbWVudCdzIHRvdWNoLWFjdGlvbiBDU1MgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuc2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIC8vIFN0b3JlIHVubW9kaWZpZWQgdG91Y2ggYWN0aW9uIHZhbHVlICh3ZSB0cnVzdCB1c2VyIGlucHV0IGhlcmUpLlxuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gdmFsdWU7XG5cbiAgICAvLyBTZXQgdG91Y2gtYWN0aW9uIHN0eWxlLlxuICAgIGlmICh0YVByb3BQcmVmaXhlZCkge1xuICAgICAgdGhpcy5fY3NzUHJvcHNbdGFQcm9wUHJlZml4ZWRdID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYW4gdW5zdXBwb3J0ZWQgdG91Y2gtYWN0aW9uIHZhbHVlIGxldCdzIGFkZCBhIHNwZWNpYWwgbGlzdGVuZXJcbiAgICAvLyB0aGF0IHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uIG9uIHRvdWNoIHN0YXJ0IGV2ZW50LiBBIGRpcnR5IGhhY2ssIGJ1dCBiZXN0XG4gICAgLy8gd2UgY2FuIGRvIGZvciBub3cuIFRoZSBvdGhlciBvcHRpb25zIHdvdWxkIGJlIHRvIHNvbWVob3cgcG9seWZpbGwgdGhlXG4gICAgLy8gdW5zdXBwb3J0ZWQgdG91Y2ggYWN0aW9uIGJlaGF2aW9yIHdpdGggY3VzdG9tIGhldXJpc3RpY3Mgd2hpY2ggc291bmRzIGxpa2VcbiAgICAvLyBhIGNhbiBvZiB3b3Jtcy5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGVsZW1lbnQncyBDU1MgcHJvcGVydGllcy4gQWNjZXB0cyBhbiBvYmplY3Qgd2l0aCBjYW1lbCBjYXNlZCBzdHlsZVxuICAgKiBwcm9wcyB3aXRoIHZhbHVlIHBhaXJzIGFzIGl0J3MgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbbmV3UHJvcHNdXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRDc3NQcm9wcyA9IGZ1bmN0aW9uKG5ld1Byb3BzKSB7XG4gICAgaWYgKCFuZXdQcm9wcykgcmV0dXJuO1xuXG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX2Nzc1Byb3BzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcHJvcDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcy5cbiAgICBmb3IgKHByb3AgaW4gY3VycmVudFByb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gY3VycmVudFByb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIGN1cnJlbnRQcm9wc1twcm9wXTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbmV3IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBuZXdQcm9wcykge1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWx1ZSBmb3IgdGhlIHByb3AuXG4gICAgICBpZiAoIW5ld1Byb3BzW3Byb3BdKSBjb250aW51ZTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdG91Y2gtYWN0aW9uLlxuICAgICAgaWYgKHByb3AgPT09IHRhUHJvcCkge1xuICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5ld1Byb3BzW3Byb3BdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBwcmVmaXhlZCBwcm9wIGFuZCBza2lwIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgcHJlZml4ZWRQcm9wID0gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtZW50LnN0eWxlLCBwcm9wKTtcbiAgICAgIGlmICghcHJlZml4ZWRQcm9wKSBjb250aW51ZTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHByb3AgYW5kIGFkZCB0aGUgc3R5bGUuXG4gICAgICBjdXJyZW50UHJvcHNbcHJlZml4ZWRQcm9wXSA9ICcnO1xuICAgICAgZWxlbWVudC5zdHlsZVtwcmVmaXhlZFByb3BdID0gbmV3UHJvcHNbcHJvcF07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geC1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gbGVmdCB0byByaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WCAtIHRoaXMuX3N0YXJ0WDtcbiAgfTtcblxuICAvKipcbiAgICogSG93IG11Y2ggdGhlIHBvaW50ZXIgaGFzIG1vdmVkIG9uIHktYXhpcyBmcm9tIHN0YXJ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuXG4gICAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyBtb3ZlbWVudCBmcm9tIHRvcCB0byBib3R0b20uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFkgLSB0aGlzLl9zdGFydFk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBmYXIgKGluIHBpeGVscykgaGFzIHBvaW50ZXIgbW92ZWQgZnJvbSBzdGFydCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERpc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLmdldERlbHRhWCgpO1xuICAgIHZhciB5ID0gdGhpcy5nZXREZWx0YVkoKTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBoYXMgcG9pbnRlciBiZWVuIGRyYWdnZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lID8gRGF0ZS5ub3coKSAtIHRoaXMuX3N0YXJ0VGltZSA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudHMsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCB1bmJpbmQgYWxsIGRyYWcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBldmVudHMgPSBEcmFnZ2VyLl9ldmVudHM7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCBkZWFjdGl2YXRlIHRoZSBpbnN0YW5jZS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gRGVzdHJveSBlbWl0dGVyLlxuICAgIHRoaXMuX2VtaXR0ZXIuZGVzdHJveSgpO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBSZXNldCBzdHlsZXMuXG4gICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLl9jc3NQcm9wcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRhdGEuXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBNYXJrIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgdGlja2VyIHN5c3RlbSBmb3IgaGFuZGxpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMgaW4gYW4gZWZmaWNpZW50IHdheS5cbiAgICogQ29udGFpbnMgYSByZWFkIHF1ZXVlIGFuZCBhIHdyaXRlIHF1ZXVlIHRoYXQgYXJlIHByb2Nlc3NlZCBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUgd2hlbiBuZWVkZWQuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gVGlja2VyKCkge1xuICAgIHRoaXMuX25leHRTdGVwID0gbnVsbDtcblxuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5fcmVhZHMgPSB7fTtcbiAgICB0aGlzLl93cml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX2JhdGNoID0gW107XG4gICAgdGhpcy5fYmF0Y2hSZWFkcyA9IHt9O1xuICAgIHRoaXMuX2JhdGNoV3JpdGVzID0ge307XG5cbiAgICB0aGlzLl9zdGVwID0gdGhpcy5fc3RlcC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgVGlja2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpZCwgcmVhZE9wZXJhdGlvbiwgd3JpdGVPcGVyYXRpb24sIGlzUHJpb3JpdGl6ZWQpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgYW4gaXRlbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcXVldWVzIHdpdGggdGhlIHNhbWUgaWRcbiAgICAvLyBhbmQgaWYgc28gLT4gcmVtb3ZlIGl0LlxuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBBZGQgZW50cnkuXG4gICAgaXNQcmlvcml0aXplZCA/IHRoaXMuX3F1ZXVlLnVuc2hpZnQoaWQpIDogdGhpcy5fcXVldWUucHVzaChpZCk7XG4gICAgdGhpcy5fcmVhZHNbaWRdID0gcmVhZE9wZXJhdGlvbjtcbiAgICB0aGlzLl93cml0ZXNbaWRdID0gd3JpdGVPcGVyYXRpb247XG5cbiAgICAvLyBGaW5hbGx5LCBsZXQncyBraWNrLXN0YXJ0IHRoZSBuZXh0IHRpY2sgaWYgaXQgaXMgbm90IHJ1bm5pbmcgeWV0LlxuICAgIGlmICghdGhpcy5fbmV4dFN0ZXApIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24oaWQpIHtcbiAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5fcXVldWUuaW5kZXhPZihpZCk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9xdWV1ZVtjdXJyZW50SW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLl93cml0ZXNbaWRdO1xuICAgIH1cbiAgfTtcblxuICBUaWNrZXIucHJvdG90eXBlLl9zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHJlYWRzID0gdGhpcy5fcmVhZHM7XG4gICAgdmFyIHdyaXRlcyA9IHRoaXMuX3dyaXRlcztcbiAgICB2YXIgYmF0Y2ggPSB0aGlzLl9iYXRjaDtcbiAgICB2YXIgYmF0Y2hSZWFkcyA9IHRoaXMuX2JhdGNoUmVhZHM7XG4gICAgdmFyIGJhdGNoV3JpdGVzID0gdGhpcy5fYmF0Y2hXcml0ZXM7XG4gICAgdmFyIGxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgaWQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCB0aWNrZXIuXG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgLy8gU2V0dXAgcXVldWVzIGFuZCBjYWxsYmFjayBwbGFjZWhvbGRlcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IHF1ZXVlW2ldO1xuICAgICAgaWYgKCFpZCkgY29udGludWU7XG5cbiAgICAgIGJhdGNoLnB1c2goaWQpO1xuXG4gICAgICBiYXRjaFJlYWRzW2lkXSA9IHJlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSByZWFkc1tpZF07XG5cbiAgICAgIGJhdGNoV3JpdGVzW2lkXSA9IHdyaXRlc1tpZF07XG4gICAgICBkZWxldGUgd3JpdGVzW2lkXTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBxdWV1ZS5cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJvY2VzcyByZWFkIGNhbGxiYWNrcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gYmF0Y2hbaV07XG4gICAgICBpZiAoYmF0Y2hSZWFkc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hSZWFkc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoUmVhZHNbaWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgd3JpdGUgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFdyaXRlc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hXcml0ZXNbaWRdKCk7XG4gICAgICAgIGRlbGV0ZSBiYXRjaFdyaXRlc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgYmF0Y2guXG4gICAgYmF0Y2gubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCAmJiBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdGlja2VyID0gbmV3IFRpY2tlcigpO1xuXG4gIHZhciBsYXlvdXRUaWNrID0gJ2xheW91dCc7XG4gIHZhciB2aXNpYmlsaXR5VGljayA9ICd2aXNpYmlsaXR5JztcbiAgdmFyIG1vdmVUaWNrID0gJ21vdmUnO1xuICB2YXIgc2Nyb2xsVGljayA9ICdzY3JvbGwnO1xuICB2YXIgcGxhY2Vob2xkZXJUaWNrID0gJ3BsYWNlaG9sZGVyJztcblxuICBmdW5jdGlvbiBhZGRMYXlvdXRUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgbGF5b3V0VGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbExheW91dFRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbGF5b3V0VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWaXNpYmlsaXR5VGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHZpc2liaWxpdHlUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkTW92ZVRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBtb3ZlVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbE1vdmVUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIG1vdmVUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNjcm9sbFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBzY3JvbGxUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsU2Nyb2xsVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBzY3JvbGxUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBwbGFjZWhvbGRlclRpY2spO1xuICB9XG5cbiAgdmFyIEVsUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gIHZhciBtYXRjaGVzRm4gPVxuICAgIEVsUHJvdG8ubWF0Y2hlcyB8fFxuICAgIEVsUHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm9NYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbGVtZW50IG1hdGNoZXMgYSBDU1Mgc2VsZWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNGbi5jYWxsKGVsLCBzZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNsYXNzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFlbGVtZW50TWF0Y2hlcyhlbGVtZW50LCAnLicgKyBjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcEFycmF5ID0gW107XG4gIHZhciBudW1iZXJUeXBlID0gJ251bWJlcic7XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbiBpdGVtIG9yIGFuIGFycmF5IG9mIGl0ZW1zIHRvIGFycmF5IHRvIGEgc3BlY2lmaWVkIGluZGV4LiBNdXRhdGVzXG4gICAqIHRoZSBhcnJheS4gVGhlIGluZGV4IGNhbiBiZSBuZWdhdGl2ZSBpbiB3aGljaCBjYXNlIHRoZSBpdGVtcyB3aWxsIGJlIGFkZGVkXG4gICAqIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0geyp9IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaW5kZXg9LTFdXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluc2VydChhcnJheSwgaXRlbXMsIGluZGV4KSB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0eXBlb2YgaW5kZXggPT09IG51bWJlclR5cGUgPyBpbmRleCA6IC0xO1xuICAgIGlmIChzdGFydEluZGV4IDwgMCkgc3RhcnRJbmRleCA9IGFycmF5Lmxlbmd0aCAtIHN0YXJ0SW5kZXggKyAxO1xuXG4gICAgYXJyYXkuc3BsaWNlLmFwcGx5KGFycmF5LCB0ZW1wQXJyYXkuY29uY2F0KHN0YXJ0SW5kZXgsIDAsIGl0ZW1zKSk7XG4gICAgdGVtcEFycmF5Lmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGFycmF5IGluZGV4LiBCYXNpY2FsbHkgdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkXG4gICAqIGFycmF5IGluZGV4IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgYWxzbyB0cmFuc2Zvcm1zXG4gICAqIG5lZ2F0aXZlIGluZGV4IHRvIHRoZSBtYXRjaGluZyBwb3NpdGl2ZSBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNNaWdyYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4LCBpc01pZ3JhdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIG1heEluZGV4ID0gTWF0aC5tYXgoMCwgaXNNaWdyYXRpb24gPyBsZW5ndGggOiBsZW5ndGggLSAxKTtcbiAgICByZXR1cm4gaW5kZXggPiBtYXhJbmRleCA/IG1heEluZGV4IDogaW5kZXggPCAwID8gTWF0aC5tYXgobWF4SW5kZXggKyBpbmRleCArIDEsIDApIDogaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhcnJheSBpdGVtIHRvIGFub3RoZXIgaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXhcbiAgICogICAtIEluZGV4IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgb2YgdGhlIGl0ZW0gdGhhdCB3aWxsIGJlIG1vdmVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgbW92ZWQgdG8uXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1vdmUoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGZyb20gPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCBmcm9tSW5kZXgpO1xuICAgIHZhciB0byA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIHRvSW5kZXgpO1xuXG4gICAgLy8gQWRkIHRhcmdldCBpdGVtIHRvIHRoZSBuZXcgcG9zaXRpb24uXG4gICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICBhcnJheS5zcGxpY2UodG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgYXJyYXkgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpdGhJbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgb3RoZXIgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U3dhcChhcnJheSwgaW5kZXgsIHdpdGhJbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGluZGV4QSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4KTtcbiAgICB2YXIgaW5kZXhCID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgd2l0aEluZGV4KTtcbiAgICB2YXIgdGVtcDtcblxuICAgIC8vIFN3YXAgdGhlIGl0ZW1zLlxuICAgIGlmIChpbmRleEEgIT09IGluZGV4Qikge1xuICAgICAgdGVtcCA9IGFycmF5W2luZGV4QV07XG4gICAgICBhcnJheVtpbmRleEFdID0gYXJyYXlbaW5kZXhCXTtcbiAgICAgIGFycmF5W2luZGV4Ql0gPSB0ZW1wO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY3Rpb25DYW5jZWwgPSAnY2FuY2VsJztcbiAgdmFyIGFjdGlvbkZpbmlzaCA9ICdmaW5pc2gnO1xuICB2YXIgZGVib3VuY2VUaWNrID0gJ2RlYm91bmNlJztcbiAgdmFyIGRlYm91bmNlSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gICAqIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgICogTiBtaWxsaXNlY29uZHMuIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBhY2NlcHRzIG9uZSBhcmd1bWVudCB3aGljaCwgd2hlblxuICAgKiBiZWluZyBcImZpbmlzaFwiLCBjYWxscyB0aGUgZGVib3VuY2UgZnVuY3Rpb24gaW1tZWRpYXRlbHkgaWYgaXQgaXMgY3VycmVudGx5XG4gICAqIHdhaXRpbmcgdG8gYmUgY2FsbGVkLCBhbmQgd2hlbiBiZWluZyBcImNhbmNlbFwiIGNhbmNlbHMgdGhlIGN1cnJlbnRseSBxdWV1ZWRcbiAgICogZnVuY3Rpb24gY2FsbC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdhaXRcbiAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIHdhaXQpIHtcbiAgICB2YXIgdGltZW91dDtcbiAgICB2YXIgdGlja2VySWQgPSArK2RlYm91bmNlSWQgKyBkZWJvdW5jZVRpY2s7XG5cbiAgICBpZiAod2FpdCA+IDApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHRpY2tlci5jYW5jZWwodGlja2VySWQpO1xuICAgICAgICAgIGlmIChhY3Rpb24gPT09IGFjdGlvbkZpbmlzaCkgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24gIT09IGFjdGlvbkNhbmNlbCAmJiBhY3Rpb24gIT09IGFjdGlvbkZpbmlzaCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aWNrZXIuYWRkKHRpY2tlcklkLCBmbiwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsKSBmbigpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgaXMgdHJhbnNmb3JtZWQsIGZhbHNlIGlmIG5vdC4gSW4gcHJhY3RpY2UgdGhlXG4gICAqIGVsZW1lbnQncyBkaXNwbGF5IHZhbHVlIG11c3QgYmUgYW55dGhpbmcgZWxzZSB0aGFuIFwibm9uZVwiIG9yIFwiaW5saW5lXCIgYXNcbiAgICogd2VsbCBhcyBoYXZlIGEgdmFsaWQgdHJhbnNmb3JtIHZhbHVlIGFwcGxpZWQgaW4gb3JkZXIgdG8gYmUgY291bnRlZCBhcyBhXG4gICAqIHRyYW5zZm9ybWVkIGVsZW1lbnQuXG4gICAqXG4gICAqIEJvcnJvd2VkIGZyb20gTWV6ciAodjAuNi4xKTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3JhbW8vbWV6ci9ibG9iLzAuNi4xL21lenIuanMjTDY2MVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNUcmFuc2Zvcm1lZChlbGVtZW50KSB7XG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsICd0cmFuc2Zvcm0nKTtcbiAgICBpZiAoIXRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0gPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGRpc3BsYXkgPSBnZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpO1xuICAgIGlmIChkaXNwbGF5ID09PSAnaW5saW5lJyB8fCBkaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50J3MgY29udGFpbmluZyBibG9jaywgd2hpY2ggaXNcbiAgICogY29uc2lkZXJlZCB0byBiZSB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgdGhlIHRhcmdldCBlbGVtZW50J3NcbiAgICogcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8uIERpc2NsYWltZXI6IHRoaXMgb25seSB3b3JrcyBhcyBpbnRlbmRlZCBmb3JcbiAgICogYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9jayBjaGVja2luZyBpcyBzdGFydGVkIGZyb21cbiAgICogICAgIHRoZSBwcm92aWRlZCBlbGVtZW50LiBPdGhlcndpc2UgdGhlIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbSB0aGVcbiAgICogICAgIHByb3ZpZGVkIGVsZW1lbnQncyBwYXJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybnMgeyhEb2N1bWVudHxFbGVtZW50KX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50LCBpbmNsdWRlU2VsZikge1xuICAgIC8vIEFzIGxvbmcgYXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgYW4gZWxlbWVudCwgc3RhdGljIGFuZCBub3RcbiAgICAvLyB0cmFuc2Zvcm1lZCwgdHJ5IHRvIGdldCB0aGUgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50IGFuZCBmYWxsYmFjayB0b1xuICAgIC8vIGRvY3VtZW50LiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMMzM5XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciByZXQgPSAoaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudDtcbiAgICB3aGlsZSAocmV0ICYmIHJldCAhPT0gZG9jdW1lbnQgJiYgZ2V0U3R5bGUocmV0LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgIWlzVHJhbnNmb3JtZWQocmV0KSkge1xuICAgICAgcmV0ID0gcmV0LnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYW4gZWxlbWVudCdzIHN0eWxlIHByb3BlcnR5IHRyYW5zZm9ybWVkIGludG9cbiAgICogYSBmbG9hdCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZUFzRmxvYXQoZWwsIHN0eWxlKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZ2V0U3R5bGUoZWwsIHN0eWxlKSkgfHwgMDtcbiAgfVxuXG4gIHZhciBvZmZzZXRBID0ge307XG4gIHZhciBvZmZzZXRCID0ge307XG4gIHZhciBvZmZzZXREaWZmID0ge307XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBkb2N1bWVudCBvZmZzZXQsIHdoaWNoIGluIHByYWN0aWNlIG1lYW5zIHRoZSB2ZXJ0aWNhbFxuICAgKiBhbmQgaG9yaXpvbnRhbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBlbGVtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lciBhbmQgdGhlXG4gICAqIGRvY3VtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lci4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdGhlIHNhbWVcbiAgICogb2JqZWN0IHNvIGJlIHN1cmUgdG8gcmVhZCB0aGUgZGF0YSBmcm9tIGl0IGluc3RlYWQgdXNpbmcgaXQgYXMgYSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KERvY3VtZW50fEVsZW1lbnR8V2luZG93KX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29mZnNldERhdGFdXG4gICAqICAgLSBPcHRpb25hbCBkYXRhIG9iamVjdCB3aGVyZSB0aGUgb2Zmc2V0IGRhdGEgd2lsbCBiZSBpbnNlcnRlZCB0by4gSWYgbm90XG4gICAqICAgICBwcm92aWRlZCBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgcmV0dXJuIGRhdGEuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRPZmZzZXQoZWxlbWVudCwgb2Zmc2V0RGF0YSkge1xuICAgIHZhciByZXQgPSBvZmZzZXREYXRhIHx8IHt9O1xuICAgIHZhciByZWN0O1xuXG4gICAgLy8gU2V0IHVwIHJldHVybiBkYXRhLlxuICAgIHJldC5sZWZ0ID0gMDtcbiAgICByZXQudG9wID0gMDtcblxuICAgIC8vIERvY3VtZW50J3Mgb2Zmc2V0cyBhcmUgYWx3YXlzIDAuXG4gICAgaWYgKGVsZW1lbnQgPT09IGRvY3VtZW50KSByZXR1cm4gcmV0O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB0byB0aGUgcmVzcGVjdGl2ZSBvZmZzZXRzLlxuICAgIHJldC5sZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IDA7XG4gICAgcmV0LnRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCAwO1xuXG4gICAgLy8gV2luZG93J3Mgb2Zmc2V0cyBhcmUgdGhlIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB2YWx1ZXMuXG4gICAgaWYgKGVsZW1lbnQuc2VsZiA9PT0gd2luZG93LnNlbGYpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgZWxlbWVudCdzIGNsaWVudCByZWN0cyB0byB0aGUgb2Zmc2V0cy5cbiAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXQubGVmdCArPSByZWN0LmxlZnQ7XG4gICAgcmV0LnRvcCArPSByZWN0LnRvcDtcblxuICAgIC8vIEV4Y2x1ZGUgZWxlbWVudCdzIGJvcmRlcnMgZnJvbSB0aGUgb2Zmc2V0LlxuICAgIHJldC5sZWZ0ICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICByZXQudG9wICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIHR3byBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUFcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29tcGFyZUNvbnRhaW5pbmdCbG9ja3M9ZmFsc2VdXG4gICAqICAgLSBXaGVuIHRoaXMgaXMgc2V0IHRvIHRydWUgdGhlIGNvbnRhaW5pbmcgYmxvY2tzIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50c1xuICAgKiAgICAgd2lsbCBiZSB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZS4gT3RoZXJ3aXNlIHRoZSBwcm92aWRlZFxuICAgKiAgICAgZWxlbWVudHMgd2lsbCBiZSBjb21wYXJlZCBkaXJlY3RseS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldERpZmYoZWxlbUEsIGVsZW1CLCBjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcykge1xuICAgIG9mZnNldERpZmYubGVmdCA9IDA7XG4gICAgb2Zmc2V0RGlmZi50b3AgPSAwO1xuXG4gICAgLy8gSWYgZWxlbWVudHMgYXJlIHNhbWUgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuXG4gICAgLy8gQ29tcGFyZSBjb250YWluaW5nIGJsb2NrcyBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgICBlbGVtQSA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQSwgdHJ1ZSk7XG4gICAgICBlbGVtQiA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQiwgdHJ1ZSk7XG5cbiAgICAgIC8vIElmIGNvbnRhaW5pbmcgYmxvY2tzIGFyZSBpZGVudGljYWwsIGxldCdzIHJldHVybiBlYXJseS5cbiAgICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuICAgIH1cblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmYuXG4gICAgZ2V0T2Zmc2V0KGVsZW1BLCBvZmZzZXRBKTtcbiAgICBnZXRPZmZzZXQoZWxlbUIsIG9mZnNldEIpO1xuICAgIG9mZnNldERpZmYubGVmdCA9IG9mZnNldEIubGVmdCAtIG9mZnNldEEubGVmdDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IG9mZnNldEIudG9wIC0gb2Zmc2V0QS50b3A7XG5cbiAgICByZXR1cm4gb2Zmc2V0RGlmZjtcbiAgfVxuXG4gIHZhciBzdHlsZU92ZXJmbG93ID0gJ292ZXJmbG93JztcbiAgdmFyIHN0eWxlT3ZlcmZsb3dYID0gJ292ZXJmbG93LXgnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1kgPSAnb3ZlcmZsb3cteSc7XG4gIHZhciBvdmVyZmxvd0F1dG8gPSAnYXV0byc7XG4gIHZhciBvdmVyZmxvd1Njcm9sbCA9ICdzY3JvbGwnO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHNjcm9sbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGFibGUoZWxlbWVudCkge1xuICAgIHZhciBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3cpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dYKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgb3ZlcmZsb3cgPSBnZXRTdHlsZShlbGVtZW50LCBzdHlsZU92ZXJmbG93WSk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGVsZW1lbnQncyBhbmNlc3RvcnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgc2Nyb2xsYWJsZSBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogQHBhcmFtIHtBcnJheX0gW2RhdGFdXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZWxlbWVudCwgaW5jbHVkZVNlbGYsIGRhdGEpIHtcbiAgICB2YXIgcmV0ID0gZGF0YSB8fCBbXTtcbiAgICB2YXIgcGFyZW50ID0gaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gRmluZCBzY3JvbGwgcGFyZW50cy5cbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgaW5zaWRlIFNoYWRvd0RPTSBsZXQncyBnZXQgaXQncyBob3N0IG5vZGUgZnJvbSB0aGUgcmVhbFxuICAgICAgLy8gRE9NIGFuZCBjb250aW51ZSBsb29waW5nLlxuICAgICAgaWYgKHBhcmVudC5nZXRSb290Tm9kZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRSb290Tm9kZSgpLmhvc3Q7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBlbGVtZW50IGlzIHNjcm9sbGFibGUgbGV0J3MgYWRkIGl0IHRvIHRoZSBzY3JvbGxhYmxlIGxpc3QuXG4gICAgICBpZiAoaXNTY3JvbGxhYmxlKHBhcmVudCkpIHtcbiAgICAgICAgcmV0LnB1c2gocGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGFkZCB3aW5kb3cgdG8gdGhlIHJlc3VsdHMuXG4gICAgcmV0LnB1c2god2luZG93KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICB2YXIgdHJhbnNsYXRlVmFsdWUgPSB7fTtcbiAgdmFyIHRyYW5zZm9ybVN0eWxlJDIgPSAndHJhbnNmb3JtJztcbiAgdmFyIHRyYW5zZm9ybU5vbmUgPSAnbm9uZSc7XG4gIHZhciByeE1hdDNkID0gL15tYXRyaXgzZC87XG4gIHZhciByeE1hdFR4ID0gLyhbXixdKiwpezR9LztcbiAgdmFyIHJ4TWF0M2RUeCA9IC8oW14sXSosKXsxMn0vO1xuICB2YXIgcnhOZXh0SXRlbSA9IC9bXixdKiwvO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50J3MgY29tcHV0ZWQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgYXMgYSBmbG9hdHMuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYWx3YXlzIHRoZSBzYW1lIG9iamVjdCBhbmQgdXBkYXRlZCBldmVyeSB0aW1lIHRoaXNcbiAgICogZnVuY3Rpb24gaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGUoZWxlbWVudCkge1xuICAgIHRyYW5zbGF0ZVZhbHVlLnggPSAwO1xuICAgIHRyYW5zbGF0ZVZhbHVlLnkgPSAwO1xuXG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsIHRyYW5zZm9ybVN0eWxlJDIpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gdHJhbnNmb3JtTm9uZSkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZVZhbHVlO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBzdHlsZSBjYW4gYmUgaW4gZWl0aGVyIG1hdHJpeDNkKC4uLikgb3IgbWF0cml4KC4uLikuXG4gICAgdmFyIGlzTWF0M2QgPSByeE1hdDNkLnRlc3QodHJhbnNmb3JtKTtcbiAgICB2YXIgdFggPSB0cmFuc2Zvcm0ucmVwbGFjZShpc01hdDNkID8gcnhNYXQzZFR4IDogcnhNYXRUeCwgJycpO1xuICAgIHZhciB0WSA9IHRYLnJlcGxhY2UocnhOZXh0SXRlbSwgJycpO1xuXG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IHBhcnNlRmxvYXQodFgpIHx8IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IHBhcnNlRmxvYXQodFkpIHx8IDA7XG5cbiAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRyYW5zbGF0ZVggYW5kIHRyYW5zbGF0ZVkgdmFsdWUgaW50byBDU1MgdHJhbnNmb3JtIHN0eWxlXG4gICAqIHByb3BlcnR5J3MgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGVTdHJpbmcoeCwgeSkge1xuICAgIHJldHVybiAndHJhbnNsYXRlWCgnICsgeCArICdweCkgdHJhbnNsYXRlWSgnICsgeSArICdweCknO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSAoJyAnICsgZWxlbWVudC5jbGFzc05hbWUgKyAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoJyAnICsgY2xhc3NOYW1lICsgJyAnLCAnICcpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZXMuXG4gIHZhciBzdGFydFByZWRpY2F0ZUluYWN0aXZlID0gMDtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUGVuZGluZyA9IDE7XG4gIHZhciBzdGFydFByZWRpY2F0ZVJlc29sdmVkID0gMjtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVqZWN0ZWQgPSAzO1xuXG4gIC8qKlxuICAgKiBCaW5kIHRvdWNoIGludGVyYWN0aW9uIHRvIGFuIGl0ZW0uXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1EcmFnKGl0ZW0pIHtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0YXJ0IHByZWRpY2F0ZSBkYXRhLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlID0gaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU3RhcnRQcmVkaWNhdGUpXG4gICAgICA/IHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZVxuICAgICAgOiBJdGVtRHJhZy5kZWZhdWx0U3RhcnRQcmVkaWNhdGU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBEYXRhIGZvciBkcmFnIHNvcnQgcHJlZGljYXRlIGhldXJpc3RpY3MuXG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gMDtcbiAgICB0aGlzLl9oWDIgPSAwO1xuICAgIHRoaXMuX2hZMSA9IDA7XG4gICAgdGhpcy5faFkyID0gMDtcblxuICAgIC8vIFNldHVwIGl0ZW0ncyBpbml0aWFsIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gQmluZCB0aGUgbWV0aG9kcyB0aGF0IG5lZWRzIGJpbmRpbmcuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVFbmRDaGVjayA9IHRoaXMuX3ByZUVuZENoZWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVNb3ZlID0gdGhpcy5fcHJlcGFyZU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hcHBseU1vdmUgPSB0aGlzLl9hcHBseU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVwYXJlU2Nyb2xsID0gdGhpcy5fcHJlcGFyZVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5U2Nyb2xsID0gdGhpcy5fYXBwbHlTY3JvbGwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jaGVja092ZXJsYXAgPSB0aGlzLl9jaGVja092ZXJsYXAuYmluZCh0aGlzKTtcblxuICAgIC8vIENyZWF0ZSBkZWJvdW5jZSBvdmVybGFwIGNoZWNrZXIgZnVuY3Rpb24uXG4gICAgdmFyIHNvcnRJbnRlcnZhbCA9IHNldHRpbmdzLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw7XG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UgPSBkZWJvdW5jZSh0aGlzLl9jaGVja092ZXJsYXAsIHNvcnRJbnRlcnZhbCk7XG5cbiAgICAvLyBJbml0IGRyYWdnZXIuXG4gICAgdGhpcy5fZHJhZ2dlciA9IG5ldyBEcmFnZ2VyKGVsZW1lbnQsIHNldHRpbmdzLmRyYWdDc3NQcm9wcyk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignc3RhcnQnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdtb3ZlJywgdGhpcy5fcHJlU3RhcnRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignY2FuY2VsJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ2VuZCcsIHRoaXMuX3ByZUVuZENoZWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc3RhcnQgcHJlZGljYXRlIGhhbmRsZXIgdGhhdCBoYW5kbGVzIGFuY2hvciBlbGVtZW50c1xuICAgKiBncmFjZWZ1bGx5LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5lcyBpZiB0aGUgZHJhZyBpc1xuICAgKiBzdGFydGVkLCByZWplY3RlZCBvciBwZW5kaW5nLiBXaGVuIHRydWUgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHN0YXJ0ZWRcbiAgICogYW5kIHdoZW4gZmFsc2UgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHJlamVjdGVkLiBJZiBub3RoaW5nIGlzIHJldHVybmVkXG4gICAqIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gb24gdGhlIG5leHQgZHJhZyBtb3ZlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgLSBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZSBwcmVkaWNhdGVcbiAgICogICAgIGl0J3Mgb3B0aW9ucyBtYW51YWxseS4gQnkgZGVmYXVsdCB0aGUgcHJlZGljYXRlIHJldHJpZXZlcyB0aGUgb3B0aW9uc1xuICAgKiAgICAgZnJvbSB0aGUgZ3JpZCdzIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGl0ZW0sIGV2ZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIGRyYWcgPSBpdGVtLl9kcmFnO1xuICAgIHZhciBwcmVkaWNhdGUgPSBkcmFnLl9zdGFydFByZWRpY2F0ZURhdGEgfHwgZHJhZy5fc2V0dXBTdGFydFByZWRpY2F0ZShvcHRpb25zKTtcblxuICAgIC8vIEZpbmFsIGV2ZW50IGxvZ2ljLiBBdCB0aGlzIHN0YWdlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgYW55bW9yZSxcbiAgICAvLyB0aGUgcHJlZGljYXRlIGlzIGVpdGhlciByZXNvbHZlZCBvciBpdCdzIG5vdCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgLy8gYWJvdXQgaXQuIEhlcmUgd2UganVzdCByZXNldCBkYXRhIGFuZCBpZiB0aGUgaXRlbSBlbGVtZW50IGlzIGEgbGlua1xuICAgIC8vIHdlIGZvbGxvdyBpdCAoaWYgdGhlcmUgaGFzIG9ubHkgYmVlbiBzbGlnaHQgbW92ZW1lbnQpLlxuICAgIGlmIChldmVudC5pc0ZpbmFsKSB7XG4gICAgICBkcmFnLl9maW5pc2hTdGFydFByZWRpY2F0ZShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBhbmQgc3RvcmUgdGhlIGhhbmRsZSBlbGVtZW50IHNvIHdlIGNhbiBjaGVjayBsYXRlciBvbiBpZiB0aGVcbiAgICAvLyBjdXJzb3IgaXMgd2l0aGluIHRoZSBoYW5kbGUuIElmIHdlIGhhdmUgYSBoYW5kbGUgc2VsZWN0b3IgbGV0J3MgZmluZFxuICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIE90aGVyd2lzZSBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGVcbiAgICAvLyBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCkge1xuICAgICAgcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQgPSBkcmFnLl9nZXRTdGFydFByZWRpY2F0ZUhhbmRsZShldmVudCk7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgZGVsYXkgaXMgZGVmaW5lZCBsZXQncyBrZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgZXZlbnQgYW5kIGluaXRpYXRlXG4gICAgLy8gZGVsYXkgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgeWV0LlxuICAgIGlmIChwcmVkaWNhdGUuZGVsYXkpIHtcbiAgICAgIHByZWRpY2F0ZS5ldmVudCA9IGV2ZW50O1xuICAgICAgaWYgKCFwcmVkaWNhdGUuZGVsYXlUaW1lcikge1xuICAgICAgICBwcmVkaWNhdGUuZGVsYXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByZWRpY2F0ZS5kZWxheSA9IDA7XG4gICAgICAgICAgaWYgKGRyYWcuX3Jlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpKSB7XG4gICAgICAgICAgICBkcmFnLl9mb3JjZVJlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpO1xuICAgICAgICAgICAgZHJhZy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgcHJlZGljYXRlLmRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkcmFnIHNvcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTUwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPSdtb3ZlJ11cbiAgICogQHJldHVybnMgeyhCb29sZWFufERyYWdTb3J0Q29tbWFuZCl9XG4gICAqICAgLSBSZXR1cm5zIGZhbHNlIGlmIG5vIHZhbGlkIGluZGV4IHdhcyBmb3VuZC4gT3RoZXJ3aXNlIHJldHVybnMgZHJhZyBzb3J0XG4gICAqICAgICBjb21tYW5kLlxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1SZWN0ID0ge307XG4gICAgdmFyIHRhcmdldFJlY3QgPSB7fTtcbiAgICB2YXIgcmV0dXJuRGF0YSA9IHt9O1xuICAgIHZhciByb290R3JpZEFycmF5ID0gW107XG5cbiAgICBmdW5jdGlvbiBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCB0aHJlc2hvbGQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsO1xuICAgICAgdmFyIGRyYWdTb3J0ID0gcm9vdEdyaWQuX3NldHRpbmdzLmRyYWdTb3J0O1xuICAgICAgdmFyIGJlc3RTY29yZSA9IC0xO1xuICAgICAgdmFyIGdyaWRTY29yZTtcbiAgICAgIHZhciBncmlkcztcbiAgICAgIHZhciBncmlkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIEdldCBwb3RlbnRpYWwgdGFyZ2V0IGdyaWRzLlxuICAgICAgaWYgKGRyYWdTb3J0ID09PSB0cnVlKSB7XG4gICAgICAgIHJvb3RHcmlkQXJyYXlbMF0gPSByb290R3JpZDtcbiAgICAgICAgZ3JpZHMgPSByb290R3JpZEFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZHMgPSBkcmFnU29ydC5jYWxsKHJvb3RHcmlkLCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyBncmlkcy5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncmlkcykpIHJldHVybiB0YXJnZXQ7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZ3JpZHMgYW5kIGdldCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncmlkID0gZ3JpZHNbaV07XG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbGwgZGVzdHJveWVkIGdyaWRzLlxuICAgICAgICBpZiAoZ3JpZC5faXNEZXN0cm95ZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncmlkJ3Mgb2Zmc2V0cyBhbmQgZGltZW5zaW9ucyBzaW5jZSB0aGV5IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgY2hhbmdlZCAoZS5nIGR1cmluZyBzY3JvbGxpbmcpLlxuICAgICAgICBncmlkLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBob3cgbXVjaCBkcmFnZ2VkIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gZ3JpZC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gZ3JpZC5faGVpZ2h0O1xuICAgICAgICB0YXJnZXRSZWN0LmxlZnQgPSBncmlkLl9sZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IGdyaWQuX3RvcDtcbiAgICAgICAgZ3JpZFNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBncmlkIGlzIHRoZSBiZXN0IG1hdGNoIHNvIGZhci5cbiAgICAgICAgaWYgKGdyaWRTY29yZSA+IHRocmVzaG9sZCAmJiBncmlkU2NvcmUgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICBiZXN0U2NvcmUgPSBncmlkU2NvcmU7XG4gICAgICAgICAgdGFyZ2V0ID0gZ3JpZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgcmVzZXQgcm9vdCBncmlkIGFycmF5LlxuICAgICAgcm9vdEdyaWRBcnJheS5sZW5ndGggPSAwO1xuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtLCBvcHRpb25zKSB7XG4gICAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgICB2YXIgcm9vdEdyaWQgPSBkcmFnLl9nZXRHcmlkKCk7XG5cbiAgICAgIC8vIEdldCBkcmFnIHNvcnQgcHJlZGljYXRlIHNldHRpbmdzLlxuICAgICAgdmFyIHNvcnRUaHJlc2hvbGQgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnRocmVzaG9sZCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnRocmVzaG9sZCA6IDUwO1xuICAgICAgdmFyIHNvcnRBY3Rpb24gPSBvcHRpb25zICYmIG9wdGlvbnMuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAgIC8vIFBvcHVsYXRlIGl0ZW0gcmVjdCBkYXRhLlxuICAgICAgaXRlbVJlY3Qud2lkdGggPSBpdGVtLl93aWR0aDtcbiAgICAgIGl0ZW1SZWN0LmhlaWdodCA9IGl0ZW0uX2hlaWdodDtcbiAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9lbGVtZW50Q2xpZW50WDtcbiAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2VsZW1lbnRDbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCBncmlkLlxuICAgICAgdmFyIGdyaWQgPSBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCBzb3J0VGhyZXNob2xkKTtcblxuICAgICAgLy8gUmV0dXJuIGVhcmx5IGlmIHdlIGZvdW5kIG5vIGdyaWQgY29udGFpbmVyIGVsZW1lbnQgdGhhdCBvdmVybGFwcyB0aGVcbiAgICAgIC8vIGRyYWdnZWQgaXRlbSBlbm91Z2guXG4gICAgICBpZiAoIWdyaWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgdmFyIGdyaWRPZmZzZXRMZWZ0ID0gMDtcbiAgICAgIHZhciBncmlkT2Zmc2V0VG9wID0gMDtcbiAgICAgIHZhciBtYXRjaFNjb3JlID0gLTE7XG4gICAgICB2YXIgbWF0Y2hJbmRleDtcbiAgICAgIHZhciBoYXNWYWxpZFRhcmdldHM7XG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHNjb3JlO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIElmIGl0ZW0gaXMgbW92ZWQgd2l0aGluIGl0J3Mgb3JpZ2luYXRpbmcgZ3JpZCBhZGp1c3QgaXRlbSdzIGxlZnQgYW5kXG4gICAgICAvLyB0b3AgcHJvcHMuIE90aGVyd2lzZSBpZiBpdGVtIGlzIG1vdmVkIHRvL3dpdGhpbiBhbm90aGVyIGdyaWQgZ2V0IHRoZVxuICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBvZmZzZXQgKGZyb20gdGhlIGVsZW1lbnQncyBjb250ZW50IGVkZ2UpLlxuICAgICAgaWYgKGdyaWQgPT09IHJvb3RHcmlkKSB7XG4gICAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9ncmlkWCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2dyaWRZICsgaXRlbS5fbWFyZ2luVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZC5fdXBkYXRlQm9yZGVycygxLCAwLCAxLCAwKTtcbiAgICAgICAgZ3JpZE9mZnNldExlZnQgPSBncmlkLl9sZWZ0ICsgZ3JpZC5fYm9yZGVyTGVmdDtcbiAgICAgICAgZ3JpZE9mZnNldFRvcCA9IGdyaWQuX3RvcCArIGdyaWQuX2JvcmRlclRvcDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXQgZ3JpZCBpdGVtcyBhbmQgdHJ5IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2guXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZC5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGFyZ2V0ID0gZ3JpZC5faXRlbXNbaV07XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBpdGVtIGlzIG5vdCBhY3RpdmUgb3IgdGhlIHRhcmdldCBpdGVtIGlzIHRoZSBkcmFnZ2VkXG4gICAgICAgIC8vIGl0ZW0gbGV0J3Mgc2tpcCB0byB0aGUgbmV4dCBpdGVtLlxuICAgICAgICBpZiAoIXRhcmdldC5faXNBY3RpdmUgfHwgdGFyZ2V0ID09PSBpdGVtKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHRoZSBncmlkIGFzIGhhdmluZyB2YWxpZCB0YXJnZXQgaXRlbXMuXG4gICAgICAgIGhhc1ZhbGlkVGFyZ2V0cyA9IHRydWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGggdGhlIGRyYWdnZWQgaXRlbS5cbiAgICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9IHRhcmdldC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gdGFyZ2V0Ll9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IHRhcmdldC5fbGVmdCArIHRhcmdldC5fbWFyZ2luTGVmdCArIGdyaWRPZmZzZXRMZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IHRhcmdldC5fdG9wICsgdGFyZ2V0Ll9tYXJnaW5Ub3AgKyBncmlkT2Zmc2V0VG9wO1xuICAgICAgICBzY29yZSA9IGdldFJlY3RPdmVybGFwU2NvcmUoaXRlbVJlY3QsIHRhcmdldFJlY3QpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBiZXN0IG1hdGNoIGluZGV4IGFuZCBzY29yZSBpZiB0aGUgdGFyZ2V0J3Mgb3ZlcmxhcCBzY29yZSB3aXRoXG4gICAgICAgIC8vIHRoZSBkcmFnZ2VkIGl0ZW0gaXMgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdCBtYXRjaCBzY29yZS5cbiAgICAgICAgaWYgKHNjb3JlID4gbWF0Y2hTY29yZSkge1xuICAgICAgICAgIG1hdGNoSW5kZXggPSBpO1xuICAgICAgICAgIG1hdGNoU2NvcmUgPSBzY29yZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyB2YWxpZCBtYXRjaCBhbmQgdGhlIGl0ZW0gaXMgYmVpbmcgbW92ZWQgaW50byBhbm90aGVyXG4gICAgICAvLyBncmlkLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPCBzb3J0VGhyZXNob2xkICYmIGl0ZW0uZ2V0R3JpZCgpICE9PSBncmlkKSB7XG4gICAgICAgIG1hdGNoSW5kZXggPSBoYXNWYWxpZFRhcmdldHMgPyAtMSA6IDA7XG4gICAgICAgIG1hdGNoU2NvcmUgPSBJbmZpbml0eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJlc3QgbWF0Y2ggb3ZlcmxhcHMgZW5vdWdoIHRvIGp1c3RpZnkgYSBwbGFjZW1lbnQgc3dpdGNoLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPj0gc29ydFRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm5EYXRhLmdyaWQgPSBncmlkO1xuICAgICAgICByZXR1cm5EYXRhLmluZGV4ID0gbWF0Y2hJbmRleDtcbiAgICAgICAgcmV0dXJuRGF0YS5hY3Rpb24gPSBzb3J0QWN0aW9uO1xuICAgICAgICByZXR1cm4gcmV0dXJuRGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFib3J0IGRyYWdnaW5nIGFuZCByZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbURyYWd9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGJlaW5nIGRyb3BwZWQgaW50byBhbm90aGVyIGdyaWQsIGZpbmlzaCBpdCB1cCBhbmQgcmV0dXJuXG4gICAgLy8gaW1tZWRpYXRlbHkuXG4gICAgaWYgKHRoaXMuX2lzTWlncmF0aW5nKSB7XG4gICAgICB0aGlzLl9maW5pc2hNaWdyYXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgbW92ZSBhbmQgc2Nyb2xsIHRpY2tzLlxuICAgIGNhbmNlbE1vdmVUaWNrKGl0ZW0uX2lkKTtcbiAgICBjYW5jZWxTY3JvbGxUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gQ2FuY2VsIG92ZXJsYXAgY2hlY2suXG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoJ2NhbmNlbCcpO1xuXG4gICAgLy8gQXBwZW5kIGl0ZW0gZWxlbWVudCB0byB0aGUgY29udGFpbmVyIGlmIGl0J3Mgbm90IGl0J3MgY2hpbGQuIEFsc28gbWFrZVxuICAgIC8vIHN1cmUgdGhlIHRyYW5zbGF0ZSB2YWx1ZXMgYXJlIGFkanVzdGVkIHRvIGFjY291bnQgZm9yIHRoZSBET00gc2hpZnQuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fZ3JpZFgsIHRoaXMuX2dyaWRZKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dpbmcgY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgZ3JpZC5fc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9kcmFnZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMgez9HcmlkfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXSB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cC9yZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJcyBpdGVtIGJlaW5nIGRyYWdnZWQ/XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBkcmFnZ2VkIGl0ZW0ncyBjb250YWluZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gbnVsbDtcblxuICAgIC8vIERyYWcvc2Nyb2xsIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IG51bGw7XG5cbiAgICAvLyBBbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG5lZWQgdG8gYmUgbGlzdGVuZWQgZm9yIHNjcm9sbCBldmVudHMgZHVyaW5nXG4gICAgLy8gZHJhZ2dpbmcuXG4gICAgdGhpcy5fc2Nyb2xsZXJzID0gW107XG5cbiAgICAvLyBUaGUgY3VycmVudCB0cmFuc2xhdGVYL3RyYW5zbGF0ZVkgcG9zaXRpb24uXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLlxuICAgIHRoaXMuX2dyaWRYID0gMDtcbiAgICB0aGlzLl9ncmlkWSA9IDA7XG5cbiAgICAvLyBEcmFnZ2VkIGVsZW1lbnQncyBjdXJyZW50IG9mZnNldCBmcm9tIHdpbmRvdydzIG5vcnRod2VzdCBjb3JuZXIuIERvZXNcbiAgICAvLyBub3QgYWNjb3VudCBmb3IgZWxlbWVudCdzIG1hcmdpbnMuXG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSAwO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gMDtcblxuICAgIC8vIE9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRyYWdnZWQgZWxlbWVudCdzIHRlbXBvcmFyeSBkcmFnXG4gICAgLy8gY29udGFpbmVyIGFuZCBpdCdzIG9yaWdpbmFsIGNvbnRhaW5lci5cbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCaW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIHRvIGFsbCBzY3JvbGxhYmxlIGFuY2VzdG9yIGVsZW1lbnRzIG9mIHRoZVxuICAgKiBkcmFnZ2VkIGVsZW1lbnQgYW5kIHRoZSBkcmFnIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2JpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IHRoaXMuX2dldEdyaWQoKS5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBncmlkU2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gR2V0IGRyYWdnZWQgZWxlbWVudCdzIHNjcm9sbGluZyBwYXJlbnRzLlxuICAgIHNjcm9sbGVycy5sZW5ndGggPSAwO1xuICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnModGhpcy5faXRlbS5fZWxlbWVudCwgZmFsc2UsIHNjcm9sbGVycyk7XG5cbiAgICAvLyBJZiBkcmFnIGNvbnRhaW5lciBpcyBkZWZpbmVkIGFuZCBpdCdzIG5vdCB0aGUgc2FtZSBlbGVtZW50IGFzIGdyaWRcbiAgICAvLyBjb250YWluZXIgdGhlbiB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBjb250YWluZXIgYW5kIGl0J3Mgc2Nyb2xsIHBhcmVudHNcbiAgICAvLyB0byB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIGdvaW5nIHRvIGJlIGxpc3RlbmVyIGZvciBzY3JvbGwgZXZlbnRzLlxuICAgIGlmIChkcmFnQ29udGFpbmVyICE9PSBncmlkQ29udGFpbmVyKSB7XG4gICAgICBncmlkU2Nyb2xsZXJzID0gW107XG4gICAgICBnZXRTY3JvbGxhYmxlQW5jZXN0b3JzKGdyaWRDb250YWluZXIsIHRydWUsIGdyaWRTY3JvbGxlcnMpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRTY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjcm9sbGVycy5pbmRleE9mKGdyaWRTY3JvbGxlcnNbaV0pIDwgMCkge1xuICAgICAgICAgIHNjcm9sbGVycy5wdXNoKGdyaWRTY3JvbGxlcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjcm9sbGVycyA9IHRoaXMuX3Njcm9sbGVycztcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fc2V0dXBTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnID0gb3B0aW9ucyB8fCB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSB8fCAwO1xuICAgIHJldHVybiAodGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhID0ge1xuICAgICAgZGlzdGFuY2U6IE1hdGguYWJzKGNvbmZpZy5kaXN0YW5jZSkgfHwgMCxcbiAgICAgIGRlbGF5OiBNYXRoLm1heChjb25maWcuZGVsYXksIDApIHx8IDAsXG4gICAgICBoYW5kbGU6IHR5cGVvZiBjb25maWcuaGFuZGxlID09PSAnc3RyaW5nJyA/IGNvbmZpZy5oYW5kbGUgOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cCBkZWZhdWx0IHN0YXJ0IHByZWRpY2F0ZSBoYW5kbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHs/SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgcHJlZGljYXRlID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaGFuZGxlRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBObyBoYW5kbGUsIG5vIGhhc3NsZSAtPiBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGUgaGFuZGxlLlxuICAgIGlmICghcHJlZGljYXRlLmhhbmRsZSkgcmV0dXJuIGhhbmRsZUVsZW1lbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNwZWNpZmljIHByZWRpY2F0ZSBoYW5kbGUgZGVmaW5lZCwgbGV0J3MgdHJ5IHRvIGdldCBpdC5cbiAgICBoYW5kbGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIHdoaWxlIChoYW5kbGVFbGVtZW50ICYmICFlbGVtZW50TWF0Y2hlcyhoYW5kbGVFbGVtZW50LCBwcmVkaWNhdGUuaGFuZGxlKSkge1xuICAgICAgaGFuZGxlRWxlbWVudCA9IGhhbmRsZUVsZW1lbnQgIT09IGVsZW1lbnQgPyBoYW5kbGVFbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlRWxlbWVudCB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG5cbiAgICAvLyBJZiB0aGUgbW92ZWQgZGlzdGFuY2UgaXMgc21hbGxlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGlzdGFuY2Ugb3IgdGhlcmUgaXNcbiAgICAvLyBzb21lIGRlbGF5IGxlZnQsIGlnbm9yZSB0aGlzIHByZWRpY2F0ZSBjeWNsZS5cbiAgICBpZiAoZXZlbnQuZGlzdGFuY2UgPCBwcmVkaWNhdGUuZGlzdGFuY2UgfHwgcHJlZGljYXRlLmRlbGF5KSByZXR1cm47XG5cbiAgICAvLyBHZXQgaGFuZGxlIHJlY3QgZGF0YS5cbiAgICB2YXIgaGFuZGxlUmVjdCA9IHByZWRpY2F0ZS5oYW5kbGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYW5kbGVMZWZ0ID0gaGFuZGxlUmVjdC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCAwKTtcbiAgICB2YXIgaGFuZGxlVG9wID0gaGFuZGxlUmVjdC50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZVJlY3Qud2lkdGg7XG4gICAgdmFyIGhhbmRsZUhlaWdodCA9IGhhbmRsZVJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnNvciBpcyBzdGlsbCB3aXRoaW4gdGhlIGhhbmRsZSBsZXQncyBzdGFydCB0aGUgZHJhZy5cbiAgICByZXR1cm4gKFxuICAgICAgaGFuZGxlV2lkdGggJiZcbiAgICAgIGhhbmRsZUhlaWdodCAmJlxuICAgICAgZXZlbnQucGFnZVggPj0gaGFuZGxlTGVmdCAmJlxuICAgICAgZXZlbnQucGFnZVggPCBoYW5kbGVMZWZ0ICsgaGFuZGxlV2lkdGggJiZcbiAgICAgIGV2ZW50LnBhZ2VZID49IGhhbmRsZVRvcCAmJlxuICAgICAgZXZlbnQucGFnZVkgPCBoYW5kbGVUb3AgKyBoYW5kbGVIZWlnaHRcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZWZ1bGx5IHJlc29sdmUgZHJhZyBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzRGVzdHJveWVkICYmIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUGVuZGluZykge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG4gICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGljayAodmVyeSBzdWJqZWN0aXZlIGhldXJpc3RpY3MpLlxuICAgIHZhciBpc0NsaWNrID0gTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA8IDIgJiYgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSA8IDIgJiYgZXZlbnQuZGVsdGFUaW1lIDwgMjAwO1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlLlxuICAgIHRoaXMuX3Jlc2V0U3RhcnRQcmVkaWNhdGUoKTtcblxuICAgIC8vIElmIHRoZSBnZXN0dXJlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBjbGljayBsZXQncyB0cnkgdG8gb3BlbiB0aGUgZWxlbWVudCdzXG4gICAgLy8gaHJlZiB1cmwgKGlmIGl0IGlzIGFuIGFuY2hvciBlbGVtZW50KS5cbiAgICBpZiAoaXNDbGljaykgb3BlbkFuY2hvckhyZWYoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IGRyYWcgc29ydCBoZXVyaXN0aWNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldEhldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuX2hYMSA9IHRoaXMuX2hYMiA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5faFkxID0gdGhpcy5faFkyID0gZXZlbnQuY2xpZW50WTtcbiAgfTtcblxuICAvKipcbiAgICogUnVuIGhldXJpc3RpY3MgYW5kIHJldHVybiB0cnVlIGlmIG92ZXJsYXAgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZCwgYW5kIGZhbHNlXG4gICAqIGlmIGl0IGNhbiBub3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9jaGVja0hldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzO1xuICAgIHZhciBtaW5EaXN0ID0gc2V0dGluZ3MubWluRHJhZ0Rpc3RhbmNlO1xuXG4gICAgLy8gU2tpcCBoZXVyaXN0aWNzIGlmIG5vdCBuZWVkZWQuXG4gICAgaWYgKG1pbkRpc3QgPD0gMCkge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuICAgIHZhciBkaWZmWCA9IHggLSB0aGlzLl9oWDI7XG4gICAgdmFyIGRpZmZZID0geSAtIHRoaXMuX2hZMjtcblxuICAgIC8vIElmIHdlIGNhbid0IGRvIHByb3BlciBib3VuY2UgYmFjayBjaGVjayBtYWtlIHN1cmUgdGhhdCB0aGUgYmxvY2tlZCBpbmRleFxuICAgIC8vIGlzIG5vdCBzZXQuXG4gICAgdmFyIGNhbkNoZWNrQm91bmNlQmFjayA9IG1pbkRpc3QgPiAzICYmIHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSA+IDA7XG4gICAgaWYgKCFjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBtaW5EaXN0IHx8IE1hdGguYWJzKGRpZmZZKSA+IG1pbkRpc3QpIHtcbiAgICAgIC8vIFJlc2V0IGJsb2NrZWQgaW5kZXggaWYgYW5nbGUgY2hhbmdlZCBlbm91Z2guIFRoaXMgY2hlY2sgcmVxdWlyZXMgYVxuICAgICAgLy8gbWluaW11bSB2YWx1ZSBvZiAzIGZvciBtaW5EcmFnRGlzdGFuY2UgdG8gZnVuY3Rpb24gcHJvcGVybHkuXG4gICAgICBpZiAoY2FuQ2hlY2tCb3VuY2VCYWNrKSB7XG4gICAgICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoZGlmZlgsIGRpZmZZKTtcbiAgICAgICAgdmFyIHByZXZBbmdsZSA9IE1hdGguYXRhbjIodGhpcy5faFgyIC0gdGhpcy5faFgxLCB0aGlzLl9oWTIgLSB0aGlzLl9oWTEpO1xuICAgICAgICB2YXIgZGVsdGFBbmdsZSA9IE1hdGguYXRhbjIoTWF0aC5zaW4oYW5nbGUgLSBwcmV2QW5nbGUpLCBNYXRoLmNvcyhhbmdsZSAtIHByZXZBbmdsZSkpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZGVsdGFBbmdsZSkgPiBzZXR0aW5ncy5taW5Cb3VuY2VCYWNrQW5nbGUpIHtcbiAgICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcG9pbnRzLlxuICAgICAgdGhpcy5faFgxID0gdGhpcy5faFgyO1xuICAgICAgdGhpcy5faFkxID0gdGhpcy5faFkyO1xuICAgICAgdGhpcy5faFgyID0geDtcbiAgICAgIHRoaXMuX2hZMiA9IHk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZm9yIGRlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgaWYgKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LmNsZWFyVGltZW91dChwcmVkaWNhdGUuZGVsYXlUaW1lcik7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgKGR1cmluZyBkcmFnKSBpZiBhbiBpdGVtIGlzIG92ZXJsYXBwaW5nIG90aGVyIGl0ZW1zIGFuZCBiYXNlZCBvblxuICAgKiB0aGUgY29uZmlndXJhdGlvbiBsYXlvdXQgdGhlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrT3ZlcmxhcCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciByZXN1bHQ7XG4gICAgdmFyIGN1cnJlbnRHcmlkO1xuICAgIHZhciBjdXJyZW50SW5kZXg7XG4gICAgdmFyIHRhcmdldEdyaWQ7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciBzb3J0QWN0aW9uO1xuICAgIHZhciBpc01pZ3JhdGlvbjtcblxuICAgIC8vIEdldCBvdmVybGFwIGNoZWNrIHJlc3VsdC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydFByZWRpY2F0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IEl0ZW1EcmFnLmRlZmF1bHRTb3J0UHJlZGljYXRlKGl0ZW0sIHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyBtYWtlIHN1cmUgdGhlIHJlc3VsdCBvYmplY3QgaGFzIGEgdmFsaWQgaW5kZXggYmVmb3JlIGdvaW5nIGZ1cnRoZXIuXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdC5pbmRleCAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGN1cnJlbnRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdGFyZ2V0R3JpZCA9IHJlc3VsdC5ncmlkIHx8IGN1cnJlbnRHcmlkO1xuICAgIGlzTWlncmF0aW9uID0gY3VycmVudEdyaWQgIT09IHRhcmdldEdyaWQ7XG4gICAgY3VycmVudEluZGV4ID0gY3VycmVudEdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEdyaWQuX2l0ZW1zLCByZXN1bHQuaW5kZXgsIGlzTWlncmF0aW9uKTtcbiAgICBzb3J0QWN0aW9uID0gcmVzdWx0LmFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuXG4gICAgLy8gUHJldmVudCBwb3NpdGlvbiBib3VuY2UuXG4gICAgaWYgKCFpc01pZ3JhdGlvbiAmJiB0YXJnZXRJbmRleCA9PT0gdGhpcy5faEJsb2NrZWRJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB3aXRoaW4gaXQncyBjdXJyZW50IGdyaWQuXG4gICAgaWYgKCFpc01pZ3JhdGlvbikge1xuICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0YXJnZXQgaW5kZXggaXMgbm90IHRoZSBjdXJyZW50IGluZGV4LlxuICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IGN1cnJlbnRJbmRleDtcblxuICAgICAgICAvLyBEbyB0aGUgc29ydC5cbiAgICAgICAgKHNvcnRBY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhcnJheVN3YXAgOiBhcnJheU1vdmUpKFxuICAgICAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcyxcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4LFxuICAgICAgICAgICAgYWN0aW9uOiBzb3J0QWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMYXlvdXQgdGhlIGdyaWQuXG4gICAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB0byBhbm90aGVyIGdyaWQuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcblxuICAgICAgLy8gRW1pdCBiZWZvcmVTZW5kIGV2ZW50LlxuICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVTZW5kKSkge1xuICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudEJlZm9yZVNlbmQsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlUmVjZWl2ZSwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgICAvLyBVcGRhdGUgZHJhZyBpbnN0YW5jZSdzIG1pZ3JhdGluZyBpbmRpY2F0b3IuXG4gICAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGl0ZW0uX2dyaWRJZCAhPT0gdGhpcy5fZ3JpZElkO1xuXG4gICAgICAvLyBNb3ZlIGl0ZW0gaW5zdGFuY2UgZnJvbSBjdXJyZW50IGdyaWQgdG8gdGFyZ2V0IGdyaWQuXG4gICAgICBjdXJyZW50R3JpZC5faXRlbXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgICBhcnJheUluc2VydCh0YXJnZXRHcmlkLl9pdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgICAvLyBTZXQgc29ydCBkYXRhIGFzIG51bGwsIHdoaWNoIGlzIGFuIGluZGljYXRvciBmb3IgdGhlIGl0ZW0gY29tcGFyaXNvblxuICAgICAgLy8gZnVuY3Rpb24gdGhhdCB0aGUgc29ydCBkYXRhIG9mIHRoaXMgc3BlY2lmaWMgaXRlbSBzaG91bGQgYmUgZmV0Y2hlZFxuICAgICAgLy8gbGF6aWx5LlxuICAgICAgaXRlbS5fc29ydERhdGEgPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCByZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMYXlvdXQgYm90aCBncmlkcy5cbiAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgdGFyZ2V0R3JpZC5sYXlvdXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIGl0ZW0gaXMgZHJhZ2dlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIHRoZSBtaWdyYXRpb24gcHJvY2Vzc1xuICAgKiBncmFjZWZ1bGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZpbmlzaE1pZ3JhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciB0YXJnZXRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHRhcmdldEdyaWRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0U2V0dGluZ3MgPSB0YXJnZXRHcmlkLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0NvbnRhaW5lciB8fCB0YXJnZXRHcmlkRWxlbWVudDtcbiAgICB2YXIgY3VycmVudFNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgY3VycmVudENvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciBvZmZzZXREaWZmO1xuXG4gICAgLy8gRGVzdHJveSBjdXJyZW50IGRyYWcuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHNldCB0aGUgbWlncmF0aW5nIGZsYWcgdG9cbiAgICAvLyBmYWxzZSBmaXJzdCwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgY3JlYXRlIGFuIGluZmluaXRlIGxvb3AgYmV0d2VlbiB0aGlzXG4gICAgLy8gYW5kIHRoZSBkcmFnLnN0b3AoKSBtZXRob2QuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBjdXJyZW50IGNsYXNzbmFtZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGN1cnJlbnRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gQWRkIG5ldyBjbGFzc25hbWVzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHRhcmdldFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgaXNBY3RpdmUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgdGhlIGl0ZW0gaW5zaWRlIHRoZSB0YXJnZXQgY29udGFpbmVyIGlmIGl0J3MgZGlmZmVyZW50IHRoYW4gdGhlXG4gICAgLy8gY3VycmVudCBjb250YWluZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgdGFyZ2V0Q29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY3VycmVudENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZS54IC09IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRyYW5zbGF0ZS55IC09IG9mZnNldERpZmYudG9wO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2FjaGVkIGRpbWVuc2lvbnMgYW5kIHNvcnQgZGF0YS5cbiAgICBpdGVtLl9yZWZyZXNoRGltZW5zaW9ucygpO1xuICAgIGl0ZW0uX3JlZnJlc2hTb3J0RGF0YSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCdzIGRyYWcgY29udGFpbmVyIChpZiBhbnkpXG4gICAgLy8gYW5kIGFjdHVhbCBncmlkIGNvbnRhaW5lciBlbGVtZW50LiBXZSBzYXZlIGl0IGxhdGVyIGZvciB0aGUgcmVsZWFzZVxuICAgIC8vIHByb2Nlc3MuXG4gICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGFyZ2V0Q29udGFpbmVyLCB0YXJnZXRHcmlkRWxlbWVudCwgdHJ1ZSk7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlggPSBvZmZzZXREaWZmLmxlZnQ7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgIC8vIFJlY3JlYXRlIGl0ZW0ncyBkcmFnIGhhbmRsZXIuXG4gICAgaXRlbS5fZHJhZyA9IHRhcmdldFNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKGl0ZW0pIDogbnVsbDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gZWxlbWVudCBpZiBpdCB3YXMgbW92ZWQgZnJvbSBhIGNvbnRhaW5lclxuICAgIC8vIHRvIGFub3RoZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGUueCwgdHJhbnNsYXRlLnkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLnZpc2libGVTdHlsZXMgOiB0YXJnZXRTZXR0aW5ncy5oaWRkZW5TdHlsZXMpO1xuXG4gICAgLy8gU3RhcnQgdGhlIHJlbGVhc2UuXG4gICAgcmVsZWFzZS5zdGFydCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1zdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBMZXQncyBhY3RpdmF0ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZS5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZSkge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUGVuZGluZztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcGVuZGluZyB0cnkgdG8gcmVzb2x2ZSBpdC5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlKHRoaXMuX2l0ZW0sIGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgICAgdGhpcy5fb25TdGFydChldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZWplY3RlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgaWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnIGlzIGFjdGl2ZSwgbW92ZSB0aGUgaXRlbS5cbiAgICBlbHNlIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVJlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9vbk1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBwcmUtZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZUVuZENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgcHJlZGljYXRlIHdhcyByZXNvbHZlZCBkdXJpbmcgZHJhZy5cbiAgICB2YXIgaXNSZXNvbHZlZCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG5cbiAgICAvLyBEbyBmaW5hbCBwcmVkaWNhdGUgY2hlY2sgdG8gYWxsb3cgdXNlciB0byB1bmJpbmQgc3R1ZmYgZm9yIHRoZSBjdXJyZW50XG4gICAgLy8gZHJhZyBwcm9jZWR1cmUgd2l0aGluIHRoZSBwcmVkaWNhdGUgY2FsbGJhY2suIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpc1xuICAgIC8vIGNoZWNrIHdpbGwgaGF2ZSBubyBlZmZlY3QgdG8gdGhlIHN0YXRlIG9mIHRoZSBwcmVkaWNhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gUmVzZXQgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZUluYWN0aXZlO1xuXG4gICAgLy8gSWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnZ2luZyBpcyBhY3RpdmUsIGNhbGwgdGhlIGVuZCBoYW5kbGVyLlxuICAgIGlmIChpc1Jlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB0aGlzLl9vbkVuZChldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc3RhcnQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TdGFydCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCBkb24ndCBzdGFydCB0aGUgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdDb250YWluZXIgPSBzZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IGdyaWRDb250YWluZXI7XG4gICAgdmFyIGNvbnRhaW5pbmdCbG9jayA9IGdldENvbnRhaW5pbmdCbG9jayhkcmFnQ29udGFpbmVyLCB0cnVlKTtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgIHZhciBjdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHZhciBjdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gICAgdmFyIGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgaGFzRHJhZ0NvbnRhaW5lciA9IGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXI7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBSZXNldCBoZXVyaXN0aWNzIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRIZXVyaXN0aWNzKGV2ZW50KTtcblxuICAgIC8vIElmIGdyaWQgY29udGFpbmVyIGlzIG5vdCB0aGUgZHJhZyBjb250YWluZXIsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZVxuICAgIC8vIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gZ3JpZCBjb250YWluZXIgYW5kIGRyYWcgY29udGFpbmVyJ3MgY29udGFpbmluZ1xuICAgIC8vIGVsZW1lbnQuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKGNvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHBvc2l0aW9uaW5nIGFuaW1hdGlvbi5cbiAgICBpZiAoaXRlbS5pc1Bvc2l0aW9uaW5nKCkpIHtcbiAgICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIFN0b3AgY3VycmVudCBtaWdyYXRpb24gYW5pbWF0aW9uLlxuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkge1xuICAgICAgY3VycmVudExlZnQgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICBjdXJyZW50VG9wIC09IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgbWlncmF0ZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgYmVpbmcgcmVsZWFzZWQgcmVzZXQgcmVsZWFzZSBkYXRhLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHJlbGVhc2UuX3Jlc2V0KCk7XG5cbiAgICAvLyBTZXR1cCBkcmFnIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGRyYWdDb250YWluZXI7XG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gY29udGFpbmluZ0Jsb2NrO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYID0gZWxlbWVudFJlY3QubGVmdDtcbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WSA9IGVsZW1lbnRSZWN0LnRvcDtcbiAgICB0aGlzLl9sZWZ0ID0gdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdDtcbiAgICB0aGlzLl90b3AgPSB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3A7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgKGlmIG5lY2Vzc2FyeSkuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkKSB7XG4gICAgICBpdGVtLl9kcmFnUGxhY2Vob2xkZXIuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnSW5pdCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0luaXQsIGl0ZW0sIGV2ZW50KTtcblxuICAgIC8vIElmIGEgc3BlY2lmaWMgZHJhZyBjb250YWluZXIgaXMgc2V0IGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICAvLyBncmlkJ3MgY29udGFpbmVyIGVsZW1lbnQgd2UgbmVlZCB0byBjYXN0IHNvbWUgZXh0cmEgc3BlbGxzLlxuICAgIGlmIChoYXNEcmFnQ29udGFpbmVyKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgY29udGFpbmVyIG9mZnNldCBkaWZmcyB0byBkcmFnIGRhdGEuXG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG5cbiAgICAgIC8vIElmIHRoZSBkcmFnZ2VkIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiB0aGUgZHJhZyBjb250YWluZXIgYWxsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGRvIGlzIHNldHVwIHRoZSByZWxhdGl2ZSBkcmFnIHBvc2l0aW9uIGRhdGEuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBkcmFnQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2dyaWRYID0gY3VycmVudExlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fZ3JpZFkgPSBjdXJyZW50VG9wIC0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGNvcnJlY3QgY29udGFpbmVyLFxuICAgICAgLy8gc2V0dXAgdGhlIGFjdHVhbCBkcmFnIHBvc2l0aW9uIGRhdGEgYW5kIGFkanVzdCB0aGUgZWxlbWVudCdzIHRyYW5zbGF0ZVxuICAgICAgLy8gdmFsdWVzIHRvIGFjY291bnQgZm9yIHRoZSBET00gcG9zaXRpb24gc2hpZnQuXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGVmdCA9IGN1cnJlbnRMZWZ0ICsgdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICAgIHRoaXMuX3RvcCA9IGN1cnJlbnRUb3AgKyB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgICAgZHJhZ0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBkcmFnIGNsYXNzIGFuZCBiaW5kIHNjcm9sbGVycy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG4gICAgdGhpcy5fYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gRW1pdCBkcmFnU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdTdGFydCwgaXRlbSwgZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIG1vdmUgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB2YXIgeERpZmYgPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggKz0geERpZmY7XG4gICAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCArPSB4RGlmZjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB2YXIgeURpZmYgPSBldmVudC5jbGllbnRZIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFk7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZICs9IHlEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBldmVudCBkYXRhLlxuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gbW92ZSBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTW92ZVRpY2soaXRlbS5faWQsIHRoaXMuX3ByZXBhcmVNb3ZlLCB0aGlzLl9hcHBseU1vdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3IgbW92aW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCF0aGlzLl9pdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gSWYgZHJhZyBzb3J0IGlzIGVuYWJsZWQgLT4gY2hlY2sgb3ZlcmxhcC5cbiAgICBpZiAodGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydCkge1xuICAgICAgaWYgKHRoaXMuX2NoZWNrSGV1cmlzdGljcyh0aGlzLl9kcmFnRXZlbnQpKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBtb3ZlbWVudCB0byBkcmFnZ2VkIGl0ZW0uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYXBwbHlNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ01vdmUgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ01vdmUsIGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc2Nyb2xsIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TY3JvbGwgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFzdCBzY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fc2Nyb2xsRXZlbnQgPSBldmVudDtcblxuICAgIC8vIERvIHNjcm9sbCBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkU2Nyb2xsVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZVNjcm9sbCwgdGhpcy5fYXBwbHlTY3JvbGwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3Igc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVTY3JvbGwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUgZG8gbm90aGluZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGF4aXMgPSBzZXR0aW5ncy5kcmFnQXhpcztcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBDYWxjdWxhdGUgZWxlbWVudCdzIHJlY3QgYW5kIHgveSBkaWZmLlxuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgeERpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB2YXIgeURpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBkaWZmLlxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRoaXMuX2NvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggPSB0aGlzLl9sZWZ0IC0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHZlcnRpY2FsIHBvc2l0aW9uIGRhdGEuXG4gICAgaWYgKGF4aXMgIT09ICd4Jykge1xuICAgICAgdGhpcy5fdG9wICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFkgPSB0aGlzLl90b3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICB9XG5cbiAgICAvLyBPdmVybGFwIGhhbmRsaW5nLlxuICAgIGlmIChzZXR0aW5ncy5kcmFnU29ydCkgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgfTtcblxuICAvKipcbiAgICogQXBwbHkgc2Nyb2xsIHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50J3MgdHJhbnNsYXRlWC9ZIHZhbHVlcy5cbiAgICBpdGVtLl9lbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ1Njcm9sbCwgaXRlbSwgdGhpcy5fc2Nyb2xsRXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gRmluaXNoIGN1cnJlbnRseSBxdWV1ZWQgb3ZlcmxhcCBjaGVjay5cbiAgICBzZXR0aW5ncy5kcmFnU29ydCAmJiB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnZmluaXNoJyk7XG5cbiAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVycy5cbiAgICB0aGlzLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMoKTtcblxuICAgIC8vIFNldHVwIHJlbGVhc2UgZGF0YS5cbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZID0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIG5hbWUgZnJvbSBlbGVtZW50LlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcblxuICAgIC8vIEVtaXQgZHJhZ0VuZCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0VuZCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gRmluaXNoIHVwIHRoZSBtaWdyYXRpb24gcHJvY2VzcyBvciBzdGFydCB0aGUgcmVsZWFzZSBwcm9jZXNzLlxuICAgIHRoaXMuX2lzTWlncmF0aW5nID8gdGhpcy5fZmluaXNoTWlncmF0aW9uKCkgOiByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgaGVscGVyc1xuICAgKiAqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBob3cgbWFueSBwZXJjZW50IHRoZSBpbnRlcnNlY3Rpb24gYXJlYSBvZiB0d28gcmVjdGFuZ2xlcyBpcyBmcm9tXG4gICAqIHRoZSBtYXhpbXVtIHBvdGVudGlhbCBpbnRlcnNlY3Rpb24gYXJlYSBiZXR3ZWVuIHRoZSByZWN0YW5nbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKiAgIC0gQSBudW1iZXIgYmV0d2VlbiAwLTEwMC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlY3RPdmVybGFwU2NvcmUoYSwgYikge1xuICAgIC8vIFJldHVybiAwIGltbWVkaWF0ZWx5IGlmIHRoZSByZWN0YW5nbGVzIGRvIG5vdCBvdmVybGFwLlxuICAgIGlmIChcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0IHx8XG4gICAgICBiLmxlZnQgKyBiLndpZHRoIDw9IGEubGVmdCB8fFxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCB8fFxuICAgICAgYi50b3AgKyBiLmhlaWdodCA8PSBhLnRvcFxuICAgICkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBhcmVhJ3Mgd2lkdGgsIGhlaWdodCwgbWF4IGhlaWdodCBhbmQgbWF4IHdpZHRoLlxuICAgIHZhciB3aWR0aCA9IE1hdGgubWluKGEubGVmdCArIGEud2lkdGgsIGIubGVmdCArIGIud2lkdGgpIC0gTWF0aC5tYXgoYS5sZWZ0LCBiLmxlZnQpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLm1pbihhLnRvcCArIGEuaGVpZ2h0LCBiLnRvcCArIGIuaGVpZ2h0KSAtIE1hdGgubWF4KGEudG9wLCBiLnRvcCk7XG4gICAgdmFyIG1heFdpZHRoID0gTWF0aC5taW4oYS53aWR0aCwgYi53aWR0aCk7XG4gICAgdmFyIG1heEhlaWdodCA9IE1hdGgubWluKGEuaGVpZ2h0LCBiLmhlaWdodCk7XG5cbiAgICByZXR1cm4gKCh3aWR0aCAqIGhlaWdodCkgLyAobWF4V2lkdGggKiBtYXhIZWlnaHQpKSAqIDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciBlbGVtZW50IGFuZCBvcGVuIHRoZSBocmVmIHVybCBpZiBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlbkFuY2hvckhyZWYoZWxlbWVudCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhbmNob3IgZWxlbWVudC5cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdhJykgcmV0dXJuO1xuXG4gICAgLy8gR2V0IGhyZWYgYW5kIG1ha2Ugc3VyZSBpdCBleGlzdHMuXG4gICAgdmFyIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGlmICghaHJlZikgcmV0dXJuO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBuYXZpZ2F0ZSB0byB0aGUgbGluayBocmVmLlxuICAgIHZhciB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGhyZWYsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhZyBwbGFjZWhvbGRlci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWdQbGFjZWhvbGRlcihpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX25leHRMZWZ0ID0gMDtcbiAgICB0aGlzLl9uZXh0VG9wID0gMDtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG5cbiAgICAvLyBCaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIHRoaXMuX29uTGF5b3V0U3RhcnQgPSB0aGlzLl9vbkxheW91dFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25MYXlvdXRFbmQgPSB0aGlzLl9vbkxheW91dEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uUmVsZWFzZUVuZCA9IHRoaXMuX29uUmVsZWFzZUVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTWlncmF0ZSA9IHRoaXMuX29uTWlncmF0ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTW92ZSBwbGFjZWhvbGRlciB0byBhIG5ldyBwb3NpdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRTdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmluZCBvdXQgdGhlIGl0ZW0ncyBuZXcgKHVuYXBwbGllZCkgbGVmdCBhbmQgdG9wIHBvc2l0aW9uLlxuICAgIHZhciBpdGVtSW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBuZXh0TGVmdCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyXTtcbiAgICB2YXIgbmV4dFRvcCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyICsgMV07XG5cbiAgICAvLyBJZiBpdGVtJ3MgcG9zaXRpb24gZGlkIG5vdCBjaGFuZ2UgYW5kIHRoZSBpdGVtIGRpZCBub3QgbWlncmF0ZSB3ZSBjYW5cbiAgICAvLyBzYWZlbHkgc2tpcCBsYXlvdXQuXG4gICAgaWYgKCF0aGlzLl9kaWRNaWdyYXRlICYmIGl0ZW0uX2xlZnQgPT09IG5leHRMZWZ0ICYmIGl0ZW0uX3RvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNsb3RzIGRhdGEgaXMgY2FsY3VsYXRlZCB3aXRoIGl0ZW0gbWFyZ2lucyBhZGRlZCB0byB0aGVtIHNvIHdlIG5lZWQgdG8gYWRkXG4gICAgLy8gaXRlbSdzIGxlZnQgYW5kIHRvcCBtYXJnaW4gdG8gdGhlIHNsb3QgZGF0YSB0byBnZXQgdGhlIHBsYWNlaG9sZGVyJ3NcbiAgICAvLyBuZXh0IHBvc2l0aW9uLlxuICAgIG5leHRMZWZ0ICs9IGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgbmV4dFRvcCArPSBpdGVtLl9tYXJnaW5Ub3A7XG5cbiAgICAvLyBKdXN0IHNuYXAgdG8gbmV3IHBvc2l0aW9uIHdpdGhvdXQgYW55IGFuaW1hdGlvbnMgaWYgbm8gYW5pbWF0aW9uIGlzXG4gICAgLy8gcmVxdWlyZWQgb3IgaWYgcGxhY2Vob2xkZXIgbW92ZXMgYmV0d2VlbiBncmlkcy5cbiAgICB2YXIgYW5pbUVuYWJsZWQgPSBncmlkLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb24gPiAwO1xuICAgIGlmICghYW5pbUVuYWJsZWQgfHwgdGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgLy8gQ2FuY2VsIHBvdGVudGlhbCAocXVldWVkKSBsYXlvdXQgdGljay5cbiAgICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAgIC8vIFNuYXAgcGxhY2Vob2xkZXIgdG8gY29ycmVjdCBwb3NpdGlvbi5cbiAgICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuICAgICAgaWYgKHRoaXMuX2FuaW1hdGUuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICB0aGlzLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBNb3ZlIHBsYWNlaG9sZGVyIGluc2lkZSBjb3JyZWN0IGNvbnRhaW5lciBhZnRlciBtaWdyYXRpb24uXG4gICAgICBpZiAodGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgICBncmlkLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIHBsYWNlaG9sZGVyJ3MgbGF5b3V0IGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrLiBXZSBkbyB0aGlzIHRvXG4gICAgLy8gYXZvaWQgbGF5b3V0IHRocmFzaGluZy5cbiAgICB0aGlzLl9uZXh0TGVmdCA9IG5leHRMZWZ0O1xuICAgIHRoaXMuX25leHRUb3AgPSBuZXh0VG9wO1xuICAgIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBwbGFjZWhvbGRlciBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZSh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdGhpcy5fY3VycmVudExlZnQ7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0aGlzLl9jdXJyZW50VG9wO1xuICAgIHZhciBuZXh0TGVmdCA9IHRoaXMuX25leHRMZWZ0O1xuICAgIHZhciBuZXh0VG9wID0gdGhpcy5fbmV4dFRvcDtcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhuZXh0TGVmdCwgbmV4dFRvcCkgfTtcblxuICAgIC8vIElmIHBsYWNlaG9sZGVyIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBqdXN0IHN0b3AgYW5pbWF0aW9uXG4gICAgLy8gYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoY3VycmVudExlZnQgPT09IG5leHRMZWZ0ICYmIGN1cnJlbnRUb3AgPT09IG5leHRUb3ApIHtcbiAgICAgIGlmIChhbmltYXRpb24uaXNBbmltYXRpbmcoKSkgYW5pbWF0aW9uLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbGV0J3Mgc3RhcnQgdGhlIGFuaW1hdGlvbi5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9pdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyO1xuICAgIHZhciBjdXJyZW50U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfTtcbiAgICBhbmltYXRpb24uc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICBkdXJhdGlvbjogc2V0dGluZ3MuZHVyYXRpb24sXG4gICAgICBlYXNpbmc6IHNldHRpbmdzLmVhc2luZyxcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9vbkxheW91dEVuZFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTGF5b3V0RW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBkcmFnUmVsZWFzZUVuZCBldmVudCBpc1xuICAgKiBlbWl0dGVkIGFuZCByZWNlaXZlcyB0aGUgZXZlbnQgZGF0YSBhcyBpdCdzIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25SZWxlYXNlRW5kID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpdGVtLl9pZCA9PT0gdGhpcy5faXRlbS5faWQpIHtcbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpcyBub3QgYW5pbWF0aW5nIGFueW1vcmUgd2UgY2FuIHNhZmVseSByZXNldCBpdC5cbiAgICAgIGlmICghdGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcGxhY2Vob2xkZXIgaXRlbSBpcyBzdGlsbCBhbmltYXRpbmcgaGVyZSwgbGV0J3Mgd2FpdCBmb3IgaXQgdG9cbiAgICAgIC8vIGZpbmlzaCBpdCdzIGFuaW1hdGlvbi5cbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTWlncmF0aW9uIHN0YXJ0IGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBiZWZvcmVTZW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge0l0ZW19IGRhdGEuaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGRhdGEuZnJvbUdyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEuZnJvbUluZGV4XG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS50b0dyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEudG9JbmRleFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTWlncmF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIG1hdGNoaW5nIGl0ZW0uXG4gICAgaWYgKGRhdGEuaXRlbSAhPT0gdGhpcy5faXRlbSkgcmV0dXJuO1xuXG4gICAgdmFyIGdyaWQgPSB0aGlzLl9pdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgbmV4dEdyaWQgPSBkYXRhLnRvR3JpZDtcblxuICAgIC8vIFVuYmluZCBsaXN0ZW5lcnMgZnJvbSBjdXJyZW50IGdyaWQuXG4gICAgZ3JpZC5vZmYoZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBncmlkLm9mZihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9mZihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBCaW5kIGxpc3RlbmVycyB0byB0aGUgbmV4dCBncmlkLlxuICAgIG5leHRHcmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBtaWdyYXRlZC5cbiAgICB0aGlzLl9kaWRNaWdyYXRlID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ3JlYXRlIHBsYWNlaG9sZGVyLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgb25seSB3cml0ZXMgdG8gRE9NIGFuZCBkb2VzIG5vdFxuICAgKiByZWFkIGFueXRoaW5nIGZyb20gRE9NIHNvIGl0IHNob3VsZCBub3QgY2F1c2UgYW55IGFkZGl0aW9uYWwgbGF5b3V0XG4gICAqIHRocmFzaGluZyB3aGVuIGl0J3MgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRyYWcgc3RhcnQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHBsYWNlaG9sZGVyIHNldCB1cCB3ZSBjYW4gc2tpcCB0aGUgaW5pdGlhdGlvbiBsb2dpYy5cbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB2YXIgZWxlbWVudDtcbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQgPSBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCB0byBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIEFkZCBwbGFjZWhvbGRlciBjbGFzcyB0byB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jbGFzc05hbWUgPSBzZXR0aW5ncy5pdGVtUGxhY2Vob2xkZXJDbGFzcyB8fCAnJztcbiAgICBpZiAodGhpcy5fY2xhc3NOYW1lKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCB0aGlzLl9jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIHRoZSBwbGFjZWhvbGRlciBpdGVtIGNvcnJlY3RseS5cbiAgICB2YXIgbGVmdCA9IGl0ZW0uX2xlZnQgKyBpdGVtLl9tYXJnaW5MZWZ0O1xuICAgIHZhciB0b3AgPSBpdGVtLl90b3AgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgc2V0U3R5bGVzKGVsZW1lbnQsIHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgd2lkdGg6IGl0ZW0uX3dpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogaXRlbS5faGVpZ2h0ICsgJ3B4JyxcbiAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGxlZnQsIHRvcClcbiAgICB9KTtcblxuICAgIC8vIEJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vbihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gb25DcmVhdGUgaG9vay5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHRoZSBwbGFjZWhvbGRlciBlbGVtZW50IHRvIHRoZSBncmlkLlxuICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBwbGFjZWhvbGRlciBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRlO1xuXG4gICAgLy8gUmVzZXQgZmxhZy5cbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG5cbiAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBSZXNldCBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLnN0b3AoKTtcbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBudWxsO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIFJlbW92ZSBwbGFjZWhvbGRlciBjbGFzcyBmcm9tIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgICB0aGlzLl9jbGFzc05hbWUgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudC5cbiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBvblJlbW92ZSBob29rLiBOb3RlIHRoYXQgaGVyZSB3ZSB1c2UgdGhlIGN1cnJlbnQgZ3JpZCdzIG9uUmVtb3ZlIGNhbGxiYWNrXG4gICAgLy8gc28gaWYgdGhlIGl0ZW0gaGFzIG1pZ3JhdGVkIGR1cmluZyBkcmFnIHRoZSBvblJlbW92ZSBtZXRob2Qgd2lsbCBub3QgYmVcbiAgICAvLyB0aGUgb3JpZ2luYXRpbmcgZ3JpZCdzIG1ldGhvZC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtoZWlnaHR9IGhlaWdodFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUudXBkYXRlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwge1xuICAgICAgICB3aWR0aDogd2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCArICdweCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGxhY2Vob2xkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAodmlzaWJsZSkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9lbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHBsYWNlaG9sZGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fYW5pbWF0ZSA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFF1ZXVlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBZGQgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9xdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJvY2VzcyBxdWV1ZSBjYWxsYmFja3MgYW5kIHJlc2V0IHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUXVldWUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Kn0gYXJnMVxuICAgKiBAcGFyYW0geyp9IGFyZzJcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYXJnMSwgYXJnMikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUXVpdCBlYXJseSBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgaWYgKCFsZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHNpbmdsZUNhbGxiYWNrID0gbGVuZ3RoID09PSAxO1xuICAgIHZhciBzbmFwc2hvdCA9IHNpbmdsZUNhbGxiYWNrID8gcXVldWVbMF0gOiBxdWV1ZS5zbGljZSgwKTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgY2FsbGJhY2sgbGV0J3MganVzdCBjYWxsIGl0LlxuICAgIGlmIChzaW5nbGVDYWxsYmFjaykge1xuICAgICAgc25hcHNob3QoYXJnMSwgYXJnMik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlIGNhbGxiYWNrcywgbGV0J3MgcHJvY2VzcyB0aGVtLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgc25hcHNob3RbaV0oYXJnMSwgYXJnMik7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IFF1ZXVlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogTGF5b3V0IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1MYXlvdXQoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0ludGVycnVwdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX3RhcmdldFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gMDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gMDtcbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gMDtcbiAgICB0aGlzLl9vZmZzZXRUb3AgPSAwO1xuICAgIHRoaXMuX3NraXBOZXh0QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMgPSB7XG4gICAgICBvbkZpbmlzaDogdGhpcy5fZmluaXNoLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cbiAgICAvLyBCaW5kIGFuaW1hdGlvbiBoYW5kbGVycyBhbmQgZmluaXNoIG1ldGhvZC5cbiAgICB0aGlzLl9zZXR1cEFuaW1hdGlvbiA9IHRoaXMuX3NldHVwQW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24gPSB0aGlzLl9zdGFydEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGl0ZW0gbGF5b3V0IGJhc2VkIG9uIGl0J3MgY3VycmVudCBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGdyaWRTZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgaXNQb3NpdGlvbmluZyA9IHRoaXMuX2lzQWN0aXZlO1xuICAgIHZhciBpc0p1c3RSZWxlYXNlZCA9IHJlbGVhc2UuX2lzQWN0aXZlICYmIHJlbGVhc2UuX2lzUG9zaXRpb25pbmdTdGFydGVkID09PSBmYWxzZTtcbiAgICB2YXIgYW5pbUR1cmF0aW9uID0gaXNKdXN0UmVsZWFzZWRcbiAgICAgID8gZ3JpZFNldHRpbmdzLmRyYWdSZWxlYXNlRHVyYXRpb25cbiAgICAgIDogZ3JpZFNldHRpbmdzLmxheW91dER1cmF0aW9uO1xuICAgIHZhciBhbmltRWFzaW5nID0gaXNKdXN0UmVsZWFzZWQgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VFYXNpbmcgOiBncmlkU2V0dGluZ3MubGF5b3V0RWFzaW5nO1xuICAgIHZhciBhbmltRW5hYmxlZCA9ICFpbnN0YW50ICYmICF0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiAmJiBhbmltRHVyYXRpb24gPiAwO1xuICAgIHZhciBpc0FuaW1hdGluZztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBwb3NpdGlvbmluZyBwcm9jZXNzIGN1cnJlbnQgbGF5b3V0IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIG9uLlxuICAgIGlmIChpc1Bvc2l0aW9uaW5nKSB0aGlzLl9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIE1hcmsgcmVsZWFzZSBwb3NpdGlvbmluZyBhcyBzdGFydGVkLlxuICAgIGlmIChpc0p1c3RSZWxlYXNlZCkgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgLy8gUHVzaCB0aGUgY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGlmIChpc0Z1bmN0aW9uKG9uRmluaXNoKSkgdGhpcy5fcXVldWUuYWRkKG9uRmluaXNoKTtcblxuICAgIC8vIElmIG5vIGFuaW1hdGlvbnMgYXJlIG5lZWRlZCwgZWFzeSBwZWFzeSFcbiAgICBpZiAoIWFuaW1FbmFibGVkKSB7XG4gICAgICB0aGlzLl91cGRhdGVPZmZzZXRzKCk7XG4gICAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcbiAgICAgIGlzQW5pbWF0aW5nID0gaXRlbS5fYW5pbWF0ZS5pc0FuaW1hdGluZygpO1xuICAgICAgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgIWlzQW5pbWF0aW5nICYmIHNldFN0eWxlcyhlbGVtZW50LCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBhY3RpdmUgYW5kIHN0b3JlIHNvbWUgZGF0YSBmb3IgdGhlIGFuaW1hdGlvbiB0aGF0IGlzIGFib3V0IHRvIGJlXG4gICAgLy8gdHJpZ2dlcmVkLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucy5lYXNpbmcgPSBhbmltRWFzaW5nO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmR1cmF0aW9uID0gYW5pbUR1cmF0aW9uO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBpc1Bvc2l0aW9uaW5nO1xuXG4gICAgLy8gU3RhcnQgdGhlIGl0ZW0ncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTGF5b3V0VGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIGl0ZW0ncyBwb3NpdGlvbiBhbmltYXRpb24gaWYgaXQgaXMgY3VycmVudGx5IGFuaW1hdGluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHJvY2Vzc0NhbGxiYWNrUXVldWU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKiBAcmV0dXJucyB7SXRlbUxheW91dH1cbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihwcm9jZXNzQ2FsbGJhY2tRdWV1ZSwgdGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIGluaXQuXG4gICAgY2FuY2VsTGF5b3V0VGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBTdG9wIGFuaW1hdGlvbi5cbiAgICBpdGVtLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcblxuICAgIC8vIFJlbW92ZSBwb3NpdGlvbmluZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgYWN0aXZlIHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAvLyBQcm9jZXNzIGNhbGxiYWNrIHF1ZXVlIGlmIG5lZWRlZC5cbiAgICBpZiAocHJvY2Vzc0NhbGxiYWNrUXVldWUpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUsIHt9KTtcbiAgICB0aGlzLl9xdWV1ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5faXRlbSA9IHRoaXMuX2N1cnJlbnRTdHlsZXMgPSB0aGlzLl90YXJnZXRTdHlsZXMgPSB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBjdXJyZW50IGxheW91dCBvZmZzZXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlT2Zmc2V0cyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogMDtcblxuICAgIHRoaXMuX29mZnNldFRvcCA9IHJlbGVhc2UuX2lzQWN0aXZlXG4gICAgICA/IHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IG1pZ3JhdGUuX2lzQWN0aXZlXG4gICAgICA/IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBsYXlvdXQgdGFyZ2V0IHN0eWxlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlVGFyZ2V0U3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgIHRoaXMuX2l0ZW0uX2xlZnQgKyB0aGlzLl9vZmZzZXRMZWZ0LFxuICAgICAgdGhpcy5faXRlbS5fdG9wICsgdGhpcy5fb2Zmc2V0VG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGl0ZW0gbGF5b3V0IHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIE1hcmsgdGhlIGl0ZW0gYXMgaW5hY3RpdmUgYW5kIHJlbW92ZSBwb3NpdGlvbmluZyBjbGFzc2VzLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gRmluaXNoIHVwIHJlbGVhc2UgYW5kIG1pZ3JhdGlvbi5cbiAgICBpZiAocmVsZWFzZS5faXNBY3RpdmUpIHJlbGVhc2Uuc3RvcCgpO1xuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkgbWlncmF0ZS5zdG9wKCk7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgaXRlbSBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2l0ZW0uX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIG9mZnNldCBkYXRhIGFuZCB0YXJnZXQgc3R5bGVzLlxuICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmIChcbiAgICAgIGl0ZW0uX2xlZnQgPT09IHRoaXMuX2N1cnJlbnRMZWZ0IC0gdGhpcy5fb2Zmc2V0TGVmdCAmJlxuICAgICAgaXRlbS5fdG9wID09PSB0aGlzLl9jdXJyZW50VG9wIC0gdGhpcy5fb2Zmc2V0VG9wXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5faXNJbnRlcnJ1cHRlZCkgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtJ3MgcG9zaXRpb25pbmcgY2xhc3MgaWYgbmVlZGVkLlxuICAgIGlmICghdGhpcy5faXNJbnRlcnJ1cHRlZCkge1xuICAgICAgYWRkQ2xhc3MoaXRlbS5fZWxlbWVudCwgc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIEdldCBjdXJyZW50IHN0eWxlcyBmb3IgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2N1cnJlbnRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2N1cnJlbnRMZWZ0LCB0aGlzLl9jdXJyZW50VG9wKTtcblxuICAgIC8vIEFuaW1hdGUuXG4gICAgaXRlbS5fYW5pbWF0ZS5zdGFydCh0aGlzLl9jdXJyZW50U3R5bGVzLCB0aGlzLl90YXJnZXRTdHlsZXMsIHRoaXMuX2FuaW1hdGVPcHRpb25zKTtcbiAgfTtcblxuICB2YXIgdGVtcFN0eWxlcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWlncmF0ZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1NaWdyYXRlKGl0ZW0pIHtcbiAgICAvLyBQcml2YXRlIHByb3BzLlxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBtaWdyYXRlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZH0gdGFyZ2V0R3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtjb250YWluZXJdXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHRhcmdldEdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaXNWaXNpYmxlID0gaXRlbS5pc1Zpc2libGUoKTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0YXJnZXRHcmlkLl9pdGVtcztcbiAgICB2YXIgY3VycmVudEluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gY29udGFpbmVyIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciB0YXJnZXRJbmRleDtcbiAgICB2YXIgdGFyZ2V0SXRlbTtcbiAgICB2YXIgY3VycmVudENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcbiAgICB2YXIgY29udGFpbmVyRGlmZjtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciB0cmFuc2xhdGVYO1xuICAgIHZhciB0cmFuc2xhdGVZO1xuXG4gICAgLy8gR2V0IHRhcmdldCBpbmRleC5cbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEl0ZW1zLCBwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEl0ZW0gPSB0YXJnZXRHcmlkLl9nZXRJdGVtKHBvc2l0aW9uKTtcbiAgICAgIC8qKiBAdG9kbyBDb25zaWRlciB0aHJvd2luZyBhbiBlcnJvciBoZXJlIGluc3RlYWQgb2Ygc2lsZW50bHkgZmFpbGluZy4gKi9cbiAgICAgIGlmICghdGFyZ2V0SXRlbSkgcmV0dXJuIHRoaXM7XG4gICAgICB0YXJnZXRJbmRleCA9IHRhcmdldEl0ZW1zLmluZGV4T2YodGFyZ2V0SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgaWYgbmVlZGVkLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSB8fCB0aGlzLl9pc0FjdGl2ZSB8fCBpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHBvc2l0aW9uaW5nLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IG1pZ3JhdGlvbi5cbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgdGhpcy5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gQWJvcnQgY3VycmVudCByZWxlYXNlLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IGl0ZW0uX3JlbGVhc2UuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgaXRlbS5fcmVsZWFzZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHZpc2liaWxpdHkgYW5pbWF0aW9ucy5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9zdG9wQW5pbWF0aW9uKCk7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy5cbiAgICBpZiAoaXRlbS5fZHJhZykgaXRlbS5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBQcm9jZXNzIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb24gcXVldWUuXG4gICAgaXRlbS5fdmlzaWJpbGl0eS5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlUmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICBncmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBhcnJheUluc2VydCh0YXJnZXRJdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICBpdGVtLl9ncmlkSWQgPSB0YXJnZXRHcmlkLl9pZDtcblxuICAgIC8vIEdldCBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIGN1cnJlbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgaWYgKCF0cmFuc2xhdGUpIHtcbiAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICB0cmFuc2xhdGVYID0gdHJhbnNsYXRlLng7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgIHRyYW5zbGF0ZVggKyBvZmZzZXREaWZmLmxlZnQsXG4gICAgICAgIHRyYW5zbGF0ZVkgKyBvZmZzZXREaWZmLnRvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2hpbGQgZWxlbWVudCdzIHN0eWxlcyB0byByZWZsZWN0IHRoZSBjdXJyZW50IHZpc2liaWxpdHkgc3RhdGUuXG4gICAgaXRlbS5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNWaXNpYmxlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBVcGRhdGUgZGlzcGxheSBzdHlsZS5cbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBpc1Zpc2libGUgPyAnYmxvY2snIDogJ2hpZGRlbic7XG5cbiAgICAvLyBHZXQgb2Zmc2V0IGRpZmYgZm9yIHRoZSBtaWdyYXRpb24gZGF0YS5cbiAgICBjb250YWluZXJEaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEVsZW1lbnQsIHRydWUpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDcmVhdGUgbmV3IGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gU2V0dXAgbWlncmF0aW9uIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IGNvbnRhaW5lckRpZmYubGVmdDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IGNvbnRhaW5lckRpZmYudG9wO1xuXG4gICAgLy8gRW1pdCBzZW5kIGV2ZW50LlxuICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRTZW5kKSkge1xuICAgICAgZ3JpZC5fZW1pdChldmVudFNlbmQsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50UmVjZWl2ZSwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIG1pZ3JhdGUgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIG1pZ3JhdGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIG1pZ3JhdGlvbiBiZSBhYm9ydGVkP1xuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgZ3JpZEVsZW1lbnQgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICBpZiAodGhpcy5fY29udGFpbmVyICE9PSBncmlkRWxlbWVudCkge1xuICAgICAgaWYgKCFjdXJyZW50U3R5bGVzKSB7XG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzO1xuICAgICAgfVxuICAgICAgZ3JpZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzJDEgPSB7fTtcblxuICAvKipcbiAgICogVGhlIHJlbGVhc2UgcHJvY2VzcyBoYW5kbGVyIGNvbnN0cnVjdG9yLiBBbHRob3VnaCB0aGlzIG1pZ2h0IHNlZW0gYXMgcHJvcGVyXG4gICAqIGZpdCBmb3IgdGhlIGRyYWcgcHJvY2VzcyB0aGlzIG5lZWRzIHRvIGJlIHNlcGFyYXRlZCBpbnRvIGl0J3Mgb3duIGxvZ2ljXG4gICAqIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgYSBzY2VuYXJpbyB3aGVyZSBkcmFnIGlzIGRpc2FibGVkLCBidXQgdGhlIHJlbGVhc2VcbiAgICogcHJvY2VzcyBzdGlsbCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCAoZHJhZ2dpbmcgZnJvbSBhIGdyaWQgdG8gYW5vdGhlcikuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1SZWxlYXNlKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcblxuICAgIC8vIEZsYWcgcmVsZWFzZSBhcyBhY3RpdmUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuXG4gICAgLy8gQWRkIHJlbGVhc2UgY2xhc3MgbmFtZSB0byB0aGUgcmVsZWFzZWQgZWxlbWVudC5cbiAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZVN0YXJ0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZVN0YXJ0LCBpdGVtKTtcblxuICAgIC8vIFBvc2l0aW9uIHRoZSByZWxlYXNlZCBpdGVtLlxuICAgIGl0ZW0uX2xheW91dC5zdGFydChmYWxzZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW5kIHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWJvcnQgYW5cbiAgICogb25nb2luZyByZWxlYXNlIHByb2Nlc3MgKGFuaW1hdGlvbikgb3IgZmluaXNoIHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFthYm9ydD1mYWxzZV1cbiAgICogIC0gU2hvdWxkIHRoZSByZWxlYXNlIGJlIGFib3J0ZWQ/IFdoZW4gdHJ1ZSwgdGhlIHJlbGVhc2UgZW5kIGV2ZW50IHdvbid0IGJlXG4gICAqICAgIGVtaXR0ZWQuIFNldCB0byB0cnVlIG9ubHkgd2hlbiB5b3UgbmVlZCB0byBhYm9ydCB0aGUgcmVsZWFzZSBwcm9jZXNzXG4gICAqICAgIHdoaWxlIHRoZSBpdGVtIGlzIGFuaW1hdGluZyB0byBpdCdzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgY29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdHJhbnNsYXRlO1xuXG4gICAgLy8gUmVzZXQgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIElmIHRoZSByZWxlYXNlZCBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBwdXQgaXRcbiAgICAvLyBiYWNrIHRoZXJlIGFuZCBhZGp1c3QgcG9zaXRpb24gYWNjb3JkaW5nbHkuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMkMS50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgICAgICB0cmFuc2xhdGUueCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYLFxuICAgICAgICAgICAgdHJhbnNsYXRlLnkgLSB0aGlzLl9jb250YWluZXJEaWZmWVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzJDE7XG4gICAgICB9XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZUVuZCBldmVudC5cbiAgICBpZiAoIWFib3J0KSBncmlkLl9lbWl0KGV2ZW50RHJhZ1JlbGVhc2VFbmQsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVJlbGVhc2V9XG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUpO1xuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBwdWJsaWMgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzUG9zaXRpb25pbmdTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVJlbGVhc2luZ0NsYXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBzdHlsZXMgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIHZhciBjdXJyZW50ID0ge307XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIGN1cnJlbnRbcHJvcF0gPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcCkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpYmlsaXR5IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1WaXNpYmlsaXR5KGl0ZW0pIHtcbiAgICB2YXIgaXNBY3RpdmUgPSBpdGVtLl9pc0FjdGl2ZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9ICFpc0FjdGl2ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gQ2FsbGJhY2sgcXVldWUuXG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgc2hvdy9oaWRlIGZpbmlzaGVycy5cbiAgICB0aGlzLl9maW5pc2hTaG93ID0gdGhpcy5fZmluaXNoU2hvdy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2ZpbmlzaEhpZGUgPSB0aGlzLl9maW5pc2hIaWRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBGb3JjZSBpdGVtIHRvIGJlIGVpdGhlciB2aXNpYmxlIG9yIGhpZGRlbiBvbiBpbml0LlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzQWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgIC8vIFNldCB2aXNpYmxlL2hpZGRlbiBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgc3R5bGVzIGZvciB0aGUgY2hpbGQgZWxlbWVudC5cbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU2hvdyBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIHZpc2libGUgY2FsbCB0aGUgY2FsbGJhY2sgYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZyAmJiAhdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgc2hvd2luZyBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzaG93biBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc1Nob3dpbmcgJiYgIWluc3RhbnQpIHtcbiAgICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBoaWRpbmcgb3IgaGlkZGVuIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc1Nob3dpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgICAgaWYgKCF0aGlzLl9pc0hpZGluZykgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuXG4gICAgLy8gVXBkYXRlIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIGl0ZW0uX2lzQWN0aXZlID0gdGhpcy5faXNTaG93aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IHRoaXMuX2lzSGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIHN0YXJ0IHNob3cgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKHRydWUsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaFNob3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGUgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5zdGFudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKG9uRmluaXNoKSA/IG9uRmluaXNoIDogbnVsbDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBhbHJlYWR5IGhpZGRlbiBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcgJiYgdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgaGlkaW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGhpZGRlbiBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc0hpZGluZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIHNob3dpbmcgb3IgdmlzaWJsZSBwcm9jZXNzIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIHRoZSBpbnRlcnJ1cHRlZCBmbGFnIGFjdGl2ZSwgdXBkYXRlIGNsYXNzZXMgYW5kIHNldCBkaXNwbGF5XG4gICAgLy8gdG8gYmxvY2sgaWYgbmVjZXNzYXJ5LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgdGhpcy5faXNIaWRkZW4gPSB0aGlzLl9pc0hpZGluZyA9IHRydWU7XG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgaGlkZSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24oZmFsc2UsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaEhpZGUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0b3BBbmltYXRpb24oe30pO1xuXG4gICAgLy8gRmlyZSBhbGwgdW5jb21wbGV0ZWQgY2FsbGJhY2tzIHdpdGggaW50ZXJydXB0ZWQgZmxhZyBhbmQgZGVzdHJveSB0aGUgcXVldWUuXG4gICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSkuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIHZpc2libGUvaGlkZGVuIGNsYXNzZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0aGlzLl9pc0hpZGRlbiA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdGFydCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24odG9WaXNpYmxlLCBpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0gdG9WaXNpYmxlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcztcbiAgICB2YXIgZHVyYXRpb24gPSBwYXJzZUludCh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RHVyYXRpb24gOiBzZXR0aW5ncy5oaWRlRHVyYXRpb24pIHx8IDA7XG4gICAgdmFyIGVhc2luZyA9ICh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RWFzaW5nIDogc2V0dGluZ3MuaGlkZUVhc2luZykgfHwgJ2Vhc2UnO1xuICAgIHZhciBpc0luc3RhbnQgPSBpbnN0YW50IHx8IGR1cmF0aW9uIDw9IDA7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXM7XG5cbiAgICAvLyBObyB0YXJnZXQgc3R5bGVzPyBMZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmICghdGFyZ2V0U3R5bGVzKSB7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgdmlzaWJpbGl0eSB0aWNrLlxuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIElmIHdlIG5lZWQgdG8gYXBwbHkgdGhlIHN0eWxlcyBpbnN0YW50bHkgd2l0aG91dCBhbmltYXRpb24uXG4gICAgaWYgKGlzSW5zdGFudCkge1xuICAgICAgaWYgKGl0ZW0uX2FuaW1hdGVDaGlsZC5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIGl0ZW0uX2FuaW1hdGVDaGlsZC5zdG9wKHRhcmdldFN0eWxlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljayAodG8gYXZvaWQgbGF5b3V0IHRocmFzaGluZykuXG4gICAgYWRkVmlzaWJpbGl0eVRpY2soXG4gICAgICBpdGVtLl9pZCxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBjdXJyZW50U3R5bGVzID0gZ2V0Q3VycmVudFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0YXJ0KGN1cnJlbnRTdHlsZXMsIHRhcmdldFN0eWxlcywge1xuICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IGVhc2luZyxcbiAgICAgICAgICBvbkZpbmlzaDogb25GaW5pc2hcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldFN0eWxlc11cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uKHRhcmdldFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtLl9pZCk7XG4gICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIHNob3cgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaFNob3cgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgdGhpcy5faXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmlzaCBoaWRlIHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKi9cbiAgdmFyIGZpbmlzaFN0eWxlcyA9IHt9O1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaEhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2lzSGlkZGVuKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgZmluaXNoU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcbiAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCBmaW5pc2hTdHlsZXMpO1xuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgdmFyIGlkID0gMDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHVuaXF1ZSBudW1lcmljIGlkIChpbmNyZW1lbnRzIGEgYmFzZSB2YWx1ZSBvbiBldmVyeSBjYWxsKS5cbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVVpZCgpIHtcbiAgICByZXR1cm4gKytpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEl0ZW0gaW5zdGFuY2UgZm9yIGEgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzQWN0aXZlXVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbShncmlkLCBlbGVtZW50LCBpc0FjdGl2ZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIGlkLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG5cbiAgICAvLyBSZWZlcmVuY2UgdG8gY29ubmVjdGVkIEdyaWQgaW5zdGFuY2UncyBpZC5cbiAgICB0aGlzLl9ncmlkSWQgPSBncmlkLl9pZDtcblxuICAgIC8vIERlc3Ryb3llZCBmbGFnLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBwb3NpdGlvbnMuXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIFRoZSBlbGVtZW50cy5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5bMF07XG5cbiAgICAvLyBJZiB0aGUgcHJvdmlkZWQgaXRlbSBlbGVtZW50IGlzIG5vdCBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZ3JpZCBjb250YWluZXJcbiAgICAvLyBlbGVtZW50LCBhcHBlbmQgaXQgdG8gdGhlIGdyaWQgY29udGFpbmVyLlxuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgIT09IGdyaWQuX2VsZW1lbnQpIHtcbiAgICAgIGdyaWQuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0gY2xhc3MuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIElmIGlzQWN0aXZlIGlzIG5vdCBkZWZpbmVkLCBsZXQncyB0cnkgdG8gYXV0by1kZXRlY3QgaXQuXG4gICAgaWYgKHR5cGVvZiBpc0FjdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpc0FjdGl2ZSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgIT09ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgYWN0aXZlIHN0YXRlIChkZWZpbmVzIGlmIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgbGF5b3V0XG4gICAgLy8gb3Igbm90KS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGlzQWN0aXZlO1xuXG4gICAgLy8gU2V0IGVsZW1lbnQncyBpbml0aWFsIHBvc2l0aW9uIHN0eWxlcy5cbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcblxuICAgIC8vIEluaXRpYXRlIGl0ZW0ncyBhbmltYXRpb24gY29udHJvbGxlcnMuXG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZShlbGVtZW50KTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQgPSBuZXcgSXRlbUFuaW1hdGUodGhpcy5fY2hpbGQpO1xuXG4gICAgLy8gU2V0dXAgdmlzaWJpbGl0eSBoYW5kbGVyLlxuICAgIHRoaXMuX3Zpc2liaWxpdHkgPSBuZXcgSXRlbVZpc2liaWxpdHkodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbGF5b3V0IGhhbmRsZXIuXG4gICAgdGhpcy5fbGF5b3V0ID0gbmV3IEl0ZW1MYXlvdXQodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbWlncmF0aW9uIGhhbmRsZXIgZGF0YS5cbiAgICB0aGlzLl9taWdyYXRlID0gbmV3IEl0ZW1NaWdyYXRlKHRoaXMpO1xuXG4gICAgLy8gU2V0IHVwIHJlbGVhc2UgaGFuZGxlci4gTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgaXMgZnVsbHkgbGlua2VkIHRvIGRyYWdnaW5nXG4gICAgLy8gdGhpcyBzdGlsbCBuZWVkcyB0byBiZSBhbHdheXMgaW5zdGFudGlhdGVkIHRvIGhhbmRsZSBtaWdyYXRpb24gc2NlbmFyaW9zXG4gICAgLy8gY29ycmVjdGx5LlxuICAgIHRoaXMuX3JlbGVhc2UgPSBuZXcgSXRlbVJlbGVhc2UodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBwbGFjZWhvbGRlciBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG9cbiAgICAvLyBkcmFnZ2luZyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvblxuICAgIC8vIHNjZW5hcmlvcyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fZHJhZ1BsYWNlaG9sZGVyID0gbmV3IEl0ZW1EcmFnUGxhY2Vob2xkZXIodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBoYW5kbGVyLlxuICAgIHRoaXMuX2RyYWcgPSBzZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyh0aGlzKSA6IG51bGw7XG5cbiAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fcmVmcmVzaFNvcnREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBncmlkIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHdpZHRoLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIGhlaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqICAgLSBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIGxlZnQsIHJpZ2h0LCB0b3AgYW5kIGJvdHRvbSBwcm9wZXJ0aWVzXG4gICAqICAgICB3aGljaCBpbmRpY2F0ZSB0aGUgaXRlbSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRNYXJnaW4gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGhpcy5fbWFyZ2luTGVmdCxcbiAgICAgIHJpZ2h0OiB0aGlzLl9tYXJnaW5SaWdodCxcbiAgICAgIHRvcDogdGhpcy5fbWFyZ2luVG9wLFxuICAgICAgYm90dG9tOiB0aGlzLl9tYXJnaW5Cb3R0b21cbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UgZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCBhbmQgdG9wIHByb3BlcnRpZXMgd2hpY2ggaW5kaWNhdGUgdGhlXG4gICAqICAgICBpdGVtIGVsZW1lbnQncyBjYWNoZWQgcG9zaXRpb24gaW4gdGhlIGdyaWQuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9sZWZ0LFxuICAgICAgdG9wOiB0aGlzLl90b3BcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBhY3RpdmU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNWaXNpYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fdmlzaWJpbGl0eSAmJiAhdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRkZW47XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIGFuaW1hdGVkIHRvIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNTaG93aW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNTaG93aW5nKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gaGlkZGVuP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzSGlkaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBwb3NpdGlvbmluZz9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Bvc2l0aW9uaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2xheW91dCAmJiB0aGlzLl9sYXlvdXQuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0RyYWdnaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyByZWxlYXNlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1JlbGVhc2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhISh0aGlzLl9yZWxlYXNlICYmIHRoaXMuX3JlbGVhc2UuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gZGVzdHJveWVkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRGVzdHJveWVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIGl0ZW0ncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbikgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBkcmFnUGxhY2Vob2xkZXIgPSB0aGlzLl9kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbnMgKGlnbm9yZSBuZWdhdGl2ZSBtYXJnaW5zKS5cbiAgICB0aGlzLl9tYXJnaW5MZWZ0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tbGVmdCcpKTtcbiAgICB0aGlzLl9tYXJnaW5SaWdodCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXJpZ2h0JykpO1xuICAgIHRoaXMuX21hcmdpblRvcCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXRvcCcpKTtcbiAgICB0aGlzLl9tYXJnaW5Cb3R0b20gPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1ib3R0b20nKSk7XG5cbiAgICAvLyBLZWVwIGRyYWcgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zIHN5bmNlZCB3aXRoIHRoZSBpdGVtJ3MuXG4gICAgaWYgKGRyYWdQbGFjZWhvbGRlcikge1xuICAgICAgZHJhZ1BsYWNlaG9sZGVyLnVwZGF0ZURpbWVuc2lvbnModGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhbmQgc3RvcmUgaXRlbSdzIHNvcnQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fcmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZGF0YSA9ICh0aGlzLl9zb3J0RGF0YSA9IHt9KTtcbiAgICB2YXIgZ2V0dGVycyA9IHRoaXMuZ2V0R3JpZCgpLl9zZXR0aW5ncy5zb3J0RGF0YTtcbiAgICB2YXIgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBnZXR0ZXJzKSB7XG4gICAgICBkYXRhW3Byb3BdID0gZ2V0dGVyc1twcm9wXSh0aGlzLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnQ9ZmFsc2VdXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKHJlbW92ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBpbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YodGhpcyk7XG5cbiAgICAvLyBEZXN0cm95IGhhbmRsZXJzLlxuICAgIHRoaXMuX3JlbGVhc2UuZGVzdHJveSgpO1xuICAgIHRoaXMuX21pZ3JhdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2xheW91dC5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmlzaWJpbGl0eS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZUNoaWxkLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGlubGluZSBzdHlsZXMuXG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgdGhpcy5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gR3JpZCBpbnN0YW5jZSBpZiBpdCBzdGlsbCBleGlzdHMgdGhlcmUuXG4gICAgaW5kZXggPiAtMSAmJiBncmlkLl9pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET00uXG4gICAgcmVtb3ZlRWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBSZXNldCBzdGF0ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsYXlvdXQgYWxnb3JpdGhtIGZvciBNdXVyaS4gQmFzZWQgb24gTUFYUkVDVFMgYXBwcm9hY2hcbiAgICogYXMgZGVzY3JpYmVkIGJ5IEp1a2thIEp5bMOkbmtpIGluIGhpcyBzdXJ2ZXk6IFwiQSBUaG91c2FuZCBXYXlzIHRvIFBhY2sgdGhlXG4gICAqIEJpbiAtIEEgUHJhY3RpY2FsIEFwcHJvYWNoIHRvIFR3by1EaW1lbnNpb25hbCBSZWN0YW5nbGUgQmluIFBhY2tpbmcuXCIuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUGFja2VyKCkge1xuICAgIHRoaXMuX3Nsb3RzID0gW107XG4gICAgdGhpcy5fc2xvdFNpemVzID0gW107XG4gICAgdGhpcy5fZnJlZVNsb3RzID0gW107XG4gICAgdGhpcy5fbmV3U2xvdHMgPSBbXTtcbiAgICB0aGlzLl9yZWN0SXRlbSA9IHt9O1xuICAgIHRoaXMuX3JlY3RTdG9yZSA9IFtdO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICAvLyBUaGUgbGF5b3V0IHJldHVybiBkYXRhLCB3aGljaCB3aWxsIGJlIHBvcHVsYXRlZCBpbiBnZXRMYXlvdXQuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgc2xvdHM6IG51bGwsXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IGZhbHNlLFxuICAgICAgaGVpZ2h0OiBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBCaW5kIHNvcnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA9IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0ID0gdGhpcy5fc29ydFJlY3RzVG9wTGVmdC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBwYXJhbSB7TnVtYmVyW119IFtzbG90c11cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbGxHYXBzPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnbkJvdHRvbT1mYWxzZV1cbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uKGl0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBzbG90cywgb3B0aW9ucykge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIGZpbGxHYXBzID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmZpbGxHYXBzKTtcbiAgICB2YXIgaXNIb3Jpem9udGFsID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmhvcml6b250YWwpO1xuICAgIHZhciBhbGlnblJpZ2h0ID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduUmlnaHQpO1xuICAgIHZhciBhbGlnbkJvdHRvbSA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGlnbkJvdHRvbSk7XG4gICAgdmFyIHJvdW5kaW5nID0gISEob3B0aW9ucyAmJiBvcHRpb25zLnJvdW5kaW5nKTtcbiAgICB2YXIgc2xvdFNpemVzID0gdGhpcy5fc2xvdFNpemVzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUmVzZXQgbGF5b3V0IGRhdGEuXG4gICAgbGF5b3V0LnNsb3RzID0gc2xvdHMgPyBzbG90cyA6IHRoaXMuX3Nsb3RzO1xuICAgIGxheW91dC53aWR0aCA9IGlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQod2lkdGgpIDogd2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9ICFpc0hvcml6b250YWwgPyAwIDogcm91bmRpbmcgPyBNYXRoLnJvdW5kKGhlaWdodCkgOiBoZWlnaHQ7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gaXNIb3Jpem9udGFsO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSAhaXNIb3Jpem9udGFsO1xuXG4gICAgLy8gTWFrZSBzdXJlIHNsb3RzIGFuZCBzbG90IHNpemUgYXJyYXlzIGFyZSByZXNldC5cbiAgICBsYXlvdXQuc2xvdHMubGVuZ3RoID0gMDtcbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcblxuICAgIC8vIE5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiBpdGVtcyBkbyBub3QgZXhpc3QuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBsYXlvdXQ7XG5cbiAgICAvLyBGaW5kIHNsb3RzIGZvciBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FkZFNsb3QoaXRlbXNbaV0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCBhbGlnblJpZ2h0IHx8IGFsaWduQm90dG9tKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byByaWdodCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25SaWdodCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxheW91dC5zbG90cy5sZW5ndGg7IGkgPSBpICsgMikge1xuICAgICAgICBsYXlvdXQuc2xvdHNbaV0gPSBsYXlvdXQud2lkdGggLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byBib3R0b20gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuXG4gICAgaWYgKGFsaWduQm90dG9tKSB7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC5oZWlnaHQgLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBzbG90cyBhcnJheXMgYW5kIHJlY3QgaWQuXG4gICAgc2xvdFNpemVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fZnJlZVNsb3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fbmV3U2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yZWN0SWQgPSAwO1xuXG4gICAgcmV0dXJuIGxheW91dDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciB0aGUgbGF5b3V0IGl0ZW0uIFJldHVybnMgdGhlIGxlZnQgYW5kIHRvcCBwb3NpdGlvblxuICAgKiBvZiB0aGUgaXRlbSBpbiBwaXhlbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzSG9yaXpvbnRhbFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbGxHYXBzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcm91bmRpbmdcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkU2xvdCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgZXBzID0gMC4wMDE7XG4gICAgdmFyIGl0ZW1TbG90ID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCB0cmFja1NpemUpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgICB2YXIgZnJlZVNsb3RzID0gdGhpcy5fZnJlZVNsb3RzO1xuICAgICAgdmFyIG5ld1Nsb3RzID0gdGhpcy5fbmV3U2xvdHM7XG4gICAgICB2YXIgcmVjdDtcbiAgICAgIHZhciByZWN0SWQ7XG4gICAgICB2YXIgcG90ZW50aWFsU2xvdHM7XG4gICAgICB2YXIgaWdub3JlQ3VycmVudFNsb3RzO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgaWk7XG5cbiAgICAgIC8vIFJlc2V0IG5ldyBzbG90cy5cbiAgICAgIG5ld1Nsb3RzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIFNldCBpdGVtIHNsb3QgaW5pdGlhbCBkYXRhLlxuICAgICAgaXRlbVNsb3QubGVmdCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC50b3AgPSBudWxsO1xuICAgICAgaXRlbVNsb3Qud2lkdGggPSBpdGVtLl93aWR0aCArIGl0ZW0uX21hcmdpbkxlZnQgKyBpdGVtLl9tYXJnaW5SaWdodDtcbiAgICAgIGl0ZW1TbG90LmhlaWdodCA9IGl0ZW0uX2hlaWdodCArIGl0ZW0uX21hcmdpblRvcCArIGl0ZW0uX21hcmdpbkJvdHRvbTtcblxuICAgICAgLy8gUm91bmQgaXRlbSBzbG90IHdpZHRoIGFuZCBoZWlnaHQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvdW5kaW5nKSB7XG4gICAgICAgIGl0ZW1TbG90LndpZHRoID0gTWF0aC5yb3VuZChpdGVtU2xvdC53aWR0aCk7XG4gICAgICAgIGl0ZW1TbG90LmhlaWdodCA9IE1hdGgucm91bmQoaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBzbG90IGZvciB0aGUgaXRlbS5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIGlmIChpdGVtU2xvdC53aWR0aCA8PSByZWN0LndpZHRoICsgZXBzICYmIGl0ZW1TbG90LmhlaWdodCA8PSByZWN0LmhlaWdodCArIGVwcykge1xuICAgICAgICAgIGl0ZW1TbG90LmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgICAgICAgaXRlbVNsb3QudG9wID0gcmVjdC50b3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc2xvdCB3YXMgZm91bmQgZm9yIHRoZSBpdGVtLlxuICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gUG9zaXRpb24gdGhlIGl0ZW0gaW4gdG8gdGhlIGJvdHRvbSBsZWZ0ICh2ZXJ0aWNhbCBtb2RlKSBvciB0b3AgcmlnaHRcbiAgICAgICAgLy8gKGhvcml6b250YWwgbW9kZSkgb2YgdGhlIGdyaWQuXG4gICAgICAgIGl0ZW1TbG90LmxlZnQgPSAhaXNIb3Jpem9udGFsID8gMCA6IGxheW91dC53aWR0aDtcbiAgICAgICAgaXRlbVNsb3QudG9wID0gIWlzSG9yaXpvbnRhbCA/IGxheW91dC5oZWlnaHQgOiAwO1xuXG4gICAgICAgIC8vIElmIGdhcHMgZG9uJ3QgbmVlZCBmaWxsaW5nIGRvIG5vdCBhZGQgYW55IGN1cnJlbnQgc2xvdHMgdG8gdGhlIG5ld1xuICAgICAgICAvLyBzbG90cyBhcnJheS5cbiAgICAgICAgaWYgKCFmaWxsR2Fwcykge1xuICAgICAgICAgIGlnbm9yZUN1cnJlbnRTbG90cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW4gdmVydGljYWwgbW9kZSwgaWYgdGhlIGl0ZW0ncyBib3R0b20gb3ZlcmxhcHMgdGhlIGdyaWQncyBib3R0b20uXG4gICAgICBpZiAoIWlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQgPiBsYXlvdXQuaGVpZ2h0KSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIGxlZnQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ID4gMCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2godGhpcy5fYWRkUmVjdCgwLCBsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC5sZWZ0LCBJbmZpbml0eSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgcmlnaHQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPCBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoLFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0LFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGggLSBpdGVtU2xvdC5sZWZ0IC0gaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIGhlaWdodC5cbiAgICAgICAgbGF5b3V0LmhlaWdodCA9IGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gaG9yaXpvbnRhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIHJpZ2h0IG92ZXJsYXBzIHRoZSBncmlkJ3MgcmlnaHQgZWRnZS5cbiAgICAgIGlmIChpc0hvcml6b250YWwgJiYgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoID4gbGF5b3V0LndpZHRoKSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIHRvcCwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC50b3AgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KGxheW91dC53aWR0aCwgMCwgSW5maW5pdHksIGl0ZW1TbG90LnRvcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgYm90dG9tLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA8IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgbGF5b3V0LndpZHRoLFxuICAgICAgICAgICAgICBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQsXG4gICAgICAgICAgICAgIEluZmluaXR5LFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0IC0gaXRlbVNsb3QudG9wIC0gaXRlbVNsb3QuaGVpZ2h0XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIHdpZHRoLlxuICAgICAgICBsYXlvdXQud2lkdGggPSBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIHRoZSBjdXJyZW50IHNsb3RzIG1ha2luZyBzdXJlIHRoZXJlIGFyZSBubyBvbGQgc2xvdHMgdGhhdFxuICAgICAgLy8gb3ZlcmxhcCB3aXRoIHRoZSBpdGVtLiBJZiBhbiBvbGQgc2xvdCBvdmVybGFwcyB3aXRoIHRoZSBpdGVtLCBzcGxpdCBpdFxuICAgICAgLy8gaW50byBzbWFsbGVyIHNsb3RzIGlmIG5lY2Vzc2FyeS5cbiAgICAgIGZvciAoaSA9IGZpbGxHYXBzID8gMCA6IGlnbm9yZUN1cnJlbnRTbG90cyA/IGZyZWVTbG90cy5sZW5ndGggOiBpOyBpIDwgZnJlZVNsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlY3RJZCA9IGZyZWVTbG90c1tpXTtcbiAgICAgICAgaWYgKCFyZWN0SWQpIGNvbnRpbnVlO1xuICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICBwb3RlbnRpYWxTbG90cyA9IHRoaXMuX3NwbGl0UmVjdChyZWN0LCBpdGVtU2xvdCk7XG4gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBvdGVudGlhbFNsb3RzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIHJlY3RJZCA9IHBvdGVudGlhbFNsb3RzW2lpXTtcbiAgICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICAgIC8vIExldCdzIG1ha2Ugc3VyZSBoZXJlIHRoYXQgd2UgaGF2ZSBhIGJpZyBlbm91Z2ggc2xvdFxuICAgICAgICAgIC8vICh3aWR0aC9oZWlnaHQgPiAwLjQ5cHgpIGFuZCBhbHNvIGxldCdzIG1ha2Ugc3VyZSB0aGF0IHRoZSBzbG90IGlzXG4gICAgICAgICAgLy8gd2l0aGluIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBncmlkLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlY3Qud2lkdGggPiAwLjQ5ICYmXG4gICAgICAgICAgICByZWN0LmhlaWdodCA+IDAuNDkgJiZcbiAgICAgICAgICAgICgoIWlzSG9yaXpvbnRhbCAmJiByZWN0LnRvcCA8IGxheW91dC5oZWlnaHQpIHx8XG4gICAgICAgICAgICAgIChpc0hvcml6b250YWwgJiYgcmVjdC5sZWZ0IDwgbGF5b3V0LndpZHRoKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG5ld1Nsb3RzLnB1c2gocmVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgbmV3IHNsb3RzLlxuICAgICAgaWYgKG5ld1Nsb3RzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9wdXJnZVJlY3RzKG5ld1Nsb3RzKS5zb3J0KFxuICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AgOiB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2lkdGgvaGVpZ2h0LlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBsYXlvdXQud2lkdGggPSBNYXRoLm1heChsYXlvdXQud2lkdGgsIGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gTWF0aC5tYXgobGF5b3V0LmhlaWdodCwgaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGl0ZW0gc2xvdCBkYXRhIHRvIGxheW91dCBzbG90cyAoYW5kIHN0b3JlIHRoZSBzbG90IHNpemUgZm9yIGxhdGVyXG4gICAgICAvLyB1c2FnZSB0b28gaWYgbmVjZXNzYXJ5KS5cbiAgICAgIGxheW91dC5zbG90cy5wdXNoKGl0ZW1TbG90LmxlZnQsIGl0ZW1TbG90LnRvcCk7XG4gICAgICBpZiAodHJhY2tTaXplKSB0aGlzLl9zbG90U2l6ZXMucHVzaChpdGVtU2xvdC53aWR0aCwgaXRlbVNsb3QuaGVpZ2h0KTtcblxuICAgICAgLy8gRnJlZS9uZXcgc2xvdHMgc3dpdGNoZXJvbyFcbiAgICAgIHRoaXMuX2ZyZWVTbG90cyA9IG5ld1Nsb3RzO1xuICAgICAgdGhpcy5fbmV3U2xvdHMgPSBmcmVlU2xvdHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogQWRkIGEgbmV3IHJlY3RhbmdsZSB0byB0aGUgcmVjdGFuZ2xlIHN0b3JlLiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgbmV3XG4gICAqIHJlY3RhbmdsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlZnRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRvcFxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICAgKiBAcmV0dXJucyB7UmVjdElkfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkUmVjdCA9IGZ1bmN0aW9uKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciByZWN0SWQgPSArK3RoaXMuX3JlY3RJZDtcbiAgICB2YXIgcmVjdFN0b3JlID0gdGhpcy5fcmVjdFN0b3JlO1xuXG4gICAgcmVjdFN0b3JlW3JlY3RJZF0gPSBsZWZ0IHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHRvcCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSB3aWR0aCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSBoZWlnaHQgfHwgMDtcblxuICAgIHJldHVybiByZWN0SWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCByZWN0YW5nbGUgZGF0YSBmcm9tIHRoZSByZWN0YW5nbGUgc3RvcmUgYnkgaWQuIE9wdGlvbmFsbHkgeW91IGNhblxuICAgKiBwcm92aWRlIGEgdGFyZ2V0IG9iamVjdCB3aGVyZSB0aGUgcmVjdGFuZ2xlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGluLiBCeVxuICAgKiBkZWZhdWx0IGFuIGludGVybmFsIG9iamVjdCBpcyByZXVzZWQgYXMgYSB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gaWRcbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9nZXRSZWN0ID0gZnVuY3Rpb24oaWQsIHRhcmdldCkge1xuICAgIHZhciByZWN0SXRlbSA9IHRhcmdldCA/IHRhcmdldCA6IHRoaXMuX3JlY3RJdGVtO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0SXRlbS5sZWZ0ID0gcmVjdFN0b3JlW2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLnRvcCA9IHJlY3RTdG9yZVsrK2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLndpZHRoID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0uaGVpZ2h0ID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG5cbiAgICByZXR1cm4gcmVjdEl0ZW07XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1bmNoIGEgaG9sZSBpbnRvIGEgcmVjdGFuZ2xlIGFuZCBzcGxpdCB0aGUgcmVtYWluaW5nIGFyZWEgaW50byBzbWFsbGVyXG4gICAqIHJlY3RhbmdsZXMgKDQgYXQgbWF4KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IHJlY3RcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IGhvbGVcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc3BsaXRSZWN0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJlY3QsIGhvbGUpIHtcbiAgICAgIC8vIFJlc2V0IG9sZCByZXN1bHRzLlxuICAgICAgcmVzdWx0cy5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBJZiB0aGUgcmVjdCBkb2VzIG5vdCBvdmVybGFwIHdpdGggdGhlIGhvbGUgYWRkIHJlY3QgdG8gdGhlIHJldHVybiBkYXRhXG4gICAgICAvLyBhcyBpcy5cbiAgICAgIGlmICghdGhpcy5fZG9SZWN0c092ZXJsYXAocmVjdCwgaG9sZSkpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZnQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0IDwgaG9sZS5sZWZ0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIGhvbGUubGVmdCAtIHJlY3QubGVmdCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmlnaHQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCA+IGhvbGUubGVmdCArIGhvbGUud2lkdGgpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICBob2xlLmxlZnQgKyBob2xlLndpZHRoLFxuICAgICAgICAgICAgcmVjdC50b3AsXG4gICAgICAgICAgICByZWN0LmxlZnQgKyByZWN0LndpZHRoIC0gKGhvbGUubGVmdCArIGhvbGUud2lkdGgpLFxuICAgICAgICAgICAgcmVjdC5oZWlnaHRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvcCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LnRvcCA8IGhvbGUudG9wKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIGhvbGUudG9wIC0gcmVjdC50b3ApKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90dG9tIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wICsgcmVjdC5oZWlnaHQgPiBob2xlLnRvcCArIGhvbGUuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChcbiAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgcmVjdC5sZWZ0LFxuICAgICAgICAgICAgaG9sZS50b3AgKyBob2xlLmhlaWdodCxcbiAgICAgICAgICAgIHJlY3Qud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gKGhvbGUudG9wICsgaG9sZS5oZWlnaHQpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdGFuZ2xlcyBvdmVybGFwLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2RvUmVjdHNPdmVybGFwID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiAhKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWN0YW5nbGUgaXMgZnVsbHkgd2l0aGluIGFub3RoZXIgcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2lzUmVjdFdpdGhpblJlY3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubGVmdCA+PSBiLmxlZnQgJiZcbiAgICAgIGEudG9wID49IGIudG9wICYmXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCArIGIud2lkdGggJiZcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgKyBiLmhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvb3BzIHRocm91Z2ggYW4gYXJyYXkgb2YgcmVjdGFuZ2xlIGlkcyBhbmQgcmVzZXRzIGFsbCB0aGF0IGFyZSBmdWxseVxuICAgKiB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUgaW4gdGhlIGFycmF5LiBSZXNldHRpbmcgaW4gdGhpcyBjYXNlIG1lYW5zIHRoYXRcbiAgICogdGhlIHJlY3RhbmdsZSBpZCB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHplcm8uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkW119IHJlY3RJZHNcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fcHVyZ2VSZWN0cyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdElkcykge1xuICAgICAgdmFyIGkgPSByZWN0SWRzLmxlbmd0aDtcbiAgICAgIHZhciBpaTtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgICBpZiAoIXJlY3RJZHNbaV0pIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaV0sIHJlY3RBKTtcbiAgICAgICAgd2hpbGUgKGlpLS0pIHtcbiAgICAgICAgICBpZiAoIXJlY3RJZHNbaWldIHx8IGkgPT09IGlpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodGhpcy5faXNSZWN0V2l0aGluUmVjdChyZWN0QSwgdGhpcy5fZ2V0UmVjdChyZWN0SWRzW2lpXSwgcmVjdEIpKSkge1xuICAgICAgICAgICAgcmVjdElkc1tpXSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY3RJZHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogU29ydCByZWN0YW5nbGVzIHdpdGggdG9wLWxlZnQgZ3Jhdml0eS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWR9IGFJZFxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYklkXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zb3J0UmVjdHNUb3BMZWZ0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihhSWQsIGJJZCkge1xuICAgICAgdGhpcy5fZ2V0UmVjdChhSWQsIHJlY3RBKTtcbiAgICAgIHRoaXMuX2dldFJlY3QoYklkLCByZWN0Qik7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIHJldHVybiByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDogMDtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCBsZWZ0LXRvcCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c0xlZnRUb3AgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLmxlZnQgPCByZWN0Qi5sZWZ0ID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLmxlZnQgPiByZWN0Qi5sZWZ0ID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wIDwgcmVjdEIudG9wID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLnRvcCA+IHJlY3RCLnRvcCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgdmFyIGh0bWxDb2xsZWN0aW9uVHlwZSA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7XG4gIHZhciBub2RlTGlzdFR5cGUgPSAnW29iamVjdCBOb2RlTGlzdF0nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9kZSBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNOb2RlTGlzdCh2YWwpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICAgIHJldHVybiB0eXBlID09PSBodG1sQ29sbGVjdGlvblR5cGUgfHwgdHlwZSA9PT0gbm9kZUxpc3RUeXBlO1xuICB9XG5cbiAgdmFyIG9iamVjdFR5cGUgPSAnb2JqZWN0JztcbiAgdmFyIG9iamVjdFRvU3RyaW5nVHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IG9iamVjdFR5cGUgJiYgdG9TdHJpbmcuY2FsbCh2YWwpID09PSBvYmplY3RUb1N0cmluZ1R5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhbiBhcnJheSBvciBjbG9uZXMgYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGlzTm9kZUxpc3QodGFyZ2V0KSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhcmdldCkgOiBBcnJheS5wcm90b3R5cGUuY29uY2F0KHRhcmdldCk7XG4gIH1cblxuICB2YXIgcGFja2VyID0gbmV3IFBhY2tlcigpO1xuICB2YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbiAgdmFyIG51bWJlclR5cGUkMSA9ICdudW1iZXInO1xuICB2YXIgc3RyaW5nVHlwZSA9ICdzdHJpbmcnO1xuICB2YXIgaW5zdGFudExheW91dCA9ICdpbnN0YW50JztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U3RyaW5nKX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7PyhIVE1MRWxlbWVudFtdfE5vZGVMaXN0fFN0cmluZyl9IFtvcHRpb25zLml0ZW1zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2hvd0R1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNob3dFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy52aXNpYmxlU3R5bGVzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGlkZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmhpZGVFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5oaWRkZW5TdHlsZXNdXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IFtvcHRpb25zLmxheW91dF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0Lmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduUmlnaHQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5yb3VuZGluZz10cnVlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufE51bWJlcil9IFtvcHRpb25zLmxheW91dE9uUmVzaXplPTEwMF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXRPbkluaXQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmxheW91dER1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmxheW91dEVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9ucy5zb3J0RGF0YT1udWxsXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdFbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0gez9IdG1sRWxlbWVudH0gW29wdGlvbnMuZHJhZ0NvbnRhaW5lcj1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlLmRpc3RhbmNlPTBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGVsYXk9MF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxTdHJpbmcpfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuaGFuZGxlPWZhbHNlXVxuICAgKiBAcGFyYW0gez9TdHJpbmd9IFtvcHRpb25zLmRyYWdBeGlzXVxuICAgKiBAcGFyYW0geyhCb29sZWFufEZ1bmN0aW9uKX0gW29wdGlvbnMuZHJhZ1NvcnQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkRyYWdEaXN0YW5jZT0xMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5taW5Cb3VuY2VCYWNrQW5nbGU9MV1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMuZHJhZ1NvcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS5hY3Rpb249XCJtb3ZlXCJdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUmVsZWFzZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdSZWxlYXNlRWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ0Nzc1Byb3BzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudD1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLm9uQ3JlYXRlPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmU9bnVsbF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRhaW5lckNsYXNzPVwibXV1cmlcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1DbGFzcz1cIm11dXJpLWl0ZW1cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1WaXNpYmxlQ2xhc3M9XCJtdXVyaS1pdGVtLXZpc2libGVcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1IaWRkZW5DbGFzcz1cIm11dXJpLWl0ZW0taGlkZGVuXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUG9zaXRpb25pbmdDbGFzcz1cIm11dXJpLWl0ZW0tcG9zaXRpb25pbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1EcmFnZ2luZ0NsYXNzPVwibXV1cmktaXRlbS1kcmFnZ2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVJlbGVhc2luZ0NsYXNzPVwibXV1cmktaXRlbS1yZWxlYXNpbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1QbGFjZWhvbGRlckNsYXNzPVwibXV1cmktaXRlbS1wbGFjZWhvbGRlclwiXVxuICAgKi9cblxuICBmdW5jdGlvbiBHcmlkKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXM7XG4gICAgdmFyIHNldHRpbmdzO1xuICAgIHZhciBpdGVtcztcbiAgICB2YXIgbGF5b3V0T25SZXNpemU7XG5cbiAgICAvLyBBbGxvdyBwYXNzaW5nIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nLiBTdG9yZSBlbGVtZW50IGZvciBpbnN0YW5jZS5cbiAgICBlbGVtZW50ID0gdGhpcy5fZWxlbWVudCA9XG4gICAgICB0eXBlb2YgZWxlbWVudCA9PT0gc3RyaW5nVHlwZSA/IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpIDogZWxlbWVudDtcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyBub3QgYm9keSBlbGVtZW50IG9yIGRvZXMgbm90XG4gICAgLy8gZXhpc3Qgd2l0aGluIHRoZSBib2R5IGVsZW1lbnQuXG4gICAgdmFyIGlzRWxlbWVudEluRG9tID0gZWxlbWVudC5nZXRSb290Tm9kZVxuICAgICAgPyBlbGVtZW50LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IHRydWUgfSkgPT09IGRvY3VtZW50XG4gICAgICA6IHdpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIGlmICghaXNFbGVtZW50SW5Eb20gfHwgZWxlbWVudCA9PT0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250YWluZXIgZWxlbWVudCBtdXN0IGJlIGFuIGV4aXN0aW5nIERPTSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIHNldHRpbmdzIGJ5IG1lcmdpbmcgdGhlIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gICAgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncyA9IG1lcmdlU2V0dGluZ3MoR3JpZC5kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAvLyBTYW5pdGl6ZSBkcmFnU29ydCBzZXR0aW5nLlxuICAgIGlmICghaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydCkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdTb3J0ID0gISFzZXR0aW5ncy5kcmFnU29ydDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQgYW5kIHN0b3JlIGl0IHRvIHRoZSBncmlkIGluc3RhbmNlcyBjb2xsZWN0aW9uLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSBpbnN0O1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBsYXlvdXQgb2JqZWN0IChtdXRhdGVkIG9uIGV2ZXJ5IGxheW91dCkuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgaWQ6IDAsXG4gICAgICBpdGVtczogW10sXG4gICAgICBzbG90czogW10sXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHByaXZhdGUgRW1pdHRlciBpbnN0YW5jZS5cbiAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICAgIC8vIEFkZCBjb250YWluZXIgZWxlbWVudCdzIGNsYXNzIG5hbWUuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY29udGFpbmVyQ2xhc3MpO1xuXG4gICAgLy8gQ3JlYXRlIGluaXRpYWwgaXRlbXMuXG4gICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICBpdGVtcyA9IHNldHRpbmdzLml0ZW1zO1xuICAgIGlmICh0eXBlb2YgaXRlbXMgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgIHRvQXJyYXkoZWxlbWVudC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICBpZiAoaXRlbXMgPT09ICcqJyB8fCBlbGVtZW50TWF0Y2hlcyhpdGVtRWxlbWVudCwgaXRlbXMpKSB7XG4gICAgICAgICAgaW5zdC5faXRlbXMucHVzaChuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpIHx8IGlzTm9kZUxpc3QoaXRlbXMpKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IHRvQXJyYXkoaXRlbXMpLm1hcChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEl0ZW0oaW5zdCwgaXRlbUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0T25SZXNpemUgb3B0aW9uIGlzIGEgdmFsaWQgbnVtYmVyIHNhbml0aXplIGl0IGFuZCBiaW5kIHRoZSByZXNpemVcbiAgICAvLyBoYW5kbGVyLlxuICAgIGxheW91dE9uUmVzaXplID0gc2V0dGluZ3MubGF5b3V0T25SZXNpemU7XG4gICAgaWYgKHR5cGVvZiBsYXlvdXRPblJlc2l6ZSAhPT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICBsYXlvdXRPblJlc2l6ZSA9IGxheW91dE9uUmVzaXplID09PSB0cnVlID8gMCA6IC0xO1xuICAgIH1cbiAgICBpZiAobGF5b3V0T25SZXNpemUgPj0gMCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdyZXNpemUnLFxuICAgICAgICAoaW5zdC5fcmVzaXplSGFuZGxlciA9IGRlYm91bmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGluc3QucmVmcmVzaEl0ZW1zKCkubGF5b3V0KCk7XG4gICAgICAgIH0sIGxheW91dE9uUmVzaXplKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTGF5b3V0IG9uIGluaXQgaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChzZXR0aW5ncy5sYXlvdXRPbkluaXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQHNlZSBJdGVtXG4gICAqL1xuICBHcmlkLkl0ZW0gPSBJdGVtO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1MYXlvdXRcbiAgICovXG4gIEdyaWQuSXRlbUxheW91dCA9IEl0ZW1MYXlvdXQ7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbVZpc2liaWxpdHlcbiAgICovXG4gIEdyaWQuSXRlbVZpc2liaWxpdHkgPSBJdGVtVmlzaWJpbGl0eTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtTWlncmF0ZVxuICAgKi9cbiAgR3JpZC5JdGVtTWlncmF0ZSA9IEl0ZW1NaWdyYXRlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1BbmltYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1BbmltYXRlID0gSXRlbUFuaW1hdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdcbiAgICovXG4gIEdyaWQuSXRlbURyYWcgPSBJdGVtRHJhZztcblxuICAvKipcbiAgICogQHNlZSBJdGVtUmVsZWFzZVxuICAgKi9cbiAgR3JpZC5JdGVtUmVsZWFzZSA9IEl0ZW1SZWxlYXNlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1EcmFnUGxhY2Vob2xkZXJcbiAgICovXG4gIEdyaWQuSXRlbURyYWdQbGFjZWhvbGRlciA9IEl0ZW1EcmFnUGxhY2Vob2xkZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgRW1pdHRlclxuICAgKi9cbiAgR3JpZC5FbWl0dGVyID0gRW1pdHRlcjtcblxuICAvKipcbiAgICogQHNlZSBEcmFnZ2VyXG4gICAqL1xuICBHcmlkLkRyYWdnZXIgPSBEcmFnZ2VyO1xuXG4gIC8qKlxuICAgKiBAc2VlIFBhY2tlclxuICAgKi9cbiAgR3JpZC5QYWNrZXIgPSBQYWNrZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyBmb3IgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZFxuICAgKi9cbiAgR3JpZC5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAvLyBJdGVtIGVsZW1lbnRzXG4gICAgaXRlbXM6ICcqJyxcblxuICAgIC8vIERlZmF1bHQgc2hvdyBhbmltYXRpb25cbiAgICBzaG93RHVyYXRpb246IDMwMCxcbiAgICBzaG93RWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBEZWZhdWx0IGhpZGUgYW5pbWF0aW9uXG4gICAgaGlkZUR1cmF0aW9uOiAzMDAsXG4gICAgaGlkZUVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gSXRlbSdzIHZpc2libGUvaGlkZGVuIHN0YXRlIHN0eWxlc1xuICAgIHZpc2libGVTdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcxJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICAgIH0sXG4gICAgaGlkZGVuU3R5bGVzOiB7XG4gICAgICBvcGFjaXR5OiAnMCcsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJ1xuICAgIH0sXG5cbiAgICAvLyBMYXlvdXRcbiAgICBsYXlvdXQ6IHtcbiAgICAgIGZpbGxHYXBzOiBmYWxzZSxcbiAgICAgIGhvcml6b250YWw6IGZhbHNlLFxuICAgICAgYWxpZ25SaWdodDogZmFsc2UsXG4gICAgICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gICAgICByb3VuZGluZzogdHJ1ZVxuICAgIH0sXG4gICAgbGF5b3V0T25SZXNpemU6IDEwMCxcbiAgICBsYXlvdXRPbkluaXQ6IHRydWUsXG4gICAgbGF5b3V0RHVyYXRpb246IDMwMCxcbiAgICBsYXlvdXRFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIFNvcnRpbmdcbiAgICBzb3J0RGF0YTogbnVsbCxcblxuICAgIC8vIERyYWcgJiBEcm9wXG4gICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxuICAgIGRyYWdDb250YWluZXI6IG51bGwsXG4gICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XG4gICAgICBkaXN0YW5jZTogMCxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgaGFuZGxlOiBmYWxzZVxuICAgIH0sXG4gICAgZHJhZ0F4aXM6IG51bGwsXG4gICAgZHJhZ1NvcnQ6IHRydWUsXG4gICAgZHJhZ1NvcnRIZXVyaXN0aWNzOiB7XG4gICAgICBzb3J0SW50ZXJ2YWw6IDEwMCxcbiAgICAgIG1pbkRyYWdEaXN0YW5jZTogMTAsXG4gICAgICBtaW5Cb3VuY2VCYWNrQW5nbGU6IDFcbiAgICB9LFxuICAgIGRyYWdTb3J0UHJlZGljYXRlOiB7XG4gICAgICB0aHJlc2hvbGQ6IDUwLFxuICAgICAgYWN0aW9uOiBhY3Rpb25Nb3ZlXG4gICAgfSxcbiAgICBkcmFnUmVsZWFzZUR1cmF0aW9uOiAzMDAsXG4gICAgZHJhZ1JlbGVhc2VFYXNpbmc6ICdlYXNlJyxcbiAgICBkcmFnQ3NzUHJvcHM6IHtcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICAgIHRvdWNoQ2FsbG91dDogJ25vbmUnLFxuICAgICAgY29udGVudFpvb21pbmc6ICdub25lJ1xuICAgIH0sXG4gICAgZHJhZ1BsYWNlaG9sZGVyOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICBlYXNpbmc6ICdlYXNlJyxcbiAgICAgIGNyZWF0ZUVsZW1lbnQ6IG51bGwsXG4gICAgICBvbkNyZWF0ZTogbnVsbCxcbiAgICAgIG9uUmVtb3ZlOiBudWxsXG4gICAgfSxcblxuICAgIC8vIENsYXNzbmFtZXNcbiAgICBjb250YWluZXJDbGFzczogJ211dXJpJyxcbiAgICBpdGVtQ2xhc3M6ICdtdXVyaS1pdGVtJyxcbiAgICBpdGVtVmlzaWJsZUNsYXNzOiAnbXV1cmktaXRlbS1zaG93bicsXG4gICAgaXRlbUhpZGRlbkNsYXNzOiAnbXV1cmktaXRlbS1oaWRkZW4nLFxuICAgIGl0ZW1Qb3NpdGlvbmluZ0NsYXNzOiAnbXV1cmktaXRlbS1wb3NpdGlvbmluZycsXG4gICAgaXRlbURyYWdnaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLWRyYWdnaW5nJyxcbiAgICBpdGVtUmVsZWFzaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXJlbGVhc2luZycsXG4gICAgaXRlbVBsYWNlaG9sZGVyQ2xhc3M6ICdtdXVyaS1pdGVtLXBsYWNlaG9sZGVyJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBCaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgaXRlbXMuIE9wdGlvbmFsbHkgeW91IGNhbiBwcm92aWRlIHNwZWNpZmljIHRhcmdldHMgKGVsZW1lbnRzIGFuZFxuICAgKiBpbmRpY2VzKS4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBpcyBub3QgdGhlIHNhbWUgb2JqZWN0IHVzZWQgYnkgdGhlXG4gICAqIGluc3RhbmNlIHNvIG1vZGlmeWluZyBpdCB3aWxsIG5vdCBhZmZlY3QgaW5zdGFuY2UncyBpdGVtcy4gQWxsIGl0ZW1zIHRoYXRcbiAgICogYXJlIG5vdCBmb3VuZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXR1cm5lZCBhcnJheS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFt0YXJnZXRzXVxuICAgKiBAcmV0dXJucyB7SXRlbVtdfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZ2V0SXRlbXMgPSBmdW5jdGlvbih0YXJnZXRzKSB7XG4gICAgLy8gUmV0dXJuIGFsbCBpdGVtcyBpbW1lZGlhdGVseSBpZiBubyB0YXJnZXRzIHdlcmUgcHJvdmlkZWQgb3IgaWYgdGhlXG4gICAgLy8gaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAoIXRhcmdldHMgJiYgdGFyZ2V0cyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdG9BcnJheSh0YXJnZXRzKTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRhcmdldCBpdGVtcyBhcmUgZGVmaW5lZCByZXR1cm4gZmlsdGVyZWQgcmVzdWx0cy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKHRhcmdldEl0ZW1zW2ldKTtcbiAgICAgIGl0ZW0gJiYgcmV0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjYWNoZWQgZGltZW5zaW9ucyBvZiB0aGUgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFtpdGVtc11cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZWZyZXNoSXRlbXMgPSBmdW5jdGlvbihpdGVtcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGFyZ2V0cyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldHNbaV0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc29ydCBkYXRhIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hTb3J0RGF0YSA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0YXJnZXRJdGVtc1tpXS5fcmVmcmVzaFNvcnREYXRhKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplIHRoZSBpdGVtIGVsZW1lbnRzIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaW4gdGhlIERPTS5cbiAgICogVGhpcyBjb21lcyBoYW5keSBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBET00gc3RydWN0dXJlIG1hdGNoZWQgd2l0aCB0aGVcbiAgICogb3JkZXIgb2YgdGhlIGl0ZW1zLiBOb3RlIHRoYXQgaWYgYW4gaXRlbSdzIGVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBhIGNoaWxkXG4gICAqIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCAoaWYgaXQgaXMgZHJhZ2dlZCBmb3IgZXhhbXBsZSkgaXQgaXMgaWdub3JlZCBhbmRcbiAgICogbGVmdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc3luY2hyb25pemUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIGZyYWdtZW50O1xuICAgIHZhciBlbGVtZW50O1xuICAgIHZhciBpO1xuXG4gICAgLy8gQXBwZW5kIGFsbCBlbGVtZW50cyBpbiBvcmRlciB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsZW1lbnQgPSBpdGVtc1tpXS5fZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudCB8fCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmFnbWVudCkgY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHN5bmNocm9uaXplIGV2ZW50LlxuICAgIHRoaXMuX2VtaXQoZXZlbnRTeW5jaHJvbml6ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCBhcHBseSBpdGVtIHBvc2l0aW9ucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtMYXlvdXRDYWxsYmFja30gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX3VwZGF0ZUxheW91dCgpO1xuICAgIHZhciBsYXlvdXRJZCA9IGxheW91dC5pZDtcbiAgICB2YXIgaXRlbXNMZW5ndGggPSBsYXlvdXQuaXRlbXMubGVuZ3RoO1xuICAgIHZhciBjb3VudGVyID0gaXRlbXNMZW5ndGg7XG4gICAgdmFyIGlzQm9yZGVyQm94O1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gVGhlIGZpbmlzaCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBjaGVja2luZyBpZiBhbGwgdGhlIGl0ZW1zXG4gICAgLy8gaGF2ZSBsYWlkIG91dCB5ZXQuIEFmdGVyIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbFxuICAgIC8vIGNhbGxiYWNrIGFuZCBlbWl0IGxheW91dEVuZCBldmVudC4gT25seSBlbWl0IGxheW91dEVuZCBldmVudCBpZiB0aGVyZVxuICAgIC8vIGhhc24ndCBiZWVuIGEgbmV3IGxheW91dCBjYWxsIGR1cmluZyB0aGlzIGxheW91dC5cbiAgICBmdW5jdGlvbiB0cnlGaW5pc2goKSB7XG4gICAgICBpZiAoLS1jb3VudGVyID4gMCkgcmV0dXJuO1xuXG4gICAgICB2YXIgaGFzTGF5b3V0Q2hhbmdlZCA9IGluc3QuX2xheW91dC5pZCAhPT0gbGF5b3V0SWQ7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKGluc3RhbnQpID8gaW5zdGFudCA6IG9uRmluaXNoO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgY2FsbGJhY2soaGFzTGF5b3V0Q2hhbmdlZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXNMYXlvdXRDaGFuZ2VkICYmIGluc3QuX2hhc0xpc3RlbmVycyhldmVudExheW91dEVuZCkpIHtcbiAgICAgICAgaW5zdC5fZW1pdChldmVudExheW91dEVuZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBncmlkJ3Mgd2lkdGggb3IgaGVpZ2h0IHdhcyBtb2RpZmllZCwgd2UgbmVlZCB0byB1cGRhdGUgaXQncyBjYWNoZWRcbiAgICAvLyBkaW1lbnNpb25zLiBBbHNvIGtlZXAgaW4gbWluZCB0aGF0IGdyaWQncyBjYWNoZWQgd2lkdGgvaGVpZ2h0IHNob3VsZFxuICAgIC8vIGFsd2F5cyBlcXVhbCB0byB3aGF0IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgd291bGQgcmV0dXJuLCBzb1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBlbGVtZW50J3MgYm9yZGVycyB0byB0aGUgZGltZW5zaW9ucyBpZlxuICAgIC8vIGl0J3MgYm94LXNpemluZyBpcyBib3JkZXItYm94LiBOb3RlIHRoYXQgd2Ugc3VwcG9ydCBwcm92aWRpbmcgdGhlXG4gICAgLy8gZGltZW5zaW9ucyBhcyBhIHN0cmluZyBoZXJlIHRvbyBzbyB0aGF0IG9uZSBjYW4gZGVmaW5lIHRoZSB1bml0IG9mIHRoZVxuICAgIC8vIGRpbWVuc2lvbnMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgZG8gdGhlIGJvcmRlci1ib3ggY2hlY2suXG4gICAgaWYgKFxuICAgICAgKGxheW91dC5zZXRIZWlnaHQgJiYgdHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkgfHxcbiAgICAgIChsYXlvdXQuc2V0V2lkdGggJiYgdHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKVxuICAgICkge1xuICAgICAgaXNCb3JkZXJCb3ggPSBnZXRTdHlsZShlbGVtZW50LCAnYm94LXNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG4gICAgfVxuICAgIGlmIChsYXlvdXQuc2V0SGVpZ2h0KSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9XG4gICAgICAgICAgKGlzQm9yZGVyQm94ID8gbGF5b3V0LmhlaWdodCArIHRoaXMuX2JvcmRlclRvcCArIHRoaXMuX2JvcmRlckJvdHRvbSA6IGxheW91dC5oZWlnaHQpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbGF5b3V0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRXaWR0aCkge1xuICAgICAgaWYgKHR5cGVvZiBsYXlvdXQud2lkdGggPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQud2lkdGggKyB0aGlzLl9ib3JkZXJMZWZ0ICsgdGhpcy5fYm9yZGVyUmlnaHQgOiBsYXlvdXQud2lkdGgpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBsYXlvdXQud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCBsYXlvdXRTdGFydCBldmVudC4gTm90ZSB0aGF0IHRoaXMgaXMgaW50ZW50aW9uYWxseSBlbWl0dGVkIGFmdGVyIHRoZVxuICAgIC8vIGNvbnRhaW5lciBlbGVtZW50J3MgZGltZW5zaW9ucyBhcmUgc2V0LCBiZWNhdXNlIG90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZVxuICAgIC8vIG5vIGhvb2sgZm9yIHJlYWN0aW5nIHRvIGNvbnRhaW5lciBkaW1lbnNpb24gY2hhbmdlcy5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0U3RhcnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50TGF5b3V0U3RhcnQsIGxheW91dC5pdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGxldCdzIGZpbmlzaCBxdWlja2x5LlxuICAgIGlmICghaXRlbXNMZW5ndGgpIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGl0ZW1zIGxldCdzIHBvc2l0aW9uIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBsYXlvdXQuaXRlbXNbaV07XG4gICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIHBvc2l0aW9uLlxuICAgICAgaXRlbS5fbGVmdCA9IGxheW91dC5zbG90c1tpICogMl07XG4gICAgICBpdGVtLl90b3AgPSBsYXlvdXQuc2xvdHNbaSAqIDIgKyAxXTtcblxuICAgICAgLy8gTGF5b3V0IGl0ZW0gaWYgaXQgaXMgbm90IGRyYWdnZWQuXG4gICAgICBpdGVtLmlzRHJhZ2dpbmcoKSA/IHRyeUZpbmlzaCgpIDogaXRlbS5fbGF5b3V0LnN0YXJ0KGluc3RhbnQgPT09IHRydWUsIHRyeUZpbmlzaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgaXRlbXMgYnkgcHJvdmlkaW5nIHRoZSBlbGVtZW50cyB5b3Ugd2lzaCB0byBhZGQgdG8gdGhlIGluc3RhbmNlIGFuZFxuICAgKiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIGluZGV4IHdoZXJlIHlvdSB3YW50IHRoZSBpdGVtcyB0byBiZSBpbnNlcnRlZCBpbnRvLlxuICAgKiBBbGwgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFscmVhZHkgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuIElmIGFuIGVsZW1lbnQgaGFzIGl0J3MgQ1NTXG4gICAqIGRpc3BsYXkgcHJvcGVydHkgc2V0IHRvIFwibm9uZVwiIGl0IHdpbGwgYmUgbWFya2VkIGFzIGluYWN0aXZlIGR1cmluZyB0aGVcbiAgICogaW5pdGlhdGlvbiBwcm9jZXNzLiBBcyBsb25nIGFzIHRoZSBpdGVtIGlzIGluYWN0aXZlIGl0IHdpbGwgbm90IGJlIHBhcnQgb2ZcbiAgICogdGhlIGxheW91dCwgYnV0IGl0IHdpbGwgcmV0YWluIGl0J3MgaW5kZXguIFlvdSBjYW4gYWN0aXZhdGUgaXRlbXMgYXQgYW55XG4gICAqIHBvaW50IHdpdGggZ3JpZC5zaG93KCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbFxuICAgKiBncmlkLmxheW91dCgpIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBhZGRlZCBlbGVtZW50cyBhcmUgdmlzaWJsZS4gSWYgb25seVxuICAgKiBoaWRkZW4gaXRlbXMgYXJlIGFkZGVkIG5vIGxheW91dCB3aWxsIGJlIGNhbGxlZC4gQWxsIHRoZSBuZXcgdmlzaWJsZSBpdGVtc1xuICAgKiBhcmUgcG9zaXRpb25lZCB3aXRob3V0IGFuaW1hdGlvbiBkdXJpbmcgdGhlaXIgZmlyc3QgbGF5b3V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdKX0gZWxlbWVudHNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXg9LTFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaXNBY3RpdmVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhZWxlbWVudHMpIHJldHVybiBbXTtcblxuICAgIHZhciBuZXdJdGVtcyA9IHRvQXJyYXkoZWxlbWVudHMpO1xuICAgIGlmICghbmV3SXRlbXMubGVuZ3RoKSByZXR1cm4gbmV3SXRlbXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBNYXAgcHJvdmlkZWQgZWxlbWVudHMgaW50byBuZXcgZ3JpZCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbmV3SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBuZXcgSXRlbSh0aGlzLCBuZXdJdGVtc1tpXSwgb3B0cy5pc0FjdGl2ZSk7XG4gICAgICBuZXdJdGVtc1tpXSA9IGl0ZW07XG5cbiAgICAgIC8vIElmIHRoZSBpdGVtIHRvIGJlIGFkZGVkIGlzIGFjdGl2ZSwgd2UgbmVlZCB0byBkbyBhIGxheW91dC4gQWxzbywgd2VcbiAgICAgIC8vIG5lZWQgdG8gbWFyayB0aGUgaXRlbSB3aXRoIHRoZSBza2lwTmV4dEFuaW1hdGlvbiBmbGFnIHRvIG1ha2UgaXRcbiAgICAgIC8vIHBvc2l0aW9uIGluc3RhbnRseSAod2l0aG91dCBhbmltYXRpb24pIGR1cmluZyB0aGUgbmV4dCBsYXlvdXQuIFdpdGhvdXRcbiAgICAgIC8vIHRoZSBoYWNrIHRoZSBpdGVtIHdvdWxkIGFuaW1hdGUgdG8gaXQncyBuZXcgcG9zaXRpb24gZnJvbSB0aGUgbm9ydGh3ZXN0XG4gICAgICAvLyBjb3JuZXIgb2YgdGhlIGdyaWQsIHdoaWNoIGZlZWxzIGEgYml0IGJ1Z2d5IChpbWhvKS5cbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICAgIGl0ZW0uX2xheW91dC5fc2tpcE5leHRBbmltYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW1zIHRvIHRoZSBpdGVtcyBjb2xsZWN0aW9uIHRvIGNvcnJlY3QgaW5kZXguXG4gICAgYXJyYXlJbnNlcnQoaXRlbXMsIG5ld0l0ZW1zLCBvcHRzLmluZGV4KTtcblxuICAgIC8vIEVtaXQgYWRkIGV2ZW50LlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRBZGQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50QWRkLCBuZXdJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0l0ZW1zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVtb3ZlRWxlbWVudHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpbmRpY2VzID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGluZGl2aWR1YWwgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG4gICAgICBpbmRpY2VzLnB1c2goYWxsSXRlbXMuaW5kZXhPZihpdGVtKSk7XG4gICAgICBpZiAoaXRlbS5faXNBY3RpdmUpIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIGl0ZW0uX2Rlc3Ryb3kob3B0cy5yZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCByZW1vdmUgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFJlbW92ZSkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRSZW1vdmUsIHRhcmdldEl0ZW1zLnNsaWNlKDApLCBpbmRpY2VzKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3cgaW5zdGFuY2UgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtTaG93Q2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5fc2V0SXRlbXNWaXNpYmlsaXR5KGl0ZW1zLCB0cnVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0hpZGVDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIGZhbHNlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRmlsdGVyIGl0ZW1zLiBFeHBlY3RzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgYSBwcmVkaWNhdGUsIHdoaWNoIHNob3VsZCBiZVxuICAgKiBlaXRoZXIgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gVGhlIHByZWRpY2F0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCBmb3IgZXZlcnlcbiAgICogaXRlbSBpbiB0aGUgaW5zdGFuY2UuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZWRpY2F0ZSBpcyB0cnV0aHkgdGhlXG4gICAqIGl0ZW0gaW4gcXVlc3Rpb24gd2lsbCBiZSBzaG93biBhbmQgb3RoZXJ3aXNlIGhpZGRlbi4gVGhlIHByZWRpY2F0ZSBjYWxsYmFja1xuICAgKiByZWNlaXZlcyB0aGUgaXRlbSBpbnN0YW5jZSBhcyBpdCdzIGFyZ3VtZW50LiBJZiB0aGUgcHJlZGljYXRlIGlzIGEgc3RyaW5nXG4gICAqIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzZWxlY3RvciBhbmQgaXQgaXMgY2hlY2tlZCBhZ2FpbnN0IGV2ZXJ5IGl0ZW1cbiAgICogZWxlbWVudCBpbiB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgbmF0aXZlIGVsZW1lbnQubWF0Y2hlcygpIG1ldGhvZC4gQWxsIHRoZVxuICAgKiBtYXRjaGluZyBpdGVtcyB3aWxsIGJlIHNob3duIGFuZCBvdGhlcnMgaGlkZGVuLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxTdHJpbmcpfSBwcmVkaWNhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RmlsdGVyQ2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXRlbXMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtc1RvU2hvdyA9IFtdO1xuICAgIHZhciBpdGVtc1RvSGlkZSA9IFtdO1xuICAgIHZhciBpc1ByZWRpY2F0ZVN0cmluZyA9IHR5cGVvZiBwcmVkaWNhdGUgPT09IHN0cmluZ1R5cGU7XG4gICAgdmFyIGlzUHJlZGljYXRlRm4gPSBpc0Z1bmN0aW9uKHByZWRpY2F0ZSk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG9uRmluaXNoID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuICAgIHZhciB0cnlGaW5pc2hDb3VudGVyID0gLTE7XG4gICAgdmFyIHRyeUZpbmlzaCA9IG5vb3A7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG9uRmluaXNoIGNhbGxiYWNrLCBsZXQncyBjcmVhdGUgcHJvcGVyIHRyeUZpbmlzaCBjYWxsYmFjay5cbiAgICBpZiAob25GaW5pc2gpIHtcbiAgICAgIHRyeUZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICArK3RyeUZpbmlzaENvdW50ZXIgJiYgb25GaW5pc2goaXRlbXNUb1Nob3cuc2xpY2UoMCksIGl0ZW1zVG9IaWRlLnNsaWNlKDApKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2hpY2ggaXRlbXMgbmVlZCB0byBiZSBzaG93biBhbmQgd2hpY2ggaGlkZGVuLlxuICAgIGlmIChpc1ByZWRpY2F0ZUZuIHx8IGlzUHJlZGljYXRlU3RyaW5nKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICBpZiAoaXNQcmVkaWNhdGVGbiA/IHByZWRpY2F0ZShpdGVtKSA6IGVsZW1lbnRNYXRjaGVzKGl0ZW0uX2VsZW1lbnQsIHByZWRpY2F0ZSkpIHtcbiAgICAgICAgICBpdGVtc1RvU2hvdy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1zVG9IaWRlLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG93IGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBzaG93bi5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3coaXRlbXNUb1Nob3csIHtcbiAgICAgICAgaW5zdGFudDogaXNJbnN0YW50LFxuICAgICAgICBvbkZpbmlzaDogdHJ5RmluaXNoLFxuICAgICAgICBsYXlvdXQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgaGlkZGVuLlxuICAgIGlmIChpdGVtc1RvSGlkZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlkZShpdGVtc1RvSGlkZSwge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGl0ZW1zIHRvIGZpbHRlci5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoIHx8IGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgLy8gRW1pdCBmaWx0ZXIgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50RmlsdGVyKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50RmlsdGVyLCBpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvcnQgaXRlbXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHNvcnQgdGhlIGl0ZW1zLiBUaGUgZmlyc3QgaXMgc2ltcGx5IGJ5XG4gICAqIHByb3ZpZGluZyBhIGZ1bmN0aW9uIGFzIHRoZSBjb21wYXJlciB3aGljaCB3b3JrcyBpZGVudGljYWxseSB0byBuYXRpdmVcbiAgICogYXJyYXkgc29ydC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSB5b3UgaGF2ZSBwcm92aWRlZFxuICAgKiBpbiB0aGUgaW5zdGFuY2UncyBvcHRpb25zLiBKdXN0IHByb3ZpZGUgdGhlIHNvcnQgZGF0YSBrZXkocykgYXMgYSBzdHJpbmdcbiAgICogKHNlcGFyYXRlZCBieSBzcGFjZSkgYW5kIHRoZSBpdGVtcyB3aWxsIGJlIHNvcnRlZCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAgICogc29ydCBkYXRhIGtleXMuIExhc3RseSB5b3UgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBhIHByZXNvcnRlZFxuICAgKiBhcnJheSBvZiBpdGVtcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc3luYyB0aGUgaW50ZXJuYWwgaXRlbXMgYXJyYXkgaW4gdGhlXG4gICAqIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufEl0ZW1bXXxTdHJpbmd8U3RyaW5nW10pfSBjb21wYXJlclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVzY2VuZGluZz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zb3J0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3J0Q29tcGFyZXI7XG4gICAgdmFyIGlzRGVzY2VuZGluZztcbiAgICB2YXIgb3JpZ0l0ZW1zO1xuICAgIHZhciBpbmRleE1hcDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlQ3JpdGVyaWEoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwuc3BsaXQoJzonKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXhNYXAoaXRlbXMpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0W2l0ZW1zW2ldLl9pZF0gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wYXJlSW5kaWNlcyhpdGVtQSwgaXRlbUIpIHtcbiAgICAgIHZhciBpbmRleEEgPSBpbmRleE1hcFtpdGVtQS5faWRdO1xuICAgICAgdmFyIGluZGV4QiA9IGluZGV4TWFwW2l0ZW1CLl9pZF07XG4gICAgICByZXR1cm4gaXNEZXNjZW5kaW5nID8gaW5kZXhCIC0gaW5kZXhBIDogaW5kZXhBIC0gaW5kZXhCO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlcihhLCBiKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgIHZhciBjcml0ZXJpYU5hbWU7XG4gICAgICB2YXIgY3JpdGVyaWFPcmRlcjtcbiAgICAgIHZhciB2YWxBO1xuICAgICAgdmFyIHZhbEI7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzb3J0IGNyaXRlcmlhLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0Q29tcGFyZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBjcml0ZXJpYSBuYW1lLCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gaXRlbSdzIHNvcnQgZGF0YSBrZXkuXG4gICAgICAgIGNyaXRlcmlhTmFtZSA9IHNvcnRDb21wYXJlcltpXVswXTtcbiAgICAgICAgY3JpdGVyaWFPcmRlciA9IHNvcnRDb21wYXJlcltpXVsxXTtcblxuICAgICAgICAvLyBHZXQgaXRlbXMnIGNhY2hlZCBzb3J0IHZhbHVlcyBmb3IgdGhlIGNyaXRlcmlhLiBJZiB0aGUgaXRlbSBoYXMgbm8gc29ydFxuICAgICAgICAvLyBkYXRhIGxldCdzIHVwZGF0ZSB0aGUgaXRlbXMgc29ydCBkYXRhICh0aGlzIGlzIGEgbGF6eSBsb2FkIG1lY2hhbmlzbSkuXG4gICAgICAgIHZhbEEgPSAoYS5fc29ydERhdGEgPyBhIDogYS5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuICAgICAgICB2YWxCID0gKGIuX3NvcnREYXRhID8gYiA6IGIuX3JlZnJlc2hTb3J0RGF0YSgpKS5fc29ydERhdGFbY3JpdGVyaWFOYW1lXTtcblxuICAgICAgICAvLyBTb3J0IHRoZSBpdGVtcyBpbiBkZXNjZW5kaW5nIG9yZGVyIGlmIGRlZmluZWQgc28gZXhwbGljaXRseS4gT3RoZXJ3aXNlXG4gICAgICAgIC8vIHNvcnQgaXRlbXMgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICBpZiAoY3JpdGVyaWFPcmRlciA9PT0gJ2Rlc2MnIHx8ICghY3JpdGVyaWFPcmRlciAmJiBpc0Rlc2NlbmRpbmcpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQiA8IHZhbEEgPyAtMSA6IHZhbEIgPiB2YWxBID8gMSA6IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQSA8IHZhbEIgPyAtMSA6IHZhbEEgPiB2YWxCID8gMSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIC0xIG9yIDEgYXMgdGhlIHJldHVybiB2YWx1ZSwgbGV0J3MgcmV0dXJuIGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB2YWx1ZXMgYXJlIGVxdWFsIGxldCdzIGNvbXBhcmUgdGhlIGl0ZW0gaW5kaWNlcyB0byBtYWtlIHN1cmUgd2VcbiAgICAgIC8vIGhhdmUgYSBzdGFibGUgc29ydC5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGlmICghaW5kZXhNYXApIGluZGV4TWFwID0gZ2V0SW5kZXhNYXAob3JpZ0l0ZW1zKTtcbiAgICAgICAgcmVzdWx0ID0gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1c3RvbUNvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBzb3J0Q29tcGFyZXIoYSwgYik7XG4gICAgICAvLyBJZiBkZXNjZW5kaW5nIGxldCdzIGludmVydCB0aGUgcmVzdWx0IHZhbHVlLlxuICAgICAgaWYgKGlzRGVzY2VuZGluZyAmJiByZXN1bHQpIHJlc3VsdCA9IC1yZXN1bHQ7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVzdWx0IChub3QgemVybykgbGV0J3MgcmV0dXJuIGl0IHJpZ2h0IGF3YXkuXG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgLy8gSWYgcmVzdWx0IGlzIHplcm8gbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGFcbiAgICAgIC8vIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgcmV0dXJuIGNvbXBhcmVJbmRpY2VzKGEsIGIpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihjb21wYXJlciwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIFNldHVwIHBhcmVudCBzY29wZSBkYXRhLlxuICAgICAgc29ydENvbXBhcmVyID0gY29tcGFyZXI7XG4gICAgICBpc0Rlc2NlbmRpbmcgPSAhIW9wdHMuZGVzY2VuZGluZztcbiAgICAgIG9yaWdJdGVtcyA9IGl0ZW1zLnNsaWNlKDApO1xuICAgICAgaW5kZXhNYXAgPSBudWxsO1xuXG4gICAgICAvLyBJZiBmdW5jdGlvbiBpcyBwcm92aWRlZCBkbyBhIG5hdGl2ZSBhcnJheSBzb3J0LlxuICAgICAgaWYgKGlzRnVuY3Rpb24oc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpdGVtcy5zb3J0KGN1c3RvbUNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYSBzdHJpbmcsIGxldCdzIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSBhcyBwcm92aWRlZCBpblxuICAgICAgLy8gdGhlIGluc3RhbmNlJ3Mgb3B0aW9ucy5cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3J0Q29tcGFyZXIgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgICAgc29ydENvbXBhcmVyID0gcGFyc2VDcml0ZXJpYShjb21wYXJlcik7XG4gICAgICAgIGl0ZW1zLnNvcnQoZGVmYXVsdENvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYW4gYXJyYXksIGxldCdzIGFzc3VtZSBpdCdzIGEgcHJlc29ydGVkIGFycmF5IG9mIHRoZVxuICAgICAgLy8gaXRlbXMgYW5kIG9yZGVyIHRoZSBpdGVtcyBiYXNlZCBvbiBpdC5cbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpZiAoc29ydENvbXBhcmVyLmxlbmd0aCAhPT0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHNvcnRDb21wYXJlci5pbmRleE9mKGl0ZW1zW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWycgKyBuYW1lc3BhY2UgKyAnXSBzb3J0IHJlZmVyZW5jZSBpdGVtcyBkbyBub3QgbWF0Y2ggd2l0aCBncmlkIGl0ZW1zLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpdGVtc1tpXSA9IHNvcnRDb21wYXJlcltpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZXNjZW5kaW5nKSBpdGVtcy5yZXZlcnNlKCk7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UgbGV0J3MganVzdCBza2lwIGl0LCBub3RoaW5nIHdlIGNhbiBkbyBoZXJlLlxuICAgICAgZWxzZSB7XG4gICAgICAgIC8qKiBAdG9kbyBNYXliZSB0aHJvdyBhbiBlcnJvciBoZXJlPyAqL1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBzb3J0IGV2ZW50LlxuICAgICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFNvcnQpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRTb3J0LCBpdGVtcy5zbGljZSgwKSwgb3JpZ0l0ZW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICAgIGlmIChsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBNb3ZlIGl0ZW0gdG8gYW5vdGhlciBpbmRleCBvciBpbiBwbGFjZSBvZiBhbm90aGVyIGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogICAtIEFjY2VwdHMgZWl0aGVyIFwibW92ZVwiIG9yIFwic3dhcFwiLlxuICAgKiAgIC0gXCJtb3ZlXCIgbW92ZXMgdGhlIGl0ZW0gaW4gcGxhY2Ugb2YgdGhlIG90aGVyIGl0ZW0uXG4gICAqICAgLSBcInN3YXBcIiBzd2FwcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW1zLlxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbihpdGVtLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pdGVtcy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNTd2FwID0gb3B0cy5hY3Rpb24gPT09IGFjdGlvblN3YXA7XG4gICAgdmFyIGFjdGlvbiA9IGlzU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuICAgIHZhciBmcm9tSXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgdmFyIHRvSXRlbSA9IHRoaXMuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgIHZhciBmcm9tSW5kZXg7XG4gICAgdmFyIHRvSW5kZXg7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW1zIGV4aXN0IGFuZCBhcmUgbm90IHRoZSBzYW1lLlxuICAgIGlmIChmcm9tSXRlbSAmJiB0b0l0ZW0gJiYgZnJvbUl0ZW0gIT09IHRvSXRlbSkge1xuICAgICAgLy8gR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBpdGVtcy5cbiAgICAgIGZyb21JbmRleCA9IGl0ZW1zLmluZGV4T2YoZnJvbUl0ZW0pO1xuICAgICAgdG9JbmRleCA9IGl0ZW1zLmluZGV4T2YodG9JdGVtKTtcblxuICAgICAgLy8gRG8gdGhlIG1vdmUvc3dhcC5cbiAgICAgIGlmIChpc1N3YXApIHtcbiAgICAgICAgYXJyYXlTd2FwKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlNb3ZlKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICBpdGVtOiBmcm9tSXRlbSxcbiAgICAgICAgICBmcm9tSW5kZXg6IGZyb21JbmRleCxcbiAgICAgICAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgaXRlbSB0byBhbm90aGVyIEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGdyaWRcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBwb3NpdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmFwcGVuZFRvPWRvY3VtZW50LmJvZHldXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0U2VuZGVyPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0UmVjZWl2ZXI9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oaXRlbSwgZ3JpZCwgcG9zaXRpb24sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgZ3JpZC5faXNEZXN0cm95ZWQgfHwgdGhpcyA9PT0gZ3JpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHRhcmdldCBpdGVtLlxuICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKGl0ZW0pO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY29udGFpbmVyID0gb3B0cy5hcHBlbmRUbyB8fCB3aW5kb3cuZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgbGF5b3V0U2VuZGVyID0gb3B0cy5sYXlvdXRTZW5kZXIgPyBvcHRzLmxheW91dFNlbmRlciA6IG9wdHMubGF5b3V0U2VuZGVyID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGxheW91dFJlY2VpdmVyID0gb3B0cy5sYXlvdXRSZWNlaXZlclxuICAgICAgPyBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA6IG9wdHMubGF5b3V0UmVjZWl2ZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIFN0YXJ0IHRoZSBtaWdyYXRpb24gcHJvY2Vzcy5cbiAgICBpdGVtLl9taWdyYXRlLnN0YXJ0KGdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpO1xuXG4gICAgLy8gSWYgbWlncmF0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGl0ZW0gaXMgYWN0aXZlLCBsZXQncyBsYXlvdXRcbiAgICAvLyB0aGUgZ3JpZHMuXG4gICAgaWYgKGl0ZW0uX21pZ3JhdGUuX2lzQWN0aXZlICYmIGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICBpZiAobGF5b3V0U2VuZGVyKSB7XG4gICAgICAgIHRoaXMubGF5b3V0KFxuICAgICAgICAgIGxheW91dFNlbmRlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFNlbmRlcikgPyBsYXlvdXRTZW5kZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXlvdXRSZWNlaXZlcikge1xuICAgICAgICBncmlkLmxheW91dChcbiAgICAgICAgICBsYXlvdXRSZWNlaXZlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFJlY2VpdmVyKSA/IGxheW91dFJlY2VpdmVyIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudHMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXMuc2xpY2UoMCk7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBVbmJpbmQgd2luZG93IHJlc2l6ZSBldmVudCBsaXN0ZW5lci5cbiAgICBpZiAodGhpcy5fcmVzaXplSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS5fZGVzdHJveShyZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBjb250YWluZXIuXG4gICAgcmVtb3ZlQ2xhc3MoY29udGFpbmVyLCB0aGlzLl9zZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG4gICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuXG4gICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50IGFuZCB1bmJpbmQgYWxsIGV2ZW50cy5cbiAgICB0aGlzLl9lbWl0KGV2ZW50RGVzdHJveSk7XG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgcmVmZXJlbmNlIGZyb20gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBGbGFnIGluc3RhbmNlIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UncyBpdGVtIGJ5IGVsZW1lbnQgb3IgYnkgaW5kZXguIFRhcmdldCBjYW4gYWxzbyBiZSBhbiBJdGVtXG4gICAqIGluc3RhbmNlIGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGl0ZW0gaWYgaXQgZXhpc3RzIHdpdGhpblxuICAgKiByZWxhdGVkIEdyaWQgaW5zdGFuY2UuIElmIG5vdGhpbmcgaXMgZm91bmQgd2l0aCB0aGUgcHJvdmlkZWQgdGFyZ2V0LCBudWxsXG4gICAqIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBbdGFyZ2V0XVxuICAgKiBAcmV0dXJucyB7P0l0ZW19XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZ2V0SXRlbSA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIC8vIElmIG5vIHRhcmdldCBpcyBzcGVjaWZpZWQgb3IgdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgcmV0dXJuIG51bGwuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0ICYmIHRhcmdldCAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRhcmdldCBpcyBudW1iZXIgcmV0dXJuIHRoZSBpdGVtIGluIHRoYXQgaW5kZXguIElmIHRoZSBudW1iZXIgaXMgbG93ZXJcbiAgICAvLyB0aGFuIHplcm8gbG9vayBmb3IgdGhlIGl0ZW0gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBpdGVtcyBhcnJheS4gRm9yXG4gICAgLy8gZXhhbXBsZSAtMSBmb3IgdGhlIGxhc3QgaXRlbSwgLTIgZm9yIHRoZSBzZWNvbmQgbGFzdCBpdGVtLCBldGMuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW3RhcmdldCA+IC0xID8gdGFyZ2V0IDogdGhpcy5faXRlbXMubGVuZ3RoICsgdGFyZ2V0XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5zdGFuY2Ugb2YgSXRlbSByZXR1cm4gaXQgaWYgaXQgaXMgYXR0YWNoZWQgdG8gdGhpc1xuICAgIC8vIEdyaWQgaW5zdGFuY2UsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSXRlbSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5fZ3JpZElkID09PSB0aGlzLl9pZCA/IHRhcmdldCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSW4gb3RoZXIgY2FzZXMgbGV0J3MgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBlbGVtZW50LCBzbyBsZXQncyB0cnlcbiAgICAvLyB0byBmaW5kIGFuIGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBlbGVtZW50IGFuZCByZXR1cm4gaXQuIElmIGl0ZW0gaXMgbm90XG4gICAgLy8gZm91bmQgcmV0dXJuIG51bGwuXG4gICAgLyoqIEB0b2RvIFRoaXMgY291bGQgYmUgbWFkZSBhIGxvdCBmYXN0ZXIgYnkgdXNpbmcgTWFwL1dlYWtNYXAgb2YgZWxlbWVudHMuICovXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9lbGVtZW50ID09PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgaW5zdGFuY2UncyBsYXlvdXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtMYXlvdXREYXRhfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3MubGF5b3V0O1xuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgaGVpZ2h0O1xuICAgIHZhciBuZXdMYXlvdXQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBMZXQncyBpbmNyZW1lbnQgbGF5b3V0IGlkLlxuICAgICsrbGF5b3V0LmlkO1xuXG4gICAgLy8gTGV0J3MgdXBkYXRlIGxheW91dCBpdGVtc1xuICAgIGxheW91dC5pdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9pc0FjdGl2ZSkgbGF5b3V0Lml0ZW1zLnB1c2godGhpcy5faXRlbXNbaV0pO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY29udGFpbmVyIHdpZHRoIGFuZCBoZWlnaHQgKHdpdGhvdXQgYm9yZGVycykuXG4gICAgd2lkdGggPSB0aGlzLl93aWR0aCAtIHRoaXMuX2JvcmRlckxlZnQgLSB0aGlzLl9ib3JkZXJSaWdodDtcbiAgICBoZWlnaHQgPSB0aGlzLl9oZWlnaHQgLSB0aGlzLl9ib3JkZXJUb3AgLSB0aGlzLl9ib3JkZXJCb3R0b207XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IGxheW91dC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncykpIHtcbiAgICAgIG5ld0xheW91dCA9IHNldHRpbmdzKGxheW91dC5pdGVtcywgd2lkdGgsIGhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheW91dCA9IHBhY2tlci5nZXRMYXlvdXQobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQuc2xvdHMsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIGdyaWQncyBsYXlvdXQuXG4gICAgbGF5b3V0LnNsb3RzID0gbmV3TGF5b3V0LnNsb3RzO1xuICAgIGxheW91dC5zZXRXaWR0aCA9IEJvb2xlYW4obmV3TGF5b3V0LnNldFdpZHRoKTtcbiAgICBsYXlvdXQuc2V0SGVpZ2h0ID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0SGVpZ2h0KTtcbiAgICBsYXlvdXQud2lkdGggPSBuZXdMYXlvdXQud2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9IG5ld0xheW91dC5oZWlnaHQ7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGEgZ3JpZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0gey4uLip9IFthcmddXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdC5hcHBseSh0aGlzLl9lbWl0dGVyLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGV2ZW50cyBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX2hhc0xpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2VtaXR0ZXIuX2V2ZW50c1tldmVudF07XG4gICAgcmV0dXJuICEhKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnMubGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIHdpZHRoLCBoZWlnaHQgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIHRoaXMuX2xlZnQgPSByZWN0LmxlZnQ7XG4gICAgdGhpcy5fdG9wID0gcmVjdC50b3A7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb250YWluZXIncyBib3JkZXIgc2l6ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxlZnRcbiAgICogQHBhcmFtIHtCb29sZWFufSByaWdodFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvcFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvdHRvbVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvcmRlcnMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgaWYgKGxlZnQpIHRoaXMuX2JvcmRlckxlZnQgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7XG4gICAgaWYgKHJpZ2h0KSB0aGlzLl9ib3JkZXJSaWdodCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXJpZ2h0LXdpZHRoJyk7XG4gICAgaWYgKHRvcCkgdGhpcy5fYm9yZGVyVG9wID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG4gICAgaWYgKGJvdHRvbSkgdGhpcy5fYm9yZGVyQm90dG9tID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggYWxsIG9mIGNvbnRhaW5lcidzIGludGVybmFsIGRpbWVuc2lvbnMgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdXBkYXRlQm91bmRpbmdSZWN0KCk7XG4gICAgdGhpcy5fdXBkYXRlQm9yZGVycygxLCAxLCAxLCAxKTtcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBvciBoaWRlIEdyaWQgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHsoU2hvd0NhbGxiYWNrfEhpZGVDYWxsYmFjayl9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3NldEl0ZW1zVmlzaWJpbGl0eSA9IGZ1bmN0aW9uKGl0ZW1zLCB0b1Zpc2libGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZ3JpZCA9IHRoaXM7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBvcHRzLm9uRmluaXNoO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY291bnRlciA9IHRhcmdldEl0ZW1zLmxlbmd0aDtcbiAgICB2YXIgc3RhcnRFdmVudCA9IHRvVmlzaWJsZSA/IGV2ZW50U2hvd1N0YXJ0IDogZXZlbnRIaWRlU3RhcnQ7XG4gICAgdmFyIGVuZEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93RW5kIDogZXZlbnRIaWRlRW5kO1xuICAgIHZhciBtZXRob2QgPSB0b1Zpc2libGUgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGNvbXBsZXRlZEl0ZW1zID0gW107XG4gICAgdmFyIGhpZGRlbkl0ZW1zID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgY2FsbCB0aGUgY2FsbGJhY2ssIGJ1dCBkb24ndCBlbWl0IGFueSBldmVudHMuXG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIGNhbGxiYWNrKHRhcmdldEl0ZW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHNob3dTdGFydC9oaWRlU3RhcnQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhzdGFydEV2ZW50KSkge1xuICAgICAgdGhpcy5fZW1pdChzdGFydEV2ZW50LCB0YXJnZXRJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gU2hvdy9oaWRlIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRhcmdldEl0ZW1zW2ldO1xuXG4gICAgICAvLyBJZiBpbmFjdGl2ZSBpdGVtIGlzIHNob3duIG9yIGFjdGl2ZSBpdGVtIGlzIGhpZGRlbiB3ZSBuZWVkIHRvIGRvXG4gICAgICAvLyBsYXlvdXQuXG4gICAgICBpZiAoKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHx8ICghdG9WaXNpYmxlICYmIGl0ZW0uX2lzQWN0aXZlKSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gd2UgYWxzbyBuZWVkIHRvIGRvIGEgbGl0dGxlIGhhY2sgdG8gbWFrZSB0aGVcbiAgICAgIC8vIGl0ZW0gbm90IGFuaW1hdGUgaXQncyBuZXh0IHBvc2l0aW9uaW5nIChsYXlvdXQpLlxuICAgICAgaWYgKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgaGlkZGVuIGl0ZW0gaXMgYmVpbmcgc2hvd24gd2UgbmVlZCB0byByZWZyZXNoIHRoZSBpdGVtJ3NcbiAgICAgIC8vIGRpbWVuc2lvbnMuXG4gICAgICBpZiAodG9WaXNpYmxlICYmIGl0ZW0uX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSB7XG4gICAgICAgIGhpZGRlbkl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cvaGlkZSB0aGUgaXRlbS5cbiAgICAgIGl0ZW0uX3Zpc2liaWxpdHlbbWV0aG9kXShpc0luc3RhbnQsIGZ1bmN0aW9uKGludGVycnVwdGVkLCBpdGVtKSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGl0ZW0ncyBhbmltYXRpb24gd2FzIG5vdCBpbnRlcnJ1cHRlZCBhZGQgaXQgdG8gdGhlXG4gICAgICAgIC8vIGNvbXBsZXRlZEl0ZW1zIGFycmF5LlxuICAgICAgICBpZiAoIWludGVycnVwdGVkKSBjb21wbGV0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuXG4gICAgICAgIC8vIElmIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICAgICAgLy8gYW5kIGVtaXQgc2hvd0VuZC9oaWRlRW5kIGV2ZW50LlxuICAgICAgICBpZiAoLS1jb3VudGVyIDwgMSkge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2soY29tcGxldGVkSXRlbXMuc2xpY2UoMCkpO1xuICAgICAgICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZW5kRXZlbnQpKSBncmlkLl9lbWl0KGVuZEV2ZW50LCBjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggaGlkZGVuIGl0ZW1zLlxuICAgIGlmIChoaWRkZW5JdGVtcy5sZW5ndGgpIHRoaXMucmVmcmVzaEl0ZW1zKGhpZGRlbkl0ZW1zKTtcblxuICAgIC8vIExheW91dCBpZiBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTWVyZ2UgZGVmYXVsdCBzZXR0aW5ncyB3aXRoIHVzZXIgc2V0dGluZ3MuIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYSBuZXdcbiAgICogb2JqZWN0IHdpdGggbWVyZ2VkIHZhbHVlcy4gVGhlIG1lcmdpbmcgaXMgYSBkZWVwIG1lcmdlIG1lYW5pbmcgdGhhdCBhbGxcbiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgc2V0dGluZ3Mgb2JqZWN0cyB3aWxsIGJlIGFsc28gbWVyZ2VkXG4gICAqIHNvIHRoYXQgbW9kaWZ5aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHNldHRpbmdzIG9iamVjdCB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uXG4gICAqIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0U2V0dGluZ3NcbiAgICogQHBhcmFtIHtPYmplY3R9IFt1c2VyU2V0dGluZ3NdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VTZXR0aW5ncyhkZWZhdWx0U2V0dGluZ3MsIHVzZXJTZXR0aW5ncykge1xuICAgIC8vIENyZWF0ZSBhIGZyZXNoIGNvcHkgb2YgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICB2YXIgcmV0ID0gbWVyZ2VPYmplY3RzKHt9LCBkZWZhdWx0U2V0dGluZ3MpO1xuXG4gICAgLy8gTWVyZ2UgdXNlciBzZXR0aW5ncyB0byBkZWZhdWx0IHNldHRpbmdzLlxuICAgIGlmICh1c2VyU2V0dGluZ3MpIHtcbiAgICAgIHJldCA9IG1lcmdlT2JqZWN0cyhyZXQsIHVzZXJTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHZpc2libGUvaGlkZGVuIHN0eWxlcyBtYW51YWxseSBzbyB0aGF0IHRoZSB3aG9sZSBvYmplY3QgaXNcbiAgICAvLyBvdmVycmlkZGVuIGluc3RlYWQgb2YgdGhlIHByb3BzLlxuICAgIHJldC52aXNpYmxlU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzIHx8IChkZWZhdWx0U2V0dGluZ3MgfHwgMCkudmlzaWJsZVN0eWxlcztcbiAgICByZXQuaGlkZGVuU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXM7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHR3byBvYmplY3RzIHJlY3Vyc2l2ZWx5IChkZWVwIG1lcmdlKS4gVGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAqIGFyZSBtZXJnZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogICAtIFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlXG4gICAqICAgLSBUaGUgc291cmNlIG9iamVjdC5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7XG4gICAgdmFyIGlzU291cmNlT2JqZWN0O1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcHJvcE5hbWUgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgaXNTb3VyY2VPYmplY3QgPSBpc1BsYWluT2JqZWN0KHNvdXJjZVtwcm9wTmFtZV0pO1xuXG4gICAgICAvLyBJZiB0YXJnZXQgYW5kIHNvdXJjZSB2YWx1ZXMgYXJlIGJvdGggb2JqZWN0cywgbWVyZ2UgdGhlIG9iamVjdHMgYW5kXG4gICAgICAvLyBhc3NpZ24gdGhlIG1lcmdlZCB2YWx1ZSB0byB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodGFyZ2V0W3Byb3BOYW1lXSkgJiYgaXNTb3VyY2VPYmplY3QpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IG1lcmdlT2JqZWN0cyhtZXJnZU9iamVjdHMoe30sIHRhcmdldFtwcm9wTmFtZV0pLCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIG9iamVjdCBhbmQgdGFyZ2V0J3MgaXMgbm90IGxldCdzIGNsb25lIHRoZSBvYmplY3QgYXNcbiAgICAgIC8vIHRoZSB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIGlmIChpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKHt9LCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIGFuIGFycmF5IGxldCdzIGNsb25lIHRoZSBhcnJheSBhcyB0aGUgdGFyZ2V0J3NcbiAgICAgIC8vIHZhbHVlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV0uc2xpY2UoMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBhbGwgb3RoZXIgY2FzZXMgbGV0J3MganVzdCBkaXJlY3RseSBhc3NpZ24gdGhlIHNvdXJjZSdzIHZhbHVlIGFzIHRoZVxuICAgICAgLy8gdGFyZ2V0J3MgdmFsdWUuXG4gICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIEdyaWQ7XG5cbn0pKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBJdGVtVmFsdWUgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuICBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlXG4gIGltcGxlbWVudHMgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIHtcblxuICBwcml2YXRlIHZpc3VhbGl6ZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy52aXN1YWxpemVyU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplclNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBcInNlbGVjdFwiXG4gICAgICApWzBdLnZhbHVlID0gdGhpcy52aXN1YWxpemVyLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+LFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3RcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpO1xuICAgIGlmICghdmlzdWFsaXplcnMgfHwgdmlzdWFsaXplcnMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlZpc3VhbGl6ZXJBcnJheVdyYXBwZXIgd29ya3Mgd2l0aCB2aXN1YWxpemVycyBjb2xsZWN0aW9uIG9ubHkuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIGlmICh2aXN1YWxpemVyLnN1cHBvcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3VwcG9ydFNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMudmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uLnB1c2goXG4gICAgICAgICAgPElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4oPGFueT52aXN1YWxpemVyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlVmlzdWFsaXplclwiLCAoKSA9PlxuICAgICAgdGhpcy52aXN1YWxpemVyU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgdGhpcy52aXN1YWxpemVycy5tYXAoKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZpc3VhbGl6ZXIudHlwZSxcbiAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ2aXN1YWxpemVyX1wiICsgdmlzdWFsaXplci50eXBlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLnZpc3VhbGl6ZXIudHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAoZTogYW55KSA9PiB0aGlzLnNldFZpc3VhbGl6ZXIoZS50YXJnZXQudmFsdWUpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMudmlzdWFsaXplciA9IHZpc3VhbGl6ZXJzWzBdO1xuICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZpc3VhbGl6ZXJDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsaXplcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzdWFsaXplcnM7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbjogQXJyYXk8SVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uPiA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkSXRlbTogSXRlbVZhbHVlO1xuICBwcml2YXRlIHZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlO1xuXG4gIHByaXZhdGUgb25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciBjb250ZW50IHR5cGUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICoqL1xuICBwdWJsaWMgb25WaXN1YWxpemVyQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSwgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIGFueT4oKTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2VsZWN0cyB2aXN1YWxpemVyIHRvIHNob3cgYnkgaXQgbmFtZS5cbiAgKlxuICAqIHBhcmFtZXRlcnM6XG4gICogbmFtZSAtIHRoZSBuYW1lIG9mIHZpc3VhbGl6ZXIgdG8gc2hvdyxcbiAgKiBxdWlldCAtIHNldCBpdCB0byB0cnVlIGlmIHlvdSBkb24ndCB3YW50IHRvIHJpc2UgYSBub3RpZmljYXRpb24gZXZlbnRcbiAgKlxuICAqKi9cbiAgcHVibGljIHNldFZpc3VhbGl6ZXIodHlwZTogc3RyaW5nLCBxdWlldCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdmlzdWFsaXplckNhbmRpZGF0ZSA9IHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnR5cGUgPT09IHR5cGUpWzBdO1xuICAgIGlmICghIXZpc3VhbGl6ZXJDYW5kaWRhdGUgJiYgdmlzdWFsaXplckNhbmRpZGF0ZSAhPT0gdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICBpZiAoISF0aGlzLnZpc3VhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKFxuICAgICAgICAgIHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFja1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplckNhbmRpZGF0ZTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgIHRoaXMub25WaXN1YWxpemVyQ2hhbmdlZC5maXJlKHRoaXMsIHsgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldCBvbkRhdGFJdGVtU2VsZWN0ZWQoXG4gICAgdmFsOiAoc2VsZWN0ZWRWYWx1ZTogYW55LCBzZWxlY3RlZFRleHQ6IHN0cmluZykgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLm9uRGF0YUl0ZW1TZWxlY3RlZCA9IHZhbDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuICg8YW55PnRoaXMudmlzdWFsaXplcikuc2VsZWN0aW9uIHx8IHRoaXMuc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMudmlzdWFsaXplckNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnZpc3VhbGl6ZXIucmVuZGVyKHRoaXMudmlzdWFsaXplckNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcik7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHZpc3VhbGl6ZXIgPT4gdmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjdXJyZW50IHZpc3VhbGl6ZXIgc3RhdGUuIFRoZSBwcm9wZXJ0aWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aXN1YWxpemVyLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgc2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIGNvbnN0IGN1cnJlbnRWaXN1YWxpemVyU3RhdGUgPSB0aGlzLnZpc3VhbGl6ZXIuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBzdGF0ZTogYW55ID0ge1xuICAgICAgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyLnR5cGUsXG4gICAgfTtcbiAgICBpZihPYmplY3Qua2V5cyhjdXJyZW50VmlzdWFsaXplclN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IGN1cnJlbnRWaXN1YWxpemVyU3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzdWFsaXplcidzIHN0YXRlLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgZ2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgaWYoISFzdGF0ZS52aXN1YWxpemVyKSB7XG4gICAgICB0aGlzLnNldFZpc3VhbGl6ZXIoc3RhdGUudmlzdWFsaXplciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmKCEhc3RhdGUuc3RhdGUpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplci5zZXRTdGF0ZShzdGF0ZS5zdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3IoXG4gIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyXG4pO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBhcmFiaWNTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLYstix2KfYsSDYp9mE2YXYrNmF2YjYudipXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2KrZhSDYp9mE2KrYrdiv2YrYqyDZhdmGINiu2YTYp9mE2YlcIixcbiAgc2VsZWN0QnV0dG9uOiBcItin2K7YqtixXCIsXG4gIGhpZGVDb2x1bW46IFwi2KfYrtmB2KfYoSDYp9mE2LnZhdmI2K9cIixcbiAgc2hvd0NvbHVtbjogXCLYp9i42YfYp9ixXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcItij2KzYudmEINin2YTYudmF2YjYryDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLYo9is2LnZhCDYp9mE2LnZhdmI2K8g2LnYp9mFXCIsXG4gIG1vdmVUb0RldGFpbDogXCLYp9mG2KrZgtmEINil2YTZiSDYp9mE2KrZgdin2LXZitmEXCIsXG4gIHNob3dBc0NvbHVtbjogXCLYpdi42YfYp9ixINmD2LnZhdmI2K9cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwi2KjYrdirLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwi2K3YsNmBXCIsXG4gIHNob3dMYWJlbDogXCLYp9i42YfYp9ixXCIsXG4gIGVudHJpZXNMYWJlbDogXCLZhdiv2K7ZhNin2KpcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcItis2K/Yp9mI2YRcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi2YPZhNmF2KfYqlwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLYp9mE2LHYs9mFINin2YTYqNmK2KfZhtmKXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcItmF2KrZiNiz2LdcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcItis2K/ZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCLYsdiz2YUg2KjZitin2YbZilwiLFxuICBjaGFydFR5cGVfYmFyOiBcIti02LHZiti3XCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIti02LHZiti3INi52YXZiNiv2YpcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwi2LTYsdmK2Lcg2YXZg9iv2LNcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvdWdobnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlNjYXR0ZXJcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2KfYrtmB2KfYoVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCLYo9is2LnZhCDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCLYo9is2LnZhCDYudin2YVcIixcbiAgc2hvd0J1dHRvbjogXCLYp9i42YfYp9ixXCIsXG4gIGZpbHRlcjogXCLYqtix2LTYrVwiLFxuICByZXNldEZpbHRlcjogXCLYpdi52KfYr9ipINiq2LnZitmK2YZcIixcbiAgY2hhbmdlTG9jYWxlOiBcItiq2LrZitmK2LEg2KfZhNmE2LrYqVwiLFxuICBlbjogXCLYp9mE2YTYutipINin2YTYp9mG2KzZhNmK2LLZitipXCIsXG4gIGZyOiBcItin2YTZhNi62Ycg2KfZhNmB2LHZhtiz2YrYqVwiLFxuICBydTogXCLYp9mE2YTYutmHINin2YTYsdmI2LPZitipXCIsXG4gIGRlOiBcItin2YTZhNi62Ycg2KfZhNin2YbYrNmE2YrYstmK2KlcIixcbiAgY2xlYXJCdXR0b246IFwi2YXYs9itXCIsXG4gIGFkZEVsZW1lbnQ6IFwi2KfYrtiq2LEg2LPYpNin2YTYp9mLINmE2YTYudix2LYgLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCLYp9mE2KrYsdiq2YrYqCDYp9mE2KfZgdiq2LHYp9i22YpcIixcbiAgYXNjT3JkZXI6IFwi2KrYtdin2LnYr9mJXCIsXG4gIGRlc2NPcmRlcjogXCLYqtmG2KfYstmE2YlcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCLYpdi42YfYp9ixINin2YTYo9i52YXYr9ipINin2YTYq9in2YbZiNmK2KlcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi2KjZhtmI2K8g2YjYqti52YTZitmC2KfYqiDYo9iu2LHZiVwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwi2LnYsdi2INin2YTZhtiz2Kgg2KfZhNmF2KbZiNmK2KlcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcItil2K7Zgdin2KEg2KfZhNmG2LPYqFwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcItiq2YbYstmK2YQg2KjYtdmK2LrYqSBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCLYpdiu2YHYp9ihINin2YTYpdis2KfYqNin2Kog2KfZhNmB2KfYsdi62KlcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCLYpdi42YfYp9ixINin2YTYpdis2KfYqNin2Kog2KfZhNmB2KfYsdi62KlcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcItil2K7Zgdin2KEg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCLYudix2LYg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi2KPYrNmI2KjYqSDZhdmB2YLZiNiv2KlcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi2YTZhSDZitiq2YUg2KfZhNi52LHYtiDYqNi52K9cIixcbiAgbm9SZXN1bHRzOiBcItmE2Kcg2YrZiNis2K8g2YbYqtin2KbYrCDZhNmE2LnYsdi2XCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwi2YTZg9mEINin2YTZgtmK2YVcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwi2YTZg9mEINin2YTYo9i52YXYr9ipXCIsXG4gIGFuc3dlcjogXCLYpdis2KhcIixcbiAgY29ycmVjdEFuc3dlcjogXCLYp9mE2KfYrNin2KjYqSDYp9mE2LXYrdmK2K3YqTogXCIsXG4gIHBlcmNlbnQ6IFwi2KfZhNmG2LPYqNmHINin2YTZhdim2YjZitmHXCIsXG4gIHJlc3BvbnNlczogXCLYp9mE2KfYs9iq2KzYp9io2KfYqlwiLFxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJhclwiXSA9IGFyYWJpY1N0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJhclwiXSA9IFwiQXJhYmljXCI7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvZXAgZG9vciBtaWpcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZWdyb2VwZXJlbiBiaWogbWlqXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3RlZXIgbWlqXCIsXG4gIGhpZGVDb2x1bW46IFwiS29sb20gdmVyYmVyZ2VuXCIsXG4gIHNob3dDb2x1bW46IFwiVG9vbiBrb2xvbVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJLb2xvbSBwcml2w6kgbWFrZW5cIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWFrIGRlIGtvbG9tIG9wZW5iYWFyXCIsXG4gIG1vdmVUb0RldGFpbDogXCJHYSBuYWFyIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiV2VlcmdldmVuIGFscyBrb2xvbVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJab2VrZW4uLi5cIixcbiAgcmVtb3ZlUm93czogXCJWZXJ3aWpkZXIgcmlqZW5cIixcbiAgc2hvd0xhYmVsOiBcIlRvbmVuXCIsXG4gIGVudHJpZXNMYWJlbDogXCJpbnplbmRpbmdlblwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGVrc3RlbiBpbiB0YWJlbFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWxkZSBCYXJcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVGFhcnRcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiVmVyc3Ryb29pZW5cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk1ldGVyXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiS29nZWxcIixcbiAgaGlkZUJ1dHRvbjogXCJWZXJiZXJnZW5cIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFhayBwcml2ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk9wZW5iYWFyIG1ha2VuXCIsXG4gIHNob3dCdXR0b246IFwiVG9uZW5cIixcbiAgcmVzZXRGaWx0ZXI6IFwiRmlsdGVyIHJlc2V0dGVuXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJXaWp6aWcgZGUgbGFuZGluc3RlbGxpbmdcIixcbiAgY2xlYXJCdXR0b246IFwiRG9vcnppY2h0aWdcIixcbiAgYWRkRWxlbWVudDogXCJLaWVzIGVlbiB2cmFhZyBvbSB3ZWVyIHRlIGdldmVuIC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiU3RhbmRhYXJkdm9sZ29yZGVcIixcbiAgYXNjT3JkZXI6IFwiT3Bsb3BlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFmbG9wZW5kXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiVG9vbiBrbGVpbmUga29sb21tZW5cIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5kZXJlIGl0ZW1zIGVuIG9wbWVya2luZ2VuXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJQZXJjZW50YWdlcyB3ZWVyZ2V2ZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlZlcmJlcmcgcGVyY2VudGFnZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEb3dubG9hZCBwbG90IGFscyBlZW4gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiVmVyYmVyZyBsZWdlIGFudHdvb3JkZW5cIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJUb29uIGxlZ2UgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbGUgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBhbnR3b29yZGVuXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIGFudHdvb3JkZW5cIixcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJubFwiXSA9IGR1dGNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5sXCJdID0gXCJEdXRjaFwiO1xuIiwiLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSBjcmVhdGUgYSBjdXN0b20gZGljdGlvbmFyeVxuLy8gaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBlbmdsaXNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJVbmdyb3VwIEJ5IE1lXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3QgTWVcIixcbiAgaGlkZUNvbHVtbjogXCJIaWRlIGNvbHVtblwiLFxuICBzaG93Q29sdW1uOiBcIlNob3cgY29sdW1uXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWtlIGNvbHVtbiBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmUgdG8gRGV0YWlsXCIsXG4gIHNob3dBc0NvbHVtbjogXCJTaG93IGFzIENvbHVtblwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIixcbiAgcmVtb3ZlUm93czogXCJSZW1vdmUgcm93c1wiLFxuICBzaG93TGFiZWw6IFwiU2hvd1wiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50cmllc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dHMgaW4gdGFibGVcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIlN0YWNrZWQgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcIkhpZGVcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFrZSBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiTWFrZSBwdWJsaWNcIixcbiAgc2hvd0J1dHRvbjogXCJTaG93XCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzZXQgRmlsdGVyXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDaGFuZ2UgTG9jYWxlXCIsXG4gIGVuOiBcIkVuZ2xpc2hcIixcbiAgZnI6IFwiRnJhbsOnYWlzXCIsXG4gIHJ1OiBcItCg0YPRgdGB0LrQuNC5XCIsXG4gIGRlOiBcIkRldXRzY2hcIixcbiAgY2xlYXJCdXR0b246IFwiQ2xlYXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9vc2UgcXVlc3Rpb24gdG8gc2hvdy4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXVsdCBPcmRlclwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRpbmdcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRpbmdcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJTaG93IG1pbm9yIGNvbHVtbnNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiT3RoZXIgaXRlbXMgYW5kIGNvbW1lbnRzXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJTaG93IHBlcmNlbnRhZ2VzXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJIaWRlIHBlcmNlbnRhZ2VzXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhcyBhIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkhpZGUgZW1wdHkgYW5zd2Vyc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIlNob3cgZW1wdHkgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJUb3AgNSBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiVG9wIDEwIGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgYW5zd2Vyc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlRoaXMgcXVlc3Rpb24gdHlwZSBpcyBub3QgdmlzdWFsaXplZCB5ZXRcIixcbiAgbm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbHVtbnNcIixcbiAgYW5zd2VyOiBcIkFuc3dlclwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIixcbiAgcGVyY2VudDogXCJQZXJjZW50XCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb25zZXNcIlxufTtcblxuLy8gVW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBSZXBsYWNlIFwiZW5cIiB3aXRoIGEgY3VzdG9tIGxvY2FsZSBjb2RlIChmb3IgZXhhbXBsZSwgXCJmclwiIG9yIFwiZGVcIiksXG4vLyBSZXBsYWNlIGBlbmdsaXNoU3RyaW5nc2Agd2l0aCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBmYXJzaVN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcItqv2LHZiNmHINio2YbYr9uMINio2KdcIixcbiAgdW5ncm91cEJ1dHRvbjogXCLYrdiw2YEg2q/YsdmI2YdcIixcbiAgc2VsZWN0QnV0dG9uOiBcItin2YbYqtiu2KfYqFwiLFxuICBoaWRlQ29sdW1uOiBcItmF2K7ZgduMINqp2LHYr9mGINiz2KrZiNmGXCIsXG4gIHNob3dDb2x1bW46IFwi2YbZhdin24zYtCDYs9iq2YjZhlwiLFxuICBtb3ZlVG9EZXRhaWw6IFwi2KfZhtiq2YLYp9mEINio2Ycg2KzYstim24zYp9iqXCIsXG4gIHNob3dBc0NvbHVtbjogXCLZhtmF2KfbjNi0INio2Ycg2LnZhtmI2KfZhiDYs9iq2YjZhlwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi2YXYqtmI2YYg2K/YsSDYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLYp9io2LEg2qnZhNmF2KfYqlwiLFxuICBjaGFydFR5cGVfYmFyOiBcItmF24zZhNmHINin24xcIixcbiAgY2hhcnRUeXBlX3BpZTogXCLYr9in2KjYsdmHINin24wocGllKVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCLZvtix2KfaqdmG2K/ar9uMKFNjYXR0ZXIpXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCLYudmC2LHYqNmHINin24xcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCLZhdiu2YHbjFwiLFxuICByZXNldEZpbHRlcjogXCLYqNin2LLZhti02KfZhtuMINmB24zZhNiq2LHZh9inXCIsXG4gIGNsZWFyQnV0dG9uOiBcItm+2KfaqSDaqdix2K/ZhlwiLFxuICBhZGRFbGVtZW50OiBcItin2YbYqtiu2KfYqCDYs9mI2KfZhCDYqNix2KfbjCDZhtmF2KfbjNi0Li4uXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBmYXJzaVN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmYVwiXSA9IFwiRmFyc2koUGVyc2lhbilcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZnJlbmNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXBlclwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRpc3NvY2llclwiLFxuICBzZWxlY3RCdXR0b246IFwiU8OpbGVjdGlvbm5lclwiLFxuICBoaWRlQ29sdW1uOiBcIk1hc3F1ZXIgY29sb25uZVwiLFxuICBzaG93Q29sdW1uOiBcIkFmZmljaGVyIGNvbG9ubmVcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiUmVuZHJlIGxhIGNvbG9ubmUgcHJpdsOpXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiUmVuZHJlIGxhIGNvbG9ubmUgcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJEw6lwbGFjZXIgdmVycyBkw6l0YWlsc1wiLFxuICBzaG93QXNDb2x1bW46IFwiQWZmaWNoZXIgZW4gY29sb25uZVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJSZWNoZXJjaGVyLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiU3VwcHJpbWVyIGNvbG9ubmVcIixcbiAgc2hvd0xhYmVsOiBcIkFmZmljaGVyXCIsXG4gIGVudHJpZXNMYWJlbDogXCJlbnRyw6llc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dGVzIGVuIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIk51YWdlcyBkZSBtb3RzXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFycmVzXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJlcyBlbXBpbMOpZXNcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkFubmVhdVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlNlY3RldXJzXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIk51YWdlcyBkZSBwb2ludHNcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGVzXCIsXG4gIGZpbHRlcjogXCJGaWx0cmVcIixcbiAgaGlkZUJ1dHRvbjogXCJNYXNxdWVyXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2F1dmVyIGVuIHBuZ1wiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJSZW5kcmUgcHJpdsOpXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiUmVuZHJlIHB1YmxpcXVlXCIsXG4gIHNob3dCdXR0b246IFwiQWZmaWNoZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmFmcmFpY2hpciBGaWx0cmVzXCIsXG4gIGNsZWFyQnV0dG9uOiBcIlJhZnJhaWNoaXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9pc2lyIGxhIHF1ZXN0aW9uIMOgIGFmZmljaGVyLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJEZWZhdXRcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kYW50XCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kYW50XCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiQWZmaWNoZXIgbGVzIGNvbG9ubmVzIG1pbmV1cmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkF1dHJlIMOpbMOpbWVudCBldCBjb21tZW50YWlyZXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiQ2UgdHlwZSBkZSBxdWVzdGlvbiBuJ2VzdCBwYXMgZW5jb3JlIHZpc3VhbGlzw6lcIixcbiAgbm9SZXN1bHRzOiBcIklsIG4neSBhIHBhcyBlbmNvcmUgZGUgcsOpc3VsdGF0c1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBhciB2YWxldXJcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGFyIGNvbG9ubmVcIixcbiAgYW5zd2VyOiBcIlLDqXBvbnNlXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiUsOpcG9uc2UgY29ycmVjdGU6IFwiLFxuICBwZXJjZW50OiBcIlBvdXJjZW50YWdlXCIsXG4gIHJlc3BvbnNlczogXCJSw6lwb25zZXNcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiRnJlbmNoXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGdlcm1hblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBwaWVyZW5cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJHcnVwcGllcnVuZyBhdWZoZWJlblwiLFxuICBzZWxlY3RCdXR0b246IFwiTWljaCBhdXN3w6RobGVuXCIsXG4gIGhpZGVDb2x1bW46IFwiU3BhbHRlIGF1c2JsZW5kZW5cIixcbiAgc2hvd0NvbHVtbjogXCJTcGFsdGUgZWluYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJTcGFsdGUgcHJpdmF0IG1hY2hlblwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlNwYWx0ZSB2ZXLDtmZmZW50bGljaGVuXCIsXG4gIG1vdmVUb0RldGFpbDogXCJpbiBEZXRhaWxzIHZlcnNjaGllYmVuXCIsXG4gIHNob3dBc0NvbHVtbjogXCJBbHMgU3BhbHRlIGFuemVpZ2VuXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlN1Y2hlLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiWmVpbGVuIGVudGZlcm5lblwiLFxuICBzaG93TGFiZWw6IFwiYW56ZWlnZW5cIixcbiAgZW50cmllc0xhYmVsOiBcIkVpbnRyw6RnZVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dGUgaW4gVGFiZWxsZW5mb3JtXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1tXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIkR1cmNoc2Nobml0dFwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiTGlzdGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkRpYWdyYW1tdHlwXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiQmFsa2VuZGlhZ3JhbW0gdmVydGlrYWxcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWx0ZXMgQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0LURpYWdyYW1tXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiS3JlaXNkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGVkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiUGVnZWxkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkF1ZnrDpGhsdW5nc2RpYWdyYW1tXCIsXG4gIGhpZGVCdXR0b246IFwiQXVzYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJQcml2YXQgbWFjaGVuXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiw5ZmZmVudGxpY2ggbWFjaGVuXCIsXG4gIHNob3dCdXR0b246IFwiQW56ZWlnZW5cIixcbiAgZmlsdGVyOiBcIkZpbHRlclwiLFxuICByZXNldEZpbHRlcjogXCJGaWx0ZXIgenVyw7xja3NldHplblwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiTG9rYWxpc2llcnVuZyDDpG5kZXJuXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkVpbnN0ZWxsdW5nZW4gbMO2c2NoZW5cIixcbiAgYWRkRWxlbWVudDogXCJXw6RobGVuIFNpZSBlaW5lIEZyYWdlLCB1bSB6dSB6ZWlnZW4uLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkcmVpaGVuZm9sZ2VcIixcbiAgYXNjT3JkZXI6IFwiQXVmc3RlaWdlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFic3RlaWdlbmRcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJLbGVpbmVyZSBTcGFsdGVuIGFuemVpZ2VuXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFuZGVyZSBQdW5rdGUgdW5kIEtvbW1lbnRhcmVcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYW56ZWlnZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYXVzYmxlbmRlblwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRpYWdyYW1tIGFscyBwbmcgaGVydW50ZXJsYWRlblwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkxlZXJlIEFudHdvcnRlbiBhdXNibGVuZGVuXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTGVlcmUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiQWxsZSBBbnR3b3J0ZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IEFudHdvcnRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBBbnR3b3J0ZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgQW50d29ydGVuXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJGZWhsZW5kZSBBbnR3b3J0ZW4gYXVzYmxlbmRlblwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiRmVobGVuZGUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiRmVobGVkZSBBbnR3b3J0ZW5cIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRsO8ciBkaWVzZW4gRnJhZ2V0eXAgZ2lidCBlcyBub2NoIGtlaW5lIFZpc3VhbGlzaWVydW5nLlwiLFxuICBub1Jlc3VsdHM6IFwiRXMgbGllZ2VuIG5vY2gga2VpbmUgRXJnZWJuaXNzZSB2b3JcIixcbiAgc2hvd1BlclZhbHVlczogXCJQcm8gV2VydFwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQcm8gU3BhbHRlXCIsXG4gIGFuc3dlcjogXCJBbnR3b3J0XCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiS29ycmVrdGUgQW50d29ydDogXCIsXG4gIHBlcmNlbnQ6IFwiUHJvemVudFwiLFxuICByZXNwb25zZXM6IFwiQW50d29ydGVuXCJcbn07XG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImRlXCJdID0gXCJHZXJtYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgaXRhbGlhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIlJhZ2dydXBwYVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRpdmlkaVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZXppb25hbWlcIixcbiAgaGlkZUNvbHVtbjogXCJOYXNjb25kaSBjb2xvbm5hXCIsXG4gIHNob3dDb2x1bW46IFwiTW9zdHJhIGNvbG9ubmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwcml2YXRhXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwdWJibGljYVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiU3Bvc3RhIGluIERldHRhZ2xpb1wiLFxuICBzaG93QXNDb2x1bW46IFwiTW9zdHJhIGNvbWUgQ29sb25uYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJDZXJjYS4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJpbXVvdmkgcmlnaGVcIixcbiAgc2hvd0xhYmVsOiBcIk1vc3RyYVwiLFxuICBlbnRyaWVzTGFiZWw6IFwidm9jaVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiUGFyb2xlIGluIHRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnV2b2xhIGRpIHBhcm9sZVwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJJc3RvZ3JhbW1hXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIk1lZGlhXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJlbGxhXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJHcmFmaWNvXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiR3JhZmljbyBhIGJhcnJlXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkdyYWZpY28gYSBiYXJyZSB2ZXJ0aWNhbGlcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHNvdnJhcHBvc3RlXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJHcmFmaWNvIGEgY2lhbWJlbGxhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiR3JhZmljbyBhIHRvcnRhXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIkdyYWZpY28gYSBkaXNwZXJzaW9uZVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR3JhZmljbyBHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIlB1bnRvXCIsXG4gIGhpZGVCdXR0b246IFwiTmFzY29uZGlcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZGkgcHJpdmF0b1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRpIHB1YmJsaWNvXCIsXG4gIHNob3dCdXR0b246IFwiTW9zdHJhXCIsXG4gIGZpbHRlcjogXCJGaWx0cm9cIixcbiAgcmVzZXRGaWx0ZXI6IFwiQ2FuY2VsbGEgZmlsdHJvXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDYW1iaWEgbGluZ3VhXCIsXG4gIGVuOiBcIkluZ2xlc2VcIixcbiAgZnI6IFwiRnJhbmNlc2VcIixcbiAgcnU6IFwiUnVzc29cIixcbiAgZGU6IFwiVGVkZXNjb1wiLFxuICBjbGVhckJ1dHRvbjogXCJDYW5jZWxsYVwiLFxuICBhZGRFbGVtZW50OiBcIlNjZWdsaSBsYSBkb21hbmRhIGRhIG1vc3RyYXJlLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJPcmRpbmUgZGkgRGVmYXVsdFwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEaXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYSBjb2xvbm5lIHNlY29uZGFyaWVcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQWx0cmkgcHVudGkgZSBjb21tZW50aVwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhIHBlcmNlbnR1YWxpXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJOYXNjb25kaSBwZXJjZW50dWFsaVwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIlNjYXJpY2EgaWwgZ3JhZmljbyBpbiBmb3JtYXRvIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIk5hc2NvbmRpIHJpc3Bvc3RlIHZ1b3RlXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhIHJpc3Bvc3RlIHZ1b3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVHV0dGUgbGUgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IHJpc3Bvc3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiVG9wIDEwIHJpc3Bvc3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIHJpc3Bvc3RlXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJOYXNjb25kaSBsZSByaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhIGxlIHJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiUmlzcG9zdGUgbWFuY2FudGlcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiUXVlc3RvIHRpcG8gZGkgZG9tYW5kYSBub24gw6ggYW5jb3JhIHN0YXRvIHZpc3VhbGl6emF0b1wiLFxuICBub1Jlc3VsdHM6IFwiTm9uIGNpIHNvbm8gYW5jb3JhIHJpc3VsdGF0aVwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciBWYWxvcmlcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbG9ubmVcIixcbiAgYW5zd2VyOiBcIlJpc3Bvc3RhXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudHVhbGVcIixcbiAgcmVzcG9uc2VzOiBcIlJpc3Bvc3RlXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJJdGFsaWFuXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIG5vcndlZ2lhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBwZXJcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJPcHBoZXYgZ3J1cHBlcmluZ1wiLFxuICBzZWxlY3RCdXR0b246IFwiVmVsZ1wiLFxuICBoaWRlQ29sdW1uOiBcIlNranVsIGtvbG9ubmVcIixcbiAgc2hvd0NvbHVtbjogXCJWaXMga29sb25uZVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJHasO4ciBrb2xvbm5lIHByaXZhdFwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIkdqw7hyIGtvbG9ubmUgb2ZmZW50bGlnXCIsXG4gIG1vdmVUb0RldGFpbDogXCJGbHl0dCB0aWwgZGV0YWxqZXJ0IHZpc25pbmdcIixcbiAgc2hvd0FzQ29sdW1uOiBcIlZpcyBzb20ga29sb25uZVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTw7hrLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiRmplcm4gcmFkZXJcIixcbiAgc2hvd0xhYmVsOiBcIlZpc1wiLFxuICBlbnRyaWVzTGFiZWw6IFwib3BwZsO4cmluZ2VyXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUYWJlbGx2aXNuaW5nXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIk9yZHNreVwiLFxuICBjaGFydFR5cGVfYmFyOiBcIlN0b2xwZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhYmxldCBzdG9scGVkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJIanVsZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlNla3RvcmRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiUHVua3RkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNw6VsZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJLdWxlZGlhZ3JhbVwiLFxuICBoaWRlQnV0dG9uOiBcIlNranVsXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIkdqw7hyIHByaXZhdFwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIkdqw7hyIG9mZmVudGxpZ1wiLFxuICBzaG93QnV0dG9uOiBcIlZpc1wiLFxuICByZXNldEZpbHRlcjogXCJOdWxsc3RpbGwgZmlsdGVyXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJCeXR0IHNwcsOla1wiLFxuICBjbGVhckJ1dHRvbjogXCJUw7htXCIsXG4gIGFkZEVsZW1lbnQ6IFwiVmVsZyBzcMO4cnNtw6VsLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJTdGFuZGFyZFwiLFxuICBhc2NPcmRlcjogXCJTdGlnZW5kZVwiLFxuICBkZXNjT3JkZXI6IFwiU3lua2VuZGVcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJWaXMgbWluZHJlIGtvbG9ubmVyXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFubmV0IG9nIGtvbW1lbnRhcmVyXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJWaXMgcHJvc2VudGVyXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJTa2p1bCBwcm9zZW50ZXJcIixcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wibm9cIl0gPSBub3J3ZWdpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibm9cIl0gPSBcIk5vcndlZ2lhblwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBwb3J0dWd1ZXNlU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiQWdydXBhciBQb3IgTWltXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGVzYWdydXBhciBQb3IgTWltXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY2lvbmFyXCIsXG4gIGhpZGVDb2x1bW46IFwiRXNjb25kZXIgY29sdW5hXCIsXG4gIHNob3dDb2x1bW46IFwiTW9zdHJhciBjb2x1bmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiVG9ybmFyIGNvbHVuYSBwcml2YWRhXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiVG9ybmFyIGNvbHVuYSBww7pibGljYVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiTW92ZXIgcGFyYSBEZXRhbGhlc1wiLFxuICBzaG93QXNDb2x1bW46IFwiTW9zdHJhciBjb21vIENvbHVuYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJQZXNxdWlzYXIuLi5cIixcbiAgcmVtb3ZlUm93czogXCJSZW1vdmVyIGxpbmhhc1wiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50cmFkYXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRvcyBlbSB0YWJlbGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnV2ZW0gZGUgcGFsYXZyYXNcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtYVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJNw6lkaWFcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmVsYVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiR3LDoWZpY29cIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJyYVwiLFxuICBjaGFydFR5cGVfdmJhcjogXCJCYXJyYSB2ZXJ0aWNhbFwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJCYXJyYSBFbXBpbGhhZGFcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIlJvc2NhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVGFydGVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiTGFzdHJvXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJFc2NhbGFcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCYWxhXCIsXG4gIGhpZGVCdXR0b246IFwiRXNjb25kZXJcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiVG9ybmFyIHByaXZhZG9cIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJUb3JuYXIgcMO6YmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFyXCIsXG4gIGZpbHRlcjogXCJGaWx0cmFyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc3RhdXJhciBGaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIk11ZGFyIExvY2FsaXphw6fDo29cIixcbiAgZW46IFwiSW5nbMOqc1wiLFxuICBmcjogXCJGcmFuY8Oqc1wiLFxuICBydTogXCJSdXNzb1wiLFxuICBkZTogXCJBbGVtw6NvXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkxpbXBhclwiLFxuICBhZGRFbGVtZW50OiBcIkVzY29saGVyIHF1ZXN0w6NvIHBhcmEgbW9zdHJhci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiT3JkZW5hw6fDo28gUGFkcsOjb1wiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYXIgY29sdW5hcyBtZW5vcmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk91dHJvcyBpdGVucyBlIGNvbWVudMOhcmlvc1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhciBwZXJjZW50dWFpc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiRXNjb25kZXIgcGVyY2VudHVhaXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJCYWl4YXIgZGlhZ3JhbWEgY29tbyBQTkdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJFc2NvbmRlciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgYXMgcmVzcG9zdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJQcmltZWlyYXMgNSByZXNwb3N0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJQcmltZWlyYXMgMTAgcmVzcG9zdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiUHJpbWVpcmFzIDIwIHJlc3Bvc3Rhc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiT2N1bHRhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIlBlcmd1bnRhcyBuw6NvIHJlc3BvbmRpZGFzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkVzdGUgdGlwbyBkZSBwZXJndW50YSBhaW5kYSBuw6NvIGZvaSB2aXN1YWxpemFkYVwiLFxuICBub1Jlc3VsdHM6IFwiQWluZGEgbsOjbyBwb3NzdWkgcmVzdWx0YWRvc1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBvciB2YWxvcmVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBvciBjb2x1bmFzXCIsXG4gIGFuc3dlcjogXCJSZXNwb3N0YVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlJlc3Bvc3RhIGNvcnJldGE6IFwiLFxuICBwZXJjZW50OiBcIlBlcmNlbnRhZ2VtXCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb3N0YXNcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcInB0XCJdID0gcG9ydHVndWVzZVN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwdFwiXSA9IFwiUG9ydHVndcOqc1wiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJVbmdyb3VwIEJ5IE1lXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3QgTWVcIixcbiAgaGlkZUNvbHVtbjogXCJIaWRlIGNvbHVtblwiLFxuICBzaG93Q29sdW1uOiBcIlNob3cgY29sdW1uXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWtlIGNvbHVtbiBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmUgdG8gRGV0YWlsXCIsXG4gIGZpbHRlcjogXCLQpNC40LvRjNGC0YBcIixcbiAgc2hvd0FzQ29sdW1uOiBcIlNob3cgYXMgQ29sdW1uXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZXh0cyBpbiB0YWJsZVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhY2tlZCBCYXJcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvdWdobnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlNjYXR0ZXJcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi0KHQutGA0YvRgtGMXCIsXG4gIHNob3dCdXR0b246IFwi0J/QvtC60LDQt9Cw0YLRjFwiLFxuICByZXNldEZpbHRlcjogXCLQntGH0LjRgdGC0LjRgtGMINGE0LjQu9GM0YLRgFwiLFxuICBjaGFuZ2VMb2NhbGU6IFwi0KHQvNC10L3QuNGC0Ywg0Y/Qt9GL0LpcIixcbiAgY2xlYXJCdXR0b246IFwiQ2xlYXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9vc2UgcXVlc3Rpb24gdG8gc2hvdy4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXVsdFwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRpbmdcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRpbmdcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJTaG93IG1pbm9yIGNvbHVtbnNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi0JTRgNGD0LPQvtC1INC4INC60L7QvNC80LXQvdGC0LDRgNC40LhcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi0K3RgtC+0YIg0YLQuNC/INCy0L7Qv9GA0L7RgdCwINC10YnQtSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0LDQvdCw0LvQuNGC0LjQutC+0LlcIixcbiAgbm9SZXN1bHRzOiBcItCg0LXQt9GD0LvRjNGC0LDRgtGLINC+0YLRgdGD0YLRgdGC0LLRg9GO0YJcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicnVcIl0gPSBcIlJ1c3NpYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgc3BhbmlzaFN0cmluZ3MgPSB7XG4gIFwidW5ncm91cEJ1dHRvblwiOiBcIkRlc2FncnVwYXIgcG9yIG3DrVwiLFxuICBcInNlbGVjdEJ1dHRvblwiOiBcIlNlbGVjY2lvbmFybWVcIixcbiAgXCJoaWRlQ29sdW1uXCI6IFwiT2N1bHRhciBjb2x1bW5hXCIsXG4gIFwic2hvd0NvbHVtblwiOiBcIk1vc3RyYXIgY29sdW1uYVwiLFxuICBcIm1ha2VQcml2YXRlQ29sdW1uXCI6IFwiSGFjZXIgcXVlIGxhIGNvbHVtbmEgc2VhIHByaXZhZGFcIixcbiAgXCJtYWtlUHVibGljQ29sdW1uXCI6IFwiSGFjZXIgcMO6YmxpY2EgbGEgY29sdW1uYVwiLFxuICBcIm1vdmVUb0RldGFpbFwiOiBcIk1vdmVyIGFsIGRldGFsbGVcIixcbiAgXCJzaG93QXNDb2x1bW5cIjogXCJNb3N0cmFyIGNvbW8gY29sdW1uYVwiLFxuICBcImZpbHRlclBsYWNlaG9sZGVyXCI6IFwiQnVzY2FyIC4uLlwiLFxuICBcInJlbW92ZVJvd3NcIjogXCJFbGltaW5hciBmaWxhc1wiLFxuICBcInNob3dMYWJlbFwiOiBcIk1vc3RyYXJcIixcbiAgXCJlbnRyeUxhYmVsXCI6IFwiZW50cmFkYXNcIixcbiAgXCJ2aXN1YWxpemVyX3RleHRcIjogXCJUZXh0b3MgZW4gdGFibGFcIixcbiAgXCJ2aXN1YWxpemVyX3dvcmRjbG91ZFwiOiBcIldvcmRjbG91ZFwiLFxuICBcImNoYXJ0VHlwZV9iYXJcIjogXCJCYXJcIixcbiAgXCJjaGFydFR5cGVfc3RhY2tlZGJhclwiOiBcIkJhcnJhIGFwaWxhZGFcIixcbiAgXCJjaGFydFR5cGVfZG91Z2hudXRcIjogXCJEb251dFwiLFxuICBcImNoYXJ0VHlwZV9waWVcIjogXCJQaWVcIixcbiAgXCJjaGFydFR5cGVfc2NhdHRlclwiOiBcIkRpc3BlcnNpw7NuXCIsXG4gIFwiY2hhcnRUeXBlX2dhdWdlXCI6IFwiR2F1Z2VcIixcbiAgXCJjaGFydFR5cGVfYnVsbGV0XCI6IFwiQnVsbGV0XCIsXG4gIFwiaGlkZUJ1dHRvblwiOiBcIk9jdWx0YXJcIixcbiAgXCJtYWtlUHJpdmF0ZUJ1dHRvblwiOiBcIkhhY2VyIHByaXZhZG9cIixcbiAgXCJtYWtlUHVibGljQnV0dG9uXCI6IFwiSGFjZXIgcMO6YmxpY29cIixcbiAgXCJzaG93QnV0dG9uXCI6IFwiTW9zdHJhclwiLFxuICBcImZpbHRlclwiOiBcIkZpbHRyb1wiLFxuICBcInJlc2V0RmlsdGVyXCI6IFwiUmVzdGFibGVjZXIgZmlsdHJvXCIsXG4gIFwiY2hhbmdlTG9jYWxlXCI6IFwiQ2FtYmlhciBjb25maWd1cmFjacOzbiByZWdpb25hbFwiLFxuICBcImNsZWFyQnV0dG9uXCI6IFwiQm9ycmFyXCIsXG4gIFwiYWRkRWxlbWVudFwiOiBcIkVsaWphIGxhIHByZWd1bnRhIHBhcmEgbW9zdHJhciAuLi5cIixcbiAgXCJkZWZhdWx0T3JkZXJcIjogXCJPcmRlbiBwcmVkZXRlcm1pbmFkb1wiLFxuICBcImFzY09yZGVyXCI6IFwiQXNjZW5kZW50ZVwiLFxuICBcImRlc2NPcmRlclwiOiBcIkRlc2NlbmRlbnRlXCIsXG4gIFwic2hvd01pbm9yQ29sdW1uc1wiOiBcIk1vc3RyYXIgY29sdW1uYXMgc2VjdW5kYXJpYXNcIixcbiAgXCJvdGhlckNvbW1lbnRUaXRsZVwiOiBcIk90cm9zIGVsZW1lbnRvcyB5IGNvbWVudGFyaW9zXCIsXG4gIFwic2hvd1BlcmNlbnRhZ2VzXCI6IFwiTW9zdHJhciBwb3JjZW50YWplc1wiLFxuICBcImhpZGVQZXJjZW50YWdlc1wiOiBcIk9jdWx0YXIgcG9yY2VudGFqZXNcIixcbiAgXCJwZGZEb3dubG9hZENhcHRpb25cIjogXCJQREZcIixcbiAgXCJ4bHN4RG93bmxvYWRDYXB0aW9uXCI6IFwiRXhjZWxcIixcbiAgXCJjc3ZEb3dubG9hZENhcHRpb25cIjogXCJDU1ZcIixcbiAgXCJzYXZlRGlhZ3JhbUFzUE5HXCI6IFwiRGVzY2FyZ2FyIGVsIGdyw6FmaWNvIGNvbW8gcG5nXCIsXG4gIFwiaGlkZUVtcHR5QW5zd2Vyc1wiOiBcIk9jdWx0YXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIFwic2hvd0VtcHR5QW5zd2Vyc1wiOiBcIk1vc3RyYXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgbGFzIHJlc3B1ZXN0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIkxhcyA1IHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJMYXMgMTAgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIjIwIHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgXCJub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvblwiOiBcIkVzdGUgdGlwbyBkZSBwcmVndW50YSBhw7puIG5vIHNlIHZpc3VhbGl6YVwiLFxuICBcIm5vUmVzdWx0c1wiOiBcIkHDum4gbm8gaGF5IHJlc3VsdGFkb3NcIlxufTtcbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXNcIl0gPSBzcGFuaXNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVzXCJdID0gXCJTcGFuaXNoXCI7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbk1vZGVsIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIHByb3RlY3RlZCBjaGFydFR5cGVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJib29sZWFuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gdGhpcy5ib29sZWFuUXVlc3Rpb24uY29ycmVjdEFuc3dlcjtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgISFjb3JyZWN0QW5zd2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgIWNvcnJlY3RBbnN3ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsRmFsc2UudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RBbnN3ZXJWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYm9vbGVhblF1ZXN0aW9uKCkge1xuICAgIHJldHVybiA8UXVlc3Rpb25Cb29sZWFuTW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdHJ1ZUNvbG9yID0gXCJcIjtcbiAgcHVibGljIHN0YXRpYyBmYWxzZUNvbG9yID0gXCJcIjtcblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUodmFsdWVzW2xhYmVscy5pbmRleE9mKGl0ZW1UZXh0KV0sIGl0ZW1UZXh0KTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZVxuICAgICAgICA6IHRydWUsXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlXG4gICAgICAgIDogZmFsc2UsXG4gICAgXTtcbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGxhYmVscyA9IFtdLmNvbmNhdCh0aGlzLmdldFZhbHVlcygpKTtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxUcnVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxhYmVsc1swXSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxGYWxzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbHNbMV0gPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzWzJdID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIik7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vY2hvaWNlcy10YWJsZS5zY3NzXCIpO1xuXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1RhYmxlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IENob2ljZXNUYWJsZSkge31cblxuICBwdWJsaWMgY3JlYXRlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gdGhpcy5tb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDE7XG5cbiAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcbiAgICB9KTtcblxuICAgIGlmIChkYXRhc2V0cy5sZW5ndGggPT09IDAgfHwgZGF0YXNldHNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXG4gICAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLWNob2ljZXMtdGFibGVcIilcbiAgICAgICk7XG5cbiAgICAgIHRhYmxlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuXG4gICAgICB2YXIgaGVhZGVyUm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgdmFyIGxhYmVsQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhbnN3ZXJcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgdmFyIHNwYXJrbGluZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBcIlwiLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoc3BhcmtsaW5lQ2VsbCk7XG4gICAgICB2YXIgcGVyY2VudENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGVyY2VudFwiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHBlcmNlbnRDZWxsKTtcbiAgICAgIHZhciB2YWx1ZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzcG9uc2VzXCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodmFsdWVDZWxsKTtcbiAgICAgIHRhYmxlTm9kZS5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xuXG4gICAgICBkYXRhLmZvckVhY2goKHJvd0RhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICAgIHZhciBsYWJlbENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogbGFiZWxzW2luZGV4XSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgICB2YXIgc3BhcmtsaW5lQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGxcIik7XG4gICAgICAgIHZhciBvdXRlckJhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jaG9pY2VzLXNwYXJrbGluZVwiKTtcbiAgICAgICAgdmFyIGlubmVyQmFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLWNob2ljZXMtc3BhcmtsaW5lLXZhbHVlXCIpO1xuICAgICAgICBpbm5lckJhci5zdHlsZS53aWR0aCA9IHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCI7XG4gICAgICAgIG91dGVyQmFyLmFwcGVuZENoaWxkKGlubmVyQmFyKTtcbiAgICAgICAgc3BhcmtsaW5lQ2VsbC5hcHBlbmRDaGlsZChvdXRlckJhcik7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChzcGFya2xpbmVDZWxsKTtcbiAgICAgICAgdmFyIHBlcmNlbnRDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogXCJcIiArIHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQocGVyY2VudENlbGwpO1xuICAgICAgICB2YXIgdmFsdWVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogcm93RGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh2YWx1ZUNlbGwpO1xuICAgICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS1jaG9pY2VzLXRhYmxlX19jb250YWluZXJcIjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBub2RlLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENob2ljZXNUYWJsZSBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcml2YXRlIF9jaG9pY2VzVGFibGVBZGFwdGVyOiBDaG9pY2VzVGFibGVBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImNob2ljZXNcIik7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlciA9IG5ldyBDaG9pY2VzVGFibGVBZGFwdGVyKHRoaXMpO1xuICAgIHRoaXMuYW5zd2Vyc09yZGVyID0gXCJhc2NcIjtcbiAgICB0aGlzLnNob3dQZXJjZW50YWdlcyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYWRpb2dyb3VwXCIsIENob2ljZXNUYWJsZSk7XG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBDaG9pY2VzVGFibGUpO1xuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY2hlY2tib3hcIiwgQ2hvaWNlc1RhYmxlKTtcbiIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhSW5mbyB7XHJcbiAgbmFtZTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PjtcclxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFQcm92aWRlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXJpZXNNYXJrZXJLZXkgPSBcIl9fc2Ffc2VyaWVzX25hbWVcIjtcclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+O1xyXG4gIHByaXZhdGUgX3N0YXRpc3RpY3NDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PEFycmF5PG51bWJlcj4+IHwgQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+IH07XHJcbiAgcHJvdGVjdGVkIGZpbHRlclZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvOiBJRGF0YUluZm8pOiBzdHJpbmcge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUluZm8ubmFtZSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGFJbmZvLm5hbWUuam9pbihcIi1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YUluZm8ubmFtZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGE6IEFycmF5PGFueT4gPSBbXSwgcHJpdmF0ZSBfZ2V0RGF0YUNvcmU6IChkYXRhSW5mbzogSURhdGFJbmZvKSA9PiBudW1iZXJbXVtdID0gdW5kZWZpbmVkKSB7IH1cclxuXHJcbiAgcHVibGljIHJlc2V0KGRhdGFJbmZvPzogSURhdGFJbmZvKSB7XHJcbiAgICBpZiAoISFkYXRhSW5mbykge1xyXG4gICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0NhY2hlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSAhPT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSAhPT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMucmFpc2VEYXRhQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICB0aGlzLl9kYXRhID0gW10uY29uY2F0KGRhdGEpO1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmaWx0ZXJlZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyZWREYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGZpbHRlcktleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlcyk7XHJcbiAgICAgIGlmIChmaWx0ZXJLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB0aGlzLmRhdGEuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gIU9iamVjdC5rZXlzKHRoaXMuZmlsdGVyVmFsdWVzKS5zb21lKFxyXG4gICAgICAgICAgICAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVHlwZSA9IHR5cGVvZiBmaWx0ZXJWYWx1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvblZhbHVlID0gaXRlbVtrZXldO1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcXVlc3Rpb25WYWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSA9PSAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhcXVlc3Rpb25Db250YWluc1ZhbHVlKHF1ZXN0aW9uVmFsdWUsIGZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzVmFsdWUgPSBpdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldO1xyXG4gICAgICAgICAgICAgIGlmICghIXNlcmllc1ZhbHVlICYmIGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uVmFsdWUgIT09IGZpbHRlclZhbHVlW3Nlcmllc1ZhbHVlXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIiAmJiBmaWx0ZXJWYWx1ZS5zdGFydCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlLmVuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGluaW9pdXNWYWx1ZSA9IHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm51bWJlclwiID8gcXVlc3Rpb25WYWx1ZSA6IERhdGUucGFyc2UocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29udGluaW9pdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGluaW9pdXNWYWx1ZSA9IHBhcnNlRmxvYXQocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc05hTihjb250aW5pb2l1c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGluaW9pdXNWYWx1ZSA8IGZpbHRlclZhbHVlLnN0YXJ0IHx8IGNvbnRpbmlvaXVzVmFsdWUgPj0gZmlsdGVyVmFsdWUuZW5kO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gaXRlbVtrZXldICE9PSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZmlsdGVyIGJ5IHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcsIHNlbGVjdGVkVmFsdWU6IGFueSkge1xyXG4gICAgdmFyIGZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXTtcclxuICAgIH1cclxuICAgIGlmIChmaWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXREYXRhQ29yZShkYXRhSW5mbzogSURhdGFJbmZvKSB7XHJcbiAgICBpZiAoISF0aGlzLl9nZXREYXRhQ29yZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YUNvcmUoZGF0YUluZm8pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFOYW1lcyA9IEFycmF5LmlzQXJyYXkoZGF0YUluZm8ubmFtZSkgPyBkYXRhSW5mby5uYW1lIDogW2RhdGFJbmZvLm5hbWVdO1xyXG4gICAgY29uc3Qgc3RhdGlzdGljczogQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+ID0gW107XHJcblxyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YUluZm8uZ2V0VmFsdWVzKCk7XHJcbiAgICBjb25zdCB2YWx1ZXNJbmRleDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdmFsdWVzSW5kZXhbdmFsXSA9IGluZGV4O1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMgPSB2YWx1ZXMuaW5kZXhPZih1bmRlZmluZWQpICE9PSAtMTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXMgPSBkYXRhSW5mby5nZXRTZXJpZXNWYWx1ZXMoKTtcclxuICAgIGNvbnN0IHNlcmllc0luZGV4OiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIHNlcmllcy5mb3JFYWNoKCh2YWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBzZXJpZXNJbmRleFt2YWxdID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXNMZW5ndGggPSBzZXJpZXMubGVuZ3RoIHx8IDE7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFOYW1lcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBkYXRhTmFtZVN0YXRpc3RpY3MgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPj4oKTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXJpZXNMZW5ndGg7ICsraikge1xyXG4gICAgICAgIGRhdGFOYW1lU3RhdGlzdGljcy5wdXNoKG5ldyBBcnJheTxudW1iZXI+KHZhbHVlcy5sZW5ndGgpLmZpbGwoMCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHN0YXRpc3RpY3MucHVzaChkYXRhTmFtZVN0YXRpc3RpY3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIGRhdGFOYW1lcy5mb3JFYWNoKChkYXRhTmFtZSwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W2RhdGFOYW1lXTtcclxuICAgICAgICBpZiAocm93VmFsdWUgIT09IHVuZGVmaW5lZCB8fCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IHJvd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkocm93VmFsdWUpID8gcm93VmFsdWUgOiBbcm93VmFsdWVdO1xyXG4gICAgICAgICAgaWYgKHNlcmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgbGFiZWxsZWQgYnkgc2VyaWVzTWFya2VyS2V5IGluIHJvdyBkYXRhXHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzSW5kZXhbcm93W0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldXSB8fCAwO1xyXG4gICAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxdXSsrO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgdGhlIGtleXMgaW4gcXVlc3Rpb24gdmFsdWUgKG1hdHJpeCBxdWVzdGlvbilcclxuICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCB0aGUgZGUtbm9ybWFsaXphdGlvbiBhbmQgY29tYmluZSB3aXRoIHRoZSBwcmV2aW91cyBjYXNlXHJcbiAgICAgICAgICAgICAgcm93VmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmZvckVhY2goKHNlcmllc05hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHZhbFtzZXJpZXNOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPSBzZXJpZXNJbmRleFtzZXJpZXNOYW1lXSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxbc2VyaWVzTmFtZV1dXSsrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTm8gc2VyaWVzXHJcbiAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHN0YXRpc3RpY3NbMF1bMF1bdmFsdWVzSW5kZXhbdmFsXV0rKyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGFJbmZvLm5hbWUpID8gc3RhdGlzdGljcyA6IHN0YXRpc3RpY3NbMF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGNhbGN1bGF0ZWQgc3RhdGlzY3RpY3MgZm9yIHRoZSBJRGF0YUluZm8gb2JqZWN0LlxyXG4gICAqL1xyXG4gIGdldERhdGEoZGF0YUluZm86IElEYXRhSW5mbykge1xyXG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdldFN0YXRpc3RpY3NDYWNoZUtleShkYXRhSW5mbyk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0gPT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0gPSB0aGlzLmdldERhdGFDb3JlKGRhdGFJbmZvKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXS5jb25jYXQodGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIGRhdGEgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgb25EYXRhQ2hhbmdlZCA9IG5ldyBFdmVudDxcclxuICAgIChzZW5kZXI6IERhdGFQcm92aWRlciwgb3B0aW9uczogYW55KSA9PiBhbnksXHJcbiAgICBEYXRhUHJvdmlkZXIsXHJcbiAgICBhbnlcclxuICA+KCk7XHJcblxyXG4gIHByb3RlY3RlZCByYWlzZURhdGFDaGFuZ2VkKCkge1xyXG4gICAgaWYgKCF0aGlzLm9uRGF0YUNoYW5nZWQuaXNFbXB0eSkge1xyXG4gICAgICB0aGlzLm9uRGF0YUNoYW5nZWQuZmlyZSh0aGlzLCB7fSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBxdWVzdGlvbkNvbnRhaW5zVmFsdWUocXVlc3Rpb25WYWx1ZTogYW55LCBmaWx0ZXJWYWx1ZTogYW55KSB7XHJcbiAgY29uc3QgcXVlc3Rpb25WYWx1ZUtleXMgPSBPYmplY3Qua2V5cyhxdWVzdGlvblZhbHVlKTtcclxuICBjb25zdCBmaWx0ZXJWYWx1ZUtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXJWYWx1ZSk7XHJcblxyXG4gIGlmIChmaWx0ZXJWYWx1ZUtleXMubGVuZ3RoID4gcXVlc3Rpb25WYWx1ZUtleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gIGZvciAodmFyIGtleSBvZiBmaWx0ZXJWYWx1ZUtleXMpIHtcclxuICAgIGlmIChmaWx0ZXJWYWx1ZVtrZXldICE9IHF1ZXN0aW9uVmFsdWVba2V5XSkgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbiIsImV4cG9ydCAqIGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbi8vbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcnVzc2lhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9zcGFuaXNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2l0YWxpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9kYXRhUHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vbnVtYmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL21hdHJpeFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2Jvb2xlYW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvblBhbmVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYWx0ZXJuYXRpdmVWaXp1YWxpemVyc1dyYXBwZXJcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL3Bsb3RseS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3dvcmRjbG91ZC93b3JkY2xvdWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi93b3JkY2xvdWQvc3RvcHdvcmRzL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2Nob2ljZXMtdGFibGVcIjtcblxuZXhwb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbiIsImltcG9ydCB7IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdGVySW5mbyB7XHJcbiAgcHJpdmF0ZSBfaHRtbEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdGV4dDogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbGl6ZXI6IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbikge1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+KFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtcXVlc3Rpb25fX2ZpbHRlclwiKVxyXG4gICAgKTtcclxuICAgIHRoaXMudGV4dCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgIFwic3BhblwiLFxyXG4gICAgICBcInNhLXF1ZXN0aW9uX19maWx0ZXItdGV4dFwiXHJcbiAgICApO1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50ZXh0KTtcclxuICAgIGNvbnN0IGZpbHRlckNsZWFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcclxuICAgICAgdmlzdWFsaXplci5zZXRTZWxlY3Rpb24odW5kZWZpbmVkKTtcclxuICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhckJ1dHRvblwiKSk7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudC5hcHBlbmRDaGlsZChmaWx0ZXJDbGVhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGh0bWxFbGVtZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0bWxFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShzZWxlY3Rpb246IHsgdmFsdWU6IGFueSwgdGV4dDogc3RyaW5nIH0pIHtcclxuICAgIGlmIChzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBzZWxlY3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtZmxleFwiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImZpbHRlclwiKSArIFwiOiBbXCIgKyBzZWxlY3Rpb24udGV4dCArIFwiXVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtTW9kZWwgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJvdGVjdGVkIHZhbHVlVHlwZTogXCJkYXRlXCIgfCBcIm51bWJlclwiID0gXCJudW1iZXJcIjtcbiAgcHJpdmF0ZSBfY2FjaGVkVmFsdWVzOiBBcnJheTx7IG9yaWdpbmFsOiBhbnksIGNvbnRpbmlvdXM6IG51bWJlciB9PiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29udGluaW91c0RhdGE6IHsgW3Nlcmllczogc3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jYWNoZWRJbnRlcnZhbHM6IEFycmF5PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcgfT4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2ludGVydmFsUHJlY2lzaW9uOiBudW1iZXIgPSAyO1xuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW107XG5cbiAgcHVibGljIHN0YXRpYyBJbnRlcnZhbHNDb3VudCA9IDEwO1xuICBwdWJsaWMgc3RhdGljIFVzZUludGVydmFsc0Zyb20gPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJoaXN0b2dyYW1cIik7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbFByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9pbnRlcnZhbFByZWNpc2lvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnZhbFByZWNpc2lvbjtcbiAgICB9XG4gICAgY29uc3QgcXVlc3Rpb25UeXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIGlmIChxdWVzdGlvblR5cGUgPT09IFwidGV4dFwiICYmIChxdWVzdGlvbltcImlucHV0VHlwZVwiXSA9PT0gXCJkYXRlXCIgfHwgcXVlc3Rpb25bXCJpbnB1dFR5cGVcIl0gPT09IFwiZGF0ZXRpbWVcIikpIHtcbiAgICAgIHRoaXMudmFsdWVUeXBlID0gXCJkYXRlXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVUeXBlID0gXCJudW1iZXJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCkge1xuICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NhY2hlZFZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGluaW91c1ZhbHVlKHZhbHVlOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnZhbHVlVHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIHJldHVybiBEYXRlLnBhcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFN0cmluZyh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52YWx1ZVR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1ByZWNpc2lvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgYmFzZSA9IE1hdGgucG93KDEwLCB0aGlzLl9pbnRlcnZhbFByZWNpc2lvbik7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYmFzZSAqIHZhbHVlKSAvIGJhc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5oYXNDdXN0b21JbnRlcnZhbHMgfHwgdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCkubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSkge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4gaW50ZXJ2YWwubGFiZWwgPT09IGl0ZW1UZXh0KVswXTtcbiAgICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKGludGVydmFsLCBpbnRlcnZhbCAhPT0gdW5kZWZpbmVkID8gaW50ZXJ2YWwubGFiZWwgOiBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBjb25zdCBsYWJlbEluZGV4ID0gbGFiZWxzLmluZGV4T2YoaXRlbVRleHQpO1xuICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKHRoaXMuZ2V0VmFsdWVzKClbbGFiZWxJbmRleF0sIGxhYmVsc1tsYWJlbEluZGV4XSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2aXN1YWxpemVyIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgc3VwZXIub25EYXRhQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbnRpbmlvdXNWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZFZhbHVlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgaWYgKHNlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2VyaWVzLnB1c2goXCJcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb250aW5pb3VzRGF0YSA9IHt9O1xuICAgICAgc2VyaWVzLmZvckVhY2goc2VyaWVzVmFsdWUgPT4gdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzVmFsdWVdID0gW10pO1xuICAgICAgY29uc3QgaGFzaCA9IHt9O1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goZGF0YUl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJEYXRhID0gZGF0YUl0ZW1bdGhpcy5uYW1lIGFzIHN0cmluZ107XG4gICAgICAgIGlmIChhbnN3ZXJEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZSA9IGRhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldIHx8IFwiXCI7XG4gICAgICAgICAgLy8gVE9ETzogX2NvbnRpbmlvdXNEYXRhIHNob3VsZCBiZSBzb3J0ZWQgaW4gb3JkZXIgdG8gc3BlZWQtdXAgc3RhdGlzdGljcyBjYWxjdWxhdGlvbiBpbiB0aGUgZ2V0RGF0YSBmdW5jdGlvblxuICAgICAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1ZhbHVlXS5wdXNoKHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGFuc3dlckRhdGEpKTtcbiAgICAgICAgICBoYXNoW2Fuc3dlckRhdGFdID0gYW5zd2VyRGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZXMgPSBPYmplY3Qua2V5cyhoYXNoKS5tYXAoa2V5ID0+ICh7IG9yaWdpbmFsOiBoYXNoW2tleV0sIGNvbnRpbmlvdXM6IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGtleSkgfSkpO1xuICAgICAgdGhpcy5fY2FjaGVkVmFsdWVzLnNvcnQoKGEsIGIpID0+IGEuY29udGluaW91cyAtIGIuY29udGluaW91cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRWYWx1ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBuZWVkVXNlUmF0ZVZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJyYXRpbmdcIiAmJiBBcnJheS5pc0FycmF5KHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdKSAmJiB0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSB8fCB0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMubWFwKGludGVydmFsID0+IGludGVydmFsLnN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRpbmlvdXNWYWx1ZXMubWFwKHZhbHVlID0+IHZhbHVlLm9yaWdpbmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscyB8fCBjb250aW5pb3VzVmFsdWVzLmxlbmd0aCA+IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20gfHwgdGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxzLm1hcChpbnRlcnZhbCA9PiBpbnRlcnZhbC5sYWJlbCk7XG4gICAgfVxuICAgIHJldHVybiBjb250aW5pb3VzVmFsdWVzLm1hcCh2YWx1ZSA9PiBcIlwiICsgdmFsdWUub3JpZ2luYWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDdXN0b21JbnRlcnZhbHMoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbk9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uT3B0aW9ucy5pbnRlcnZhbHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcnZhbHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbk9wdGlvbnMuaW50ZXJ2YWxzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgY29uc3QgcmF0ZVZhbHVlcyA9IHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdIGFzIEl0ZW1WYWx1ZVtdO1xuICAgICAgcmV0dXJuIHJhdGVWYWx1ZXMubWFwKChyYXRlVmFsdWUsIGkpID0+ICh7XG4gICAgICAgIHN0YXJ0OiByYXRlVmFsdWUudmFsdWUsXG4gICAgICAgIGVuZDogaSA8IHJhdGVWYWx1ZXMubGVuZ3RoIC0gMSA/IHJhdGVWYWx1ZXNbaSArIDFdLnZhbHVlIDogcmF0ZVZhbHVlLnZhbHVlICsgMSxcbiAgICAgICAgbGFiZWw6IHJhdGVWYWx1ZS50ZXh0XG4gICAgICB9KSkucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzID0gW107XG4gICAgICBpZiAoY29udGluaW91c1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gY29udGluaW91c1ZhbHVlc1swXS5jb250aW5pb3VzO1xuICAgICAgICBjb25zdCBlbmQgPSBjb250aW5pb3VzVmFsdWVzW2NvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoIC0gMV0uY29udGluaW91cztcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxzQ291bnQgPSBIaXN0b2dyYW1Nb2RlbC5JbnRlcnZhbHNDb3VudDtcbiAgICAgICAgY29uc3QgZGVsdGEgPSAoZW5kIC0gc3RhcnQpIC8gaW50ZXJ2YWxzQ291bnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJ2YWxzQ291bnQ7ICsraSkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBzdGFydCArIGRlbHRhO1xuICAgICAgICAgIGNvbnN0IGlzdGFydCA9IHRoaXMudG9QcmVjaXNpb24oc3RhcnQpO1xuICAgICAgICAgIGNvbnN0IGluZXh0ID0gdGhpcy50b1ByZWNpc2lvbihuZXh0KTtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogaXN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBpbmV4dCxcbiAgICAgICAgICAgIGxhYmVsOiBcIlwiICsgdGhpcy5nZXRTdHJpbmcoaXN0YXJ0KSArIFwiLVwiICsgdGhpcy5nZXRTdHJpbmcoaW5leHQpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3RhcnQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRJbnRlcnZhbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLmhhc0N1c3RvbUludGVydmFscyAmJiBjb250aW5pb3VzVmFsdWVzLmxlbmd0aCA8PSBIaXN0b2dyYW1Nb2RlbC5Vc2VJbnRlcnZhbHNGcm9tKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcnZhbHMgPSB0aGlzLmludGVydmFscztcbiAgICBjb25zdCBzdGF0aXN0aWNzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNlcmllcy5wdXNoKFwiXCIpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3RhdGlzdGljcy5wdXNoKGludGVydmFscy5tYXAoaSA9PiAwKSk7XG4gICAgICB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNbaV1dLmZvckVhY2goZGF0YVZhbHVlID0+IHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnRlcnZhbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWxzW2pdLnN0YXJ0IDw9IGRhdGFWYWx1ZSAmJiAoZGF0YVZhbHVlIDwgaW50ZXJ2YWxzW2pdLmVuZCB8fCBqID09IGludGVydmFscy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgc3RhdGlzdGljc1tpXVtqXSsrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cbiIsImNvbnN0IE11dXJpID0gcmVxdWlyZShcIm11dXJpXCIpO1xyXG5cclxuLyoqXHJcbiAqIEEgYmFzZSBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gbGF5b3V0IGVuZ2luZXMgb3IgaW50ZWdyYXRlIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmVzIHdpdGggU3VydmV5SlMgRGFzaGJvYXJkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExheW91dEVuZ2luZSB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9hbGxvd2VkOiBib29sZWFuKSB7IH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7IH1cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7IH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29yZSgpIHsgfVxyXG5cclxuICBnZXQgYWxsb3dlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyB0aGUgZHluYW1pYyBsYXlvdXQgaW4gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYXJyYW5nZSB2aXN1YWxpemF0aW9uIGl0ZW1zIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgc2NyZWVuIHNwYWNlIGFuZCBhbGxvdyB1c2VycyB0byByZW9yZGVyIHRoZW0gdmlhIGRyYWcgYW5kIGRyb3AuXHJcbiAgICovXHJcbiAgc3RhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy5zdGFydENvcmUoY29udGFpbmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHN0b3AoKSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkge1xyXG4gICAgICB0aGlzLnN0b3BDb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29yZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHsgfVxyXG4gIHJlbW92ZShlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7IH1cclxuXHJcbiAgb25Nb3ZlQ2FsbGJhY2s6IChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSA9PiB2b2lkO1xyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdG9wKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTXV1cmlMYXlvdXRFbmdpbmUgZXh0ZW5kcyBMYXlvdXRFbmdpbmUge1xyXG4gIHByaXZhdGUgX211dXJpOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbGF5b3V0aW5nVGltZXI6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoYWxsb3dlZDogYm9vbGVhbiwgcHJpdmF0ZSBfc2VsZWN0b3I6IHN0cmluZywgcHJpdmF0ZSBkcmFnRW5hYmxlZCA9IHRydWUpIHtcclxuICAgIHN1cGVyKGFsbG93ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9tdXVyaSA9IG5ldyBNdXVyaShjb250YWluZXIsIHtcclxuICAgICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XHJcbiAgICAgICAgaGFuZGxlOiBcIi5zYS1xdWVzdGlvbl9fdGl0bGUtLWRyYWdnYWJsZVwiLFxyXG4gICAgICB9LFxyXG4gICAgICBpdGVtczogdGhpcy5fc2VsZWN0b3IsXHJcbiAgICAgIGRyYWdFbmFibGVkOiB0aGlzLmRyYWdFbmFibGVkLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tdXVyaS5vbihcclxuICAgICAgXCJkcmFnUmVsZWFzZUVuZFwiLFxyXG4gICAgICAoZGF0YTogYW55KSA9PlxyXG4gICAgICAgIHRoaXMub25Nb3ZlQ2FsbGJhY2sgJiYgdGhpcy5vbk1vdmVDYWxsYmFjayhkYXRhLmZyb21JbmRleCwgZGF0YS50b0luZGV4KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHN0b3BDb3JlKCkge1xyXG4gICAgdGhpcy5fbXV1cmkub2ZmKFwiZHJhZ1JlbGVhc2VFbmRcIik7XHJcbiAgICB0aGlzLl9tdXVyaS5kZXN0cm95KCk7XHJcbiAgICB0aGlzLl9tdXVyaSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUNvcmUoKSB7XHJcbiAgICBpZiAodGhpcy5fbGF5b3V0aW5nVGltZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fbGF5b3V0aW5nVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuX211dXJpLnJlZnJlc2hJdGVtcygpO1xyXG4gICAgICB0aGlzLl9tdXVyaS5sYXlvdXQoKTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGFkZChlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkgdGhpcy5fbXV1cmkuYWRkKGVsZW1lbnRzLCBvcHRpb25zKTtcclxuICB9XHJcbiAgcmVtb3ZlKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB0aGlzLl9tdXVyaS5yZW1vdmUoZWxlbWVudHMsIG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBlbmdsaXNoU3RyaW5ncyB9IGZyb20gXCIuL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIGxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgbG9jYWxlTmFtZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIHN1cHBvcnRlZExvY2FsZXM6IDxBcnJheTxhbnk+PltdLFxuICBnZXQgY3VycmVudExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPT09IHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlXG4gICAgICA/IFwiXCJcbiAgICAgIDogdGhpcy5jdXJyZW50TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBjdXJyZW50TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldCBkZWZhdWx0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGRlZmF1bHRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoc3RyTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2FsZVxuICAgICAgPyB0aGlzLmxvY2FsZXNbdGhpcy5jdXJyZW50TG9jYWxlXVxuICAgICAgOiB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICBpZiAoIWxvYyB8fCAhbG9jW3N0ck5hbWVdKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICB2YXIgcmVzdWx0ID0gbG9jW3N0ck5hbWVdO1xuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV0gfHwgc3RyTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24gKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5sb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+bG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJQW5zd2Vyc0RhdGEsIFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4XCIpO1xuICAgIHRoaXMuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbWF0cml4UXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbk1hdHJpeE1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gXCJcIiArIHJvdy52YWx1ZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMubWF0cml4UXVlc3Rpb24ucm93cywgcm93LnZhbHVlKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgKVswXTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj5cbiAgKTogQXJyYXk8Ym9vbGVhbj4ge1xuICAgIGxldCByZXN1bHQ6IEFycmF5PGJvb2xlYW4+ID0gQXJyYXk8Ym9vbGVhbj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRhdGFzZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChkYXRhc2V0c1tqXVtpXSAhPSAwKSB7XG4gICAgICAgICAgcmVzdWx0W2ldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5TZXJpZXMoZGF0YXNldDogQXJyYXk8YW55Pikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGRhdGFzZXRbaV0gIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQW5zd2Vyc0RhdGEgPSB7XG4gICAgICBkYXRhc2V0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgICB0ZXh0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgc2VyaWVzTGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyID0gdGhpcy5nZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICAgIGFuc3dlcnNEYXRhLmRhdGFzZXRzXG4gICAgKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBoYXNBbnN3ZXJzSW5TZXJpZXMgPSB0aGlzLmdldEhhc0Fuc3dlcnNJblNlcmllcyhcbiAgICAgICAgYW5zd2Vyc0RhdGEuZGF0YXNldHNbaV1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luU2VyaWVzKSB7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldHMgPSBbXTtcbiAgICAgIGNvbnN0IHRleHRzID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJbal0pIHtcbiAgICAgICAgICBkYXRhc2V0cy5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzW2ldW2pdKTtcbiAgICAgICAgICB0ZXh0cy5wdXNoKGFuc3dlcnNEYXRhLnRleHRzW2ldW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goZGF0YXNldHMpO1xuICAgICAgcmVzdWx0LnRleHRzLnB1c2godGV4dHMpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyW2ldKSB7XG4gICAgICAgIHJlc3VsdC5zZXJpZXNMYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldERhdGEoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAoc2VyaWVzTmFtZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICApO1xuICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsIFF1ZXN0aW9uLCBNYXRyaXhEcm9wZG93bkNvbHVtbiwgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElBbnN3ZXJzRGF0YSwgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duR3JvdXBlZCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhEcm9wZG93bkdyb3VwZWRcIik7XG4gICAgdGhpcy5nZXRBbnN3ZXJzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtYXRyaXhRdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwge1xuICAgIHJldHVybiA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi50aXRsZSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgLy8gICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gIC8vICAgKVswXTtcbiAgLy8gfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcChyb3cgPT4gcm93LnZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHtcbiAgICAgIG5hbWU6IHNlcmllcyxcbiAgICAgIGdldFZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0TGFiZWxzOiAoKSA9PiB2YWx1ZXMsXG4gICAgICBnZXRTZXJpZXNWYWx1ZXM6ICgpID0+IHJvd3MsXG4gICAgICBnZXRTZXJpZXNMYWJlbHM6ICgpID0+IHJvd3MsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bMF1bdmFsdWVJbmRleF1cbiAgICAgICk7XG4gICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyTW9kZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3Jlc3VsdEF2ZXJhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVzdWx0TWluOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1heDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RlcHNDb3VudCA9IDU7XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVUZXh0c0NhbGxiYWNrOiAoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBzdGVwc0NvdW50OiBudW1iZXIsXG4gICAgdGV4dHM6IHN0cmluZ1tdXG4gICkgPT4gc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNoYXJ0VHlwZTogU3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0FzUGVyY2VudGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJudW1iZXJcIik7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge31cblxuICBwcm90ZWN0ZWQgc2V0Q2hhcnRUeXBlKGNoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoY2hhcnRUeXBlKSAhPT0gLTEgJiZcbiAgICAgIHRoaXMuY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlID0gY2hhcnRUeXBlO1xuICAgICAgdGhpcy5vbkNoYXJ0VHlwZUNoYW5nZWQoKTtcbiAgICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNaW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWF4ID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdlbmVyYXRlVGV4dChtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBsZXQgdGV4dHM6IGFueSA9IFtdO1xuXG4gICAgaWYgKHN0ZXBzQ291bnQgPT09IDUpIHtcbiAgICAgIHRleHRzID0gW1xuICAgICAgICBcInZlcnkgaGlnaCAoXCIgKyBtYXhWYWx1ZSArIFwiKVwiLFxuICAgICAgICBcImhpZ2hcIixcbiAgICAgICAgXCJtZWRpdW1cIixcbiAgICAgICAgXCJsb3dcIixcbiAgICAgICAgXCJ2ZXJ5IGxvdyAoXCIgKyBtaW5WYWx1ZSArIFwiKVwiLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHMucHVzaChtYXhWYWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQgLSAyOyBpKyspIHtcbiAgICAgICAgdGV4dHMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRleHRzLnB1c2gobWluVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghIU51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIE51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjayhcbiAgICAgICAgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgbWF4VmFsdWUsXG4gICAgICAgIG1pblZhbHVlLFxuICAgICAgICBzdGVwc0NvdW50LFxuICAgICAgICB0ZXh0c1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dHM7XG4gIH1cblxuICBnZW5lcmF0ZVZhbHVlcyhtYXhWYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSAvIHN0ZXBzQ291bnQpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKG1heFZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZW5lcmF0ZUNvbG9ycyhtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaChwYWxldHRlW2ldKTtcbiAgICB9XG5cbiAgICBjb2xvcnMucHVzaChcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIik7XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0RGF0YSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5fcmVzdWx0TWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdE1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IDA7XG4gICAgICBsZXQgYWN0dWFsQW5zd2VyQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICBpZihyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWU6IG51bWJlciA9ICtyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICAgICAgYWN0dWFsQW5zd2VyQ291bnQrKztcbiAgICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlICs9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdE1pbiA+IHF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNYXggPCBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXggPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmKGFjdHVhbEFuc3dlckNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdGhpcy5fcmVzdWx0QXZlcmFnZSAvIGFjdHVhbEFuc3dlckNvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IE1hdGguY2VpbCh0aGlzLl9yZXN1bHRBdmVyYWdlICogMTAwKSAvIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLl9yZXN1bHRBdmVyYWdlLCB0aGlzLl9yZXN1bHRNaW4sIHRoaXMuX3Jlc3VsdE1heF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9ib29sZWFuXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Qm9vbENoYXJ0QWRhcHRlciBleHRlbmRzIFBsb3RseUNoYXJ0QWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBCb29sZWFuUGxvdGx5KSB7XG4gICAgc3VwZXIobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBib29sQ29sb3JzID0gW1xuICAgICAgQm9vbGVhblBsb3RseS50cnVlQ29sb3IgfHwgY29sb3JzWzBdLFxuICAgICAgQm9vbGVhblBsb3RseS5mYWxzZUNvbG9yIHx8IGNvbG9yc1sxXSxcbiAgICBdO1xuICAgIGlmKHRoaXMubW9kZWwuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBib29sQ29sb3JzLnB1c2goY29sb3JzWzJdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9ycyA9IGJvb2xDb2xvcnM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJhclwiKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2U6IGFueSkgPT4ge1xuICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuUGxvdGx5IGV4dGVuZHMgQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJwaWVcIiwgXCJiYXJcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEJvb2xlYW5QbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlCb29sQ2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImJvb2xlYW5cIiwgQm9vbGVhblBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEhpc3RvZ3JhbU1vZGVsIH0gZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVBsb3RseSBleHRlbmRzIEhpc3RvZ3JhbU1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJ2YmFyXCIsIFwiYmFyXCIsIFwic2NhdHRlclwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEhpc3RvZ3JhbVBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICApO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSBzdXBlci5nZXREYXRhKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGlmIChzZXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzZXJpZXNEYXRhID0gc2VyaWVzLm1hcChcbiAgICAgICAgICAoc2VyaWVzVmFsdWUsIHNlcmllc0luZGV4KSA9PiBzdGF0aXN0aWNzW3Nlcmllc0luZGV4XVt2YWx1ZUluZGV4XVxuICAgICAgICApO1xuICAgICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZGF0ZVwiLCBIaXN0b2dyYW1QbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibnVtYmVyXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgSGlzdG9ncmFtUGxvdGx5KTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL3NldHVwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYXRyaXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jvb2xlYW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JhbmtpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hpc3RvZ3JhbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmF0aW5nXCI7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSBcIi4uL21hdHJpeFwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeFBsb3RseSBleHRlbmRzIE1hdHJpeCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wiYmFyXCIsIFwic3RhY2tlZGJhclwiLCBcInBpZVwiLCBcImRvdWdobnV0XCJdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSk7XG4gICAgdGhpcy5jaGFydFR5cGVzID0gTWF0cml4UGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIgPSBuZXcgUGxvdGx5Q2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtYXRyaXhcIiwgTWF0cml4UGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IE1hdHJpeERyb3Bkb3duR3JvdXBlZCB9IGZyb20gXCIuLi9tYXRyaXhEcm9wZG93bkdyb3VwZWRcIjtcbmltcG9ydCB7IFBsb3RseUNoYXJ0QWRhcHRlciB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkgZXh0ZW5kcyBNYXRyaXhEcm9wZG93bkdyb3VwZWQge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUNoYXJ0QWRhcHRlcjtcbiAgcHVibGljIHN0YXRpYyB0eXBlcyA9IFtcInN0YWNrZWRiYXJcIiwgXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm1hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIiwgTWF0cml4RHJvcGRvd25Hcm91cGVkUGxvdGx5KTtcbiIsImltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlUGxvdGx5IH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUmFua2luZ1Bsb3RseSBleHRlbmRzIFNlbGVjdEJhc2VQbG90bHkge1xuICBnZXRRdWVzdGlvblJlc3VsdHMoKSB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoZGF0YUl0ZW0pID0+IGRhdGFJdGVtW25hbWVdKTtcbiAgfVxuXG4gIGdldEVtcHR5RGF0YSgpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBsZXQgZGF0YTogYW55ID0gW107XG5cbiAgICBkYXRhLmxlbmd0aCA9IGNob2ljZXMubGVuZ3RoO1xuICAgIGRhdGEuZmlsbCgwKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0UXVlc3Rpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG5cbiAgICBsZXQgcGxvdGx5RGF0YSA9IHRoaXMuZ2V0RW1wdHlEYXRhKCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5hcHBseVJlc3VsdFRvUGxvdGx5RGF0YShyZXN1bHQsIHBsb3RseURhdGEsIGNob2ljZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtwbG90bHlEYXRhXTtcbiAgfVxuXG4gIGFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdDogYW55W10sIHBsb3RseURhdGE6IGFueSwgY2hvaWNlczogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQgfHwgIXBsb3RseURhdGEgfHwgIWNob2ljZXMpIHJldHVybjtcblxuICAgIHJlc3VsdC5mb3JFYWNoKChyZXN1bHRWYWx1ZTogYW55LCByZXN1bHRWYWx1ZUluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55W10pID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGNob2ljZXMuaW5kZXhPZihyZXN1bHRWYWx1ZSk7XG4gICAgICBwbG90bHlEYXRhW2luZGV4XSA9XG4gICAgICAgICtwbG90bHlEYXRhW2luZGV4XSArIChyZXN1bHQubGVuZ3RoIC0gcmVzdWx0VmFsdWVJbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFua2luZ1wiLCBSYW5raW5nUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBOdW1iZXJNb2RlbCB9IGZyb20gXCIuLi9udW1iZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBhbGxvd0RvbVJlbmRlcmluZywgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgUGxvdGx5IGZyb20gXCJwbG90bHkuanMtZGlzdC1taW5cIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUdhdWdlQWRhcHRlciB7XG4gIHByaXZhdGUgX2NoYXJ0OiBQcm9taXNlPFBsb3RseS5QbG90bHlIVE1MRWxlbWVudD4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogR2F1Z2VQbG90bHkpIHsgfVxuXG4gIHB1YmxpYyBnZXQgY2hhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShjaGFydE5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1vZGVsLnF1ZXN0aW9uO1xuICAgIGxldCBbbGV2ZWwsIG1pblZhbHVlLCBtYXhWYWx1ZV0gPSB0aGlzLm1vZGVsLmdldERhdGEoKTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwicmF0aW5nXCIpIHtcbiAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSAoPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb24pLnZpc2libGVSYXRlVmFsdWVzO1xuICAgICAgbWF4VmFsdWUgPSByYXRlVmFsdWVzW3JhdGVWYWx1ZXMubGVuZ3RoIC0gMV0udmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IHJhdGVWYWx1ZXNbMF0udmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZW5lcmF0ZUNvbG9ycyhcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBHYXVnZVBsb3RseS5zdGVwc0NvdW50XG4gICAgKTtcblxuICAgIGlmIChHYXVnZVBsb3RseS5zaG93QXNQZXJjZW50YWdlKSB7XG4gICAgICBsZXZlbCA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKGxldmVsLCBtYXhWYWx1ZSk7XG4gICAgICBtaW5WYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhWYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGRhdGE6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbmRpY2F0b3JcIixcbiAgICAgICAgbW9kZTogXCJnYXVnZStudW1iZXJcIixcbiAgICAgICAgZ2F1Z2U6IHtcbiAgICAgICAgICBheGlzOiB7IHJhbmdlOiBbbWluVmFsdWUsIG1heFZhbHVlXSB9LFxuICAgICAgICAgIHNoYXBlOiB0aGlzLm1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgICAgICBiZ2NvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgYmFyOiB7IGNvbG9yOiBjb2xvcnNbMF0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGxldmVsLFxuICAgICAgICB0ZXh0OiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkb21haW46IHsgeDogWzAsIDFdLCB5OiBbMCwgMV0gfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNoYXJ0TWFyZ2luID0gdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiYnVsbGV0XCIgPyA2MCA6IDMwO1xuICAgIHZhciBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGhlaWdodDogMjUwLFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IGNoYXJ0TWFyZ2luLFxuICAgICAgICByOiBjaGFydE1hcmdpbixcbiAgICAgICAgYjogY2hhcnRNYXJnaW4sXG4gICAgICAgIHQ6IGNoYXJ0TWFyZ2luLFxuICAgICAgICBwYWQ6IDVcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRpc3BsYXlNb2RlQmFyOiB0cnVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICBkaXNwbGF5bG9nbzogZmFsc2UsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsIGFzIGFueSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAoPGFueT5QbG90bHkpLmRvd25sb2FkSW1hZ2UoZ2QsIG9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuXG4gICAgfTtcbiAgICBpZiAoR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmRpc3BsYXlNb2RlQmFyID0gR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXI7XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICB9O1xuICAgIFBsb3RseVNldHVwLm9uUGxvdENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gKDxhbnk+UGxvdGx5KS5uZXdQbG90KFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgb3B0aW9ucy5kYXRhLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUGxvdGx5IGV4dGVuZHMgTnVtYmVyTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUdhdWdlQWRhcHRlcjtcblxuICBwdWJsaWMgc3RhdGljIGRpc3BsYXlNb2RlQmFyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJnYXVnZVwiLCBcImJ1bGxldFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEdhdWdlUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlHYXVnZUFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBHYXVnZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZXhwcmVzc2lvblwiLCBHYXVnZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgYWxsb3dEb21SZW5kZXJpbmcsIERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IFBsb3RseSBmcm9tIFwicGxvdGx5LmpzLWRpc3QtbWluXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBwcml2YXRlIF9jaGFydDogUHJvbWlzZTxQbG90bHkuUGxvdGx5SFRNTEVsZW1lbnQ+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtb2RlbDogU2VsZWN0QmFzZSkgeyB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBwbG90bHlPcHRpb25zID0gUGxvdGx5U2V0dXAuc2V0dXAodGhpcy5tb2RlbC5jaGFydFR5cGUsIHRoaXMubW9kZWwpO1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgZGlzcGxheWxvZ286IGZhbHNlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIGxvY2FsZTogbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICg8YW55PlBsb3RseSkuZG93bmxvYWRJbWFnZShnZCwgb3B0aW9ucyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAoU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuZGlzcGxheU1vZGVCYXIgPSBTZWxlY3RCYXNlUGxvdGx5LmRpc3BsYXlNb2RlQmFyO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hDb25maWdQYXJhbWV0ZXJzKFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIHRyYWNlczogcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBsYXlvdXQ6IHBsb3RseU9wdGlvbnMubGF5b3V0LFxuICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgfTtcbiAgICBQbG90bHlTZXR1cC5vblBsb3RDcmVhdGluZy5maXJlKHRoaXMubW9kZWwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGxvdCA9ICg8YW55PlBsb3RseSkubmV3UGxvdChcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIG9wdGlvbnMudHJhY2VzLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG5cbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfY2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEucG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGl0ZW1UZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKCFwbG90bHlPcHRpb25zLmhhc1Nlcmllcykge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgICAgY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TGFiZWwgPSBkYXRhLnBvaW50c1swXS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZXMgPSB0aGlzLm1vZGVsLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMubW9kZWwuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNlcmllc1ZhbHVlc1tzZXJpZXNMYWJlbHMuaW5kZXhPZihwcm9wZXJ0eUxhYmVsKV07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB0aGlzLm1vZGVsLmdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtVmFsdWUoeyBbcHJvcGVydHlWYWx1ZV06IHNlbGVjdGVkSXRlbS52YWx1ZSB9LCBwcm9wZXJ0eUxhYmVsICsgXCI6IFwiICsgc2VsZWN0ZWRJdGVtLnRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3QgaXRlbVRleHQgPSBwbG90bHlPcHRpb25zLmhhc1Nlcmllc1xuICAgICAgICAvLyAgID8gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lXG4gICAgICAgIC8vICAgOiBBcnJheS5pc0FycmF5KGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGEpXG4gICAgICAgIC8vICAgICA/IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGFbMF1cbiAgICAgICAgLy8gICAgIDogZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YTtcbiAgICAgICAgLy8gY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBnZXREcmFnTGF5ZXIgPSAoKSA9PlxuICAgICAgPEhUTUxFbGVtZW50PmNoYXJ0Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibnNld2RyYWdcIilbMF07XG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2hvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCIpO1xuICAgIH0pO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV91bmhvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFydCA9IHBsb3Q7XG4gICAgcmV0dXJuIHBsb3Q7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VQbG90bHkgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcInNjYXR0ZXJcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheU1vZGVCYXI6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBbXS5jb25jYXQoU2VsZWN0QmFzZVBsb3RseS50eXBlcyk7XG4gICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgPT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZXMucHVzaChcInN0YWNrZWRiYXJcIik7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcykge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnNwbGljZSgxLCAwLCBcInZiYXJcIik7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICBpZiAodGhpcy5jaGFydFR5cGVzLmluZGV4T2Yob3B0aW9ucy5kZWZhdWx0Q2hhcnRUeXBlKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZTtcbiAgICB9XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNoZWNrYm94XCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFkaW9ncm91cFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImRyb3Bkb3duXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiaW1hZ2VwaWNrZXJcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0YWdib3hcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RseU9wdGlvbnMge1xuICB0cmFjZXM6IEFycmF5PGFueT47XG4gIGxheW91dDogYW55O1xuICBoYXNTZXJpZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlTZXR1cCB7XG4gIHB1YmxpYyBzdGF0aWMgaW1hZ2VFeHBvcnRGb3JtYXQgPSBcInBuZ1wiO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiBlbmQgdXNlciBjbGlja3Mgb24gdGhlICdzYXZlIGFzIGltYWdlJyBidXR0b24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uSW1hZ2VTYXZpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU2VsZWN0QmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgU2VsZWN0QmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyBiZWZvcmUgcGxvdCB3aWxsIGJlIGNyZWF0ZWQuIFVzZXIgY2FuIGNoYW5nZSB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKiBPcHRpb25zIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvblBsb3RDcmVhdGluZyA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBzdGF0aWMgc2V0dXBzOiB7IFt0eXBlOiBzdHJpbmddOiAobW9kZWw6IFNlbGVjdEJhc2UpID0+IFBsb3RseU9wdGlvbnMgfSA9IHtcbiAgICBiYXI6IFBsb3RseVNldHVwLnNldHVwQmFyLFxuICAgIHZiYXI6IFBsb3RseVNldHVwLnNldHVwVkJhcixcbiAgICBzdGFja2VkYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICBkb3VnaG51dDogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgcGllOiBQbG90bHlTZXR1cC5zZXR1cFBpZSxcbiAgICBzY2F0dGVyOiBQbG90bHlTZXR1cC5zZXR1cFNjYXR0ZXIsXG4gIH07XG5cbiAgc3RhdGljIHNldHVwKGNoYXJUeXBlOiBzdHJpbmcsIG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dXBzW2NoYXJUeXBlXShtb2RlbCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHJ1bmNhdGVkTGFiZWwgPSAobGFiZWw6IHN0cmluZywgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzID0gXCIuLi5cIjtcbiAgICBjb25zdCB0cnVuY2F0ZVN5bWJvbHNMZW5ndGggPSB0cnVuY2F0ZVN5bWJvbHMubGVuZ3RoO1xuXG4gICAgaWYgKCFsYWJlbFRydW5jYXRlTGVuZ3RoKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsVHJ1bmNhdGVMZW5ndGggPT09IC0xKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA8PSBsYWJlbFRydW5jYXRlTGVuZ3RoICsgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoKVxuICAgICAgcmV0dXJuIGxhYmVsO1xuXG4gICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBsYWJlbFRydW5jYXRlTGVuZ3RoKSArIHRydW5jYXRlU3ltYm9scztcbiAgfTtcblxuICBzdGF0aWMgc2V0dXBQaWUobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGxldCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAwIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcblxuICAgIGNvbnN0IHRyYWNlQ29uZmlnOiBhbnkgPSB7XG4gICAgICB0eXBlOiBtb2RlbC5jaGFydFR5cGUsXG4gICAgICB5OiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICB0ZXh0OiAoaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzKS5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcblxuICAgIHRyYWNlQ29uZmlnLmhvdmVyaW5mbyA9IFwibGFiZWwrdmFsdWUrcGVyY2VudFwiO1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvcnMgPSBjb2xvcnM7XG4gICAgdHJhY2VDb25maWcudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcblxuICAgIGlmIChtb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VDb25maWcudHlwZSA9IFwicGllXCI7XG4gICAgICB0cmFjZUNvbmZpZy5ob2xlID0gMC40O1xuICAgIH1cblxuICAgIGlmICghaGFzU2VyaWVzKSB7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc3ltYm9sID0gXCJjaXJjbGVcIjtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zaXplID0gMTY7XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdHJhY2VzLnB1c2goXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgICAgdmFsdWVzOiBkYXRhc2V0LFxuICAgICAgICAgIGxhYmVsczogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgcmFkaXVzID0gbGFiZWxzLmxlbmd0aCA8IDEwID8gbGFiZWxzLmxlbmd0aCAqIDUwICsgMTAwIDogNTUwO1xuICAgIGNvbnN0IGhlaWdodCA9IHJhZGl1cyAqIE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpICsgMjU7XG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgbDogMCxcbiAgICAgICAgdDogMjUsXG4gICAgICAgIGI6IDAsXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LmFubm90YXRpb25zID0gW107XG4gICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0udGl0bGUgPSB7IHBvc2l0aW9uOiBcImJvdHRvbSBjZW50ZXJcIiwgdGV4dDogbGFiZWwgfTtcbiAgICAgIH0pO1xuICAgICAgdHJhY2VzID0gdHJhY2VzLmZpbHRlcih0ID0+ICEodC52YWx1ZXMubGVuZ3RoID09PSAxICYmIHQudmFsdWVzWzBdID09PSAwKSk7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0uZG9tYWluID0ge1xuICAgICAgICAgIGNvbHVtbjogaW5kZXggJSAyLFxuICAgICAgICAgIHJvdzogTWF0aC5mbG9vcihpbmRleCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBsYXlvdXQuZ3JpZCA9IHtcbiAgICAgICAgcm93czogTWF0aC5yb3VuZCh0cmFjZXMubGVuZ3RoIC8gMiksXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICB9O1xuICAgICAgbGF5b3V0LmhlaWdodCA9IHJhZGl1cyAqIE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpICsgMjU7XG4gICAgfVxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cEJhcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCBsaW5lSGVpZ2h0ID0gMzA7XG4gICAgbGV0IHRvcE1hcmdpbiA9IDMwO1xuICAgIGxldCBib3R0b21NYXJnaW4gPSAzMDtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDAgfHwgbW9kZWwucXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1hdHJpeFwiO1xuICAgIGNvbnN0IHlGdWxsVGV4dHMgPSBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHM7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogeUZ1bGxUZXh0cyxcbiAgICAgIHRleHQ6IHlGdWxsVGV4dHMsXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwidGV4dFwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB0ZXh0cG9zaXRpb246IFwibm9uZVwiLFxuICAgICAgd2lkdGg6IDAuNSxcbiAgICAgIGJhcmdhcDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG4gICAgdHJhY2VDb25maWcubWFya2VyLmNvbG9yID0gY29sb3JzO1xuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgeDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgICBob3ZlcnRleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nLCBsYWJlbEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbaW5kZXhdW2xhYmVsSW5kZXhdfSwgJHtsYWJlbH1gO1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcykge1xuICAgICAgICBsZXQgdGV4dHRlbXBsYXRlID0gbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IFwiJXt0ZXh0fSVcIiA6IFwiJXt2YWx1ZX0gKCV7dGV4dH0lKVwiO1xuICAgICAgICB0cmFjZS50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuICAgICAgICB0cmFjZS50ZXh0dGVtcGxhdGUgPSB0ZXh0dGVtcGxhdGU7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhlaWdodCA9IChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luO1xuXG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBvcmllbnRhdGlvbjogXCJoXCIsXG4gICAgICAgIHRpY2ttb2RlOiBcImFycmF5XCIsXG4gICAgICAgIHRpY2t2YWxzOiB5RnVsbFRleHRzLFxuICAgICAgICB0aWNrdGV4dDogeUZ1bGxUZXh0cy5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgICApICsgXCIgIFwiO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICB4YXhpczoge1xuICAgICAgICByYW5nZW1vZGU6IFwibm9ubmVnYXRpdmVcIixcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgLy8gZHRpY2s6IDFcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoaGFzU2VyaWVzKSB7XG4gICAgICBsYXlvdXQuc2hvd2xlZ2VuZCA9IHRydWU7XG4gICAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgIGxheW91dC5iYXJtb2RlID0gXCJzdGFja1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0LmhlaWdodCA9XG4gICAgICAgICAgKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKiBzZXJpZXNMYWJlbHMubGVuZ3RoICtcbiAgICAgICAgICB0b3BNYXJnaW4gK1xuICAgICAgICAgIGJvdHRvbU1hcmdpbjtcbiAgICAgIH1cblxuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG5cbiAgICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJzdGFja2VkYmFyXCIpIHtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLnR5cGUgPSBcImJhclwiO1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS53aWR0aCA9XG4gICAgICAgICAgICAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gMC43IDogMC41KSAvIHRyYWNlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2UsIHRyYWNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyY2VudFN0cmluZyA9IG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IFwiJVwiIDogXCJcIjtcbiAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dCA9IFtdO1xuICAgICAgICB5RnVsbFRleHRzLmZvckVhY2goKHlGdWxsVGV4dCwgeUZ1bGxUZXh0SW5kZXgpID0+IHtcbiAgICAgICAgICB0cmFjZXNbdHJhY2VJbmRleF0uaG92ZXJ0ZXh0LnB1c2goYCR7dHJhY2UueVt5RnVsbFRleHRJbmRleF19IDogJHt0cmFjZS5uYW1lfSwgJHt0cmFjZS50ZXh0W3lGdWxsVGV4dEluZGV4XX0ke3BlcmNlbnRTdHJpbmd9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwVkJhcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAwIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGxhYmVscyxcbiAgICAgICAgeTogbW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gdGV4dHNbaW5kZXhdLm1hcCh5ID0+IHkgLyAxMDApIDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgfSk7XG4gICAgICBpZiAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzKSB7XG4gICAgICAgIGxldCB0ZXh0dGVtcGxhdGUgPSBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gXCIle3RleHR9JVwiIDogXCIle3ZhbHVlfSAoJXt0ZXh0fSUpXCI7XG4gICAgICAgIHRyYWNlLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG4gICAgICAgIHRyYWNlLnRleHR0ZW1wbGF0ZSA9IHRleHR0ZW1wbGF0ZTtcbiAgICAgICAgdHJhY2Uud2lkdGggPSAwLjk7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMgJiYgbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcykge1xuICAgICAgbGF5b3V0LnlheGlzID0ge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0aWNrZm9ybWF0OiBcIi4wJVwiLFxuICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICB0aWNrbGVuOiBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gMjUgOiA1LFxuICAgICAgICB0aWNrY29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwU2NhdHRlcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCBsaW5lSGVpZ2h0ID0gMzA7XG4gICAgbGV0IHRvcE1hcmdpbiA9IDMwO1xuICAgIGxldCBib3R0b21NYXJnaW4gPSAzMDtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMCB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcblxuICAgIGNvbnN0IHRyYWNlQ29uZmlnOiBhbnkgPSB7XG4gICAgICB0eXBlOiBcInNjYXR0ZXJcIixcbiAgICAgIHk6IChoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMpLm1hcCgobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbW9kZWwubGFiZWxUcnVuY2F0ZUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICB0ZXh0OiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwieCt5XCIsXG4gICAgICBvcmllbnRhdGlvbjogXCJoXCIsXG4gICAgICBtb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcblxuICAgIGlmICghaGFzU2VyaWVzKSB7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc3ltYm9sID0gXCJjaXJjbGVcIjtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zaXplID0gMTY7XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPikgPT4ge1xuICAgICAge1xuICAgICAgICB2YXIgdHJhY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICAgIHg6IGRhdGFzZXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWlnaHQgPSAobGFiZWxzLmxlbmd0aCArIDEpICogbGluZUhlaWdodCArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgdGlja2xlbjogNSxcbiAgICAgICAgdGlja2NvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB9LFxuICAgICAgeGF4aXM6IHtcbiAgICAgICAgcmFuZ2Vtb2RlOiBcIm5vbm5lZ2F0aXZlXCIsXG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICB9LFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LnNob3dsZWdlbmQgPSB0cnVlO1xuICAgICAgbGF5b3V0LmhlaWdodCA9IHVuZGVmaW5lZDtcblxuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLmhvdmVyaW5mbyA9IFwieCtuYW1lXCI7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubWFya2VyLmNvbG9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm5hbWUgPSBsYWJlbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cbn0iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25TZWxlY3RCYXNlLCBJdGVtVmFsdWUsIEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBEYXRhSGVscGVyLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzL2luZGV4XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIHtcbiAgc2VsZWN0aW9uOiBJdGVtVmFsdWU7XG4gIG9uRGF0YUl0ZW1TZWxlY3RlZDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbnN3ZXJzRGF0YSB7XG4gIGRhdGFzZXRzOiBBcnJheTxBcnJheTxhbnk+PjtcbiAgbGFiZWxzOiBBcnJheTxzdHJpbmc+O1xuICBjb2xvcnM6IEFycmF5PHN0cmluZz47XG4gIHRleHRzOiBBcnJheTxBcnJheTxhbnk+PjtcbiAgc2VyaWVzTGFiZWxzOiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YTogSUFuc3dlcnNEYXRhKTogSUFuc3dlcnNEYXRhIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGRhdGFzZXRzOiA8QXJyYXk8YW55Pj5bXSxcbiAgICBsYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgdGV4dHM6IDxBcnJheTxhbnk+PltdLFxuICAgIHNlcmllc0xhYmVsczogPEFycmF5PGFueT4+W10sXG4gIH07XG4gIGlmKGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuZGF0YXNldHMucHVzaChbXSk7XG4gICAgcmVzdWx0LnRleHRzLnB1c2goW10pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXVtpXSAhPSAwKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhc2V0c1swXS5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdW2ldKTtcbiAgICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1tpXSk7XG4gICAgICAgIHJlc3VsdC5jb2xvcnMucHVzaChhbnN3ZXJzRGF0YS5jb2xvcnNbaV0pO1xuICAgICAgICByZXN1bHQudGV4dHNbMF0ucHVzaChhbnN3ZXJzRGF0YS50ZXh0c1swXVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3Qgc2VyaWVzRGF0YUV4aXN0ZW5jZSA9IDxBcnJheTxib29sZWFuPj5bXTtcbiAgc2VyaWVzRGF0YUV4aXN0ZW5jZS5sZW5ndGggPSBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoO1xuICBjb25zdCB2YWx1ZXNEYXRhRXhpc3RlbmNlID0gPEFycmF5PGJvb2xlYW4+PltdO1xuICB2YWx1ZXNEYXRhRXhpc3RlbmNlLmxlbmd0aCA9IGFuc3dlcnNEYXRhLmxhYmVscy5sZW5ndGg7XG4gIGZvciAodmFyIHZhbHVlSW5kZXggPSAwOyB2YWx1ZUluZGV4IDwgYW5zd2Vyc0RhdGEubGFiZWxzLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgZm9yICh2YXIgc2VyaWVzSW5kZXggPSAwOyBzZXJpZXNJbmRleCA8IGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICAgIGlmIChhbnN3ZXJzRGF0YS5kYXRhc2V0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0gIT0gMCkge1xuICAgICAgICBzZXJpZXNEYXRhRXhpc3RlbmNlW3Nlcmllc0luZGV4XSA9IHRydWU7XG4gICAgICAgIHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciB2YWx1ZUluZGV4ID0gMDsgdmFsdWVJbmRleCA8IHZhbHVlc0RhdGFFeGlzdGVuY2UubGVuZ3RoOyB2YWx1ZUluZGV4KyspIHtcbiAgICBpZiAodmFsdWVzRGF0YUV4aXN0ZW5jZVt2YWx1ZUluZGV4XSkge1xuICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1t2YWx1ZUluZGV4XSk7XG4gICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW3ZhbHVlSW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgc2VyaWVzSW5kZXggPSAwOyBzZXJpZXNJbmRleCA8IGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICBpZiAoc2VyaWVzRGF0YUV4aXN0ZW5jZVtzZXJpZXNJbmRleF0pIHtcbiAgICAgIHJlc3VsdC5zZXJpZXNMYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHNbc2VyaWVzSW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgdmFsdWVJbmRleCA9IDA7IHZhbHVlSW5kZXggPCBhbnN3ZXJzRGF0YS5sYWJlbHMubGVuZ3RoOyB2YWx1ZUluZGV4KyspIHtcbiAgICBpZiAodmFsdWVzRGF0YUV4aXN0ZW5jZVt2YWx1ZUluZGV4XSkge1xuICAgICAgY29uc3QgZGF0YXNldCA9IFtdO1xuICAgICAgY29uc3QgdGV4dHMgPSBbXTtcbiAgICAgIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5kYXRhc2V0cy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICAgICAgaWYgKHNlcmllc0RhdGFFeGlzdGVuY2Vbc2VyaWVzSW5kZXhdKSB7XG4gICAgICAgICAgZGF0YXNldC5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzW3ZhbHVlSW5kZXhdW3Nlcmllc0luZGV4XSk7XG4gICAgICAgICAgdGV4dHMucHVzaChhbnN3ZXJzRGF0YS50ZXh0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQuZGF0YXNldHMucHVzaChkYXRhc2V0KTtcbiAgICAgIHJlc3VsdC50ZXh0cy5wdXNoKHRleHRzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VcbiAgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZVxuICBpbXBsZW1lbnRzIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHByb3RlY3RlZCBzZWxlY3RlZEl0ZW06IEl0ZW1WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjaG9pY2VzT3JkZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hvd1BlcmNlbnRhZ2VCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGVtcHR5QW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdHJhbnNwb3NlRGF0YUJ0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdG9wTlNlbGVjdG9yOiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2hvd1BlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dPbmx5UGVyY2VudGFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcGVyY2VudGFnZVByZWNpc2lvbjogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIF9hbnN3ZXJzT3JkZXI6IHN0cmluZyA9IFwiZGVmYXVsdFwiO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9oaWRlRW1wdHlBbnN3ZXJzID0gZmFsc2U7XG4gIHByaXZhdGUgX3RvcE4gPSAtMTtcbiAgcHVibGljIHN0YXRpYyB0b3BOVmFsdWVzRGVmYXVsdHMgPSBbLTEsIDUsIDEwLCAyMF07XG4gIHB1YmxpYyB0b3BOVmFsdWVzID0gW10uY29uY2F0KFNlbGVjdEJhc2UudG9wTlZhbHVlc0RlZmF1bHRzKTtcbiAgcHJpdmF0ZSBfdHJhbnNwb3NlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93TWlzc2luZ0Fuc3dlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaXNzaW5nQW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IGFueSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwic2VsZWN0QmFzZVwiKTtcbiAgICAoPGFueT5xdWVzdGlvbikudmlzaWJsZUNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCgpO1xuICAgIH07XG4gICAgdGhpcy5fc2hvd1BlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dQZXJjZW50YWdlcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dPbmx5UGVyY2VudGFnZXMgPT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb24pIHtcbiAgICAgIHRoaXMuX3BlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLm9wdGlvbnMucGVyY2VudGFnZVByZWNpc2lvbjtcbiAgICB9XG5cbiAgICB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzID0gdGhpcy5vcHRpb25zLmhpZGVFbXB0eUFuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5fYW5zd2Vyc09yZGVyID0gdGhpcy5vcHRpb25zLmFuc3dlcnNPcmRlciB8fCBcImRlZmF1bHRcIjtcbiAgICB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnMgPSB0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLnNob3dNaXNzaW5nQW5zd2VycyA9PT0gdHJ1ZTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VDaGFydFR5cGVcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMubWFwKChjaGFydFR5cGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBjaGFydFR5cGUsXG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaGFydFR5cGVfXCIgKyBjaGFydFR5cGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMuY2hhcnRUeXBlID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgICAgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDaGFydFR5cGUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUFuc3dlcnNPcmRlclwiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0NoYW5nZUFuc3dlcnNPcmRlcikgJiZcbiAgICAgICAgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVmYXVsdE9yZGVyXCIpLCB2YWx1ZTogXCJkZWZhdWx0XCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFzY09yZGVyXCIpLCB2YWx1ZTogXCJhc2NcIiB9LFxuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVzY09yZGVyXCIpLCB2YWx1ZTogXCJkZXNjXCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIChvcHRpb24pID0+IGZhbHNlLFxuICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFuc3dlcnNPcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93UGVyY2VudGFnZXNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dTaG93UGVyY2VudGFnZXMgJiZcbiAgICAgICAgKHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwiYmFyXCIpICE9PSAtMSB8fFxuICAgICAgICAgIHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwic3RhY2tlZGJhclwiKSAhPT0gLTEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZXMgPSAhdGhpcy5zaG93UGVyY2VudGFnZXM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dQZXJjZW50YWdlQnRuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImhpZGVFbXB0eUFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0hpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZUVtcHR5QW5zd2VycyA9ICF0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVFbXB0eUFuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVtcHR5QW5zd2Vyc0J0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0b3BOQW5zd2Vyc1wiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1RvcE5BbnN3ZXJzICYmXG4gICAgICAgIHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50b3BOU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLnRvcE5WYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInRvcE5WYWx1ZVRleHRcIiArIHZhbHVlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b3BOID0gcGFyc2VJbnQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRvcE5TZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0cmFuc3Bvc2VEYXRhXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dUcmFuc3Bvc2VEYXRhKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhID0gIXRoaXMudHJhbnNwb3NlRGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3NlRGF0YUJ0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93TWlzc2luZ0Fuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQW5zd2Vyc0J0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMgPSAhdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9jaGFydFR5cGU6IHN0cmluZyA9IFwiYmFyXCI7XG4gIC8qKlxuICAgKiBDaGFydCB0eXBlIC0gY3VycmVudCBjaGFydCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBjaGFydFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhcnRUeXBlO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hhcnRUeXBlKG5ld0NoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRDaGFydFR5cGUobmV3Q2hhcnRUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCkge1xuICAgIGlmICghIXRoaXMuZW1wdHlBbnN3ZXJzQnRuKSB7XG4gICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5pbm5lclRleHQgPSB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dFbXB0eUFuc3dlcnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZUVtcHR5QW5zd2Vyc1wiKTtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZSA9PSBcImJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwidmJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwic2NhdHRlclwiKSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpIHtcbiAgICBpZiAoISF0aGlzLnRyYW5zcG9zZURhdGFCdG4pIHtcbiAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5pbm5lclRleHQgPSB0aGlzLnRyYW5zcG9zZURhdGFcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlckNvbHVtbnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlclZhbHVlc1wiKTtcbiAgICAgIGlmICh0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU9yZGVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvcikge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcImJhclwiIHx8XG4gICAgICAgIHRoaXMuY2hhcnRUeXBlID09IFwidmJhclwiIHx8XG4gICAgICAgIHRoaXMuY2hhcnRUeXBlID09IFwic2NhdHRlclwiIHx8XG4gICAgICAgICgodGhpcy5jaGFydFR5cGUgPT0gXCJwaWVcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcImRvdWdobnV0XCIpICYmXG4gICAgICAgICAgdGhpcy50b3BOID4gMClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1mbGV4XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICAgIFwic2VsZWN0XCJcbiAgICAgIClbMF0udmFsdWUgPSB0aGlzLmFuc3dlcnNPcmRlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCkge1xuICAgIGlmICghIXRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4pIHtcbiAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uaW5uZXJUZXh0ID0gdGhpcy5fc2hvd1BlcmNlbnRhZ2VzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVQZXJjZW50YWdlc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93UGVyY2VudGFnZXNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb3BOU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy50b3BOU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudG9wTlNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2VsZWN0XCIpWzBdLnZhbHVlID0gPGFueT4oXG4gICAgICAgIHRoaXMuX3RvcE5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuKSB7XG4gICAgICB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuLmlubmVyVGV4dCA9IHRoaXMuX3Nob3dNaXNzaW5nQW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlTWlzc2luZ0Fuc3dlcnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNoYXJ0VHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDaGFydFR5cGUoY2hhcnRUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihjaGFydFR5cGUpICE9PSAtMSAmJlxuICAgICAgdGhpcy5fY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gc3VwZXIuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvcnJlY3RBbnN3ZXJWYWx1ZSkgPyBjb3JyZWN0QW5zd2VyVmFsdWUgOiBbY29ycmVjdEFuc3dlclZhbHVlXTtcbiAgICBjb25zdCBzZWxlY3RCYXNlUXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZTtcbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHNlbGVjdEJhc2VRdWVzdGlvbi5jaG9pY2VzLCB2YWx1ZSkpLmpvaW4oXCIsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgJiYgaXRlbVRleHQgPT0gc2VsQmFzZS5vdGhlclRleHQpIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLm90aGVySXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbEJhc2UuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4gY2hvaWNlLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgICApWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25EYXRhSXRlbVNlbGVjdGVkKFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbSAhPT0gdW5kZWZpbmVkID8gaXRlbS50ZXh0IDogXCJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgcGVyY2VudGFnZXMgb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09ubHlQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd09ubHlQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgdmFsdWVzIGFuZCBwZXJjZW50YWdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BlcmNlbnRhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGVyY2VudGFnZXMgPSB2YWw7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIGNoYXJ0IGVsZW1lbnRzIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBhbnN3ZXJzT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fuc3dlcnNPcmRlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYW5zd2Vyc09yZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hbnN3ZXJzT3JkZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgbmVlZCB0byBoaWRlIGVtcHR5IGNoYXJ0IGVsZW1lbnRzIChlLmcuIGJhcnMgdml0aCB6ZXJvIHZhbHVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZUVtcHR5QW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaGlkZUVtcHR5QW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVFbXB0eUFuc3dlcnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNwb3NlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3NlRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdHJhbnNwb3NlRGF0YSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3RyYW5zcG9zZURhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHNvbWUgdmFsdWUgaWYgbmVlZCB0byBzaG93IHRvcCBOIGNoYXJ0IGVsZW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldCB0b3BOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvcE47XG4gIH1cblxuICBwdWJsaWMgc2V0IHRvcE4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RvcE4gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRvcE5TZWxlY3RvcigpO1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzZWUgY2hhcnQgZWxlbWVudHMgZm9yIG1pc3NpbmcgYW5zd2VycyAoZS5nLiByYWRpb2dyb3VwIGl0ZW1zIG5ldmVyIGJlZW4gc2VsZWN0ZWQgYnkgc3VydmV5ZWUpLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TWlzc2luZ0Fuc3dlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd01pc3NpbmdBbnN3ZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHZhbHVlO1xuICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCh0aGlzKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICByZWZyZXNoQ29udGVudCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gIH1cblxuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIGdldCBzaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2hvd1ZhbHVlc0luT3JpZ2luYWxPcmRlciAhPT0gZmFsc2U7XG4gIH1cblxuICB2YWx1ZXNTb3VyY2UoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgbGV0IHF1ZXN0aW9uID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmKCEhcXVlc3Rpb24uY2hvaWNlc0Zyb21RdWVzdGlvbiAmJiAhIXF1ZXN0aW9uLnN1cnZleSkge1xuICAgICAgcXVlc3Rpb24gPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnF1ZXN0aW9uLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbi5jaG9pY2VzRnJvbVF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uW1wiYWN0aXZlQ2hvaWNlc1wiXTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PGFueT4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcChcbiAgICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZVxuICAgICk7XG5cbiAgICBpZiAoKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikuaGFzTm9uZSkge1xuICAgICAgdmFsdWVzLnB1c2goKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikubm9uZUl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNPdGhlcikge1xuICAgICAgdmFsdWVzLnB1c2goXCJvdGhlclwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICB2YWx1ZXMudW5zaGlmdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWVzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVZhbHVlc0FzTGFiZWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWxzOiBBcnJheTxzdHJpbmc+ID0gdGhpcy52YWx1ZXNTb3VyY2UoKS5tYXAoKGNob2ljZSkgPT5cbiAgICAgIEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnZhbHVlc1NvdXJjZSgpLCBjaG9pY2UudmFsdWUpXG4gICAgKTtcbiAgICBjb25zdCBzZWxCYXNlID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmIChzZWxCYXNlLmhhc05vbmUpIHtcbiAgICAgIGxhYmVscy5wdXNoKHNlbEJhc2Uubm9uZVRleHQpO1xuICAgIH1cbiAgICBpZiAoc2VsQmFzZS5oYXNPdGhlcikge1xuICAgICAgbGFiZWxzLnB1c2goc2VsQmFzZS5vdGhlclRleHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIGxhYmVscy51bnNoaWZ0KGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaXNzaW5nQW5zd2Vyc0xhYmVsXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1ZhbHVlc0luT3JpZ2luYWxPcmRlcikge1xuICAgICAgcmV0dXJuIGxhYmVscy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlcygpOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG4gICAgdmFyIGRhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gdGhpcy5nZXREYXRhKCk7XG4gICAgdmFyIHBlcmNlbnRhZ2VzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhciBwZXJjZW50YWdlUHJlY2lzaW9uID0gdGhpcy5fcGVyY2VudGFnZVByZWNpc2lvbjtcblxuICAgIGlmIChkYXRhLmxlbmd0aCA8IDIpIHtcbiAgICAgIGRhdGEuZm9yRWFjaCgocmVzLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgc3VtID0gcmVzLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCk7XG4gICAgICAgIHBlcmNlbnRhZ2VzW2luZGV4XSA9IHJlcy5tYXAoKHZhbCkgPT4ge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHBlcmNlbnRhZ2VQcmVjaXNpb24gPyArKHZhbCAvIHN1bSkudG9GaXhlZChwZXJjZW50YWdlUHJlY2lzaW9uKSA6IE1hdGgucm91bmQoKHZhbCAvIHN1bSkgKiAxMDAwMCk7XG4gICAgICAgICAgcmV0dXJuIHN1bSAmJiAodmFsdWUgLyAxMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHN1bSArPSBkYXRhW2pdW2ldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwZXJjZW50YWdlc1tqXSkpIHBlcmNlbnRhZ2VzW2pdID0gW107XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGVyY2VudGFnZVByZWNpc2lvbiA/ICsoKGRhdGFbal1baV0gLyBzdW0pICogMTAwKS50b0ZpeGVkKHBlcmNlbnRhZ2VQcmVjaXNpb24pIDogTWF0aC5yb3VuZCgoZGF0YVtqXVtpXSAvIHN1bSkgKiAxMDApO1xuICAgICAgICAgIHBlcmNlbnRhZ2VzW2pdW2ldID0gc3VtICYmIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJjZW50YWdlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBhbnN3ZXJzRGF0YVJlYWR5KGFuc3dlcnNEYXRhOiBJQW5zd2Vyc0RhdGEpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5oaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICByZXN1bHQgPSBoaWRlRW1wdHlBbnN3ZXJzSW5EYXRhKGFuc3dlcnNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYW5zd2Vyc0RhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvcE4gPiAwKSB7XG4gICAgICByZXN1bHQuZGF0YXNldHNbMF0gPSByZXN1bHQuZGF0YXNldHNbMF0uc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQubGFiZWxzID0gcmVzdWx0LmxhYmVscy5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC5jb2xvcnMgPSByZXN1bHQuY29sb3JzLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LnRleHRzWzBdID0gcmVzdWx0LnRleHRzWzBdLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYW5zd2VyIGRhdGEgaGFzIGJlZW4gY29tYmluZWQgYmVmb3JlIHRoZXkgcGFzc2VkIHRvIGRyYXcgZ3JhcGguXG4gICAqIG9wdGlvbnMgLSB0aGUgYW5zd2VycyBkYXRhIG9iamVjdCBjb250YWluaW5nOiBkYXRhc2V0cywgbGFiZWxzLCBjb2xvcnMsIGFkZGl0aW9uYWwgdGV4dHMgKHBlcmNlbnRhZ2UpLlxuICAgKiBvcHRpb25zIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWRcbiAgICovXG4gIHB1YmxpYyBvbkFuc3dlcnNEYXRhUmVhZHkgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU2VsZWN0QmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgU2VsZWN0QmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9iamVjdCB3aXRoIGFsbCBpbmZvdG1hdGlvbiBmb3IgZGF0YSB2aXN1YWxpemF0aW9uOiBkYXRhc2V0cywgbGFiZWxzLCBjb2xvcnMsIGFkZGl0aW9uYWwgdGV4dHMgKHBlcmNlbnRhZ2UpLlxuICAgKi9cbiAgcHVibGljIGdldEFuc3dlcnNEYXRhKCk6IElBbnN3ZXJzRGF0YSB7XG4gICAgbGV0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgbGV0IGRhdGFzZXRzID0gdGhpcy5nZXREYXRhKCk7XG4gICAgbGV0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgbGV0IGNvbG9ycyA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgdmFyIHRleHRzID0gdGhpcy5zaG93UGVyY2VudGFnZXMgPyB0aGlzLmdldFBlcmNlbnRhZ2VzKCkgOiBkYXRhc2V0cztcblxuICAgIGlmICh0aGlzLnRyYW5zcG9zZURhdGEpIHtcbiAgICAgIGRhdGFzZXRzID0gdGhpcy50cmFuc3Bvc2UoZGF0YXNldHMpO1xuICAgICAgdGV4dHMgPSB0aGlzLnRyYW5zcG9zZSh0ZXh0cyk7XG4gICAgICBjb25zdCB0ZW1wID0gc2VyaWVzTGFiZWxzO1xuICAgICAgc2VyaWVzTGFiZWxzID0gbGFiZWxzO1xuICAgICAgbGFiZWxzID0gdGVtcDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJhc2NcIiB8fCB0aGlzLmFuc3dlcnNPcmRlciA9PSBcImRlc2NcIikge1xuICAgICAgdmFyIHppcHBlZEFycmF5ID0gdGhpcy5zaG93UGVyY2VudGFnZXNcbiAgICAgICAgPyBEYXRhSGVscGVyLnppcEFycmF5cyhsYWJlbHMsIGNvbG9ycywgdGV4dHNbMF0pXG4gICAgICAgIDogRGF0YUhlbHBlci56aXBBcnJheXMobGFiZWxzLCBjb2xvcnMpO1xuICAgICAgbGV0IGRpY3QgPSBEYXRhSGVscGVyLnNvcnREaWN0aW9uYXJ5KFxuICAgICAgICB6aXBwZWRBcnJheSxcbiAgICAgICAgZGF0YXNldHNbMF0sXG4gICAgICAgIHRoaXMuYW5zd2Vyc09yZGVyID09IFwiZGVzY1wiXG4gICAgICApO1xuICAgICAgbGV0IHVuemlwcGVkQXJyYXkgPSBEYXRhSGVscGVyLnVuemlwQXJyYXlzKGRpY3Qua2V5cyk7XG4gICAgICBsYWJlbHMgPSB1bnppcHBlZEFycmF5WzBdO1xuICAgICAgY29sb3JzID0gdW56aXBwZWRBcnJheVsxXTtcbiAgICAgIGlmICh0aGlzLnNob3dQZXJjZW50YWdlcykgdGV4dHNbMF0gPSB1bnppcHBlZEFycmF5WzJdO1xuICAgICAgZGF0YXNldHNbMF0gPSBkaWN0LnZhbHVlcztcbiAgICB9XG5cbiAgICBsZXQgYW5zd2Vyc0RhdGEgPSB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH07XG4gICAgYW5zd2Vyc0RhdGEgPSB0aGlzLmFuc3dlcnNEYXRhUmVhZHkoYW5zd2Vyc0RhdGEpO1xuICAgIHRoaXMub25BbnN3ZXJzRGF0YVJlYWR5LmZpcmUodGhpcywgYW5zd2Vyc0RhdGEpO1xuXG4gICAgcmV0dXJuIGFuc3dlcnNEYXRhO1xuICB9XG4gIHByb3RlY3RlZCB0cmFuc3Bvc2UoZGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4pOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG4gICAgY29uc3QgZGltMiA9IGRhdGFbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PihkaW0yKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTI7ICsraSlcbiAgICAgIHJlc3VsdFtpXSA9IG5ldyBBcnJheTxudW1iZXI+KGRhdGEubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltMjsgKytqKSB7XG4gICAgICAgIHJlc3VsdFtqXVtpXSA9IGRhdGFbaV1bal07XG4gICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9zdGF0ZVByb3BlcnRpZXMgPSBbXCJjaGFydFR5cGVcIiwgXCJhbnN3ZXJzT3JkZXJcIiwgXCJoaWRlRW1wdHlBbnN3ZXJzXCIsIFwidG9wTlwiXTtcbiAgcHVibGljIGdldFN0YXRlKCk6IGFueSB7XG4gICAgbGV0IHN0YXRlOiBhbnkgPSB7fTtcbiAgICBTZWxlY3RCYXNlLl9zdGF0ZVByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgc3RhdGVbcHJvcGVydHlOYW1lXSA9ICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV07XG4gICAgfSk7XG4gICAgaWYoISF0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgc3RhdGUuZmlsdGVyID0gdGhpcy5zZWxlY3RlZEl0ZW0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBpZiAoc3RhdGVbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0gPSBzdGF0ZVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSgodGhpcy5xdWVzdGlvbiBhcyBRdWVzdGlvblNlbGVjdEJhc2UpLnZpc2libGVDaG9pY2VzLCBzdGF0ZS5maWx0ZXIpO1xuICAgIHRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSXRlbSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XHJcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vdGV4dC5zY3NzXCIpO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRUYWJsZUFkYXB0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IFRleHQpIHt9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zQ291bnQsIGRhdGEgfSA9IHRoaXMubW9kZWwuZ2V0RGF0YSgpO1xyXG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XHJcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLXRleHQtdGFibGVcIilcclxuICAgICk7XHJcblxyXG4gICAgdGFibGVOb2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XHJcblxyXG4gICAgZGF0YS5mb3JFYWNoKChyb3dEYXRhKSA9PiB7XHJcbiAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcclxuICAgICAgICB2YXIgdGQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS10ZXh0LXRhYmxlX19jZWxsXCIsIHtcclxuICAgICAgICAgIHRleHRDb250ZW50OiByb3dEYXRhW2ldLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh0ZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKHJvdyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS10ZXh0LXRhYmxlX19jb250YWluZXJcIjtcclxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcclxuICAgIG5vZGUuaW5uZXJIVE1MID0gXCJcIjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0IGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xyXG4gIHByaXZhdGUgX3RleHRUYWJsZUFkYXB0ZXI6IFRleHRUYWJsZUFkYXB0ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcclxuICAgIG9wdGlvbnM/OiBPYmplY3QsXHJcbiAgICBuYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInRleHRcIik7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyID0gbmV3IFRleHRUYWJsZUFkYXB0ZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXREYXRhKCkge1xyXG4gICAgbGV0IHJlc3VsdDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuICAgIGxldCBjb2x1bW5zQ291bnQgPSAwO1xyXG5cclxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xyXG4gICAgICBjb25zdCBkYXRhU3RyaW5nczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xyXG4gICAgICAgICAgZGF0YVN0cmluZ3MuY29uY2F0KHJvd1ZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWVba2V5XSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQucHVzaChkYXRhU3RyaW5ncyk7XHJcbiAgICAgICAgaWYgKGRhdGFTdHJpbmdzLmxlbmd0aCA+IGNvbHVtbnNDb3VudCkge1xyXG4gICAgICAgICAgY29sdW1uc0NvdW50ID0gZGF0YVN0cmluZ3MubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uc0NvdW50LCBkYXRhOiByZXN1bHQgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcclxuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmNyZWF0ZShjb250YWluZXIpO1xyXG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gIH1cclxufVxyXG5cclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFRleHQpO1xyXG4iLCJleHBvcnQgdmFyIF9fYXNzaWduID1cbiAgKDxhbnk+T2JqZWN0KVtcImFzc2lnblwiXSB8fFxuICBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIHAgaW4gcylcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyh0aGlzQ2xhc3M6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgZm9yICh2YXIgcCBpbiBiYXNlQ2xhc3MpXG4gICAgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzO1xuICB9XG4gIHRoaXNDbGFzcy5wcm90b3R5cGUgPVxuICAgIGJhc2VDbGFzcyA9PT0gbnVsbFxuICAgICAgPyBPYmplY3QuY3JlYXRlKGJhc2VDbGFzcylcbiAgICAgIDogKChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlKSwgbmV3ICg8YW55Pl9fKSgpKTtcbn1cblxuZXhwb3J0IHZhciBfX3Jlc3QgPSBmdW5jdGlvbihzb3VyY2U6IGFueSwgZTogYW55KSB7XG4gIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gc291cmNlKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIHByb3BlcnR5TmFtZSkgJiZcbiAgICAgIGUuaW5kZXhPZihwcm9wZXJ0eU5hbWUpIDwgMFxuICAgIClcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gc291cmNlW3Byb3BlcnR5TmFtZV07XG4gIGlmIChcbiAgICBzb3VyY2UgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiAoPGFueT5PYmplY3QpW1wiZ2V0T3duUHJvcGVydHlTeW1ib2xzXCJdID09PSBcImZ1bmN0aW9uXCJcbiAgKVxuICAgIGZvciAoXG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgIHByb3BlcnR5U3ltYm9scyA9ICg8YW55Pk9iamVjdClbXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIl0oc291cmNlKTtcbiAgICAgIGkgPCBwcm9wZXJ0eVN5bWJvbHMubGVuZ3RoO1xuICAgICAgaSsrXG4gICAgKVxuICAgICAgaWYgKGUuaW5kZXhPZihwcm9wZXJ0eVN5bWJvbHNbaV0pIDwgMClcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5U3ltYm9sc1tpXV0gPSBzb3VyY2VbcHJvcGVydHlTeW1ib2xzW2ldXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxuZXhwb3J0IHZhciBfX2RlY29yYXRlID0gZnVuY3Rpb24oXG4gIGRlY29yYXRvcnM6IGFueSxcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogYW55LFxuICBkZXNjOiBhbnlcbikge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcbiIsImV4cG9ydCBjbGFzcyBEb2N1bWVudEhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTZWxlY3RvcihcclxuICAgIG9wdGlvbnM6IEFycmF5PHsgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0+LFxyXG4gICAgaXNTZWxlY3RlZDogKG9wdGlvbjogeyB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfSkgPT4gYm9vbGVhbixcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgc2VsZWN0V3JhcHBlci5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3Qtd3JhcHBlclwiO1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcclxuICAgIHNlbGVjdC5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3RcIjtcclxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCBcIlwiLCB7XHJcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcclxuICAgICAgICB0ZXh0OiBvcHRpb24udGV4dCxcclxuICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZChvcHRpb24pLFxyXG4gICAgICB9KTtcclxuICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICBzZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVyO1xyXG4gICAgc2VsZWN0V3JhcHBlci5hcHBlbmRDaGlsZChzZWxlY3QpO1xyXG4gICAgcmV0dXJuIHNlbGVjdFdyYXBwZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUJ1dHRvbihcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWQsXHJcbiAgICB0ZXh0ID0gXCJcIixcclxuICAgIGNsYXNzTmFtZSA9IFwic2EtdG9vbGJhcl9fYnV0dG9uXCJcclxuICApIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIGNsYXNzTmFtZSwge1xyXG4gICAgICBpbm5lclRleHQ6IHRleHQsXHJcbiAgICAgIG9uY2xpY2s6IGhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBidXR0b247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUVsZW1lbnQoXHJcbiAgICB0YWdOYW1lOiBzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU6IHN0cmluZyA9IFwiXCIsXHJcbiAgICBhdHRycz86IGFueVxyXG4gICk6IEhUTUxFbGVtZW50IHtcclxuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcbiAgICBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XHJcbiAgICBpZiAoISFhdHRycykge1xyXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgKDxhbnk+ZWwpW2tleV0gPSBhdHRyc1trZXldO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnRWxlbWVudChwYXRoOiBzdHJpbmcpOiBTVkdTVkdFbGVtZW50IHtcclxuICAgIGNvbnN0IHN2Z0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJzdmdcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHVzZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJ1c2VcIlxyXG4gICAgKTtcclxuICAgIHVzZUVsZW0uc2V0QXR0cmlidXRlTlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxyXG4gICAgICBcImhyZWZcIixcclxuICAgICAgXCIjc2Etc3ZnLVwiICsgcGF0aFxyXG4gICAgKTtcclxuICAgIHN2Z0VsZW0uYXBwZW5kQ2hpbGQodXNlRWxlbSk7XHJcbiAgICByZXR1cm4gc3ZnRWxlbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQnV0dG9uKHBhdGg6IHN0cmluZyk6IEhUTUxCdXR0b25FbGVtZW50IHtcclxuICAgIGNvbnN0IGJ0biA9IDxIVE1MQnV0dG9uRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgXCJzYS10YWJsZV9fc3ZnLWJ1dHRvblwiKVxyXG4gICAgKTtcclxuICAgIGJ0bi5hcHBlbmRDaGlsZChEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KHBhdGgpKTtcclxuICAgIHJldHVybiBidG47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcclxuICAgIHN2Z1BhdGgxOiBzdHJpbmcsXHJcbiAgICBzdlBwYXRoMjogc3RyaW5nLFxyXG4gICAgdGV4dDE6IHN0cmluZyxcclxuICAgIHRleHQyOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyMTogKGU6IGFueSkgPT4gYW55LFxyXG4gICAgaGFuZGxlcjI6IChlOiBhbnkpID0+IGFueSxcclxuICAgIHN0YXRlID0gXCJmaXJzdFwiLFxyXG4gICAgY2xhc3NOYW1lID0gXCJzYS10b29sYmFyX19idXR0b24gc2EtdG9vbGJhcl9fc3ZnLWJ1dHRvblwiXHJcbiAgKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3Qgc3ZnMSA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZnUGF0aDEpO1xyXG4gICAgY29uc3Qgc3ZnMiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZQcGF0aDIpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBjbGFzc05hbWUpO1xyXG5cclxuICAgIGNvbnN0IHRvZ2dsZSA9IChlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgICBzdGF0ZSA9IFwic2Vjb25kXCI7XHJcbiAgICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgICAgYnV0dG9uLnJlbW92ZUNoaWxkKHN2ZzEpO1xyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgICAgICBoYW5kbGVyMihlKTtcclxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJzZWNvbmRcIikge1xyXG4gICAgICAgIHN0YXRlID0gXCJmaXJzdFwiO1xyXG4gICAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQxO1xyXG4gICAgICAgIGJ1dHRvbi5yZW1vdmVDaGlsZChzdmcyKTtcclxuICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMSk7XHJcbiAgICAgICAgaGFuZGxlcjEoZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDE7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcxKTtcclxuICAgIH0gZWxzZSBpZiAoKHN0YXRlID0gXCJzZWNvbmRcIikpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgIH1cclxuXHJcbiAgICBidXR0b24ub25jbGljayA9IHRvZ2dsZTtcclxuXHJcbiAgICByZXR1cm4gYnV0dG9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVJbnB1dChcclxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxyXG4gICAgcGxhY2Vob2xkZXIgPSBcIlwiLFxyXG4gICAgZGVmYXVsdFZhbHVlID0gXCJcIlxyXG4gICk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgdmFyIGVsID0gPEhUTUxJbnB1dEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgICAgXCJpbnB1dFwiLFxyXG4gICAgICBjbGFzc05hbWUsXHJcbiAgICAgIHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gZWw7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIG9wdGlvbnMgPSB7XHJcbiAgcnVubmluZ0luQnJvd3NlcjogdHlwZW9mIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIsXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dEb21SZW5kZXJpbmcoKSB7XHJcbiAgcmV0dXJuIG9wdGlvbnMucnVubmluZ0luQnJvd3NlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluaygpIHtcclxuICBjb25zdCBjb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCBsaW5rID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJzYS1jb21tZXJjaWFsX190ZXh0XCIsIHtcclxuICAgIGhyZWY6IFwiaHR0cHM6Ly93d3cuc3VydmV5anMuaW8vQnV5XCIsXHJcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXHJcbiAgfSk7XHJcbiAgY29uc3QgY29udGFpbmVyU3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiXCIpO1xyXG4gIGNvbnN0IGljb24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KFwibm9uY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCB0ZXh0U3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICBcInNwYW5cIixcclxuICAgIFwic2EtY29tbWVyY2lhbF9fcHJvZHVjdFwiLFxyXG4gICAge1xyXG4gICAgICBpbm5lclRleHQ6IFwiUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgQW5hbHl0aWNzIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcC5cIixcclxuICAgIH1cclxuICApO1xyXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKS5hcHBlbmRDaGlsZChjb250YWluZXJTcGFuKTtcclxuICBjb250YWluZXJTcGFuLmFwcGVuZENoaWxkKGljb24pO1xyXG4gIGNvbnRhaW5lclNwYW4uYXBwZW5kQ2hpbGQodGV4dFNwYW4pO1xyXG4gIHJldHVybiBjb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHppcEFycmF5cyguLi5hcnJheXM6IGFueVtdKTogYW55W11bXSB7XHJcbiAgICBsZXQgemlwQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB6aXBBcnJheVtpXSA9IFtdO1xyXG4gICAgICBhcnJheXMuZm9yRWFjaCgoYXJyKSA9PiB7XHJcbiAgICAgICAgemlwQXJyYXlbaV0ucHVzaChhcnJbaV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB6aXBBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdW56aXBBcnJheXMoemlwQXJyYXk6IGFueVtdW10pOiBhbnlbXVtdIHtcclxuICAgIGxldCBhcnJheXM6IGFueVtdW10gPSBbXTtcclxuICAgIHppcEFycmF5LmZvckVhY2goKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgIHZhbHVlLmZvckVhY2goKHZhbCwgaikgPT4ge1xyXG4gICAgICAgIGlmICghYXJyYXlzW2pdKSBhcnJheXNbal0gPSBbXTtcclxuICAgICAgICBhcnJheXNbal1baV0gPSB2YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXJyYXlzO1xyXG4gIH1cclxuICBwdWJsaWMgc3RhdGljIHNvcnREaWN0aW9uYXJ5KFxyXG4gICAga2V5czogYW55W10sXHJcbiAgICB2YWx1ZXM6IGFueVtdLFxyXG4gICAgZGVzYzogYm9vbGVhblxyXG4gICk6IHsga2V5czogYW55W10sIHZhbHVlczogYW55W10gfSB7XHJcbiAgICBsZXQgZGljdGlvbmFyeSA9IHRoaXMuemlwQXJyYXlzKGtleXMsIHZhbHVlcyk7XHJcbiAgICBsZXQgY29tcGFyYXRvciA9IChhOiBhbnlbXSwgYjogYW55W10sIGFzYzogYm9vbGVhbiA9IHRydWUpID0+IHtcclxuICAgICAgbGV0IHJlc3VsdCA9IGFbMV0gPCBiWzFdID8gMSA6IGFbMV0gPT0gYlsxXSA/IDAgOiAtMTtcclxuICAgICAgcmV0dXJuIGFzYyA/IHJlc3VsdCA6IHJlc3VsdCAqIC0xO1xyXG4gICAgfTtcclxuICAgIGRpY3Rpb25hcnkuc29ydCgoYTogYW55W10sIGI6IGFueVtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBkZXNjID8gY29tcGFyYXRvcihhLCBiLCBmYWxzZSkgOiBjb21wYXJhdG9yKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQga2V5c0FuZFZhbHVlcyA9IHRoaXMudW56aXBBcnJheXMoZGljdGlvbmFyeSk7XHJcbiAgICByZXR1cm4geyBrZXlzOiBrZXlzQW5kVmFsdWVzWzBdLCB2YWx1ZXM6IGtleXNBbmRWYWx1ZXNbMV0gfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdG9QZXJjZW50YWdlKHZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodmFsdWUgLyBtYXhWYWx1ZSkgKiAxMDA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGlua3NDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJcIiwge1xyXG4gICAgICAgIGlubmVyVGV4dDogbGluay5uYW1lLFxyXG4gICAgICAgIGRvd25sb2FkOiBsaW5rLm5hbWUsXHJcbiAgICAgICAgaHJlZjogbGluay5jb250ZW50LFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gbGlua3NDb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbWFnZXNDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImltZ1wiLCBcIlwiLCB7XHJcbiAgICAgICAgYWx0OiBsaW5rLm5hbWUsXHJcbiAgICAgICAgc3JjOiBsaW5rLmNvbnRlbnQsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG4gIHJldHVybiBsaW5rc0NvbnRhaW5lcjtcclxufVxyXG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuXG5kZWNsYXJlIHR5cGUgVmlzdWFsaXplckNvbnN0cnVjdG9yID0gbmV3IChcbiAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICBvcHRpb25zPzogT2JqZWN0XG4pID0+IGFueTtcblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdmlzdWFsaXplcnMgZm9yIGluZGl2aWR1YWwgcXVlc3Rpb24gdHlwZXMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWFuYWdlciB7XG4gIHN0YXRpYyBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHN0YXRpYyB2aXp1YWxpemVyczogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcj4gfSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmlzdWFsaXplciBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgQSBxdWVzdGlvbiBbdHlwZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI2dldFR5cGUpLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXN1YWxpemVyIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclZpc3VhbGl6ZXIoXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvclxuICApIHtcbiAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdO1xuICAgIGlmICghdmlzdWFsaXplcnMpIHtcbiAgICAgIHZpc3VhbGl6ZXJzID0gW107XG4gICAgICBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdID0gdmlzdWFsaXplcnM7XG4gICAgfVxuICAgIHZpc3VhbGl6ZXJzLnB1c2goY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZpc3VhbGl6ZXIgZm9yIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIHR5cGUuXG4gICAqXG4gICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2V4YW1wbGVzL3Zpc3VhbGl6ZS1hbnN3ZXJzLWZyb20tdGV4dC1lbnRyeS1maWVsZHMtd2l0aC1jaGFydHMvIChsaW5rU3R5bGUpKVxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIEEgcXVlc3Rpb24gW3R5cGVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNnZXRUeXBlKS5cbiAgICogQHBhcmFtIGNvbnN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlzdWFsaXplciBjb25zdHJ1Y3RvciB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyVmlzdWFsaXplcihxdWVzdGlvblR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIGxldCBxdWVzdGlvblR5cGVzID0gW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYoIXF1ZXN0aW9uVHlwZSkge1xuICAgICAgcXVlc3Rpb25UeXBlcyA9IE9iamVjdC5rZXlzKFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzKTtcbiAgICB9XG4gICAgcXVlc3Rpb25UeXBlcy5mb3JFYWNoKHFUeXBlID0+IHtcbiAgICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3FUeXBlXTtcbiAgICAgIGlmICghIXZpc3VhbGl6ZXJzKSB7XG4gICAgICAgIGxldCBpbmRleCA9IHZpc3VhbGl6ZXJzLmluZGV4T2YoY29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdmlzdWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gUGFzcyBgdW5kZWZpbmVkYCB0byB0aGUgW2B1bnJlZ2lzdGVyVmlzdWFsaXplcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ubWFuYWdlciN1bnJlZ2lzdGVyVmlzdWFsaXplcikgbWV0aG9kIGluc3RlYWQuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXJGb3JBbGwoY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnVucmVnaXN0ZXJWaXN1YWxpemVyKHVuZGVmaW5lZCwgY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB2aXN1YWxpemVyIGNvbnN0cnVjdG9ycyBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZpc3VhbGl6ZXJzQnlUeXBlKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nXG4gICk6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvcltdIHtcbiAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdO1xuICAgIGlmICghdmlzdWFsaXplcnMpIHtcbiAgICAgIHJldHVybiBbVmlzdWFsaXplckJhc2VdO1xuICAgIH1cbiAgICByZXR1cm4gdmlzdWFsaXplcnM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb25zdHJ1Y3RvciBmb3IgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICogQHNlZSByZWdpc3RlckFsdFZpc3VhbGl6ZXJTZWxlY3RvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbHRWaXN1YWxpemVyU2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIFZpc3VhbGl6YXRpb25NYW5hZ2VyLmFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIgfHwgVmlzdWFsaXplckJhc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBhbHRlcm5hdGl2ZSB2aXN1YWxpemVyIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjb25zdHJ1Y3RvciBmb3IgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3IoY29uc3RydWN0b3I6IGFueSkge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLmFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIgPSBjb25zdHJ1Y3RvcjtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgSXRlbVZhbHVlLFxuICBIZWxwZXJzLFxuICBRdWVzdGlvblNlbGVjdEJhc2UsXG59IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93biBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhEcm9wZG93blwiKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuZGlzYWJsZUxvY2FsZVN3aXRjaCA9IHRydWU7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmRhdGFQcm92aWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc1ZhbHVlcyA9IHF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnZhbHVlKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzTGFiZWxzID0gcXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiByb3cudGV4dCk7XG5cbiAgICBjb25zdCBpbm5lclF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zKCk7XG4gICAgY29uc3QgY2FuR3JvdXBDb2x1bW5zID0gdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc1ZhbHVlcy5sZW5ndGggPT0gMSAmJiBpbm5lclF1ZXN0aW9ucy5ldmVyeShpbm5lclF1ZXN0aW9uID0+IEhlbHBlcnMuaXNBcnJheXNFcXVhbChpbm5lclF1ZXN0aW9uLmNob2ljZXMsICg8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb24pLmNob2ljZXMpKTtcbiAgICBpZiAoY2FuR3JvdXBDb2x1bW5zKSB7XG4gICAgICB2YXIgY3JlYXRvcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRWaXN1YWxpemVyc0J5VHlwZShcIm1hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIik7XG4gICAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIgPSBuZXcgY3JlYXRvcnNbMF0odGhpcy5xdWVzdGlvbiwgW10sIHRoaXMuX2NoaWxkT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemF0aW9uUGFuZWwoaW5uZXJRdWVzdGlvbnMsIFtdLCB0aGlzLl9jaGlsZE9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5hZGQodGhpcy5vblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNMYWJlbHMgPSB0aGlzLnF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnRleHQpO1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hdHJpeERyb3Bkb3duVmlzdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCkge1xuICAgIGxldCBwYW5lbERhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgoZGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCByYXdEYXRhSXRlbSA9IGRhdGFJdGVtW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICBpZiAoISFyYXdEYXRhSXRlbSkge1xuICAgICAgICBPYmplY3Qua2V5cyhyYXdEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgdmFyIG5lc3RlZERhdGFJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3RGF0YUl0ZW1ba2V5XSk7XG4gICAgICAgICAgbmVzdGVkRGF0YUl0ZW1bRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gPSBrZXk7XG4gICAgICAgICAgcGFuZWxEYXRhLnB1c2gobmVzdGVkRGF0YUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIudXBkYXRlRGF0YShwYW5lbERhdGEpO1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpO1xuICAgIHN1cGVyLm9uRGF0YUNoYW5nZWQoKTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucygpIHtcbiAgICBjb25zdCBtYXRyaXhkcm9wZG93bjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsID0gPGFueT50aGlzLnF1ZXN0aW9uO1xuICAgIHJldHVybiBtYXRyaXhkcm9wZG93bi5jb2x1bW5zLm1hcChcbiAgICAgIChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGxRdWVzdGlvbjogYW55ID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGxRdWVzdGlvbi5jaG9pY2VzKSAmJiBjZWxsUXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjZWxsUXVlc3Rpb24uY2hvaWNlcyA9IG1hdHJpeGRyb3Bkb3duLmNob2ljZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlbGxRdWVzdGlvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5jbGVhcigpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIucmVuZGVyKGNvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcIm1hdHJpeGRyb3Bkb3duXCIsXG4gIFZpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93blxuKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWF0cml4RHluYW1pYyBleHRlbmRzIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0XG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJtYXRyaXhEeW5hbWljXCI7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKSB7XG4gICAgY29uc3QgbWF0cml4ZHluYW1pYzogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsID0gPGFueT50aGlzLnF1ZXN0aW9uO1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gbWF0cml4ZHluYW1pYy52aXNpYmxlUm93cztcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIHJldHVybiB2aXNpYmxlUm93c1swXS5jZWxscy5tYXAoYyA9PiBjLnF1ZXN0aW9uKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwibWF0cml4ZHluYW1pY1wiLFxuICBWaXN1YWxpemF0aW9uTWF0cml4RHluYW1pY1xuKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IEV2ZW50LCBRdWVzdGlvbiwgU3VydmV5TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCAqIGFzIFN1cnZleUNvcmUgZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlLCBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciB9IGZyb20gXCIuL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciwgY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LCBJU3RhdGUsIElQZXJtaXNzaW9uIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBGaWx0ZXJJbmZvIH0gZnJvbSBcIi4vZmlsdGVySW5mb1wiO1xuaW1wb3J0IHsgTGF5b3V0RW5naW5lLCBNdXVyaUxheW91dEVuZ2luZSB9IGZyb20gXCIuL2xheW91dEVuZ2luZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemF0aW9uUGFuZWwuc2Nzc1wiKTtcblxuY29uc3QgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvblwiO1xuY29uc3QgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uLWxheW91dGVkXCI7XG5cbmlmICghIWRvY3VtZW50KSB7XG4gIGNvbnN0IHN2Z1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zdmdidW5kbGUuaHRtbFwiKTtcbiAgY29uc3QgdGVtcGxhdGVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wbGF0ZUhvbGRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRlbXBsYXRlSG9sZGVyLmlubmVySFRNTCA9IHN2Z1RlbXBsYXRlO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlSG9sZGVyKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50XG4gIGV4dGVuZHMgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQge1xuICByZW5kZXJlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uIFBhbmVsIGNvbmZpZ3VyYXRpb24uIFBhc3MgaXQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwic3VydmV5LWFuYWx5dGljc1wiO1xuICpcbiAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAqICAgc3VydmV5UXVlc3Rpb25zLFxuICogICBzdXJ2ZXlSZXN1bHRzLFxuICogICB2aXpQYW5lbE9wdGlvbnNcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyB7XG4gIC8vIEFuIG9iamVjdCBuYW1lZCBhZnRlciBhIHF1ZXN0aW9uIHRoYXQgaXQgY29uZmlndXJlcy5cbiAgLy8gcXVlc3Rpb25OYW1lOiB7XG4gIC8vICAgaW50ZXJ2YWxzOiBbXVxuICAvLyB9LFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGxhYmVsIGNoYXJhY3RlcnMgYWZ0ZXIgd2hpY2ggdHJ1bmNhdGlvbiBzdGFydHMuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIC0xIHRvIGRpc2FibGUgdHJ1bmNhdGlvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMjdcbiAgICovXG4gIGxhYmVsVHJ1bmNhdGVMZW5ndGg/OiBudW1iZXI7XG5cbiAgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgc2VyaWVzVmFsdWVzPzogc3RyaW5nW107XG4gIHNlcmllc0xhYmVscz86IHN0cmluZ1tdO1xuICB1c2VWYWx1ZXNBc0xhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhc3MgYSBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIHN1cnZleSBsb2NhbGVzIGluIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKi9cbiAgc3VydmV5PzogU3VydmV5TW9kZWw7XG4gIC8qKlxuICAgKiBBIGNvbW1vbiBkYXRhIHByb3ZpZGVyIGZvciBhbGwgdmlzdWFsaXplcnMuXG4gICAqL1xuICBkYXRhUHJvdmlkZXI/OiBEYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGluZGl2aWR1YWwgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93SGlkZVF1ZXN0aW9ucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIGNoYXJ0cyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGRpc2FibGVkLCBjaGFydHMgYXJlIGRpc3BsYXllZCBvbmUgdW5kZXIgYW5vdGhlciwgYW5kIHVzZXJzIGNhbm5vdCBkcmFnIGFuZCBkcm9wIHRoZW0uIElmIHlvdSB3YW50IHRvIGRpc2FibGUgb25seSBkcmFnIGFuZCBkcm9wLCBzZXQgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9jdXN0b20tbGF5b3V0LyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBsYXlvdXRFbmdpbmVcbiAgICovXG4gIGFsbG93RHluYW1pY0xheW91dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB1c2VycyBjYW4gZHJhZyBhbmQgZHJvcCBjaGFydHMuIEFwcGxpZXMgb25seSBpZiBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIGlzIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqIEBzZWUgbGF5b3V0RW5naW5lXG4gICAqL1xuICBhbGxvd0RyYWdEcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgbGF5b3V0IGVuZ2luZSB1c2VkIHRvIGFycmFuZ2UgY2hhcnRzIG9uIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGludGVncmF0ZSBhIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmUgd2l0aCBTdXJ2ZXlKUyBEYXNoYm9hcmQuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dEeW5hbWljTGF5b3V0XG4gICAqL1xuICBsYXlvdXRFbmdpbmU/OiBMYXlvdXRFbmdpbmU7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgYW5kIHBlcmNlbnRhZ2UgdmFsdWVzIGluIGJhciBjaGFydHMuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNob3cgUGVyY2VudGFnZXMgYnV0dG9uIHRvIGVhY2ggYmFyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIGFsbG93U2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBwZXJjZW50YWdlcyBpbiBhZGRpdGlvbiB0byBhYnNvbHV0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgc2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBvbmx5IHBlcmNlbnRhZ2VzLCB3aXRob3V0IGFic29sdXRlIHZhbHVlcy5cbiAgICpcbiAgICogQXBwbGllcyBvbmx5IGlmIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIG9yIGBzaG93UGVyY2VudGFnZXNgIHByb3BlcnR5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIHNob3dPbmx5UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHBlcmNlbnRhZ2UgcHJlY2lzaW9uLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiAwXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqL1xuICBwZXJjZW50YWdlUHJlY2lzaW9uPzogbnVtYmVyO1xuICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNvcnQgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuIEFwcGxpZXMgb25seSB0byBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTb3J0aW5nIGRyb3Bkb3duIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogQHNlZSBhbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gc29ydCBhbnN3ZXJzIGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczpcbiAgICpcbiAgICogLSBgXCJkZWZhdWx0XCJgIChkZWZhdWx0KSAtIERvIG5vdCBzb3J0IGFuc3dlcnMuXG4gICAqIC0gYFwiYXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGFzY2VuZGluZyBhbnN3ZXIgY291bnQuXG4gICAqIC0gYFwiZGVzY1wiYCAtIFNvcnQgYW5zd2VycyBieSBkZXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFuc3dlcnNPcmRlcj86IFwiZGVmYXVsdFwiIHwgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGhpZGUgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBFbXB0eSBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGJhciBhbmQgc2NhdHRlciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhpZGVzIGFuc3dlcnMgd2l0aCB6ZXJvIGNvdW50IGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93SGlkZUVtcHR5QW5zd2Vyc1xuICAgKi9cbiAgaGlkZUVtcHR5QW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoZXRoZXIgdG8gc2hvdyB0b3AgNSwgMTAsIG9yIDIwIGFuc3dlcnMgYnkgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUb3AgTiBBbnN3ZXJzIGRyb3Bkb3duIHRvIGVhY2ggY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VG9wTkFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNob3cgdGhlIG51bWJlciBvZiByZXNwb25kZW50cyB3aG8gZGlkIG5vdCBhbnN3ZXIgYSBwYXJ0aWN1bGFyIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IE1pc3NpbmcgQW5zd2VycyBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnM/OiBib29sZWFuO1xuXG4gIGFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBjaGFydCB0eXBlLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBxdWVzdGlvbiB0eXBlIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIC0gQm9vbGVhbjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImBcbiAgICogLSBEYXRlLCBOdW1iZXI6IGBcImJhclwiYCB8IGBcInNjYXR0ZXJcImBcbiAgICogLSBNYXRyaXg6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic3RhY2tlZGJhclwiYFxuICAgKiAtIFJhdGluZzogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYCB8IGBcImdhdWdlXCJgIHwgYFwiYnVsbGV0XCJgXG4gICAqIC0gUmFkaW9ncm91cCwgQ2hlY2tib3gsIERyb3Bkb3duLCBJbWFnZSBQaWNrZXI6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic2NhdHRlclwiYFxuICAgKlxuICAgKiBUbyBzZXQgYSB0eXBlIGZvciBhbiBpbmRpdmlkdWFsIGNoYXJ0LCBhY2Nlc3MgdGhpcyBjaGFydCBpbiB0aGUgYHZpc3VhbGl6ZXJzYCBhcnJheSBhbmQgc2V0IGl0cyBgY2hhcnRUeXBlYCBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIHZhbHVlcyBkZXNjcmliZWQgYWJvdmU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoIC4uLiApO1xuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5jaGFydFR5cGUgPSBcInN0YWNrZWRiYXJcIjtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBkZWZhdWx0Q2hhcnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHRyYW5zcG9zZSBhIHZpc3VhbGl6ZWQgbWF0cml4IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUcmFuc3Bvc2UgYnV0dG9uIHRvIGNoYXJ0cyB0aGF0IHZpc3VhbGl6ZSBtYXRyaXhlcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIFZhbHVlcywgbWF0cml4IHJvd3MgZ28gdG8gY2hhcnQgYXJndW1lbnRzIGFuZCBtYXRyaXggY29sdW1ucyBmb3JtIGNoYXJ0IHNlcmllcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIENvbHVtbnMsIG1hdHJpeCByb3dzIGZvcm0gY2hhcnQgc2VyaWVzIGFuZCBtYXRyaXggY29sdW1ucyBnbyB0byBjaGFydCBhcmd1bWVudHMuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VHJhbnNwb3NlRGF0YT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY3Jvc3MtZmlsdGVyIGNoYXJ0cy4gVGhlIGZpbHRlciBhcHBsaWVzIHdoZW4gdXNlcnMgc2VsZWN0IGEgc2VyaWVzIHBvaW50LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbjtcblxuICByZW5kZXJDb250ZW50PzogRnVuY3Rpb247XG4gIGRlc3Ryb3lDb250ZW50PzogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgSFRNTCB0YWdzIGZyb20gc3VydmV5IGVsZW1lbnQgdGl0bGVzLlxuICAgKlxuICAgKiBTdXJ2ZXkgZWxlbWVudCB0aXRsZXMgY2FuIGNvbnRhaW4gSFRNTCBtYXJrdXAgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdXNlcnMuIEFuIGF0dGFja2VyIGNhbiBpbmplY3QgbWFsaWNpb3VzIGNvZGUgaW50byB0aGUgdGl0bGVzLiBUbyBndWFyZCBhZ2FpbnN0IGl0LCBrZWVwIHRoaXMgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBzdHJpcEh0bWxGcm9tVGl0bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB2aXN1YWxpemVzIHN1cnZleSByZXN1bHRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gYW5hbHl6ZSB0aGVtLlxuICpcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnM6XG4gKlxuICogLSBgcXVlc3Rpb25zYDogQXJyYXlcXDxbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcPlxcXG4gKiBTdXJ2ZXkgcXVlc3Rpb25zIHRvIHZpc3VhbGl6ZS4gQ2FsbCBgU3VydmV5TW9kZWxgJ3MgW2BnZXRBbGxRdWVzdGlvbnMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbCNnZXRRdWVzdGlvbkJ5TmFtZSkgbWV0aG9kIHRvIGFjY2VzcyBhbGwgc3VydmV5IHF1ZXN0aW9ucyBhbmQgcGFzcyBpdHMgcmVzdWx0IGFzIHRoZSBgcXVlc3Rpb25zYCBwYXJhbWV0ZXIuXG4gKiAtIGBkYXRhYDogYEFycmF5PGFueT5gXFxcbiAqIFN1cnZleSByZXN1bHRzLlxuICogLSBgb3B0aW9uc2A6IFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpXFxcbiAqIFZpc3VhbGl6YXRpb24gUGFuZWwgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9pbnRlcmFjdGl2ZS1zdXJ2ZXktZGF0YS1kYXNoYm9hcmQvIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwdWJsaWMgc3RhdGljIGhhdmVDb21tZXJjaWFsTGljZW5zZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmlzdWFsaXplcnM6IEFycmF5PFZpc3VhbGl6ZXJCYXNlPiA9IFtdO1xuICBwcml2YXRlIGhhdmVDb21tZXJjaWFsTGljZW5zZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlbmRlcmVkUXVlc3Rpb25zQ291bnQ6IG51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBxdWVzdGlvbnM6IEFycmF5PGFueT4sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyA9IHt9LFxuICAgIHByaXZhdGUgX2VsZW1lbnRzOiBBcnJheTxJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50PiA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihudWxsLCBkYXRhLCBvcHRpb25zLCBcInBhbmVsXCIpO1xuXG4gICAgdGhpcy5fbGF5b3V0RW5naW5lID1cbiAgICAgIG9wdGlvbnMubGF5b3V0RW5naW5lIHx8XG4gICAgICBuZXcgTXV1cmlMYXlvdXRFbmdpbmUoXG4gICAgICAgIHRoaXMuYWxsb3dEeW5hbWljTGF5b3V0LFxuICAgICAgICBcIi5cIiArIHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lLFxuICAgICAgICB0aGlzLmFsbG93RHJhZ0Ryb3BcbiAgICAgICk7XG4gICAgdGhpcy5fbGF5b3V0RW5naW5lLm9uTW92ZUNhbGxiYWNrID0gKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+XG4gICAgICB0aGlzLm1vdmVWaXNpYmxlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXJ2ZXkpIHtcbiAgICAgIGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdGhpcy5vcHRpb25zLnN1cnZleS5sb2NhbGU7XG4gICAgfVxuXG4gICAgaWYgKF9lbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lbGVtZW50cyA9IHRoaXMuYnVpbGRFbGVtZW50cyhxdWVzdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBmID0gKDxhbnk+U3VydmV5Q29yZSkuaGFzTGljZW5zZTtcbiAgICB0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSA9ICghIWYgJiYgZig0KSkgfHxcbiAgICAgIFZpc3VhbGl6YXRpb25QYW5lbC5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgfHxcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZVxuICAgICAgICA6IGZhbHNlKTtcblxuICAgIHRoaXMuYnVpbGRWaXN1YWxpemVycyhxdWVzdGlvbnMpO1xuICAgIGlmICghdGhpcy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNvbW1lcmNpYWxMaWNlbnNlXCIsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluaygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwicmVzZXRGaWx0ZXJcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgICAgIGlmICh2aXN1YWxpemVyIGluc3RhbmNlb2YgU2VsZWN0QmFzZSB8fCB2aXN1YWxpemVyIGluc3RhbmNlb2YgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIpIHtcbiAgICAgICAgICAgIHZpc3VhbGl6ZXIuc2V0U2VsZWN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXNldEZpbHRlclwiKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJhZGRFbGVtZW50XCIsICh0b29sYmFyOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWxsb3dIaWRlUXVlc3Rpb25zKSB7XG4gICAgICAgIGxldCBhZGRFbGVtZW50U2VsZWN0b3I6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyID0gKFxuICAgICAgICAgIHBhbmVsOiBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgICAgICAgb3B0aW9uczogYW55XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhpZGRlbkVsZW1lbnRzID0gdGhpcy5oaWRkZW5FbGVtZW50cztcbiAgICAgICAgICBpZiAoaGlkZGVuRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgPGFueT57XG4gICAgICAgICAgICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFkZEVsZW1lbnRcIiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaGlkZGVuRWxlbWVudHMpXG4gICAgICAgICAgICAgICAgLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZWxlbWVudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIChvcHRpb246IGFueSkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIChhZGRFbGVtZW50U2VsZWN0b3IgJiZcbiAgICAgICAgICAgICAgdG9vbGJhci5yZXBsYWNlQ2hpbGQoc2VsZWN0V3JhcHBlciwgYWRkRWxlbWVudFNlbGVjdG9yKSkgfHxcbiAgICAgICAgICAgICAgdG9vbGJhci5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcbiAgICAgICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvciA9IHNlbGVjdFdyYXBwZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvciAmJiB0b29sYmFyLnJlbW92ZUNoaWxkKGFkZEVsZW1lbnRTZWxlY3Rvcik7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyKHRoaXMsIHt9KTtcbiAgICAgICAgdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuYWRkKGFkZEVsZW1lbnRTZWxlY3RvclVwZGF0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlTG9jYWxlU3dpdGNoICYmIHRoaXMubG9jYWxlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBsb2NhbGVDaG9pY2VzID0gdGhpcy5sb2NhbGVzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBlbGVtZW50LFxuICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoZWxlbWVudClcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8gbG9jYWxlQ2hvaWNlcy51bnNoaWZ0KHtcbiAgICAgIC8vICAgdmFsdWU6IFwiXCIsXG4gICAgICAvLyAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaGFuZ2VMb2NhbGVcIiksXG4gICAgICAvLyB9KTtcbiAgICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUxvY2FsZVwiLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3Rvcihsb2NhbGVDaG9pY2VzLFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gISFvcHRpb24udmFsdWUgJiYgdGhpcy5sb2NhbGUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3TG9jYWxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrID0gKFxuICAgIHNlbmRlcjogVmlzdWFsaXplckJhc2UsXG4gICAgb3B0aW9uczogYW55XG4gICkgPT4ge1xuICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCsrO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkUXVlc3Rpb25zQ291bnQgPT0gdGhpcy5xdWVzdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25zQ291bnQgPSAwO1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBhIHVzZXIgc2VsZWN0cyBhIGRpZmZlcmVudCB2aXN1YWxpemVyIHR5cGUgZnJvbSB0aGUgVHlwZSBkcm9wLWRvd24gbWVudS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogYEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyYFxcXG4gICAqIEFuIG9iamVjdCB0aGF0IGNvbnRyb2xzIGFsdGVuYXRpdmUgdmlzdWFsaXplcnMuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMudmlzdWFsaXplcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBbiBhcHBsaWVkIHZpc3VhbGl6ZXIuXG4gICAqKi9cbiAgcHVibGljIG9uQWx0ZXJuYXRpdmVWaXN1YWxpemVyQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSwgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIGFueT4oKTtcblxuICBwcml2YXRlIG9uQWx0ZXJuYXRpdmVWaXN1YWxpemVyQ2hhbmdlZENhbGxiYWNrID0gKFxuICAgIHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsXG4gICAgb3B0aW9uczogeyB2aXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSB9XG4gICkgPT4ge1xuICAgIHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkLmZpcmUoc2VuZGVyLCBvcHRpb25zKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQsIGVsZW1lbnRJbmRleCA9IC0xKTogdm9pZCB7XG4gICAgZWxlbWVudC5pc1Zpc2libGUgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXN0aW9uRWxlbWVudCA9IHRoaXMucmVuZGVyUGFuZWxFbGVtZW50KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lclxuICAgICk7XG4gICAgbGV0IG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgaWYoZWxlbWVudEluZGV4ID49IDApIHtcbiAgICAgIG9wdGlvbnMgPSB7IGluZGV4OiBlbGVtZW50SW5kZXggfTtcbiAgICB9XG4gICAgdGhpcy5sYXlvdXRFbmdpbmUuYWRkKFtxdWVzdGlvbkVsZW1lbnRdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93RWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgY29uc3QgZWxlbWVudEluZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgICB0aGlzLnNob3dFbGVtZW50Q29yZShlbGVtZW50LCBlbGVtZW50SW5kZXgpO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50LCBcIkFEREVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbGVtZW50Q29yZShlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50KSB7XG4gICAgZWxlbWVudC5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpZiAoISFlbGVtZW50LnJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5sYXlvdXRFbmdpbmUucmVtb3ZlKFtlbGVtZW50LnJlbmRlcmVkRWxlbWVudF0pO1xuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyLnJlbW92ZUNoaWxkKGVsZW1lbnQucmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlRWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgdGhpcy5oaWRlRWxlbWVudENvcmUoZWxlbWVudCk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnQsIFwiUkVNT1ZFRFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBhbGwgcGFuZWwgZWxlbWVudHMuIFVzZXJzIGNhbiBzZWxlY3QgdGhlIGVsZW1lbnRzIHRoZXkgd2FudCB0byBzaG93IGZyb20gYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBzaG93QWxsRWxlbWVudHNcbiAgICogQHNlZSBhbGxvd0hpZGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBoaWRlQWxsRWxlbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWZmZWN0ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZihlbGVtZW50LmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmhpZGVFbGVtZW50Q29yZShlbGVtZW50KTtcbiAgICAgICAgYWZmZWN0ZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZCh1bmRlZmluZWQsIFwiUkVNT1ZFREFMTFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbGwgcGFuZWwgZWxlbWVudHMgaWYgdGhleSBhcmUgaGlkZGVuIHRvIGEgZHJvcC1kb3duIG1lbnUuXG4gICAqIEBzZWUgaGlkZUFsbEVsZW1lbnRzXG4gICAqIEBzZWUgYWxsb3dIaWRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgc2hvd0FsbEVsZW1lbnRzKCkge1xuICAgIGNvbnN0IGFmZmVjdGVkRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLl9lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYoIWVsZW1lbnQuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQpO1xuICAgICAgICBhZmZlY3RlZEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKHVuZGVmaW5lZCwgXCJBRERFRERBTExcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSB7XG4gICAgZWxlbWVudC5pc1B1YmxpYyA9IGZhbHNlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlRWxlbWVudFB1YmxpYyhlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkge1xuICAgIGVsZW1lbnQuaXNQdWJsaWMgPSB0cnVlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb3ZlVmlzaWJsZUVsZW1lbnQoXG4gICAgZnJvbVZpc2libGVJbmRleDogbnVtYmVyLFxuICAgIHRvVmlzaWJsZUluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IGZyb21JbmRleCwgdG9JbmRleDtcblxuICAgIGxldCBmcm9tVmlzaWJsZUluZGV4RWxlbWVudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzW2Zyb21WaXNpYmxlSW5kZXhdO1xuICAgIGxldCB0b1Zpc2libGVJbmRleEVsZW1lbnQgPSB0aGlzLnZpc2libGVFbGVtZW50c1t0b1Zpc2libGVJbmRleF07XG5cbiAgICBmcm9tSW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGZyb21WaXNpYmxlSW5kZXhFbGVtZW50KTtcbiAgICB0b0luZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZih0b1Zpc2libGVJbmRleEVsZW1lbnQpO1xuXG4gICAgdGhpcy5tb3ZlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVFbGVtZW50KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLl9lbGVtZW50cy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICB0aGlzLl9lbGVtZW50cy5zcGxpY2UodG9JbmRleCwgMCwgZWxlbWVudHNbMF0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50c1swXSwgXCJNT1ZFRFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godmlzdWFsaXplciA9PiB2aXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWaXN1YWxpemVycyhxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPikge1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuY3JlYXRlVmlzdWFsaXplcihxdWVzdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJyZW1vdmVRdWVzdGlvblwiLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUVsZW1lbnQocXVlc3Rpb24ubmFtZSksIDApO1xuICAgICAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlQnV0dG9uXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUpIHtcbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwibWFrZVByaXZhdGVQdWJsaWNcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGVsZW1lbnQuaXNQdWJsaWMgPyBcImZpcnN0XCIgOiBcInNlY29uZFwiO1xuXG4gICAgICAgICAgY29uc3QgcGF0aE1ha2VQcml2YXRlU3ZnID0gXCJtYWtlcHJpdmF0ZVwiO1xuICAgICAgICAgIGNvbnN0IHBhdGhNYWtlUHVibGljU3ZnID0gXCJtYWtlcHVibGljXCI7XG4gICAgICAgICAgY29uc3QgbWFrZVByaXZhdGVUaXRsZSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYWtlUHJpdmF0ZUJ1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBtYWtlUHVibGljVGl0bGUgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWFrZVB1YmxpY0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBkb1ByaXZhdGUgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRvUHVibGljID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm1ha2VFbGVtZW50UHVibGljKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcbiAgICAgICAgICAgIHBhdGhNYWtlUHVibGljU3ZnLFxuICAgICAgICAgICAgcGF0aE1ha2VQcml2YXRlU3ZnLFxuICAgICAgICAgICAgbWFrZVByaXZhdGVUaXRsZSxcbiAgICAgICAgICAgIG1ha2VQdWJsaWNUaXRsZSxcbiAgICAgICAgICAgIGRvUHVibGljLFxuICAgICAgICAgICAgZG9Qcml2YXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpc3VhbGl6ZXIuc3VwcG9ydFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCB2aXN1YWxpemVyV2l0aFNlbGVjdGlvbiA9IDxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+KFxuICAgICAgICAgICg8YW55PnZpc3VhbGl6ZXIpXG4gICAgICAgICk7XG4gICAgICAgIGxldCBmaWx0ZXJJbmZvID0gbmV3IEZpbHRlckluZm8odmlzdWFsaXplcldpdGhTZWxlY3Rpb24pO1xuXG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcInF1ZXN0aW9uRmlsdGVySW5mb1wiLCAoKSA9PiB7XG4gICAgICAgICAgZmlsdGVySW5mby51cGRhdGUodmlzdWFsaXplcldpdGhTZWxlY3Rpb24uc2VsZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZmlsdGVySW5mby5odG1sRWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlzdWFsaXplcldpdGhTZWxlY3Rpb24ub25EYXRhSXRlbVNlbGVjdGVkID0gKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWU6IGFueSxcbiAgICAgICAgICBzZWxlY3RlZFRleHQ6IHN0cmluZ1xuICAgICAgICApID0+IHtcbiAgICAgICAgICBmaWx0ZXJJbmZvLnVwZGF0ZSh7IHZhbHVlOiBzZWxlY3RlZFZhbHVlLCB0ZXh0OiBzZWxlY3RlZFRleHQgfSk7XG4gICAgICAgICAgdGhpcy5zZXRGaWx0ZXIocXVlc3Rpb24ubmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmxheW91dCgpO1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKTtcblxuICAgICAgaWYgKHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcikge1xuICAgICAgICB2aXN1YWxpemVyLm9uVmlzdWFsaXplckNoYW5nZWQuYWRkKHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpc3VhbGl6ZXJzLnB1c2godmlzdWFsaXplcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaXN1YWxpemVycygpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UpIHtcbiAgICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIub25WaXN1YWxpemVyQ2hhbmdlZC5yZW1vdmUodGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICB2aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVycyA9IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgICh0aGlzLnF1ZXN0aW9ucyB8fCBbXSkuZm9yRWFjaCgocXVlc3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG4gICAgICBpZiAoISFlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZGlzcGxheU5hbWUgPSB0aGlzLnByb2Nlc3NUZXh0KHF1ZXN0aW9uLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godiA9PiB7XG4gICAgICB2Lm9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5vcHRpb25zLnNlcmllc0xhYmVscztcbiAgICAgIHYubG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIH0pO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBbYElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93RHluYW1pY0xheW91dCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93RHJhZ0Ryb3BgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dEcmFnRHJvcCkgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dEcmFnRHJvcCgpIHtcbiAgICBpZihTdXJ2ZXlDb3JlLklzVG91Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0RyYWdEcm9wID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0RyYWdEcm9wID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93SGlkZVF1ZXN0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBbYElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93SGlkZVF1ZXN0aW9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93SGlkZVF1ZXN0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dIaWRlUXVlc3Rpb25zID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUgPT09IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9sYXlvdXRFbmdpbmU6IExheW91dEVuZ2luZTtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBbYExheW91dEVuZ2luZWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9sYXlvdXRlbmdpbmUpIGluc3RhbmNlIHVzZWQgdG8gYXJyYW5nZSB2aXN1YWxpemF0aW9uIGl0ZW1zIG9uIGBWaXN1YWxpemF0aW9uUGFuZWxgLlxuICAgKi9cbiAgcHVibGljIGdldCBsYXlvdXRFbmdpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEVsZW1lbnRzKHF1ZXN0aW9uczogYW55W10pOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudFtdIHtcbiAgICByZXR1cm4gKHF1ZXN0aW9ucyB8fCBbXSkubWFwKChxdWVzdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMucHJvY2Vzc1RleHQocXVlc3Rpb24udGl0bGUpLFxuICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgIGlzUHVibGljOiB0cnVlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lcyBRdWVzdGlvbiBbbmFtZXNdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS4gRG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIgdG8gZ2V0IGFuIGFycmF5IG9mIGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKiBAc2VlIHZpc2libGVFbGVtZW50c1xuICAgKiBAc2VlIGhpZGRlbkVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudHMocXVlc3Rpb25OYW1lcz86IEFycmF5PHN0cmluZz4pOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudFtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAodGhpcy5fZWxlbWVudHMgfHwgW10pLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmKCFxdWVzdGlvbk5hbWVzIHx8IHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlbGVtZW50Lm5hbWUpICE9PSAtMSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBlbGVtZW50LmRpc3BsYXlOYW1lLFxuICAgICAgICAgIGlzVmlzaWJsZTogZWxlbWVudC5pc1Zpc2libGUsXG4gICAgICAgICAgaXNQdWJsaWM6IGVsZW1lbnQuaXNQdWJsaWMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KSBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudGx5IHZpc2libGUgdmlzdWFsaXphdGlvbiBpdGVtcy5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gZGlzYWxsb3cgdXNlcnMgdG8gaGlkZSB2aXN1YWxpemF0aW9uIGl0ZW1zLCBzZXQgdGhlIFtgYWxsb3dIaWRlUXVlc3Rpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykgcHJvcGVydHkgdG8gYGZhbHNlYC5cbiAgICogQHNlZSBoaWRkZW5FbGVtZW50c1xuICAgKiBAc2VlIGdldEVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzVmlzaWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KSBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudGx5IGhpZGRlbiB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB1c2VycyB0byBoaWRlIHZpc3VhbGl6YXRpb24gaXRlbXMsIHNldCB0aGUgW2BhbGxvd0hpZGVRdWVzdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKSBwcm9wZXJ0eSB0byBgZmFsc2VgLlxuICAgKiBAc2VlIHZpc2libGVFbGVtZW50c1xuICAgKiBAc2VlIGdldEVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGRlbkVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoXG4gICAgICAoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiAhZWwuaXNWaXNpYmxlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHVibGljRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiBlbC5pc1B1YmxpYyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByaXZhdGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+ICFlbC5pc1B1YmxpYyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGxvY2FsZXMoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXJ2ZXkpIHJldHVybiB0aGlzLm9wdGlvbnMuc3VydmV5LmdldFVzZWRMb2NhbGVzKCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2aXN1YWxpemF0aW9uIGl0ZW0gd2l0aCBhIHNwZWNpZmllZCBxdWVzdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBBIHF1ZXN0aW9uIFtuYW1lXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jbmFtZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChxdWVzdGlvbk5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsKSA9PiBlbC5uYW1lID09PSBxdWVzdGlvbk5hbWUpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBbdmlzdWFsaXplcl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlKSB0aGF0IHZpc3VhbGl6ZXMgYSBzcGVjaWZpZWQgc3VydmV5IHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICovXG4gIHB1YmxpYyBnZXRWaXN1YWxpemVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnF1ZXN0aW9uLm5hbWUgPT09IHF1ZXN0aW9uTmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYG9uRWxlbWVudFNob3duYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRTaG93biksIFtgb25FbGVtZW50SGlkZGVuYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRIaWRkZW4pLCBvciBbYG9uRWxlbWVudE1vdmVkYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRNb3ZlZCkgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVFbGVtZW50c0NoYW5nZWQgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW3Nob3cgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIHNob3duLlxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudFNob3duID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIHVzZXJzIFtoaWRlIGEgdmlzdWFsaXphdGlvbiBpdGVtXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKVxcXG4gICAqIEEgYFZpc3VhbGl6YXRpb25QYW5lbGAgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRzYDogQXJyYXlcXDxbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcPlxcXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zIHJlbmRlcmVkIGJ5IHRoaXMgYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudGA6IFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFxcbiAgICogQSB2aXN1YWxpemF0aW9uIGl0ZW0gdGhhdCBoYXMgYmVlbiBoaWRkZW4uXG4gICAqL1xuICBwdWJsaWMgb25FbGVtZW50SGlkZGVuID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIHVzZXJzIFttb3ZlIGEgdmlzdWFsaXphdGlvbiBpdGVtXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dEeW5hbWljTGF5b3V0KS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKVxcXG4gICAqIEEgYFZpc3VhbGl6YXRpb25QYW5lbGAgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRzYDogQXJyYXlcXDxbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcPlxcXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zIHJlbmRlcmVkIGJ5IHRoaXMgYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudGA6IFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFxcbiAgICogQSB2aXN1YWxpemF0aW9uIGl0ZW0gdGhhdCBoYXMgYmVlbiBtb3ZlZC5cbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRNb3ZlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgYW55XG4gID4oKTtcblxuICBwcm90ZWN0ZWQgdmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChcbiAgICBlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCxcbiAgICByZWFzb246IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAocmVhc29uID09PSBcIlNIT1dOXCIgJiYgIXRoaXMub25FbGVtZW50U2hvd24uaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRTaG93bi5maXJlKHRoaXMsIHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJlYXNvbiA9PT0gXCJSRU1PVkVEXCIgJiYgIXRoaXMub25FbGVtZW50SGlkZGVuLmlzRW1wdHkpIHtcbiAgICAgIHRoaXMub25FbGVtZW50SGlkZGVuLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocmVhc29uID09PSBcIk1PVkVEXCIgJiYgIXRoaXMub25FbGVtZW50TW92ZWQuaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRNb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmlzRW1wdHkpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGNoYW5nZWQ6IGVsZW1lbnQsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgc3RhdGU6IElTdGF0ZSkgPT4gYW55LFxuICAgIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHB1YmxpYyBvblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrOiBhbnk7XG5cbiAgcHJvdGVjdGVkIHJlbmRlclBhbmVsRWxlbWVudChcbiAgICBlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50LFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgKSB7XG4gICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50Lm5hbWUpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICEhY29udGFpbmVyICYmIGNvbnRhaW5lci5hcHBlbmRDaGlsZChxdWVzdGlvbkVsZW1lbnQpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25Db250ZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiaDNcIik7XG4gICAgY29uc3Qgdml6dWFsaXplckVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgdGl0bGVFbGVtZW50LmlubmVyVGV4dCA9IGVsZW1lbnQuZGlzcGxheU5hbWU7XG5cbiAgICBxdWVzdGlvbkVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5hbGxvd0R5bmFtaWNMYXlvdXRcbiAgICAgID8gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCIgXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZVxuICAgICAgOiBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWU7XG4gICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArIFwiX190aXRsZVwiO1xuICAgIGlmICh0aGlzLmFsbG93RHluYW1pY0xheW91dCAmJiB0aGlzLmFsbG93RHJhZ0Ryb3ApIHtcbiAgICAgIHRpdGxlRWxlbWVudC5jbGFzc05hbWUgPVxuICAgICAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lICtcbiAgICAgICAgXCIgXCIgK1xuICAgICAgICBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgK1xuICAgICAgICBcIl9fdGl0bGUtLWRyYWdnYWJsZVwiO1xuICAgIH1cbiAgICBxdWVzdGlvbkNvbnRlbnQuY2xhc3NOYW1lID0gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCJfX2NvbnRlbnRcIjtcbiAgICBxdWVzdGlvbkNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICBxdWVzdGlvbkNvbnRlbnQuYXBwZW5kQ2hpbGQodGl0bGVFbGVtZW50KTtcbiAgICBxdWVzdGlvbkNvbnRlbnQuYXBwZW5kQ2hpbGQodml6dWFsaXplckVsZW1lbnQpO1xuICAgIHF1ZXN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChxdWVzdGlvbkNvbnRlbnQpO1xuXG4gICAgdmlzdWFsaXplci5yZW5kZXIodml6dWFsaXplckVsZW1lbnQpO1xuXG4gICAgZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQgPSBxdWVzdGlvbkVsZW1lbnQ7XG4gICAgcmV0dXJuIHF1ZXN0aW9uRWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lICs9IFwiIHNhLXBhbmVsX19oZWFkZXJcIjtcbiAgICBzdXBlci5yZW5kZXJUb29sYmFyKGNvbnRhaW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSBcIiBzYS1wYW5lbF9fY29udGVudCBzYS1ncmlkXCI7XG5cbiAgICB0aGlzLnZpc2libGVFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoZWxlbWVudCwgY29udGFpbmVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RW5naW5lLnN0YXJ0KGNvbnRhaW5lcik7XG4gICAgLy8gISF3aW5kb3cgJiYgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFVJRXZlbnQoXCJyZXNpemVcIikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS5zdG9wKCk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXdzIHRoZSBgVmlzdWFsaXphdGlvblBhbmVsYCBhbmQgYWxsIGl0cyBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKCEhdGhpcy50b29sYmFyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgc3VwZXIucmVmcmVzaCgpO1xuICB9XG5cbiAgcHVibGljIGxheW91dCgpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHZpc3VhbGl6ZWQgZGF0YSBiYXNlZCBvbiBhIHNwZWNpZmllZCBxdWVzdGlvbiBuYW1lIGFuZCB2YWx1ZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSB1c2VyIGNsaWNrcyBhIGNoYXJ0IHBvaW50LlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICogQHBhcmFtIHNlbGVjdGVkVmFsdWVcbiAgICogQHNlZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucy5hbGxvd1NlbGVjdGlvblxuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcihxdWVzdGlvbk5hbWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhUHJvdmlkZXIuc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRlIG9mIGBWaXN1YWxpemF0aW9uUGFuZWxgLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlzdWFsaXplZCBlbGVtZW50cyBhbmQgY3VycmVudCBsb2NhbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IElTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICBlbGVtZW50czogW10uY29uY2F0KHRoaXMuX2VsZW1lbnRzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50Lm5hbWUpO1xuICAgICAgICBjb25zdCBlbGVtZW50U3RhdGUgPSB7IC4uLmVsZW1lbnQsIC4uLnZpc3VhbGl6ZXI/LmdldFN0YXRlKCkgfTtcbiAgICAgICAgaWYgKGVsZW1lbnRTdGF0ZS5yZW5kZXJlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSBlbGVtZW50U3RhdGUucmVuZGVyZWRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50U3RhdGU7XG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXRlKG5ld1N0YXRlOiBJU3RhdGUpIHtcbiAgICBpZiAoIW5ld1N0YXRlKSByZXR1cm47XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdTdGF0ZS5lbGVtZW50cykpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uTmFtZXMgPSB0aGlzLnF1ZXN0aW9ucy5tYXAocSA9PiBxLm5hbWUpO1xuICAgICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQobmV3U3RhdGUuZWxlbWVudHMuZmlsdGVyKGUgPT4gKHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlLm5hbWUpICE9PSAtMSkpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld1N0YXRlLmxvY2FsZSAhPT0gXCJ1bmRlZmluZWRcIikgdGhpcy5zZXRMb2NhbGUobmV3U3RhdGUubG9jYWxlKTtcblxuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudFN0YXRlID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudFN0YXRlLm5hbWUpO1xuICAgICAgaWYgKHZpc3VhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aXN1YWxpemVyLnNldFN0YXRlKGVsZW1lbnRTdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnMoKTogSVBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBJUGVybWlzc2lvbltdKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uLm5hbWUgPT09IGVsZW1lbnQubmFtZSlcbiAgICAgICAgICBlbGVtZW50LmlzUHVibGljID0gcGVybWlzc2lvbi5pc1B1YmxpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyAuLi5lbGVtZW50IH07XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQodXBkYXRlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveVZpc3VhbGl6ZXJzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsIElRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9wYW5lbFZpc3VhbGl6ZXI6IFZpc3VhbGl6YXRpb25QYW5lbCA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInBhbmVsRHluYW1pY1wiKTtcbiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAgICAgIHRoaXMuZ2V0UXVlc3Rpb25zKCksXG4gICAgICBbXSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJwYW5lbER5bmFtaWNcIjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBpZiAoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhbmVsRGF0YSA9IHBhbmVsRGF0YS5jb25jYXQoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKTogSVF1ZXN0aW9uW10ge1xuICAgIGNvbnN0IHBhbmVsZHluYW1pYzogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gcGFuZWxkeW5hbWljLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Db21tZW50TW9kZWwsIHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJRGF0YUluZm8sIERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckZhY3RvcnkgfSBmcm9tIFwiLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL3Zpc3VhbGl6ZXJCYXNlLnNjc3NcIik7XG5cbi8qKlxuICogQSBiYXNlIG9iamVjdCBmb3IgYWxsIHZpc3VhbGl6ZXJzLiBVc2UgaXQgdG8gaW1wbGVtZW50IGEgY3VzdG9tIHZpc3VhbGl6ZXIuXG4gKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVyczpcbiAqXG4gKiAtIGBxdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAqIEEgc3VydmV5IHF1ZXN0aW9uIHRvIHZpc3VhbGl6ZS5cbiAqIC0gYGRhdGFgOiBgQXJyYXk8YW55PmBcXFxuICogU3VydmV5IHJlc3VsdHMuXG4gKiAtIGBvcHRpb25zYFxcXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAtIGBzZXJpZXNWYWx1ZXNgOiBgQXJyYXk8c3RyaW5nPmBcXFxuICogICAgU2VyaWVzIHZhbHVlcyB1c2VkIHRvIGdyb3VwIGRhdGEuXG4gKiAgICAtIGBzZXJpZXNMYWJlbHNgOiBgQXJyYXk8c3RyaW5nPmBcXFxuICogICAgU2VyaWVzIGxhYmVscyB0byBkaXNwbGF5LiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQsIGBzZXJpZXNWYWx1ZXNgIGFyZSB1c2VkIGFzIGxhYmVscy5cbiAqICAgIC0gYHN1cnZleWA6IFtgU3VydmV5TW9kZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwpXFxcbiAqICAgIFBhc3MgYSBgU3VydmV5TW9kZWxgIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIHVzZSBsb2NhbGVzIGZyb20gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAqICAgIC0gYGRhdGFQcm92aWRlcmA6IGBEYXRhUHJvdmlkZXJgXFxcbiAqICAgIEEgZGF0YSBwcm92aWRlciBmb3IgdGhpcyB2aXN1YWxpemVyLlxuICogLSBgdHlwZWA6IGBzdHJpbmdgXFxcbiAqICooT3B0aW9uYWwpKiBUaGUgdmlzdWFsaXplcidzIHR5cGUuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvaG93LXRvLXBsb3Qtc3VydmV5LWRhdGEtaW4tY3VzdG9tLWJhci1jaGFydC8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyQmFzZSBpbXBsZW1lbnRzIElEYXRhSW5mbyB7XG4gIHByaXZhdGUgX3Nob3dUb29sYmFyID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZm9vdGVyVmlzdWFsaXplcjogVmlzdWFsaXplckJhc2UgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2RhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyID0gMjc7XG4gIHByb3RlY3RlZCByZW5kZXJSZXN1bHQ6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdG9vbGJhckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBoZWFkZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgY29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBmb290ZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRRdWVzdGlvblR5cGUgPSBcImNvbW1lbnRcIjsgLy8gVE9ETzogbWFrZSBpdCBjb25maWd1cmVhYmxlIC0gYWxsb3cgY2hvb3NlIHdoYXQga2luZCBvZiBxdWVzdGlvbi92aXN1YWxpemVyIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMvb3RoZXJzXG4gIHB1YmxpYyBzdGF0aWMgb3RoZXJDb21tZW50Q29sbGFwc2VkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgYWZ0ZXIgdGhlIHZpc3VhbGl6ZXIncyBjb250ZW50IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgVmlzdWFsaXplckJhc2VgXFxcbiAgICogQSBgVmlzdWFsaXplckJhc2VgIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5odG1sRWxlbWVudGA6IGBIVE1MRWxlbWVudGBcXFxuICAgKiBBIHBhZ2UgZWxlbWVudCB3aXRoIHRoZSB2aXN1YWxpemVyJ3MgY29udGVudC5cbiAgICogQHNlZSByZW5kZXJcbiAgICogQHNlZSByZWZyZXNoXG4gICAqKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6ZXJCYXNlLCBhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIGFmdGVyUmVuZGVyKGNvbnRlbnRDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyLmZpcmUodGhpcywgeyBodG1sRWxlbWVudDogY29udGVudENvbnRhaW5lciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCBhZnRlciBhIG5ldyBsb2NhbGUgaXMgc2V0LlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgVmlzdWFsaXplckJhc2VgXFxcbiAgICogQSBgVmlzdWFsaXplckJhc2VgIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5sb2NhbGVgOiBgc3RyaW5nYFxcXG4gICAqIFRoZSBpbmRlbnRpZmllciBvZiBhIG5ldyBsb2NhbGUgKGZvciBleGFtcGxlLCBcImVuXCIpLlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogeyBsb2NhbGU6IHN0cmluZyB9KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBwcm90ZWN0ZWQgdG9vbGJhckl0ZW1DcmVhdG9yczogeyBbbmFtZTogc3RyaW5nXTogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBwdWJsaWMgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBvcHRpb25zLmRhdGFQcm92aWRlciB8fCBuZXcgRGF0YVByb3ZpZGVyKGRhdGEpO1xuICAgIHRoaXMuX2RhdGFQcm92aWRlci5vbkRhdGFDaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLm9uRGF0YUNoYW5nZWQoKSk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubGFiZWxUcnVuY2F0ZUxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5sYWJlbFRydW5jYXRlTGVuZ3RoID0gb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgYSB2aXN1YWxpemVkIHF1ZXN0aW9uLlxuICAgKi9cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWVOYW1lIHx8IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlzdWFsaXplciBkaXNwbGF5cyBhIGhlYWRlci4gVGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgd2hlbiBhIHZpc3VhbGl6ZWQgcXVlc3Rpb24gaGFzIGEgY29ycmVjdCBhbnN3ZXIuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgaGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd0NvcnJlY3RBbnN3ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gJiYgISF0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpc3VhbGl6ZXIgZGlzcGxheXMgYSBmb290ZXIuIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHdoZW4gYSB2aXN1YWxpemVkIHF1ZXN0aW9uIGhhcyBhIGNvbW1lbnQuXG4gICAqIEBzZWUgaGFzSGVhZGVyXG4gICAqL1xuICBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMucXVlc3Rpb24gJiYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCB8fCB0aGlzLnF1ZXN0aW9uLmhhc090aGVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVmlzdWFsaXplcjxUID0gVmlzdWFsaXplckJhc2U+KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFQge1xuICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kYXRhUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFZpc3VhbGl6ZXJGYWN0b3J5LmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24sIHRoaXMuZGF0YSwgb3B0aW9ucykgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9vdGVyIHZpc3VhbGl6ZXIuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGZvb3RlciBpcyBhYnNlbnQuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgZm9vdGVyVmlzdWFsaXplcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLm5hbWUgKyAoc2V0dGluZ3MgfHwge30pLmNvbW1lbnRQcmVmaXhcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi50aXRsZSA9IHRoaXMucHJvY2Vzc1RleHQodGhpcy5xdWVzdGlvbi50aXRsZSk7XG5cbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdXNlcnMgY2FuIHNlbGVjdCBzZXJpZXMgcG9pbnRzIHRvIGNyb3NzLWZpbHRlciBjaGFydHMuIFRvIGFsbG93IG9yIGRpc2FsbG93IHNlbGVjdGlvbiwgc2V0IHRoZSBgYWxsb3dTZWxlY3Rpb25gIHByb3BlcnR5IG9mIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbikgJiZcbiAgICAgIHRoaXMuX3N1cHBvcnRTZWxlY3Rpb25cbiAgICApO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzVmFsdWVzIHx8IFtdO1xuICB9XG5cbiAgZ2V0U2VyaWVzTGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzTGFiZWxzIHx8IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gIH1cblxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gIH1cblxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSB0b29sYmFyIGl0ZW0gZm9yIHRoaXMgdmlzdWFsaXplci5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0byBhZGQgYSBjdXN0b20gYnV0dG9uIGFuZCBkcm9wLWRvd24gbWVudSB0byB0aGUgdG9vbGJhcjpcbiAgICpcbiAgICogYGBganNcbiAgICogaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCJzdXJ2ZXktYW5hbHl0aWNzXCI7XG4gICAqXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbCggLi4uICk7XG4gICAqXG4gICAqIC8vIEFkZCBhIGN1c3RvbSBidXR0b24gdG8gdGhlIHRvb2xiYXJcbiAgICogdml6UGFuZWwudmlzdWFsaXplcnNbMF0ucmVnaXN0ZXJUb29sYmFySXRlbShcIm15LXRvb2xiYXItYnV0dG9uXCIsICgpID0+IHtcbiAgICogICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKFxuICAgKiAgICAgLy8gQSBidXR0b24gY2xpY2sgZXZlbnQgaGFuZGxlclxuICAgKiAgICAgKCkgPT4ge1xuICAgKiAgICAgICBhbGVydChcIkN1c3RvbSB0b29sYmFyIGJ1dHRvbiBpcyBjbGlja2VkXCIpO1xuICAgKiAgICAgfSxcbiAgICogICAgIC8vIEJ1dHRvbiBjYXB0aW9uXG4gICAqICAgICBcIkJ1dHRvblwiXG4gICAqICAgKTtcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEFkZCBhIGN1c3RvbSBkcm9wLWRvd24gbWVudSB0byB0aGUgdG9vbGJhclxuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5yZWdpc3RlclRvb2xiYXJJdGVtKFwibXktdG9vbGJhci1kcm9wZG93blwiLCAoKSA9PiB7XG4gICAqICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgKiAgICAgLy8gTWVudSBpdGVtc1xuICAgKiAgICAgW1xuICAgKiAgICAgICB7IHZhbHVlOiAxLCB0ZXh0OiBcIk9uZVwiIH0sXG4gICAqICAgICAgIHsgdmFsdWU6IDIsIHRleHQ6IFwiVHdvXCIgfSxcbiAgICogICAgICAgeyB2YWx1ZTogMywgdGV4dDogXCJUaHJlZVwiIH1cbiAgICogICAgIF0sXG4gICAqICAgICAvLyBBIGZ1bmN0aW9uIHRoYXQgc3BlY2lmaWVzIGluaXRpYWwgc2VsZWN0aW9uXG4gICAqICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICogICAgIC8vIEFuIGV2ZW50IGhhbmRsZXIgdGhhdCBpcyBleGVjdXRlZCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkXG4gICAqICAgICAoZSkgPT4ge1xuICAgKiAgICAgICBhbGVydChlLnRhcmdldC52YWx1ZSk7XG4gICAqICAgICB9XG4gICAqICAgKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gbmFtZSBBIGN1c3RvbSBuYW1lIGZvciB0aGUgdG9vbGJhciBpdGVtLlxuICAgKiBAcGFyYW0gY3JlYXRvciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgdG9vbGJhciBhbmQgc2hvdWxkIHJldHVybiBhbiBgSFRNTEVsZW1lbnRgIHdpdGggdGhlIHRvb2xiYXIgaXRlbS5cbiAgICogQHNlZSB1bnJlZ2lzdGVyVG9vbGJhckl0ZW1cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRvb2xiYXJJdGVtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVhdG9yOiAodG9vbGJhcj86IEhUTUxEaXZFbGVtZW50KSA9PiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV0gPSBjcmVhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBVbnJlZ2lzdGVycyBhIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgdG9vbGJhciBpdGVtLiBBbGxvd3MgeW91IHRvIHJlbW92ZSBhIHRvb2xiYXIgaXRlbS5cbiAgICogQHBhcmFtIG5hbWUgQSB0b29sYmFyIGl0ZW0gbmFtZS5cbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiBwcmV2aW91c2x5IHVzZWQgdG8gW3JlZ2lzdGVyXSgjcmVnaXN0ZXJUb29sYmFySXRlbSkgdGhlIHJlbW92ZWQgdG9vbGJhciBpdGVtLlxuICAgKiBAc2VlIHJlZ2lzdGVyVG9vbGJhckl0ZW1cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVG9vbGJhckl0ZW0oXG4gICAgbmFtZTogc3RyaW5nXG4gICk6ICh0b29sYmFyPzogSFRNTERpdkVsZW1lbnQpID0+IEhUTUxFbGVtZW50IHtcbiAgICBpZih0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3JlYXRvciA9IHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1tuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV07XG4gICAgICByZXR1cm4gY3JlYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXN1YWxpemVyJ3MgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZSB8fCBcInZpc3VhbGl6ZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgc3VydmV5RGF0YWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwjc3VydmV5RGF0YSkgaW5zdGVhZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3VydmV5IHJlc3VsdHMgdXNlZCB0byBjYWxjdWxhdGUgdmFsdWVzIGZvciB2aXN1YWxpemF0aW9uLiBJZiBhIHVzZXIgYXBwbGllcyBhIGZpbHRlciwgdGhlIGFycmF5IGlzIGFsc28gZmlsdGVyZWQuXG4gICAqXG4gICAqIFRvIGdldCBhbiBhcnJheSBvZiBjYWxjdWxhdGVkIGFuZCB2aXN1YWxpemVkIHZhbHVlcywgY2FsbCB0aGUgW2BnZXRDYWxjdWxhdGVkVmFsdWVzKClgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2UjZ2V0Q2FsY3VsYXRlZFZhbHVlcykgbWV0aG9kLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5maWx0ZXJlZERhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGRhdGFQcm92aWRlcigpOiBEYXRhUHJvdmlkZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2aXN1YWxpemVkIGRhdGEuXG4gICAqIEBwYXJhbSBkYXRhIEEgZGF0YSBhcnJheSB3aXRoIHN1cnZleSByZXN1bHRzIHRvIGJlIHZpc3VhbGl6ZWQuXG4gICAqL1xuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNGb290ZXIpIHtcbiAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG9uVXBkYXRlOiAoKSA9PiB2b2lkO1xuXG4gIGludm9rZU9uVXBkYXRlKCkge1xuICAgIHRoaXMub25VcGRhdGUgJiYgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZpc3VhbGl6ZXIgYW5kIGFsbCBpdHMgZWxlbWVudHMgZnJvbSB0aGUgRE9NLlxuICAgKiBAc2VlIGNsZWFyXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGlmICghIXRoaXMucmVuZGVyUmVzdWx0KSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB0aGlzLnRvb2xiYXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmhlYWRlckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZm9vdGVyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5yZW5kZXJSZXN1bHQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMucmVuZGVyUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSB0b29sYmFyLCBoZWFkZXIsIGZvb3RlciwgYW5kIGNvbnRlbnQgY29udGFpbmVycy5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gZW1wdHkgYW5kIGRlbGV0ZSB0aGUgdmlzdWFsaXplciBhbmQgYWxsIGl0cyBlbGVtZW50cyBmcm9tIHRoZSBET00sIGNhbGwgdGhlIFtgZGVzdHJveSgpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlI2Rlc3Ryb3kpIG1ldGhvZCBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIGlmICghIXRoaXMudG9vbGJhckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmhlYWRlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95SGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5jb250ZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZm9vdGVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUb29sYmFySXRlbXModG9vbGJhcjogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnMgfHwge30pLmZvckVhY2goKHRvb2xiYXJJdGVtTmFtZSkgPT4ge1xuICAgICAgbGV0IHRvb2xiYXJJdGVtID0gdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW3Rvb2xiYXJJdGVtTmFtZV0odG9vbGJhcik7XG4gICAgICBpZiAoISF0b29sYmFySXRlbSkge1xuICAgICAgICB0b29sYmFyLmFwcGVuZENoaWxkKHRvb2xiYXJJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gPyB0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXIgOiBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgY29uc3QgdG9vbGJhciA9IDxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS10b29sYmFyXCIpXG4gICAgICApO1xuICAgICAgdGhpcy5jcmVhdGVUb29sYmFySXRlbXModG9vbGJhcik7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbGJhcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0cm95Q29udGVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckhlYWRlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMucmVuZGVySGVhZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yZW5kZXJIZWFkZXIoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29ycmVjdEFuc3dlckVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2NvcnJlY3QtYW5zd2VyXCJcbiAgICAgICk7XG4gICAgICBjb3JyZWN0QW5zd2VyRWxlbWVudC5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29ycmVjdEFuc3dlclwiKSArIHRoaXMuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb3JyZWN0QW5zd2VyRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvblwiKTtcbiAgICB9XG4gICAgdGhpcy5hZnRlclJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckZvb3Rlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICBjb25zdCBmb290ZXJUaXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImg0XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9fZm9vdGVyLXRpdGxlXCIsXG4gICAgICAgIHsgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJDb21tZW50VGl0bGVcIikgfVxuICAgICAgKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb290ZXJUaXRsZUVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBmb290ZXJDb250ZW50RWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9fZm9vdGVyLWNvbnRlbnRcIlxuICAgICAgKTtcbiAgICAgIGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBWaXN1YWxpemVyQmFzZS5vdGhlckNvbW1lbnRDb2xsYXBzZWRcbiAgICAgICAgPyBcIm5vbmVcIlxuICAgICAgICA6IFwiYmxvY2tcIjtcblxuICAgICAgY29uc3QgdmlzaWJpbGl0eUJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgIGlmIChmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgIGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgdmlzaWJpbGl0eUJ1dHRvbi5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZUJ1dHRvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgdmlzaWJpbGl0eUJ1dHRvbi5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFxuICAgICAgICAgICAgVmlzdWFsaXplckJhc2Uub3RoZXJDb21tZW50Q29sbGFwc2VkID8gXCJzaG93QnV0dG9uXCIgOiBcImhpZGVCdXR0b25cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb290ZXJWaXN1YWxpemVyLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd0J1dHRvblwiKSAvKiwgXCJzYS10b29sYmFyX19idXR0b24tLXJpZ2h0XCIqLyk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodmlzaWJpbGl0eUJ1dHRvbik7XG5cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb290ZXJDb250ZW50RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci5yZW5kZXIoZm9vdGVyQ29udGVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB2aXN1YWxpemVyIGluIGEgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHRhcmdldEVsZW1lbnQgQW4gYEhUTUxFbGVtZW50YCBvciBhbiBgaWRgIG9mIGEgcGFnZSBlbGVtZW50IGluIHdoaWNoIHlvdSB3YW50IHRvIHJlbmRlciB0aGUgdmlzdWFsaXplci5cbiAgICovXG4gIHJlbmRlcih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0RWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGFyZ2V0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldEVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlclJlc3VsdCA9IHRhcmdldEVsZW1lbnQ7XG5cbiAgICB0aGlzLnRvb2xiYXJDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fdG9vbGJhclwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG5cbiAgICBpZiAodGhpcy5oYXNIZWFkZXIpIHtcbiAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19oZWFkZXJcIlxuICAgICAgKTtcbiAgICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJIZWFkZXIodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX19jb250ZW50XCJcbiAgICApO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcblxuICAgIHRoaXMuZm9vdGVyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3RlclwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLnJlbmRlckZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVuZGVycyB0aGUgdmlzdWFsaXplciBhbmQgaXRzIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLmhlYWRlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyRm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcEh0bWxGcm9tVGl0bGVzICE9PSBmYWxzZSkge1xuICAgICAgbGV0IG9yaWdpbmFsVGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICAgIGxldCBwcm9jZXNzZWRUZXh0ID0gb3JpZ2luYWxUZXh0LnJlcGxhY2UoLyg8KFtePl0rKT4pL2dpLCBcIlwiKTtcbiAgICAgIHJldHVybiBwcm9jZXNzZWRUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGdldFJhbmRvbUNvbG9yKCkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgcmV0dXJuIGNvbG9yc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjb2xvcnMubGVuZ3RoKV07XG4gIH1cblxuICBwcml2YXRlIF9iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmN2Y3ZjdcIjtcblxuICBnZXQgYmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gdGhpcy5nZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCk7IH1cbiAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZSkgeyB0aGlzLnNldEJhY2tncm91bmRDb2xvckNvcmUodmFsdWUpOyB9XG5cbiAgcHJvdGVjdGVkIGdldEJhY2tncm91bmRDb2xvckNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgaWYgKHRoaXMuZm9vdGVyVmlzdWFsaXplcikgdGhpcy5mb290ZXJWaXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICB9XG5cbiAgc3RhdGljIGN1c3RvbUNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3JzID0gW1xuICAgIFwiIzg2ZTFmYlwiLFxuICAgIFwiIzM5OTlmYlwiLFxuICAgIFwiI2ZmNjc3MVwiLFxuICAgIFwiIzFlYjQ5NlwiLFxuICAgIFwiI2ZmYzE1MlwiLFxuICAgIFwiI2FiYTFmZlwiLFxuICAgIFwiIzdkOGRhNVwiLFxuICAgIFwiIzRlYzQ2Y1wiLFxuICAgIFwiI2NmMzdhNlwiLFxuICAgIFwiIzRlNjE5OFwiLFxuICBdO1xuXG4gIGdldENvbG9ycyhjb3VudCA9IDEwKSB7XG4gICAgY29uc3QgY29sb3JzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzKSAmJlxuICAgICAgICBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnMubGVuZ3RoID4gMFxuICAgICAgICA/IFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9yc1xuICAgICAgICA6IFZpc3VhbGl6ZXJCYXNlLmNvbG9ycztcblxuICAgIGxldCBtYW55Q29sb3JzOiBhbnkgPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgbWFueUNvbG9ycyA9IG1hbnlDb2xvcnMuY29uY2F0KGNvbG9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbnlDb2xvcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB2aXN1YWxpemVyJ3MgdG9vbGJhci5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dUb29sYmFyO1xuICB9XG4gIHNldCBzaG93VG9vbGJhcihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLl9zaG93VG9vbGJhcikge1xuICAgICAgdGhpcy5fc2hvd1Rvb2xiYXIgPSBuZXdWYWx1ZTtcbiAgICAgIGlmICghIXRoaXMudG9vbGJhckNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNnZXRDYWxjdWxhdGVkVmFsdWVzKSBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2FsY3VsYXRlZCBhbmQgdmlzdWFsaXplZCB2YWx1ZXMuIElmIGEgdXNlciBhcHBsaWVzIGEgZmlsdGVyLCB0aGUgYXJyYXkgaXMgYWxzbyBmaWx0ZXJlZC5cbiAgICpcbiAgICogVG8gZ2V0IGFuIGFycmF5IG9mIHNvdXJjZSBzdXJ2ZXkgcmVzdWx0cywgdXNlIHRoZSBbYHN1cnZleURhdGFgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2Ujc3VydmV5RGF0YSkgcHJvcGVydHkuXG4gICAqL1xuICBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjdXJyZW50IHZpc3VhbGl6ZXIgc3RhdGUuIFRoZSBwcm9wZXJ0aWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aXN1YWxpemVyLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgc2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzdWFsaXplcidzIHN0YXRlLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgZ2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IGxvY2FsZS5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gaW5oZXJpdCB0aGUgbG9jYWxlIGZyb20gYSB2aXN1YWxpemVkIHN1cnZleSwgYXNzaWduIGEgYFN1cnZleU1vZGVsYCBpbnN0YW5jZSB0byB0aGUgYHN1cnZleWAgcHJvcGVydHkgb2YgdGhlIGBvcHRpb25zYCBvYmplY3QgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBJZiB0aGUgc3VydmV5IGlzIFt0cmFuc2xhdGVkIGludG8gbW9yZSB0aGFuIG9uZSBsYW5ndWFnZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvc3VydmV5LWxvY2FsaXphdGlvbi8pLCB0aGUgdG9vbGJhciBkaXNwbGF5cyBhIGxhbmd1YWdlIHNlbGVjdGlvbiBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBvbkxvY2FsZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmV0dXJuIHN1cnZleS5sb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLm9uTG9jYWxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgbG9jYWxlOiBuZXdMb2NhbGUgfSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMub3B0aW9ucy5zdXJ2ZXk7XG4gICAgaWYgKCEhc3VydmV5ICYmIHN1cnZleS5sb2NhbGUgIT09IG5ld0xvY2FsZSkge1xuICAgICAgc3VydmV5LmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICB9XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBpbmRpdmlkdWFsIHZpc3VhbGl6ZXJzIHdpdGhvdXQgY3JlYXRpbmcgYSBbdmlzdWFsaXphdGlvbiBwYW5lbF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdmlzdWFsaXplciBmb3IgYSBzaW5nbGUgcXVlc3Rpb24uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGltcG9ydCB7IFZpc3VhbGl6ZXJGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1hbmFseXRpY3NcIjtcbiAgICpcbiAgICogY29uc3QgdmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemVyRmFjdG9yeS5jcmVhdGVWaXN1YWxpemVyKFxuICAgKiAgIHF1ZXN0aW9uLFxuICAgKiAgIGRhdGEsXG4gICAqICAgb3B0aW9uc1xuICAgKiApO1xuICAgKlxuICAgKiB2aXN1YWxpemVyLnJlbmRlcihcImNvbnRhaW5lcklkXCIpXG4gICAqIGBgYFxuICAgKlxuICAgKiBJZiBhIHF1ZXN0aW9uIGhhcyBtb3JlIHRoYW4gb25lIFtyZWdpc3RlcmVkXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbm1hbmFnZXIjcmVnaXN0ZXJWaXN1YWxpemVyKSB2aXN1YWxpemVyLCB1c2VycyBjYW4gc3dpdGNoIGJldHdlZW4gdGhlbSB1c2luZyBhIGRyb3AtZG93biBtZW51LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gQSBxdWVzdGlvbiBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgdmlzdWFsaXplci5cbiAgICogQHBhcmFtIGRhdGEgQSBkYXRhIGFycmF5IHdpdGggc3VydmV5IHJlc3VsdHMgdG8gYmUgdmlzdWFsaXplZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IHdpdGggYW55IGN1c3RvbSBwcm9wZXJ0aWVzIHlvdSBuZWVkIHdpdGhpbiB0aGUgdmlzdWFsaXplci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlVmlzdWFsaXplcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG4gICk6IFZpc3VhbGl6ZXJCYXNlIHtcbiAgICBsZXQgdHlwZTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwidGV4dFwiICYmICg8YW55PnF1ZXN0aW9uKS5pbnB1dFR5cGUpIHtcbiAgICAgIHR5cGUgPSAoPGFueT5xdWVzdGlvbikuaW5wdXRUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIH1cblxuICAgIHZhciBjcmVhdG9ycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLmdldFZpc3VhbGl6ZXJzQnlUeXBlKHR5cGUpO1xuICAgIHZhciB2aXN1YWxpemVycyA9IGNyZWF0b3JzLm1hcChcbiAgICAgIChjcmVhdG9yKSA9PiBuZXcgY3JlYXRvcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucylcbiAgICApO1xuICAgIGlmICh2aXN1YWxpemVycy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyQ29uc3RydWN0b3IgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRBbHRWaXN1YWxpemVyU2VsZWN0b3IoKTtcbiAgICAgIGxldCB2aXN1YWxpemVyID0gbmV3IGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgdmlzdWFsaXplcnMsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBkYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZpc3VhbGl6ZXI7XG4gICAgfVxuICAgIHJldHVybiB2aXN1YWxpemVyc1swXTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiZGVcIixcbiAgXCJlblwiLFxuICBcInZhblwiLFxuICBcImlrXCIsXG4gIFwidGVcIixcbiAgXCJkYXRcIixcbiAgXCJkaWVcIixcbiAgXCJpblwiLFxuICBcImVlblwiLFxuICBcImhpalwiLFxuICBcImhldFwiLFxuICBcIm5pZXRcIixcbiAgXCJ6aWpuXCIsXG4gIFwiaXNcIixcbiAgXCJ3YXNcIixcbiAgXCJvcFwiLFxuICBcImFhblwiLFxuICBcIm1ldFwiLFxuICBcImFsc1wiLFxuICBcInZvb3JcIixcbiAgXCJoYWRcIixcbiAgXCJlclwiLFxuICBcIm1hYXJcIixcbiAgXCJvbVwiLFxuICBcImhlbVwiLFxuICBcImRhblwiLFxuICBcInpvdVwiLFxuICBcIm9mXCIsXG4gIFwid2F0XCIsXG4gIFwibWlqblwiLFxuICBcIm1lblwiLFxuICBcImRpdFwiLFxuICBcInpvXCIsXG4gIFwiZG9vclwiLFxuICBcIm92ZXJcIixcbiAgXCJ6ZVwiLFxuICBcInppY2hcIixcbiAgXCJiaWpcIixcbiAgXCJvb2tcIixcbiAgXCJ0b3RcIixcbiAgXCJqZVwiLFxuICBcIm1palwiLFxuICBcInVpdFwiLFxuICBcImRlclwiLFxuICBcImRhYXJcIixcbiAgXCJoYWFyXCIsXG4gIFwibmFhclwiLFxuICBcImhlYlwiLFxuICBcImhvZVwiLFxuICBcImhlZWZ0XCIsXG4gIFwiaGViYmVuXCIsXG4gIFwiZGV6ZVwiLFxuICBcInVcIixcbiAgXCJ3YW50XCIsXG4gIFwibm9nXCIsXG4gIFwiemFsXCIsXG4gIFwibWVcIixcbiAgXCJ6aWpcIixcbiAgXCJudVwiLFxuICBcImdlXCIsXG4gIFwiZ2VlblwiLFxuICBcIm9tZGF0XCIsXG4gIFwiaWV0c1wiLFxuICBcIndvcmRlblwiLFxuICBcInRvY2hcIixcbiAgXCJhbFwiLFxuICBcIndhcmVuXCIsXG4gIFwidmVlbFwiLFxuICBcIm1lZXJcIixcbiAgXCJkb2VuXCIsXG4gIFwidG9lblwiLFxuICBcIm1vZXRcIixcbiAgXCJiZW5cIixcbiAgXCJ6b25kZXJcIixcbiAgXCJrYW5cIixcbiAgXCJodW5cIixcbiAgXCJkdXNcIixcbiAgXCJhbGxlc1wiLFxuICBcIm9uZGVyXCIsXG4gIFwiamFcIixcbiAgXCJlZW5zXCIsXG4gIFwiaGllclwiLFxuICBcIndpZVwiLFxuICBcIndlcmRcIixcbiAgXCJhbHRpamRcIixcbiAgXCJkb2NoXCIsXG4gIFwid29yZHRcIixcbiAgXCJ3ZXplblwiLFxuICBcImt1bm5lblwiLFxuICBcIm9uc1wiLFxuICBcInplbGZcIixcbiAgXCJ0ZWdlblwiLFxuICBcIm5hXCIsXG4gIFwicmVlZHNcIixcbiAgXCJ3aWxcIixcbiAgXCJrb25cIixcbiAgXCJuaWV0c1wiLFxuICBcInV3XCIsXG4gIFwiaWVtYW5kXCIsXG4gIFwiZ2V3ZWVzdFwiLFxuICBcImFuZGVyZVwiXG5dO1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYVwiLFxuICBcImFib3V0XCIsXG4gIFwiYWJvdmVcIixcbiAgXCJhY3Jvc3NcIixcbiAgXCJhZnRlclwiLFxuICBcImFnYWluXCIsXG4gIFwiYWdhaW5zdFwiLFxuICBcImFsbFwiLFxuICBcImFsbW9zdFwiLFxuICBcImFsb25lXCIsXG4gIFwiYWxvbmdcIixcbiAgXCJhbHJlYWR5XCIsXG4gIFwiYWxzb1wiLFxuICBcImFsdGhvdWdoXCIsXG4gIFwiYWx3YXlzXCIsXG4gIFwiYW1vbmdcIixcbiAgXCJhblwiLFxuICBcImFuZFwiLFxuICBcImFub3RoZXJcIixcbiAgXCJhbnlcIixcbiAgXCJhbnlib2R5XCIsXG4gIFwiYW55b25lXCIsXG4gIFwiYW55dGhpbmdcIixcbiAgXCJhbnl3aGVyZVwiLFxuICBcImFyZVwiLFxuICBcImFyZWFcIixcbiAgXCJhcmVhc1wiLFxuICBcImFyb3VuZFwiLFxuICBcImFzXCIsXG4gIFwiYXNrXCIsXG4gIFwiYXNrZWRcIixcbiAgXCJhc2tpbmdcIixcbiAgXCJhc2tzXCIsXG4gIFwiYXRcIixcbiAgXCJhd2F5XCIsXG4gIFwiYlwiLFxuICBcImJhY2tcIixcbiAgXCJiYWNrZWRcIixcbiAgXCJiYWNraW5nXCIsXG4gIFwiYmFja3NcIixcbiAgXCJiZVwiLFxuICBcImJlY2FtZVwiLFxuICBcImJlY2F1c2VcIixcbiAgXCJiZWNvbWVcIixcbiAgXCJiZWNvbWVzXCIsXG4gIFwiYmVlblwiLFxuICBcImJlZm9yZVwiLFxuICBcImJlZ2FuXCIsXG4gIFwiYmVoaW5kXCIsXG4gIFwiYmVpbmdcIixcbiAgXCJiZWluZ3NcIixcbiAgXCJiZXN0XCIsXG4gIFwiYmV0dGVyXCIsXG4gIFwiYmV0d2VlblwiLFxuICBcImJpZ1wiLFxuICBcImJvdGhcIixcbiAgXCJidXRcIixcbiAgXCJieVwiLFxuICBcImNcIixcbiAgXCJjYW1lXCIsXG4gIFwiY2FuXCIsXG4gIFwiY2Fubm90XCIsXG4gIFwiY2FzZVwiLFxuICBcImNhc2VzXCIsXG4gIFwiY2VydGFpblwiLFxuICBcImNlcnRhaW5seVwiLFxuICBcImNsZWFyXCIsXG4gIFwiY2xlYXJseVwiLFxuICBcImNvbWVcIixcbiAgXCJjb3VsZFwiLFxuICBcImRcIixcbiAgXCJkaWRcIixcbiAgXCJkaWZmZXJcIixcbiAgXCJkaWZmZXJlbnRcIixcbiAgXCJkaWZmZXJlbnRseVwiLFxuICBcImRvXCIsXG4gIFwiZG9lc1wiLFxuICBcImRvbmVcIixcbiAgXCJkb3duXCIsXG4gIFwiZG93blwiLFxuICBcImRvd25lZFwiLFxuICBcImRvd25pbmdcIixcbiAgXCJkb3duc1wiLFxuICBcImR1cmluZ1wiLFxuICBcImVcIixcbiAgXCJlYWNoXCIsXG4gIFwiZWFybHlcIixcbiAgXCJlaXRoZXJcIixcbiAgXCJlbmRcIixcbiAgXCJlbmRlZFwiLFxuICBcImVuZGluZ1wiLFxuICBcImVuZHNcIixcbiAgXCJlbm91Z2hcIixcbiAgXCJldmVuXCIsXG4gIFwiZXZlbmx5XCIsXG4gIFwiZXZlclwiLFxuICBcImV2ZXJ5XCIsXG4gIFwiZXZlcnlib2R5XCIsXG4gIFwiZXZlcnlvbmVcIixcbiAgXCJldmVyeXRoaW5nXCIsXG4gIFwiZXZlcnl3aGVyZVwiLFxuICBcImZcIixcbiAgXCJmYWNlXCIsXG4gIFwiZmFjZXNcIixcbiAgXCJmYWN0XCIsXG4gIFwiZmFjdHNcIixcbiAgXCJmYXJcIixcbiAgXCJmZWx0XCIsXG4gIFwiZmV3XCIsXG4gIFwiZmluZFwiLFxuICBcImZpbmRzXCIsXG4gIFwiZmlyc3RcIixcbiAgXCJmb3JcIixcbiAgXCJmb3VyXCIsXG4gIFwiZnJvbVwiLFxuICBcImZ1bGxcIixcbiAgXCJmdWxseVwiLFxuICBcImZ1cnRoZXJcIixcbiAgXCJmdXJ0aGVyZWRcIixcbiAgXCJmdXJ0aGVyaW5nXCIsXG4gIFwiZnVydGhlcnNcIixcbiAgXCJnXCIsXG4gIFwiZ2F2ZVwiLFxuICBcImdlbmVyYWxcIixcbiAgXCJnZW5lcmFsbHlcIixcbiAgXCJnZXRcIixcbiAgXCJnZXRzXCIsXG4gIFwiZ2l2ZVwiLFxuICBcImdpdmVuXCIsXG4gIFwiZ2l2ZXNcIixcbiAgXCJnb1wiLFxuICBcImdvaW5nXCIsXG4gIFwiZ29vZFwiLFxuICBcImdvb2RzXCIsXG4gIFwiZ290XCIsXG4gIFwiZ3JlYXRcIixcbiAgXCJncmVhdGVyXCIsXG4gIFwiZ3JlYXRlc3RcIixcbiAgXCJncm91cFwiLFxuICBcImdyb3VwZWRcIixcbiAgXCJncm91cGluZ1wiLFxuICBcImdyb3Vwc1wiLFxuICBcImhcIixcbiAgXCJoYWRcIixcbiAgXCJoYXNcIixcbiAgXCJoYXZlXCIsXG4gIFwiaGF2aW5nXCIsXG4gIFwiaGVcIixcbiAgXCJoZXJcIixcbiAgXCJoZXJlXCIsXG4gIFwiaGVyc2VsZlwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hlclwiLFxuICBcImhpZ2hlc3RcIixcbiAgXCJoaW1cIixcbiAgXCJoaW1zZWxmXCIsXG4gIFwiaGlzXCIsXG4gIFwiaG93XCIsXG4gIFwiaG93ZXZlclwiLFxuICBcImlcIixcbiAgXCJpZlwiLFxuICBcImltcG9ydGFudFwiLFxuICBcImluXCIsXG4gIFwiaW50ZXJlc3RcIixcbiAgXCJpbnRlcmVzdGVkXCIsXG4gIFwiaW50ZXJlc3RpbmdcIixcbiAgXCJpbnRlcmVzdHNcIixcbiAgXCJpbnRvXCIsXG4gIFwiaXNcIixcbiAgXCJpdFwiLFxuICBcIml0c1wiLFxuICBcIml0c2VsZlwiLFxuICBcImpcIixcbiAgXCJqdXN0XCIsXG4gIFwia1wiLFxuICBcImtlZXBcIixcbiAgXCJrZWVwc1wiLFxuICBcImtpbmRcIixcbiAgXCJrbmV3XCIsXG4gIFwia25vd1wiLFxuICBcImtub3duXCIsXG4gIFwia25vd3NcIixcbiAgXCJsXCIsXG4gIFwibGFyZ2VcIixcbiAgXCJsYXJnZWx5XCIsXG4gIFwibGFzdFwiLFxuICBcImxhdGVyXCIsXG4gIFwibGF0ZXN0XCIsXG4gIFwibGVhc3RcIixcbiAgXCJsZXNzXCIsXG4gIFwibGV0XCIsXG4gIFwibGV0c1wiLFxuICBcImxpa2VcIixcbiAgXCJsaWtlbHlcIixcbiAgXCJsb25nXCIsXG4gIFwibG9uZ2VyXCIsXG4gIFwibG9uZ2VzdFwiLFxuICBcIm1cIixcbiAgXCJtYWRlXCIsXG4gIFwibWFrZVwiLFxuICBcIm1ha2luZ1wiLFxuICBcIm1hblwiLFxuICBcIm1hbnlcIixcbiAgXCJtYXlcIixcbiAgXCJtZVwiLFxuICBcIm1lbWJlclwiLFxuICBcIm1lbWJlcnNcIixcbiAgXCJtZW5cIixcbiAgXCJtaWdodFwiLFxuICBcIm1vcmVcIixcbiAgXCJtb3N0XCIsXG4gIFwibW9zdGx5XCIsXG4gIFwibXJcIixcbiAgXCJtcnNcIixcbiAgXCJtdWNoXCIsXG4gIFwibXVzdFwiLFxuICBcIm15XCIsXG4gIFwibXlzZWxmXCIsXG4gIFwiblwiLFxuICBcIm5lY2Vzc2FyeVwiLFxuICBcIm5lZWRcIixcbiAgXCJuZWVkZWRcIixcbiAgXCJuZWVkaW5nXCIsXG4gIFwibmVlZHNcIixcbiAgXCJuZXZlclwiLFxuICBcIm5ld1wiLFxuICBcIm5ld1wiLFxuICBcIm5ld2VyXCIsXG4gIFwibmV3ZXN0XCIsXG4gIFwibmV4dFwiLFxuICBcIm5vXCIsXG4gIFwibm9ib2R5XCIsXG4gIFwibm9uXCIsXG4gIFwibm9vbmVcIixcbiAgXCJub3RcIixcbiAgXCJub3RoaW5nXCIsXG4gIFwibm93XCIsXG4gIFwibm93aGVyZVwiLFxuICBcIm51bWJlclwiLFxuICBcIm51bWJlcnNcIixcbiAgXCJvXCIsXG4gIFwib2ZcIixcbiAgXCJvZmZcIixcbiAgXCJvZnRlblwiLFxuICBcIm9sZFwiLFxuICBcIm9sZGVyXCIsXG4gIFwib2xkZXN0XCIsXG4gIFwib25cIixcbiAgXCJvbmNlXCIsXG4gIFwib25lXCIsXG4gIFwib25seVwiLFxuICBcIm9wZW5cIixcbiAgXCJvcGVuZWRcIixcbiAgXCJvcGVuaW5nXCIsXG4gIFwib3BlbnNcIixcbiAgXCJvclwiLFxuICBcIm9yZGVyXCIsXG4gIFwib3JkZXJlZFwiLFxuICBcIm9yZGVyaW5nXCIsXG4gIFwib3JkZXJzXCIsXG4gIFwib3RoZXJcIixcbiAgXCJvdGhlcnNcIixcbiAgXCJvdXJcIixcbiAgXCJvdXRcIixcbiAgXCJvdmVyXCIsXG4gIFwicFwiLFxuICBcInBhcnRcIixcbiAgXCJwYXJ0ZWRcIixcbiAgXCJwYXJ0aW5nXCIsXG4gIFwicGFydHNcIixcbiAgXCJwZXJcIixcbiAgXCJwZXJoYXBzXCIsXG4gIFwicGxhY2VcIixcbiAgXCJwbGFjZXNcIixcbiAgXCJwb2ludFwiLFxuICBcInBvaW50ZWRcIixcbiAgXCJwb2ludGluZ1wiLFxuICBcInBvaW50c1wiLFxuICBcInBvc3NpYmxlXCIsXG4gIFwicHJlc2VudFwiLFxuICBcInByZXNlbnRlZFwiLFxuICBcInByZXNlbnRpbmdcIixcbiAgXCJwcmVzZW50c1wiLFxuICBcInByb2JsZW1cIixcbiAgXCJwcm9ibGVtc1wiLFxuICBcInB1dFwiLFxuICBcInB1dHNcIixcbiAgXCJxXCIsXG4gIFwicXVpdGVcIixcbiAgXCJyXCIsXG4gIFwicmF0aGVyXCIsXG4gIFwicmVhbGx5XCIsXG4gIFwicmlnaHRcIixcbiAgXCJyaWdodFwiLFxuICBcInJvb21cIixcbiAgXCJyb29tc1wiLFxuICBcInNcIixcbiAgXCJzYWlkXCIsXG4gIFwic2FtZVwiLFxuICBcInNhd1wiLFxuICBcInNheVwiLFxuICBcInNheXNcIixcbiAgXCJzZWNvbmRcIixcbiAgXCJzZWNvbmRzXCIsXG4gIFwic2VlXCIsXG4gIFwic2VlbVwiLFxuICBcInNlZW1lZFwiLFxuICBcInNlZW1pbmdcIixcbiAgXCJzZWVtc1wiLFxuICBcInNlZXNcIixcbiAgXCJzZXZlcmFsXCIsXG4gIFwic2hhbGxcIixcbiAgXCJzaGVcIixcbiAgXCJzaG91bGRcIixcbiAgXCJzaG93XCIsXG4gIFwic2hvd2VkXCIsXG4gIFwic2hvd2luZ1wiLFxuICBcInNob3dzXCIsXG4gIFwic2lkZVwiLFxuICBcInNpZGVzXCIsXG4gIFwic2luY2VcIixcbiAgXCJzbWFsbFwiLFxuICBcInNtYWxsZXJcIixcbiAgXCJzbWFsbGVzdFwiLFxuICBcInNvXCIsXG4gIFwic29tZVwiLFxuICBcInNvbWVib2R5XCIsXG4gIFwic29tZW9uZVwiLFxuICBcInNvbWV0aGluZ1wiLFxuICBcInNvbWV3aGVyZVwiLFxuICBcInN0YXRlXCIsXG4gIFwic3RhdGVzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJzdGlsbFwiLFxuICBcInN1Y2hcIixcbiAgXCJzdXJlXCIsXG4gIFwidFwiLFxuICBcInRha2VcIixcbiAgXCJ0YWtlblwiLFxuICBcInRoYW5cIixcbiAgXCJ0aGF0XCIsXG4gIFwidGhlXCIsXG4gIFwidGhlaXJcIixcbiAgXCJ0aGVtXCIsXG4gIFwidGhlblwiLFxuICBcInRoZXJlXCIsXG4gIFwidGhlcmVmb3JlXCIsXG4gIFwidGhlc2VcIixcbiAgXCJ0aGV5XCIsXG4gIFwidGhpbmdcIixcbiAgXCJ0aGluZ3NcIixcbiAgXCJ0aGlua1wiLFxuICBcInRoaW5rc1wiLFxuICBcInRoaXNcIixcbiAgXCJ0aG9zZVwiLFxuICBcInRob3VnaFwiLFxuICBcInRob3VnaHRcIixcbiAgXCJ0aG91Z2h0c1wiLFxuICBcInRocmVlXCIsXG4gIFwidGhyb3VnaFwiLFxuICBcInRodXNcIixcbiAgXCJ0b1wiLFxuICBcInRvZGF5XCIsXG4gIFwidG9nZXRoZXJcIixcbiAgXCJ0b29cIixcbiAgXCJ0b29rXCIsXG4gIFwidG93YXJkXCIsXG4gIFwidHVyblwiLFxuICBcInR1cm5lZFwiLFxuICBcInR1cm5pbmdcIixcbiAgXCJ0dXJuc1wiLFxuICBcInR3b1wiLFxuICBcInVcIixcbiAgXCJ1bmRlclwiLFxuICBcInVudGlsXCIsXG4gIFwidXBcIixcbiAgXCJ1cG9uXCIsXG4gIFwidXNcIixcbiAgXCJ1c2VcIixcbiAgXCJ1c2VkXCIsXG4gIFwidXNlc1wiLFxuICBcInZcIixcbiAgXCJ2ZXJ5XCIsXG4gIFwid1wiLFxuICBcIndhbnRcIixcbiAgXCJ3YW50ZWRcIixcbiAgXCJ3YW50aW5nXCIsXG4gIFwid2FudHNcIixcbiAgXCJ3YXNcIixcbiAgXCJ3YXlcIixcbiAgXCJ3YXlzXCIsXG4gIFwid2VcIixcbiAgXCJ3ZWxsXCIsXG4gIFwid2VsbHNcIixcbiAgXCJ3ZW50XCIsXG4gIFwid2VyZVwiLFxuICBcIndoYXRcIixcbiAgXCJ3aGVuXCIsXG4gIFwid2hlcmVcIixcbiAgXCJ3aGV0aGVyXCIsXG4gIFwid2hpY2hcIixcbiAgXCJ3aGlsZVwiLFxuICBcIndob1wiLFxuICBcIndob2xlXCIsXG4gIFwid2hvc2VcIixcbiAgXCJ3aHlcIixcbiAgXCJ3aWxsXCIsXG4gIFwid2l0aFwiLFxuICBcIndpdGhpblwiLFxuICBcIndpdGhvdXRcIixcbiAgXCJ3b3JrXCIsXG4gIFwid29ya2VkXCIsXG4gIFwid29ya2luZ1wiLFxuICBcIndvcmtzXCIsXG4gIFwid291bGRcIixcbiAgXCJ4XCIsXG4gIFwieVwiLFxuICBcInllYXJcIixcbiAgXCJ5ZWFyc1wiLFxuICBcInlldFwiLFxuICBcInlvdVwiLFxuICBcInlvdW5nXCIsXG4gIFwieW91bmdlclwiLFxuICBcInlvdW5nZXN0XCIsXG4gIFwieW91clwiLFxuICBcInlvdXJzXCIsXG4gIFwielwiXG5dO1xuIiwiaW1wb3J0IHsgc3RvcFdvcmRzIH0gZnJvbSBcIi4vZW5nbGlzaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIG5vU3RvcFdvcmRzIH0gZnJvbSBcIi4vbm9yd2VnaWFuXCI7XG5pbXBvcnQgeyBzdG9wV29yZHMgYXMgbmxTdG9wV29yZHMgfSBmcm9tIFwiLi9kdXRjaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIGVzU3RvcFdvcmRzIH0gZnJvbSBcIi4vc3BhbmlzaFwiO1xuXG52YXIgc3RvcFdvcmRzRGljdGlvbmFyeTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PHN0cmluZz4gfSA9IHt9O1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcImVuXCJdID0gc3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcIm5vXCJdID0gbm9TdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wibmxcIl0gPSBubFN0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJlc1wiXSA9IGVzU3RvcFdvcmRzO1xuXG5leHBvcnQgdmFyIHRleHRIZWxwZXIgPSB7XG4gIGdldFN0b3BXb3JkczogKGxvY2FsZTogc3RyaW5nID0gXCJcIikgPT4ge1xuICAgIHJldHVybiBzdG9wV29yZHNEaWN0aW9uYXJ5W2xvY2FsZSB8fCBcImVuXCJdIHx8IFtdO1xuICB9LFxufTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFsbGVcIixcbiAgXCJhbmRyZVwiLFxuICBcImFyYmVpZFwiLFxuICBcImF0XCIsXG4gIFwiYXZcIixcbiAgXCJiYXJlXCIsXG4gIFwiYmVnZ2VcIixcbiAgXCJibGVcIixcbiAgXCJibGVpXCIsXG4gIFwiYmxpXCIsXG4gIFwiYmxpclwiLFxuICBcImJsaXR0XCIsXG4gIFwiYm9ydFwiLFxuICBcImJydWtlXCIsXG4gIFwiYsOlZGVcIixcbiAgXCJiw6VlXCIsXG4gIFwiZGFcIixcbiAgXCJkZVwiLFxuICBcImRlZ1wiLFxuICBcImRlaVwiLFxuICBcImRlaW1cIixcbiAgXCJkZWlyYVwiLFxuICBcImRlaXJlc1wiLFxuICBcImRlbVwiLFxuICBcImRlblwiLFxuICBcImRlbm5lXCIsXG4gIFwiZGVyXCIsXG4gIFwiZGVyZVwiLFxuICBcImRlcmVzXCIsXG4gIFwiZGV0XCIsXG4gIFwiZGV0dGVcIixcbiAgXCJkaVwiLFxuICBcImRpblwiLFxuICBcImRpc3NlXCIsXG4gIFwiZGl0dFwiLFxuICBcImR1XCIsXG4gIFwiZHlra1wiLFxuICBcImR5a2thclwiLFxuICBcImTDpVwiLFxuICBcImVnXCIsXG4gIFwiZWluXCIsXG4gIFwiZWl0XCIsXG4gIFwiZWl0dFwiLFxuICBcImVsbGVyXCIsXG4gIFwiZWxsZXNcIixcbiAgXCJlblwiLFxuICBcImVuZVwiLFxuICBcImVuZXN0ZVwiLFxuICBcImVuaHZlclwiLFxuICBcImVublwiLFxuICBcImVyXCIsXG4gIFwiZXRcIixcbiAgXCJldHRcIixcbiAgXCJldHRlclwiLFxuICBcImZvbGtcIixcbiAgXCJmb3JcIixcbiAgXCJmb3JkaVwiLFxuICBcImZvcnPDuGtlXCIsXG4gIFwiZnJhXCIsXG4gIFwiZsOlXCIsXG4gIFwiZsO4clwiLFxuICBcImbDuHJcIixcbiAgXCJmw7hyc3RcIixcbiAgXCJnam9yZGVcIixcbiAgXCJnasO4cmVcIixcbiAgXCJnb2RcIixcbiAgXCJnw6VcIixcbiAgXCJoYVwiLFxuICBcImhhZGRlXCIsXG4gIFwiaGFuXCIsXG4gIFwiaGFuc1wiLFxuICBcImhhclwiLFxuICBcImhlbm5hclwiLFxuICBcImhlbm5lXCIsXG4gIFwiaGVubmVzXCIsXG4gIFwiaGVyXCIsXG4gIFwiaGrDpVwiLFxuICBcImhvXCIsXG4gIFwiaG9lXCIsXG4gIFwiaG9ub21cIixcbiAgXCJob3NzXCIsXG4gIFwiaG9zc2VuXCIsXG4gIFwiaHVuXCIsXG4gIFwiaHZhXCIsXG4gIFwiaHZlbVwiLFxuICBcImh2ZXJcIixcbiAgXCJodmlsa2VcIixcbiAgXCJodmlsa2VuXCIsXG4gIFwiaHZpc1wiLFxuICBcImh2b3JcIixcbiAgXCJodm9yZGFuXCIsXG4gIFwiaHZvcmZvclwiLFxuICBcImlcIixcbiAgXCJpa2tlXCIsXG4gIFwiaWtramVcIixcbiAgXCJpbmdlblwiLFxuICBcImluZ2lcIixcbiAgXCJpbmtqZVwiLFxuICBcImlublwiLFxuICBcImlubmVuXCIsXG4gIFwiaW5uaVwiLFxuICBcImphXCIsXG4gIFwiamVnXCIsXG4gIFwia2FuXCIsXG4gIFwia29tXCIsXG4gIFwia29ybGVpc1wiLFxuICBcImtvcnNvXCIsXG4gIFwia3VuXCIsXG4gIFwia3VubmVcIixcbiAgXCJrdmFcIixcbiAgXCJrdmFyXCIsXG4gIFwia3ZhcmhlbHN0XCIsXG4gIFwia3ZlblwiLFxuICBcImt2aVwiLFxuICBcImt2aWZvclwiLFxuICBcImxhZ2VcIixcbiAgXCJsYW5nXCIsXG4gIFwibGlrXCIsXG4gIFwibGlrZVwiLFxuICBcIm1ha3RcIixcbiAgXCJtYW5cIixcbiAgXCJtYW5nZVwiLFxuICBcIm1lXCIsXG4gIFwibWVkXCIsXG4gIFwibWVkYW5cIixcbiAgXCJtZWdcIixcbiAgXCJtZWdldFwiLFxuICBcIm1lbGxvbVwiLFxuICBcIm1lblwiLFxuICBcIm1lbnNcIixcbiAgXCJtZXJcIixcbiAgXCJtZXN0XCIsXG4gIFwibWlcIixcbiAgXCJtaW5cIixcbiAgXCJtaW5lXCIsXG4gIFwibWl0dFwiLFxuICBcIm1vdFwiLFxuICBcIm15ZVwiLFxuICBcIm15a2plXCIsXG4gIFwibcOlXCIsXG4gIFwibcOldGVcIixcbiAgXCJuYXZuXCIsXG4gIFwibmVkXCIsXG4gIFwibmVpXCIsXG4gIFwibm9cIixcbiAgXCJub2VcIixcbiAgXCJub2VuXCIsXG4gIFwibm9rYVwiLFxuICBcIm5va29cIixcbiAgXCJub2tvblwiLFxuICBcIm5va29yXCIsXG4gIFwibm9rcmVcIixcbiAgXCJueVwiLFxuICBcIm7DpVwiLFxuICBcIm7DpXJcIixcbiAgXCJvZ1wiLFxuICBcIm9nc8OlXCIsXG4gIFwib21cIixcbiAgXCJvcHBcIixcbiAgXCJvc3NcIixcbiAgXCJvdmVyXCIsXG4gIFwicGFydFwiLFxuICBcInB1bmt0XCIsXG4gIFwicMOlXCIsXG4gIFwic2FtbWVcIixcbiAgXCJzZWdcIixcbiAgXCJzZWx2XCIsXG4gIFwic2lcIixcbiAgXCJzaWFcIixcbiAgXCJzaWRhblwiLFxuICBcInNpZGVuXCIsXG4gIFwic2luXCIsXG4gIFwic2luZVwiLFxuICBcInNpc3RcIixcbiAgXCJzaXR0XCIsXG4gIFwic2rDuGxcIixcbiAgXCJza2FsXCIsXG4gIFwic2t1bGxlXCIsXG4gIFwic2xpa1wiLFxuICBcInNsdXR0XCIsXG4gIFwic29cIixcbiAgXCJzb21cIixcbiAgXCJzb21tZVwiLFxuICBcInNvbXRcIixcbiAgXCJzdGFydFwiLFxuICBcInN0aWxsZVwiLFxuICBcInPDpVwiLFxuICBcInPDpW5uXCIsXG4gIFwidGlkXCIsXG4gIFwidGlsXCIsXG4gIFwidGlsYmFrZVwiLFxuICBcInRpbHN0YW5kXCIsXG4gIFwidW1cIixcbiAgXCJ1bmRlclwiLFxuICBcInVwcFwiLFxuICBcInV0XCIsXG4gIFwidXRlblwiLFxuICBcInZhclwiLFxuICBcInZhcnRcIixcbiAgXCJ2YXJ0ZVwiLFxuICBcInZlZFwiLFxuICBcInZlcmRpXCIsXG4gIFwidmVyZVwiLFxuICBcInZlcnRlXCIsXG4gIFwidmlcIixcbiAgXCJ2aWxcIixcbiAgXCJ2aWxsZVwiLFxuICBcInZpdGVcIixcbiAgXCJ2b3JlXCIsXG4gIFwidm9yc1wiLFxuICBcInZvcnRcIixcbiAgXCJ2w6VyXCIsXG4gIFwidsOmcmVcIixcbiAgXCJ2w6ZydFwiLFxuICBcInbDuHJlXCIsXG4gIFwidsO4cnRcIixcbiAgXCLDplwiLFxuICBcIsOlXCJcbl07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhXCIsXG4gIFwiYWN0dWFsbWVudGVcIixcbiAgXCJhZGVsYW50ZVwiLFxuICBcImFkZW3DoXNcIixcbiAgXCJhZmlybcOzXCIsXG4gIFwiYWdyZWfDs1wiLFxuICBcImFob3JhXCIsXG4gIFwiYWjDrVwiLFxuICBcImFsXCIsXG4gIFwiYWxnb1wiLFxuICBcImFsZ3VuYVwiLFxuICBcImFsZ3VuYXNcIixcbiAgXCJhbGd1bm9cIixcbiAgXCJhbGd1bm9zXCIsXG4gIFwiYWxnw7puXCIsXG4gIFwiYWxyZWRlZG9yXCIsXG4gIFwiYW1ib3NcIixcbiAgXCJhbXBsZWFtb3NcIixcbiAgXCJhbnRlXCIsXG4gIFwiYW50ZXJpb3JcIixcbiAgXCJhbnRlc1wiLFxuICBcImFwZW5hc1wiLFxuICBcImFwcm94aW1hZGFtZW50ZVwiLFxuICBcImFxdWVsXCIsXG4gIFwiYXF1ZWxsYXNcIixcbiAgXCJhcXVlbGxvc1wiLFxuICBcImFxdWlcIixcbiAgXCJhcXXDrVwiLFxuICBcImFycmliYVwiLFxuICBcImFzZWd1csOzXCIsXG4gIFwiYXPDrVwiLFxuICBcImF0cmFzXCIsXG4gIFwiYXVucXVlXCIsXG4gIFwiYXllclwiLFxuICBcImHDsWFkacOzXCIsXG4gIFwiYcO6blwiLFxuICBcImJham9cIixcbiAgXCJiYXN0YW50ZVwiLFxuICBcImJpZW5cIixcbiAgXCJidWVuXCIsXG4gIFwiYnVlbmFcIixcbiAgXCJidWVuYXNcIixcbiAgXCJidWVub1wiLFxuICBcImJ1ZW5vc1wiLFxuICBcImNhZGFcIixcbiAgXCJjYXNpXCIsXG4gIFwiY2VyY2FcIixcbiAgXCJjaWVydGFcIixcbiAgXCJjaWVydGFzXCIsXG4gIFwiY2llcnRvXCIsXG4gIFwiY2llcnRvc1wiLFxuICBcImNpbmNvXCIsXG4gIFwiY29tZW50w7NcIixcbiAgXCJjb21vXCIsXG4gIFwiY29uXCIsXG4gIFwiY29ub2NlclwiLFxuICBcImNvbnNlZ3VpbW9zXCIsXG4gIFwiY29uc2VndWlyXCIsXG4gIFwiY29uc2lkZXJhXCIsXG4gIFwiY29uc2lkZXLDs1wiLFxuICBcImNvbnNpZ29cIixcbiAgXCJjb25zaWd1ZVwiLFxuICBcImNvbnNpZ3VlblwiLFxuICBcImNvbnNpZ3Vlc1wiLFxuICBcImNvbnRyYVwiLFxuICBcImNvc2FzXCIsXG4gIFwiY3Jlb1wiLFxuICBcImN1YWxcIixcbiAgXCJjdWFsZXNcIixcbiAgXCJjdWFscXVpZXJcIixcbiAgXCJjdWFuZG9cIixcbiAgXCJjdWFudG9cIixcbiAgXCJjdWF0cm9cIixcbiAgXCJjdWVudGFcIixcbiAgXCJjw7Ntb1wiLFxuICBcImRhXCIsXG4gIFwiZGFkb1wiLFxuICBcImRhblwiLFxuICBcImRhclwiLFxuICBcImRlXCIsXG4gIFwiZGViZVwiLFxuICBcImRlYmVuXCIsXG4gIFwiZGViaWRvXCIsXG4gIFwiZGVjaXJcIixcbiAgXCJkZWrDs1wiLFxuICBcImRlbFwiLFxuICBcImRlbcOhc1wiLFxuICBcImRlbnRyb1wiLFxuICBcImRlc2RlXCIsXG4gIFwiZGVzcHXDqXNcIixcbiAgXCJkaWNlXCIsXG4gIFwiZGljZW5cIixcbiAgXCJkaWNob1wiLFxuICBcImRpZXJvblwiLFxuICBcImRpZmVyZW50ZVwiLFxuICBcImRpZmVyZW50ZXNcIixcbiAgXCJkaWplcm9uXCIsXG4gIFwiZGlqb1wiLFxuICBcImRpb1wiLFxuICBcImRvbmRlXCIsXG4gIFwiZG9zXCIsXG4gIFwiZHVyYW50ZVwiLFxuICBcImVcIixcbiAgXCJlamVtcGxvXCIsXG4gIFwiZWxcIixcbiAgXCJlbGxhXCIsXG4gIFwiZWxsYXNcIixcbiAgXCJlbGxvXCIsXG4gIFwiZWxsb3NcIixcbiAgXCJlbWJhcmdvXCIsXG4gIFwiZW1wbGVhaXNcIixcbiAgXCJlbXBsZWFuXCIsXG4gIFwiZW1wbGVhclwiLFxuICBcImVtcGxlYXNcIixcbiAgXCJlbXBsZW9cIixcbiAgXCJlblwiLFxuICBcImVuY2ltYVwiLFxuICBcImVuY3VlbnRyYVwiLFxuICBcImVudG9uY2VzXCIsXG4gIFwiZW50cmVcIixcbiAgXCJlcmFcIixcbiAgXCJlcmFpc1wiLFxuICBcImVyYW1vc1wiLFxuICBcImVyYW5cIixcbiAgXCJlcmFzXCIsXG4gIFwiZXJlc1wiLFxuICBcImVzXCIsXG4gIFwiZXNhXCIsXG4gIFwiZXNhc1wiLFxuICBcImVzZVwiLFxuICBcImVzb1wiLFxuICBcImVzb3NcIixcbiAgXCJlc3RhXCIsXG4gIFwiZXN0YWJhXCIsXG4gIFwiZXN0YWJhaXNcIixcbiAgXCJlc3RhYmFuXCIsXG4gIFwiZXN0YWJhc1wiLFxuICBcImVzdGFkXCIsXG4gIFwiZXN0YWRhXCIsXG4gIFwiZXN0YWRhc1wiLFxuICBcImVzdGFkb1wiLFxuICBcImVzdGFkb3NcIixcbiAgXCJlc3RhaXNcIixcbiAgXCJlc3RhbW9zXCIsXG4gIFwiZXN0YW5cIixcbiAgXCJlc3RhbmRvXCIsXG4gIFwiZXN0YXJcIixcbiAgXCJlc3RhcmVtb3NcIixcbiAgXCJlc3RhcsOhXCIsXG4gIFwiZXN0YXLDoW5cIixcbiAgXCJlc3RhcsOhc1wiLFxuICBcImVzdGFyw6lcIixcbiAgXCJlc3RhcsOpaXNcIixcbiAgXCJlc3RhcsOtYVwiLFxuICBcImVzdGFyw61haXNcIixcbiAgXCJlc3RhcsOtYW1vc1wiLFxuICBcImVzdGFyw61hblwiLFxuICBcImVzdGFyw61hc1wiLFxuICBcImVzdGFzXCIsXG4gIFwiZXN0ZVwiLFxuICBcImVzdGVtb3NcIixcbiAgXCJlc3RvXCIsXG4gIFwiZXN0b3NcIixcbiAgXCJlc3RveVwiLFxuICBcImVzdHV2ZVwiLFxuICBcImVzdHV2aWVyYVwiLFxuICBcImVzdHV2aWVyYWlzXCIsXG4gIFwiZXN0dXZpZXJhblwiLFxuICBcImVzdHV2aWVyYXNcIixcbiAgXCJlc3R1dmllcm9uXCIsXG4gIFwiZXN0dXZpZXNlXCIsXG4gIFwiZXN0dXZpZXNlaXNcIixcbiAgXCJlc3R1dmllc2VuXCIsXG4gIFwiZXN0dXZpZXNlc1wiLFxuICBcImVzdHV2aW1vc1wiLFxuICBcImVzdHV2aXN0ZVwiLFxuICBcImVzdHV2aXN0ZWlzXCIsXG4gIFwiZXN0dXZpw6lyYW1vc1wiLFxuICBcImVzdHV2acOpc2Vtb3NcIixcbiAgXCJlc3R1dm9cIixcbiAgXCJlc3TDoVwiLFxuICBcImVzdMOhYmFtb3NcIixcbiAgXCJlc3TDoWlzXCIsXG4gIFwiZXN0w6FuXCIsXG4gIFwiZXN0w6FzXCIsXG4gIFwiZXN0w6lcIixcbiAgXCJlc3TDqWlzXCIsXG4gIFwiZXN0w6luXCIsXG4gIFwiZXN0w6lzXCIsXG4gIFwiZXhcIixcbiAgXCJleGlzdGVcIixcbiAgXCJleGlzdGVuXCIsXG4gIFwiZXhwbGljw7NcIixcbiAgXCJleHByZXPDs1wiLFxuICBcImZpblwiLFxuICBcImZ1ZVwiLFxuICBcImZ1ZXJhXCIsXG4gIFwiZnVlcmFpc1wiLFxuICBcImZ1ZXJhblwiLFxuICBcImZ1ZXJhc1wiLFxuICBcImZ1ZXJvblwiLFxuICBcImZ1ZXNlXCIsXG4gIFwiZnVlc2Vpc1wiLFxuICBcImZ1ZXNlblwiLFxuICBcImZ1ZXNlc1wiLFxuICBcImZ1aVwiLFxuICBcImZ1aW1vc1wiLFxuICBcImZ1aXN0ZVwiLFxuICBcImZ1aXN0ZWlzXCIsXG4gIFwiZnXDqXJhbW9zXCIsXG4gIFwiZnXDqXNlbW9zXCIsXG4gIFwiZ3JhblwiLFxuICBcImdyYW5kZXNcIixcbiAgXCJndWVub1wiLFxuICBcImhhXCIsXG4gIFwiaGFiZXJcIixcbiAgXCJoYWJpZGFcIixcbiAgXCJoYWJpZGFzXCIsXG4gIFwiaGFiaWRvXCIsXG4gIFwiaGFiaWRvc1wiLFxuICBcImhhYmllbmRvXCIsXG4gIFwiaGFicmVtb3NcIixcbiAgXCJoYWJyw6FcIixcbiAgXCJoYWJyw6FuXCIsXG4gIFwiaGFicsOhc1wiLFxuICBcImhhYnLDqVwiLFxuICBcImhhYnLDqWlzXCIsXG4gIFwiaGFicsOtYVwiLFxuICBcImhhYnLDrWFpc1wiLFxuICBcImhhYnLDrWFtb3NcIixcbiAgXCJoYWJyw61hblwiLFxuICBcImhhYnLDrWFzXCIsXG4gIFwiaGFiw6lpc1wiLFxuICBcImhhYsOtYVwiLFxuICBcImhhYsOtYWlzXCIsXG4gIFwiaGFiw61hbW9zXCIsXG4gIFwiaGFiw61hblwiLFxuICBcImhhYsOtYXNcIixcbiAgXCJoYWNlXCIsXG4gIFwiaGFjZWlzXCIsXG4gIFwiaGFjZW1vc1wiLFxuICBcImhhY2VuXCIsXG4gIFwiaGFjZXJcIixcbiAgXCJoYWNlcmxvXCIsXG4gIFwiaGFjZXNcIixcbiAgXCJoYWNpYVwiLFxuICBcImhhY2llbmRvXCIsXG4gIFwiaGFnb1wiLFxuICBcImhhblwiLFxuICBcImhhc1wiLFxuICBcImhhc3RhXCIsXG4gIFwiaGF5XCIsXG4gIFwiaGF5YVwiLFxuICBcImhheWFtb3NcIixcbiAgXCJoYXlhblwiLFxuICBcImhheWFzXCIsXG4gIFwiaGF5w6Fpc1wiLFxuICBcImhlXCIsXG4gIFwiaGVjaG9cIixcbiAgXCJoZW1vc1wiLFxuICBcImhpY2llcm9uXCIsXG4gIFwiaGl6b1wiLFxuICBcImhveVwiLFxuICBcImh1YmVcIixcbiAgXCJodWJpZXJhXCIsXG4gIFwiaHViaWVyYWlzXCIsXG4gIFwiaHViaWVyYW5cIixcbiAgXCJodWJpZXJhc1wiLFxuICBcImh1Ymllcm9uXCIsXG4gIFwiaHViaWVzZVwiLFxuICBcImh1Ymllc2Vpc1wiLFxuICBcImh1Ymllc2VuXCIsXG4gIFwiaHViaWVzZXNcIixcbiAgXCJodWJpbW9zXCIsXG4gIFwiaHViaXN0ZVwiLFxuICBcImh1YmlzdGVpc1wiLFxuICBcImh1YmnDqXJhbW9zXCIsXG4gIFwiaHViacOpc2Vtb3NcIixcbiAgXCJodWJvXCIsXG4gIFwiaWd1YWxcIixcbiAgXCJpbmNsdXNvXCIsXG4gIFwiaW5kaWPDs1wiLFxuICBcImluZm9ybcOzXCIsXG4gIFwiaW50ZW50YVwiLFxuICBcImludGVudGFpc1wiLFxuICBcImludGVudGFtb3NcIixcbiAgXCJpbnRlbnRhblwiLFxuICBcImludGVudGFyXCIsXG4gIFwiaW50ZW50YXNcIixcbiAgXCJpbnRlbnRvXCIsXG4gIFwiaXJcIixcbiAgXCJqdW50b1wiLFxuICBcImxhXCIsXG4gIFwibGFkb1wiLFxuICBcImxhcmdvXCIsXG4gIFwibGFzXCIsXG4gIFwibGVcIixcbiAgXCJsZXNcIixcbiAgXCJsbGVnw7NcIixcbiAgXCJsbGV2YVwiLFxuICBcImxsZXZhclwiLFxuICBcImxvXCIsXG4gIFwibG9zXCIsXG4gIFwibHVlZ29cIixcbiAgXCJsdWdhclwiLFxuICBcIm1hbmVyYVwiLFxuICBcIm1hbmlmZXN0w7NcIixcbiAgXCJtYXlvclwiLFxuICBcIm1lXCIsXG4gIFwibWVkaWFudGVcIixcbiAgXCJtZWpvclwiLFxuICBcIm1lbmNpb27Ds1wiLFxuICBcIm1lbm9zXCIsXG4gIFwibWlcIixcbiAgXCJtaWVudHJhc1wiLFxuICBcIm1pb1wiLFxuICBcIm1pc1wiLFxuICBcIm1pc21hXCIsXG4gIFwibWlzbWFzXCIsXG4gIFwibWlzbW9cIixcbiAgXCJtaXNtb3NcIixcbiAgXCJtb2RvXCIsXG4gIFwibW9tZW50b1wiLFxuICBcIm11Y2hhXCIsXG4gIFwibXVjaGFzXCIsXG4gIFwibXVjaG9cIixcbiAgXCJtdWNob3NcIixcbiAgXCJtdXlcIixcbiAgXCJtw6FzXCIsXG4gIFwibcOtXCIsXG4gIFwibcOtYVwiLFxuICBcIm3DrWFzXCIsXG4gIFwibcOtb1wiLFxuICBcIm3DrW9zXCIsXG4gIFwibmFkYVwiLFxuICBcIm5hZGllXCIsXG4gIFwibmlcIixcbiAgXCJuaW5ndW5hXCIsXG4gIFwibmluZ3VuYXNcIixcbiAgXCJuaW5ndW5vXCIsXG4gIFwibmluZ3Vub3NcIixcbiAgXCJuaW5nw7puXCIsXG4gIFwibm9cIixcbiAgXCJub3NcIixcbiAgXCJub3NvdHJhc1wiLFxuICBcIm5vc290cm9zXCIsXG4gIFwibnVlc3RyYVwiLFxuICBcIm51ZXN0cmFzXCIsXG4gIFwibnVlc3Ryb1wiLFxuICBcIm51ZXN0cm9zXCIsXG4gIFwibnVldmFcIixcbiAgXCJudWV2YXNcIixcbiAgXCJudWV2b1wiLFxuICBcIm51ZXZvc1wiLFxuICBcIm51bmNhXCIsXG4gIFwib1wiLFxuICBcIm9jaG9cIixcbiAgXCJvc1wiLFxuICBcIm90cmFcIixcbiAgXCJvdHJhc1wiLFxuICBcIm90cm9cIixcbiAgXCJvdHJvc1wiLFxuICBcInBhcmFcIixcbiAgXCJwYXJlY2VcIixcbiAgXCJwYXJ0ZVwiLFxuICBcInBhcnRpclwiLFxuICBcInBhc2FkYVwiLFxuICBcInBhc2Fkb1wiLFxuICBcInBlcm9cIixcbiAgXCJwZXNhclwiLFxuICBcInBvY2FcIixcbiAgXCJwb2Nhc1wiLFxuICBcInBvY29cIixcbiAgXCJwb2Nvc1wiLFxuICBcInBvZGVpc1wiLFxuICBcInBvZGVtb3NcIixcbiAgXCJwb2RlclwiLFxuICBcInBvZHJpYVwiLFxuICBcInBvZHJpYWlzXCIsXG4gIFwicG9kcmlhbW9zXCIsXG4gIFwicG9kcmlhblwiLFxuICBcInBvZHJpYXNcIixcbiAgXCJwb2Ryw6FcIixcbiAgXCJwb2Ryw6FuXCIsXG4gIFwicG9kcsOtYVwiLFxuICBcInBvZHLDrWFuXCIsXG4gIFwicG9uZXJcIixcbiAgXCJwb3JcIixcbiAgXCJwb3IgcXXDqVwiLFxuICBcInBvcnF1ZVwiLFxuICBcInBvc2libGVcIixcbiAgXCJwcmltZXJcIixcbiAgXCJwcmltZXJhXCIsXG4gIFwicHJpbWVyb1wiLFxuICBcInByaW1lcm9zXCIsXG4gIFwicHJpbmNpcGFsbWVudGVcIixcbiAgXCJwcm9waWFcIixcbiAgXCJwcm9waWFzXCIsXG4gIFwicHJvcGlvXCIsXG4gIFwicHJvcGlvc1wiLFxuICBcInByw7N4aW1vXCIsXG4gIFwicHLDs3hpbW9zXCIsXG4gIFwicHVkb1wiLFxuICBcInB1ZWRhXCIsXG4gIFwicHVlZGVcIixcbiAgXCJwdWVkZW5cIixcbiAgXCJwdWVkb1wiLFxuICBcInB1ZXNcIixcbiAgXCJxdWVcIixcbiAgXCJxdWVkw7NcIixcbiAgXCJxdWVyZW1vc1wiLFxuICBcInF1aWVuXCIsXG4gIFwicXVpZW5lc1wiLFxuICBcInF1aWVyZVwiLFxuICBcInF1acOpblwiLFxuICBcInF1w6lcIixcbiAgXCJyZWFsaXphZG9cIixcbiAgXCJyZWFsaXphclwiLFxuICBcInJlYWxpesOzXCIsXG4gIFwicmVzcGVjdG9cIixcbiAgXCJzYWJlXCIsXG4gIFwic2FiZWlzXCIsXG4gIFwic2FiZW1vc1wiLFxuICBcInNhYmVuXCIsXG4gIFwic2FiZXJcIixcbiAgXCJzYWJlc1wiLFxuICBcInNlXCIsXG4gIFwic2VhXCIsXG4gIFwic2VhbW9zXCIsXG4gIFwic2VhblwiLFxuICBcInNlYXNcIixcbiAgXCJzZWd1bmRhXCIsXG4gIFwic2VndW5kb1wiLFxuICBcInNlZ8O6blwiLFxuICBcInNlaXNcIixcbiAgXCJzZXJcIixcbiAgXCJzZXJlbW9zXCIsXG4gIFwic2Vyw6FcIixcbiAgXCJzZXLDoW5cIixcbiAgXCJzZXLDoXNcIixcbiAgXCJzZXLDqVwiLFxuICBcInNlcsOpaXNcIixcbiAgXCJzZXLDrWFcIixcbiAgXCJzZXLDrWFpc1wiLFxuICBcInNlcsOtYW1vc1wiLFxuICBcInNlcsOtYW5cIixcbiAgXCJzZXLDrWFzXCIsXG4gIFwic2XDoWlzXCIsXG4gIFwic2XDsWFsw7NcIixcbiAgXCJzaVwiLFxuICBcInNpZG9cIixcbiAgXCJzaWVtcHJlXCIsXG4gIFwic2llbmRvXCIsXG4gIFwic2lldGVcIixcbiAgXCJzaWd1ZVwiLFxuICBcInNpZ3VpZW50ZVwiLFxuICBcInNpblwiLFxuICBcInNpbm9cIixcbiAgXCJzb2JyZVwiLFxuICBcInNvaXNcIixcbiAgXCJzb2xhXCIsXG4gIFwic29sYW1lbnRlXCIsXG4gIFwic29sYXNcIixcbiAgXCJzb2xvXCIsXG4gIFwic29sb3NcIixcbiAgXCJzb21vc1wiLFxuICBcInNvblwiLFxuICBcInNveVwiLFxuICBcInN1XCIsXG4gIFwic3VzXCIsXG4gIFwic3V5YVwiLFxuICBcInN1eWFzXCIsXG4gIFwic3V5b1wiLFxuICBcInN1eW9zXCIsXG4gIFwic8OtXCIsXG4gIFwic8OzbG9cIixcbiAgXCJ0YWxcIixcbiAgXCJ0YW1iacOpblwiLFxuICBcInRhbXBvY29cIixcbiAgXCJ0YW5cIixcbiAgXCJ0YW50b1wiLFxuICBcInRlXCIsXG4gIFwidGVuZHJlbW9zXCIsXG4gIFwidGVuZHLDoVwiLFxuICBcInRlbmRyw6FuXCIsXG4gIFwidGVuZHLDoXNcIixcbiAgXCJ0ZW5kcsOpXCIsXG4gIFwidGVuZHLDqWlzXCIsXG4gIFwidGVuZHLDrWFcIixcbiAgXCJ0ZW5kcsOtYWlzXCIsXG4gIFwidGVuZHLDrWFtb3NcIixcbiAgXCJ0ZW5kcsOtYW5cIixcbiAgXCJ0ZW5kcsOtYXNcIixcbiAgXCJ0ZW5lZFwiLFxuICBcInRlbmVpc1wiLFxuICBcInRlbmVtb3NcIixcbiAgXCJ0ZW5lclwiLFxuICBcInRlbmdhXCIsXG4gIFwidGVuZ2Ftb3NcIixcbiAgXCJ0ZW5nYW5cIixcbiAgXCJ0ZW5nYXNcIixcbiAgXCJ0ZW5nb1wiLFxuICBcInRlbmfDoWlzXCIsXG4gIFwidGVuaWRhXCIsXG4gIFwidGVuaWRhc1wiLFxuICBcInRlbmlkb1wiLFxuICBcInRlbmlkb3NcIixcbiAgXCJ0ZW5pZW5kb1wiLFxuICBcInRlbsOpaXNcIixcbiAgXCJ0ZW7DrWFcIixcbiAgXCJ0ZW7DrWFpc1wiLFxuICBcInRlbsOtYW1vc1wiLFxuICBcInRlbsOtYW5cIixcbiAgXCJ0ZW7DrWFzXCIsXG4gIFwidGVyY2VyYVwiLFxuICBcInRpXCIsXG4gIFwidGllbXBvXCIsXG4gIFwidGllbmVcIixcbiAgXCJ0aWVuZW5cIixcbiAgXCJ0aWVuZXNcIixcbiAgXCJ0b2RhXCIsXG4gIFwidG9kYXNcIixcbiAgXCJ0b2RhdsOtYVwiLFxuICBcInRvZG9cIixcbiAgXCJ0b2Rvc1wiLFxuICBcInRvdGFsXCIsXG4gIFwidHJhYmFqYVwiLFxuICBcInRyYWJhamFpc1wiLFxuICBcInRyYWJhamFtb3NcIixcbiAgXCJ0cmFiYWphblwiLFxuICBcInRyYWJhamFyXCIsXG4gIFwidHJhYmFqYXNcIixcbiAgXCJ0cmFiYWpvXCIsXG4gIFwidHJhc1wiLFxuICBcInRyYXRhXCIsXG4gIFwidHJhdsOpc1wiLFxuICBcInRyZXNcIixcbiAgXCJ0dVwiLFxuICBcInR1c1wiLFxuICBcInR1dmVcIixcbiAgXCJ0dXZpZXJhXCIsXG4gIFwidHV2aWVyYWlzXCIsXG4gIFwidHV2aWVyYW5cIixcbiAgXCJ0dXZpZXJhc1wiLFxuICBcInR1dmllcm9uXCIsXG4gIFwidHV2aWVzZVwiLFxuICBcInR1dmllc2Vpc1wiLFxuICBcInR1dmllc2VuXCIsXG4gIFwidHV2aWVzZXNcIixcbiAgXCJ0dXZpbW9zXCIsXG4gIFwidHV2aXN0ZVwiLFxuICBcInR1dmlzdGVpc1wiLFxuICBcInR1dmnDqXJhbW9zXCIsXG4gIFwidHV2acOpc2Vtb3NcIixcbiAgXCJ0dXZvXCIsXG4gIFwidHV5YVwiLFxuICBcInR1eWFzXCIsXG4gIFwidHV5b1wiLFxuICBcInR1eW9zXCIsXG4gIFwidMO6XCIsXG4gIFwidWx0aW1vXCIsXG4gIFwidW5cIixcbiAgXCJ1bmFcIixcbiAgXCJ1bmFzXCIsXG4gIFwidW5vXCIsXG4gIFwidW5vc1wiLFxuICBcInVzYVwiLFxuICBcInVzYWlzXCIsXG4gIFwidXNhbW9zXCIsXG4gIFwidXNhblwiLFxuICBcInVzYXJcIixcbiAgXCJ1c2FzXCIsXG4gIFwidXNvXCIsXG4gIFwidXN0ZWRcIixcbiAgXCJ2YVwiLFxuICBcInZhaXNcIixcbiAgXCJ2YWxvclwiLFxuICBcInZhbW9zXCIsXG4gIFwidmFuXCIsXG4gIFwidmFyaWFzXCIsXG4gIFwidmFyaW9zXCIsXG4gIFwidmF5YVwiLFxuICBcInZlY2VzXCIsXG4gIFwidmVyXCIsXG4gIFwidmVyZGFkXCIsXG4gIFwidmVyZGFkZXJhXCIsXG4gIFwidmVyZGFkZXJvXCIsXG4gIFwidmV6XCIsXG4gIFwidm9zb3RyYXNcIixcbiAgXCJ2b3NvdHJvc1wiLFxuICBcInZveVwiLFxuICBcInZ1ZXN0cmFcIixcbiAgXCJ2dWVzdHJhc1wiLFxuICBcInZ1ZXN0cm9cIixcbiAgXCJ2dWVzdHJvc1wiLFxuICBcInlcIixcbiAgXCJ5YVwiLFxuICBcInlvXCIsXG4gIFwiw6lsXCIsXG4gIFwiw6lyYW1vc1wiLFxuICBcIsOpc3RhXCIsXG4gIFwiw6lzdGFzXCIsXG4gIFwiw6lzdGVcIixcbiAgXCLDqXN0b3NcIixcbiAgXCLDumx0aW1hXCIsXG4gIFwiw7psdGltYXNcIixcbiAgXCLDumx0aW1vXCIsXG4gIFwiw7psdGltb3NcIlxuXTsiLCJpbXBvcnQgeyBRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4uL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgdGV4dEhlbHBlciB9IGZyb20gXCIuL3N0b3B3b3Jkcy9pbmRleFwiO1xuaW1wb3J0IFdvcmRDbG91ZExpYiBmcm9tIFwid29yZGNsb3VkXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmRDbG91ZEFkYXB0ZXIge1xuICBwcml2YXRlIF93b3JkY2xvdWQ6IGFueTtcblxuICBwdWJsaWMgc3RhdGljIGRyYXdPdXRPZkJvdW5kID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgc2hyaW5rVG9GaXQgPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIGFib3J0VGhyZXNob2xkOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgd2VpZ2h0RmFjdG9yID0gMjA7XG5cbiAgcHVibGljIHN0YXRpYyBvbldvcmRjbG91ZENyZWF0aW5nID0gbmV3IEV2ZW50PFxuICAgICAgKHNlbmRlcjogV29yZENsb3VkLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICAgIFdvcmRDbG91ZCxcbiAgICAgIGFueVxuICAgID4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBXb3JkQ2xvdWQpIHt9XG5cbiAgcHVibGljIGdldCB3b3JkY2xvdWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5tb2RlbC5nZXREYXRhKCk7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjYW52YXNOb2RlID0gPEhUTUxDYW52YXNFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiwgXCJcIilcbiAgICApO1xuICAgIGNvbnN0IGVtcHR5VGV4dE5vZGUgPSA8SFRNTEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInBcIiwgXCJcIiwge1xuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2FudmFzTm9kZSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBsaXN0OiBkYXRhLFxuICAgICAgd2VpZ2h0RmFjdG9yOiBXb3JkQ2xvdWRBZGFwdGVyLndlaWdodEZhY3RvcixcbiAgICAgIGFib3J0VGhyZXNob2xkOiBXb3JkQ2xvdWRBZGFwdGVyLmFib3J0VGhyZXNob2xkLFxuICAgICAgZHJhd091dE9mQm91bmQ6IFdvcmRDbG91ZEFkYXB0ZXIuZHJhd091dE9mQm91bmQsXG4gICAgICBzaHJpbmtUb0ZpdDogV29yZENsb3VkQWRhcHRlci5zaHJpbmtUb0ZpdCxcbiAgICAgIGZvbnRGYW1pbHk6IFwiU2Vnb2UgVUkgQm9sZCwgc2Fucy1zZXJpZlwiLFxuICAgICAgY29sb3I6ICh3b3JkOiBzdHJpbmcsIHdlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmdldFJhbmRvbUNvbG9yKCk7XG4gICAgICB9LFxuICAgICAgcm90YXRlUmF0aW86IDAuNSxcbiAgICAgIHJvdGF0aW9uU3RlcHM6IDIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgY2xpY2s6IGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coaXRlbVswXSArIFwiOiBcIiArIGl0ZW1bMV0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNhbnZhczogY2FudmFzTm9kZSxcbiAgICAgIGNvbmZpZ1xuICAgIH07XG4gICAgV29yZENsb3VkQWRhcHRlci5vbldvcmRjbG91ZENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG4gICAgdGhpcy5fd29yZGNsb3VkID0gV29yZENsb3VkTGliKG9wdGlvbnMuY2FudmFzLCBvcHRpb25zLmNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLl93b3JkY2xvdWQ7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29yZENsb3VkIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcml2YXRlIF93b3JkY2xvdWRBZGFwdGVyOiBXb3JkQ2xvdWRBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIndvcmRjbG91ZFwiKTtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyID0gbmV3IFdvcmRDbG91ZEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBnZXREYXRhKCkge1xuICAgIGxldCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgIGxldCBzdG9wV29yZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbG9jYWxlID0gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMobG9jYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMoKTtcbiAgICB9XG5cbiAgICBsZXQgc3RvcFRoZVdvcmQgPSAod29yZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc3RvcFdvcmRzLmluZGV4T2Yod29yZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmQ7XG4gICAgfTtcblxuICAgIGxldCBwcm9jZXNzU3RyaW5nID0gKHJvdzogc3RyaW5nKSA9PiB7XG4gICAgICByb3cgPSBcIlwiICsgcm93O1xuXG4gICAgICBpZiAocm93Lmxlbmd0aCA+IDE1KSByb3cgPSByb3cuc3Vic3RyaW5nKDAsIDE0KSArIFwiLi4uXCI7XG5cbiAgICAgIGlmICghIXJvdykge1xuICAgICAgICByb3cuc3BsaXQoXCIgXCIpLmZvckVhY2goKHdvcmQpID0+IHtcbiAgICAgICAgICB3b3JkID0gc3RvcFRoZVdvcmQod29yZC50b0xvd2VyQ2FzZSgpIHx8IFwiXCIpO1xuICAgICAgICAgIGlmICghIXdvcmQpIHtcbiAgICAgICAgICAgIGlmICghcmVzdWx0W3dvcmRdKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFt3b3JkXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRbd29yZF0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dWYWx1ZSkpIHtcbiAgICAgICAgICByb3dWYWx1ZS5mb3JFYWNoKHByb2Nlc3NTdHJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5mb3JFYWNoKChrZXkpID0+XG4gICAgICAgICAgICAgIHByb2Nlc3NTdHJpbmcocm93VmFsdWVba2V5XSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2Nlc3NTdHJpbmcocm93VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiBba2V5LCByZXN1bHRba2V5XV07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fd29yZGNsb3VkQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0ZXh0XCIsIFdvcmRDbG91ZCk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjb21tZW50XCIsIFdvcmRDbG91ZCk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtdWx0aXBsZXRleHRcIiwgV29yZENsb3VkKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9wbG90bHlfanNfZGlzdF9taW5fXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2NvcmVfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfd29yZGNsb3VkX187Il0sInNvdXJjZVJvb3QiOiIifQ==
14799
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcG9ydHVndWVzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUuc2Nzcz9hNjhlIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9jaG9pY2VzLXRhYmxlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9kYXRhUHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2VudHJpZXMvc3VtbWFyeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZmlsdGVySW5mby50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9sYXlvdXRFbmdpbmUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xvY2FsaXphdGlvbk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4RHJvcGRvd25Hcm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9udW1iZXIudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9ib29sZWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaGlzdG9ncmFtLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9tYXRyaXhkcm9wZG93bi1ncm91cGVkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmFua2luZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3JhdGluZy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NlbGVjdEJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9zZXR1cC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC5zY3NzPzJjNGUiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3RleHQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3V0aWxzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWFuYWdlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHluYW1pYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnNjc3M/M2M4MiIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXphdGlvblBhbmVsLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyQmFzZS5zY3NzP2FmYmQiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2luZGV4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvd29yZGNsb3VkL3N0b3B3b3Jkcy9zcGFuaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvd29yZGNsb3VkLnRzIiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJQbG90bHlcIixcImNvbW1vbmpzMlwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJjb21tb25qc1wiOlwicGxvdGx5LmpzLWRpc3QtbWluXCIsXCJhbWRcIjpcInBsb3RseS5qcy1kaXN0LW1pblwifSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdL2V4dGVybmFsIHtcInJvb3RcIjpcIldvcmRDbG91ZFwiLFwiY29tbW9uanMyXCI6XCJ3b3JkY2xvdWRcIixcImNvbW1vbmpzXCI6XCJ3b3JkY2xvdWRcIixcImFtZFwiOlwid29yZGNsb3VkXCJ9Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSw0Q0FBNEMsZ3VFOzs7Ozs7Ozs7OztBQ0E1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsS0FBNEQ7QUFDOUQsRUFBRSxTQUNtRDtBQUNyRCxDQUFDLG9CQUFvQjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLGFBQWE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxFQUFFO0FBQ2Ys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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQ0FBaUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxxQ0FBcUM7QUFDbEQsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsc0JBQXNCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQix5REFBeUQ7QUFDeEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIseURBQXlEO0FBQ25GOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsS0FBSztBQUNsQixhQUFhLE9BQU87QUFDcEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZixhQUFhLEVBQUU7QUFDZixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsb0JBQW9CO0FBQ2pDLGFBQWEsWUFBWTtBQUN6QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQix3REFBd0Q7QUFDdkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0RBQXdEO0FBQy9FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUF3RDtBQUN4Rjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhLE9BQU87QUFDcEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQixhQUFhLFlBQVk7QUFDekIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpQkFBaUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxHQUFHO0lBQ0gsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLElBQUk7SUFDSixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLFNBQVM7SUFDVCxVQUFVO0lBQ1YsSUFBSTtJQUNKLE9BQU87SUFDUCxLQUFLO0lBQ0wsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sR0FBRztJQUNILEdBQUc7Q0FDSixDQUFDOzs7Ozs7Ozs7Ozs7O0FDNU5GO0FBQUE7QUFBTyxJQUFJLFNBQVMsR0FBRztJQUNyQixLQUFLO0lBQ0wsR0FBRztJQUNILGFBQWE7SUFDYixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLGlCQUFpQjtJQUNqQixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxhQUFhO0lBQ2IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxZQUFZO0lBQ1osU0FBUztJQUNULE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxTQUFTO0lBQ1QsR0FBRztJQUNILFNBQVM7SUFDVCxJQUFJO0lBQ0osTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLElBQUk7SUFDSixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLGFBQWE7SUFDYixZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWixZQUFZO0lBQ1osV0FBVztJQUNYLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLGNBQWM7SUFDZCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsSUFBSTtJQUNKLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLElBQUk7SUFDSixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxJQUFJO0lBQ0osT0FBTztJQUNQLElBQUk7SUFDSixNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLE9BQU87SUFDUCxJQUFJO0lBQ0osVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLElBQUk7SUFDSixVQUFVO0lBQ1YsS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsSUFBSTtJQUNKLEtBQUs7SUFDTCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLEdBQUc7SUFDSCxNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLEtBQUs7SUFDTCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixXQUFXO0lBQ1gsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVB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Ozs7QUNBQSx1RCIsImZpbGUiOiJzdXJ2ZXkuYW5hbHl0aWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicGxvdGx5LmpzLWRpc3QtbWluXCIpLCByZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJ3b3JkY2xvdWRcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlBbmFseXRpY3NcIiwgW1wicGxvdGx5LmpzLWRpc3QtbWluXCIsIFwic3VydmV5LWNvcmVcIiwgXCJ3b3JkY2xvdWRcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5QW5hbHl0aWNzXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicGxvdGx5LmpzLWRpc3QtbWluXCIpLCByZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJ3b3JkY2xvdWRcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleUFuYWx5dGljc1wiXSA9IGZhY3Rvcnkocm9vdFtcIlBsb3RseVwiXSwgcm9vdFtcIlN1cnZleVwiXSwgcm9vdFtcIldvcmRDbG91ZFwiXSk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2NvcmVfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV93b3JkY2xvdWRfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2VudHJpZXMvc3VtbWFyeS50c1wiKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHN0eWxlPVxcXCJkaXNwbGF5Om5vbmU7XFxcIj48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kZXRhaWxcXFwiPjxjaXJjbGUgY3g9XFxcIjEuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCI4LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1kcmFnXFxcIj48cGF0aCBkPVxcXCJNMTMgNWwtMSAxIDEgMUg5VjNsMSAxIDEtMS0zLTMtMyAzIDEgMSAxLTF2NEgzbDEtMS0xLTEtMyAzIDMgMyAxLTEtMS0xaDR2NGwtMS0xLTEgMSAzIDMgMy0zLTEtMS0xIDFWOWg0bC0xIDEgMSAxIDMtM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1oaWRlXFxcIj48cGF0aCBkPVxcXCJNMTIuNzkgNC4yTDE2IDFsLTEtMS0zLjMyIDMuMzJDMTAuNTcgMi41NSA5LjMyIDIgOCAyIDMuNjMgMiAwIDcuOTcgMCA3Ljk3czEuMjcgMi4xIDMuMjEgMy44MmwtMy4yMyAzLjIzLjk4Ljk4IDMuMzUtMy4zNEM1LjQxIDEzLjQ0IDYuNjcgMTQgOCAxNGM0LjM3IDAgOC02IDgtNnMtMS4yNy0yLjA5LTMuMjEtMy44ek0yIDcuOTdjMS4wNy0xLjQ3IDMuNjEtNCA2LTQgLjggMCAxLjYuMjcgMi4zNS42OGwtLjc4Ljc4Yy0uNDYtLjI5LS45OS0uNDYtMS41Ny0uNDYtMS42NiAwLTMgMS4zNC0zIDMgMCAuNTguMTcgMS4xMS40NiAxLjU3bC0uOTcuOTdBMTMuMzggMTMuMzggMCAwIDEgMiA3Ljk3em02IDRjLS44IDAtMS41OS0uMjctMi4zMy0uNjdsLjc4LS43N2MuNDUuMjcuOTguNDQgMS41NS40NCAxLjY2IDAgMy0xLjM0IDMtMyAwLS41Ny0uMTctMS4wOS0uNDQtMS41NWwuOTgtLjk4YzEuMTEuODcgMi4wMSAxLjkxIDIuNDYgMi41Mi0xLjA3IDEuNDgtMy42MSA0LjAxLTYgNC4wMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHJpdmF0ZVxcXCI+PGNpcmNsZSBjeD1cXFwiOFxcXCIgY3k9XFxcIjRcXFwiIHI9XFxcIjNcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk04IDhjLTMuMzEgMC02IDIuNzMtNiA0LjY3UzUuMjcgMTUgOCAxNXM2LS40IDYtMi4zM1MxMS4zMSA4IDggOHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tYWtlcHVibGljXFxcIj48Y2lyY2xlIGN4PVxcXCI2XFxcIiBjeT1cXFwiNVxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEwIDVjMCAuMzQtLjA2LjY3LS4xNC45OS4wNSAwIC4wOS4wMS4xNC4wMSAxLjY2IDAgMy0xLjM0IDMtM3MtMS4zNC0zLTMtM0M4Ljk3IDAgOC4wNy41MiA3LjUzIDEuMyA4Ljk4IDEuOTEgMTAgMy4zMyAxMCA1ek02IDljLTMuMzEgMC02IDIuNzMtNiA0LjY3UzMuMjcgMTYgNiAxNnM2LS40IDYtMi4zM1M5LjMxIDkgNiA5ek0xMCA3Yy0uMTkgMC0uMzguMDEtLjU3LjAzYTQuMTQgNC4xNCAwIDAgMS0xLjM3IDEuMzljMyAuODMgNS4yMyAzLjMxIDUuNDIgNS4yOCAxLjQ0LS4zMSAyLjUyLS45MiAyLjUyLTIuMDNDMTYgOS43NCAxMy4zMSA3IDEwIDd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbW92ZXRvZGV0YWlsc1xcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiMTQuNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjEzLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk0xMiAxaDN2OWgtM3pNMi4wMiA3LjAyTDEgNiAwIDdsMyAzIDMtMy0xLTEtLjk0Ljk0QzQuMzMgNC43MyA2LjIxIDMgOC41IDNjLjE3IDAgLjMzLjAzLjUuMDVWMS4wM0M4LjgzIDEuMDEgOC42NyAxIDguNSAxIDUuMDggMSAyLjI3IDMuNjYgMi4wMiA3LjAyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW5vbmNvbW1lcmNpYWxcXFwiPjxwYXRoIGQ9XFxcIk04IDBMMCAxNWgxNkw4IDB6bTEgMTNIN3YtMmgydjJ6bS0yLTNWNWgydjVIN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1zb3J0aW5nXFxcIj48cGF0aCBkPVxcXCJNOCAzbDIgMiAxLTEtMy0zLTMgMyAxIDF6TTggMTNsLTItMi0xIDEgMyAzIDMtMy0xLTF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PC9zdmc+XCI7IiwiLyoqXG4qIE11dXJpIHYwLjguMFxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmlcbiogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEhhbHR1IE95XG4qIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuKiBodHRwczovL2dpdGh1Yi5jb20vaGFsdHUvbXV1cmkvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgUGFja2VyXG4qIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbipcbiogTXV1cmkgVGlja2VyIC8gTXV1cmkgRW1pdHRlciAvIE11dXJpIFF1ZXVlXG4qIENvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50LCBOaWtsYXMgUsOkbcO2IDxpbnJhbW9AZ21haWwuY29tPlxuKiBAbGljZW5zZSBNSVRcbiovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTXV1cmkgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbmFtZXNwYWNlID0gJ011dXJpJztcbiAgdmFyIGdyaWRJbnN0YW5jZXMgPSB7fTtcblxuICB2YXIgYWN0aW9uU3dhcCA9ICdzd2FwJztcbiAgdmFyIGFjdGlvbk1vdmUgPSAnbW92ZSc7XG5cbiAgdmFyIGV2ZW50U3luY2hyb25pemUgPSAnc3luY2hyb25pemUnO1xuICB2YXIgZXZlbnRMYXlvdXRTdGFydCA9ICdsYXlvdXRTdGFydCc7XG4gIHZhciBldmVudExheW91dEVuZCA9ICdsYXlvdXRFbmQnO1xuICB2YXIgZXZlbnRBZGQgPSAnYWRkJztcbiAgdmFyIGV2ZW50UmVtb3ZlID0gJ3JlbW92ZSc7XG4gIHZhciBldmVudFNob3dTdGFydCA9ICdzaG93U3RhcnQnO1xuICB2YXIgZXZlbnRTaG93RW5kID0gJ3Nob3dFbmQnO1xuICB2YXIgZXZlbnRIaWRlU3RhcnQgPSAnaGlkZVN0YXJ0JztcbiAgdmFyIGV2ZW50SGlkZUVuZCA9ICdoaWRlRW5kJztcbiAgdmFyIGV2ZW50RmlsdGVyID0gJ2ZpbHRlcic7XG4gIHZhciBldmVudFNvcnQgPSAnc29ydCc7XG4gIHZhciBldmVudE1vdmUgPSAnbW92ZSc7XG4gIHZhciBldmVudFNlbmQgPSAnc2VuZCc7XG4gIHZhciBldmVudEJlZm9yZVNlbmQgPSAnYmVmb3JlU2VuZCc7XG4gIHZhciBldmVudFJlY2VpdmUgPSAncmVjZWl2ZSc7XG4gIHZhciBldmVudEJlZm9yZVJlY2VpdmUgPSAnYmVmb3JlUmVjZWl2ZSc7XG4gIHZhciBldmVudERyYWdJbml0ID0gJ2RyYWdJbml0JztcbiAgdmFyIGV2ZW50RHJhZ1N0YXJ0ID0gJ2RyYWdTdGFydCc7XG4gIHZhciBldmVudERyYWdNb3ZlID0gJ2RyYWdNb3ZlJztcbiAgdmFyIGV2ZW50RHJhZ1Njcm9sbCA9ICdkcmFnU2Nyb2xsJztcbiAgdmFyIGV2ZW50RHJhZ0VuZCA9ICdkcmFnRW5kJztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VTdGFydCA9ICdkcmFnUmVsZWFzZVN0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ1JlbGVhc2VFbmQgPSAnZHJhZ1JlbGVhc2VFbmQnO1xuICB2YXIgZXZlbnREZXN0cm95ID0gJ2Rlc3Ryb3knO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVyIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgcXVldWUgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XSA9IFtdO1xuXG4gICAgLy8gQWRkIHRoZSBsaXN0ZW5lciB0byB0aGUgcXVldWUuXG4gICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBhbGwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2xpc3RlbmVyXVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBHZXQgbGlzdGVuZXJzIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm9uZSBpcyBmb3VuZC5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBJZiBubyBzcGVjaWZpYyBsaXN0ZW5lciBpcyBwcm92aWRlZCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzLlxuICAgIHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhbGwgbGlzdGVuZXJzIGluIGEgc3BlY2lmaWVkIGV2ZW50IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Kn0gW2FyZzFdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzJdXG4gICAqIEBwYXJhbSB7Kn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBldmVudCBsaXN0ZW5lcnMgYW5kIHF1aXQgZWFybHkgaWYgdGhlcmUncyBubyBsaXN0ZW5lcnMuXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHFMZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGFMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB2YXIgaTtcblxuICAgIC8vIEFkZCB0aGUgY3VycmVudCBsaXN0ZW5lcnMgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIG9mIHRoZSBsaXN0ZW5lcnMgYXJlIGNhbGxlZCBpblxuICAgIC8vIGNvcnJlY3Qgb3JkZXIgZXZlbiBpZiBuZXcgZXZlbnQgbGlzdGVuZXJzIGFyZSByZW1vdmVkL2FkZGVkIGR1cmluZ1xuICAgIC8vIHByb2Nlc3NpbmcgYW5kL29yIGV2ZW50cyBhcmUgZW1pdHRlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gSW5jcmVtZW50IHF1ZXVlIGNvdW50ZXIuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc2NlbmFyaW9zIHdoZXJlIGVtaXQgaXNcbiAgICAvLyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mXG4gICAgLy8gaG93IG1hbnkgXCJxdWV1ZSBwcm9jZXNzb3JzXCIgdGhlcmUgYXJlIGFjdGl2ZSBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVzZXRcbiAgICAvLyB0aGUgcXVldWUgaW4gdGhlIGVuZCB3aGVuIHRoZSBsYXN0IHF1ZXVlIHByb2Nlc3NvciBpcyBmaW5pc2hlZC5cbiAgICArK3RoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBxdWV1ZSAodGhlIHNwZWNpZmljIHBhcnQgb2YgaXQgZm9yIHRoaXMgZW1pdCkuXG4gICAgZm9yIChpID0gcUxlbmd0aCwgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDsgaSA8IHFMZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICBhTGVuZ3RoID09PSAwID8gcXVldWVbaV0oKSA6XG4gICAgICBhTGVuZ3RoID09PSAxID8gcXVldWVbaV0oYXJnMSkgOlxuICAgICAgYUxlbmd0aCA9PT0gMiA/IHF1ZXVlW2ldKGFyZzEsIGFyZzIpIDpcbiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZVtpXShhcmcxLCBhcmcyLCBhcmczKTtcblxuICAgICAgLy8gU3RvcCBwcm9jZXNzaW5nIGlmIHRoZSBlbWl0dGVyIGlzIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRGVjcmVtZW50IHF1ZXVlIHByb2Nlc3MgY291bnRlci5cbiAgICAtLXRoaXMuX2NvdW50ZXI7XG5cbiAgICAvLyBSZXNldCB0aGUgcXVldWUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcXVldWUgcHJvY2Vzc2VzIHJ1bm5pbmcuXG4gICAgaWYgKCF0aGlzLl9jb3VudGVyKSBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZW1pdHRlciBpbnN0YW5jZS4gQmFzaWNhbGx5IGp1c3QgcmVtb3ZlcyBhbGwgYm91bmQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7RW1pdHRlcn1cbiAgICovXG4gIEVtaXR0ZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICB2YXIgZXZlbnQ7XG5cbiAgICAvLyBGbGFnIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCBxdWV1ZSAoaWYgcXVldWUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgdGhpcyB3aWxsIGFsc28gc3RvcCB0aGF0KS5cbiAgICB0aGlzLl9xdWV1ZS5sZW5ndGggPSB0aGlzLl9jb3VudGVyID0gMDtcblxuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoZXZlbnQgaW4gZXZlbnRzKSB7XG4gICAgICBpZiAoZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICBldmVudHNbZXZlbnRdLmxlbmd0aCA9IDA7XG4gICAgICAgIGV2ZW50c1tldmVudF0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU2V0IHVwIHRoZSBkZWZhdWx0IGV4cG9ydCB2YWx1ZXMuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtUHJvcCA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8vIEZpbmQgdGhlIHN1cHBvcnRlZCB0cmFuc2Zvcm0gcHJvcCBhbmQgc3R5bGUgbmFtZXMuXG4gIHZhciBkb2NFbGVtU3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICB2YXIgc3R5bGUgPSAndHJhbnNmb3JtJztcbiAgdmFyIHN0eWxlQ2FwID0gJ1RyYW5zZm9ybSc7XG4gIHZhciBmb3VuZCA9IGZhbHNlO1xuICBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXS5mb3JFYWNoKGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIHZhciBwcm9wTmFtZSA9IHByZWZpeCA/IHByZWZpeCArIHN0eWxlQ2FwIDogc3R5bGU7XG4gICAgaWYgKGRvY0VsZW1TdHlsZVtwcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gcHJlZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICB0cmFuc2Zvcm1TdHlsZSA9IHByZWZpeCA/ICctJyArIHByZWZpeCArICctJyArIHN0eWxlIDogc3R5bGU7XG4gICAgICB0cmFuc2Zvcm1Qcm9wID0gcHJvcE5hbWU7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICB2YXIgc3R5bGVzQ2FjaGUgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBXZWFrTWFwKCkgOiBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZShlbGVtZW50LCBzdHlsZSkge1xuICAgIHZhciBzdHlsZXMgPSBzdHlsZXNDYWNoZSAmJiBzdHlsZXNDYWNoZS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgaWYgKHN0eWxlc0NhY2hlKSBzdHlsZXNDYWNoZS5zZXQoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVN0eWxlIDogc3R5bGUpO1xuICB9XG5cbiAgdmFyIHN0eWxlTmFtZVJlZ0V4ID0gLyhbQS1aXSkvZztcblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3R5bGUgcHJvcGVydHkgdG8ga2ViYWIgY2FzZSBzdHlsZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3R5bGVOYW1lKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShzdHlsZU5hbWVSZWdFeCwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgc3RyRnVuY3Rpb24gPSAnZnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gc3RyRnVuY3Rpb247XG4gIH1cblxuICB2YXIgdHJhbnNmb3JtU3R5bGUkMSA9ICd0cmFuc2Zvcm0nO1xuXG4gIC8qKlxuICAgKiBTZXQgaW5saW5lIHN0eWxlcyB0byBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZXNcbiAgICovXG4gIGZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wID09PSB0cmFuc2Zvcm1TdHlsZSQxID8gdHJhbnNmb3JtUHJvcCA6IHByb3BdID0gc3R5bGVzW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVtIGFuaW1hdGlvbiBoYW5kbGVyIHBvd2VyZWQgYnkgV2ViIEFuaW1hdGlvbnMgQVBJLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUFuaW1hdGUoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IG51bGw7XG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fa2V5ZnJhbWVzID0gW107XG4gICAgdGhpcy5fb3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fb25GaW5pc2ggPSB0aGlzLl9vbkZpbmlzaC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGluc3RhbmNlJ3MgYW5pbWF0aW9uLiBBdXRvbWF0aWNhbGx5IHN0b3BzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzXG4gICAqIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNGcm9tXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1RvXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVhc2luZz0nZWFzZSddXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ocHJvcHNGcm9tLCBwcm9wc1RvLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0aW9uO1xuICAgIHZhciBjdXJyZW50UHJvcHMgPSB0aGlzLl9wcm9wcztcbiAgICB2YXIgY3VycmVudFZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uID0gZmFsc2U7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGFuaW1hdGlvbiBydW5uaW5nLCBsZXQncyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZVxuICAgIC8vIGNhbmNlbGxlZCBvciBpZiBpdCBjYW4gY29udGludWUgcnVubmluZy5cbiAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICB2YXIgcHJvcENvdW50ID0gMDtcbiAgICAgIHZhciBwcm9wSW5kZXg7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIG1hdGNoIHdpdGggdGhlXG4gICAgICAvLyBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICAgICsrcHJvcENvdW50O1xuICAgICAgICBwcm9wSW5kZXggPSBjdXJyZW50UHJvcHMuaW5kZXhPZihwcm9wTmFtZSk7XG4gICAgICAgIGlmIChwcm9wSW5kZXggPT09IC0xIHx8IHByb3BzVG9bcHJvcE5hbWVdICE9PSBjdXJyZW50VmFsdWVzW3Byb3BJbmRleF0pIHtcbiAgICAgICAgICBjYW5jZWxBbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcHJvcHMgY291bnQgbWF0Y2hlcyBjdXJyZW50IHByb3BzIGNvdW50LiBUaGlzIGlzXG4gICAgICAvLyBuZWVkZWQgZm9yIHRoZSBlZGdlIGNhc2Ugc2NlbmFyaW8gd2hlcmUgdGFyZ2V0IHByb3BzIGNvbnRhaW4gdGhlIHNhbWVcbiAgICAgIC8vIHN0eWxlcyBhcyBjdXJyZW50IHByb3BzLCBidXQgdGhlIGN1cnJlbnQgcHJvcHMgaGF2ZSBzb21lIGFkZGl0aW9uYWxcbiAgICAgIC8vIHByb3BzLlxuICAgICAgaWYgKCFjYW5jZWxBbmltYXRpb24gJiYgcHJvcENvdW50ICE9PSBjdXJyZW50UHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIGFuaW1hdGlvbiAoaWYgcmVxdWlyZWQpLlxuICAgIGlmIChjYW5jZWxBbmltYXRpb24pIGFuaW1hdGlvbi5jYW5jZWwoKTtcblxuICAgIC8vIFN0b3JlIGFuaW1hdGlvbiBjYWxsYmFjay5cbiAgICB0aGlzLl9jYWxsYmFjayA9IGlzRnVuY3Rpb24ob3B0cy5vbkZpbmlzaCkgPyBvcHRzLm9uRmluaXNoIDogbnVsbDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBydW5uaW5nIGFuaW1hdGlvbiB0aGF0IGRvZXMgbm90IG5lZWQgdG8gYmUgY2FuY2VsbGVkLCBsZXQnc1xuICAgIC8vIGNhbGwgaXQgYSBkYXkgaGVyZSBhbmQgbGV0IGl0IHJ1bi5cbiAgICBpZiAoYW5pbWF0aW9uICYmICFjYW5jZWxBbmltYXRpb24pIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRhcmdldCBwcm9wcyBhbmQgdmFsdWVzIHRvIGluc3RhbmNlLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBwcm9wc1RvKSB7XG4gICAgICBjdXJyZW50UHJvcHMucHVzaChwcm9wTmFtZSk7XG4gICAgICBjdXJyZW50VmFsdWVzLnB1c2gocHJvcHNUb1twcm9wTmFtZV0pO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBrZXlmcmFtZXMuXG4gICAgdmFyIGFuaW1LZXlmcmFtZXMgPSB0aGlzLl9rZXlmcmFtZXM7XG4gICAgYW5pbUtleWZyYW1lc1swXSA9IHByb3BzRnJvbTtcbiAgICBhbmltS2V5ZnJhbWVzWzFdID0gcHJvcHNUbztcblxuICAgIC8vIFNldCB1cCBvcHRpb25zLlxuICAgIHZhciBhbmltT3B0aW9ucyA9IHRoaXMuX29wdGlvbnM7XG4gICAgYW5pbU9wdGlvbnMuZHVyYXRpb24gPSBvcHRzLmR1cmF0aW9uIHx8IDMwMDtcbiAgICBhbmltT3B0aW9ucy5lYXNpbmcgPSBvcHRzLmVhc2luZyB8fCAnZWFzZSc7XG5cbiAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGFuaW1hdGlvbiA9IGVsZW1lbnQuYW5pbWF0ZShhbmltS2V5ZnJhbWVzLCBhbmltT3B0aW9ucyk7XG4gICAgYW5pbWF0aW9uLm9uZmluaXNoID0gdGhpcy5fb25GaW5pc2g7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gYW5pbWF0aW9uO1xuXG4gICAgLy8gU2V0IHRoZSBlbmQgc3R5bGVzLiBUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgZWxlbWVudCBzdGF5cyBhdCB0aGUgZW5kXG4gICAgLy8gdmFsdWVzIGFmdGVyIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAgICBzZXRTdHlsZXMoZWxlbWVudCwgcHJvcHNUbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaW5zdGFuY2UncyBjdXJyZW50IGFuaW1hdGlvbiBpZiBydW5uaW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZXNdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fYW5pbWF0aW9uKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgcHJvcFZhbHVlO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIChpZiBub3QgcHJvdmlkZWQpIGFuZCBzZXQgc3R5bGVzLlxuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudFByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb3BOYW1lID0gY3VycmVudFByb3BzW2ldO1xuICAgICAgICBwcm9wVmFsdWUgPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcE5hbWUpKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wTmFtZSA9PT0gJ3RyYW5zZm9ybScgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyAgQ2FuY2VsIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcyBhbmQgdmFsdWVzLlxuICAgIGN1cnJlbnRQcm9wcy5sZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBpdGVtIGlzIGJlaW5nIGFuaW1hdGVkIGN1cnJlbnRseS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuaXNBbmltYXRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9hbmltYXRpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fb3B0aW9ucyA9IHRoaXMuX2tleWZyYW1lcyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFuaW1hdGlvbiBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUFuaW1hdGUucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrO1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IHRoaXMuX2NhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9wcm9wcy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICB9O1xuXG4gIHZhciB2ZW5kb3JQcmVmaXhlcyA9IFsnJywgJ3dlYmtpdCcsICdtb3onLCAnbXMnLCAnbycsICdXZWJraXQnLCAnTW96JywgJ01TJywgJ08nXTtcblxuICAvKipcbiAgICogR2V0IHByZWZpeGVkIENTUyBwcm9wZXJ0eSBuYW1lIHdoZW4gZ2l2ZW4gYSBub24tcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtU3R5bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICAqIEByZXR1cm5zIHshU3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtU3R5bGUsIHByb3BOYW1lKSB7XG4gICAgdmFyIGNhbWVsUHJvcE5hbWUgPSBwcm9wTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcE5hbWUuc2xpY2UoMSk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwcmVmaXg7XG4gICAgdmFyIHByZWZpeGVkUHJvcE5hbWU7XG5cbiAgICB3aGlsZSAoaSA8IHZlbmRvclByZWZpeGVzLmxlbmd0aCkge1xuICAgICAgcHJlZml4ID0gdmVuZG9yUHJlZml4ZXNbaV07XG4gICAgICBwcmVmaXhlZFByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgY2FtZWxQcm9wTmFtZSA6IHByb3BOYW1lO1xuICAgICAgaWYgKHByZWZpeGVkUHJvcE5hbWUgaW4gZWxlbVN0eWxlKSByZXR1cm4gcHJlZml4ZWRQcm9wTmFtZTtcbiAgICAgICsraTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBkdCA9IDEwMDAgLyA2MDtcblxuICB2YXIgcmFmID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhkdCk7XG4gICAgICB9LCBkdCk7XG4gICAgfVxuICApLmJpbmQod2luZG93KTtcblxuICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgcGFzc2l2ZSBldmVudHM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gIHZhciBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgcGFzc2l2ZU9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgcGFzc2l2ZU9wdHMpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIC8vIERyYWdnZXIgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnc3RhcnQnLFxuICAgIG1vdmU6ICdtb3ZlJyxcbiAgICBlbmQ6ICdlbmQnLFxuICAgIGNhbmNlbDogJ2NhbmNlbCdcbiAgfTtcblxuICB2YXIgaGFzVG91Y2hFdmVudHMgPSAhISgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgd2luZG93LlRvdWNoRXZlbnQpO1xuICB2YXIgaGFzUG9pbnRlckV2ZW50cyA9ICEhd2luZG93LlBvaW50ZXJFdmVudDtcbiAgdmFyIGhhc01zUG9pbnRlckV2ZW50cyA9ICEhd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkO1xuICB2YXIgaXNBbmRyb2lkID0gLyhhbmRyb2lkKS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB2YXIgbGlzdGVuZXJPcHRpb25zID0gaXNQYXNzaXZlRXZlbnRzU3VwcG9ydGVkID8geyBwYXNzaXZlOiB0cnVlIH0gOiBmYWxzZTtcblxuICB2YXIgdGFQcm9wID0gJ3RvdWNoQWN0aW9uJztcbiAgdmFyIHRhUHJvcFByZWZpeGVkID0gZ2V0UHJlZml4ZWRQcm9wTmFtZSh3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLCB0YVByb3ApO1xuICB2YXIgdGFEZWZhdWx0VmFsdWUgPSAnYXV0byc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRHJhZ2dlciBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2Nzc1Byb3BzXVxuICAgKi9cbiAgZnVuY3Rpb24gRHJhZ2dlcihlbGVtZW50LCBjc3NQcm9wcykge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3NzUHJvcHMgPSB7fTtcbiAgICB0aGlzLl90b3VjaEFjdGlvbiA9ICcnO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUgPSB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblN0YXJ0ID0gdGhpcy5fb25TdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTW92ZSA9IHRoaXMuX29uTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQ2FuY2VsID0gdGhpcy5fb25DYW5jZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkVuZCA9IHRoaXMuX29uRW5kLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBcHBseSBpbml0aWFsIGNzcyBwcm9wcy5cbiAgICB0aGlzLnNldENzc1Byb3BzKGNzc1Byb3BzKTtcblxuICAgIC8vIElmIHRvdWNoIGFjdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdpdGggaW5pdGlhbCBjc3MgcHJvcHMgbGV0J3MgYXNzdW1lIGl0J3NcbiAgICAvLyBhdXRvLlxuICAgIGlmICghdGhpcy5fdG91Y2hBY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24odGFEZWZhdWx0VmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgbmF0aXZlIGxpbmsvaW1hZ2UgZHJhZ2dpbmcgZm9yIHRoZSBpdGVtIGFuZCBpdCdzIGFuY2VzdG9ycy5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gc3RhcnQgZXZlbnQuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX2V2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcblxuICAgIC8vIElmIHdlIGhhdmUgdG91Y2ggZXZlbnRzLCBidXQgbm8gcG9pbnRlciBldmVudHMgd2UgbmVlZCB0byBhbHNvIGxpc3RlbiBmb3JcbiAgICAvLyBtb3VzZSBldmVudHMgaW4gYWRkaXRpb24gdG8gdG91Y2ggZXZlbnRzIGZvciBkZXZpY2VzIHdoaWNoIHN1cHBvcnQgYm90aFxuICAgIC8vIG1vdXNlIGFuZCB0b3VjaCBpbnRlcmFjdGlvbi5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgIWhhc1BvaW50ZXJFdmVudHMgJiYgIWhhc01zUG9pbnRlckV2ZW50cykge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAncG9pbnRlcmRvd24nLFxuICAgIG1vdmU6ICdwb2ludGVybW92ZScsXG4gICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgZW5kOiAncG9pbnRlcnVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX21zUG9pbnRlckV2ZW50cyA9IHtcbiAgICBzdGFydDogJ01TUG9pbnRlckRvd24nLFxuICAgIG1vdmU6ICdNU1BvaW50ZXJNb3ZlJyxcbiAgICBjYW5jZWw6ICdNU1BvaW50ZXJDYW5jZWwnLFxuICAgIGVuZDogJ01TUG9pbnRlclVwJ1xuICB9O1xuXG4gIERyYWdnZXIuX3RvdWNoRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAndG91Y2hzdGFydCcsXG4gICAgbW92ZTogJ3RvdWNobW92ZScsXG4gICAgY2FuY2VsOiAndG91Y2hjYW5jZWwnLFxuICAgIGVuZDogJ3RvdWNoZW5kJ1xuICB9O1xuXG4gIERyYWdnZXIuX21vdXNlRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICBtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBjYW5jZWw6ICcnLFxuICAgIGVuZDogJ21vdXNldXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fZXZlbnRzID0gKGZ1bmN0aW9uKCkge1xuICAgIGlmIChoYXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fcG9pbnRlckV2ZW50cztcbiAgICBpZiAoaGFzTXNQb2ludGVyRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNUb3VjaEV2ZW50cykgcmV0dXJuIERyYWdnZXIuX3RvdWNoRXZlbnRzO1xuICAgIHJldHVybiBEcmFnZ2VyLl9tb3VzZUV2ZW50cztcbiAgfSkoKTtcblxuICBEcmFnZ2VyLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMgPSBbXTtcblxuICAvKipcbiAgICogUHJvdGVjdGVkIHN0YXRpYyBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmNhbmNlbGFibGUgIT09IGZhbHNlKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm47XG5cbiAgICBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMubW92ZSwgaW5zdGFuY2UuX29uTW92ZSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub24oZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmIChEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGluZGV4ID0gRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9mZihldmVudHMuY2FuY2VsLCBpbnN0YW5jZS5fb25DYW5jZWwpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5lbmQsIGluc3RhbmNlLl9vbkVuZCk7XG5cbiAgICBpZiAoIURyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgIERyYWdnZXIuX3VuYmluZExpc3RlbmVycygpO1xuICAgIH1cbiAgfTtcblxuICBEcmFnZ2VyLl9iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZSwgRHJhZ2dlci5fb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5lbmQsIERyYWdnZXIuX29uRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGV2ZW50cy5jYW5jZWwgJiYgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmNhbmNlbCwgRHJhZ2dlci5fb25DYW5jZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0RXZlbnRQb2ludGVySWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIElmIHdlIGhhdmUgcG9pbnRlciBpZCBhdmFpbGFibGUgbGV0J3MgdXNlIGl0LlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGdldCB0aGUgZmlyc3QgY2hhbmdlZCB0b3VjaCdzIGlkZW50aWZpZXIuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbW91c2Uvb3RoZXIgZXZlbnRzIGxldCdzIHByb3ZpZGUgYSBzdGF0aWMgaWQuXG4gICAgcmV0dXJuIDE7XG4gIH07XG5cbiAgRHJhZ2dlci5fZ2V0VG91Y2hCeUlkID0gZnVuY3Rpb24oZXZlbnQsIGlkKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHBvaW50ZXIgZXZlbnQgcmV0dXJuIHRoZSB3aG9sZSBldmVudCBpZiB0aGVyZSdzIGEgbWF0Y2gsIGFuZFxuICAgIC8vIG51bGwgb3RoZXJ3aXNlLlxuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlcklkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJJZCA9PT0gaWQgPyBldmVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRvdWNoIGV2ZW50cyBsZXQncyBjaGVjayBpZiB0aGVyZSdzIGEgY2hhbmdlZCB0b3VjaCBvYmplY3QgdGhhdCBtYXRjaGVzXG4gICAgLy8gdGhlIHBvaW50ZXJJZCBpbiB3aGljaCBjYXNlIHJldHVybiB0aGUgdG91Y2ggb2JqZWN0LlxuICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllciA9PT0gaWQpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgYXNzdW1lIHRoZXJlJ3Mgb25seSBvbmUgcG9pbnRlciBhbmQganVzdFxuICAgIC8vIHJldHVybiB0aGUgZXZlbnQuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9O1xuXG4gIERyYWdnZXIuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuY2FuY2VsLCBlKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLmVtaXQoZXZlbnRzLmVuZCwgZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVzZXQgY3VycmVudCBkcmFnIG9wZXJhdGlvbiAoaWYgYW55KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLl9zdGFydFggPSAwO1xuICAgIHRoaXMuX3N0YXJ0WSA9IDA7XG4gICAgdGhpcy5fY3VycmVudFggPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gMDtcbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgbGlzdGVuZXJPcHRpb25zXG4gICAgKTtcblxuICAgIERyYWdnZXIuX2RlYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgY3VzdG9tIGRyYWdnZXIgZXZlbnQgZnJvbSBhIHJhdyBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqIEByZXR1cm5zIHtEcmFnZ2VyRXZlbnR9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fY3JlYXRlRXZlbnQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdmFyIHRvdWNoID0gdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBIYW1tZXIuanMgY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UuXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgc3JjRXZlbnQ6IGUsXG4gICAgICBkaXN0YW5jZTogdGhpcy5nZXREaXN0YW5jZSgpLFxuICAgICAgZGVsdGFYOiB0aGlzLmdldERlbHRhWCgpLFxuICAgICAgZGVsdGFZOiB0aGlzLmdldERlbHRhWSgpLFxuICAgICAgZGVsdGFUaW1lOiB0eXBlID09PSBldmVudHMuc3RhcnQgPyAwIDogdGhpcy5nZXREZWx0YVRpbWUoKSxcbiAgICAgIGlzRmlyc3Q6IHR5cGUgPT09IGV2ZW50cy5zdGFydCxcbiAgICAgIGlzRmluYWw6IHR5cGUgPT09IGV2ZW50cy5lbmQgfHwgdHlwZSA9PT0gZXZlbnRzLmNhbmNlbCxcbiAgICAgIC8vIFBhcnRpYWwgVG91Y2ggQVBJIGludGVyZmFjZS5cbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX3BvaW50ZXJJZCxcbiAgICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgICBwYWdlWTogdG91Y2gucGFnZVksXG4gICAgICB0YXJnZXQ6IHRvdWNoLnRhcmdldFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSByYXcgZXZlbnQgYXMgZHJhZ2dlciBldmVudCBpbnRlcm5hbGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24odHlwZSwgZSkge1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCh0eXBlLCB0aGlzLl9jcmVhdGVFdmVudCh0eXBlLCBlKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwcm92aWRlZCBldmVudCBpcyBhIFBvaW50ZXJFdmVudCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBpdCBpZiBpdCBoYXNcbiAgICogdGhlIHNhbWUgcG9pbnRlcklkIGFzIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgVG91Y2hFdmVudFxuICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBsb29rIGZvciBhIFRvdWNoIGluc3RhbmNlIGluIHRoZSBjaGFuZ2VkVG91Y2hlcyB0aGF0XG4gICAqIGhhcyBhbiBpZGVudGlmaWVyIG1hdGNoaW5nIHRoaXMgaW5zdGFuY2UncyBwb2ludGVySWQuIElmIHRoZSBwcm92aWRlZCBldmVudFxuICAgKiBpcyBhIE1vdXNlRXZlbnQgKG9yIGp1c3QgYW55IG90aGVyIGV2ZW50IHRoYW4gUG9pbnRlckV2ZW50IG9yIFRvdWNoRXZlbnQpXG4gICAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX1cbiAgICogQHJldHVybnMgez8oVG91Y2h8UG9pbnRlckV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2dldFRyYWNrZWRUb3VjaCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIERyYWdnZXIuX2dldFRvdWNoQnlJZChlLCB0aGlzLl9wb2ludGVySWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQSBwcmUtaGFuZGxlciBmb3Igc3RhcnQgZXZlbnQgdGhhdCBjaGVja3MgaWYgd2UgY2FuIHN0YXJ0IGRyYWdnaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBiZWluZyBkcmFnZ2VkIGN1cnJlbnRseS5cbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKCkpIHJldHVybjtcblxuICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAvLyBzdGFydGluZyBpZiBuYXRpdmUgc2Nyb2xsaW5nIGlzIGluIHByb2dyZXNzLiBQYXJ0IDEuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgbGVmdCBidXR0b24gaXMgcHJlc3NlZCBvbiBtb3VzZS5cbiAgICBpZiAoZS5idXR0b24pIHJldHVybjtcblxuICAgIC8vIEdldCAoYW5kIHNldCkgcG9pbnRlciBpZC5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZChlKTtcbiAgICBpZiAodGhpcy5fcG9pbnRlcklkID09PSBudWxsKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSB0aGUgc3RhcnQgZXZlbnQgYW5kIHRyaWdnZXIgc3RhcnQgKGFzeW5jIG9yIHN5bmMpLiBQb2ludGVyIGV2ZW50c1xuICAgIC8vIGFyZSBlbWl0dGVkIGJlZm9yZSB0b3VjaCBldmVudHMgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgYm90aCBvZiB0aGVtLiBBbmRcbiAgICAvLyBpZiB5b3UgdHJ5IHRvIG1vdmUgYW4gZWxlbWVudCBiZWZvcmUgYHRvdWNoc3RhcnRgIGlzIGVtaXR0ZWQgdGhlIHBvaW50ZXJcbiAgICAvLyBldmVudHMgZm9yIHRoYXQgZWxlbWVudCB3aWxsIGJlIGNhbmNlbGVkLiBUaGUgZml4IGlzIHRvIGRlbGF5IHRoZSBlbWl0dGVkXG4gICAgLy8gcG9pbnRlciBldmVudHMgaW4gc3VjaCBhIHNjZW5hcmlvIGJ5IG9uZSBmcmFtZSBzbyB0aGF0IGB0b3VjaHN0YXJ0YCBoYXNcbiAgICAvLyB0aW1lIHRvIGJlIGVtaXR0ZWQgYmVmb3JlIHRoZSBlbGVtZW50IGlzIChwb3RlbnRpYWxseSkgbW92ZWQuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IGU7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzICYmIChoYXNQb2ludGVyRXZlbnRzIHx8IGhhc01zUG9pbnRlckV2ZW50cykpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FuY2VsYWJsZSBjaGVjayBmb3IgQW5kcm9pZCB0byBwcmV2ZW50IGRyYWcgcHJvY2VkdXJlIGZyb21cbiAgICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMi5cbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LFxuICAgICAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJhZih0aGlzLl9vblN0YXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25TdGFydCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWJvcnQgc3RhcnQgZXZlbnQgaWYgaXQgdHVybnMgb3V0IHRvIGJlIG5vbi1jYW5jZWxhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9hYm9ydE5vbkNhbmNlbGFibGUgPSBmdW5jdGlvbihlKSB7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX3N0YXJ0RXZlbnQgJiYgZS5jYW5jZWxhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIGRyYWcgcHJvY2VkdXJlIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGUgPSB0aGlzLl9zdGFydEV2ZW50O1xuICAgIGlmICghZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgLy8gU2V0IHVwIGluaXQgZGF0YSBhbmQgZW1pdCBzdGFydCBldmVudC5cbiAgICB0aGlzLl9zdGFydFggPSB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fc3RhcnRZID0gdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZW1pdChldmVudHMuc3RhcnQsIGUpO1xuICAgIERyYWdnZXIuX2FjdGl2YXRlSW5zdGFuY2UodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIG1vdmUgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uTW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgaWYgKCF0b3VjaCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMuX2N1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5tb3ZlLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBjYW5jZWwgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uQ2FuY2VsID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICghdGhpcy5fZ2V0VHJhY2tlZFRvdWNoKGUpKSByZXR1cm47XG5cbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGVuZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25FbmQgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmVuZCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYmVpbmcgZHJhZ2dlZCBhdCB0aGUgbW9tZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRlcklkICE9PSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgZWxlbWVudCdzIHRvdWNoLWFjdGlvbiBDU1MgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuc2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIC8vIFN0b3JlIHVubW9kaWZpZWQgdG91Y2ggYWN0aW9uIHZhbHVlICh3ZSB0cnVzdCB1c2VyIGlucHV0IGhlcmUpLlxuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gdmFsdWU7XG5cbiAgICAvLyBTZXQgdG91Y2gtYWN0aW9uIHN0eWxlLlxuICAgIGlmICh0YVByb3BQcmVmaXhlZCkge1xuICAgICAgdGhpcy5fY3NzUHJvcHNbdGFQcm9wUHJlZml4ZWRdID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYW4gdW5zdXBwb3J0ZWQgdG91Y2gtYWN0aW9uIHZhbHVlIGxldCdzIGFkZCBhIHNwZWNpYWwgbGlzdGVuZXJcbiAgICAvLyB0aGF0IHByZXZlbnRzIGRlZmF1bHQgYWN0aW9uIG9uIHRvdWNoIHN0YXJ0IGV2ZW50LiBBIGRpcnR5IGhhY2ssIGJ1dCBiZXN0XG4gICAgLy8gd2UgY2FuIGRvIGZvciBub3cuIFRoZSBvdGhlciBvcHRpb25zIHdvdWxkIGJlIHRvIHNvbWVob3cgcG9seWZpbGwgdGhlXG4gICAgLy8gdW5zdXBwb3J0ZWQgdG91Y2ggYWN0aW9uIGJlaGF2aW9yIHdpdGggY3VzdG9tIGhldXJpc3RpY3Mgd2hpY2ggc291bmRzIGxpa2VcbiAgICAvLyBhIGNhbiBvZiB3b3Jtcy5cbiAgICBpZiAoaGFzVG91Y2hFdmVudHMpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LnN0eWxlW3RhUHJvcFByZWZpeGVkXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGVsZW1lbnQncyBDU1MgcHJvcGVydGllcy4gQWNjZXB0cyBhbiBvYmplY3Qgd2l0aCBjYW1lbCBjYXNlZCBzdHlsZVxuICAgKiBwcm9wcyB3aXRoIHZhbHVlIHBhaXJzIGFzIGl0J3MgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbbmV3UHJvcHNdXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRDc3NQcm9wcyA9IGZ1bmN0aW9uKG5ld1Byb3BzKSB7XG4gICAgaWYgKCFuZXdQcm9wcykgcmV0dXJuO1xuXG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX2Nzc1Byb3BzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcHJvcDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wO1xuXG4gICAgLy8gUmVzZXQgY3VycmVudCBwcm9wcy5cbiAgICBmb3IgKHByb3AgaW4gY3VycmVudFByb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gY3VycmVudFByb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIGN1cnJlbnRQcm9wc1twcm9wXTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbmV3IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBuZXdQcm9wcykge1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWx1ZSBmb3IgdGhlIHByb3AuXG4gICAgICBpZiAoIW5ld1Byb3BzW3Byb3BdKSBjb250aW51ZTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdG91Y2gtYWN0aW9uLlxuICAgICAgaWYgKHByb3AgPT09IHRhUHJvcCkge1xuICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5ld1Byb3BzW3Byb3BdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBwcmVmaXhlZCBwcm9wIGFuZCBza2lwIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgcHJlZml4ZWRQcm9wID0gZ2V0UHJlZml4ZWRQcm9wTmFtZShlbGVtZW50LnN0eWxlLCBwcm9wKTtcbiAgICAgIGlmICghcHJlZml4ZWRQcm9wKSBjb250aW51ZTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHByb3AgYW5kIGFkZCB0aGUgc3R5bGUuXG4gICAgICBjdXJyZW50UHJvcHNbcHJlZml4ZWRQcm9wXSA9ICcnO1xuICAgICAgZWxlbWVudC5zdHlsZVtwcmVmaXhlZFByb3BdID0gbmV3UHJvcHNbcHJvcF07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geC1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gbGVmdCB0byByaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WCAtIHRoaXMuX3N0YXJ0WDtcbiAgfTtcblxuICAvKipcbiAgICogSG93IG11Y2ggdGhlIHBvaW50ZXIgaGFzIG1vdmVkIG9uIHktYXhpcyBmcm9tIHN0YXJ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuXG4gICAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyBtb3ZlbWVudCBmcm9tIHRvcCB0byBib3R0b20uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFkgLSB0aGlzLl9zdGFydFk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBmYXIgKGluIHBpeGVscykgaGFzIHBvaW50ZXIgbW92ZWQgZnJvbSBzdGFydCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERpc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLmdldERlbHRhWCgpO1xuICAgIHZhciB5ID0gdGhpcy5nZXREZWx0YVkoKTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBoYXMgcG9pbnRlciBiZWVuIGRyYWdnZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5nZXREZWx0YVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lID8gRGF0ZS5ub3coKSAtIHRoaXMuX3N0YXJ0VGltZSA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICogICAtICdzdGFydCcsICdtb3ZlJywgJ2NhbmNlbCcgb3IgJ2VuZCcuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudHMsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCB1bmJpbmQgYWxsIGRyYWcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBldmVudHMgPSBEcmFnZ2VyLl9ldmVudHM7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCBkZWFjdGl2YXRlIHRoZSBpbnN0YW5jZS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gRGVzdHJveSBlbWl0dGVyLlxuICAgIHRoaXMuX2VtaXR0ZXIuZGVzdHJveSgpO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX21vdXNlRXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG5cbiAgICAvLyBSZXNldCBzdHlsZXMuXG4gICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLl9jc3NQcm9wcykge1xuICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgICAgZGVsZXRlIHRoaXMuX2Nzc1Byb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRhdGEuXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBNYXJrIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgdGlja2VyIHN5c3RlbSBmb3IgaGFuZGxpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMgaW4gYW4gZWZmaWNpZW50IHdheS5cbiAgICogQ29udGFpbnMgYSByZWFkIHF1ZXVlIGFuZCBhIHdyaXRlIHF1ZXVlIHRoYXQgYXJlIHByb2Nlc3NlZCBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUgd2hlbiBuZWVkZWQuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gVGlja2VyKCkge1xuICAgIHRoaXMuX25leHRTdGVwID0gbnVsbDtcblxuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5fcmVhZHMgPSB7fTtcbiAgICB0aGlzLl93cml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX2JhdGNoID0gW107XG4gICAgdGhpcy5fYmF0Y2hSZWFkcyA9IHt9O1xuICAgIHRoaXMuX2JhdGNoV3JpdGVzID0ge307XG5cbiAgICB0aGlzLl9zdGVwID0gdGhpcy5fc3RlcC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgVGlja2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpZCwgcmVhZE9wZXJhdGlvbiwgd3JpdGVPcGVyYXRpb24sIGlzUHJpb3JpdGl6ZWQpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgYW4gaXRlbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcXVldWVzIHdpdGggdGhlIHNhbWUgaWRcbiAgICAvLyBhbmQgaWYgc28gLT4gcmVtb3ZlIGl0LlxuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBBZGQgZW50cnkuXG4gICAgaXNQcmlvcml0aXplZCA/IHRoaXMuX3F1ZXVlLnVuc2hpZnQoaWQpIDogdGhpcy5fcXVldWUucHVzaChpZCk7XG4gICAgdGhpcy5fcmVhZHNbaWRdID0gcmVhZE9wZXJhdGlvbjtcbiAgICB0aGlzLl93cml0ZXNbaWRdID0gd3JpdGVPcGVyYXRpb247XG5cbiAgICAvLyBGaW5hbGx5LCBsZXQncyBraWNrLXN0YXJ0IHRoZSBuZXh0IHRpY2sgaWYgaXQgaXMgbm90IHJ1bm5pbmcgeWV0LlxuICAgIGlmICghdGhpcy5fbmV4dFN0ZXApIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24oaWQpIHtcbiAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5fcXVldWUuaW5kZXhPZihpZCk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9xdWV1ZVtjdXJyZW50SW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLl93cml0ZXNbaWRdO1xuICAgIH1cbiAgfTtcblxuICBUaWNrZXIucHJvdG90eXBlLl9zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHJlYWRzID0gdGhpcy5fcmVhZHM7XG4gICAgdmFyIHdyaXRlcyA9IHRoaXMuX3dyaXRlcztcbiAgICB2YXIgYmF0Y2ggPSB0aGlzLl9iYXRjaDtcbiAgICB2YXIgYmF0Y2hSZWFkcyA9IHRoaXMuX2JhdGNoUmVhZHM7XG4gICAgdmFyIGJhdGNoV3JpdGVzID0gdGhpcy5fYmF0Y2hXcml0ZXM7XG4gICAgdmFyIGxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgaWQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCB0aWNrZXIuXG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgLy8gU2V0dXAgcXVldWVzIGFuZCBjYWxsYmFjayBwbGFjZWhvbGRlcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IHF1ZXVlW2ldO1xuICAgICAgaWYgKCFpZCkgY29udGludWU7XG5cbiAgICAgIGJhdGNoLnB1c2goaWQpO1xuXG4gICAgICBiYXRjaFJlYWRzW2lkXSA9IHJlYWRzW2lkXTtcbiAgICAgIGRlbGV0ZSByZWFkc1tpZF07XG5cbiAgICAgIGJhdGNoV3JpdGVzW2lkXSA9IHdyaXRlc1tpZF07XG4gICAgICBkZWxldGUgd3JpdGVzW2lkXTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBxdWV1ZS5cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJvY2VzcyByZWFkIGNhbGxiYWNrcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gYmF0Y2hbaV07XG4gICAgICBpZiAoYmF0Y2hSZWFkc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hSZWFkc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoUmVhZHNbaWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgd3JpdGUgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFdyaXRlc1tpZF0pIHtcbiAgICAgICAgYmF0Y2hXcml0ZXNbaWRdKCk7XG4gICAgICAgIGRlbGV0ZSBiYXRjaFdyaXRlc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgYmF0Y2guXG4gICAgYmF0Y2gubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCAmJiBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX25leHRTdGVwID0gcmFmKHRoaXMuX3N0ZXApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdGlja2VyID0gbmV3IFRpY2tlcigpO1xuXG4gIHZhciBsYXlvdXRUaWNrID0gJ2xheW91dCc7XG4gIHZhciB2aXNpYmlsaXR5VGljayA9ICd2aXNpYmlsaXR5JztcbiAgdmFyIG1vdmVUaWNrID0gJ21vdmUnO1xuICB2YXIgc2Nyb2xsVGljayA9ICdzY3JvbGwnO1xuICB2YXIgcGxhY2Vob2xkZXJUaWNrID0gJ3BsYWNlaG9sZGVyJztcblxuICBmdW5jdGlvbiBhZGRMYXlvdXRUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgbGF5b3V0VGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbExheW91dFRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbGF5b3V0VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWaXNpYmlsaXR5VGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHZpc2liaWxpdHlUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkTW92ZVRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBtb3ZlVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbE1vdmVUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIG1vdmVUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNjcm9sbFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBzY3JvbGxUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsU2Nyb2xsVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBzY3JvbGxUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljaywgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBwbGFjZWhvbGRlclRpY2spO1xuICB9XG5cbiAgdmFyIEVsUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gIHZhciBtYXRjaGVzRm4gPVxuICAgIEVsUHJvdG8ubWF0Y2hlcyB8fFxuICAgIEVsUHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLm9NYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbGVtZW50IG1hdGNoZXMgYSBDU1Mgc2VsZWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNGbi5jYWxsKGVsLCBzZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNsYXNzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFlbGVtZW50TWF0Y2hlcyhlbGVtZW50LCAnLicgKyBjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcEFycmF5ID0gW107XG4gIHZhciBudW1iZXJUeXBlID0gJ251bWJlcic7XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbiBpdGVtIG9yIGFuIGFycmF5IG9mIGl0ZW1zIHRvIGFycmF5IHRvIGEgc3BlY2lmaWVkIGluZGV4LiBNdXRhdGVzXG4gICAqIHRoZSBhcnJheS4gVGhlIGluZGV4IGNhbiBiZSBuZWdhdGl2ZSBpbiB3aGljaCBjYXNlIHRoZSBpdGVtcyB3aWxsIGJlIGFkZGVkXG4gICAqIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0geyp9IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaW5kZXg9LTFdXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluc2VydChhcnJheSwgaXRlbXMsIGluZGV4KSB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0eXBlb2YgaW5kZXggPT09IG51bWJlclR5cGUgPyBpbmRleCA6IC0xO1xuICAgIGlmIChzdGFydEluZGV4IDwgMCkgc3RhcnRJbmRleCA9IGFycmF5Lmxlbmd0aCAtIHN0YXJ0SW5kZXggKyAxO1xuXG4gICAgYXJyYXkuc3BsaWNlLmFwcGx5KGFycmF5LCB0ZW1wQXJyYXkuY29uY2F0KHN0YXJ0SW5kZXgsIDAsIGl0ZW1zKSk7XG4gICAgdGVtcEFycmF5Lmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGFycmF5IGluZGV4LiBCYXNpY2FsbHkgdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkXG4gICAqIGFycmF5IGluZGV4IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgYWxzbyB0cmFuc2Zvcm1zXG4gICAqIG5lZ2F0aXZlIGluZGV4IHRvIHRoZSBtYXRjaGluZyBwb3NpdGl2ZSBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNNaWdyYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4LCBpc01pZ3JhdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIG1heEluZGV4ID0gTWF0aC5tYXgoMCwgaXNNaWdyYXRpb24gPyBsZW5ndGggOiBsZW5ndGggLSAxKTtcbiAgICByZXR1cm4gaW5kZXggPiBtYXhJbmRleCA/IG1heEluZGV4IDogaW5kZXggPCAwID8gTWF0aC5tYXgobWF4SW5kZXggKyBpbmRleCArIDEsIDApIDogaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhcnJheSBpdGVtIHRvIGFub3RoZXIgaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXhcbiAgICogICAtIEluZGV4IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgb2YgdGhlIGl0ZW0gdGhhdCB3aWxsIGJlIG1vdmVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgbW92ZWQgdG8uXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1vdmUoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGZyb20gPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCBmcm9tSW5kZXgpO1xuICAgIHZhciB0byA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIHRvSW5kZXgpO1xuXG4gICAgLy8gQWRkIHRhcmdldCBpdGVtIHRvIHRoZSBuZXcgcG9zaXRpb24uXG4gICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICBhcnJheS5zcGxpY2UodG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgYXJyYXkgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpdGhJbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgb3RoZXIgaXRlbSB0aGF0IHdpbGwgYmUgc3dhcHBlZC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U3dhcChhcnJheSwgaW5kZXgsIHdpdGhJbmRleCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaGFzIHR3byBvciBtb3JlIGl0ZW1zLlxuICAgIGlmIChhcnJheS5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIGluZGljZXMuXG4gICAgdmFyIGluZGV4QSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGluZGV4KTtcbiAgICB2YXIgaW5kZXhCID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgd2l0aEluZGV4KTtcbiAgICB2YXIgdGVtcDtcblxuICAgIC8vIFN3YXAgdGhlIGl0ZW1zLlxuICAgIGlmIChpbmRleEEgIT09IGluZGV4Qikge1xuICAgICAgdGVtcCA9IGFycmF5W2luZGV4QV07XG4gICAgICBhcnJheVtpbmRleEFdID0gYXJyYXlbaW5kZXhCXTtcbiAgICAgIGFycmF5W2luZGV4Ql0gPSB0ZW1wO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY3Rpb25DYW5jZWwgPSAnY2FuY2VsJztcbiAgdmFyIGFjdGlvbkZpbmlzaCA9ICdmaW5pc2gnO1xuICB2YXIgZGVib3VuY2VUaWNrID0gJ2RlYm91bmNlJztcbiAgdmFyIGRlYm91bmNlSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gICAqIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgICogTiBtaWxsaXNlY29uZHMuIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBhY2NlcHRzIG9uZSBhcmd1bWVudCB3aGljaCwgd2hlblxuICAgKiBiZWluZyBcImZpbmlzaFwiLCBjYWxscyB0aGUgZGVib3VuY2UgZnVuY3Rpb24gaW1tZWRpYXRlbHkgaWYgaXQgaXMgY3VycmVudGx5XG4gICAqIHdhaXRpbmcgdG8gYmUgY2FsbGVkLCBhbmQgd2hlbiBiZWluZyBcImNhbmNlbFwiIGNhbmNlbHMgdGhlIGN1cnJlbnRseSBxdWV1ZWRcbiAgICogZnVuY3Rpb24gY2FsbC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdhaXRcbiAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIHdhaXQpIHtcbiAgICB2YXIgdGltZW91dDtcbiAgICB2YXIgdGlja2VySWQgPSArK2RlYm91bmNlSWQgKyBkZWJvdW5jZVRpY2s7XG5cbiAgICBpZiAod2FpdCA+IDApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHRpY2tlci5jYW5jZWwodGlja2VySWQpO1xuICAgICAgICAgIGlmIChhY3Rpb24gPT09IGFjdGlvbkZpbmlzaCkgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24gIT09IGFjdGlvbkNhbmNlbCAmJiBhY3Rpb24gIT09IGFjdGlvbkZpbmlzaCkge1xuICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aWNrZXIuYWRkKHRpY2tlcklkLCBmbiwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsKSBmbigpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgaXMgdHJhbnNmb3JtZWQsIGZhbHNlIGlmIG5vdC4gSW4gcHJhY3RpY2UgdGhlXG4gICAqIGVsZW1lbnQncyBkaXNwbGF5IHZhbHVlIG11c3QgYmUgYW55dGhpbmcgZWxzZSB0aGFuIFwibm9uZVwiIG9yIFwiaW5saW5lXCIgYXNcbiAgICogd2VsbCBhcyBoYXZlIGEgdmFsaWQgdHJhbnNmb3JtIHZhbHVlIGFwcGxpZWQgaW4gb3JkZXIgdG8gYmUgY291bnRlZCBhcyBhXG4gICAqIHRyYW5zZm9ybWVkIGVsZW1lbnQuXG4gICAqXG4gICAqIEJvcnJvd2VkIGZyb20gTWV6ciAodjAuNi4xKTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3JhbW8vbWV6ci9ibG9iLzAuNi4xL21lenIuanMjTDY2MVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNUcmFuc2Zvcm1lZChlbGVtZW50KSB7XG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsICd0cmFuc2Zvcm0nKTtcbiAgICBpZiAoIXRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0gPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGRpc3BsYXkgPSBnZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpO1xuICAgIGlmIChkaXNwbGF5ID09PSAnaW5saW5lJyB8fCBkaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50J3MgY29udGFpbmluZyBibG9jaywgd2hpY2ggaXNcbiAgICogY29uc2lkZXJlZCB0byBiZSB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgdGhlIHRhcmdldCBlbGVtZW50J3NcbiAgICogcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8uIERpc2NsYWltZXI6IHRoaXMgb25seSB3b3JrcyBhcyBpbnRlbmRlZCBmb3JcbiAgICogYWJzb2x1dGUgcG9zaXRpb25lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9jayBjaGVja2luZyBpcyBzdGFydGVkIGZyb21cbiAgICogICAgIHRoZSBwcm92aWRlZCBlbGVtZW50LiBPdGhlcndpc2UgdGhlIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbSB0aGVcbiAgICogICAgIHByb3ZpZGVkIGVsZW1lbnQncyBwYXJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybnMgeyhEb2N1bWVudHxFbGVtZW50KX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50LCBpbmNsdWRlU2VsZikge1xuICAgIC8vIEFzIGxvbmcgYXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgYW4gZWxlbWVudCwgc3RhdGljIGFuZCBub3RcbiAgICAvLyB0cmFuc2Zvcm1lZCwgdHJ5IHRvIGdldCB0aGUgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50IGFuZCBmYWxsYmFjayB0b1xuICAgIC8vIGRvY3VtZW50LiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMMzM5XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciByZXQgPSAoaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudDtcbiAgICB3aGlsZSAocmV0ICYmIHJldCAhPT0gZG9jdW1lbnQgJiYgZ2V0U3R5bGUocmV0LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgIWlzVHJhbnNmb3JtZWQocmV0KSkge1xuICAgICAgcmV0ID0gcmV0LnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYW4gZWxlbWVudCdzIHN0eWxlIHByb3BlcnR5IHRyYW5zZm9ybWVkIGludG9cbiAgICogYSBmbG9hdCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZUFzRmxvYXQoZWwsIHN0eWxlKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZ2V0U3R5bGUoZWwsIHN0eWxlKSkgfHwgMDtcbiAgfVxuXG4gIHZhciBvZmZzZXRBID0ge307XG4gIHZhciBvZmZzZXRCID0ge307XG4gIHZhciBvZmZzZXREaWZmID0ge307XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBkb2N1bWVudCBvZmZzZXQsIHdoaWNoIGluIHByYWN0aWNlIG1lYW5zIHRoZSB2ZXJ0aWNhbFxuICAgKiBhbmQgaG9yaXpvbnRhbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBlbGVtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lciBhbmQgdGhlXG4gICAqIGRvY3VtZW50J3Mgbm9ydGh3ZXN0IGNvcm5lci4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdGhlIHNhbWVcbiAgICogb2JqZWN0IHNvIGJlIHN1cmUgdG8gcmVhZCB0aGUgZGF0YSBmcm9tIGl0IGluc3RlYWQgdXNpbmcgaXQgYXMgYSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KERvY3VtZW50fEVsZW1lbnR8V2luZG93KX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29mZnNldERhdGFdXG4gICAqICAgLSBPcHRpb25hbCBkYXRhIG9iamVjdCB3aGVyZSB0aGUgb2Zmc2V0IGRhdGEgd2lsbCBiZSBpbnNlcnRlZCB0by4gSWYgbm90XG4gICAqICAgICBwcm92aWRlZCBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgcmV0dXJuIGRhdGEuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRPZmZzZXQoZWxlbWVudCwgb2Zmc2V0RGF0YSkge1xuICAgIHZhciByZXQgPSBvZmZzZXREYXRhIHx8IHt9O1xuICAgIHZhciByZWN0O1xuXG4gICAgLy8gU2V0IHVwIHJldHVybiBkYXRhLlxuICAgIHJldC5sZWZ0ID0gMDtcbiAgICByZXQudG9wID0gMDtcblxuICAgIC8vIERvY3VtZW50J3Mgb2Zmc2V0cyBhcmUgYWx3YXlzIDAuXG4gICAgaWYgKGVsZW1lbnQgPT09IGRvY3VtZW50KSByZXR1cm4gcmV0O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB0byB0aGUgcmVzcGVjdGl2ZSBvZmZzZXRzLlxuICAgIHJldC5sZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IDA7XG4gICAgcmV0LnRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCAwO1xuXG4gICAgLy8gV2luZG93J3Mgb2Zmc2V0cyBhcmUgdGhlIHZpZXdwb3J0IHNjcm9sbCBsZWZ0L3RvcCB2YWx1ZXMuXG4gICAgaWYgKGVsZW1lbnQuc2VsZiA9PT0gd2luZG93LnNlbGYpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgZWxlbWVudCdzIGNsaWVudCByZWN0cyB0byB0aGUgb2Zmc2V0cy5cbiAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXQubGVmdCArPSByZWN0LmxlZnQ7XG4gICAgcmV0LnRvcCArPSByZWN0LnRvcDtcblxuICAgIC8vIEV4Y2x1ZGUgZWxlbWVudCdzIGJvcmRlcnMgZnJvbSB0aGUgb2Zmc2V0LlxuICAgIHJldC5sZWZ0ICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICByZXQudG9wICs9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIHR3byBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUFcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbUJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29tcGFyZUNvbnRhaW5pbmdCbG9ja3M9ZmFsc2VdXG4gICAqICAgLSBXaGVuIHRoaXMgaXMgc2V0IHRvIHRydWUgdGhlIGNvbnRhaW5pbmcgYmxvY2tzIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50c1xuICAgKiAgICAgd2lsbCBiZSB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZS4gT3RoZXJ3aXNlIHRoZSBwcm92aWRlZFxuICAgKiAgICAgZWxlbWVudHMgd2lsbCBiZSBjb21wYXJlZCBkaXJlY3RseS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldERpZmYoZWxlbUEsIGVsZW1CLCBjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcykge1xuICAgIG9mZnNldERpZmYubGVmdCA9IDA7XG4gICAgb2Zmc2V0RGlmZi50b3AgPSAwO1xuXG4gICAgLy8gSWYgZWxlbWVudHMgYXJlIHNhbWUgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuXG4gICAgLy8gQ29tcGFyZSBjb250YWluaW5nIGJsb2NrcyBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgICBlbGVtQSA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQSwgdHJ1ZSk7XG4gICAgICBlbGVtQiA9IGdldENvbnRhaW5pbmdCbG9jayhlbGVtQiwgdHJ1ZSk7XG5cbiAgICAgIC8vIElmIGNvbnRhaW5pbmcgYmxvY2tzIGFyZSBpZGVudGljYWwsIGxldCdzIHJldHVybiBlYXJseS5cbiAgICAgIGlmIChlbGVtQSA9PT0gZWxlbUIpIHJldHVybiBvZmZzZXREaWZmO1xuICAgIH1cblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmYuXG4gICAgZ2V0T2Zmc2V0KGVsZW1BLCBvZmZzZXRBKTtcbiAgICBnZXRPZmZzZXQoZWxlbUIsIG9mZnNldEIpO1xuICAgIG9mZnNldERpZmYubGVmdCA9IG9mZnNldEIubGVmdCAtIG9mZnNldEEubGVmdDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IG9mZnNldEIudG9wIC0gb2Zmc2V0QS50b3A7XG5cbiAgICByZXR1cm4gb2Zmc2V0RGlmZjtcbiAgfVxuXG4gIHZhciBzdHlsZU92ZXJmbG93ID0gJ292ZXJmbG93JztcbiAgdmFyIHN0eWxlT3ZlcmZsb3dYID0gJ292ZXJmbG93LXgnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1kgPSAnb3ZlcmZsb3cteSc7XG4gIHZhciBvdmVyZmxvd0F1dG8gPSAnYXV0byc7XG4gIHZhciBvdmVyZmxvd1Njcm9sbCA9ICdzY3JvbGwnO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHNjcm9sbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGFibGUoZWxlbWVudCkge1xuICAgIHZhciBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3cpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dYKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgb3ZlcmZsb3cgPSBnZXRTdHlsZShlbGVtZW50LCBzdHlsZU92ZXJmbG93WSk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGVsZW1lbnQncyBhbmNlc3RvcnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgc2Nyb2xsYWJsZSBlbGVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbmNsdWRlU2VsZj1mYWxzZV1cbiAgICogQHBhcmFtIHtBcnJheX0gW2RhdGFdXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZWxlbWVudCwgaW5jbHVkZVNlbGYsIGRhdGEpIHtcbiAgICB2YXIgcmV0ID0gZGF0YSB8fCBbXTtcbiAgICB2YXIgcGFyZW50ID0gaW5jbHVkZVNlbGYgPyBlbGVtZW50IDogZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gRmluZCBzY3JvbGwgcGFyZW50cy5cbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgaW5zaWRlIFNoYWRvd0RPTSBsZXQncyBnZXQgaXQncyBob3N0IG5vZGUgZnJvbSB0aGUgcmVhbFxuICAgICAgLy8gRE9NIGFuZCBjb250aW51ZSBsb29waW5nLlxuICAgICAgaWYgKHBhcmVudC5nZXRSb290Tm9kZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRSb290Tm9kZSgpLmhvc3Q7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBlbGVtZW50IGlzIHNjcm9sbGFibGUgbGV0J3MgYWRkIGl0IHRvIHRoZSBzY3JvbGxhYmxlIGxpc3QuXG4gICAgICBpZiAoaXNTY3JvbGxhYmxlKHBhcmVudCkpIHtcbiAgICAgICAgcmV0LnB1c2gocGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGFkZCB3aW5kb3cgdG8gdGhlIHJlc3VsdHMuXG4gICAgcmV0LnB1c2god2luZG93KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICB2YXIgdHJhbnNsYXRlVmFsdWUgPSB7fTtcbiAgdmFyIHRyYW5zZm9ybVN0eWxlJDIgPSAndHJhbnNmb3JtJztcbiAgdmFyIHRyYW5zZm9ybU5vbmUgPSAnbm9uZSc7XG4gIHZhciByeE1hdDNkID0gL15tYXRyaXgzZC87XG4gIHZhciByeE1hdFR4ID0gLyhbXixdKiwpezR9LztcbiAgdmFyIHJ4TWF0M2RUeCA9IC8oW14sXSosKXsxMn0vO1xuICB2YXIgcnhOZXh0SXRlbSA9IC9bXixdKiwvO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50J3MgY29tcHV0ZWQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgYXMgYSBmbG9hdHMuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYWx3YXlzIHRoZSBzYW1lIG9iamVjdCBhbmQgdXBkYXRlZCBldmVyeSB0aW1lIHRoaXNcbiAgICogZnVuY3Rpb24gaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGUoZWxlbWVudCkge1xuICAgIHRyYW5zbGF0ZVZhbHVlLnggPSAwO1xuICAgIHRyYW5zbGF0ZVZhbHVlLnkgPSAwO1xuXG4gICAgdmFyIHRyYW5zZm9ybSA9IGdldFN0eWxlKGVsZW1lbnQsIHRyYW5zZm9ybVN0eWxlJDIpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gdHJhbnNmb3JtTm9uZSkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZVZhbHVlO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBzdHlsZSBjYW4gYmUgaW4gZWl0aGVyIG1hdHJpeDNkKC4uLikgb3IgbWF0cml4KC4uLikuXG4gICAgdmFyIGlzTWF0M2QgPSByeE1hdDNkLnRlc3QodHJhbnNmb3JtKTtcbiAgICB2YXIgdFggPSB0cmFuc2Zvcm0ucmVwbGFjZShpc01hdDNkID8gcnhNYXQzZFR4IDogcnhNYXRUeCwgJycpO1xuICAgIHZhciB0WSA9IHRYLnJlcGxhY2UocnhOZXh0SXRlbSwgJycpO1xuXG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IHBhcnNlRmxvYXQodFgpIHx8IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IHBhcnNlRmxvYXQodFkpIHx8IDA7XG5cbiAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRyYW5zbGF0ZVggYW5kIHRyYW5zbGF0ZVkgdmFsdWUgaW50byBDU1MgdHJhbnNmb3JtIHN0eWxlXG4gICAqIHByb3BlcnR5J3MgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGVTdHJpbmcoeCwgeSkge1xuICAgIHJldHVybiAndHJhbnNsYXRlWCgnICsgeCArICdweCkgdHJhbnNsYXRlWSgnICsgeSArICdweCknO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSAoJyAnICsgZWxlbWVudC5jbGFzc05hbWUgKyAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoJyAnICsgY2xhc3NOYW1lICsgJyAnLCAnICcpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZXMuXG4gIHZhciBzdGFydFByZWRpY2F0ZUluYWN0aXZlID0gMDtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUGVuZGluZyA9IDE7XG4gIHZhciBzdGFydFByZWRpY2F0ZVJlc29sdmVkID0gMjtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVqZWN0ZWQgPSAzO1xuXG4gIC8qKlxuICAgKiBCaW5kIHRvdWNoIGludGVyYWN0aW9uIHRvIGFuIGl0ZW0uXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1EcmFnKGl0ZW0pIHtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0YXJ0IHByZWRpY2F0ZSBkYXRhLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlID0gaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU3RhcnRQcmVkaWNhdGUpXG4gICAgICA/IHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZVxuICAgICAgOiBJdGVtRHJhZy5kZWZhdWx0U3RhcnRQcmVkaWNhdGU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBEYXRhIGZvciBkcmFnIHNvcnQgcHJlZGljYXRlIGhldXJpc3RpY3MuXG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gMDtcbiAgICB0aGlzLl9oWDIgPSAwO1xuICAgIHRoaXMuX2hZMSA9IDA7XG4gICAgdGhpcy5faFkyID0gMDtcblxuICAgIC8vIFNldHVwIGl0ZW0ncyBpbml0aWFsIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gQmluZCB0aGUgbWV0aG9kcyB0aGF0IG5lZWRzIGJpbmRpbmcuXG4gICAgdGhpcy5fcHJlU3RhcnRDaGVjayA9IHRoaXMuX3ByZVN0YXJ0Q2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVFbmRDaGVjayA9IHRoaXMuX3ByZUVuZENoZWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVNb3ZlID0gdGhpcy5fcHJlcGFyZU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hcHBseU1vdmUgPSB0aGlzLl9hcHBseU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVwYXJlU2Nyb2xsID0gdGhpcy5fcHJlcGFyZVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5U2Nyb2xsID0gdGhpcy5fYXBwbHlTY3JvbGwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jaGVja092ZXJsYXAgPSB0aGlzLl9jaGVja092ZXJsYXAuYmluZCh0aGlzKTtcblxuICAgIC8vIENyZWF0ZSBkZWJvdW5jZSBvdmVybGFwIGNoZWNrZXIgZnVuY3Rpb24uXG4gICAgdmFyIHNvcnRJbnRlcnZhbCA9IHNldHRpbmdzLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw7XG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UgPSBkZWJvdW5jZSh0aGlzLl9jaGVja092ZXJsYXAsIHNvcnRJbnRlcnZhbCk7XG5cbiAgICAvLyBJbml0IGRyYWdnZXIuXG4gICAgdGhpcy5fZHJhZ2dlciA9IG5ldyBEcmFnZ2VyKGVsZW1lbnQsIHNldHRpbmdzLmRyYWdDc3NQcm9wcyk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignc3RhcnQnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdtb3ZlJywgdGhpcy5fcHJlU3RhcnRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignY2FuY2VsJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ2VuZCcsIHRoaXMuX3ByZUVuZENoZWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc3RhcnQgcHJlZGljYXRlIGhhbmRsZXIgdGhhdCBoYW5kbGVzIGFuY2hvciBlbGVtZW50c1xuICAgKiBncmFjZWZ1bGx5LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gZGVmaW5lcyBpZiB0aGUgZHJhZyBpc1xuICAgKiBzdGFydGVkLCByZWplY3RlZCBvciBwZW5kaW5nLiBXaGVuIHRydWUgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHN0YXJ0ZWRcbiAgICogYW5kIHdoZW4gZmFsc2UgaXMgcmV0dXJuZWQgdGhlIGRyYWdnaW5nIGlzIHJlamVjdGVkLiBJZiBub3RoaW5nIGlzIHJldHVybmVkXG4gICAqIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gb24gdGhlIG5leHQgZHJhZyBtb3ZlbWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgLSBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZSBwcmVkaWNhdGVcbiAgICogICAgIGl0J3Mgb3B0aW9ucyBtYW51YWxseS4gQnkgZGVmYXVsdCB0aGUgcHJlZGljYXRlIHJldHJpZXZlcyB0aGUgb3B0aW9uc1xuICAgKiAgICAgZnJvbSB0aGUgZ3JpZCdzIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGl0ZW0sIGV2ZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIGRyYWcgPSBpdGVtLl9kcmFnO1xuICAgIHZhciBwcmVkaWNhdGUgPSBkcmFnLl9zdGFydFByZWRpY2F0ZURhdGEgfHwgZHJhZy5fc2V0dXBTdGFydFByZWRpY2F0ZShvcHRpb25zKTtcblxuICAgIC8vIEZpbmFsIGV2ZW50IGxvZ2ljLiBBdCB0aGlzIHN0YWdlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgYW55bW9yZSxcbiAgICAvLyB0aGUgcHJlZGljYXRlIGlzIGVpdGhlciByZXNvbHZlZCBvciBpdCdzIG5vdCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgLy8gYWJvdXQgaXQuIEhlcmUgd2UganVzdCByZXNldCBkYXRhIGFuZCBpZiB0aGUgaXRlbSBlbGVtZW50IGlzIGEgbGlua1xuICAgIC8vIHdlIGZvbGxvdyBpdCAoaWYgdGhlcmUgaGFzIG9ubHkgYmVlbiBzbGlnaHQgbW92ZW1lbnQpLlxuICAgIGlmIChldmVudC5pc0ZpbmFsKSB7XG4gICAgICBkcmFnLl9maW5pc2hTdGFydFByZWRpY2F0ZShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBhbmQgc3RvcmUgdGhlIGhhbmRsZSBlbGVtZW50IHNvIHdlIGNhbiBjaGVjayBsYXRlciBvbiBpZiB0aGVcbiAgICAvLyBjdXJzb3IgaXMgd2l0aGluIHRoZSBoYW5kbGUuIElmIHdlIGhhdmUgYSBoYW5kbGUgc2VsZWN0b3IgbGV0J3MgZmluZFxuICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIE90aGVyd2lzZSBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGVcbiAgICAvLyBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCkge1xuICAgICAgcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQgPSBkcmFnLl9nZXRTdGFydFByZWRpY2F0ZUhhbmRsZShldmVudCk7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgZGVsYXkgaXMgZGVmaW5lZCBsZXQncyBrZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgZXZlbnQgYW5kIGluaXRpYXRlXG4gICAgLy8gZGVsYXkgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgeWV0LlxuICAgIGlmIChwcmVkaWNhdGUuZGVsYXkpIHtcbiAgICAgIHByZWRpY2F0ZS5ldmVudCA9IGV2ZW50O1xuICAgICAgaWYgKCFwcmVkaWNhdGUuZGVsYXlUaW1lcikge1xuICAgICAgICBwcmVkaWNhdGUuZGVsYXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByZWRpY2F0ZS5kZWxheSA9IDA7XG4gICAgICAgICAgaWYgKGRyYWcuX3Jlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpKSB7XG4gICAgICAgICAgICBkcmFnLl9mb3JjZVJlc29sdmVTdGFydFByZWRpY2F0ZShwcmVkaWNhdGUuZXZlbnQpO1xuICAgICAgICAgICAgZHJhZy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgcHJlZGljYXRlLmRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkcmFnIHNvcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTUwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPSdtb3ZlJ11cbiAgICogQHJldHVybnMgeyhCb29sZWFufERyYWdTb3J0Q29tbWFuZCl9XG4gICAqICAgLSBSZXR1cm5zIGZhbHNlIGlmIG5vIHZhbGlkIGluZGV4IHdhcyBmb3VuZC4gT3RoZXJ3aXNlIHJldHVybnMgZHJhZyBzb3J0XG4gICAqICAgICBjb21tYW5kLlxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1SZWN0ID0ge307XG4gICAgdmFyIHRhcmdldFJlY3QgPSB7fTtcbiAgICB2YXIgcmV0dXJuRGF0YSA9IHt9O1xuICAgIHZhciByb290R3JpZEFycmF5ID0gW107XG5cbiAgICBmdW5jdGlvbiBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCB0aHJlc2hvbGQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsO1xuICAgICAgdmFyIGRyYWdTb3J0ID0gcm9vdEdyaWQuX3NldHRpbmdzLmRyYWdTb3J0O1xuICAgICAgdmFyIGJlc3RTY29yZSA9IC0xO1xuICAgICAgdmFyIGdyaWRTY29yZTtcbiAgICAgIHZhciBncmlkcztcbiAgICAgIHZhciBncmlkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIEdldCBwb3RlbnRpYWwgdGFyZ2V0IGdyaWRzLlxuICAgICAgaWYgKGRyYWdTb3J0ID09PSB0cnVlKSB7XG4gICAgICAgIHJvb3RHcmlkQXJyYXlbMF0gPSByb290R3JpZDtcbiAgICAgICAgZ3JpZHMgPSByb290R3JpZEFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZHMgPSBkcmFnU29ydC5jYWxsKHJvb3RHcmlkLCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyBncmlkcy5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncmlkcykpIHJldHVybiB0YXJnZXQ7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZ3JpZHMgYW5kIGdldCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncmlkID0gZ3JpZHNbaV07XG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbGwgZGVzdHJveWVkIGdyaWRzLlxuICAgICAgICBpZiAoZ3JpZC5faXNEZXN0cm95ZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncmlkJ3Mgb2Zmc2V0cyBhbmQgZGltZW5zaW9ucyBzaW5jZSB0aGV5IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgY2hhbmdlZCAoZS5nIGR1cmluZyBzY3JvbGxpbmcpLlxuICAgICAgICBncmlkLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBob3cgbXVjaCBkcmFnZ2VkIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gZ3JpZC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gZ3JpZC5faGVpZ2h0O1xuICAgICAgICB0YXJnZXRSZWN0LmxlZnQgPSBncmlkLl9sZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IGdyaWQuX3RvcDtcbiAgICAgICAgZ3JpZFNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBncmlkIGlzIHRoZSBiZXN0IG1hdGNoIHNvIGZhci5cbiAgICAgICAgaWYgKGdyaWRTY29yZSA+IHRocmVzaG9sZCAmJiBncmlkU2NvcmUgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICBiZXN0U2NvcmUgPSBncmlkU2NvcmU7XG4gICAgICAgICAgdGFyZ2V0ID0gZ3JpZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgcmVzZXQgcm9vdCBncmlkIGFycmF5LlxuICAgICAgcm9vdEdyaWRBcnJheS5sZW5ndGggPSAwO1xuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtLCBvcHRpb25zKSB7XG4gICAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgICB2YXIgcm9vdEdyaWQgPSBkcmFnLl9nZXRHcmlkKCk7XG5cbiAgICAgIC8vIEdldCBkcmFnIHNvcnQgcHJlZGljYXRlIHNldHRpbmdzLlxuICAgICAgdmFyIHNvcnRUaHJlc2hvbGQgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnRocmVzaG9sZCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnRocmVzaG9sZCA6IDUwO1xuICAgICAgdmFyIHNvcnRBY3Rpb24gPSBvcHRpb25zICYmIG9wdGlvbnMuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAgIC8vIFBvcHVsYXRlIGl0ZW0gcmVjdCBkYXRhLlxuICAgICAgaXRlbVJlY3Qud2lkdGggPSBpdGVtLl93aWR0aDtcbiAgICAgIGl0ZW1SZWN0LmhlaWdodCA9IGl0ZW0uX2hlaWdodDtcbiAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9lbGVtZW50Q2xpZW50WDtcbiAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2VsZW1lbnRDbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCBncmlkLlxuICAgICAgdmFyIGdyaWQgPSBnZXRUYXJnZXRHcmlkKGl0ZW0sIHJvb3RHcmlkLCBzb3J0VGhyZXNob2xkKTtcblxuICAgICAgLy8gUmV0dXJuIGVhcmx5IGlmIHdlIGZvdW5kIG5vIGdyaWQgY29udGFpbmVyIGVsZW1lbnQgdGhhdCBvdmVybGFwcyB0aGVcbiAgICAgIC8vIGRyYWdnZWQgaXRlbSBlbm91Z2guXG4gICAgICBpZiAoIWdyaWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgdmFyIGdyaWRPZmZzZXRMZWZ0ID0gMDtcbiAgICAgIHZhciBncmlkT2Zmc2V0VG9wID0gMDtcbiAgICAgIHZhciBtYXRjaFNjb3JlID0gLTE7XG4gICAgICB2YXIgbWF0Y2hJbmRleDtcbiAgICAgIHZhciBoYXNWYWxpZFRhcmdldHM7XG4gICAgICB2YXIgdGFyZ2V0O1xuICAgICAgdmFyIHNjb3JlO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIElmIGl0ZW0gaXMgbW92ZWQgd2l0aGluIGl0J3Mgb3JpZ2luYXRpbmcgZ3JpZCBhZGp1c3QgaXRlbSdzIGxlZnQgYW5kXG4gICAgICAvLyB0b3AgcHJvcHMuIE90aGVyd2lzZSBpZiBpdGVtIGlzIG1vdmVkIHRvL3dpdGhpbiBhbm90aGVyIGdyaWQgZ2V0IHRoZVxuICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBvZmZzZXQgKGZyb20gdGhlIGVsZW1lbnQncyBjb250ZW50IGVkZ2UpLlxuICAgICAgaWYgKGdyaWQgPT09IHJvb3RHcmlkKSB7XG4gICAgICAgIGl0ZW1SZWN0LmxlZnQgPSBkcmFnLl9ncmlkWCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgICAgIGl0ZW1SZWN0LnRvcCA9IGRyYWcuX2dyaWRZICsgaXRlbS5fbWFyZ2luVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JpZC5fdXBkYXRlQm9yZGVycygxLCAwLCAxLCAwKTtcbiAgICAgICAgZ3JpZE9mZnNldExlZnQgPSBncmlkLl9sZWZ0ICsgZ3JpZC5fYm9yZGVyTGVmdDtcbiAgICAgICAgZ3JpZE9mZnNldFRvcCA9IGdyaWQuX3RvcCArIGdyaWQuX2JvcmRlclRvcDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXQgZ3JpZCBpdGVtcyBhbmQgdHJ5IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2guXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZC5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGFyZ2V0ID0gZ3JpZC5faXRlbXNbaV07XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBpdGVtIGlzIG5vdCBhY3RpdmUgb3IgdGhlIHRhcmdldCBpdGVtIGlzIHRoZSBkcmFnZ2VkXG4gICAgICAgIC8vIGl0ZW0gbGV0J3Mgc2tpcCB0byB0aGUgbmV4dCBpdGVtLlxuICAgICAgICBpZiAoIXRhcmdldC5faXNBY3RpdmUgfHwgdGFyZ2V0ID09PSBpdGVtKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHRoZSBncmlkIGFzIGhhdmluZyB2YWxpZCB0YXJnZXQgaXRlbXMuXG4gICAgICAgIGhhc1ZhbGlkVGFyZ2V0cyA9IHRydWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGggdGhlIGRyYWdnZWQgaXRlbS5cbiAgICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9IHRhcmdldC5fd2lkdGg7XG4gICAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gdGFyZ2V0Ll9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IHRhcmdldC5fbGVmdCArIHRhcmdldC5fbWFyZ2luTGVmdCArIGdyaWRPZmZzZXRMZWZ0O1xuICAgICAgICB0YXJnZXRSZWN0LnRvcCA9IHRhcmdldC5fdG9wICsgdGFyZ2V0Ll9tYXJnaW5Ub3AgKyBncmlkT2Zmc2V0VG9wO1xuICAgICAgICBzY29yZSA9IGdldFJlY3RPdmVybGFwU2NvcmUoaXRlbVJlY3QsIHRhcmdldFJlY3QpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBiZXN0IG1hdGNoIGluZGV4IGFuZCBzY29yZSBpZiB0aGUgdGFyZ2V0J3Mgb3ZlcmxhcCBzY29yZSB3aXRoXG4gICAgICAgIC8vIHRoZSBkcmFnZ2VkIGl0ZW0gaXMgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdCBtYXRjaCBzY29yZS5cbiAgICAgICAgaWYgKHNjb3JlID4gbWF0Y2hTY29yZSkge1xuICAgICAgICAgIG1hdGNoSW5kZXggPSBpO1xuICAgICAgICAgIG1hdGNoU2NvcmUgPSBzY29yZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyB2YWxpZCBtYXRjaCBhbmQgdGhlIGl0ZW0gaXMgYmVpbmcgbW92ZWQgaW50byBhbm90aGVyXG4gICAgICAvLyBncmlkLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPCBzb3J0VGhyZXNob2xkICYmIGl0ZW0uZ2V0R3JpZCgpICE9PSBncmlkKSB7XG4gICAgICAgIG1hdGNoSW5kZXggPSBoYXNWYWxpZFRhcmdldHMgPyAtMSA6IDA7XG4gICAgICAgIG1hdGNoU2NvcmUgPSBJbmZpbml0eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJlc3QgbWF0Y2ggb3ZlcmxhcHMgZW5vdWdoIHRvIGp1c3RpZnkgYSBwbGFjZW1lbnQgc3dpdGNoLlxuICAgICAgaWYgKG1hdGNoU2NvcmUgPj0gc29ydFRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm5EYXRhLmdyaWQgPSBncmlkO1xuICAgICAgICByZXR1cm5EYXRhLmluZGV4ID0gbWF0Y2hJbmRleDtcbiAgICAgICAgcmV0dXJuRGF0YS5hY3Rpb24gPSBzb3J0QWN0aW9uO1xuICAgICAgICByZXR1cm4gcmV0dXJuRGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFib3J0IGRyYWdnaW5nIGFuZCByZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbURyYWd9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGJlaW5nIGRyb3BwZWQgaW50byBhbm90aGVyIGdyaWQsIGZpbmlzaCBpdCB1cCBhbmQgcmV0dXJuXG4gICAgLy8gaW1tZWRpYXRlbHkuXG4gICAgaWYgKHRoaXMuX2lzTWlncmF0aW5nKSB7XG4gICAgICB0aGlzLl9maW5pc2hNaWdyYXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgbW92ZSBhbmQgc2Nyb2xsIHRpY2tzLlxuICAgIGNhbmNlbE1vdmVUaWNrKGl0ZW0uX2lkKTtcbiAgICBjYW5jZWxTY3JvbGxUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gQ2FuY2VsIG92ZXJsYXAgY2hlY2suXG4gICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoJ2NhbmNlbCcpO1xuXG4gICAgLy8gQXBwZW5kIGl0ZW0gZWxlbWVudCB0byB0aGUgY29udGFpbmVyIGlmIGl0J3Mgbm90IGl0J3MgY2hpbGQuIEFsc28gbWFrZVxuICAgIC8vIHN1cmUgdGhlIHRyYW5zbGF0ZSB2YWx1ZXMgYXJlIGFkanVzdGVkIHRvIGFjY291bnQgZm9yIHRoZSBET00gc2hpZnQuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fZ3JpZFgsIHRoaXMuX2dyaWRZKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dpbmcgY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgZ3JpZC5fc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AoKTtcbiAgICB0aGlzLl9kcmFnZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMgez9HcmlkfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXSB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cC9yZXNldCBkcmFnIGRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJcyBpdGVtIGJlaW5nIGRyYWdnZWQ/XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBkcmFnZ2VkIGl0ZW0ncyBjb250YWluZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gbnVsbDtcblxuICAgIC8vIERyYWcvc2Nyb2xsIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IG51bGw7XG5cbiAgICAvLyBBbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG5lZWQgdG8gYmUgbGlzdGVuZWQgZm9yIHNjcm9sbCBldmVudHMgZHVyaW5nXG4gICAgLy8gZHJhZ2dpbmcuXG4gICAgdGhpcy5fc2Nyb2xsZXJzID0gW107XG5cbiAgICAvLyBUaGUgY3VycmVudCB0cmFuc2xhdGVYL3RyYW5zbGF0ZVkgcG9zaXRpb24uXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLlxuICAgIHRoaXMuX2dyaWRYID0gMDtcbiAgICB0aGlzLl9ncmlkWSA9IDA7XG5cbiAgICAvLyBEcmFnZ2VkIGVsZW1lbnQncyBjdXJyZW50IG9mZnNldCBmcm9tIHdpbmRvdydzIG5vcnRod2VzdCBjb3JuZXIuIERvZXNcbiAgICAvLyBub3QgYWNjb3VudCBmb3IgZWxlbWVudCdzIG1hcmdpbnMuXG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSAwO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gMDtcblxuICAgIC8vIE9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRyYWdnZWQgZWxlbWVudCdzIHRlbXBvcmFyeSBkcmFnXG4gICAgLy8gY29udGFpbmVyIGFuZCBpdCdzIG9yaWdpbmFsIGNvbnRhaW5lci5cbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCaW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIHRvIGFsbCBzY3JvbGxhYmxlIGFuY2VzdG9yIGVsZW1lbnRzIG9mIHRoZVxuICAgKiBkcmFnZ2VkIGVsZW1lbnQgYW5kIHRoZSBkcmFnIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2JpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IHRoaXMuX2dldEdyaWQoKS5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBncmlkU2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gR2V0IGRyYWdnZWQgZWxlbWVudCdzIHNjcm9sbGluZyBwYXJlbnRzLlxuICAgIHNjcm9sbGVycy5sZW5ndGggPSAwO1xuICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnModGhpcy5faXRlbS5fZWxlbWVudCwgZmFsc2UsIHNjcm9sbGVycyk7XG5cbiAgICAvLyBJZiBkcmFnIGNvbnRhaW5lciBpcyBkZWZpbmVkIGFuZCBpdCdzIG5vdCB0aGUgc2FtZSBlbGVtZW50IGFzIGdyaWRcbiAgICAvLyBjb250YWluZXIgdGhlbiB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBjb250YWluZXIgYW5kIGl0J3Mgc2Nyb2xsIHBhcmVudHNcbiAgICAvLyB0byB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIGdvaW5nIHRvIGJlIGxpc3RlbmVyIGZvciBzY3JvbGwgZXZlbnRzLlxuICAgIGlmIChkcmFnQ29udGFpbmVyICE9PSBncmlkQ29udGFpbmVyKSB7XG4gICAgICBncmlkU2Nyb2xsZXJzID0gW107XG4gICAgICBnZXRTY3JvbGxhYmxlQW5jZXN0b3JzKGdyaWRDb250YWluZXIsIHRydWUsIGdyaWRTY3JvbGxlcnMpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRTY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjcm9sbGVycy5pbmRleE9mKGdyaWRTY3JvbGxlcnNbaV0pIDwgMCkge1xuICAgICAgICAgIHNjcm9sbGVycy5wdXNoKGdyaWRTY3JvbGxlcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjcm9sbGVycyA9IHRoaXMuX3Njcm9sbGVycztcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzY3JvbGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjcm9sbGVyc1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fc2V0dXBTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnID0gb3B0aW9ucyB8fCB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSB8fCAwO1xuICAgIHJldHVybiAodGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhID0ge1xuICAgICAgZGlzdGFuY2U6IE1hdGguYWJzKGNvbmZpZy5kaXN0YW5jZSkgfHwgMCxcbiAgICAgIGRlbGF5OiBNYXRoLm1heChjb25maWcuZGVsYXksIDApIHx8IDAsXG4gICAgICBoYW5kbGU6IHR5cGVvZiBjb25maWcuaGFuZGxlID09PSAnc3RyaW5nJyA/IGNvbmZpZy5oYW5kbGUgOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cCBkZWZhdWx0IHN0YXJ0IHByZWRpY2F0ZSBoYW5kbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHs/SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgcHJlZGljYXRlID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVEYXRhO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaGFuZGxlRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBObyBoYW5kbGUsIG5vIGhhc3NsZSAtPiBsZXQncyB1c2UgdGhlIGl0ZW0gZWxlbWVudCBhcyB0aGUgaGFuZGxlLlxuICAgIGlmICghcHJlZGljYXRlLmhhbmRsZSkgcmV0dXJuIGhhbmRsZUVsZW1lbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNwZWNpZmljIHByZWRpY2F0ZSBoYW5kbGUgZGVmaW5lZCwgbGV0J3MgdHJ5IHRvIGdldCBpdC5cbiAgICBoYW5kbGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIHdoaWxlIChoYW5kbGVFbGVtZW50ICYmICFlbGVtZW50TWF0Y2hlcyhoYW5kbGVFbGVtZW50LCBwcmVkaWNhdGUuaGFuZGxlKSkge1xuICAgICAgaGFuZGxlRWxlbWVudCA9IGhhbmRsZUVsZW1lbnQgIT09IGVsZW1lbnQgPyBoYW5kbGVFbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlRWxlbWVudCB8fCBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgY3VycmVudGx5IGJvdW5kIGRyYWcgc2Nyb2xsIGhhbmRsZXJzIGZyb20gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3JcbiAgICogZWxlbWVudHMgb2YgdGhlIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG5cbiAgICAvLyBJZiB0aGUgbW92ZWQgZGlzdGFuY2UgaXMgc21hbGxlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGlzdGFuY2Ugb3IgdGhlcmUgaXNcbiAgICAvLyBzb21lIGRlbGF5IGxlZnQsIGlnbm9yZSB0aGlzIHByZWRpY2F0ZSBjeWNsZS5cbiAgICBpZiAoZXZlbnQuZGlzdGFuY2UgPCBwcmVkaWNhdGUuZGlzdGFuY2UgfHwgcHJlZGljYXRlLmRlbGF5KSByZXR1cm47XG5cbiAgICAvLyBHZXQgaGFuZGxlIHJlY3QgZGF0YS5cbiAgICB2YXIgaGFuZGxlUmVjdCA9IHByZWRpY2F0ZS5oYW5kbGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYW5kbGVMZWZ0ID0gaGFuZGxlUmVjdC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCAwKTtcbiAgICB2YXIgaGFuZGxlVG9wID0gaGFuZGxlUmVjdC50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZVJlY3Qud2lkdGg7XG4gICAgdmFyIGhhbmRsZUhlaWdodCA9IGhhbmRsZVJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnNvciBpcyBzdGlsbCB3aXRoaW4gdGhlIGhhbmRsZSBsZXQncyBzdGFydCB0aGUgZHJhZy5cbiAgICByZXR1cm4gKFxuICAgICAgaGFuZGxlV2lkdGggJiZcbiAgICAgIGhhbmRsZUhlaWdodCAmJlxuICAgICAgZXZlbnQucGFnZVggPj0gaGFuZGxlTGVmdCAmJlxuICAgICAgZXZlbnQucGFnZVggPCBoYW5kbGVMZWZ0ICsgaGFuZGxlV2lkdGggJiZcbiAgICAgIGV2ZW50LnBhZ2VZID49IGhhbmRsZVRvcCAmJlxuICAgICAgZXZlbnQucGFnZVkgPCBoYW5kbGVUb3AgKyBoYW5kbGVIZWlnaHRcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZWZ1bGx5IHJlc29sdmUgZHJhZyBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzRGVzdHJveWVkICYmIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUGVuZGluZykge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG4gICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5faXRlbS5fZWxlbWVudDtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGljayAodmVyeSBzdWJqZWN0aXZlIGhldXJpc3RpY3MpLlxuICAgIHZhciBpc0NsaWNrID0gTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA8IDIgJiYgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSA8IDIgJiYgZXZlbnQuZGVsdGFUaW1lIDwgMjAwO1xuXG4gICAgLy8gUmVzZXQgcHJlZGljYXRlLlxuICAgIHRoaXMuX3Jlc2V0U3RhcnRQcmVkaWNhdGUoKTtcblxuICAgIC8vIElmIHRoZSBnZXN0dXJlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBjbGljayBsZXQncyB0cnkgdG8gb3BlbiB0aGUgZWxlbWVudCdzXG4gICAgLy8gaHJlZiB1cmwgKGlmIGl0IGlzIGFuIGFuY2hvciBlbGVtZW50KS5cbiAgICBpZiAoaXNDbGljaykgb3BlbkFuY2hvckhyZWYoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IGRyYWcgc29ydCBoZXVyaXN0aWNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldEhldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuX2hYMSA9IHRoaXMuX2hYMiA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5faFkxID0gdGhpcy5faFkyID0gZXZlbnQuY2xpZW50WTtcbiAgfTtcblxuICAvKipcbiAgICogUnVuIGhldXJpc3RpY3MgYW5kIHJldHVybiB0cnVlIGlmIG92ZXJsYXAgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZCwgYW5kIGZhbHNlXG4gICAqIGlmIGl0IGNhbiBub3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9jaGVja0hldXJpc3RpY3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzO1xuICAgIHZhciBtaW5EaXN0ID0gc2V0dGluZ3MubWluRHJhZ0Rpc3RhbmNlO1xuXG4gICAgLy8gU2tpcCBoZXVyaXN0aWNzIGlmIG5vdCBuZWVkZWQuXG4gICAgaWYgKG1pbkRpc3QgPD0gMCkge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuICAgIHZhciBkaWZmWCA9IHggLSB0aGlzLl9oWDI7XG4gICAgdmFyIGRpZmZZID0geSAtIHRoaXMuX2hZMjtcblxuICAgIC8vIElmIHdlIGNhbid0IGRvIHByb3BlciBib3VuY2UgYmFjayBjaGVjayBtYWtlIHN1cmUgdGhhdCB0aGUgYmxvY2tlZCBpbmRleFxuICAgIC8vIGlzIG5vdCBzZXQuXG4gICAgdmFyIGNhbkNoZWNrQm91bmNlQmFjayA9IG1pbkRpc3QgPiAzICYmIHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSA+IDA7XG4gICAgaWYgKCFjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBtaW5EaXN0IHx8IE1hdGguYWJzKGRpZmZZKSA+IG1pbkRpc3QpIHtcbiAgICAgIC8vIFJlc2V0IGJsb2NrZWQgaW5kZXggaWYgYW5nbGUgY2hhbmdlZCBlbm91Z2guIFRoaXMgY2hlY2sgcmVxdWlyZXMgYVxuICAgICAgLy8gbWluaW11bSB2YWx1ZSBvZiAzIGZvciBtaW5EcmFnRGlzdGFuY2UgdG8gZnVuY3Rpb24gcHJvcGVybHkuXG4gICAgICBpZiAoY2FuQ2hlY2tCb3VuY2VCYWNrKSB7XG4gICAgICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoZGlmZlgsIGRpZmZZKTtcbiAgICAgICAgdmFyIHByZXZBbmdsZSA9IE1hdGguYXRhbjIodGhpcy5faFgyIC0gdGhpcy5faFgxLCB0aGlzLl9oWTIgLSB0aGlzLl9oWTEpO1xuICAgICAgICB2YXIgZGVsdGFBbmdsZSA9IE1hdGguYXRhbjIoTWF0aC5zaW4oYW5nbGUgLSBwcmV2QW5nbGUpLCBNYXRoLmNvcyhhbmdsZSAtIHByZXZBbmdsZSkpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZGVsdGFBbmdsZSkgPiBzZXR0aW5ncy5taW5Cb3VuY2VCYWNrQW5nbGUpIHtcbiAgICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcG9pbnRzLlxuICAgICAgdGhpcy5faFgxID0gdGhpcy5faFgyO1xuICAgICAgdGhpcy5faFkxID0gdGhpcy5faFkyO1xuICAgICAgdGhpcy5faFgyID0geDtcbiAgICAgIHRoaXMuX2hZMiA9IHk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZm9yIGRlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcmVzZXRTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgaWYgKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LmNsZWFyVGltZW91dChwcmVkaWNhdGUuZGVsYXlUaW1lcik7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgKGR1cmluZyBkcmFnKSBpZiBhbiBpdGVtIGlzIG92ZXJsYXBwaW5nIG90aGVyIGl0ZW1zIGFuZCBiYXNlZCBvblxuICAgKiB0aGUgY29uZmlndXJhdGlvbiBsYXlvdXQgdGhlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrT3ZlcmxhcCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciByZXN1bHQ7XG4gICAgdmFyIGN1cnJlbnRHcmlkO1xuICAgIHZhciBjdXJyZW50SW5kZXg7XG4gICAgdmFyIHRhcmdldEdyaWQ7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciBzb3J0QWN0aW9uO1xuICAgIHZhciBpc01pZ3JhdGlvbjtcblxuICAgIC8vIEdldCBvdmVybGFwIGNoZWNrIHJlc3VsdC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydFByZWRpY2F0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IEl0ZW1EcmFnLmRlZmF1bHRTb3J0UHJlZGljYXRlKGl0ZW0sIHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyBtYWtlIHN1cmUgdGhlIHJlc3VsdCBvYmplY3QgaGFzIGEgdmFsaWQgaW5kZXggYmVmb3JlIGdvaW5nIGZ1cnRoZXIuXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdC5pbmRleCAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGN1cnJlbnRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdGFyZ2V0R3JpZCA9IHJlc3VsdC5ncmlkIHx8IGN1cnJlbnRHcmlkO1xuICAgIGlzTWlncmF0aW9uID0gY3VycmVudEdyaWQgIT09IHRhcmdldEdyaWQ7XG4gICAgY3VycmVudEluZGV4ID0gY3VycmVudEdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEdyaWQuX2l0ZW1zLCByZXN1bHQuaW5kZXgsIGlzTWlncmF0aW9uKTtcbiAgICBzb3J0QWN0aW9uID0gcmVzdWx0LmFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuXG4gICAgLy8gUHJldmVudCBwb3NpdGlvbiBib3VuY2UuXG4gICAgaWYgKCFpc01pZ3JhdGlvbiAmJiB0YXJnZXRJbmRleCA9PT0gdGhpcy5faEJsb2NrZWRJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB3aXRoaW4gaXQncyBjdXJyZW50IGdyaWQuXG4gICAgaWYgKCFpc01pZ3JhdGlvbikge1xuICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0YXJnZXQgaW5kZXggaXMgbm90IHRoZSBjdXJyZW50IGluZGV4LlxuICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IGN1cnJlbnRJbmRleDtcblxuICAgICAgICAvLyBEbyB0aGUgc29ydC5cbiAgICAgICAgKHNvcnRBY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhcnJheVN3YXAgOiBhcnJheU1vdmUpKFxuICAgICAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcyxcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4LFxuICAgICAgICAgICAgYWN0aW9uOiBzb3J0QWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMYXlvdXQgdGhlIGdyaWQuXG4gICAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIHdhcyBtb3ZlZCB0byBhbm90aGVyIGdyaWQuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcblxuICAgICAgLy8gRW1pdCBiZWZvcmVTZW5kIGV2ZW50LlxuICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVTZW5kKSkge1xuICAgICAgICBjdXJyZW50R3JpZC5fZW1pdChldmVudEJlZm9yZVNlbmQsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlUmVjZWl2ZSwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgICAvLyBVcGRhdGUgZHJhZyBpbnN0YW5jZSdzIG1pZ3JhdGluZyBpbmRpY2F0b3IuXG4gICAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGl0ZW0uX2dyaWRJZCAhPT0gdGhpcy5fZ3JpZElkO1xuXG4gICAgICAvLyBNb3ZlIGl0ZW0gaW5zdGFuY2UgZnJvbSBjdXJyZW50IGdyaWQgdG8gdGFyZ2V0IGdyaWQuXG4gICAgICBjdXJyZW50R3JpZC5faXRlbXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgICBhcnJheUluc2VydCh0YXJnZXRHcmlkLl9pdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgICAvLyBTZXQgc29ydCBkYXRhIGFzIG51bGwsIHdoaWNoIGlzIGFuIGluZGljYXRvciBmb3IgdGhlIGl0ZW0gY29tcGFyaXNvblxuICAgICAgLy8gZnVuY3Rpb24gdGhhdCB0aGUgc29ydCBkYXRhIG9mIHRoaXMgc3BlY2lmaWMgaXRlbSBzaG91bGQgYmUgZmV0Y2hlZFxuICAgICAgLy8gbGF6aWx5LlxuICAgICAgaXRlbS5fc29ydERhdGEgPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCByZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMYXlvdXQgYm90aCBncmlkcy5cbiAgICAgIGN1cnJlbnRHcmlkLmxheW91dCgpO1xuICAgICAgdGFyZ2V0R3JpZC5sYXlvdXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIGl0ZW0gaXMgZHJhZ2dlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIHRoZSBtaWdyYXRpb24gcHJvY2Vzc1xuICAgKiBncmFjZWZ1bGx5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2ZpbmlzaE1pZ3JhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciB0YXJnZXRHcmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHRhcmdldEdyaWRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0U2V0dGluZ3MgPSB0YXJnZXRHcmlkLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0NvbnRhaW5lciB8fCB0YXJnZXRHcmlkRWxlbWVudDtcbiAgICB2YXIgY3VycmVudFNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgY3VycmVudENvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciBvZmZzZXREaWZmO1xuXG4gICAgLy8gRGVzdHJveSBjdXJyZW50IGRyYWcuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHNldCB0aGUgbWlncmF0aW5nIGZsYWcgdG9cbiAgICAvLyBmYWxzZSBmaXJzdCwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgY3JlYXRlIGFuIGluZmluaXRlIGxvb3AgYmV0d2VlbiB0aGlzXG4gICAgLy8gYW5kIHRoZSBkcmFnLnN0b3AoKSBtZXRob2QuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBjdXJyZW50IGNsYXNzbmFtZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGN1cnJlbnRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gQWRkIG5ldyBjbGFzc25hbWVzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHRhcmdldFNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgaXNBY3RpdmUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgdGhlIGl0ZW0gaW5zaWRlIHRoZSB0YXJnZXQgY29udGFpbmVyIGlmIGl0J3MgZGlmZmVyZW50IHRoYW4gdGhlXG4gICAgLy8gY3VycmVudCBjb250YWluZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgdGFyZ2V0Q29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY3VycmVudENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZS54IC09IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRyYW5zbGF0ZS55IC09IG9mZnNldERpZmYudG9wO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2FjaGVkIGRpbWVuc2lvbnMgYW5kIHNvcnQgZGF0YS5cbiAgICBpdGVtLl9yZWZyZXNoRGltZW5zaW9ucygpO1xuICAgIGl0ZW0uX3JlZnJlc2hTb3J0RGF0YSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCdzIGRyYWcgY29udGFpbmVyIChpZiBhbnkpXG4gICAgLy8gYW5kIGFjdHVhbCBncmlkIGNvbnRhaW5lciBlbGVtZW50LiBXZSBzYXZlIGl0IGxhdGVyIGZvciB0aGUgcmVsZWFzZVxuICAgIC8vIHByb2Nlc3MuXG4gICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGFyZ2V0Q29udGFpbmVyLCB0YXJnZXRHcmlkRWxlbWVudCwgdHJ1ZSk7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlggPSBvZmZzZXREaWZmLmxlZnQ7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgIC8vIFJlY3JlYXRlIGl0ZW0ncyBkcmFnIGhhbmRsZXIuXG4gICAgaXRlbS5fZHJhZyA9IHRhcmdldFNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKGl0ZW0pIDogbnVsbDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gZWxlbWVudCBpZiBpdCB3YXMgbW92ZWQgZnJvbSBhIGNvbnRhaW5lclxuICAgIC8vIHRvIGFub3RoZXIuXG4gICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gY3VycmVudENvbnRhaW5lcikge1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGUueCwgdHJhbnNsYXRlLnkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLnZpc2libGVTdHlsZXMgOiB0YXJnZXRTZXR0aW5ncy5oaWRkZW5TdHlsZXMpO1xuXG4gICAgLy8gU3RhcnQgdGhlIHJlbGVhc2UuXG4gICAgcmVsZWFzZS5zdGFydCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1zdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9wcmVTdGFydENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBMZXQncyBhY3RpdmF0ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBzdGF0ZS5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZSkge1xuICAgICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlUGVuZGluZztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcGVuZGluZyB0cnkgdG8gcmVzb2x2ZSBpdC5cbiAgICBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlKHRoaXMuX2l0ZW0sIGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgICAgdGhpcy5fb25TdGFydChldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZWplY3RlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgaWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnIGlzIGFjdGl2ZSwgbW92ZSB0aGUgaXRlbS5cbiAgICBlbHNlIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVJlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9vbk1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBwcmUtZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZUVuZENoZWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgcHJlZGljYXRlIHdhcyByZXNvbHZlZCBkdXJpbmcgZHJhZy5cbiAgICB2YXIgaXNSZXNvbHZlZCA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQ7XG5cbiAgICAvLyBEbyBmaW5hbCBwcmVkaWNhdGUgY2hlY2sgdG8gYWxsb3cgdXNlciB0byB1bmJpbmQgc3R1ZmYgZm9yIHRoZSBjdXJyZW50XG4gICAgLy8gZHJhZyBwcm9jZWR1cmUgd2l0aGluIHRoZSBwcmVkaWNhdGUgY2FsbGJhY2suIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpc1xuICAgIC8vIGNoZWNrIHdpbGwgaGF2ZSBubyBlZmZlY3QgdG8gdGhlIHN0YXRlIG9mIHRoZSBwcmVkaWNhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gUmVzZXQgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZUluYWN0aXZlO1xuXG4gICAgLy8gSWYgcHJlZGljYXRlIGlzIHJlc29sdmVkIGFuZCBkcmFnZ2luZyBpcyBhY3RpdmUsIGNhbGwgdGhlIGVuZCBoYW5kbGVyLlxuICAgIGlmIChpc1Jlc29sdmVkICYmIHRoaXMuX2lzQWN0aXZlKSB0aGlzLl9vbkVuZChldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc3RhcnQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TdGFydCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCBkb24ndCBzdGFydCB0aGUgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdDb250YWluZXIgPSBzZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IGdyaWRDb250YWluZXI7XG4gICAgdmFyIGNvbnRhaW5pbmdCbG9jayA9IGdldENvbnRhaW5pbmdCbG9jayhkcmFnQ29udGFpbmVyLCB0cnVlKTtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgIHZhciBjdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHZhciBjdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gICAgdmFyIGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgaGFzRHJhZ0NvbnRhaW5lciA9IGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXI7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBSZXNldCBoZXVyaXN0aWNzIGRhdGEuXG4gICAgdGhpcy5fcmVzZXRIZXVyaXN0aWNzKGV2ZW50KTtcblxuICAgIC8vIElmIGdyaWQgY29udGFpbmVyIGlzIG5vdCB0aGUgZHJhZyBjb250YWluZXIsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZVxuICAgIC8vIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gZ3JpZCBjb250YWluZXIgYW5kIGRyYWcgY29udGFpbmVyJ3MgY29udGFpbmluZ1xuICAgIC8vIGVsZW1lbnQuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKGNvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHBvc2l0aW9uaW5nIGFuaW1hdGlvbi5cbiAgICBpZiAoaXRlbS5pc1Bvc2l0aW9uaW5nKCkpIHtcbiAgICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIFN0b3AgY3VycmVudCBtaWdyYXRpb24gYW5pbWF0aW9uLlxuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkge1xuICAgICAgY3VycmVudExlZnQgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICBjdXJyZW50VG9wIC09IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgbWlncmF0ZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcoY3VycmVudExlZnQsIGN1cnJlbnRUb3ApIH0pO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgYmVpbmcgcmVsZWFzZWQgcmVzZXQgcmVsZWFzZSBkYXRhLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHJlbGVhc2UuX3Jlc2V0KCk7XG5cbiAgICAvLyBTZXR1cCBkcmFnIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGRyYWdDb250YWluZXI7XG4gICAgdGhpcy5fY29udGFpbmluZ0Jsb2NrID0gY29udGFpbmluZ0Jsb2NrO1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYID0gZWxlbWVudFJlY3QubGVmdDtcbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WSA9IGVsZW1lbnRSZWN0LnRvcDtcbiAgICB0aGlzLl9sZWZ0ID0gdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdDtcbiAgICB0aGlzLl90b3AgPSB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3A7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgKGlmIG5lY2Vzc2FyeSkuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkKSB7XG4gICAgICBpdGVtLl9kcmFnUGxhY2Vob2xkZXIuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnSW5pdCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0luaXQsIGl0ZW0sIGV2ZW50KTtcblxuICAgIC8vIElmIGEgc3BlY2lmaWMgZHJhZyBjb250YWluZXIgaXMgc2V0IGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICAvLyBncmlkJ3MgY29udGFpbmVyIGVsZW1lbnQgd2UgbmVlZCB0byBjYXN0IHNvbWUgZXh0cmEgc3BlbGxzLlxuICAgIGlmIChoYXNEcmFnQ29udGFpbmVyKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgY29udGFpbmVyIG9mZnNldCBkaWZmcyB0byBkcmFnIGRhdGEuXG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG5cbiAgICAgIC8vIElmIHRoZSBkcmFnZ2VkIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiB0aGUgZHJhZyBjb250YWluZXIgYWxsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGRvIGlzIHNldHVwIHRoZSByZWxhdGl2ZSBkcmFnIHBvc2l0aW9uIGRhdGEuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBkcmFnQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2dyaWRYID0gY3VycmVudExlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fZ3JpZFkgPSBjdXJyZW50VG9wIC0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGNvcnJlY3QgY29udGFpbmVyLFxuICAgICAgLy8gc2V0dXAgdGhlIGFjdHVhbCBkcmFnIHBvc2l0aW9uIGRhdGEgYW5kIGFkanVzdCB0aGUgZWxlbWVudCdzIHRyYW5zbGF0ZVxuICAgICAgLy8gdmFsdWVzIHRvIGFjY291bnQgZm9yIHRoZSBET00gcG9zaXRpb24gc2hpZnQuXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGVmdCA9IGN1cnJlbnRMZWZ0ICsgdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICAgIHRoaXMuX3RvcCA9IGN1cnJlbnRUb3AgKyB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgICAgZHJhZ0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBkcmFnIGNsYXNzIGFuZCBiaW5kIHNjcm9sbGVycy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG4gICAgdGhpcy5fYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gRW1pdCBkcmFnU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdTdGFydCwgaXRlbSwgZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIG1vdmUgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB2YXIgeERpZmYgPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggKz0geERpZmY7XG4gICAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCArPSB4RGlmZjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB2YXIgeURpZmYgPSBldmVudC5jbGllbnRZIC0gdGhpcy5fZHJhZ0V2ZW50LmNsaWVudFk7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZICs9IHlEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBldmVudCBkYXRhLlxuICAgIHRoaXMuX2RyYWdFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gbW92ZSBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTW92ZVRpY2soaXRlbS5faWQsIHRoaXMuX3ByZXBhcmVNb3ZlLCB0aGlzLl9hcHBseU1vdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3IgbW92aW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCF0aGlzLl9pdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gSWYgZHJhZyBzb3J0IGlzIGVuYWJsZWQgLT4gY2hlY2sgb3ZlcmxhcC5cbiAgICBpZiAodGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydCkge1xuICAgICAgaWYgKHRoaXMuX2NoZWNrSGV1cmlzdGljcyh0aGlzLl9kcmFnRXZlbnQpKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBtb3ZlbWVudCB0byBkcmFnZ2VkIGl0ZW0uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYXBwbHlNb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gRG8gbm90aGluZyBpZiBpdGVtIGlzIG5vdCBhY3RpdmUuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ01vdmUgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ01vdmUsIGl0ZW0sIHRoaXMuX2RyYWdFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgc2Nyb2xsIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fb25TY3JvbGwgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFzdCBzY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fc2Nyb2xsRXZlbnQgPSBldmVudDtcblxuICAgIC8vIERvIHNjcm9sbCBwcmVwYXJlL2FwcGx5IGhhbmRsaW5nIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkU2Nyb2xsVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZVNjcm9sbCwgdGhpcy5fYXBwbHlTY3JvbGwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnZWQgaXRlbSBmb3Igc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZXBhcmVTY3JvbGwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUgZG8gbm90aGluZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSB0aGlzLl9nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGF4aXMgPSBzZXR0aW5ncy5kcmFnQXhpcztcbiAgICB2YXIgZ3JpZENvbnRhaW5lciA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBDYWxjdWxhdGUgZWxlbWVudCdzIHJlY3QgYW5kIHgveSBkaWZmLlxuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgeERpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB2YXIgeURpZmYgPSB0aGlzLl9lbGVtZW50Q2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBkaWZmLlxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRoaXMuX2NvbnRhaW5pbmdCbG9jaywgZ3JpZENvbnRhaW5lcik7XG4gICAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGhvcml6b250YWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3knKSB7XG4gICAgICB0aGlzLl9sZWZ0ICs9IHhEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFggPSB0aGlzLl9sZWZ0IC0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHZlcnRpY2FsIHBvc2l0aW9uIGRhdGEuXG4gICAgaWYgKGF4aXMgIT09ICd4Jykge1xuICAgICAgdGhpcy5fdG9wICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZ3JpZFkgPSB0aGlzLl90b3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICB9XG5cbiAgICAvLyBPdmVybGFwIGhhbmRsaW5nLlxuICAgIGlmIChzZXR0aW5ncy5kcmFnU29ydCkgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgfTtcblxuICAvKipcbiAgICogQXBwbHkgc2Nyb2xsIHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50J3MgdHJhbnNsYXRlWC9ZIHZhbHVlcy5cbiAgICBpdGVtLl9lbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTY3JvbGwgZXZlbnQuXG4gICAgdGhpcy5fZ2V0R3JpZCgpLl9lbWl0KGV2ZW50RHJhZ1Njcm9sbCwgaXRlbSwgdGhpcy5fc2Nyb2xsRXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIHJlc2V0IGRyYWcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gRmluaXNoIGN1cnJlbnRseSBxdWV1ZWQgb3ZlcmxhcCBjaGVjay5cbiAgICBzZXR0aW5ncy5kcmFnU29ydCAmJiB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnZmluaXNoJyk7XG5cbiAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVycy5cbiAgICB0aGlzLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMoKTtcblxuICAgIC8vIFNldHVwIHJlbGVhc2UgZGF0YS5cbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZID0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIG5hbWUgZnJvbSBlbGVtZW50LlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcblxuICAgIC8vIEVtaXQgZHJhZ0VuZCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ0VuZCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gRmluaXNoIHVwIHRoZSBtaWdyYXRpb24gcHJvY2VzcyBvciBzdGFydCB0aGUgcmVsZWFzZSBwcm9jZXNzLlxuICAgIHRoaXMuX2lzTWlncmF0aW5nID8gdGhpcy5fZmluaXNoTWlncmF0aW9uKCkgOiByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgaGVscGVyc1xuICAgKiAqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBob3cgbWFueSBwZXJjZW50IHRoZSBpbnRlcnNlY3Rpb24gYXJlYSBvZiB0d28gcmVjdGFuZ2xlcyBpcyBmcm9tXG4gICAqIHRoZSBtYXhpbXVtIHBvdGVudGlhbCBpbnRlcnNlY3Rpb24gYXJlYSBiZXR3ZWVuIHRoZSByZWN0YW5nbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKiAgIC0gQSBudW1iZXIgYmV0d2VlbiAwLTEwMC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlY3RPdmVybGFwU2NvcmUoYSwgYikge1xuICAgIC8vIFJldHVybiAwIGltbWVkaWF0ZWx5IGlmIHRoZSByZWN0YW5nbGVzIGRvIG5vdCBvdmVybGFwLlxuICAgIGlmIChcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0IHx8XG4gICAgICBiLmxlZnQgKyBiLndpZHRoIDw9IGEubGVmdCB8fFxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCB8fFxuICAgICAgYi50b3AgKyBiLmhlaWdodCA8PSBhLnRvcFxuICAgICkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBhcmVhJ3Mgd2lkdGgsIGhlaWdodCwgbWF4IGhlaWdodCBhbmQgbWF4IHdpZHRoLlxuICAgIHZhciB3aWR0aCA9IE1hdGgubWluKGEubGVmdCArIGEud2lkdGgsIGIubGVmdCArIGIud2lkdGgpIC0gTWF0aC5tYXgoYS5sZWZ0LCBiLmxlZnQpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLm1pbihhLnRvcCArIGEuaGVpZ2h0LCBiLnRvcCArIGIuaGVpZ2h0KSAtIE1hdGgubWF4KGEudG9wLCBiLnRvcCk7XG4gICAgdmFyIG1heFdpZHRoID0gTWF0aC5taW4oYS53aWR0aCwgYi53aWR0aCk7XG4gICAgdmFyIG1heEhlaWdodCA9IE1hdGgubWluKGEuaGVpZ2h0LCBiLmhlaWdodCk7XG5cbiAgICByZXR1cm4gKCh3aWR0aCAqIGhlaWdodCkgLyAobWF4V2lkdGggKiBtYXhIZWlnaHQpKSAqIDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciBlbGVtZW50IGFuZCBvcGVuIHRoZSBocmVmIHVybCBpZiBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlbkFuY2hvckhyZWYoZWxlbWVudCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhbmNob3IgZWxlbWVudC5cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdhJykgcmV0dXJuO1xuXG4gICAgLy8gR2V0IGhyZWYgYW5kIG1ha2Ugc3VyZSBpdCBleGlzdHMuXG4gICAgdmFyIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGlmICghaHJlZikgcmV0dXJuO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBuYXZpZ2F0ZSB0byB0aGUgbGluayBocmVmLlxuICAgIHZhciB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGhyZWYsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhZyBwbGFjZWhvbGRlci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWdQbGFjZWhvbGRlcihpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX25leHRMZWZ0ID0gMDtcbiAgICB0aGlzLl9uZXh0VG9wID0gMDtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG5cbiAgICAvLyBCaW5kIGV2ZW50IGhhbmRsZXJzLlxuICAgIHRoaXMuX29uTGF5b3V0U3RhcnQgPSB0aGlzLl9vbkxheW91dFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25MYXlvdXRFbmQgPSB0aGlzLl9vbkxheW91dEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uUmVsZWFzZUVuZCA9IHRoaXMuX29uUmVsZWFzZUVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTWlncmF0ZSA9IHRoaXMuX29uTWlncmF0ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTW92ZSBwbGFjZWhvbGRlciB0byBhIG5ldyBwb3NpdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRTdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmluZCBvdXQgdGhlIGl0ZW0ncyBuZXcgKHVuYXBwbGllZCkgbGVmdCBhbmQgdG9wIHBvc2l0aW9uLlxuICAgIHZhciBpdGVtSW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBuZXh0TGVmdCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyXTtcbiAgICB2YXIgbmV4dFRvcCA9IGdyaWQuX2xheW91dC5zbG90c1tpdGVtSW5kZXggKiAyICsgMV07XG5cbiAgICAvLyBJZiBpdGVtJ3MgcG9zaXRpb24gZGlkIG5vdCBjaGFuZ2UgYW5kIHRoZSBpdGVtIGRpZCBub3QgbWlncmF0ZSB3ZSBjYW5cbiAgICAvLyBzYWZlbHkgc2tpcCBsYXlvdXQuXG4gICAgaWYgKCF0aGlzLl9kaWRNaWdyYXRlICYmIGl0ZW0uX2xlZnQgPT09IG5leHRMZWZ0ICYmIGl0ZW0uX3RvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNsb3RzIGRhdGEgaXMgY2FsY3VsYXRlZCB3aXRoIGl0ZW0gbWFyZ2lucyBhZGRlZCB0byB0aGVtIHNvIHdlIG5lZWQgdG8gYWRkXG4gICAgLy8gaXRlbSdzIGxlZnQgYW5kIHRvcCBtYXJnaW4gdG8gdGhlIHNsb3QgZGF0YSB0byBnZXQgdGhlIHBsYWNlaG9sZGVyJ3NcbiAgICAvLyBuZXh0IHBvc2l0aW9uLlxuICAgIG5leHRMZWZ0ICs9IGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgbmV4dFRvcCArPSBpdGVtLl9tYXJnaW5Ub3A7XG5cbiAgICAvLyBKdXN0IHNuYXAgdG8gbmV3IHBvc2l0aW9uIHdpdGhvdXQgYW55IGFuaW1hdGlvbnMgaWYgbm8gYW5pbWF0aW9uIGlzXG4gICAgLy8gcmVxdWlyZWQgb3IgaWYgcGxhY2Vob2xkZXIgbW92ZXMgYmV0d2VlbiBncmlkcy5cbiAgICB2YXIgYW5pbUVuYWJsZWQgPSBncmlkLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb24gPiAwO1xuICAgIGlmICghYW5pbUVuYWJsZWQgfHwgdGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgLy8gQ2FuY2VsIHBvdGVudGlhbCAocXVldWVkKSBsYXlvdXQgdGljay5cbiAgICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAgIC8vIFNuYXAgcGxhY2Vob2xkZXIgdG8gY29ycmVjdCBwb3NpdGlvbi5cbiAgICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuICAgICAgaWYgKHRoaXMuX2FuaW1hdGUuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICB0aGlzLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBNb3ZlIHBsYWNlaG9sZGVyIGluc2lkZSBjb3JyZWN0IGNvbnRhaW5lciBhZnRlciBtaWdyYXRpb24uXG4gICAgICBpZiAodGhpcy5fZGlkTWlncmF0ZSkge1xuICAgICAgICBncmlkLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIHBsYWNlaG9sZGVyJ3MgbGF5b3V0IGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrLiBXZSBkbyB0aGlzIHRvXG4gICAgLy8gYXZvaWQgbGF5b3V0IHRocmFzaGluZy5cbiAgICB0aGlzLl9uZXh0TGVmdCA9IG5leHRMZWZ0O1xuICAgIHRoaXMuX25leHRUb3AgPSBuZXh0VG9wO1xuICAgIGFkZFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBwbGFjZWhvbGRlciBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZSh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IHRyYW5zbGF0ZS54O1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdGhpcy5fY3VycmVudExlZnQ7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0aGlzLl9jdXJyZW50VG9wO1xuICAgIHZhciBuZXh0TGVmdCA9IHRoaXMuX25leHRMZWZ0O1xuICAgIHZhciBuZXh0VG9wID0gdGhpcy5fbmV4dFRvcDtcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhuZXh0TGVmdCwgbmV4dFRvcCkgfTtcblxuICAgIC8vIElmIHBsYWNlaG9sZGVyIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBqdXN0IHN0b3AgYW5pbWF0aW9uXG4gICAgLy8gYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoY3VycmVudExlZnQgPT09IG5leHRMZWZ0ICYmIGN1cnJlbnRUb3AgPT09IG5leHRUb3ApIHtcbiAgICAgIGlmIChhbmltYXRpb24uaXNBbmltYXRpbmcoKSkgYW5pbWF0aW9uLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbGV0J3Mgc3RhcnQgdGhlIGFuaW1hdGlvbi5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9pdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyO1xuICAgIHZhciBjdXJyZW50U3R5bGVzID0geyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfTtcbiAgICBhbmltYXRpb24uc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICBkdXJhdGlvbjogc2V0dGluZ3MuZHVyYXRpb24sXG4gICAgICBlYXNpbmc6IHNldHRpbmdzLmVhc2luZyxcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9vbkxheW91dEVuZFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTGF5b3V0RW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBkcmFnUmVsZWFzZUVuZCBldmVudCBpc1xuICAgKiBlbWl0dGVkIGFuZCByZWNlaXZlcyB0aGUgZXZlbnQgZGF0YSBhcyBpdCdzIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25SZWxlYXNlRW5kID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpdGVtLl9pZCA9PT0gdGhpcy5faXRlbS5faWQpIHtcbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpcyBub3QgYW5pbWF0aW5nIGFueW1vcmUgd2UgY2FuIHNhZmVseSByZXNldCBpdC5cbiAgICAgIGlmICghdGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcGxhY2Vob2xkZXIgaXRlbSBpcyBzdGlsbCBhbmltYXRpbmcgaGVyZSwgbGV0J3Mgd2FpdCBmb3IgaXQgdG9cbiAgICAgIC8vIGZpbmlzaCBpdCdzIGFuaW1hdGlvbi5cbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTWlncmF0aW9uIHN0YXJ0IGhhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBiZWZvcmVTZW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge0l0ZW19IGRhdGEuaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGRhdGEuZnJvbUdyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEuZnJvbUluZGV4XG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS50b0dyaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEudG9JbmRleFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuX29uTWlncmF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIG1hdGNoaW5nIGl0ZW0uXG4gICAgaWYgKGRhdGEuaXRlbSAhPT0gdGhpcy5faXRlbSkgcmV0dXJuO1xuXG4gICAgdmFyIGdyaWQgPSB0aGlzLl9pdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgbmV4dEdyaWQgPSBkYXRhLnRvR3JpZDtcblxuICAgIC8vIFVuYmluZCBsaXN0ZW5lcnMgZnJvbSBjdXJyZW50IGdyaWQuXG4gICAgZ3JpZC5vZmYoZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBncmlkLm9mZihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9mZihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBCaW5kIGxpc3RlbmVycyB0byB0aGUgbmV4dCBncmlkLlxuICAgIG5leHRHcmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgbmV4dEdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBtaWdyYXRlZC5cbiAgICB0aGlzLl9kaWRNaWdyYXRlID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ3JlYXRlIHBsYWNlaG9sZGVyLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgb25seSB3cml0ZXMgdG8gRE9NIGFuZCBkb2VzIG5vdFxuICAgKiByZWFkIGFueXRoaW5nIGZyb20gRE9NIHNvIGl0IHNob3VsZCBub3QgY2F1c2UgYW55IGFkZGl0aW9uYWwgbGF5b3V0XG4gICAqIHRocmFzaGluZyB3aGVuIGl0J3MgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRyYWcgc3RhcnQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHBsYWNlaG9sZGVyIHNldCB1cCB3ZSBjYW4gc2tpcCB0aGUgaW5pdGlhdGlvbiBsb2dpYy5cbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB2YXIgZWxlbWVudDtcbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQgPSBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCB0byBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIEFkZCBwbGFjZWhvbGRlciBjbGFzcyB0byB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICB0aGlzLl9jbGFzc05hbWUgPSBzZXR0aW5ncy5pdGVtUGxhY2Vob2xkZXJDbGFzcyB8fCAnJztcbiAgICBpZiAodGhpcy5fY2xhc3NOYW1lKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCB0aGlzLl9jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIHRoZSBwbGFjZWhvbGRlciBpdGVtIGNvcnJlY3RseS5cbiAgICB2YXIgbGVmdCA9IGl0ZW0uX2xlZnQgKyBpdGVtLl9tYXJnaW5MZWZ0O1xuICAgIHZhciB0b3AgPSBpdGVtLl90b3AgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgc2V0U3R5bGVzKGVsZW1lbnQsIHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgd2lkdGg6IGl0ZW0uX3dpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogaXRlbS5faGVpZ2h0ICsgJ3B4JyxcbiAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGxlZnQsIHRvcClcbiAgICB9KTtcblxuICAgIC8vIEJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub24oZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vbihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub24oZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gb25DcmVhdGUgaG9vay5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHRoZSBwbGFjZWhvbGRlciBlbGVtZW50IHRvIHRoZSBncmlkLlxuICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBwbGFjZWhvbGRlciBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRlO1xuXG4gICAgLy8gUmVzZXQgZmxhZy5cbiAgICB0aGlzLl9yZXNldEFmdGVyTGF5b3V0ID0gZmFsc2U7XG5cbiAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgIGNhbmNlbFBsYWNlaG9sZGVyVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBSZXNldCBhbmltYXRpb24gaW5zdGFuY2UuXG4gICAgYW5pbWF0aW9uLnN0b3AoKTtcbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBudWxsO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIFJlbW92ZSBwbGFjZWhvbGRlciBjbGFzcyBmcm9tIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgICB0aGlzLl9jbGFzc05hbWUgPSAnJztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudC5cbiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBvblJlbW92ZSBob29rLiBOb3RlIHRoYXQgaGVyZSB3ZSB1c2UgdGhlIGN1cnJlbnQgZ3JpZCdzIG9uUmVtb3ZlIGNhbGxiYWNrXG4gICAgLy8gc28gaWYgdGhlIGl0ZW0gaGFzIG1pZ3JhdGVkIGR1cmluZyBkcmFnIHRoZSBvblJlbW92ZSBtZXRob2Qgd2lsbCBub3QgYmVcbiAgICAvLyB0aGUgb3JpZ2luYXRpbmcgZ3JpZCdzIG1ldGhvZC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUpKSB7XG4gICAgICBzZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmUoaXRlbSwgZWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtoZWlnaHR9IGhlaWdodFxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUudXBkYXRlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwge1xuICAgICAgICB3aWR0aDogd2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCArICdweCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGxhY2Vob2xkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAodmlzaWJsZSkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9lbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHBsYWNlaG9sZGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fYW5pbWF0ZSA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFF1ZXVlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICovXG4gIGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBZGQgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9xdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJvY2VzcyBxdWV1ZSBjYWxsYmFja3MgYW5kIHJlc2V0IHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUXVldWUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Kn0gYXJnMVxuICAgKiBAcGFyYW0geyp9IGFyZzJcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYXJnMSwgYXJnMikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUXVpdCBlYXJseSBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgaWYgKCFsZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHNpbmdsZUNhbGxiYWNrID0gbGVuZ3RoID09PSAxO1xuICAgIHZhciBzbmFwc2hvdCA9IHNpbmdsZUNhbGxiYWNrID8gcXVldWVbMF0gOiBxdWV1ZS5zbGljZSgwKTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgY2FsbGJhY2sgbGV0J3MganVzdCBjYWxsIGl0LlxuICAgIGlmIChzaW5nbGVDYWxsYmFjaykge1xuICAgICAgc25hcHNob3QoYXJnMSwgYXJnMik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlIGNhbGxiYWNrcywgbGV0J3MgcHJvY2VzcyB0aGVtLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgc25hcHNob3RbaV0oYXJnMSwgYXJnMik7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IFF1ZXVlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge1F1ZXVlfVxuICAgKi9cbiAgUXVldWUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogTGF5b3V0IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1MYXlvdXQoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0ludGVycnVwdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX3RhcmdldFN0eWxlcyA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gMDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gMDtcbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gMDtcbiAgICB0aGlzLl9vZmZzZXRUb3AgPSAwO1xuICAgIHRoaXMuX3NraXBOZXh0QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMgPSB7XG4gICAgICBvbkZpbmlzaDogdGhpcy5fZmluaXNoLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cbiAgICAvLyBCaW5kIGFuaW1hdGlvbiBoYW5kbGVycyBhbmQgZmluaXNoIG1ldGhvZC5cbiAgICB0aGlzLl9zZXR1cEFuaW1hdGlvbiA9IHRoaXMuX3NldHVwQW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24gPSB0aGlzLl9zdGFydEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGl0ZW0gbGF5b3V0IGJhc2VkIG9uIGl0J3MgY3VycmVudCBkYXRhLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIGdyaWRTZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgaXNQb3NpdGlvbmluZyA9IHRoaXMuX2lzQWN0aXZlO1xuICAgIHZhciBpc0p1c3RSZWxlYXNlZCA9IHJlbGVhc2UuX2lzQWN0aXZlICYmIHJlbGVhc2UuX2lzUG9zaXRpb25pbmdTdGFydGVkID09PSBmYWxzZTtcbiAgICB2YXIgYW5pbUR1cmF0aW9uID0gaXNKdXN0UmVsZWFzZWRcbiAgICAgID8gZ3JpZFNldHRpbmdzLmRyYWdSZWxlYXNlRHVyYXRpb25cbiAgICAgIDogZ3JpZFNldHRpbmdzLmxheW91dER1cmF0aW9uO1xuICAgIHZhciBhbmltRWFzaW5nID0gaXNKdXN0UmVsZWFzZWQgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VFYXNpbmcgOiBncmlkU2V0dGluZ3MubGF5b3V0RWFzaW5nO1xuICAgIHZhciBhbmltRW5hYmxlZCA9ICFpbnN0YW50ICYmICF0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiAmJiBhbmltRHVyYXRpb24gPiAwO1xuICAgIHZhciBpc0FuaW1hdGluZztcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBwb3NpdGlvbmluZyBwcm9jZXNzIGN1cnJlbnQgbGF5b3V0IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIG9uLlxuICAgIGlmIChpc1Bvc2l0aW9uaW5nKSB0aGlzLl9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIE1hcmsgcmVsZWFzZSBwb3NpdGlvbmluZyBhcyBzdGFydGVkLlxuICAgIGlmIChpc0p1c3RSZWxlYXNlZCkgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgLy8gUHVzaCB0aGUgY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGlmIChpc0Z1bmN0aW9uKG9uRmluaXNoKSkgdGhpcy5fcXVldWUuYWRkKG9uRmluaXNoKTtcblxuICAgIC8vIElmIG5vIGFuaW1hdGlvbnMgYXJlIG5lZWRlZCwgZWFzeSBwZWFzeSFcbiAgICBpZiAoIWFuaW1FbmFibGVkKSB7XG4gICAgICB0aGlzLl91cGRhdGVPZmZzZXRzKCk7XG4gICAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcbiAgICAgIGlzQW5pbWF0aW5nID0gaXRlbS5fYW5pbWF0ZS5pc0FuaW1hdGluZygpO1xuICAgICAgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgIWlzQW5pbWF0aW5nICYmIHNldFN0eWxlcyhlbGVtZW50LCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBhY3RpdmUgYW5kIHN0b3JlIHNvbWUgZGF0YSBmb3IgdGhlIGFuaW1hdGlvbiB0aGF0IGlzIGFib3V0IHRvIGJlXG4gICAgLy8gdHJpZ2dlcmVkLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucy5lYXNpbmcgPSBhbmltRWFzaW5nO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmR1cmF0aW9uID0gYW5pbUR1cmF0aW9uO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBpc1Bvc2l0aW9uaW5nO1xuXG4gICAgLy8gU3RhcnQgdGhlIGl0ZW0ncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suXG4gICAgYWRkTGF5b3V0VGljayhpdGVtLl9pZCwgdGhpcy5fc2V0dXBBbmltYXRpb24sIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIGl0ZW0ncyBwb3NpdGlvbiBhbmltYXRpb24gaWYgaXQgaXMgY3VycmVudGx5IGFuaW1hdGluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHJvY2Vzc0NhbGxiYWNrUXVldWU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKiBAcmV0dXJucyB7SXRlbUxheW91dH1cbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihwcm9jZXNzQ2FsbGJhY2tRdWV1ZSwgdGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIGluaXQuXG4gICAgY2FuY2VsTGF5b3V0VGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBTdG9wIGFuaW1hdGlvbi5cbiAgICBpdGVtLl9hbmltYXRlLnN0b3AodGFyZ2V0U3R5bGVzKTtcblxuICAgIC8vIFJlbW92ZSBwb3NpdGlvbmluZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgYWN0aXZlIHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAvLyBQcm9jZXNzIGNhbGxiYWNrIHF1ZXVlIGlmIG5lZWRlZC5cbiAgICBpZiAocHJvY2Vzc0NhbGxiYWNrUXVldWUpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUsIHt9KTtcbiAgICB0aGlzLl9xdWV1ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5faXRlbSA9IHRoaXMuX2N1cnJlbnRTdHlsZXMgPSB0aGlzLl90YXJnZXRTdHlsZXMgPSB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBjdXJyZW50IGxheW91dCBvZmZzZXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlT2Zmc2V0cyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBtaWdyYXRlID0gaXRlbS5fbWlncmF0ZTtcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG5cbiAgICB0aGlzLl9vZmZzZXRMZWZ0ID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZlhcbiAgICAgIDogMDtcblxuICAgIHRoaXMuX29mZnNldFRvcCA9IHJlbGVhc2UuX2lzQWN0aXZlXG4gICAgICA/IHJlbGVhc2UuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IG1pZ3JhdGUuX2lzQWN0aXZlXG4gICAgICA/IG1pZ3JhdGUuX2NvbnRhaW5lckRpZmZZXG4gICAgICA6IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIGl0ZW0ncyBsYXlvdXQgdGFyZ2V0IHN0eWxlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fdXBkYXRlVGFyZ2V0U3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgIHRoaXMuX2l0ZW0uX2xlZnQgKyB0aGlzLl9vZmZzZXRMZWZ0LFxuICAgICAgdGhpcy5faXRlbS5fdG9wICsgdGhpcy5fb2Zmc2V0VG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGl0ZW0gbGF5b3V0IHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIE1hcmsgdGhlIGl0ZW0gYXMgaW5hY3RpdmUgYW5kIHJlbW92ZSBwb3NpdGlvbmluZyBjbGFzc2VzLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gRmluaXNoIHVwIHJlbGVhc2UgYW5kIG1pZ3JhdGlvbi5cbiAgICBpZiAocmVsZWFzZS5faXNBY3RpdmUpIHJlbGVhc2Uuc3RvcCgpO1xuICAgIGlmIChtaWdyYXRlLl9pc0FjdGl2ZSkgbWlncmF0ZS5zdG9wKCk7XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgaXRlbSBmb3IgbGF5b3V0IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5fc2V0dXBBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2l0ZW0uX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIG9mZnNldCBkYXRhIGFuZCB0YXJnZXQgc3R5bGVzLlxuICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICB0aGlzLl91cGRhdGVUYXJnZXRTdHlsZXMoKTtcblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGFscmVhZHkgaW4gY29ycmVjdCBwb3NpdGlvbiBsZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmIChcbiAgICAgIGl0ZW0uX2xlZnQgPT09IHRoaXMuX2N1cnJlbnRMZWZ0IC0gdGhpcy5fb2Zmc2V0TGVmdCAmJlxuICAgICAgaXRlbS5fdG9wID09PSB0aGlzLl9jdXJyZW50VG9wIC0gdGhpcy5fb2Zmc2V0VG9wXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5faXNJbnRlcnJ1cHRlZCkgdGhpcy5zdG9wKGZhbHNlLCB0aGlzLl90YXJnZXRTdHlsZXMpO1xuICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtJ3MgcG9zaXRpb25pbmcgY2xhc3MgaWYgbmVlZGVkLlxuICAgIGlmICghdGhpcy5faXNJbnRlcnJ1cHRlZCkge1xuICAgICAgYWRkQ2xhc3MoaXRlbS5fZWxlbWVudCwgc2V0dGluZ3MuaXRlbVBvc2l0aW9uaW5nQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIEdldCBjdXJyZW50IHN0eWxlcyBmb3IgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2N1cnJlbnRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2N1cnJlbnRMZWZ0LCB0aGlzLl9jdXJyZW50VG9wKTtcblxuICAgIC8vIEFuaW1hdGUuXG4gICAgaXRlbS5fYW5pbWF0ZS5zdGFydCh0aGlzLl9jdXJyZW50U3R5bGVzLCB0aGlzLl90YXJnZXRTdHlsZXMsIHRoaXMuX2FuaW1hdGVPcHRpb25zKTtcbiAgfTtcblxuICB2YXIgdGVtcFN0eWxlcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWlncmF0ZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1NaWdyYXRlKGl0ZW0pIHtcbiAgICAvLyBQcml2YXRlIHByb3BzLlxuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBtaWdyYXRlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZH0gdGFyZ2V0R3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtjb250YWluZXJdXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHRhcmdldEdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgaXNWaXNpYmxlID0gaXRlbS5pc1Zpc2libGUoKTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0R3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0YXJnZXRHcmlkLl9pdGVtcztcbiAgICB2YXIgY3VycmVudEluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gY29udGFpbmVyIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciB0YXJnZXRJbmRleDtcbiAgICB2YXIgdGFyZ2V0SXRlbTtcbiAgICB2YXIgY3VycmVudENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcbiAgICB2YXIgY29udGFpbmVyRGlmZjtcbiAgICB2YXIgdHJhbnNsYXRlO1xuICAgIHZhciB0cmFuc2xhdGVYO1xuICAgIHZhciB0cmFuc2xhdGVZO1xuXG4gICAgLy8gR2V0IHRhcmdldCBpbmRleC5cbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdGFyZ2V0SW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KHRhcmdldEl0ZW1zLCBwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEl0ZW0gPSB0YXJnZXRHcmlkLl9nZXRJdGVtKHBvc2l0aW9uKTtcbiAgICAgIC8qKiBAdG9kbyBDb25zaWRlciB0aHJvd2luZyBhbiBlcnJvciBoZXJlIGluc3RlYWQgb2Ygc2lsZW50bHkgZmFpbGluZy4gKi9cbiAgICAgIGlmICghdGFyZ2V0SXRlbSkgcmV0dXJuIHRoaXM7XG4gICAgICB0YXJnZXRJbmRleCA9IHRhcmdldEl0ZW1zLmluZGV4T2YodGFyZ2V0SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZXMgaWYgbmVlZGVkLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSB8fCB0aGlzLl9pc0FjdGl2ZSB8fCBpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHBvc2l0aW9uaW5nLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IG1pZ3JhdGlvbi5cbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgdGhpcy5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gQWJvcnQgY3VycmVudCByZWxlYXNlLlxuICAgIGlmIChpdGVtLmlzUmVsZWFzaW5nKCkpIHtcbiAgICAgIHRyYW5zbGF0ZVggLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlg7XG4gICAgICB0cmFuc2xhdGVZIC09IGl0ZW0uX3JlbGVhc2UuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgaXRlbS5fcmVsZWFzZS5zdG9wKHRydWUsIHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IHZpc2liaWxpdHkgYW5pbWF0aW9ucy5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9zdG9wQW5pbWF0aW9uKCk7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy5cbiAgICBpZiAoaXRlbS5fZHJhZykgaXRlbS5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBQcm9jZXNzIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb24gcXVldWUuXG4gICAgaXRlbS5fdmlzaWJpbGl0eS5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgYmVmb3JlUmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlUmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzIDogdGFyZ2V0U2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICBncmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBhcnJheUluc2VydCh0YXJnZXRJdGVtcywgaXRlbSwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBncmlkIGlkIHJlZmVyZW5jZS5cbiAgICBpdGVtLl9ncmlkSWQgPSB0YXJnZXRHcmlkLl9pZDtcblxuICAgIC8vIEdldCBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIGN1cnJlbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgaWYgKCF0cmFuc2xhdGUpIHtcbiAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICB0cmFuc2xhdGVYID0gdHJhbnNsYXRlLng7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGUueTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgIHRyYW5zbGF0ZVggKyBvZmZzZXREaWZmLmxlZnQsXG4gICAgICAgIHRyYW5zbGF0ZVkgKyBvZmZzZXREaWZmLnRvcFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2hpbGQgZWxlbWVudCdzIHN0eWxlcyB0byByZWZsZWN0IHRoZSBjdXJyZW50IHZpc2liaWxpdHkgc3RhdGUuXG4gICAgaXRlbS5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNWaXNpYmxlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBVcGRhdGUgZGlzcGxheSBzdHlsZS5cbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBpc1Zpc2libGUgPyAnYmxvY2snIDogJ2hpZGRlbic7XG5cbiAgICAvLyBHZXQgb2Zmc2V0IGRpZmYgZm9yIHRoZSBtaWdyYXRpb24gZGF0YS5cbiAgICBjb250YWluZXJEaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEVsZW1lbnQsIHRydWUpO1xuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDcmVhdGUgbmV3IGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gU2V0dXAgbWlncmF0aW9uIGRhdGEuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IGNvbnRhaW5lckRpZmYubGVmdDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IGNvbnRhaW5lckRpZmYudG9wO1xuXG4gICAgLy8gRW1pdCBzZW5kIGV2ZW50LlxuICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRTZW5kKSkge1xuICAgICAgZ3JpZC5fZW1pdChldmVudFNlbmQsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudFJlY2VpdmUpKSB7XG4gICAgICB0YXJnZXRHcmlkLl9lbWl0KGV2ZW50UmVjZWl2ZSwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIG1pZ3JhdGUgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIG1pZ3JhdGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIG1pZ3JhdGlvbiBiZSBhYm9ydGVkP1xuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgZ3JpZEVsZW1lbnQgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICBpZiAodGhpcy5fY29udGFpbmVyICE9PSBncmlkRWxlbWVudCkge1xuICAgICAgaWYgKCFjdXJyZW50U3R5bGVzKSB7XG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgIHRyYW5zbGF0ZSA9IGdldFRyYW5zbGF0ZShlbGVtZW50KTtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzO1xuICAgICAgfVxuICAgICAgZ3JpZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbU1pZ3JhdGUucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtTWlncmF0ZX1cbiAgICovXG4gIEl0ZW1NaWdyYXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzJDEgPSB7fTtcblxuICAvKipcbiAgICogVGhlIHJlbGVhc2UgcHJvY2VzcyBoYW5kbGVyIGNvbnN0cnVjdG9yLiBBbHRob3VnaCB0aGlzIG1pZ2h0IHNlZW0gYXMgcHJvcGVyXG4gICAqIGZpdCBmb3IgdGhlIGRyYWcgcHJvY2VzcyB0aGlzIG5lZWRzIHRvIGJlIHNlcGFyYXRlZCBpbnRvIGl0J3Mgb3duIGxvZ2ljXG4gICAqIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgYSBzY2VuYXJpbyB3aGVyZSBkcmFnIGlzIGRpc2FibGVkLCBidXQgdGhlIHJlbGVhc2VcbiAgICogcHJvY2VzcyBzdGlsbCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCAoZHJhZ2dpbmcgZnJvbSBhIGdyaWQgdG8gYW5vdGhlcikuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1SZWxlYXNlKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcblxuICAgIC8vIEZsYWcgcmVsZWFzZSBhcyBhY3RpdmUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuXG4gICAgLy8gQWRkIHJlbGVhc2UgY2xhc3MgbmFtZSB0byB0aGUgcmVsZWFzZWQgZWxlbWVudC5cbiAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZVN0YXJ0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZVN0YXJ0LCBpdGVtKTtcblxuICAgIC8vIFBvc2l0aW9uIHRoZSByZWxlYXNlZCBpdGVtLlxuICAgIGl0ZW0uX2xheW91dC5zdGFydChmYWxzZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRW5kIHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgYW4gaXRlbS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWJvcnQgYW5cbiAgICogb25nb2luZyByZWxlYXNlIHByb2Nlc3MgKGFuaW1hdGlvbikgb3IgZmluaXNoIHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFthYm9ydD1mYWxzZV1cbiAgICogIC0gU2hvdWxkIHRoZSByZWxlYXNlIGJlIGFib3J0ZWQ/IFdoZW4gdHJ1ZSwgdGhlIHJlbGVhc2UgZW5kIGV2ZW50IHdvbid0IGJlXG4gICAqICAgIGVtaXR0ZWQuIFNldCB0byB0cnVlIG9ubHkgd2hlbiB5b3UgbmVlZCB0byBhYm9ydCB0aGUgcmVsZWFzZSBwcm9jZXNzXG4gICAqICAgIHdoaWxlIHRoZSBpdGVtIGlzIGFuaW1hdGluZyB0byBpdCdzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnRTdHlsZXNdXG4gICAqICAtIE9wdGlvbmFsIGN1cnJlbnQgdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSBzdHlsZXMuXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oYWJvcnQsIGN1cnJlbnRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgY29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgdHJhbnNsYXRlO1xuXG4gICAgLy8gUmVzZXQgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIC8vIElmIHRoZSByZWxlYXNlZCBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBwdXQgaXRcbiAgICAvLyBiYWNrIHRoZXJlIGFuZCBhZGp1c3QgcG9zaXRpb24gYWNjb3JkaW5nbHkuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMkMS50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcoXG4gICAgICAgICAgICB0cmFuc2xhdGUueCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYLFxuICAgICAgICAgICAgdHJhbnNsYXRlLnkgLSB0aGlzLl9jb250YWluZXJEaWZmWVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhpdGVtLl9sZWZ0LCBpdGVtLl90b3ApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSB0ZW1wU3R5bGVzJDE7XG4gICAgICB9XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBzZXRTdHlsZXMoZWxlbWVudCwgY3VycmVudFN0eWxlcyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBkcmFnUmVsZWFzZUVuZCBldmVudC5cbiAgICBpZiAoIWFib3J0KSBncmlkLl9lbWl0KGV2ZW50RHJhZ1JlbGVhc2VFbmQsIGl0ZW0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVJlbGVhc2V9XG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5zdG9wKHRydWUpO1xuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBwdWJsaWMgZGF0YSBhbmQgcmVtb3ZlIHJlbGVhc2luZyBjbGFzcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1SZWxlYXNlLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzUG9zaXRpb25pbmdTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcbiAgICByZW1vdmVDbGFzcyhpdGVtLl9lbGVtZW50LCBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3MuaXRlbVJlbGVhc2luZ0NsYXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBzdHlsZXMgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIHZhciBjdXJyZW50ID0ge307XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIGN1cnJlbnRbcHJvcF0gPSBnZXRTdHlsZShlbGVtZW50LCBnZXRTdHlsZU5hbWUocHJvcCkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpYmlsaXR5IG1hbmFnZXIgZm9yIEl0ZW0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIEl0ZW1WaXNpYmlsaXR5KGl0ZW0pIHtcbiAgICB2YXIgaXNBY3RpdmUgPSBpdGVtLl9pc0FjdGl2ZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9ICFpc0FjdGl2ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gQ2FsbGJhY2sgcXVldWUuXG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgc2hvdy9oaWRlIGZpbmlzaGVycy5cbiAgICB0aGlzLl9maW5pc2hTaG93ID0gdGhpcy5fZmluaXNoU2hvdy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2ZpbmlzaEhpZGUgPSB0aGlzLl9maW5pc2hIaWRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBGb3JjZSBpdGVtIHRvIGJlIGVpdGhlciB2aXNpYmxlIG9yIGhpZGRlbiBvbiBpbml0LlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzQWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgIC8vIFNldCB2aXNpYmxlL2hpZGRlbiBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgc3R5bGVzIGZvciB0aGUgY2hpbGQgZWxlbWVudC5cbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU2hvdyBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIHZpc2libGUgY2FsbCB0aGUgY2FsbGJhY2sgYW5kIGJlIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZyAmJiAhdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgc2hvd2luZyBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzaG93biBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc1Nob3dpbmcgJiYgIWluc3RhbnQpIHtcbiAgICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBoaWRpbmcgb3IgaGlkZGVuIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc1Nob3dpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgICAgaWYgKCF0aGlzLl9pc0hpZGluZykgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuXG4gICAgLy8gVXBkYXRlIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIGl0ZW0uX2lzQWN0aXZlID0gdGhpcy5faXNTaG93aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0hpZGluZyA9IHRoaXMuX2lzSGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIHN0YXJ0IHNob3cgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKHRydWUsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaFNob3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGUgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5zdGFudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKG9uRmluaXNoKSA/IG9uRmluaXNoIDogbnVsbDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBhbHJlYWR5IGhpZGRlbiBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcgJiYgdGhpcy5faXNIaWRkZW4pIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlLCBpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIGl0ZW0gaXMgaGlkaW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGhpZGRlbiBpbnN0YW50bHksIGxldCdzIGp1c3RcbiAgICAvLyBwdXNoIGNhbGxiYWNrIHRvIHRoZSBjYWxsYmFjayBxdWV1ZSBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICh0aGlzLl9pc0hpZGluZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIHNob3dpbmcgb3IgdmlzaWJsZSBwcm9jZXNzIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIHRoZSBpbnRlcnJ1cHRlZCBmbGFnIGFjdGl2ZSwgdXBkYXRlIGNsYXNzZXMgYW5kIHNldCBkaXNwbGF5XG4gICAgLy8gdG8gYmxvY2sgaWYgbmVjZXNzYXJ5LlxuICAgIGlmICghdGhpcy5faXNIaWRpbmcpIHtcbiAgICAgIHF1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcbiAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MpO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgdGhpcy5faXNIaWRkZW4gPSB0aGlzLl9pc0hpZGluZyA9IHRydWU7XG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgaGlkZSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24oZmFsc2UsIGluc3RhbnQsIHRoaXMuX2ZpbmlzaEhpZGUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIGFuZCBzdG9wIGN1cnJlbnQgYW5pbWF0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgIHRoaXMuX3N0b3BBbmltYXRpb24oe30pO1xuXG4gICAgLy8gRmlyZSBhbGwgdW5jb21wbGV0ZWQgY2FsbGJhY2tzIHdpdGggaW50ZXJydXB0ZWQgZmxhZyBhbmQgZGVzdHJveSB0aGUgcXVldWUuXG4gICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSkuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIHZpc2libGUvaGlkZGVuIGNsYXNzZXMuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2l0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0aGlzLl9pc0hpZGRlbiA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdGFydCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25GaW5pc2hdXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24odG9WaXNpYmxlLCBpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcbiAgICB2YXIgdGFyZ2V0U3R5bGVzID0gdG9WaXNpYmxlID8gc2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHNldHRpbmdzLmhpZGRlblN0eWxlcztcbiAgICB2YXIgZHVyYXRpb24gPSBwYXJzZUludCh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RHVyYXRpb24gOiBzZXR0aW5ncy5oaWRlRHVyYXRpb24pIHx8IDA7XG4gICAgdmFyIGVhc2luZyA9ICh0b1Zpc2libGUgPyBzZXR0aW5ncy5zaG93RWFzaW5nIDogc2V0dGluZ3MuaGlkZUVhc2luZykgfHwgJ2Vhc2UnO1xuICAgIHZhciBpc0luc3RhbnQgPSBpbnN0YW50IHx8IGR1cmF0aW9uIDw9IDA7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXM7XG5cbiAgICAvLyBObyB0YXJnZXQgc3R5bGVzPyBMZXQncyBxdWl0IGVhcmx5LlxuICAgIGlmICghdGFyZ2V0U3R5bGVzKSB7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBxdWV1ZWQgdmlzaWJpbGl0eSB0aWNrLlxuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIElmIHdlIG5lZWQgdG8gYXBwbHkgdGhlIHN0eWxlcyBpbnN0YW50bHkgd2l0aG91dCBhbmltYXRpb24uXG4gICAgaWYgKGlzSW5zdGFudCkge1xuICAgICAgaWYgKGl0ZW0uX2FuaW1hdGVDaGlsZC5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIGl0ZW0uX2FuaW1hdGVDaGlsZC5zdG9wKHRhcmdldFN0eWxlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljayAodG8gYXZvaWQgbGF5b3V0IHRocmFzaGluZykuXG4gICAgYWRkVmlzaWJpbGl0eVRpY2soXG4gICAgICBpdGVtLl9pZCxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBjdXJyZW50U3R5bGVzID0gZ2V0Q3VycmVudFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0YXJ0KGN1cnJlbnRTdHlsZXMsIHRhcmdldFN0eWxlcywge1xuICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IGVhc2luZyxcbiAgICAgICAgICBvbkZpbmlzaDogb25GaW5pc2hcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCB2aXNpYmlsaXR5IGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldFN0eWxlc11cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uKHRhcmdldFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtLl9pZCk7XG4gICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIHNob3cgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaFNob3cgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgdGhpcy5faXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmlzaCBoaWRlIHByb2NlZHVyZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKi9cbiAgdmFyIGZpbmlzaFN0eWxlcyA9IHt9O1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuX2ZpbmlzaEhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2lzSGlkZGVuKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgZmluaXNoU3R5bGVzLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcbiAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCBmaW5pc2hTdHlsZXMpO1xuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaChmYWxzZSwgaXRlbSk7XG4gIH07XG5cbiAgdmFyIGlkID0gMDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHVuaXF1ZSBudW1lcmljIGlkIChpbmNyZW1lbnRzIGEgYmFzZSB2YWx1ZSBvbiBldmVyeSBjYWxsKS5cbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVVpZCgpIHtcbiAgICByZXR1cm4gKytpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEl0ZW0gaW5zdGFuY2UgZm9yIGEgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzQWN0aXZlXVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbShncmlkLCBlbGVtZW50LCBpc0FjdGl2ZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIGlkLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG5cbiAgICAvLyBSZWZlcmVuY2UgdG8gY29ubmVjdGVkIEdyaWQgaW5zdGFuY2UncyBpZC5cbiAgICB0aGlzLl9ncmlkSWQgPSBncmlkLl9pZDtcblxuICAgIC8vIERlc3Ryb3llZCBmbGFnLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBwb3NpdGlvbnMuXG4gICAgdGhpcy5fbGVmdCA9IDA7XG4gICAgdGhpcy5fdG9wID0gMDtcblxuICAgIC8vIFRoZSBlbGVtZW50cy5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5bMF07XG5cbiAgICAvLyBJZiB0aGUgcHJvdmlkZWQgaXRlbSBlbGVtZW50IGlzIG5vdCBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZ3JpZCBjb250YWluZXJcbiAgICAvLyBlbGVtZW50LCBhcHBlbmQgaXQgdG8gdGhlIGdyaWQgY29udGFpbmVyLlxuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgIT09IGdyaWQuX2VsZW1lbnQpIHtcbiAgICAgIGdyaWQuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0gY2xhc3MuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIElmIGlzQWN0aXZlIGlzIG5vdCBkZWZpbmVkLCBsZXQncyB0cnkgdG8gYXV0by1kZXRlY3QgaXQuXG4gICAgaWYgKHR5cGVvZiBpc0FjdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpc0FjdGl2ZSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgIT09ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgYWN0aXZlIHN0YXRlIChkZWZpbmVzIGlmIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgbGF5b3V0XG4gICAgLy8gb3Igbm90KS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGlzQWN0aXZlO1xuXG4gICAgLy8gU2V0IGVsZW1lbnQncyBpbml0aWFsIHBvc2l0aW9uIHN0eWxlcy5cbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZygwLCAwKTtcblxuICAgIC8vIEluaXRpYXRlIGl0ZW0ncyBhbmltYXRpb24gY29udHJvbGxlcnMuXG4gICAgdGhpcy5fYW5pbWF0ZSA9IG5ldyBJdGVtQW5pbWF0ZShlbGVtZW50KTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQgPSBuZXcgSXRlbUFuaW1hdGUodGhpcy5fY2hpbGQpO1xuXG4gICAgLy8gU2V0dXAgdmlzaWJpbGl0eSBoYW5kbGVyLlxuICAgIHRoaXMuX3Zpc2liaWxpdHkgPSBuZXcgSXRlbVZpc2liaWxpdHkodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbGF5b3V0IGhhbmRsZXIuXG4gICAgdGhpcy5fbGF5b3V0ID0gbmV3IEl0ZW1MYXlvdXQodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgbWlncmF0aW9uIGhhbmRsZXIgZGF0YS5cbiAgICB0aGlzLl9taWdyYXRlID0gbmV3IEl0ZW1NaWdyYXRlKHRoaXMpO1xuXG4gICAgLy8gU2V0IHVwIHJlbGVhc2UgaGFuZGxlci4gTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgaXMgZnVsbHkgbGlua2VkIHRvIGRyYWdnaW5nXG4gICAgLy8gdGhpcyBzdGlsbCBuZWVkcyB0byBiZSBhbHdheXMgaW5zdGFudGlhdGVkIHRvIGhhbmRsZSBtaWdyYXRpb24gc2NlbmFyaW9zXG4gICAgLy8gY29ycmVjdGx5LlxuICAgIHRoaXMuX3JlbGVhc2UgPSBuZXcgSXRlbVJlbGVhc2UodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBwbGFjZWhvbGRlciBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG9cbiAgICAvLyBkcmFnZ2luZyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvblxuICAgIC8vIHNjZW5hcmlvcyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fZHJhZ1BsYWNlaG9sZGVyID0gbmV3IEl0ZW1EcmFnUGxhY2Vob2xkZXIodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgZHJhZyBoYW5kbGVyLlxuICAgIHRoaXMuX2RyYWcgPSBzZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyh0aGlzKSA6IG51bGw7XG5cbiAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fcmVmcmVzaFNvcnREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBncmlkIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGdyaWRJbnN0YW5jZXNbdGhpcy5fZ3JpZElkXTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHdpZHRoLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIGhlaWdodC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqICAgLSBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIGxlZnQsIHJpZ2h0LCB0b3AgYW5kIGJvdHRvbSBwcm9wZXJ0aWVzXG4gICAqICAgICB3aGljaCBpbmRpY2F0ZSB0aGUgaXRlbSBlbGVtZW50J3MgY2FjaGVkIG1hcmdpbnMuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRNYXJnaW4gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGhpcy5fbWFyZ2luTGVmdCxcbiAgICAgIHJpZ2h0OiB0aGlzLl9tYXJnaW5SaWdodCxcbiAgICAgIHRvcDogdGhpcy5fbWFyZ2luVG9wLFxuICAgICAgYm90dG9tOiB0aGlzLl9tYXJnaW5Cb3R0b21cbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UgZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCBhbmQgdG9wIHByb3BlcnRpZXMgd2hpY2ggaW5kaWNhdGUgdGhlXG4gICAqICAgICBpdGVtIGVsZW1lbnQncyBjYWNoZWQgcG9zaXRpb24gaW4gdGhlIGdyaWQuXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9sZWZ0LFxuICAgICAgdG9wOiB0aGlzLl90b3BcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBhY3RpdmU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNWaXNpYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fdmlzaWJpbGl0eSAmJiAhdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRkZW47XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIGFuaW1hdGVkIHRvIHZpc2libGU/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNTaG93aW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNTaG93aW5nKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gaGlkZGVuP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzSGlkaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3Zpc2liaWxpdHkgJiYgdGhpcy5fdmlzaWJpbGl0eS5faXNIaWRpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBwb3NpdGlvbmluZz9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Bvc2l0aW9uaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2xheW91dCAmJiB0aGlzLl9sYXlvdXQuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0RyYWdnaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyByZWxlYXNlZD9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1JlbGVhc2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhISh0aGlzLl9yZWxlYXNlICYmIHRoaXMuX3JlbGVhc2UuX2lzQWN0aXZlKTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gZGVzdHJveWVkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRGVzdHJveWVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIGl0ZW0ncyBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbikgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBkcmFnUGxhY2Vob2xkZXIgPSB0aGlzLl9kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbnMgKGlnbm9yZSBuZWdhdGl2ZSBtYXJnaW5zKS5cbiAgICB0aGlzLl9tYXJnaW5MZWZ0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tbGVmdCcpKTtcbiAgICB0aGlzLl9tYXJnaW5SaWdodCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXJpZ2h0JykpO1xuICAgIHRoaXMuX21hcmdpblRvcCA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLXRvcCcpKTtcbiAgICB0aGlzLl9tYXJnaW5Cb3R0b20gPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1ib3R0b20nKSk7XG5cbiAgICAvLyBLZWVwIGRyYWcgcGxhY2Vob2xkZXIncyBkaW1lbnNpb25zIHN5bmNlZCB3aXRoIHRoZSBpdGVtJ3MuXG4gICAgaWYgKGRyYWdQbGFjZWhvbGRlcikge1xuICAgICAgZHJhZ1BsYWNlaG9sZGVyLnVwZGF0ZURpbWVuc2lvbnModGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhbmQgc3RvcmUgaXRlbSdzIHNvcnQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fcmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZGF0YSA9ICh0aGlzLl9zb3J0RGF0YSA9IHt9KTtcbiAgICB2YXIgZ2V0dGVycyA9IHRoaXMuZ2V0R3JpZCgpLl9zZXR0aW5ncy5zb3J0RGF0YTtcbiAgICB2YXIgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBnZXR0ZXJzKSB7XG4gICAgICBkYXRhW3Byb3BdID0gZ2V0dGVyc1twcm9wXSh0aGlzLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgaXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnQ9ZmFsc2VdXG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKHJlbW92ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciBpbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YodGhpcyk7XG5cbiAgICAvLyBEZXN0cm95IGhhbmRsZXJzLlxuICAgIHRoaXMuX3JlbGVhc2UuZGVzdHJveSgpO1xuICAgIHRoaXMuX21pZ3JhdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2xheW91dC5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmlzaWJpbGl0eS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5pbWF0ZUNoaWxkLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWcgJiYgdGhpcy5fZHJhZy5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGlubGluZSBzdHlsZXMuXG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgdGhpcy5fY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gY2xhc3MuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUNsYXNzKTtcblxuICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gR3JpZCBpbnN0YW5jZSBpZiBpdCBzdGlsbCBleGlzdHMgdGhlcmUuXG4gICAgaW5kZXggPiAtMSAmJiBncmlkLl9pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET00uXG4gICAgcmVtb3ZlRWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBSZXNldCBzdGF0ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsYXlvdXQgYWxnb3JpdGhtIGZvciBNdXVyaS4gQmFzZWQgb24gTUFYUkVDVFMgYXBwcm9hY2hcbiAgICogYXMgZGVzY3JpYmVkIGJ5IEp1a2thIEp5bMOkbmtpIGluIGhpcyBzdXJ2ZXk6IFwiQSBUaG91c2FuZCBXYXlzIHRvIFBhY2sgdGhlXG4gICAqIEJpbiAtIEEgUHJhY3RpY2FsIEFwcHJvYWNoIHRvIFR3by1EaW1lbnNpb25hbCBSZWN0YW5nbGUgQmluIFBhY2tpbmcuXCIuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUGFja2VyKCkge1xuICAgIHRoaXMuX3Nsb3RzID0gW107XG4gICAgdGhpcy5fc2xvdFNpemVzID0gW107XG4gICAgdGhpcy5fZnJlZVNsb3RzID0gW107XG4gICAgdGhpcy5fbmV3U2xvdHMgPSBbXTtcbiAgICB0aGlzLl9yZWN0SXRlbSA9IHt9O1xuICAgIHRoaXMuX3JlY3RTdG9yZSA9IFtdO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICAvLyBUaGUgbGF5b3V0IHJldHVybiBkYXRhLCB3aGljaCB3aWxsIGJlIHBvcHVsYXRlZCBpbiBnZXRMYXlvdXQuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgc2xvdHM6IG51bGwsXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IGZhbHNlLFxuICAgICAgaGVpZ2h0OiBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBCaW5kIHNvcnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA9IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0ID0gdGhpcy5fc29ydFJlY3RzVG9wTGVmdC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBwYXJhbSB7TnVtYmVyW119IFtzbG90c11cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbGxHYXBzPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnbkJvdHRvbT1mYWxzZV1cbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uKGl0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBzbG90cywgb3B0aW9ucykge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIGZpbGxHYXBzID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmZpbGxHYXBzKTtcbiAgICB2YXIgaXNIb3Jpem9udGFsID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmhvcml6b250YWwpO1xuICAgIHZhciBhbGlnblJpZ2h0ID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduUmlnaHQpO1xuICAgIHZhciBhbGlnbkJvdHRvbSA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGlnbkJvdHRvbSk7XG4gICAgdmFyIHJvdW5kaW5nID0gISEob3B0aW9ucyAmJiBvcHRpb25zLnJvdW5kaW5nKTtcbiAgICB2YXIgc2xvdFNpemVzID0gdGhpcy5fc2xvdFNpemVzO1xuICAgIHZhciBpO1xuXG4gICAgLy8gUmVzZXQgbGF5b3V0IGRhdGEuXG4gICAgbGF5b3V0LnNsb3RzID0gc2xvdHMgPyBzbG90cyA6IHRoaXMuX3Nsb3RzO1xuICAgIGxheW91dC53aWR0aCA9IGlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQod2lkdGgpIDogd2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9ICFpc0hvcml6b250YWwgPyAwIDogcm91bmRpbmcgPyBNYXRoLnJvdW5kKGhlaWdodCkgOiBoZWlnaHQ7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gaXNIb3Jpem9udGFsO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSAhaXNIb3Jpem9udGFsO1xuXG4gICAgLy8gTWFrZSBzdXJlIHNsb3RzIGFuZCBzbG90IHNpemUgYXJyYXlzIGFyZSByZXNldC5cbiAgICBsYXlvdXQuc2xvdHMubGVuZ3RoID0gMDtcbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcblxuICAgIC8vIE5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiBpdGVtcyBkbyBub3QgZXhpc3QuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBsYXlvdXQ7XG5cbiAgICAvLyBGaW5kIHNsb3RzIGZvciBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FkZFNsb3QoaXRlbXNbaV0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCBhbGlnblJpZ2h0IHx8IGFsaWduQm90dG9tKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byByaWdodCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25SaWdodCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxheW91dC5zbG90cy5sZW5ndGg7IGkgPSBpICsgMikge1xuICAgICAgICBsYXlvdXQuc2xvdHNbaV0gPSBsYXlvdXQud2lkdGggLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHNldCB0byBib3R0b20gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuXG4gICAgaWYgKGFsaWduQm90dG9tKSB7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC5oZWlnaHQgLSAobGF5b3V0LnNsb3RzW2ldICsgc2xvdFNpemVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBzbG90cyBhcnJheXMgYW5kIHJlY3QgaWQuXG4gICAgc2xvdFNpemVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fZnJlZVNsb3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fbmV3U2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yZWN0SWQgPSAwO1xuXG4gICAgcmV0dXJuIGxheW91dDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciB0aGUgbGF5b3V0IGl0ZW0uIFJldHVybnMgdGhlIGxlZnQgYW5kIHRvcCBwb3NpdGlvblxuICAgKiBvZiB0aGUgaXRlbSBpbiBwaXhlbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzSG9yaXpvbnRhbFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbGxHYXBzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcm91bmRpbmdcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkU2xvdCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgZXBzID0gMC4wMDE7XG4gICAgdmFyIGl0ZW1TbG90ID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIGlzSG9yaXpvbnRhbCwgZmlsbEdhcHMsIHJvdW5kaW5nLCB0cmFja1NpemUpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgICB2YXIgZnJlZVNsb3RzID0gdGhpcy5fZnJlZVNsb3RzO1xuICAgICAgdmFyIG5ld1Nsb3RzID0gdGhpcy5fbmV3U2xvdHM7XG4gICAgICB2YXIgcmVjdDtcbiAgICAgIHZhciByZWN0SWQ7XG4gICAgICB2YXIgcG90ZW50aWFsU2xvdHM7XG4gICAgICB2YXIgaWdub3JlQ3VycmVudFNsb3RzO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgaWk7XG5cbiAgICAgIC8vIFJlc2V0IG5ldyBzbG90cy5cbiAgICAgIG5ld1Nsb3RzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIFNldCBpdGVtIHNsb3QgaW5pdGlhbCBkYXRhLlxuICAgICAgaXRlbVNsb3QubGVmdCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC50b3AgPSBudWxsO1xuICAgICAgaXRlbVNsb3Qud2lkdGggPSBpdGVtLl93aWR0aCArIGl0ZW0uX21hcmdpbkxlZnQgKyBpdGVtLl9tYXJnaW5SaWdodDtcbiAgICAgIGl0ZW1TbG90LmhlaWdodCA9IGl0ZW0uX2hlaWdodCArIGl0ZW0uX21hcmdpblRvcCArIGl0ZW0uX21hcmdpbkJvdHRvbTtcblxuICAgICAgLy8gUm91bmQgaXRlbSBzbG90IHdpZHRoIGFuZCBoZWlnaHQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvdW5kaW5nKSB7XG4gICAgICAgIGl0ZW1TbG90LndpZHRoID0gTWF0aC5yb3VuZChpdGVtU2xvdC53aWR0aCk7XG4gICAgICAgIGl0ZW1TbG90LmhlaWdodCA9IE1hdGgucm91bmQoaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBzbG90IGZvciB0aGUgaXRlbS5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIGlmIChpdGVtU2xvdC53aWR0aCA8PSByZWN0LndpZHRoICsgZXBzICYmIGl0ZW1TbG90LmhlaWdodCA8PSByZWN0LmhlaWdodCArIGVwcykge1xuICAgICAgICAgIGl0ZW1TbG90LmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgICAgICAgaXRlbVNsb3QudG9wID0gcmVjdC50b3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc2xvdCB3YXMgZm91bmQgZm9yIHRoZSBpdGVtLlxuICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gUG9zaXRpb24gdGhlIGl0ZW0gaW4gdG8gdGhlIGJvdHRvbSBsZWZ0ICh2ZXJ0aWNhbCBtb2RlKSBvciB0b3AgcmlnaHRcbiAgICAgICAgLy8gKGhvcml6b250YWwgbW9kZSkgb2YgdGhlIGdyaWQuXG4gICAgICAgIGl0ZW1TbG90LmxlZnQgPSAhaXNIb3Jpem9udGFsID8gMCA6IGxheW91dC53aWR0aDtcbiAgICAgICAgaXRlbVNsb3QudG9wID0gIWlzSG9yaXpvbnRhbCA/IGxheW91dC5oZWlnaHQgOiAwO1xuXG4gICAgICAgIC8vIElmIGdhcHMgZG9uJ3QgbmVlZCBmaWxsaW5nIGRvIG5vdCBhZGQgYW55IGN1cnJlbnQgc2xvdHMgdG8gdGhlIG5ld1xuICAgICAgICAvLyBzbG90cyBhcnJheS5cbiAgICAgICAgaWYgKCFmaWxsR2Fwcykge1xuICAgICAgICAgIGlnbm9yZUN1cnJlbnRTbG90cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW4gdmVydGljYWwgbW9kZSwgaWYgdGhlIGl0ZW0ncyBib3R0b20gb3ZlcmxhcHMgdGhlIGdyaWQncyBib3R0b20uXG4gICAgICBpZiAoIWlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQgPiBsYXlvdXQuaGVpZ2h0KSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIGxlZnQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ID4gMCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2godGhpcy5fYWRkUmVjdCgwLCBsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC5sZWZ0LCBJbmZpbml0eSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgcmlnaHQgZWRnZSwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPCBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoLFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0LFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGggLSBpdGVtU2xvdC5sZWZ0IC0gaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIGhlaWdodC5cbiAgICAgICAgbGF5b3V0LmhlaWdodCA9IGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gaG9yaXpvbnRhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIHJpZ2h0IG92ZXJsYXBzIHRoZSBncmlkJ3MgcmlnaHQgZWRnZS5cbiAgICAgIGlmIChpc0hvcml6b250YWwgJiYgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoID4gbGF5b3V0LndpZHRoKSB7XG4gICAgICAgIC8vIElmIGl0ZW0gaXMgbm90IGFsaWduZWQgdG8gdGhlIHRvcCwgY3JlYXRlIGEgbmV3IHNsb3QuXG4gICAgICAgIGlmIChpdGVtU2xvdC50b3AgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KGxheW91dC53aWR0aCwgMCwgSW5maW5pdHksIGl0ZW1TbG90LnRvcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgYm90dG9tLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA8IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgICAgbGF5b3V0LndpZHRoLFxuICAgICAgICAgICAgICBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQsXG4gICAgICAgICAgICAgIEluZmluaXR5LFxuICAgICAgICAgICAgICBsYXlvdXQuaGVpZ2h0IC0gaXRlbVNsb3QudG9wIC0gaXRlbVNsb3QuaGVpZ2h0XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBncmlkIHdpZHRoLlxuICAgICAgICBsYXlvdXQud2lkdGggPSBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIHRoZSBjdXJyZW50IHNsb3RzIG1ha2luZyBzdXJlIHRoZXJlIGFyZSBubyBvbGQgc2xvdHMgdGhhdFxuICAgICAgLy8gb3ZlcmxhcCB3aXRoIHRoZSBpdGVtLiBJZiBhbiBvbGQgc2xvdCBvdmVybGFwcyB3aXRoIHRoZSBpdGVtLCBzcGxpdCBpdFxuICAgICAgLy8gaW50byBzbWFsbGVyIHNsb3RzIGlmIG5lY2Vzc2FyeS5cbiAgICAgIGZvciAoaSA9IGZpbGxHYXBzID8gMCA6IGlnbm9yZUN1cnJlbnRTbG90cyA/IGZyZWVTbG90cy5sZW5ndGggOiBpOyBpIDwgZnJlZVNsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlY3RJZCA9IGZyZWVTbG90c1tpXTtcbiAgICAgICAgaWYgKCFyZWN0SWQpIGNvbnRpbnVlO1xuICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICBwb3RlbnRpYWxTbG90cyA9IHRoaXMuX3NwbGl0UmVjdChyZWN0LCBpdGVtU2xvdCk7XG4gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBvdGVudGlhbFNsb3RzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIHJlY3RJZCA9IHBvdGVudGlhbFNsb3RzW2lpXTtcbiAgICAgICAgICByZWN0ID0gdGhpcy5fZ2V0UmVjdChyZWN0SWQpO1xuICAgICAgICAgIC8vIExldCdzIG1ha2Ugc3VyZSBoZXJlIHRoYXQgd2UgaGF2ZSBhIGJpZyBlbm91Z2ggc2xvdFxuICAgICAgICAgIC8vICh3aWR0aC9oZWlnaHQgPiAwLjQ5cHgpIGFuZCBhbHNvIGxldCdzIG1ha2Ugc3VyZSB0aGF0IHRoZSBzbG90IGlzXG4gICAgICAgICAgLy8gd2l0aGluIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBncmlkLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlY3Qud2lkdGggPiAwLjQ5ICYmXG4gICAgICAgICAgICByZWN0LmhlaWdodCA+IDAuNDkgJiZcbiAgICAgICAgICAgICgoIWlzSG9yaXpvbnRhbCAmJiByZWN0LnRvcCA8IGxheW91dC5oZWlnaHQpIHx8XG4gICAgICAgICAgICAgIChpc0hvcml6b250YWwgJiYgcmVjdC5sZWZ0IDwgbGF5b3V0LndpZHRoKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG5ld1Nsb3RzLnB1c2gocmVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgbmV3IHNsb3RzLlxuICAgICAgaWYgKG5ld1Nsb3RzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9wdXJnZVJlY3RzKG5ld1Nsb3RzKS5zb3J0KFxuICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IHRoaXMuX3NvcnRSZWN0c0xlZnRUb3AgOiB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2lkdGgvaGVpZ2h0LlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBsYXlvdXQud2lkdGggPSBNYXRoLm1heChsYXlvdXQud2lkdGgsIGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gTWF0aC5tYXgobGF5b3V0LmhlaWdodCwgaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGl0ZW0gc2xvdCBkYXRhIHRvIGxheW91dCBzbG90cyAoYW5kIHN0b3JlIHRoZSBzbG90IHNpemUgZm9yIGxhdGVyXG4gICAgICAvLyB1c2FnZSB0b28gaWYgbmVjZXNzYXJ5KS5cbiAgICAgIGxheW91dC5zbG90cy5wdXNoKGl0ZW1TbG90LmxlZnQsIGl0ZW1TbG90LnRvcCk7XG4gICAgICBpZiAodHJhY2tTaXplKSB0aGlzLl9zbG90U2l6ZXMucHVzaChpdGVtU2xvdC53aWR0aCwgaXRlbVNsb3QuaGVpZ2h0KTtcblxuICAgICAgLy8gRnJlZS9uZXcgc2xvdHMgc3dpdGNoZXJvbyFcbiAgICAgIHRoaXMuX2ZyZWVTbG90cyA9IG5ld1Nsb3RzO1xuICAgICAgdGhpcy5fbmV3U2xvdHMgPSBmcmVlU2xvdHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogQWRkIGEgbmV3IHJlY3RhbmdsZSB0byB0aGUgcmVjdGFuZ2xlIHN0b3JlLiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgbmV3XG4gICAqIHJlY3RhbmdsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlZnRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRvcFxuICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICAgKiBAcmV0dXJucyB7UmVjdElkfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fYWRkUmVjdCA9IGZ1bmN0aW9uKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciByZWN0SWQgPSArK3RoaXMuX3JlY3RJZDtcbiAgICB2YXIgcmVjdFN0b3JlID0gdGhpcy5fcmVjdFN0b3JlO1xuXG4gICAgcmVjdFN0b3JlW3JlY3RJZF0gPSBsZWZ0IHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHRvcCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSB3aWR0aCB8fCAwO1xuICAgIHJlY3RTdG9yZVsrK3RoaXMuX3JlY3RJZF0gPSBoZWlnaHQgfHwgMDtcblxuICAgIHJldHVybiByZWN0SWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCByZWN0YW5nbGUgZGF0YSBmcm9tIHRoZSByZWN0YW5nbGUgc3RvcmUgYnkgaWQuIE9wdGlvbmFsbHkgeW91IGNhblxuICAgKiBwcm92aWRlIGEgdGFyZ2V0IG9iamVjdCB3aGVyZSB0aGUgcmVjdGFuZ2xlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGluLiBCeVxuICAgKiBkZWZhdWx0IGFuIGludGVybmFsIG9iamVjdCBpcyByZXVzZWQgYXMgYSB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gaWRcbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9nZXRSZWN0ID0gZnVuY3Rpb24oaWQsIHRhcmdldCkge1xuICAgIHZhciByZWN0SXRlbSA9IHRhcmdldCA/IHRhcmdldCA6IHRoaXMuX3JlY3RJdGVtO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0SXRlbS5sZWZ0ID0gcmVjdFN0b3JlW2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLnRvcCA9IHJlY3RTdG9yZVsrK2lkXSB8fCAwO1xuICAgIHJlY3RJdGVtLndpZHRoID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0uaGVpZ2h0ID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG5cbiAgICByZXR1cm4gcmVjdEl0ZW07XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1bmNoIGEgaG9sZSBpbnRvIGEgcmVjdGFuZ2xlIGFuZCBzcGxpdCB0aGUgcmVtYWluaW5nIGFyZWEgaW50byBzbWFsbGVyXG4gICAqIHJlY3RhbmdsZXMgKDQgYXQgbWF4KS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IHJlY3RcbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IGhvbGVcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc3BsaXRSZWN0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJlY3QsIGhvbGUpIHtcbiAgICAgIC8vIFJlc2V0IG9sZCByZXN1bHRzLlxuICAgICAgcmVzdWx0cy5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBJZiB0aGUgcmVjdCBkb2VzIG5vdCBvdmVybGFwIHdpdGggdGhlIGhvbGUgYWRkIHJlY3QgdG8gdGhlIHJldHVybiBkYXRhXG4gICAgICAvLyBhcyBpcy5cbiAgICAgIGlmICghdGhpcy5fZG9SZWN0c092ZXJsYXAocmVjdCwgaG9sZSkpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZnQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0IDwgaG9sZS5sZWZ0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIGhvbGUubGVmdCAtIHJlY3QubGVmdCwgcmVjdC5oZWlnaHQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmlnaHQgc3BsaXQuXG4gICAgICBpZiAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCA+IGhvbGUubGVmdCArIGhvbGUud2lkdGgpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICBob2xlLmxlZnQgKyBob2xlLndpZHRoLFxuICAgICAgICAgICAgcmVjdC50b3AsXG4gICAgICAgICAgICByZWN0LmxlZnQgKyByZWN0LndpZHRoIC0gKGhvbGUubGVmdCArIGhvbGUud2lkdGgpLFxuICAgICAgICAgICAgcmVjdC5oZWlnaHRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvcCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LnRvcCA8IGhvbGUudG9wKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9hZGRSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIGhvbGUudG9wIC0gcmVjdC50b3ApKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90dG9tIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wICsgcmVjdC5oZWlnaHQgPiBob2xlLnRvcCArIGhvbGUuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChcbiAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgcmVjdC5sZWZ0LFxuICAgICAgICAgICAgaG9sZS50b3AgKyBob2xlLmhlaWdodCxcbiAgICAgICAgICAgIHJlY3Qud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gKGhvbGUudG9wICsgaG9sZS5oZWlnaHQpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdGFuZ2xlcyBvdmVybGFwLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2RvUmVjdHNPdmVybGFwID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiAhKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWN0YW5nbGUgaXMgZnVsbHkgd2l0aGluIGFub3RoZXIgcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gYlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2lzUmVjdFdpdGhpblJlY3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubGVmdCA+PSBiLmxlZnQgJiZcbiAgICAgIGEudG9wID49IGIudG9wICYmXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCArIGIud2lkdGggJiZcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgKyBiLmhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvb3BzIHRocm91Z2ggYW4gYXJyYXkgb2YgcmVjdGFuZ2xlIGlkcyBhbmQgcmVzZXRzIGFsbCB0aGF0IGFyZSBmdWxseVxuICAgKiB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUgaW4gdGhlIGFycmF5LiBSZXNldHRpbmcgaW4gdGhpcyBjYXNlIG1lYW5zIHRoYXRcbiAgICogdGhlIHJlY3RhbmdsZSBpZCB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHplcm8uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkW119IHJlY3RJZHNcbiAgICogQHJldHVybnMge1JlY3RJZFtdfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fcHVyZ2VSZWN0cyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdElkcykge1xuICAgICAgdmFyIGkgPSByZWN0SWRzLmxlbmd0aDtcbiAgICAgIHZhciBpaTtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgICBpZiAoIXJlY3RJZHNbaV0pIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaV0sIHJlY3RBKTtcbiAgICAgICAgd2hpbGUgKGlpLS0pIHtcbiAgICAgICAgICBpZiAoIXJlY3RJZHNbaWldIHx8IGkgPT09IGlpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodGhpcy5faXNSZWN0V2l0aGluUmVjdChyZWN0QSwgdGhpcy5fZ2V0UmVjdChyZWN0SWRzW2lpXSwgcmVjdEIpKSkge1xuICAgICAgICAgICAgcmVjdElkc1tpXSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY3RJZHM7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogU29ydCByZWN0YW5nbGVzIHdpdGggdG9wLWxlZnQgZ3Jhdml0eS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWR9IGFJZFxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYklkXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zb3J0UmVjdHNUb3BMZWZ0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihhSWQsIGJJZCkge1xuICAgICAgdGhpcy5fZ2V0UmVjdChhSWQsIHJlY3RBKTtcbiAgICAgIHRoaXMuX2dldFJlY3QoYklkLCByZWN0Qik7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIHJldHVybiByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDogMDtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCBsZWZ0LXRvcCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c0xlZnRUb3AgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLmxlZnQgPCByZWN0Qi5sZWZ0ID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLmxlZnQgPiByZWN0Qi5sZWZ0ID8gMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wIDwgcmVjdEIudG9wID8gLTEgOlxuICAgICAgICAgICAgIHJlY3RBLnRvcCA+IHJlY3RCLnRvcCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgdmFyIGh0bWxDb2xsZWN0aW9uVHlwZSA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7XG4gIHZhciBub2RlTGlzdFR5cGUgPSAnW29iamVjdCBOb2RlTGlzdF0nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9kZSBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNOb2RlTGlzdCh2YWwpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICAgIHJldHVybiB0eXBlID09PSBodG1sQ29sbGVjdGlvblR5cGUgfHwgdHlwZSA9PT0gbm9kZUxpc3RUeXBlO1xuICB9XG5cbiAgdmFyIG9iamVjdFR5cGUgPSAnb2JqZWN0JztcbiAgdmFyIG9iamVjdFRvU3RyaW5nVHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IG9iamVjdFR5cGUgJiYgdG9TdHJpbmcuY2FsbCh2YWwpID09PSBvYmplY3RUb1N0cmluZ1R5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhbiBhcnJheSBvciBjbG9uZXMgYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGlzTm9kZUxpc3QodGFyZ2V0KSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhcmdldCkgOiBBcnJheS5wcm90b3R5cGUuY29uY2F0KHRhcmdldCk7XG4gIH1cblxuICB2YXIgcGFja2VyID0gbmV3IFBhY2tlcigpO1xuICB2YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbiAgdmFyIG51bWJlclR5cGUkMSA9ICdudW1iZXInO1xuICB2YXIgc3RyaW5nVHlwZSA9ICdzdHJpbmcnO1xuICB2YXIgaW5zdGFudExheW91dCA9ICdpbnN0YW50JztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U3RyaW5nKX0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7PyhIVE1MRWxlbWVudFtdfE5vZGVMaXN0fFN0cmluZyl9IFtvcHRpb25zLml0ZW1zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2hvd0R1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNob3dFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy52aXNpYmxlU3R5bGVzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGlkZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmhpZGVFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5oaWRkZW5TdHlsZXNdXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IFtvcHRpb25zLmxheW91dF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0Lmhvcml6b250YWw9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduUmlnaHQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5yb3VuZGluZz10cnVlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufE51bWJlcil9IFtvcHRpb25zLmxheW91dE9uUmVzaXplPTEwMF1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXRPbkluaXQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmxheW91dER1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmxheW91dEVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9ucy5zb3J0RGF0YT1udWxsXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdFbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0gez9IdG1sRWxlbWVudH0gW29wdGlvbnMuZHJhZ0NvbnRhaW5lcj1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1N0YXJ0UHJlZGljYXRlLmRpc3RhbmNlPTBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGVsYXk9MF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxTdHJpbmcpfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuaGFuZGxlPWZhbHNlXVxuICAgKiBAcGFyYW0gez9TdHJpbmd9IFtvcHRpb25zLmRyYWdBeGlzXVxuICAgKiBAcGFyYW0geyhCb29sZWFufEZ1bmN0aW9uKX0gW29wdGlvbnMuZHJhZ1NvcnQ9dHJ1ZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljc11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5zb3J0SW50ZXJ2YWw9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkRyYWdEaXN0YW5jZT0xMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0SGV1cmlzdGljcy5taW5Cb3VuY2VCYWNrQW5nbGU9MV1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMuZHJhZ1NvcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZS5hY3Rpb249XCJtb3ZlXCJdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUmVsZWFzZUR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdSZWxlYXNlRWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ0Nzc1Byb3BzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lbmFibGVkPWZhbHNlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmR1cmF0aW9uPTMwMF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5lYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuY3JlYXRlRWxlbWVudD1udWxsXVxuICAgKiBAcGFyYW0gez9GdW5jdGlvbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLm9uQ3JlYXRlPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25SZW1vdmU9bnVsbF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRhaW5lckNsYXNzPVwibXV1cmlcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1DbGFzcz1cIm11dXJpLWl0ZW1cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1WaXNpYmxlQ2xhc3M9XCJtdXVyaS1pdGVtLXZpc2libGVcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1IaWRkZW5DbGFzcz1cIm11dXJpLWl0ZW0taGlkZGVuXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUG9zaXRpb25pbmdDbGFzcz1cIm11dXJpLWl0ZW0tcG9zaXRpb25pbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1EcmFnZ2luZ0NsYXNzPVwibXV1cmktaXRlbS1kcmFnZ2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVJlbGVhc2luZ0NsYXNzPVwibXV1cmktaXRlbS1yZWxlYXNpbmdcIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1QbGFjZWhvbGRlckNsYXNzPVwibXV1cmktaXRlbS1wbGFjZWhvbGRlclwiXVxuICAgKi9cblxuICBmdW5jdGlvbiBHcmlkKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXM7XG4gICAgdmFyIHNldHRpbmdzO1xuICAgIHZhciBpdGVtcztcbiAgICB2YXIgbGF5b3V0T25SZXNpemU7XG5cbiAgICAvLyBBbGxvdyBwYXNzaW5nIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nLiBTdG9yZSBlbGVtZW50IGZvciBpbnN0YW5jZS5cbiAgICBlbGVtZW50ID0gdGhpcy5fZWxlbWVudCA9XG4gICAgICB0eXBlb2YgZWxlbWVudCA9PT0gc3RyaW5nVHlwZSA/IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpIDogZWxlbWVudDtcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyBub3QgYm9keSBlbGVtZW50IG9yIGRvZXMgbm90XG4gICAgLy8gZXhpc3Qgd2l0aGluIHRoZSBib2R5IGVsZW1lbnQuXG4gICAgdmFyIGlzRWxlbWVudEluRG9tID0gZWxlbWVudC5nZXRSb290Tm9kZVxuICAgICAgPyBlbGVtZW50LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IHRydWUgfSkgPT09IGRvY3VtZW50XG4gICAgICA6IHdpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIGlmICghaXNFbGVtZW50SW5Eb20gfHwgZWxlbWVudCA9PT0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250YWluZXIgZWxlbWVudCBtdXN0IGJlIGFuIGV4aXN0aW5nIERPTSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIHNldHRpbmdzIGJ5IG1lcmdpbmcgdGhlIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gICAgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncyA9IG1lcmdlU2V0dGluZ3MoR3JpZC5kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAvLyBTYW5pdGl6ZSBkcmFnU29ydCBzZXR0aW5nLlxuICAgIGlmICghaXNGdW5jdGlvbihzZXR0aW5ncy5kcmFnU29ydCkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdTb3J0ID0gISFzZXR0aW5ncy5kcmFnU29ydDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQgYW5kIHN0b3JlIGl0IHRvIHRoZSBncmlkIGluc3RhbmNlcyBjb2xsZWN0aW9uLlxuICAgIHRoaXMuX2lkID0gY3JlYXRlVWlkKCk7XG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSBpbnN0O1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBsYXlvdXQgb2JqZWN0IChtdXRhdGVkIG9uIGV2ZXJ5IGxheW91dCkuXG4gICAgdGhpcy5fbGF5b3V0ID0ge1xuICAgICAgaWQ6IDAsXG4gICAgICBpdGVtczogW10sXG4gICAgICBzbG90czogW10sXG4gICAgICBzZXRXaWR0aDogZmFsc2UsXG4gICAgICBzZXRIZWlnaHQ6IGZhbHNlLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHByaXZhdGUgRW1pdHRlciBpbnN0YW5jZS5cbiAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcblxuICAgIC8vIEFkZCBjb250YWluZXIgZWxlbWVudCdzIGNsYXNzIG5hbWUuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY29udGFpbmVyQ2xhc3MpO1xuXG4gICAgLy8gQ3JlYXRlIGluaXRpYWwgaXRlbXMuXG4gICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICBpdGVtcyA9IHNldHRpbmdzLml0ZW1zO1xuICAgIGlmICh0eXBlb2YgaXRlbXMgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgIHRvQXJyYXkoZWxlbWVudC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICBpZiAoaXRlbXMgPT09ICcqJyB8fCBlbGVtZW50TWF0Y2hlcyhpdGVtRWxlbWVudCwgaXRlbXMpKSB7XG4gICAgICAgICAgaW5zdC5faXRlbXMucHVzaChuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpIHx8IGlzTm9kZUxpc3QoaXRlbXMpKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IHRvQXJyYXkoaXRlbXMpLm1hcChmdW5jdGlvbihpdGVtRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEl0ZW0oaW5zdCwgaXRlbUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0T25SZXNpemUgb3B0aW9uIGlzIGEgdmFsaWQgbnVtYmVyIHNhbml0aXplIGl0IGFuZCBiaW5kIHRoZSByZXNpemVcbiAgICAvLyBoYW5kbGVyLlxuICAgIGxheW91dE9uUmVzaXplID0gc2V0dGluZ3MubGF5b3V0T25SZXNpemU7XG4gICAgaWYgKHR5cGVvZiBsYXlvdXRPblJlc2l6ZSAhPT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICBsYXlvdXRPblJlc2l6ZSA9IGxheW91dE9uUmVzaXplID09PSB0cnVlID8gMCA6IC0xO1xuICAgIH1cbiAgICBpZiAobGF5b3V0T25SZXNpemUgPj0gMCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdyZXNpemUnLFxuICAgICAgICAoaW5zdC5fcmVzaXplSGFuZGxlciA9IGRlYm91bmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGluc3QucmVmcmVzaEl0ZW1zKCkubGF5b3V0KCk7XG4gICAgICAgIH0sIGxheW91dE9uUmVzaXplKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTGF5b3V0IG9uIGluaXQgaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChzZXR0aW5ncy5sYXlvdXRPbkluaXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvcGVydGllc1xuICAgKiAqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQHNlZSBJdGVtXG4gICAqL1xuICBHcmlkLkl0ZW0gPSBJdGVtO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1MYXlvdXRcbiAgICovXG4gIEdyaWQuSXRlbUxheW91dCA9IEl0ZW1MYXlvdXQ7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbVZpc2liaWxpdHlcbiAgICovXG4gIEdyaWQuSXRlbVZpc2liaWxpdHkgPSBJdGVtVmlzaWJpbGl0eTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtTWlncmF0ZVxuICAgKi9cbiAgR3JpZC5JdGVtTWlncmF0ZSA9IEl0ZW1NaWdyYXRlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1BbmltYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1BbmltYXRlID0gSXRlbUFuaW1hdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdcbiAgICovXG4gIEdyaWQuSXRlbURyYWcgPSBJdGVtRHJhZztcblxuICAvKipcbiAgICogQHNlZSBJdGVtUmVsZWFzZVxuICAgKi9cbiAgR3JpZC5JdGVtUmVsZWFzZSA9IEl0ZW1SZWxlYXNlO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1EcmFnUGxhY2Vob2xkZXJcbiAgICovXG4gIEdyaWQuSXRlbURyYWdQbGFjZWhvbGRlciA9IEl0ZW1EcmFnUGxhY2Vob2xkZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgRW1pdHRlclxuICAgKi9cbiAgR3JpZC5FbWl0dGVyID0gRW1pdHRlcjtcblxuICAvKipcbiAgICogQHNlZSBEcmFnZ2VyXG4gICAqL1xuICBHcmlkLkRyYWdnZXIgPSBEcmFnZ2VyO1xuXG4gIC8qKlxuICAgKiBAc2VlIFBhY2tlclxuICAgKi9cbiAgR3JpZC5QYWNrZXIgPSBQYWNrZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyBmb3IgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZFxuICAgKi9cbiAgR3JpZC5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAvLyBJdGVtIGVsZW1lbnRzXG4gICAgaXRlbXM6ICcqJyxcblxuICAgIC8vIERlZmF1bHQgc2hvdyBhbmltYXRpb25cbiAgICBzaG93RHVyYXRpb246IDMwMCxcbiAgICBzaG93RWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBEZWZhdWx0IGhpZGUgYW5pbWF0aW9uXG4gICAgaGlkZUR1cmF0aW9uOiAzMDAsXG4gICAgaGlkZUVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gSXRlbSdzIHZpc2libGUvaGlkZGVuIHN0YXRlIHN0eWxlc1xuICAgIHZpc2libGVTdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcxJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICAgIH0sXG4gICAgaGlkZGVuU3R5bGVzOiB7XG4gICAgICBvcGFjaXR5OiAnMCcsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJ1xuICAgIH0sXG5cbiAgICAvLyBMYXlvdXRcbiAgICBsYXlvdXQ6IHtcbiAgICAgIGZpbGxHYXBzOiBmYWxzZSxcbiAgICAgIGhvcml6b250YWw6IGZhbHNlLFxuICAgICAgYWxpZ25SaWdodDogZmFsc2UsXG4gICAgICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gICAgICByb3VuZGluZzogdHJ1ZVxuICAgIH0sXG4gICAgbGF5b3V0T25SZXNpemU6IDEwMCxcbiAgICBsYXlvdXRPbkluaXQ6IHRydWUsXG4gICAgbGF5b3V0RHVyYXRpb246IDMwMCxcbiAgICBsYXlvdXRFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIFNvcnRpbmdcbiAgICBzb3J0RGF0YTogbnVsbCxcblxuICAgIC8vIERyYWcgJiBEcm9wXG4gICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxuICAgIGRyYWdDb250YWluZXI6IG51bGwsXG4gICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XG4gICAgICBkaXN0YW5jZTogMCxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgaGFuZGxlOiBmYWxzZVxuICAgIH0sXG4gICAgZHJhZ0F4aXM6IG51bGwsXG4gICAgZHJhZ1NvcnQ6IHRydWUsXG4gICAgZHJhZ1NvcnRIZXVyaXN0aWNzOiB7XG4gICAgICBzb3J0SW50ZXJ2YWw6IDEwMCxcbiAgICAgIG1pbkRyYWdEaXN0YW5jZTogMTAsXG4gICAgICBtaW5Cb3VuY2VCYWNrQW5nbGU6IDFcbiAgICB9LFxuICAgIGRyYWdTb3J0UHJlZGljYXRlOiB7XG4gICAgICB0aHJlc2hvbGQ6IDUwLFxuICAgICAgYWN0aW9uOiBhY3Rpb25Nb3ZlXG4gICAgfSxcbiAgICBkcmFnUmVsZWFzZUR1cmF0aW9uOiAzMDAsXG4gICAgZHJhZ1JlbGVhc2VFYXNpbmc6ICdlYXNlJyxcbiAgICBkcmFnQ3NzUHJvcHM6IHtcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICAgIHRvdWNoQ2FsbG91dDogJ25vbmUnLFxuICAgICAgY29udGVudFpvb21pbmc6ICdub25lJ1xuICAgIH0sXG4gICAgZHJhZ1BsYWNlaG9sZGVyOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICBlYXNpbmc6ICdlYXNlJyxcbiAgICAgIGNyZWF0ZUVsZW1lbnQ6IG51bGwsXG4gICAgICBvbkNyZWF0ZTogbnVsbCxcbiAgICAgIG9uUmVtb3ZlOiBudWxsXG4gICAgfSxcblxuICAgIC8vIENsYXNzbmFtZXNcbiAgICBjb250YWluZXJDbGFzczogJ211dXJpJyxcbiAgICBpdGVtQ2xhc3M6ICdtdXVyaS1pdGVtJyxcbiAgICBpdGVtVmlzaWJsZUNsYXNzOiAnbXV1cmktaXRlbS1zaG93bicsXG4gICAgaXRlbUhpZGRlbkNsYXNzOiAnbXV1cmktaXRlbS1oaWRkZW4nLFxuICAgIGl0ZW1Qb3NpdGlvbmluZ0NsYXNzOiAnbXV1cmktaXRlbS1wb3NpdGlvbmluZycsXG4gICAgaXRlbURyYWdnaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLWRyYWdnaW5nJyxcbiAgICBpdGVtUmVsZWFzaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXJlbGVhc2luZycsXG4gICAgaXRlbVBsYWNlaG9sZGVyQ2xhc3M6ICdtdXVyaS1pdGVtLXBsYWNlaG9sZGVyJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBCaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgaXRlbXMuIE9wdGlvbmFsbHkgeW91IGNhbiBwcm92aWRlIHNwZWNpZmljIHRhcmdldHMgKGVsZW1lbnRzIGFuZFxuICAgKiBpbmRpY2VzKS4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBpcyBub3QgdGhlIHNhbWUgb2JqZWN0IHVzZWQgYnkgdGhlXG4gICAqIGluc3RhbmNlIHNvIG1vZGlmeWluZyBpdCB3aWxsIG5vdCBhZmZlY3QgaW5zdGFuY2UncyBpdGVtcy4gQWxsIGl0ZW1zIHRoYXRcbiAgICogYXJlIG5vdCBmb3VuZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXR1cm5lZCBhcnJheS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFt0YXJnZXRzXVxuICAgKiBAcmV0dXJucyB7SXRlbVtdfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZ2V0SXRlbXMgPSBmdW5jdGlvbih0YXJnZXRzKSB7XG4gICAgLy8gUmV0dXJuIGFsbCBpdGVtcyBpbW1lZGlhdGVseSBpZiBubyB0YXJnZXRzIHdlcmUgcHJvdmlkZWQgb3IgaWYgdGhlXG4gICAgLy8gaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAoIXRhcmdldHMgJiYgdGFyZ2V0cyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdG9BcnJheSh0YXJnZXRzKTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRhcmdldCBpdGVtcyBhcmUgZGVmaW5lZCByZXR1cm4gZmlsdGVyZWQgcmVzdWx0cy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKHRhcmdldEl0ZW1zW2ldKTtcbiAgICAgIGl0ZW0gJiYgcmV0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjYWNoZWQgZGltZW5zaW9ucyBvZiB0aGUgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IFtpdGVtc11cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZWZyZXNoSXRlbXMgPSBmdW5jdGlvbihpdGVtcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGFyZ2V0cyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldHNbaV0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc29ydCBkYXRhIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hTb3J0RGF0YSA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0YXJnZXRJdGVtc1tpXS5fcmVmcmVzaFNvcnREYXRhKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplIHRoZSBpdGVtIGVsZW1lbnRzIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaW4gdGhlIERPTS5cbiAgICogVGhpcyBjb21lcyBoYW5keSBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBET00gc3RydWN0dXJlIG1hdGNoZWQgd2l0aCB0aGVcbiAgICogb3JkZXIgb2YgdGhlIGl0ZW1zLiBOb3RlIHRoYXQgaWYgYW4gaXRlbSdzIGVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBhIGNoaWxkXG4gICAqIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCAoaWYgaXQgaXMgZHJhZ2dlZCBmb3IgZXhhbXBsZSkgaXQgaXMgaWdub3JlZCBhbmRcbiAgICogbGVmdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc3luY2hyb25pemUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIGZyYWdtZW50O1xuICAgIHZhciBlbGVtZW50O1xuICAgIHZhciBpO1xuXG4gICAgLy8gQXBwZW5kIGFsbCBlbGVtZW50cyBpbiBvcmRlciB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsZW1lbnQgPSBpdGVtc1tpXS5fZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudCB8fCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmFnbWVudCkgY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHN5bmNocm9uaXplIGV2ZW50LlxuICAgIHRoaXMuX2VtaXQoZXZlbnRTeW5jaHJvbml6ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCBhcHBseSBpdGVtIHBvc2l0aW9ucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtMYXlvdXRDYWxsYmFja30gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX3VwZGF0ZUxheW91dCgpO1xuICAgIHZhciBsYXlvdXRJZCA9IGxheW91dC5pZDtcbiAgICB2YXIgaXRlbXNMZW5ndGggPSBsYXlvdXQuaXRlbXMubGVuZ3RoO1xuICAgIHZhciBjb3VudGVyID0gaXRlbXNMZW5ndGg7XG4gICAgdmFyIGlzQm9yZGVyQm94O1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gVGhlIGZpbmlzaCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBjaGVja2luZyBpZiBhbGwgdGhlIGl0ZW1zXG4gICAgLy8gaGF2ZSBsYWlkIG91dCB5ZXQuIEFmdGVyIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbFxuICAgIC8vIGNhbGxiYWNrIGFuZCBlbWl0IGxheW91dEVuZCBldmVudC4gT25seSBlbWl0IGxheW91dEVuZCBldmVudCBpZiB0aGVyZVxuICAgIC8vIGhhc24ndCBiZWVuIGEgbmV3IGxheW91dCBjYWxsIGR1cmluZyB0aGlzIGxheW91dC5cbiAgICBmdW5jdGlvbiB0cnlGaW5pc2goKSB7XG4gICAgICBpZiAoLS1jb3VudGVyID4gMCkgcmV0dXJuO1xuXG4gICAgICB2YXIgaGFzTGF5b3V0Q2hhbmdlZCA9IGluc3QuX2xheW91dC5pZCAhPT0gbGF5b3V0SWQ7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBpc0Z1bmN0aW9uKGluc3RhbnQpID8gaW5zdGFudCA6IG9uRmluaXNoO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgY2FsbGJhY2soaGFzTGF5b3V0Q2hhbmdlZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXNMYXlvdXRDaGFuZ2VkICYmIGluc3QuX2hhc0xpc3RlbmVycyhldmVudExheW91dEVuZCkpIHtcbiAgICAgICAgaW5zdC5fZW1pdChldmVudExheW91dEVuZCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBncmlkJ3Mgd2lkdGggb3IgaGVpZ2h0IHdhcyBtb2RpZmllZCwgd2UgbmVlZCB0byB1cGRhdGUgaXQncyBjYWNoZWRcbiAgICAvLyBkaW1lbnNpb25zLiBBbHNvIGtlZXAgaW4gbWluZCB0aGF0IGdyaWQncyBjYWNoZWQgd2lkdGgvaGVpZ2h0IHNob3VsZFxuICAgIC8vIGFsd2F5cyBlcXVhbCB0byB3aGF0IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgd291bGQgcmV0dXJuLCBzb1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGFkZCB0aGUgZ3JpZCBlbGVtZW50J3MgYm9yZGVycyB0byB0aGUgZGltZW5zaW9ucyBpZlxuICAgIC8vIGl0J3MgYm94LXNpemluZyBpcyBib3JkZXItYm94LiBOb3RlIHRoYXQgd2Ugc3VwcG9ydCBwcm92aWRpbmcgdGhlXG4gICAgLy8gZGltZW5zaW9ucyBhcyBhIHN0cmluZyBoZXJlIHRvbyBzbyB0aGF0IG9uZSBjYW4gZGVmaW5lIHRoZSB1bml0IG9mIHRoZVxuICAgIC8vIGRpbWVuc2lvbnMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgZG8gdGhlIGJvcmRlci1ib3ggY2hlY2suXG4gICAgaWYgKFxuICAgICAgKGxheW91dC5zZXRIZWlnaHQgJiYgdHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkgfHxcbiAgICAgIChsYXlvdXQuc2V0V2lkdGggJiYgdHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKVxuICAgICkge1xuICAgICAgaXNCb3JkZXJCb3ggPSBnZXRTdHlsZShlbGVtZW50LCAnYm94LXNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG4gICAgfVxuICAgIGlmIChsYXlvdXQuc2V0SGVpZ2h0KSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC5oZWlnaHQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9XG4gICAgICAgICAgKGlzQm9yZGVyQm94ID8gbGF5b3V0LmhlaWdodCArIHRoaXMuX2JvcmRlclRvcCArIHRoaXMuX2JvcmRlckJvdHRvbSA6IGxheW91dC5oZWlnaHQpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbGF5b3V0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRXaWR0aCkge1xuICAgICAgaWYgKHR5cGVvZiBsYXlvdXQud2lkdGggPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQud2lkdGggKyB0aGlzLl9ib3JkZXJMZWZ0ICsgdGhpcy5fYm9yZGVyUmlnaHQgOiBsYXlvdXQud2lkdGgpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBsYXlvdXQud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCBsYXlvdXRTdGFydCBldmVudC4gTm90ZSB0aGF0IHRoaXMgaXMgaW50ZW50aW9uYWxseSBlbWl0dGVkIGFmdGVyIHRoZVxuICAgIC8vIGNvbnRhaW5lciBlbGVtZW50J3MgZGltZW5zaW9ucyBhcmUgc2V0LCBiZWNhdXNlIG90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZVxuICAgIC8vIG5vIGhvb2sgZm9yIHJlYWN0aW5nIHRvIGNvbnRhaW5lciBkaW1lbnNpb24gY2hhbmdlcy5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0U3RhcnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50TGF5b3V0U3RhcnQsIGxheW91dC5pdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGxldCdzIGZpbmlzaCBxdWlja2x5LlxuICAgIGlmICghaXRlbXNMZW5ndGgpIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGl0ZW1zIGxldCdzIHBvc2l0aW9uIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBsYXlvdXQuaXRlbXNbaV07XG4gICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIHBvc2l0aW9uLlxuICAgICAgaXRlbS5fbGVmdCA9IGxheW91dC5zbG90c1tpICogMl07XG4gICAgICBpdGVtLl90b3AgPSBsYXlvdXQuc2xvdHNbaSAqIDIgKyAxXTtcblxuICAgICAgLy8gTGF5b3V0IGl0ZW0gaWYgaXQgaXMgbm90IGRyYWdnZWQuXG4gICAgICBpdGVtLmlzRHJhZ2dpbmcoKSA/IHRyeUZpbmlzaCgpIDogaXRlbS5fbGF5b3V0LnN0YXJ0KGluc3RhbnQgPT09IHRydWUsIHRyeUZpbmlzaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgaXRlbXMgYnkgcHJvdmlkaW5nIHRoZSBlbGVtZW50cyB5b3Ugd2lzaCB0byBhZGQgdG8gdGhlIGluc3RhbmNlIGFuZFxuICAgKiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIGluZGV4IHdoZXJlIHlvdSB3YW50IHRoZSBpdGVtcyB0byBiZSBpbnNlcnRlZCBpbnRvLlxuICAgKiBBbGwgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFscmVhZHkgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQuIElmIGFuIGVsZW1lbnQgaGFzIGl0J3MgQ1NTXG4gICAqIGRpc3BsYXkgcHJvcGVydHkgc2V0IHRvIFwibm9uZVwiIGl0IHdpbGwgYmUgbWFya2VkIGFzIGluYWN0aXZlIGR1cmluZyB0aGVcbiAgICogaW5pdGlhdGlvbiBwcm9jZXNzLiBBcyBsb25nIGFzIHRoZSBpdGVtIGlzIGluYWN0aXZlIGl0IHdpbGwgbm90IGJlIHBhcnQgb2ZcbiAgICogdGhlIGxheW91dCwgYnV0IGl0IHdpbGwgcmV0YWluIGl0J3MgaW5kZXguIFlvdSBjYW4gYWN0aXZhdGUgaXRlbXMgYXQgYW55XG4gICAqIHBvaW50IHdpdGggZ3JpZC5zaG93KCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbFxuICAgKiBncmlkLmxheW91dCgpIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBhZGRlZCBlbGVtZW50cyBhcmUgdmlzaWJsZS4gSWYgb25seVxuICAgKiBoaWRkZW4gaXRlbXMgYXJlIGFkZGVkIG5vIGxheW91dCB3aWxsIGJlIGNhbGxlZC4gQWxsIHRoZSBuZXcgdmlzaWJsZSBpdGVtc1xuICAgKiBhcmUgcG9zaXRpb25lZCB3aXRob3V0IGFuaW1hdGlvbiBkdXJpbmcgdGhlaXIgZmlyc3QgbGF5b3V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdKX0gZWxlbWVudHNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXg9LTFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaXNBY3RpdmVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhZWxlbWVudHMpIHJldHVybiBbXTtcblxuICAgIHZhciBuZXdJdGVtcyA9IHRvQXJyYXkoZWxlbWVudHMpO1xuICAgIGlmICghbmV3SXRlbXMubGVuZ3RoKSByZXR1cm4gbmV3SXRlbXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBNYXAgcHJvdmlkZWQgZWxlbWVudHMgaW50byBuZXcgZ3JpZCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbmV3SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBuZXcgSXRlbSh0aGlzLCBuZXdJdGVtc1tpXSwgb3B0cy5pc0FjdGl2ZSk7XG4gICAgICBuZXdJdGVtc1tpXSA9IGl0ZW07XG5cbiAgICAgIC8vIElmIHRoZSBpdGVtIHRvIGJlIGFkZGVkIGlzIGFjdGl2ZSwgd2UgbmVlZCB0byBkbyBhIGxheW91dC4gQWxzbywgd2VcbiAgICAgIC8vIG5lZWQgdG8gbWFyayB0aGUgaXRlbSB3aXRoIHRoZSBza2lwTmV4dEFuaW1hdGlvbiBmbGFnIHRvIG1ha2UgaXRcbiAgICAgIC8vIHBvc2l0aW9uIGluc3RhbnRseSAod2l0aG91dCBhbmltYXRpb24pIGR1cmluZyB0aGUgbmV4dCBsYXlvdXQuIFdpdGhvdXRcbiAgICAgIC8vIHRoZSBoYWNrIHRoZSBpdGVtIHdvdWxkIGFuaW1hdGUgdG8gaXQncyBuZXcgcG9zaXRpb24gZnJvbSB0aGUgbm9ydGh3ZXN0XG4gICAgICAvLyBjb3JuZXIgb2YgdGhlIGdyaWQsIHdoaWNoIGZlZWxzIGEgYml0IGJ1Z2d5IChpbWhvKS5cbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICAgIGl0ZW0uX2xheW91dC5fc2tpcE5leHRBbmltYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW1zIHRvIHRoZSBpdGVtcyBjb2xsZWN0aW9uIHRvIGNvcnJlY3QgaW5kZXguXG4gICAgYXJyYXlJbnNlcnQoaXRlbXMsIG5ld0l0ZW1zLCBvcHRzLmluZGV4KTtcblxuICAgIC8vIEVtaXQgYWRkIGV2ZW50LlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRBZGQpKSB7XG4gICAgICB0aGlzLl9lbWl0KGV2ZW50QWRkLCBuZXdJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0l0ZW1zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVtb3ZlRWxlbWVudHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoaXRlbXMpO1xuICAgIHZhciBpbmRpY2VzID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGluZGl2aWR1YWwgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG4gICAgICBpbmRpY2VzLnB1c2goYWxsSXRlbXMuaW5kZXhPZihpdGVtKSk7XG4gICAgICBpZiAoaXRlbS5faXNBY3RpdmUpIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIGl0ZW0uX2Rlc3Ryb3kob3B0cy5yZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCByZW1vdmUgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFJlbW92ZSkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRSZW1vdmUsIHRhcmdldEl0ZW1zLnNsaWNlKDApLCBpbmRpY2VzKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3cgaW5zdGFuY2UgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtTaG93Q2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihpdGVtcywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5fc2V0SXRlbXNWaXNpYmlsaXR5KGl0ZW1zLCB0cnVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0hpZGVDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIGZhbHNlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRmlsdGVyIGl0ZW1zLiBFeHBlY3RzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgYSBwcmVkaWNhdGUsIHdoaWNoIHNob3VsZCBiZVxuICAgKiBlaXRoZXIgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gVGhlIHByZWRpY2F0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCBmb3IgZXZlcnlcbiAgICogaXRlbSBpbiB0aGUgaW5zdGFuY2UuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZWRpY2F0ZSBpcyB0cnV0aHkgdGhlXG4gICAqIGl0ZW0gaW4gcXVlc3Rpb24gd2lsbCBiZSBzaG93biBhbmQgb3RoZXJ3aXNlIGhpZGRlbi4gVGhlIHByZWRpY2F0ZSBjYWxsYmFja1xuICAgKiByZWNlaXZlcyB0aGUgaXRlbSBpbnN0YW5jZSBhcyBpdCdzIGFyZ3VtZW50LiBJZiB0aGUgcHJlZGljYXRlIGlzIGEgc3RyaW5nXG4gICAqIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzZWxlY3RvciBhbmQgaXQgaXMgY2hlY2tlZCBhZ2FpbnN0IGV2ZXJ5IGl0ZW1cbiAgICogZWxlbWVudCBpbiB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgbmF0aXZlIGVsZW1lbnQubWF0Y2hlcygpIG1ldGhvZC4gQWxsIHRoZVxuICAgKiBtYXRjaGluZyBpdGVtcyB3aWxsIGJlIHNob3duIGFuZCBvdGhlcnMgaGlkZGVuLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxTdHJpbmcpfSBwcmVkaWNhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RmlsdGVyQ2FsbGJhY2t9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXRlbXMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtc1RvU2hvdyA9IFtdO1xuICAgIHZhciBpdGVtc1RvSGlkZSA9IFtdO1xuICAgIHZhciBpc1ByZWRpY2F0ZVN0cmluZyA9IHR5cGVvZiBwcmVkaWNhdGUgPT09IHN0cmluZ1R5cGU7XG4gICAgdmFyIGlzUHJlZGljYXRlRm4gPSBpc0Z1bmN0aW9uKHByZWRpY2F0ZSk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIG9uRmluaXNoID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuICAgIHZhciB0cnlGaW5pc2hDb3VudGVyID0gLTE7XG4gICAgdmFyIHRyeUZpbmlzaCA9IG5vb3A7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG9uRmluaXNoIGNhbGxiYWNrLCBsZXQncyBjcmVhdGUgcHJvcGVyIHRyeUZpbmlzaCBjYWxsYmFjay5cbiAgICBpZiAob25GaW5pc2gpIHtcbiAgICAgIHRyeUZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICArK3RyeUZpbmlzaENvdW50ZXIgJiYgb25GaW5pc2goaXRlbXNUb1Nob3cuc2xpY2UoMCksIGl0ZW1zVG9IaWRlLnNsaWNlKDApKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2hpY2ggaXRlbXMgbmVlZCB0byBiZSBzaG93biBhbmQgd2hpY2ggaGlkZGVuLlxuICAgIGlmIChpc1ByZWRpY2F0ZUZuIHx8IGlzUHJlZGljYXRlU3RyaW5nKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgICBpZiAoaXNQcmVkaWNhdGVGbiA/IHByZWRpY2F0ZShpdGVtKSA6IGVsZW1lbnRNYXRjaGVzKGl0ZW0uX2VsZW1lbnQsIHByZWRpY2F0ZSkpIHtcbiAgICAgICAgICBpdGVtc1RvU2hvdy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1zVG9IaWRlLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG93IGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBzaG93bi5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3coaXRlbXNUb1Nob3csIHtcbiAgICAgICAgaW5zdGFudDogaXNJbnN0YW50LFxuICAgICAgICBvbkZpbmlzaDogdHJ5RmluaXNoLFxuICAgICAgICBsYXlvdXQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgaGlkZGVuLlxuICAgIGlmIChpdGVtc1RvSGlkZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlkZShpdGVtc1RvSGlkZSwge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGl0ZW1zIHRvIGZpbHRlci5cbiAgICBpZiAoaXRlbXNUb1Nob3cubGVuZ3RoIHx8IGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgLy8gRW1pdCBmaWx0ZXIgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50RmlsdGVyKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50RmlsdGVyLCBpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvcnQgaXRlbXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHNvcnQgdGhlIGl0ZW1zLiBUaGUgZmlyc3QgaXMgc2ltcGx5IGJ5XG4gICAqIHByb3ZpZGluZyBhIGZ1bmN0aW9uIGFzIHRoZSBjb21wYXJlciB3aGljaCB3b3JrcyBpZGVudGljYWxseSB0byBuYXRpdmVcbiAgICogYXJyYXkgc29ydC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSB5b3UgaGF2ZSBwcm92aWRlZFxuICAgKiBpbiB0aGUgaW5zdGFuY2UncyBvcHRpb25zLiBKdXN0IHByb3ZpZGUgdGhlIHNvcnQgZGF0YSBrZXkocykgYXMgYSBzdHJpbmdcbiAgICogKHNlcGFyYXRlZCBieSBzcGFjZSkgYW5kIHRoZSBpdGVtcyB3aWxsIGJlIHNvcnRlZCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAgICogc29ydCBkYXRhIGtleXMuIExhc3RseSB5b3UgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBhIHByZXNvcnRlZFxuICAgKiBhcnJheSBvZiBpdGVtcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc3luYyB0aGUgaW50ZXJuYWwgaXRlbXMgYXJyYXkgaW4gdGhlXG4gICAqIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufEl0ZW1bXXxTdHJpbmd8U3RyaW5nW10pfSBjb21wYXJlclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVzY2VuZGluZz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zb3J0ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3J0Q29tcGFyZXI7XG4gICAgdmFyIGlzRGVzY2VuZGluZztcbiAgICB2YXIgb3JpZ0l0ZW1zO1xuICAgIHZhciBpbmRleE1hcDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlQ3JpdGVyaWEoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwuc3BsaXQoJzonKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXhNYXAoaXRlbXMpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0W2l0ZW1zW2ldLl9pZF0gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wYXJlSW5kaWNlcyhpdGVtQSwgaXRlbUIpIHtcbiAgICAgIHZhciBpbmRleEEgPSBpbmRleE1hcFtpdGVtQS5faWRdO1xuICAgICAgdmFyIGluZGV4QiA9IGluZGV4TWFwW2l0ZW1CLl9pZF07XG4gICAgICByZXR1cm4gaXNEZXNjZW5kaW5nID8gaW5kZXhCIC0gaW5kZXhBIDogaW5kZXhBIC0gaW5kZXhCO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlcihhLCBiKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgIHZhciBjcml0ZXJpYU5hbWU7XG4gICAgICB2YXIgY3JpdGVyaWFPcmRlcjtcbiAgICAgIHZhciB2YWxBO1xuICAgICAgdmFyIHZhbEI7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzb3J0IGNyaXRlcmlhLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0Q29tcGFyZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBjcml0ZXJpYSBuYW1lLCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gaXRlbSdzIHNvcnQgZGF0YSBrZXkuXG4gICAgICAgIGNyaXRlcmlhTmFtZSA9IHNvcnRDb21wYXJlcltpXVswXTtcbiAgICAgICAgY3JpdGVyaWFPcmRlciA9IHNvcnRDb21wYXJlcltpXVsxXTtcblxuICAgICAgICAvLyBHZXQgaXRlbXMnIGNhY2hlZCBzb3J0IHZhbHVlcyBmb3IgdGhlIGNyaXRlcmlhLiBJZiB0aGUgaXRlbSBoYXMgbm8gc29ydFxuICAgICAgICAvLyBkYXRhIGxldCdzIHVwZGF0ZSB0aGUgaXRlbXMgc29ydCBkYXRhICh0aGlzIGlzIGEgbGF6eSBsb2FkIG1lY2hhbmlzbSkuXG4gICAgICAgIHZhbEEgPSAoYS5fc29ydERhdGEgPyBhIDogYS5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuICAgICAgICB2YWxCID0gKGIuX3NvcnREYXRhID8gYiA6IGIuX3JlZnJlc2hTb3J0RGF0YSgpKS5fc29ydERhdGFbY3JpdGVyaWFOYW1lXTtcblxuICAgICAgICAvLyBTb3J0IHRoZSBpdGVtcyBpbiBkZXNjZW5kaW5nIG9yZGVyIGlmIGRlZmluZWQgc28gZXhwbGljaXRseS4gT3RoZXJ3aXNlXG4gICAgICAgIC8vIHNvcnQgaXRlbXMgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICBpZiAoY3JpdGVyaWFPcmRlciA9PT0gJ2Rlc2MnIHx8ICghY3JpdGVyaWFPcmRlciAmJiBpc0Rlc2NlbmRpbmcpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQiA8IHZhbEEgPyAtMSA6IHZhbEIgPiB2YWxBID8gMSA6IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsQSA8IHZhbEIgPyAtMSA6IHZhbEEgPiB2YWxCID8gMSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIC0xIG9yIDEgYXMgdGhlIHJldHVybiB2YWx1ZSwgbGV0J3MgcmV0dXJuIGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB2YWx1ZXMgYXJlIGVxdWFsIGxldCdzIGNvbXBhcmUgdGhlIGl0ZW0gaW5kaWNlcyB0byBtYWtlIHN1cmUgd2VcbiAgICAgIC8vIGhhdmUgYSBzdGFibGUgc29ydC5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGlmICghaW5kZXhNYXApIGluZGV4TWFwID0gZ2V0SW5kZXhNYXAob3JpZ0l0ZW1zKTtcbiAgICAgICAgcmVzdWx0ID0gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1c3RvbUNvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBzb3J0Q29tcGFyZXIoYSwgYik7XG4gICAgICAvLyBJZiBkZXNjZW5kaW5nIGxldCdzIGludmVydCB0aGUgcmVzdWx0IHZhbHVlLlxuICAgICAgaWYgKGlzRGVzY2VuZGluZyAmJiByZXN1bHQpIHJlc3VsdCA9IC1yZXN1bHQ7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVzdWx0IChub3QgemVybykgbGV0J3MgcmV0dXJuIGl0IHJpZ2h0IGF3YXkuXG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgLy8gSWYgcmVzdWx0IGlzIHplcm8gbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGFcbiAgICAgIC8vIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgcmV0dXJuIGNvbXBhcmVJbmRpY2VzKGEsIGIpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihjb21wYXJlciwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIC8vIFNldHVwIHBhcmVudCBzY29wZSBkYXRhLlxuICAgICAgc29ydENvbXBhcmVyID0gY29tcGFyZXI7XG4gICAgICBpc0Rlc2NlbmRpbmcgPSAhIW9wdHMuZGVzY2VuZGluZztcbiAgICAgIG9yaWdJdGVtcyA9IGl0ZW1zLnNsaWNlKDApO1xuICAgICAgaW5kZXhNYXAgPSBudWxsO1xuXG4gICAgICAvLyBJZiBmdW5jdGlvbiBpcyBwcm92aWRlZCBkbyBhIG5hdGl2ZSBhcnJheSBzb3J0LlxuICAgICAgaWYgKGlzRnVuY3Rpb24oc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpdGVtcy5zb3J0KGN1c3RvbUNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYSBzdHJpbmcsIGxldCdzIHNvcnQgYnkgdGhlIHNvcnQgZGF0YSBhcyBwcm92aWRlZCBpblxuICAgICAgLy8gdGhlIGluc3RhbmNlJ3Mgb3B0aW9ucy5cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3J0Q29tcGFyZXIgPT09IHN0cmluZ1R5cGUpIHtcbiAgICAgICAgc29ydENvbXBhcmVyID0gcGFyc2VDcml0ZXJpYShjb21wYXJlcik7XG4gICAgICAgIGl0ZW1zLnNvcnQoZGVmYXVsdENvbXBhcmVyKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSBnb3QgYW4gYXJyYXksIGxldCdzIGFzc3VtZSBpdCdzIGEgcHJlc29ydGVkIGFycmF5IG9mIHRoZVxuICAgICAgLy8gaXRlbXMgYW5kIG9yZGVyIHRoZSBpdGVtcyBiYXNlZCBvbiBpdC5cbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc29ydENvbXBhcmVyKSkge1xuICAgICAgICBpZiAoc29ydENvbXBhcmVyLmxlbmd0aCAhPT0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHNvcnRDb21wYXJlci5pbmRleE9mKGl0ZW1zW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWycgKyBuYW1lc3BhY2UgKyAnXSBzb3J0IHJlZmVyZW5jZSBpdGVtcyBkbyBub3QgbWF0Y2ggd2l0aCBncmlkIGl0ZW1zLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpdGVtc1tpXSA9IHNvcnRDb21wYXJlcltpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZXNjZW5kaW5nKSBpdGVtcy5yZXZlcnNlKCk7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UgbGV0J3MganVzdCBza2lwIGl0LCBub3RoaW5nIHdlIGNhbiBkbyBoZXJlLlxuICAgICAgZWxzZSB7XG4gICAgICAgIC8qKiBAdG9kbyBNYXliZSB0aHJvdyBhbiBlcnJvciBoZXJlPyAqL1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBzb3J0IGV2ZW50LlxuICAgICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudFNvcnQpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRTb3J0LCBpdGVtcy5zbGljZSgwKSwgb3JpZ0l0ZW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbGF5b3V0IGlzIG5lZWRlZC5cbiAgICAgIGlmIChsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBNb3ZlIGl0ZW0gdG8gYW5vdGhlciBpbmRleCBvciBpbiBwbGFjZSBvZiBhbm90aGVyIGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogICAtIEFjY2VwdHMgZWl0aGVyIFwibW92ZVwiIG9yIFwic3dhcFwiLlxuICAgKiAgIC0gXCJtb3ZlXCIgbW92ZXMgdGhlIGl0ZW0gaW4gcGxhY2Ugb2YgdGhlIG90aGVyIGl0ZW0uXG4gICAqICAgLSBcInN3YXBcIiBzd2FwcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW1zLlxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbihpdGVtLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pdGVtcy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNTd2FwID0gb3B0cy5hY3Rpb24gPT09IGFjdGlvblN3YXA7XG4gICAgdmFyIGFjdGlvbiA9IGlzU3dhcCA/IGFjdGlvblN3YXAgOiBhY3Rpb25Nb3ZlO1xuICAgIHZhciBmcm9tSXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgdmFyIHRvSXRlbSA9IHRoaXMuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgIHZhciBmcm9tSW5kZXg7XG4gICAgdmFyIHRvSW5kZXg7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW1zIGV4aXN0IGFuZCBhcmUgbm90IHRoZSBzYW1lLlxuICAgIGlmIChmcm9tSXRlbSAmJiB0b0l0ZW0gJiYgZnJvbUl0ZW0gIT09IHRvSXRlbSkge1xuICAgICAgLy8gR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBpdGVtcy5cbiAgICAgIGZyb21JbmRleCA9IGl0ZW1zLmluZGV4T2YoZnJvbUl0ZW0pO1xuICAgICAgdG9JbmRleCA9IGl0ZW1zLmluZGV4T2YodG9JdGVtKTtcblxuICAgICAgLy8gRG8gdGhlIG1vdmUvc3dhcC5cbiAgICAgIGlmIChpc1N3YXApIHtcbiAgICAgICAgYXJyYXlTd2FwKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlNb3ZlKGl0ZW1zLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IG1vdmUgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50TW92ZSkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudE1vdmUsIHtcbiAgICAgICAgICBpdGVtOiBmcm9tSXRlbSxcbiAgICAgICAgICBmcm9tSW5kZXg6IGZyb21JbmRleCxcbiAgICAgICAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgaXRlbSB0byBhbm90aGVyIEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gaXRlbVxuICAgKiBAcGFyYW0ge0dyaWR9IGdyaWRcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBwb3NpdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmFwcGVuZFRvPWRvY3VtZW50LmJvZHldXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0U2VuZGVyPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0UmVjZWl2ZXI9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oaXRlbSwgZ3JpZCwgcG9zaXRpb24sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgZ3JpZC5faXNEZXN0cm95ZWQgfHwgdGhpcyA9PT0gZ3JpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHRhcmdldCBpdGVtLlxuICAgIGl0ZW0gPSB0aGlzLl9nZXRJdGVtKGl0ZW0pO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgY29udGFpbmVyID0gb3B0cy5hcHBlbmRUbyB8fCB3aW5kb3cuZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgbGF5b3V0U2VuZGVyID0gb3B0cy5sYXlvdXRTZW5kZXIgPyBvcHRzLmxheW91dFNlbmRlciA6IG9wdHMubGF5b3V0U2VuZGVyID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGxheW91dFJlY2VpdmVyID0gb3B0cy5sYXlvdXRSZWNlaXZlclxuICAgICAgPyBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA6IG9wdHMubGF5b3V0UmVjZWl2ZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIFN0YXJ0IHRoZSBtaWdyYXRpb24gcHJvY2Vzcy5cbiAgICBpdGVtLl9taWdyYXRlLnN0YXJ0KGdyaWQsIHBvc2l0aW9uLCBjb250YWluZXIpO1xuXG4gICAgLy8gSWYgbWlncmF0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGl0ZW0gaXMgYWN0aXZlLCBsZXQncyBsYXlvdXRcbiAgICAvLyB0aGUgZ3JpZHMuXG4gICAgaWYgKGl0ZW0uX21pZ3JhdGUuX2lzQWN0aXZlICYmIGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICBpZiAobGF5b3V0U2VuZGVyKSB7XG4gICAgICAgIHRoaXMubGF5b3V0KFxuICAgICAgICAgIGxheW91dFNlbmRlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFNlbmRlcikgPyBsYXlvdXRTZW5kZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXlvdXRSZWNlaXZlcikge1xuICAgICAgICBncmlkLmxheW91dChcbiAgICAgICAgICBsYXlvdXRSZWNlaXZlciA9PT0gaW5zdGFudExheW91dCxcbiAgICAgICAgICBpc0Z1bmN0aW9uKGxheW91dFJlY2VpdmVyKSA/IGxheW91dFJlY2VpdmVyIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudHMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXMuc2xpY2UoMCk7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBVbmJpbmQgd2luZG93IHJlc2l6ZSBldmVudCBsaXN0ZW5lci5cbiAgICBpZiAodGhpcy5fcmVzaXplSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS5fZGVzdHJveShyZW1vdmVFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBjb250YWluZXIuXG4gICAgcmVtb3ZlQ2xhc3MoY29udGFpbmVyLCB0aGlzLl9zZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG4gICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuXG4gICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50IGFuZCB1bmJpbmQgYWxsIGV2ZW50cy5cbiAgICB0aGlzLl9lbWl0KGV2ZW50RGVzdHJveSk7XG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgcmVmZXJlbmNlIGZyb20gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgZ3JpZEluc3RhbmNlc1t0aGlzLl9pZF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBGbGFnIGluc3RhbmNlIGFzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgaW5zdGFuY2UncyBpdGVtIGJ5IGVsZW1lbnQgb3IgYnkgaW5kZXguIFRhcmdldCBjYW4gYWxzbyBiZSBhbiBJdGVtXG4gICAqIGluc3RhbmNlIGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGl0ZW0gaWYgaXQgZXhpc3RzIHdpdGhpblxuICAgKiByZWxhdGVkIEdyaWQgaW5zdGFuY2UuIElmIG5vdGhpbmcgaXMgZm91bmQgd2l0aCB0aGUgcHJvdmlkZWQgdGFyZ2V0LCBudWxsXG4gICAqIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBbdGFyZ2V0XVxuICAgKiBAcmV0dXJucyB7P0l0ZW19XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZ2V0SXRlbSA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIC8vIElmIG5vIHRhcmdldCBpcyBzcGVjaWZpZWQgb3IgdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgcmV0dXJuIG51bGwuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0ICYmIHRhcmdldCAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRhcmdldCBpcyBudW1iZXIgcmV0dXJuIHRoZSBpdGVtIGluIHRoYXQgaW5kZXguIElmIHRoZSBudW1iZXIgaXMgbG93ZXJcbiAgICAvLyB0aGFuIHplcm8gbG9vayBmb3IgdGhlIGl0ZW0gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBpdGVtcyBhcnJheS4gRm9yXG4gICAgLy8gZXhhbXBsZSAtMSBmb3IgdGhlIGxhc3QgaXRlbSwgLTIgZm9yIHRoZSBzZWNvbmQgbGFzdCBpdGVtLCBldGMuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IG51bWJlclR5cGUkMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW3RhcmdldCA+IC0xID8gdGFyZ2V0IDogdGhpcy5faXRlbXMubGVuZ3RoICsgdGFyZ2V0XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5zdGFuY2Ugb2YgSXRlbSByZXR1cm4gaXQgaWYgaXQgaXMgYXR0YWNoZWQgdG8gdGhpc1xuICAgIC8vIEdyaWQgaW5zdGFuY2UsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSXRlbSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5fZ3JpZElkID09PSB0aGlzLl9pZCA/IHRhcmdldCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSW4gb3RoZXIgY2FzZXMgbGV0J3MgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBlbGVtZW50LCBzbyBsZXQncyB0cnlcbiAgICAvLyB0byBmaW5kIGFuIGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBlbGVtZW50IGFuZCByZXR1cm4gaXQuIElmIGl0ZW0gaXMgbm90XG4gICAgLy8gZm91bmQgcmV0dXJuIG51bGwuXG4gICAgLyoqIEB0b2RvIFRoaXMgY291bGQgYmUgbWFkZSBhIGxvdCBmYXN0ZXIgYnkgdXNpbmcgTWFwL1dlYWtNYXAgb2YgZWxlbWVudHMuICovXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9lbGVtZW50ID09PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgaW5zdGFuY2UncyBsYXlvdXQgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtMYXlvdXREYXRhfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3MubGF5b3V0O1xuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgaGVpZ2h0O1xuICAgIHZhciBuZXdMYXlvdXQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBMZXQncyBpbmNyZW1lbnQgbGF5b3V0IGlkLlxuICAgICsrbGF5b3V0LmlkO1xuXG4gICAgLy8gTGV0J3MgdXBkYXRlIGxheW91dCBpdGVtc1xuICAgIGxheW91dC5pdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLl9pc0FjdGl2ZSkgbGF5b3V0Lml0ZW1zLnB1c2godGhpcy5faXRlbXNbaV0pO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgIHRoaXMuX3JlZnJlc2hEaW1lbnNpb25zKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY29udGFpbmVyIHdpZHRoIGFuZCBoZWlnaHQgKHdpdGhvdXQgYm9yZGVycykuXG4gICAgd2lkdGggPSB0aGlzLl93aWR0aCAtIHRoaXMuX2JvcmRlckxlZnQgLSB0aGlzLl9ib3JkZXJSaWdodDtcbiAgICBoZWlnaHQgPSB0aGlzLl9oZWlnaHQgLSB0aGlzLl9ib3JkZXJUb3AgLSB0aGlzLl9ib3JkZXJCb3R0b207XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IGxheW91dC5cbiAgICBpZiAoaXNGdW5jdGlvbihzZXR0aW5ncykpIHtcbiAgICAgIG5ld0xheW91dCA9IHNldHRpbmdzKGxheW91dC5pdGVtcywgd2lkdGgsIGhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheW91dCA9IHBhY2tlci5nZXRMYXlvdXQobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQuc2xvdHMsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgdGhlIGdyaWQncyBsYXlvdXQuXG4gICAgbGF5b3V0LnNsb3RzID0gbmV3TGF5b3V0LnNsb3RzO1xuICAgIGxheW91dC5zZXRXaWR0aCA9IEJvb2xlYW4obmV3TGF5b3V0LnNldFdpZHRoKTtcbiAgICBsYXlvdXQuc2V0SGVpZ2h0ID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0SGVpZ2h0KTtcbiAgICBsYXlvdXQud2lkdGggPSBuZXdMYXlvdXQud2lkdGg7XG4gICAgbGF5b3V0LmhlaWdodCA9IG5ld0xheW91dC5oZWlnaHQ7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGEgZ3JpZCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0gey4uLip9IFthcmddXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdC5hcHBseSh0aGlzLl9lbWl0dGVyLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGV2ZW50cyBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX2hhc0xpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2VtaXR0ZXIuX2V2ZW50c1tldmVudF07XG4gICAgcmV0dXJuICEhKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnMubGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIHdpZHRoLCBoZWlnaHQgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5fd2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIHRoaXMuX2xlZnQgPSByZWN0LmxlZnQ7XG4gICAgdGhpcy5fdG9wID0gcmVjdC50b3A7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb250YWluZXIncyBib3JkZXIgc2l6ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxlZnRcbiAgICogQHBhcmFtIHtCb29sZWFufSByaWdodFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvcFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvdHRvbVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3VwZGF0ZUJvcmRlcnMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgaWYgKGxlZnQpIHRoaXMuX2JvcmRlckxlZnQgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7XG4gICAgaWYgKHJpZ2h0KSB0aGlzLl9ib3JkZXJSaWdodCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLXJpZ2h0LXdpZHRoJyk7XG4gICAgaWYgKHRvcCkgdGhpcy5fYm9yZGVyVG9wID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG4gICAgaWYgKGJvdHRvbSkgdGhpcy5fYm9yZGVyQm90dG9tID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggYWxsIG9mIGNvbnRhaW5lcidzIGludGVybmFsIGRpbWVuc2lvbnMgYW5kIG9mZnNldHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdXBkYXRlQm91bmRpbmdSZWN0KCk7XG4gICAgdGhpcy5fdXBkYXRlQm9yZGVycygxLCAxLCAxLCAxKTtcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBvciBoaWRlIEdyaWQgaW5zdGFuY2UncyBpdGVtcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBpdGVtc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvVmlzaWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHsoU2hvd0NhbGxiYWNrfEhpZGVDYWxsYmFjayl9IFtvcHRpb25zLm9uRmluaXNoXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuX3NldEl0ZW1zVmlzaWJpbGl0eSA9IGZ1bmN0aW9uKGl0ZW1zLCB0b1Zpc2libGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZ3JpZCA9IHRoaXM7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGlzSW5zdGFudCA9IG9wdHMuaW5zdGFudCA9PT0gdHJ1ZTtcbiAgICB2YXIgY2FsbGJhY2sgPSBvcHRzLm9uRmluaXNoO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY291bnRlciA9IHRhcmdldEl0ZW1zLmxlbmd0aDtcbiAgICB2YXIgc3RhcnRFdmVudCA9IHRvVmlzaWJsZSA/IGV2ZW50U2hvd1N0YXJ0IDogZXZlbnRIaWRlU3RhcnQ7XG4gICAgdmFyIGVuZEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93RW5kIDogZXZlbnRIaWRlRW5kO1xuICAgIHZhciBtZXRob2QgPSB0b1Zpc2libGUgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgdmFyIG5lZWRzTGF5b3V0ID0gZmFsc2U7XG4gICAgdmFyIGNvbXBsZXRlZEl0ZW1zID0gW107XG4gICAgdmFyIGhpZGRlbkl0ZW1zID0gW107XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgY2FsbCB0aGUgY2FsbGJhY2ssIGJ1dCBkb24ndCBlbWl0IGFueSBldmVudHMuXG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIGNhbGxiYWNrKHRhcmdldEl0ZW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHNob3dTdGFydC9oaWRlU3RhcnQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhzdGFydEV2ZW50KSkge1xuICAgICAgdGhpcy5fZW1pdChzdGFydEV2ZW50LCB0YXJnZXRJdGVtcy5zbGljZSgwKSk7XG4gICAgfVxuXG4gICAgLy8gU2hvdy9oaWRlIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRhcmdldEl0ZW1zW2ldO1xuXG4gICAgICAvLyBJZiBpbmFjdGl2ZSBpdGVtIGlzIHNob3duIG9yIGFjdGl2ZSBpdGVtIGlzIGhpZGRlbiB3ZSBuZWVkIHRvIGRvXG4gICAgICAvLyBsYXlvdXQuXG4gICAgICBpZiAoKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHx8ICghdG9WaXNpYmxlICYmIGl0ZW0uX2lzQWN0aXZlKSkge1xuICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gd2UgYWxzbyBuZWVkIHRvIGRvIGEgbGl0dGxlIGhhY2sgdG8gbWFrZSB0aGVcbiAgICAgIC8vIGl0ZW0gbm90IGFuaW1hdGUgaXQncyBuZXh0IHBvc2l0aW9uaW5nIChsYXlvdXQpLlxuICAgICAgaWYgKHRvVmlzaWJsZSAmJiAhaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgaGlkZGVuIGl0ZW0gaXMgYmVpbmcgc2hvd24gd2UgbmVlZCB0byByZWZyZXNoIHRoZSBpdGVtJ3NcbiAgICAgIC8vIGRpbWVuc2lvbnMuXG4gICAgICBpZiAodG9WaXNpYmxlICYmIGl0ZW0uX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSB7XG4gICAgICAgIGhpZGRlbkl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cvaGlkZSB0aGUgaXRlbS5cbiAgICAgIGl0ZW0uX3Zpc2liaWxpdHlbbWV0aG9kXShpc0luc3RhbnQsIGZ1bmN0aW9uKGludGVycnVwdGVkLCBpdGVtKSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGl0ZW0ncyBhbmltYXRpb24gd2FzIG5vdCBpbnRlcnJ1cHRlZCBhZGQgaXQgdG8gdGhlXG4gICAgICAgIC8vIGNvbXBsZXRlZEl0ZW1zIGFycmF5LlxuICAgICAgICBpZiAoIWludGVycnVwdGVkKSBjb21wbGV0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuXG4gICAgICAgIC8vIElmIGFsbCBpdGVtcyBoYXZlIGZpbmlzaGVkIHRoZWlyIGFuaW1hdGlvbnMgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICAgICAgLy8gYW5kIGVtaXQgc2hvd0VuZC9oaWRlRW5kIGV2ZW50LlxuICAgICAgICBpZiAoLS1jb3VudGVyIDwgMSkge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2soY29tcGxldGVkSXRlbXMuc2xpY2UoMCkpO1xuICAgICAgICAgIGlmIChncmlkLl9oYXNMaXN0ZW5lcnMoZW5kRXZlbnQpKSBncmlkLl9lbWl0KGVuZEV2ZW50LCBjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggaGlkZGVuIGl0ZW1zLlxuICAgIGlmIChoaWRkZW5JdGVtcy5sZW5ndGgpIHRoaXMucmVmcmVzaEl0ZW1zKGhpZGRlbkl0ZW1zKTtcblxuICAgIC8vIExheW91dCBpZiBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogTWVyZ2UgZGVmYXVsdCBzZXR0aW5ncyB3aXRoIHVzZXIgc2V0dGluZ3MuIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYSBuZXdcbiAgICogb2JqZWN0IHdpdGggbWVyZ2VkIHZhbHVlcy4gVGhlIG1lcmdpbmcgaXMgYSBkZWVwIG1lcmdlIG1lYW5pbmcgdGhhdCBhbGxcbiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgc2V0dGluZ3Mgb2JqZWN0cyB3aWxsIGJlIGFsc28gbWVyZ2VkXG4gICAqIHNvIHRoYXQgbW9kaWZ5aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHNldHRpbmdzIG9iamVjdCB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uXG4gICAqIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0U2V0dGluZ3NcbiAgICogQHBhcmFtIHtPYmplY3R9IFt1c2VyU2V0dGluZ3NdXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VTZXR0aW5ncyhkZWZhdWx0U2V0dGluZ3MsIHVzZXJTZXR0aW5ncykge1xuICAgIC8vIENyZWF0ZSBhIGZyZXNoIGNvcHkgb2YgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICB2YXIgcmV0ID0gbWVyZ2VPYmplY3RzKHt9LCBkZWZhdWx0U2V0dGluZ3MpO1xuXG4gICAgLy8gTWVyZ2UgdXNlciBzZXR0aW5ncyB0byBkZWZhdWx0IHNldHRpbmdzLlxuICAgIGlmICh1c2VyU2V0dGluZ3MpIHtcbiAgICAgIHJldCA9IG1lcmdlT2JqZWN0cyhyZXQsIHVzZXJTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHZpc2libGUvaGlkZGVuIHN0eWxlcyBtYW51YWxseSBzbyB0aGF0IHRoZSB3aG9sZSBvYmplY3QgaXNcbiAgICAvLyBvdmVycmlkZGVuIGluc3RlYWQgb2YgdGhlIHByb3BzLlxuICAgIHJldC52aXNpYmxlU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzIHx8IChkZWZhdWx0U2V0dGluZ3MgfHwgMCkudmlzaWJsZVN0eWxlcztcbiAgICByZXQuaGlkZGVuU3R5bGVzID0gKHVzZXJTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS5oaWRkZW5TdHlsZXM7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHR3byBvYmplY3RzIHJlY3Vyc2l2ZWx5IChkZWVwIG1lcmdlKS4gVGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAqIGFyZSBtZXJnZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogICAtIFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlXG4gICAqICAgLSBUaGUgc291cmNlIG9iamVjdC5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7XG4gICAgdmFyIGlzU291cmNlT2JqZWN0O1xuICAgIHZhciBwcm9wTmFtZTtcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcHJvcE5hbWUgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgaXNTb3VyY2VPYmplY3QgPSBpc1BsYWluT2JqZWN0KHNvdXJjZVtwcm9wTmFtZV0pO1xuXG4gICAgICAvLyBJZiB0YXJnZXQgYW5kIHNvdXJjZSB2YWx1ZXMgYXJlIGJvdGggb2JqZWN0cywgbWVyZ2UgdGhlIG9iamVjdHMgYW5kXG4gICAgICAvLyBhc3NpZ24gdGhlIG1lcmdlZCB2YWx1ZSB0byB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodGFyZ2V0W3Byb3BOYW1lXSkgJiYgaXNTb3VyY2VPYmplY3QpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IG1lcmdlT2JqZWN0cyhtZXJnZU9iamVjdHMoe30sIHRhcmdldFtwcm9wTmFtZV0pLCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIG9iamVjdCBhbmQgdGFyZ2V0J3MgaXMgbm90IGxldCdzIGNsb25lIHRoZSBvYmplY3QgYXNcbiAgICAgIC8vIHRoZSB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIGlmIChpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKHt9LCBzb3VyY2VbcHJvcE5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNvdXJjZSdzIHZhbHVlIGlzIGFuIGFycmF5IGxldCdzIGNsb25lIHRoZSBhcnJheSBhcyB0aGUgdGFyZ2V0J3NcbiAgICAgIC8vIHZhbHVlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV0uc2xpY2UoMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBhbGwgb3RoZXIgY2FzZXMgbGV0J3MganVzdCBkaXJlY3RseSBhc3NpZ24gdGhlIHNvdXJjZSdzIHZhbHVlIGFzIHRoZVxuICAgICAgLy8gdGFyZ2V0J3MgdmFsdWUuXG4gICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIEdyaWQ7XG5cbn0pKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBJdGVtVmFsdWUgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuICBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlXG4gIGltcGxlbWVudHMgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIHtcblxuICBwcml2YXRlIHZpc3VhbGl6ZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy52aXN1YWxpemVyU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplclNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBcInNlbGVjdFwiXG4gICAgICApWzBdLnZhbHVlID0gdGhpcy52aXN1YWxpemVyLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+LFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3RcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpO1xuICAgIGlmICghdmlzdWFsaXplcnMgfHwgdmlzdWFsaXplcnMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlZpc3VhbGl6ZXJBcnJheVdyYXBwZXIgd29ya3Mgd2l0aCB2aXN1YWxpemVycyBjb2xsZWN0aW9uIG9ubHkuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIGlmICh2aXN1YWxpemVyLnN1cHBvcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3VwcG9ydFNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMudmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uLnB1c2goXG4gICAgICAgICAgPElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbj4oPGFueT52aXN1YWxpemVyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlVmlzdWFsaXplclwiLCAoKSA9PlxuICAgICAgdGhpcy52aXN1YWxpemVyU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgdGhpcy52aXN1YWxpemVycy5tYXAoKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZpc3VhbGl6ZXIudHlwZSxcbiAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ2aXN1YWxpemVyX1wiICsgdmlzdWFsaXplci50eXBlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLnZpc3VhbGl6ZXIudHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAoZTogYW55KSA9PiB0aGlzLnNldFZpc3VhbGl6ZXIoZS50YXJnZXQudmFsdWUpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMudmlzdWFsaXplciA9IHZpc3VhbGl6ZXJzWzBdO1xuICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZpc3VhbGl6ZXJDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsaXplcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzdWFsaXplcnM7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbjogQXJyYXk8SVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uPiA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkSXRlbTogSXRlbVZhbHVlO1xuICBwcml2YXRlIHZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlO1xuXG4gIHByaXZhdGUgb25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciBjb250ZW50IHR5cGUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICoqL1xuICBwdWJsaWMgb25WaXN1YWxpemVyQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSwgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIGFueT4oKTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2VsZWN0cyB2aXN1YWxpemVyIHRvIHNob3cgYnkgaXQgbmFtZS5cbiAgKlxuICAqIHBhcmFtZXRlcnM6XG4gICogbmFtZSAtIHRoZSBuYW1lIG9mIHZpc3VhbGl6ZXIgdG8gc2hvdyxcbiAgKiBxdWlldCAtIHNldCBpdCB0byB0cnVlIGlmIHlvdSBkb24ndCB3YW50IHRvIHJpc2UgYSBub3RpZmljYXRpb24gZXZlbnRcbiAgKlxuICAqKi9cbiAgcHVibGljIHNldFZpc3VhbGl6ZXIodHlwZTogc3RyaW5nLCBxdWlldCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdmlzdWFsaXplckNhbmRpZGF0ZSA9IHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnR5cGUgPT09IHR5cGUpWzBdO1xuICAgIGlmICghIXZpc3VhbGl6ZXJDYW5kaWRhdGUgJiYgdmlzdWFsaXplckNhbmRpZGF0ZSAhPT0gdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICBpZiAoISF0aGlzLnZpc3VhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKFxuICAgICAgICAgIHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFja1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplckNhbmRpZGF0ZTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgIHRoaXMub25WaXN1YWxpemVyQ2hhbmdlZC5maXJlKHRoaXMsIHsgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVWaXN1YWxpemVyU2VsZWN0b3IoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldCBvbkRhdGFJdGVtU2VsZWN0ZWQoXG4gICAgdmFsOiAoc2VsZWN0ZWRWYWx1ZTogYW55LCBzZWxlY3RlZFRleHQ6IHN0cmluZykgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLm9uRGF0YUl0ZW1TZWxlY3RlZCA9IHZhbDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuICg8YW55PnRoaXMudmlzdWFsaXplcikuc2VsZWN0aW9uIHx8IHRoaXMuc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMudmlzdWFsaXplckNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnZpc3VhbGl6ZXIucmVuZGVyKHRoaXMudmlzdWFsaXplckNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcik7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHZpc3VhbGl6ZXIgPT4gdmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjdXJyZW50IHZpc3VhbGl6ZXIgc3RhdGUuIFRoZSBwcm9wZXJ0aWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aXN1YWxpemVyLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgc2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIGNvbnN0IGN1cnJlbnRWaXN1YWxpemVyU3RhdGUgPSB0aGlzLnZpc3VhbGl6ZXIuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBzdGF0ZTogYW55ID0ge1xuICAgICAgdmlzdWFsaXplcjogdGhpcy52aXN1YWxpemVyLnR5cGUsXG4gICAgfTtcbiAgICBpZihPYmplY3Qua2V5cyhjdXJyZW50VmlzdWFsaXplclN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IGN1cnJlbnRWaXN1YWxpemVyU3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzdWFsaXplcidzIHN0YXRlLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgZ2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgaWYoISFzdGF0ZS52aXN1YWxpemVyKSB7XG4gICAgICB0aGlzLnNldFZpc3VhbGl6ZXIoc3RhdGUudmlzdWFsaXplciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmKCEhc3RhdGUuc3RhdGUpIHtcbiAgICAgIHRoaXMudmlzdWFsaXplci5zZXRTdGF0ZShzdGF0ZS5zdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3IoXG4gIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyXG4pO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBhcmFiaWNTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLYstix2KfYsSDYp9mE2YXYrNmF2YjYudipXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2KrZhSDYp9mE2KrYrdiv2YrYqyDZhdmGINiu2YTYp9mE2YlcIixcbiAgc2VsZWN0QnV0dG9uOiBcItin2K7YqtixXCIsXG4gIGhpZGVDb2x1bW46IFwi2KfYrtmB2KfYoSDYp9mE2LnZhdmI2K9cIixcbiAgc2hvd0NvbHVtbjogXCLYp9i42YfYp9ixXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcItij2KzYudmEINin2YTYudmF2YjYryDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCLYo9is2LnZhCDYp9mE2LnZhdmI2K8g2LnYp9mFXCIsXG4gIG1vdmVUb0RldGFpbDogXCLYp9mG2KrZgtmEINil2YTZiSDYp9mE2KrZgdin2LXZitmEXCIsXG4gIHNob3dBc0NvbHVtbjogXCLYpdi42YfYp9ixINmD2LnZhdmI2K9cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwi2KjYrdirLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwi2K3YsNmBXCIsXG4gIHNob3dMYWJlbDogXCLYp9i42YfYp9ixXCIsXG4gIGVudHJpZXNMYWJlbDogXCLZhdiv2K7ZhNin2KpcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcItis2K/Yp9mI2YRcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi2YPZhNmF2KfYqlwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCLYp9mE2LHYs9mFINin2YTYqNmK2KfZhtmKXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcItmF2KrZiNiz2LdcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcItis2K/ZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCLYsdiz2YUg2KjZitin2YbZilwiLFxuICBjaGFydFR5cGVfYmFyOiBcIti02LHZiti3XCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIti02LHZiti3INi52YXZiNiv2YpcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwi2LTYsdmK2Lcg2YXZg9iv2LNcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvdWdobnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlNjYXR0ZXJcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2KfYrtmB2KfYoVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCLYo9is2LnZhCDYrtin2LVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCLYo9is2LnZhCDYudin2YVcIixcbiAgc2hvd0J1dHRvbjogXCLYp9i42YfYp9ixXCIsXG4gIGZpbHRlcjogXCLYqtix2LTYrVwiLFxuICByZXNldEZpbHRlcjogXCLYpdi52KfYr9ipINiq2LnZitmK2YZcIixcbiAgY2hhbmdlTG9jYWxlOiBcItiq2LrZitmK2LEg2KfZhNmE2LrYqVwiLFxuICBlbjogXCLYp9mE2YTYutipINin2YTYp9mG2KzZhNmK2LLZitipXCIsXG4gIGZyOiBcItin2YTZhNi62Ycg2KfZhNmB2LHZhtiz2YrYqVwiLFxuICBydTogXCLYp9mE2YTYutmHINin2YTYsdmI2LPZitipXCIsXG4gIGRlOiBcItin2YTZhNi62Ycg2KfZhNin2YbYrNmE2YrYstmK2KlcIixcbiAgY2xlYXJCdXR0b246IFwi2YXYs9itXCIsXG4gIGFkZEVsZW1lbnQ6IFwi2KfYrtiq2LEg2LPYpNin2YTYp9mLINmE2YTYudix2LYgLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCLYp9mE2KrYsdiq2YrYqCDYp9mE2KfZgdiq2LHYp9i22YpcIixcbiAgYXNjT3JkZXI6IFwi2KrYtdin2LnYr9mJXCIsXG4gIGRlc2NPcmRlcjogXCLYqtmG2KfYstmE2YlcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCLYpdi42YfYp9ixINin2YTYo9i52YXYr9ipINin2YTYq9in2YbZiNmK2KlcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi2KjZhtmI2K8g2YjYqti52YTZitmC2KfYqiDYo9iu2LHZiVwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwi2LnYsdi2INin2YTZhtiz2Kgg2KfZhNmF2KbZiNmK2KlcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcItil2K7Zgdin2KEg2KfZhNmG2LPYqFwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcItiq2YbYstmK2YQg2KjYtdmK2LrYqSBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCLYpdiu2YHYp9ihINin2YTYpdis2KfYqNin2Kog2KfZhNmB2KfYsdi62KlcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCLYpdi42YfYp9ixINin2YTYpdis2KfYqNin2Kog2KfZhNmB2KfYsdi62KlcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcItil2K7Zgdin2KEg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCLYudix2LYg2KfZhNil2KzYp9io2KfYqiDYp9mE2YXZgdmC2YjYr9ipXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwi2KPYrNmI2KjYqSDZhdmB2YLZiNiv2KlcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi2YTZhSDZitiq2YUg2KfZhNi52LHYtiDYqNi52K9cIixcbiAgbm9SZXN1bHRzOiBcItmE2Kcg2YrZiNis2K8g2YbYqtin2KbYrCDZhNmE2LnYsdi2XCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwi2YTZg9mEINin2YTZgtmK2YVcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwi2YTZg9mEINin2YTYo9i52YXYr9ipXCIsXG4gIGFuc3dlcjogXCLYpdis2KhcIixcbiAgY29ycmVjdEFuc3dlcjogXCLYp9mE2KfYrNin2KjYqSDYp9mE2LXYrdmK2K3YqTogXCIsXG4gIHBlcmNlbnQ6IFwi2KfZhNmG2LPYqNmHINin2YTZhdim2YjZitmHXCIsXG4gIHJlc3BvbnNlczogXCLYp9mE2KfYs9iq2KzYp9io2KfYqlwiLFxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJhclwiXSA9IGFyYWJpY1N0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJhclwiXSA9IFwiQXJhYmljXCI7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvZXAgZG9vciBtaWpcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZWdyb2VwZXJlbiBiaWogbWlqXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3RlZXIgbWlqXCIsXG4gIGhpZGVDb2x1bW46IFwiS29sb20gdmVyYmVyZ2VuXCIsXG4gIHNob3dDb2x1bW46IFwiVG9vbiBrb2xvbVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJLb2xvbSBwcml2w6kgbWFrZW5cIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWFrIGRlIGtvbG9tIG9wZW5iYWFyXCIsXG4gIG1vdmVUb0RldGFpbDogXCJHYSBuYWFyIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiV2VlcmdldmVuIGFscyBrb2xvbVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJab2VrZW4uLi5cIixcbiAgcmVtb3ZlUm93czogXCJWZXJ3aWpkZXIgcmlqZW5cIixcbiAgc2hvd0xhYmVsOiBcIlRvbmVuXCIsXG4gIGVudHJpZXNMYWJlbDogXCJpbnplbmRpbmdlblwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGVrc3RlbiBpbiB0YWJlbFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWxkZSBCYXJcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVGFhcnRcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiVmVyc3Ryb29pZW5cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk1ldGVyXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiS29nZWxcIixcbiAgaGlkZUJ1dHRvbjogXCJWZXJiZXJnZW5cIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFhayBwcml2ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk9wZW5iYWFyIG1ha2VuXCIsXG4gIHNob3dCdXR0b246IFwiVG9uZW5cIixcbiAgcmVzZXRGaWx0ZXI6IFwiRmlsdGVyIHJlc2V0dGVuXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJXaWp6aWcgZGUgbGFuZGluc3RlbGxpbmdcIixcbiAgY2xlYXJCdXR0b246IFwiRG9vcnppY2h0aWdcIixcbiAgYWRkRWxlbWVudDogXCJLaWVzIGVlbiB2cmFhZyBvbSB3ZWVyIHRlIGdldmVuIC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiU3RhbmRhYXJkdm9sZ29yZGVcIixcbiAgYXNjT3JkZXI6IFwiT3Bsb3BlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFmbG9wZW5kXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiVG9vbiBrbGVpbmUga29sb21tZW5cIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5kZXJlIGl0ZW1zIGVuIG9wbWVya2luZ2VuXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJQZXJjZW50YWdlcyB3ZWVyZ2V2ZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlZlcmJlcmcgcGVyY2VudGFnZXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJEb3dubG9hZCBwbG90IGFscyBlZW4gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiVmVyYmVyZyBsZWdlIGFudHdvb3JkZW5cIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJUb29uIGxlZ2UgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbGUgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBhbnR3b29yZGVuXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIGFudHdvb3JkZW5cIixcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJubFwiXSA9IGR1dGNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5sXCJdID0gXCJEdXRjaFwiO1xuIiwiLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSBjcmVhdGUgYSBjdXN0b20gZGljdGlvbmFyeVxuLy8gaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBlbmdsaXNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJVbmdyb3VwIEJ5IE1lXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3QgTWVcIixcbiAgaGlkZUNvbHVtbjogXCJIaWRlIGNvbHVtblwiLFxuICBzaG93Q29sdW1uOiBcIlNob3cgY29sdW1uXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWtlIGNvbHVtbiBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmUgdG8gRGV0YWlsXCIsXG4gIHNob3dBc0NvbHVtbjogXCJTaG93IGFzIENvbHVtblwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIixcbiAgcmVtb3ZlUm93czogXCJSZW1vdmUgcm93c1wiLFxuICBzaG93TGFiZWw6IFwiU2hvd1wiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50cmllc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dHMgaW4gdGFibGVcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIkhpc3RvZ3JhbVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJBdmVyYWdlXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJsZVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiQ2hhcnRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiVmVydGljYWwgQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIlN0YWNrZWQgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcIkhpZGVcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiTWFrZSBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiTWFrZSBwdWJsaWNcIixcbiAgc2hvd0J1dHRvbjogXCJTaG93XCIsXG4gIGZpbHRlcjogXCJGaWx0ZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzZXQgRmlsdGVyXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDaGFuZ2UgTG9jYWxlXCIsXG4gIGVuOiBcIkVuZ2xpc2hcIixcbiAgZnI6IFwiRnJhbsOnYWlzXCIsXG4gIHJ1OiBcItCg0YPRgdGB0LrQuNC5XCIsXG4gIGRlOiBcIkRldXRzY2hcIixcbiAgY2xlYXJCdXR0b246IFwiQ2xlYXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9vc2UgcXVlc3Rpb24gdG8gc2hvdy4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXVsdCBPcmRlclwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRpbmdcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRpbmdcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJTaG93IG1pbm9yIGNvbHVtbnNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiT3RoZXIgaXRlbXMgYW5kIGNvbW1lbnRzXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJTaG93IHBlcmNlbnRhZ2VzXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJIaWRlIHBlcmNlbnRhZ2VzXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhcyBhIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkhpZGUgZW1wdHkgYW5zd2Vyc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIlNob3cgZW1wdHkgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIkFsbCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJUb3AgNSBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiVG9wIDEwIGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgYW5zd2Vyc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiSGlkZSBtaXNzaW5nIGFuc3dlcnNcIixcbiAgc2hvd01pc3NpbmdBbnN3ZXJzOiBcIlNob3cgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiTWlzc2luZyBhbnN3ZXJzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIlRoaXMgcXVlc3Rpb24gdHlwZSBpcyBub3QgdmlzdWFsaXplZCB5ZXRcIixcbiAgbm9SZXN1bHRzOiBcIlRoZXJlIGFyZSBubyByZXN1bHRzIHlldFwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciBWYWx1ZXNcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbHVtbnNcIixcbiAgYW5zd2VyOiBcIkFuc3dlclwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIkNvcnJlY3QgYW5zd2VyOiBcIixcbiAgcGVyY2VudDogXCJQZXJjZW50XCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb25zZXNcIlxufTtcblxuLy8gVW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBSZXBsYWNlIFwiZW5cIiB3aXRoIGEgY3VzdG9tIGxvY2FsZSBjb2RlIChmb3IgZXhhbXBsZSwgXCJmclwiIG9yIFwiZGVcIiksXG4vLyBSZXBsYWNlIGBlbmdsaXNoU3RyaW5nc2Agd2l0aCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgY3VzdG9tIGRpY3Rpb25hcnkuXG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vLyBsb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBmYXJzaVN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcItqv2LHZiNmHINio2YbYr9uMINio2KdcIixcbiAgdW5ncm91cEJ1dHRvbjogXCLYrdiw2YEg2q/YsdmI2YdcIixcbiAgc2VsZWN0QnV0dG9uOiBcItin2YbYqtiu2KfYqFwiLFxuICBoaWRlQ29sdW1uOiBcItmF2K7ZgduMINqp2LHYr9mGINiz2KrZiNmGXCIsXG4gIHNob3dDb2x1bW46IFwi2YbZhdin24zYtCDYs9iq2YjZhlwiLFxuICBtb3ZlVG9EZXRhaWw6IFwi2KfZhtiq2YLYp9mEINio2Ycg2KzYstim24zYp9iqXCIsXG4gIHNob3dBc0NvbHVtbjogXCLZhtmF2KfbjNi0INio2Ycg2LnZhtmI2KfZhiDYs9iq2YjZhlwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwi2YXYqtmI2YYg2K/YsSDYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCLYp9io2LEg2qnZhNmF2KfYqlwiLFxuICBjaGFydFR5cGVfYmFyOiBcItmF24zZhNmHINin24xcIixcbiAgY2hhcnRUeXBlX3BpZTogXCLYr9in2KjYsdmHINin24wocGllKVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCLZvtix2KfaqdmG2K/ar9uMKFNjYXR0ZXIpXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCLYudmC2LHYqNmHINin24xcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCLZhdiu2YHbjFwiLFxuICByZXNldEZpbHRlcjogXCLYqNin2LLZhti02KfZhtuMINmB24zZhNiq2LHZh9inXCIsXG4gIGNsZWFyQnV0dG9uOiBcItm+2KfaqSDaqdix2K/ZhlwiLFxuICBhZGRFbGVtZW50OiBcItin2YbYqtiu2KfYqCDYs9mI2KfZhCDYqNix2KfbjCDZhtmF2KfbjNi0Li4uXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBmYXJzaVN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmYVwiXSA9IFwiRmFyc2koUGVyc2lhbilcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZnJlbmNoU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXBlclwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRpc3NvY2llclwiLFxuICBzZWxlY3RCdXR0b246IFwiU8OpbGVjdGlvbm5lclwiLFxuICBoaWRlQ29sdW1uOiBcIk1hc3F1ZXIgY29sb25uZVwiLFxuICBzaG93Q29sdW1uOiBcIkFmZmljaGVyIGNvbG9ubmVcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiUmVuZHJlIGxhIGNvbG9ubmUgcHJpdsOpXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiUmVuZHJlIGxhIGNvbG9ubmUgcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJEw6lwbGFjZXIgdmVycyBkw6l0YWlsc1wiLFxuICBzaG93QXNDb2x1bW46IFwiQWZmaWNoZXIgZW4gY29sb25uZVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJSZWNoZXJjaGVyLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiU3VwcHJpbWVyIGNvbG9ubmVcIixcbiAgc2hvd0xhYmVsOiBcIkFmZmljaGVyXCIsXG4gIGVudHJpZXNMYWJlbDogXCJlbnRyw6llc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dGVzIGVuIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIk51YWdlcyBkZSBtb3RzXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFycmVzXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJlcyBlbXBpbMOpZXNcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkFubmVhdVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlNlY3RldXJzXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIk51YWdlcyBkZSBwb2ludHNcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGVzXCIsXG4gIGZpbHRlcjogXCJGaWx0cmVcIixcbiAgaGlkZUJ1dHRvbjogXCJNYXNxdWVyXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2F1dmVyIGVuIHBuZ1wiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJSZW5kcmUgcHJpdsOpXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiUmVuZHJlIHB1YmxpcXVlXCIsXG4gIHNob3dCdXR0b246IFwiQWZmaWNoZXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmFmcmFpY2hpciBGaWx0cmVzXCIsXG4gIGNsZWFyQnV0dG9uOiBcIlJhZnJhaWNoaXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9pc2lyIGxhIHF1ZXN0aW9uIMOgIGFmZmljaGVyLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJEZWZhdXRcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kYW50XCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kYW50XCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiQWZmaWNoZXIgbGVzIGNvbG9ubmVzIG1pbmV1cmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkF1dHJlIMOpbMOpbWVudCBldCBjb21tZW50YWlyZXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiQ2UgdHlwZSBkZSBxdWVzdGlvbiBuJ2VzdCBwYXMgZW5jb3JlIHZpc3VhbGlzw6lcIixcbiAgbm9SZXN1bHRzOiBcIklsIG4neSBhIHBhcyBlbmNvcmUgZGUgcsOpc3VsdGF0c1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBhciB2YWxldXJcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGFyIGNvbG9ubmVcIixcbiAgYW5zd2VyOiBcIlLDqXBvbnNlXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiUsOpcG9uc2UgY29ycmVjdGU6IFwiLFxuICBwZXJjZW50OiBcIlBvdXJjZW50YWdlXCIsXG4gIHJlc3BvbnNlczogXCJSw6lwb25zZXNcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiRnJlbmNoXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGdlcm1hblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBwaWVyZW5cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJHcnVwcGllcnVuZyBhdWZoZWJlblwiLFxuICBzZWxlY3RCdXR0b246IFwiTWljaCBhdXN3w6RobGVuXCIsXG4gIGhpZGVDb2x1bW46IFwiU3BhbHRlIGF1c2JsZW5kZW5cIixcbiAgc2hvd0NvbHVtbjogXCJTcGFsdGUgZWluYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJTcGFsdGUgcHJpdmF0IG1hY2hlblwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlNwYWx0ZSB2ZXLDtmZmZW50bGljaGVuXCIsXG4gIG1vdmVUb0RldGFpbDogXCJpbiBEZXRhaWxzIHZlcnNjaGllYmVuXCIsXG4gIHNob3dBc0NvbHVtbjogXCJBbHMgU3BhbHRlIGFuemVpZ2VuXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlN1Y2hlLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiWmVpbGVuIGVudGZlcm5lblwiLFxuICBzaG93TGFiZWw6IFwiYW56ZWlnZW5cIixcbiAgZW50cmllc0xhYmVsOiBcIkVpbnRyw6RnZVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dGUgaW4gVGFiZWxsZW5mb3JtXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1tXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIkR1cmNoc2Nobml0dFwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiTGlzdGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkRpYWdyYW1tdHlwXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiQmFsa2VuZGlhZ3JhbW0gdmVydGlrYWxcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR2VzdGFwZWx0ZXMgQmFsa2VuZGlhZ3JhbW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvbnV0LURpYWdyYW1tXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiS3JlaXNkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGVkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiUGVnZWxkaWFncmFtbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkF1ZnrDpGhsdW5nc2RpYWdyYW1tXCIsXG4gIGhpZGVCdXR0b246IFwiQXVzYmxlbmRlblwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJQcml2YXQgbWFjaGVuXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiw5ZmZmVudGxpY2ggbWFjaGVuXCIsXG4gIHNob3dCdXR0b246IFwiQW56ZWlnZW5cIixcbiAgZmlsdGVyOiBcIkZpbHRlclwiLFxuICByZXNldEZpbHRlcjogXCJGaWx0ZXIgenVyw7xja3NldHplblwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiTG9rYWxpc2llcnVuZyDDpG5kZXJuXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkVpbnN0ZWxsdW5nZW4gbMO2c2NoZW5cIixcbiAgYWRkRWxlbWVudDogXCJXw6RobGVuIFNpZSBlaW5lIEZyYWdlLCB1bSB6dSB6ZWlnZW4uLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkcmVpaGVuZm9sZ2VcIixcbiAgYXNjT3JkZXI6IFwiQXVmc3RlaWdlbmRcIixcbiAgZGVzY09yZGVyOiBcIkFic3RlaWdlbmRcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJLbGVpbmVyZSBTcGFsdGVuIGFuemVpZ2VuXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFuZGVyZSBQdW5rdGUgdW5kIEtvbW1lbnRhcmVcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYW56ZWlnZW5cIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlByb3plbnRzw6R0emUgYXVzYmxlbmRlblwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRpYWdyYW1tIGFscyBwbmcgaGVydW50ZXJsYWRlblwiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkxlZXJlIEFudHdvcnRlbiBhdXNibGVuZGVuXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTGVlcmUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiQWxsZSBBbnR3b3J0ZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IEFudHdvcnRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBBbnR3b3J0ZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgQW50d29ydGVuXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJGZWhsZW5kZSBBbnR3b3J0ZW4gYXVzYmxlbmRlblwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiRmVobGVuZGUgQW50d29ydGVuIGFuemVpZ2VuXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiRmVobGVkZSBBbnR3b3J0ZW5cIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRsO8ciBkaWVzZW4gRnJhZ2V0eXAgZ2lidCBlcyBub2NoIGtlaW5lIFZpc3VhbGlzaWVydW5nLlwiLFxuICBub1Jlc3VsdHM6IFwiRXMgbGllZ2VuIG5vY2gga2VpbmUgRXJnZWJuaXNzZSB2b3JcIixcbiAgc2hvd1BlclZhbHVlczogXCJQcm8gV2VydFwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQcm8gU3BhbHRlXCIsXG4gIGFuc3dlcjogXCJBbnR3b3J0XCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiS29ycmVrdGUgQW50d29ydDogXCIsXG4gIHBlcmNlbnQ6IFwiUHJvemVudFwiLFxuICByZXNwb25zZXM6IFwiQW50d29ydGVuXCJcbn07XG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImRlXCJdID0gXCJHZXJtYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgaXRhbGlhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIlJhZ2dydXBwYVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIkRpdmlkaVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZXppb25hbWlcIixcbiAgaGlkZUNvbHVtbjogXCJOYXNjb25kaSBjb2xvbm5hXCIsXG4gIHNob3dDb2x1bW46IFwiTW9zdHJhIGNvbG9ubmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwcml2YXRhXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiUmVuZGkgbGEgY29sb25uYSBwdWJibGljYVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiU3Bvc3RhIGluIERldHRhZ2xpb1wiLFxuICBzaG93QXNDb2x1bW46IFwiTW9zdHJhIGNvbWUgQ29sb25uYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJDZXJjYS4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJpbXVvdmkgcmlnaGVcIixcbiAgc2hvd0xhYmVsOiBcIk1vc3RyYVwiLFxuICBlbnRyaWVzTGFiZWw6IFwidm9jaVwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiUGFyb2xlIGluIHRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnV2b2xhIGRpIHBhcm9sZVwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJJc3RvZ3JhbW1hXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIk1lZGlhXCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCJUYWJlbGxhXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJHcmFmaWNvXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiR3JhZmljbyBhIGJhcnJlXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkdyYWZpY28gYSBiYXJyZSB2ZXJ0aWNhbGlcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHNvdnJhcHBvc3RlXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJHcmFmaWNvIGEgY2lhbWJlbGxhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiR3JhZmljbyBhIHRvcnRhXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIkdyYWZpY28gYSBkaXNwZXJzaW9uZVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR3JhZmljbyBHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIlB1bnRvXCIsXG4gIGhpZGVCdXR0b246IFwiTmFzY29uZGlcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZGkgcHJpdmF0b1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRpIHB1YmJsaWNvXCIsXG4gIHNob3dCdXR0b246IFwiTW9zdHJhXCIsXG4gIGZpbHRlcjogXCJGaWx0cm9cIixcbiAgcmVzZXRGaWx0ZXI6IFwiQ2FuY2VsbGEgZmlsdHJvXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJDYW1iaWEgbGluZ3VhXCIsXG4gIGVuOiBcIkluZ2xlc2VcIixcbiAgZnI6IFwiRnJhbmNlc2VcIixcbiAgcnU6IFwiUnVzc29cIixcbiAgZGU6IFwiVGVkZXNjb1wiLFxuICBjbGVhckJ1dHRvbjogXCJDYW5jZWxsYVwiLFxuICBhZGRFbGVtZW50OiBcIlNjZWdsaSBsYSBkb21hbmRhIGRhIG1vc3RyYXJlLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJPcmRpbmUgZGkgRGVmYXVsdFwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEaXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYSBjb2xvbm5lIHNlY29uZGFyaWVcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQWx0cmkgcHVudGkgZSBjb21tZW50aVwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhIHBlcmNlbnR1YWxpXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJOYXNjb25kaSBwZXJjZW50dWFsaVwiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIlNjYXJpY2EgaWwgZ3JhZmljbyBpbiBmb3JtYXRvIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIk5hc2NvbmRpIHJpc3Bvc3RlIHZ1b3RlXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhIHJpc3Bvc3RlIHZ1b3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVHV0dGUgbGUgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IHJpc3Bvc3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiVG9wIDEwIHJpc3Bvc3RlXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIHJpc3Bvc3RlXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJOYXNjb25kaSBsZSByaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhIGxlIHJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiUmlzcG9zdGUgbWFuY2FudGlcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiUXVlc3RvIHRpcG8gZGkgZG9tYW5kYSBub24gw6ggYW5jb3JhIHN0YXRvIHZpc3VhbGl6emF0b1wiLFxuICBub1Jlc3VsdHM6IFwiTm9uIGNpIHNvbm8gYW5jb3JhIHJpc3VsdGF0aVwiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBlciBWYWxvcmlcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUGVyIENvbG9ubmVcIixcbiAgYW5zd2VyOiBcIlJpc3Bvc3RhXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudHVhbGVcIixcbiAgcmVzcG9uc2VzOiBcIlJpc3Bvc3RlXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJJdGFsaWFuXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIG5vcndlZ2lhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdydXBwZXJcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJPcHBoZXYgZ3J1cHBlcmluZ1wiLFxuICBzZWxlY3RCdXR0b246IFwiVmVsZ1wiLFxuICBoaWRlQ29sdW1uOiBcIlNranVsIGtvbG9ubmVcIixcbiAgc2hvd0NvbHVtbjogXCJWaXMga29sb25uZVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJHasO4ciBrb2xvbm5lIHByaXZhdFwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIkdqw7hyIGtvbG9ubmUgb2ZmZW50bGlnXCIsXG4gIG1vdmVUb0RldGFpbDogXCJGbHl0dCB0aWwgZGV0YWxqZXJ0IHZpc25pbmdcIixcbiAgc2hvd0FzQ29sdW1uOiBcIlZpcyBzb20ga29sb25uZVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJTw7hrLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiRmplcm4gcmFkZXJcIixcbiAgc2hvd0xhYmVsOiBcIlZpc1wiLFxuICBlbnRyaWVzTGFiZWw6IFwib3BwZsO4cmluZ2VyXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUYWJlbGx2aXNuaW5nXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIk9yZHNreVwiLFxuICBjaGFydFR5cGVfYmFyOiBcIlN0b2xwZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhYmxldCBzdG9scGVkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJIanVsZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfcGllOiBcIlNla3RvcmRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiUHVua3RkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNw6VsZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJLdWxlZGlhZ3JhbVwiLFxuICBoaWRlQnV0dG9uOiBcIlNranVsXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIkdqw7hyIHByaXZhdFwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIkdqw7hyIG9mZmVudGxpZ1wiLFxuICBzaG93QnV0dG9uOiBcIlZpc1wiLFxuICByZXNldEZpbHRlcjogXCJOdWxsc3RpbGwgZmlsdGVyXCIsXG4gIGNoYW5nZUxvY2FsZTogXCJCeXR0IHNwcsOla1wiLFxuICBjbGVhckJ1dHRvbjogXCJUw7htXCIsXG4gIGFkZEVsZW1lbnQ6IFwiVmVsZyBzcMO4cnNtw6VsLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJTdGFuZGFyZFwiLFxuICBhc2NPcmRlcjogXCJTdGlnZW5kZVwiLFxuICBkZXNjT3JkZXI6IFwiU3lua2VuZGVcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJWaXMgbWluZHJlIGtvbG9ubmVyXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFubmV0IG9nIGtvbW1lbnRhcmVyXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJWaXMgcHJvc2VudGVyXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJTa2p1bCBwcm9zZW50ZXJcIixcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wibm9cIl0gPSBub3J3ZWdpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibm9cIl0gPSBcIk5vcndlZ2lhblwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBwb3J0dWd1ZXNlU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiQWdydXBhciBQb3IgTWltXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGVzYWdydXBhciBQb3IgTWltXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY2lvbmFyXCIsXG4gIGhpZGVDb2x1bW46IFwiRXNjb25kZXIgY29sdW5hXCIsXG4gIHNob3dDb2x1bW46IFwiTW9zdHJhciBjb2x1bmFcIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiVG9ybmFyIGNvbHVuYSBwcml2YWRhXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiVG9ybmFyIGNvbHVuYSBww7pibGljYVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiTW92ZXIgcGFyYSBEZXRhbGhlc1wiLFxuICBzaG93QXNDb2x1bW46IFwiTW9zdHJhciBjb21vIENvbHVuYVwiLFxuICBmaWx0ZXJQbGFjZWhvbGRlcjogXCJQZXNxdWlzYXIuLi5cIixcbiAgcmVtb3ZlUm93czogXCJSZW1vdmVyIGxpbmhhc1wiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50cmFkYXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRvcyBlbSB0YWJlbGFcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiTnV2ZW0gZGUgcGFsYXZyYXNcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwiSGlzdG9ncmFtYVwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCJNw6lkaWFcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmVsYVwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwiR3LDoWZpY29cIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJyYVwiLFxuICBjaGFydFR5cGVfdmJhcjogXCJCYXJyYSB2ZXJ0aWNhbFwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJCYXJyYSBFbXBpbGhhZGFcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIlJvc2NhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVGFydGVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiTGFzdHJvXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJFc2NhbGFcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCYWxhXCIsXG4gIGhpZGVCdXR0b246IFwiRXNjb25kZXJcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiVG9ybmFyIHByaXZhZG9cIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJUb3JuYXIgcMO6YmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFyXCIsXG4gIGZpbHRlcjogXCJGaWx0cmFyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc3RhdXJhciBGaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIk11ZGFyIExvY2FsaXphw6fDo29cIixcbiAgZW46IFwiSW5nbMOqc1wiLFxuICBmcjogXCJGcmFuY8Oqc1wiLFxuICBydTogXCJSdXNzb1wiLFxuICBkZTogXCJBbGVtw6NvXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkxpbXBhclwiLFxuICBhZGRFbGVtZW50OiBcIkVzY29saGVyIHF1ZXN0w6NvIHBhcmEgbW9zdHJhci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiT3JkZW5hw6fDo28gUGFkcsOjb1wiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRlbnRlXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kZW50ZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIk1vc3RyYXIgY29sdW5hcyBtZW5vcmVzXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk91dHJvcyBpdGVucyBlIGNvbWVudMOhcmlvc1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiTW9zdHJhciBwZXJjZW50dWFpc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiRXNjb25kZXIgcGVyY2VudHVhaXNcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCJCYWl4YXIgZGlhZ3JhbWEgY29tbyBQTkdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJFc2NvbmRlciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgdmF6aWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgYXMgcmVzcG9zdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJQcmltZWlyYXMgNSByZXNwb3N0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJQcmltZWlyYXMgMTAgcmVzcG9zdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiUHJpbWVpcmFzIDIwIHJlc3Bvc3Rhc1wiLFxuICBoaWRlTWlzc2luZ0Fuc3dlcnM6IFwiT2N1bHRhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwiTW9zdHJhciBwZXJndW50YXMgbsOjbyByZXNwb25kaWRhc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIlBlcmd1bnRhcyBuw6NvIHJlc3BvbmRpZGFzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkVzdGUgdGlwbyBkZSBwZXJndW50YSBhaW5kYSBuw6NvIGZvaSB2aXN1YWxpemFkYVwiLFxuICBub1Jlc3VsdHM6IFwiQWluZGEgbsOjbyBwb3NzdWkgcmVzdWx0YWRvc1wiLFxuICBzaG93UGVyVmFsdWVzOiBcIlBvciB2YWxvcmVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBvciBjb2x1bmFzXCIsXG4gIGFuc3dlcjogXCJSZXNwb3N0YVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlJlc3Bvc3RhIGNvcnJldGE6IFwiLFxuICBwZXJjZW50OiBcIlBlcmNlbnRhZ2VtXCIsXG4gIHJlc3BvbnNlczogXCJSZXNwb3N0YXNcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcInB0XCJdID0gcG9ydHVndWVzZVN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwdFwiXSA9IFwiUG9ydHVndcOqc1wiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3JvdXAgQnkgTWVcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJVbmdyb3VwIEJ5IE1lXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlY3QgTWVcIixcbiAgaGlkZUNvbHVtbjogXCJIaWRlIGNvbHVtblwiLFxuICBzaG93Q29sdW1uOiBcIlNob3cgY29sdW1uXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIk1ha2UgY29sdW1uIHByaXZhdGVcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJNYWtlIGNvbHVtbiBwdWJsaWNcIixcbiAgbW92ZVRvRGV0YWlsOiBcIk1vdmUgdG8gRGV0YWlsXCIsXG4gIGZpbHRlcjogXCLQpNC40LvRjNGC0YBcIixcbiAgc2hvd0FzQ29sdW1uOiBcIlNob3cgYXMgQ29sdW1uXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJUZXh0cyBpbiB0YWJsZVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJXb3JkY2xvdWRcIixcbiAgY2hhcnRUeXBlX2JhcjogXCJCYXJcIixcbiAgY2hhcnRUeXBlX3N0YWNrZWRiYXI6IFwiU3RhY2tlZCBCYXJcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkRvdWdobnV0XCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiUGllXCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlNjYXR0ZXJcIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi0KHQutGA0YvRgtGMXCIsXG4gIHNob3dCdXR0b246IFwi0J/QvtC60LDQt9Cw0YLRjFwiLFxuICByZXNldEZpbHRlcjogXCLQntGH0LjRgdGC0LjRgtGMINGE0LjQu9GM0YLRgFwiLFxuICBjaGFuZ2VMb2NhbGU6IFwi0KHQvNC10L3QuNGC0Ywg0Y/Qt9GL0LpcIixcbiAgY2xlYXJCdXR0b246IFwiQ2xlYXJcIixcbiAgYWRkRWxlbWVudDogXCJDaG9vc2UgcXVlc3Rpb24gdG8gc2hvdy4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXVsdFwiLFxuICBhc2NPcmRlcjogXCJBc2NlbmRpbmdcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRpbmdcIixcbiAgc2hvd01pbm9yQ29sdW1uczogXCJTaG93IG1pbm9yIGNvbHVtbnNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwi0JTRgNGD0LPQvtC1INC4INC60L7QvNC80LXQvdGC0LDRgNC40LhcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwi0K3RgtC+0YIg0YLQuNC/INCy0L7Qv9GA0L7RgdCwINC10YnQtSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0LDQvdCw0LvQuNGC0LjQutC+0LlcIixcbiAgbm9SZXN1bHRzOiBcItCg0LXQt9GD0LvRjNGC0LDRgtGLINC+0YLRgdGD0YLRgdGC0LLRg9GO0YJcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicnVcIl0gPSBcIlJ1c3NpYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgc3BhbmlzaFN0cmluZ3MgPSB7XG4gIFwidW5ncm91cEJ1dHRvblwiOiBcIkRlc2FncnVwYXIgcG9yIG3DrVwiLFxuICBcInNlbGVjdEJ1dHRvblwiOiBcIlNlbGVjY2lvbmFybWVcIixcbiAgXCJoaWRlQ29sdW1uXCI6IFwiT2N1bHRhciBjb2x1bW5hXCIsXG4gIFwic2hvd0NvbHVtblwiOiBcIk1vc3RyYXIgY29sdW1uYVwiLFxuICBcIm1ha2VQcml2YXRlQ29sdW1uXCI6IFwiSGFjZXIgcXVlIGxhIGNvbHVtbmEgc2VhIHByaXZhZGFcIixcbiAgXCJtYWtlUHVibGljQ29sdW1uXCI6IFwiSGFjZXIgcMO6YmxpY2EgbGEgY29sdW1uYVwiLFxuICBcIm1vdmVUb0RldGFpbFwiOiBcIk1vdmVyIGFsIGRldGFsbGVcIixcbiAgXCJzaG93QXNDb2x1bW5cIjogXCJNb3N0cmFyIGNvbW8gY29sdW1uYVwiLFxuICBcImZpbHRlclBsYWNlaG9sZGVyXCI6IFwiQnVzY2FyIC4uLlwiLFxuICBcInJlbW92ZVJvd3NcIjogXCJFbGltaW5hciBmaWxhc1wiLFxuICBcInNob3dMYWJlbFwiOiBcIk1vc3RyYXJcIixcbiAgXCJlbnRyeUxhYmVsXCI6IFwiZW50cmFkYXNcIixcbiAgXCJ2aXN1YWxpemVyX3RleHRcIjogXCJUZXh0b3MgZW4gdGFibGFcIixcbiAgXCJ2aXN1YWxpemVyX3dvcmRjbG91ZFwiOiBcIldvcmRjbG91ZFwiLFxuICBcImNoYXJ0VHlwZV9iYXJcIjogXCJCYXJcIixcbiAgXCJjaGFydFR5cGVfc3RhY2tlZGJhclwiOiBcIkJhcnJhIGFwaWxhZGFcIixcbiAgXCJjaGFydFR5cGVfZG91Z2hudXRcIjogXCJEb251dFwiLFxuICBcImNoYXJ0VHlwZV9waWVcIjogXCJQaWVcIixcbiAgXCJjaGFydFR5cGVfc2NhdHRlclwiOiBcIkRpc3BlcnNpw7NuXCIsXG4gIFwiY2hhcnRUeXBlX2dhdWdlXCI6IFwiR2F1Z2VcIixcbiAgXCJjaGFydFR5cGVfYnVsbGV0XCI6IFwiQnVsbGV0XCIsXG4gIFwiaGlkZUJ1dHRvblwiOiBcIk9jdWx0YXJcIixcbiAgXCJtYWtlUHJpdmF0ZUJ1dHRvblwiOiBcIkhhY2VyIHByaXZhZG9cIixcbiAgXCJtYWtlUHVibGljQnV0dG9uXCI6IFwiSGFjZXIgcMO6YmxpY29cIixcbiAgXCJzaG93QnV0dG9uXCI6IFwiTW9zdHJhclwiLFxuICBcImZpbHRlclwiOiBcIkZpbHRyb1wiLFxuICBcInJlc2V0RmlsdGVyXCI6IFwiUmVzdGFibGVjZXIgZmlsdHJvXCIsXG4gIFwiY2hhbmdlTG9jYWxlXCI6IFwiQ2FtYmlhciBjb25maWd1cmFjacOzbiByZWdpb25hbFwiLFxuICBcImNsZWFyQnV0dG9uXCI6IFwiQm9ycmFyXCIsXG4gIFwiYWRkRWxlbWVudFwiOiBcIkVsaWphIGxhIHByZWd1bnRhIHBhcmEgbW9zdHJhciAuLi5cIixcbiAgXCJkZWZhdWx0T3JkZXJcIjogXCJPcmRlbiBwcmVkZXRlcm1pbmFkb1wiLFxuICBcImFzY09yZGVyXCI6IFwiQXNjZW5kZW50ZVwiLFxuICBcImRlc2NPcmRlclwiOiBcIkRlc2NlbmRlbnRlXCIsXG4gIFwic2hvd01pbm9yQ29sdW1uc1wiOiBcIk1vc3RyYXIgY29sdW1uYXMgc2VjdW5kYXJpYXNcIixcbiAgXCJvdGhlckNvbW1lbnRUaXRsZVwiOiBcIk90cm9zIGVsZW1lbnRvcyB5IGNvbWVudGFyaW9zXCIsXG4gIFwic2hvd1BlcmNlbnRhZ2VzXCI6IFwiTW9zdHJhciBwb3JjZW50YWplc1wiLFxuICBcImhpZGVQZXJjZW50YWdlc1wiOiBcIk9jdWx0YXIgcG9yY2VudGFqZXNcIixcbiAgXCJwZGZEb3dubG9hZENhcHRpb25cIjogXCJQREZcIixcbiAgXCJ4bHN4RG93bmxvYWRDYXB0aW9uXCI6IFwiRXhjZWxcIixcbiAgXCJjc3ZEb3dubG9hZENhcHRpb25cIjogXCJDU1ZcIixcbiAgXCJzYXZlRGlhZ3JhbUFzUE5HXCI6IFwiRGVzY2FyZ2FyIGVsIGdyw6FmaWNvIGNvbW8gcG5nXCIsXG4gIFwiaGlkZUVtcHR5QW5zd2Vyc1wiOiBcIk9jdWx0YXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIFwic2hvd0VtcHR5QW5zd2Vyc1wiOiBcIk1vc3RyYXIgcmVzcHVlc3RhcyB2YWPDrWFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dC0xXCI6IFwiVG9kYXMgbGFzIHJlc3B1ZXN0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIkxhcyA1IHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJMYXMgMTAgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIjIwIHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgXCJub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvblwiOiBcIkVzdGUgdGlwbyBkZSBwcmVndW50YSBhw7puIG5vIHNlIHZpc3VhbGl6YVwiLFxuICBcIm5vUmVzdWx0c1wiOiBcIkHDum4gbm8gaGF5IHJlc3VsdGFkb3NcIlxufTtcbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXNcIl0gPSBzcGFuaXNoU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVzXCJdID0gXCJTcGFuaXNoXCI7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbk1vZGVsIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIHByb3RlY3RlZCBjaGFydFR5cGVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJib29sZWFuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gdGhpcy5ib29sZWFuUXVlc3Rpb24uY29ycmVjdEFuc3dlcjtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgISFjb3JyZWN0QW5zd2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgIWNvcnJlY3RBbnN3ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsRmFsc2UudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RBbnN3ZXJWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYm9vbGVhblF1ZXN0aW9uKCkge1xuICAgIHJldHVybiA8UXVlc3Rpb25Cb29sZWFuTW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdHJ1ZUNvbG9yID0gXCJcIjtcbiAgcHVibGljIHN0YXRpYyBmYWxzZUNvbG9yID0gXCJcIjtcblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUodmFsdWVzW2xhYmVscy5pbmRleE9mKGl0ZW1UZXh0KV0sIGl0ZW1UZXh0KTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZVxuICAgICAgICA6IHRydWUsXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlXG4gICAgICAgIDogZmFsc2UsXG4gICAgXTtcbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGxhYmVscyA9IFtdLmNvbmNhdCh0aGlzLmdldFZhbHVlcygpKTtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxUcnVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxhYmVsc1swXSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxGYWxzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbHNbMV0gPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzWzJdID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIik7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vY2hvaWNlcy10YWJsZS5zY3NzXCIpO1xuXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1RhYmxlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IENob2ljZXNUYWJsZSkge31cblxuICBwdWJsaWMgY3JlYXRlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gdGhpcy5tb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDE7XG5cbiAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcbiAgICB9KTtcblxuICAgIGlmIChkYXRhc2V0cy5sZW5ndGggPT09IDAgfHwgZGF0YXNldHNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXG4gICAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLWNob2ljZXMtdGFibGVcIilcbiAgICAgICk7XG5cbiAgICAgIHRhYmxlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuXG4gICAgICB2YXIgaGVhZGVyUm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgdmFyIGxhYmVsQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhbnN3ZXJcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgdmFyIHNwYXJrbGluZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBcIlwiLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoc3BhcmtsaW5lQ2VsbCk7XG4gICAgICB2YXIgcGVyY2VudENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGVyY2VudFwiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHBlcmNlbnRDZWxsKTtcbiAgICAgIHZhciB2YWx1ZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzcG9uc2VzXCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodmFsdWVDZWxsKTtcbiAgICAgIHRhYmxlTm9kZS5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xuXG4gICAgICBkYXRhLmZvckVhY2goKHJvd0RhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICAgIHZhciBsYWJlbENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogbGFiZWxzW2luZGV4XSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgICB2YXIgc3BhcmtsaW5lQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGxcIik7XG4gICAgICAgIHZhciBvdXRlckJhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jaG9pY2VzLXNwYXJrbGluZVwiKTtcbiAgICAgICAgdmFyIGlubmVyQmFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLWNob2ljZXMtc3BhcmtsaW5lLXZhbHVlXCIpO1xuICAgICAgICBpbm5lckJhci5zdHlsZS53aWR0aCA9IHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCI7XG4gICAgICAgIG91dGVyQmFyLmFwcGVuZENoaWxkKGlubmVyQmFyKTtcbiAgICAgICAgc3BhcmtsaW5lQ2VsbC5hcHBlbmRDaGlsZChvdXRlckJhcik7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChzcGFya2xpbmVDZWxsKTtcbiAgICAgICAgdmFyIHBlcmNlbnRDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogXCJcIiArIHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQocGVyY2VudENlbGwpO1xuICAgICAgICB2YXIgdmFsdWVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogcm93RGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh2YWx1ZUNlbGwpO1xuICAgICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS1jaG9pY2VzLXRhYmxlX19jb250YWluZXJcIjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBub2RlLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENob2ljZXNUYWJsZSBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcml2YXRlIF9jaG9pY2VzVGFibGVBZGFwdGVyOiBDaG9pY2VzVGFibGVBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImNob2ljZXNcIik7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlciA9IG5ldyBDaG9pY2VzVGFibGVBZGFwdGVyKHRoaXMpO1xuICAgIHRoaXMuYW5zd2Vyc09yZGVyID0gXCJhc2NcIjtcbiAgICB0aGlzLnNob3dQZXJjZW50YWdlcyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYWRpb2dyb3VwXCIsIENob2ljZXNUYWJsZSk7XG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBDaG9pY2VzVGFibGUpO1xuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY2hlY2tib3hcIiwgQ2hvaWNlc1RhYmxlKTtcbiIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhSW5mbyB7XHJcbiAgbmFtZTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PjtcclxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFQcm92aWRlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXJpZXNNYXJrZXJLZXkgPSBcIl9fc2Ffc2VyaWVzX25hbWVcIjtcclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+O1xyXG4gIHByaXZhdGUgX3N0YXRpc3RpY3NDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PEFycmF5PG51bWJlcj4+IHwgQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+IH07XHJcbiAgcHJvdGVjdGVkIGZpbHRlclZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvOiBJRGF0YUluZm8pOiBzdHJpbmcge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUluZm8ubmFtZSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGFJbmZvLm5hbWUuam9pbihcIi1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YUluZm8ubmFtZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGE6IEFycmF5PGFueT4gPSBbXSwgcHJpdmF0ZSBfZ2V0RGF0YUNvcmU6IChkYXRhSW5mbzogSURhdGFJbmZvKSA9PiBudW1iZXJbXVtdID0gdW5kZWZpbmVkKSB7IH1cclxuXHJcbiAgcHVibGljIHJlc2V0KGRhdGFJbmZvPzogSURhdGFJbmZvKSB7XHJcbiAgICBpZiAoISFkYXRhSW5mbykge1xyXG4gICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0NhY2hlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSAhPT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSAhPT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMucmFpc2VEYXRhQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICB0aGlzLl9kYXRhID0gW10uY29uY2F0KGRhdGEpO1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmaWx0ZXJlZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyZWREYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGZpbHRlcktleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlcyk7XHJcbiAgICAgIGlmIChmaWx0ZXJLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB0aGlzLmRhdGEuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gIU9iamVjdC5rZXlzKHRoaXMuZmlsdGVyVmFsdWVzKS5zb21lKFxyXG4gICAgICAgICAgICAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVHlwZSA9IHR5cGVvZiBmaWx0ZXJWYWx1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvblZhbHVlID0gaXRlbVtrZXldO1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcXVlc3Rpb25WYWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSA9PSAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhcXVlc3Rpb25Db250YWluc1ZhbHVlKHF1ZXN0aW9uVmFsdWUsIGZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzVmFsdWUgPSBpdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldO1xyXG4gICAgICAgICAgICAgIGlmICghIXNlcmllc1ZhbHVlICYmIGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uVmFsdWUgIT09IGZpbHRlclZhbHVlW3Nlcmllc1ZhbHVlXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIiAmJiBmaWx0ZXJWYWx1ZS5zdGFydCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlLmVuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGluaW9pdXNWYWx1ZSA9IHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm51bWJlclwiID8gcXVlc3Rpb25WYWx1ZSA6IERhdGUucGFyc2UocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29udGluaW9pdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGluaW9pdXNWYWx1ZSA9IHBhcnNlRmxvYXQocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc05hTihjb250aW5pb2l1c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGluaW9pdXNWYWx1ZSA8IGZpbHRlclZhbHVlLnN0YXJ0IHx8IGNvbnRpbmlvaXVzVmFsdWUgPj0gZmlsdGVyVmFsdWUuZW5kO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gaXRlbVtrZXldICE9PSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZmlsdGVyIGJ5IHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcsIHNlbGVjdGVkVmFsdWU6IGFueSkge1xyXG4gICAgdmFyIGZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXTtcclxuICAgIH1cclxuICAgIGlmIChmaWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXREYXRhQ29yZShkYXRhSW5mbzogSURhdGFJbmZvKSB7XHJcbiAgICBpZiAoISF0aGlzLl9nZXREYXRhQ29yZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YUNvcmUoZGF0YUluZm8pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFOYW1lcyA9IEFycmF5LmlzQXJyYXkoZGF0YUluZm8ubmFtZSkgPyBkYXRhSW5mby5uYW1lIDogW2RhdGFJbmZvLm5hbWVdO1xyXG4gICAgY29uc3Qgc3RhdGlzdGljczogQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+ID0gW107XHJcblxyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YUluZm8uZ2V0VmFsdWVzKCk7XHJcbiAgICBjb25zdCB2YWx1ZXNJbmRleDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdmFsdWVzSW5kZXhbdmFsXSA9IGluZGV4O1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMgPSB2YWx1ZXMuaW5kZXhPZih1bmRlZmluZWQpICE9PSAtMTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXMgPSBkYXRhSW5mby5nZXRTZXJpZXNWYWx1ZXMoKTtcclxuICAgIGNvbnN0IHNlcmllc0luZGV4OiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIHNlcmllcy5mb3JFYWNoKCh2YWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBzZXJpZXNJbmRleFt2YWxdID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXNMZW5ndGggPSBzZXJpZXMubGVuZ3RoIHx8IDE7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFOYW1lcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBkYXRhTmFtZVN0YXRpc3RpY3MgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPj4oKTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXJpZXNMZW5ndGg7ICsraikge1xyXG4gICAgICAgIGRhdGFOYW1lU3RhdGlzdGljcy5wdXNoKG5ldyBBcnJheTxudW1iZXI+KHZhbHVlcy5sZW5ndGgpLmZpbGwoMCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHN0YXRpc3RpY3MucHVzaChkYXRhTmFtZVN0YXRpc3RpY3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIGRhdGFOYW1lcy5mb3JFYWNoKChkYXRhTmFtZSwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W2RhdGFOYW1lXTtcclxuICAgICAgICBpZiAocm93VmFsdWUgIT09IHVuZGVmaW5lZCB8fCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IHJvd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkocm93VmFsdWUpID8gcm93VmFsdWUgOiBbcm93VmFsdWVdO1xyXG4gICAgICAgICAgaWYgKHNlcmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgbGFiZWxsZWQgYnkgc2VyaWVzTWFya2VyS2V5IGluIHJvdyBkYXRhXHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzSW5kZXhbcm93W0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldXSB8fCAwO1xyXG4gICAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxdXSsrO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgdGhlIGtleXMgaW4gcXVlc3Rpb24gdmFsdWUgKG1hdHJpeCBxdWVzdGlvbilcclxuICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCB0aGUgZGUtbm9ybWFsaXphdGlvbiBhbmQgY29tYmluZSB3aXRoIHRoZSBwcmV2aW91cyBjYXNlXHJcbiAgICAgICAgICAgICAgcm93VmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmZvckVhY2goKHNlcmllc05hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHZhbFtzZXJpZXNOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPSBzZXJpZXNJbmRleFtzZXJpZXNOYW1lXSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxbc2VyaWVzTmFtZV1dXSsrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTm8gc2VyaWVzXHJcbiAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHN0YXRpc3RpY3NbMF1bMF1bdmFsdWVzSW5kZXhbdmFsXV0rKyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGFJbmZvLm5hbWUpID8gc3RhdGlzdGljcyA6IHN0YXRpc3RpY3NbMF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGNhbGN1bGF0ZWQgc3RhdGlzY3RpY3MgZm9yIHRoZSBJRGF0YUluZm8gb2JqZWN0LlxyXG4gICAqL1xyXG4gIGdldERhdGEoZGF0YUluZm86IElEYXRhSW5mbykge1xyXG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdldFN0YXRpc3RpY3NDYWNoZUtleShkYXRhSW5mbyk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0gPT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0gPSB0aGlzLmdldERhdGFDb3JlKGRhdGFJbmZvKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXS5jb25jYXQodGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIGRhdGEgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgb25EYXRhQ2hhbmdlZCA9IG5ldyBFdmVudDxcclxuICAgIChzZW5kZXI6IERhdGFQcm92aWRlciwgb3B0aW9uczogYW55KSA9PiBhbnksXHJcbiAgICBEYXRhUHJvdmlkZXIsXHJcbiAgICBhbnlcclxuICA+KCk7XHJcblxyXG4gIHByb3RlY3RlZCByYWlzZURhdGFDaGFuZ2VkKCkge1xyXG4gICAgaWYgKCF0aGlzLm9uRGF0YUNoYW5nZWQuaXNFbXB0eSkge1xyXG4gICAgICB0aGlzLm9uRGF0YUNoYW5nZWQuZmlyZSh0aGlzLCB7fSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBxdWVzdGlvbkNvbnRhaW5zVmFsdWUocXVlc3Rpb25WYWx1ZTogYW55LCBmaWx0ZXJWYWx1ZTogYW55KSB7XHJcbiAgY29uc3QgcXVlc3Rpb25WYWx1ZUtleXMgPSBPYmplY3Qua2V5cyhxdWVzdGlvblZhbHVlKTtcclxuICBjb25zdCBmaWx0ZXJWYWx1ZUtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXJWYWx1ZSk7XHJcblxyXG4gIGlmIChmaWx0ZXJWYWx1ZUtleXMubGVuZ3RoID4gcXVlc3Rpb25WYWx1ZUtleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gIGZvciAodmFyIGtleSBvZiBmaWx0ZXJWYWx1ZUtleXMpIHtcclxuICAgIGlmIChmaWx0ZXJWYWx1ZVtrZXldICE9IHF1ZXN0aW9uVmFsdWVba2V5XSkgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbiIsImV4cG9ydCAqIGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbi8vbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9nZXJtYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcnVzc2lhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9zcGFuaXNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2l0YWxpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9kYXRhUHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vbnVtYmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL21hdHJpeFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2Jvb2xlYW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvblBhbmVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYWx0ZXJuYXRpdmVWaXp1YWxpemVyc1dyYXBwZXJcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL3Bsb3RseS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3dvcmRjbG91ZC93b3JkY2xvdWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi93b3JkY2xvdWQvc3RvcHdvcmRzL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2Nob2ljZXMtdGFibGVcIjtcblxuZXhwb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbiIsImltcG9ydCB7IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdGVySW5mbyB7XHJcbiAgcHJpdmF0ZSBfaHRtbEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdGV4dDogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbGl6ZXI6IElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbikge1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+KFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtcXVlc3Rpb25fX2ZpbHRlclwiKVxyXG4gICAgKTtcclxuICAgIHRoaXMudGV4dCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgIFwic3BhblwiLFxyXG4gICAgICBcInNhLXF1ZXN0aW9uX19maWx0ZXItdGV4dFwiXHJcbiAgICApO1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50ZXh0KTtcclxuICAgIGNvbnN0IGZpbHRlckNsZWFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcclxuICAgICAgdmlzdWFsaXplci5zZXRTZWxlY3Rpb24odW5kZWZpbmVkKTtcclxuICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhckJ1dHRvblwiKSk7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudC5hcHBlbmRDaGlsZChmaWx0ZXJDbGVhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGh0bWxFbGVtZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0bWxFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShzZWxlY3Rpb246IHsgdmFsdWU6IGFueSwgdGV4dDogc3RyaW5nIH0pIHtcclxuICAgIGlmIChzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBzZWxlY3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtZmxleFwiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImZpbHRlclwiKSArIFwiOiBbXCIgKyBzZWxlY3Rpb24udGV4dCArIFwiXVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtTW9kZWwgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJvdGVjdGVkIHZhbHVlVHlwZTogXCJkYXRlXCIgfCBcIm51bWJlclwiID0gXCJudW1iZXJcIjtcbiAgcHJpdmF0ZSBfY2FjaGVkVmFsdWVzOiBBcnJheTx7IG9yaWdpbmFsOiBhbnksIGNvbnRpbmlvdXM6IG51bWJlciB9PiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29udGluaW91c0RhdGE6IHsgW3Nlcmllczogc3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jYWNoZWRJbnRlcnZhbHM6IEFycmF5PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcgfT4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2ludGVydmFsUHJlY2lzaW9uOiBudW1iZXIgPSAyO1xuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW107XG5cbiAgcHVibGljIHN0YXRpYyBJbnRlcnZhbHNDb3VudCA9IDEwO1xuICBwdWJsaWMgc3RhdGljIFVzZUludGVydmFsc0Zyb20gPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJoaXN0b2dyYW1cIik7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbFByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9pbnRlcnZhbFByZWNpc2lvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnZhbFByZWNpc2lvbjtcbiAgICB9XG4gICAgY29uc3QgcXVlc3Rpb25UeXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIGlmIChxdWVzdGlvblR5cGUgPT09IFwidGV4dFwiICYmIChxdWVzdGlvbltcImlucHV0VHlwZVwiXSA9PT0gXCJkYXRlXCIgfHwgcXVlc3Rpb25bXCJpbnB1dFR5cGVcIl0gPT09IFwiZGF0ZXRpbWVcIikpIHtcbiAgICAgIHRoaXMudmFsdWVUeXBlID0gXCJkYXRlXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVUeXBlID0gXCJudW1iZXJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCkge1xuICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NhY2hlZFZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGluaW91c1ZhbHVlKHZhbHVlOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnZhbHVlVHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIHJldHVybiBEYXRlLnBhcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFN0cmluZyh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52YWx1ZVR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1ByZWNpc2lvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgYmFzZSA9IE1hdGgucG93KDEwLCB0aGlzLl9pbnRlcnZhbFByZWNpc2lvbik7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYmFzZSAqIHZhbHVlKSAvIGJhc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5oYXNDdXN0b21JbnRlcnZhbHMgfHwgdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCkubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSkge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4gaW50ZXJ2YWwubGFiZWwgPT09IGl0ZW1UZXh0KVswXTtcbiAgICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKGludGVydmFsLCBpbnRlcnZhbCAhPT0gdW5kZWZpbmVkID8gaW50ZXJ2YWwubGFiZWwgOiBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBjb25zdCBsYWJlbEluZGV4ID0gbGFiZWxzLmluZGV4T2YoaXRlbVRleHQpO1xuICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKHRoaXMuZ2V0VmFsdWVzKClbbGFiZWxJbmRleF0sIGxhYmVsc1tsYWJlbEluZGV4XSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2aXN1YWxpemVyIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgc3VwZXIub25EYXRhQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbnRpbmlvdXNWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZFZhbHVlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgaWYgKHNlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2VyaWVzLnB1c2goXCJcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb250aW5pb3VzRGF0YSA9IHt9O1xuICAgICAgc2VyaWVzLmZvckVhY2goc2VyaWVzVmFsdWUgPT4gdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzVmFsdWVdID0gW10pO1xuICAgICAgY29uc3QgaGFzaCA9IHt9O1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goZGF0YUl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJEYXRhID0gZGF0YUl0ZW1bdGhpcy5uYW1lIGFzIHN0cmluZ107XG4gICAgICAgIGlmIChhbnN3ZXJEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZSA9IGRhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldIHx8IFwiXCI7XG4gICAgICAgICAgLy8gVE9ETzogX2NvbnRpbmlvdXNEYXRhIHNob3VsZCBiZSBzb3J0ZWQgaW4gb3JkZXIgdG8gc3BlZWQtdXAgc3RhdGlzdGljcyBjYWxjdWxhdGlvbiBpbiB0aGUgZ2V0RGF0YSBmdW5jdGlvblxuICAgICAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1ZhbHVlXS5wdXNoKHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGFuc3dlckRhdGEpKTtcbiAgICAgICAgICBoYXNoW2Fuc3dlckRhdGFdID0gYW5zd2VyRGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZXMgPSBPYmplY3Qua2V5cyhoYXNoKS5tYXAoa2V5ID0+ICh7IG9yaWdpbmFsOiBoYXNoW2tleV0sIGNvbnRpbmlvdXM6IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGtleSkgfSkpO1xuICAgICAgdGhpcy5fY2FjaGVkVmFsdWVzLnNvcnQoKGEsIGIpID0+IGEuY29udGluaW91cyAtIGIuY29udGluaW91cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRWYWx1ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBuZWVkVXNlUmF0ZVZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJyYXRpbmdcIiAmJiBBcnJheS5pc0FycmF5KHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdKSAmJiB0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSB8fCB0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMubWFwKGludGVydmFsID0+IGludGVydmFsLnN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRpbmlvdXNWYWx1ZXMubWFwKHZhbHVlID0+IHZhbHVlLm9yaWdpbmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscyB8fCBjb250aW5pb3VzVmFsdWVzLmxlbmd0aCA+IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20gfHwgdGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxzLm1hcChpbnRlcnZhbCA9PiBpbnRlcnZhbC5sYWJlbCk7XG4gICAgfVxuICAgIHJldHVybiBjb250aW5pb3VzVmFsdWVzLm1hcCh2YWx1ZSA9PiBcIlwiICsgdmFsdWUub3JpZ2luYWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDdXN0b21JbnRlcnZhbHMoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbk9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uT3B0aW9ucy5pbnRlcnZhbHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcnZhbHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbk9wdGlvbnMuaW50ZXJ2YWxzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgY29uc3QgcmF0ZVZhbHVlcyA9IHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdIGFzIEl0ZW1WYWx1ZVtdO1xuICAgICAgcmV0dXJuIHJhdGVWYWx1ZXMubWFwKChyYXRlVmFsdWUsIGkpID0+ICh7XG4gICAgICAgIHN0YXJ0OiByYXRlVmFsdWUudmFsdWUsXG4gICAgICAgIGVuZDogaSA8IHJhdGVWYWx1ZXMubGVuZ3RoIC0gMSA/IHJhdGVWYWx1ZXNbaSArIDFdLnZhbHVlIDogcmF0ZVZhbHVlLnZhbHVlICsgMSxcbiAgICAgICAgbGFiZWw6IHJhdGVWYWx1ZS50ZXh0XG4gICAgICB9KSkucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzID0gW107XG4gICAgICBpZiAoY29udGluaW91c1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gY29udGluaW91c1ZhbHVlc1swXS5jb250aW5pb3VzO1xuICAgICAgICBjb25zdCBlbmQgPSBjb250aW5pb3VzVmFsdWVzW2NvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoIC0gMV0uY29udGluaW91cztcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxzQ291bnQgPSBIaXN0b2dyYW1Nb2RlbC5JbnRlcnZhbHNDb3VudDtcbiAgICAgICAgY29uc3QgZGVsdGEgPSAoZW5kIC0gc3RhcnQpIC8gaW50ZXJ2YWxzQ291bnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJ2YWxzQ291bnQ7ICsraSkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBzdGFydCArIGRlbHRhO1xuICAgICAgICAgIGNvbnN0IGlzdGFydCA9IHRoaXMudG9QcmVjaXNpb24oc3RhcnQpO1xuICAgICAgICAgIGNvbnN0IGluZXh0ID0gdGhpcy50b1ByZWNpc2lvbihuZXh0KTtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogaXN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBpbmV4dCxcbiAgICAgICAgICAgIGxhYmVsOiBcIlwiICsgdGhpcy5nZXRTdHJpbmcoaXN0YXJ0KSArIFwiLVwiICsgdGhpcy5nZXRTdHJpbmcoaW5leHQpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3RhcnQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRJbnRlcnZhbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLmhhc0N1c3RvbUludGVydmFscyAmJiBjb250aW5pb3VzVmFsdWVzLmxlbmd0aCA8PSBIaXN0b2dyYW1Nb2RlbC5Vc2VJbnRlcnZhbHNGcm9tKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcnZhbHMgPSB0aGlzLmludGVydmFscztcbiAgICBjb25zdCBzdGF0aXN0aWNzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNlcmllcy5wdXNoKFwiXCIpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3RhdGlzdGljcy5wdXNoKGludGVydmFscy5tYXAoaSA9PiAwKSk7XG4gICAgICB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNbaV1dLmZvckVhY2goZGF0YVZhbHVlID0+IHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnRlcnZhbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWxzW2pdLnN0YXJ0IDw9IGRhdGFWYWx1ZSAmJiAoZGF0YVZhbHVlIDwgaW50ZXJ2YWxzW2pdLmVuZCB8fCBqID09IGludGVydmFscy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgc3RhdGlzdGljc1tpXVtqXSsrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cbiIsImNvbnN0IE11dXJpID0gcmVxdWlyZShcIm11dXJpXCIpO1xyXG5cclxuLyoqXHJcbiAqIEEgYmFzZSBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gbGF5b3V0IGVuZ2luZXMgb3IgaW50ZWdyYXRlIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmVzIHdpdGggU3VydmV5SlMgRGFzaGJvYXJkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExheW91dEVuZ2luZSB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9hbGxvd2VkOiBib29sZWFuKSB7IH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7IH1cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7IH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29yZSgpIHsgfVxyXG5cclxuICBnZXQgYWxsb3dlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyB0aGUgZHluYW1pYyBsYXlvdXQgaW4gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYXJyYW5nZSB2aXN1YWxpemF0aW9uIGl0ZW1zIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgc2NyZWVuIHNwYWNlIGFuZCBhbGxvdyB1c2VycyB0byByZW9yZGVyIHRoZW0gdmlhIGRyYWcgYW5kIGRyb3AuXHJcbiAgICovXHJcbiAgc3RhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy5zdGFydENvcmUoY29udGFpbmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHN0b3AoKSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkge1xyXG4gICAgICB0aGlzLnN0b3BDb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGR5bmFtaWMgbGF5b3V0LlxyXG4gICAqL1xyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29yZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHsgfVxyXG4gIHJlbW92ZShlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7IH1cclxuXHJcbiAgb25Nb3ZlQ2FsbGJhY2s6IChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSA9PiB2b2lkO1xyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdG9wKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTXV1cmlMYXlvdXRFbmdpbmUgZXh0ZW5kcyBMYXlvdXRFbmdpbmUge1xyXG4gIHByaXZhdGUgX211dXJpOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbGF5b3V0aW5nVGltZXI6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoYWxsb3dlZDogYm9vbGVhbiwgcHJpdmF0ZSBfc2VsZWN0b3I6IHN0cmluZywgcHJpdmF0ZSBkcmFnRW5hYmxlZCA9IHRydWUpIHtcclxuICAgIHN1cGVyKGFsbG93ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9tdXVyaSA9IG5ldyBNdXVyaShjb250YWluZXIsIHtcclxuICAgICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XHJcbiAgICAgICAgaGFuZGxlOiBcIi5zYS1xdWVzdGlvbl9fdGl0bGUtLWRyYWdnYWJsZVwiLFxyXG4gICAgICB9LFxyXG4gICAgICBpdGVtczogdGhpcy5fc2VsZWN0b3IsXHJcbiAgICAgIGRyYWdFbmFibGVkOiB0aGlzLmRyYWdFbmFibGVkLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tdXVyaS5vbihcclxuICAgICAgXCJkcmFnUmVsZWFzZUVuZFwiLFxyXG4gICAgICAoZGF0YTogYW55KSA9PlxyXG4gICAgICAgIHRoaXMub25Nb3ZlQ2FsbGJhY2sgJiYgdGhpcy5vbk1vdmVDYWxsYmFjayhkYXRhLmZyb21JbmRleCwgZGF0YS50b0luZGV4KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHN0b3BDb3JlKCkge1xyXG4gICAgdGhpcy5fbXV1cmkub2ZmKFwiZHJhZ1JlbGVhc2VFbmRcIik7XHJcbiAgICB0aGlzLl9tdXVyaS5kZXN0cm95KCk7XHJcbiAgICB0aGlzLl9tdXVyaSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUNvcmUoKSB7XHJcbiAgICBpZiAodGhpcy5fbGF5b3V0aW5nVGltZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fbGF5b3V0aW5nVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuX211dXJpLnJlZnJlc2hJdGVtcygpO1xyXG4gICAgICB0aGlzLl9tdXVyaS5sYXlvdXQoKTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGFkZChlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkgdGhpcy5fbXV1cmkuYWRkKGVsZW1lbnRzLCBvcHRpb25zKTtcclxuICB9XHJcbiAgcmVtb3ZlKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB0aGlzLl9tdXVyaS5yZW1vdmUoZWxlbWVudHMsIG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBlbmdsaXNoU3RyaW5ncyB9IGZyb20gXCIuL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIGxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgbG9jYWxlTmFtZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIHN1cHBvcnRlZExvY2FsZXM6IDxBcnJheTxhbnk+PltdLFxuICBnZXQgY3VycmVudExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPT09IHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlXG4gICAgICA/IFwiXCJcbiAgICAgIDogdGhpcy5jdXJyZW50TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBjdXJyZW50TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldCBkZWZhdWx0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGRlZmF1bHRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoc3RyTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2FsZVxuICAgICAgPyB0aGlzLmxvY2FsZXNbdGhpcy5jdXJyZW50TG9jYWxlXVxuICAgICAgOiB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICBpZiAoIWxvYyB8fCAhbG9jW3N0ck5hbWVdKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICB2YXIgcmVzdWx0ID0gbG9jW3N0ck5hbWVdO1xuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV0gfHwgc3RyTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24gKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5sb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+bG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJQW5zd2Vyc0RhdGEsIFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4XCIpO1xuICAgIHRoaXMuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbWF0cml4UXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbk1hdHJpeE1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gXCJcIiArIHJvdy52YWx1ZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMubWF0cml4UXVlc3Rpb24ucm93cywgcm93LnZhbHVlKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgKVswXTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj5cbiAgKTogQXJyYXk8Ym9vbGVhbj4ge1xuICAgIGxldCByZXN1bHQ6IEFycmF5PGJvb2xlYW4+ID0gQXJyYXk8Ym9vbGVhbj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRhdGFzZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChkYXRhc2V0c1tqXVtpXSAhPSAwKSB7XG4gICAgICAgICAgcmVzdWx0W2ldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5TZXJpZXMoZGF0YXNldDogQXJyYXk8YW55Pikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGRhdGFzZXRbaV0gIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQW5zd2Vyc0RhdGEgPSB7XG4gICAgICBkYXRhc2V0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgICB0ZXh0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgc2VyaWVzTGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyID0gdGhpcy5nZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICAgIGFuc3dlcnNEYXRhLmRhdGFzZXRzXG4gICAgKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBoYXNBbnN3ZXJzSW5TZXJpZXMgPSB0aGlzLmdldEhhc0Fuc3dlcnNJblNlcmllcyhcbiAgICAgICAgYW5zd2Vyc0RhdGEuZGF0YXNldHNbaV1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luU2VyaWVzKSB7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldHMgPSBbXTtcbiAgICAgIGNvbnN0IHRleHRzID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJbal0pIHtcbiAgICAgICAgICBkYXRhc2V0cy5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzW2ldW2pdKTtcbiAgICAgICAgICB0ZXh0cy5wdXNoKGFuc3dlcnNEYXRhLnRleHRzW2ldW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goZGF0YXNldHMpO1xuICAgICAgcmVzdWx0LnRleHRzLnB1c2godGV4dHMpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyW2ldKSB7XG4gICAgICAgIHJlc3VsdC5zZXJpZXNMYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldERhdGEoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAoc2VyaWVzTmFtZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICApO1xuICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsIFF1ZXN0aW9uLCBNYXRyaXhEcm9wZG93bkNvbHVtbiwgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElBbnN3ZXJzRGF0YSwgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duR3JvdXBlZCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhEcm9wZG93bkdyb3VwZWRcIik7XG4gICAgdGhpcy5nZXRBbnN3ZXJzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtYXRyaXhRdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwge1xuICAgIHJldHVybiA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi50aXRsZSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgLy8gICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gIC8vICAgKVswXTtcbiAgLy8gfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcChyb3cgPT4gcm93LnZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHtcbiAgICAgIG5hbWU6IHNlcmllcyxcbiAgICAgIGdldFZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0TGFiZWxzOiAoKSA9PiB2YWx1ZXMsXG4gICAgICBnZXRTZXJpZXNWYWx1ZXM6ICgpID0+IHJvd3MsXG4gICAgICBnZXRTZXJpZXNMYWJlbHM6ICgpID0+IHJvd3MsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bMF1bdmFsdWVJbmRleF1cbiAgICAgICk7XG4gICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyTW9kZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3Jlc3VsdEF2ZXJhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVzdWx0TWluOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1heDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RlcHNDb3VudCA9IDU7XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVUZXh0c0NhbGxiYWNrOiAoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBzdGVwc0NvdW50OiBudW1iZXIsXG4gICAgdGV4dHM6IHN0cmluZ1tdXG4gICkgPT4gc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNoYXJ0VHlwZTogU3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0FzUGVyY2VudGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJudW1iZXJcIik7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge31cblxuICBwcm90ZWN0ZWQgc2V0Q2hhcnRUeXBlKGNoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoY2hhcnRUeXBlKSAhPT0gLTEgJiZcbiAgICAgIHRoaXMuY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlID0gY2hhcnRUeXBlO1xuICAgICAgdGhpcy5vbkNoYXJ0VHlwZUNoYW5nZWQoKTtcbiAgICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNaW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWF4ID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdlbmVyYXRlVGV4dChtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBsZXQgdGV4dHM6IGFueSA9IFtdO1xuXG4gICAgaWYgKHN0ZXBzQ291bnQgPT09IDUpIHtcbiAgICAgIHRleHRzID0gW1xuICAgICAgICBcInZlcnkgaGlnaCAoXCIgKyBtYXhWYWx1ZSArIFwiKVwiLFxuICAgICAgICBcImhpZ2hcIixcbiAgICAgICAgXCJtZWRpdW1cIixcbiAgICAgICAgXCJsb3dcIixcbiAgICAgICAgXCJ2ZXJ5IGxvdyAoXCIgKyBtaW5WYWx1ZSArIFwiKVwiLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHMucHVzaChtYXhWYWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQgLSAyOyBpKyspIHtcbiAgICAgICAgdGV4dHMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRleHRzLnB1c2gobWluVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghIU51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIE51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjayhcbiAgICAgICAgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgbWF4VmFsdWUsXG4gICAgICAgIG1pblZhbHVlLFxuICAgICAgICBzdGVwc0NvdW50LFxuICAgICAgICB0ZXh0c1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dHM7XG4gIH1cblxuICBnZW5lcmF0ZVZhbHVlcyhtYXhWYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSAvIHN0ZXBzQ291bnQpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKG1heFZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZW5lcmF0ZUNvbG9ycyhtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaChwYWxldHRlW2ldKTtcbiAgICB9XG5cbiAgICBjb2xvcnMucHVzaChcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIik7XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0RGF0YSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5fcmVzdWx0TWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdE1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IDA7XG4gICAgICBsZXQgYWN0dWFsQW5zd2VyQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICBpZihyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWU6IG51bWJlciA9ICtyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICAgICAgYWN0dWFsQW5zd2VyQ291bnQrKztcbiAgICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlICs9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdE1pbiA+IHF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNYXggPCBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXggPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmKGFjdHVhbEFuc3dlckNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdGhpcy5fcmVzdWx0QXZlcmFnZSAvIGFjdHVhbEFuc3dlckNvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IE1hdGguY2VpbCh0aGlzLl9yZXN1bHRBdmVyYWdlICogMTAwKSAvIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLl9yZXN1bHRBdmVyYWdlLCB0aGlzLl9yZXN1bHRNaW4sIHRoaXMuX3Jlc3VsdE1heF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9ib29sZWFuXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Qm9vbENoYXJ0QWRhcHRlciBleHRlbmRzIFBsb3RseUNoYXJ0QWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBCb29sZWFuUGxvdGx5KSB7XG4gICAgc3VwZXIobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBib29sQ29sb3JzID0gW1xuICAgICAgQm9vbGVhblBsb3RseS50cnVlQ29sb3IgfHwgY29sb3JzWzBdLFxuICAgICAgQm9vbGVhblBsb3RseS5mYWxzZUNvbG9yIHx8IGNvbG9yc1sxXSxcbiAgICBdO1xuICAgIGlmKHRoaXMubW9kZWwuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBib29sQ29sb3JzLnB1c2goY29sb3JzWzJdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9ycyA9IGJvb2xDb2xvcnM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJhclwiKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2U6IGFueSkgPT4ge1xuICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuUGxvdGx5IGV4dGVuZHMgQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJwaWVcIiwgXCJiYXJcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEJvb2xlYW5QbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlCb29sQ2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImJvb2xlYW5cIiwgQm9vbGVhblBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEhpc3RvZ3JhbU1vZGVsIH0gZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVBsb3RseSBleHRlbmRzIEhpc3RvZ3JhbU1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJ2YmFyXCIsIFwiYmFyXCIsIFwic2NhdHRlclwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEhpc3RvZ3JhbVBsb3RseS50eXBlcztcbiAgICB0aGlzLl9jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICApO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSBzdXBlci5nZXREYXRhKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGlmIChzZXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzZXJpZXNEYXRhID0gc2VyaWVzLm1hcChcbiAgICAgICAgICAoc2VyaWVzVmFsdWUsIHNlcmllc0luZGV4KSA9PiBzdGF0aXN0aWNzW3Nlcmllc0luZGV4XVt2YWx1ZUluZGV4XVxuICAgICAgICApO1xuICAgICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZGF0ZVwiLCBIaXN0b2dyYW1QbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibnVtYmVyXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgSGlzdG9ncmFtUGxvdGx5KTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL3NldHVwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYXRyaXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jvb2xlYW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JhbmtpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hpc3RvZ3JhbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmF0aW5nXCI7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSBcIi4uL21hdHJpeFwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeFBsb3RseSBleHRlbmRzIE1hdHJpeCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wiYmFyXCIsIFwic3RhY2tlZGJhclwiLCBcInBpZVwiLCBcImRvdWdobnV0XCJdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSk7XG4gICAgdGhpcy5jaGFydFR5cGVzID0gTWF0cml4UGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIgPSBuZXcgUGxvdGx5Q2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtYXRyaXhcIiwgTWF0cml4UGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IE1hdHJpeERyb3Bkb3duR3JvdXBlZCB9IGZyb20gXCIuLi9tYXRyaXhEcm9wZG93bkdyb3VwZWRcIjtcbmltcG9ydCB7IFBsb3RseUNoYXJ0QWRhcHRlciB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkgZXh0ZW5kcyBNYXRyaXhEcm9wZG93bkdyb3VwZWQge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUNoYXJ0QWRhcHRlcjtcbiAgcHVibGljIHN0YXRpYyB0eXBlcyA9IFtcInN0YWNrZWRiYXJcIiwgXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkudHlwZXM7XG4gICAgdGhpcy5fY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm1hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIiwgTWF0cml4RHJvcGRvd25Hcm91cGVkUGxvdGx5KTtcbiIsImltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlUGxvdGx5IH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUmFua2luZ1Bsb3RseSBleHRlbmRzIFNlbGVjdEJhc2VQbG90bHkge1xuICBnZXRRdWVzdGlvblJlc3VsdHMoKSB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoZGF0YUl0ZW0pID0+IGRhdGFJdGVtW25hbWVdKTtcbiAgfVxuXG4gIGdldEVtcHR5RGF0YSgpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBsZXQgZGF0YTogYW55ID0gW107XG5cbiAgICBkYXRhLmxlbmd0aCA9IGNob2ljZXMubGVuZ3RoO1xuICAgIGRhdGEuZmlsbCgwKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0UXVlc3Rpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG5cbiAgICBsZXQgcGxvdGx5RGF0YSA9IHRoaXMuZ2V0RW1wdHlEYXRhKCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5hcHBseVJlc3VsdFRvUGxvdGx5RGF0YShyZXN1bHQsIHBsb3RseURhdGEsIGNob2ljZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtwbG90bHlEYXRhXTtcbiAgfVxuXG4gIGFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdDogYW55W10sIHBsb3RseURhdGE6IGFueSwgY2hvaWNlczogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQgfHwgIXBsb3RseURhdGEgfHwgIWNob2ljZXMpIHJldHVybjtcblxuICAgIHJlc3VsdC5mb3JFYWNoKChyZXN1bHRWYWx1ZTogYW55LCByZXN1bHRWYWx1ZUluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55W10pID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGNob2ljZXMuaW5kZXhPZihyZXN1bHRWYWx1ZSk7XG4gICAgICBwbG90bHlEYXRhW2luZGV4XSA9XG4gICAgICAgICtwbG90bHlEYXRhW2luZGV4XSArIChyZXN1bHQubGVuZ3RoIC0gcmVzdWx0VmFsdWVJbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFua2luZ1wiLCBSYW5raW5nUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBOdW1iZXJNb2RlbCB9IGZyb20gXCIuLi9udW1iZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBhbGxvd0RvbVJlbmRlcmluZywgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgUGxvdGx5IGZyb20gXCJwbG90bHkuanMtZGlzdC1taW5cIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUdhdWdlQWRhcHRlciB7XG4gIHByaXZhdGUgX2NoYXJ0OiBQcm9taXNlPFBsb3RseS5QbG90bHlIVE1MRWxlbWVudD4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogR2F1Z2VQbG90bHkpIHsgfVxuXG4gIHB1YmxpYyBnZXQgY2hhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShjaGFydE5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1vZGVsLnF1ZXN0aW9uO1xuICAgIGxldCBbbGV2ZWwsIG1pblZhbHVlLCBtYXhWYWx1ZV0gPSB0aGlzLm1vZGVsLmdldERhdGEoKTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwicmF0aW5nXCIpIHtcbiAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSAoPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb24pLnZpc2libGVSYXRlVmFsdWVzO1xuICAgICAgbWF4VmFsdWUgPSByYXRlVmFsdWVzW3JhdGVWYWx1ZXMubGVuZ3RoIC0gMV0udmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IHJhdGVWYWx1ZXNbMF0udmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZW5lcmF0ZUNvbG9ycyhcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBHYXVnZVBsb3RseS5zdGVwc0NvdW50XG4gICAgKTtcblxuICAgIGlmIChHYXVnZVBsb3RseS5zaG93QXNQZXJjZW50YWdlKSB7XG4gICAgICBsZXZlbCA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKGxldmVsLCBtYXhWYWx1ZSk7XG4gICAgICBtaW5WYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhWYWx1ZSA9IERhdGFIZWxwZXIudG9QZXJjZW50YWdlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGRhdGE6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbmRpY2F0b3JcIixcbiAgICAgICAgbW9kZTogXCJnYXVnZStudW1iZXJcIixcbiAgICAgICAgZ2F1Z2U6IHtcbiAgICAgICAgICBheGlzOiB7IHJhbmdlOiBbbWluVmFsdWUsIG1heFZhbHVlXSB9LFxuICAgICAgICAgIHNoYXBlOiB0aGlzLm1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgICAgICBiZ2NvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgYmFyOiB7IGNvbG9yOiBjb2xvcnNbMF0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGxldmVsLFxuICAgICAgICB0ZXh0OiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkb21haW46IHsgeDogWzAsIDFdLCB5OiBbMCwgMV0gfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNoYXJ0TWFyZ2luID0gdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiYnVsbGV0XCIgPyA2MCA6IDMwO1xuICAgIHZhciBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGhlaWdodDogMjUwLFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IGNoYXJ0TWFyZ2luLFxuICAgICAgICByOiBjaGFydE1hcmdpbixcbiAgICAgICAgYjogY2hhcnRNYXJnaW4sXG4gICAgICAgIHQ6IGNoYXJ0TWFyZ2luLFxuICAgICAgICBwYWQ6IDVcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRpc3BsYXlNb2RlQmFyOiB0cnVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICBkaXNwbGF5bG9nbzogZmFsc2UsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsIGFzIGFueSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAoPGFueT5QbG90bHkpLmRvd25sb2FkSW1hZ2UoZ2QsIG9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuXG4gICAgfTtcbiAgICBpZiAoR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmRpc3BsYXlNb2RlQmFyID0gR2F1Z2VQbG90bHkuZGlzcGxheU1vZGVCYXI7XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICB9O1xuICAgIFBsb3RseVNldHVwLm9uUGxvdENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gKDxhbnk+UGxvdGx5KS5uZXdQbG90KFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgb3B0aW9ucy5kYXRhLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUGxvdGx5IGV4dGVuZHMgTnVtYmVyTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUdhdWdlQWRhcHRlcjtcblxuICBwdWJsaWMgc3RhdGljIGRpc3BsYXlNb2RlQmFyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJnYXVnZVwiLCBcImJ1bGxldFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEdhdWdlUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlHYXVnZUFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBHYXVnZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZXhwcmVzc2lvblwiLCBHYXVnZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgYWxsb3dEb21SZW5kZXJpbmcsIERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IFBsb3RseSBmcm9tIFwicGxvdGx5LmpzLWRpc3QtbWluXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBwcml2YXRlIF9jaGFydDogUHJvbWlzZTxQbG90bHkuUGxvdGx5SFRNTEVsZW1lbnQ+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtb2RlbDogU2VsZWN0QmFzZSkgeyB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBwbG90bHlPcHRpb25zID0gUGxvdGx5U2V0dXAuc2V0dXAodGhpcy5tb2RlbC5jaGFydFR5cGUsIHRoaXMubW9kZWwpO1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgZGlzcGxheWxvZ286IGZhbHNlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIGxvY2FsZTogbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICg8YW55PlBsb3RseSkuZG93bmxvYWRJbWFnZShnZCwgb3B0aW9ucyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAoU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuZGlzcGxheU1vZGVCYXIgPSBTZWxlY3RCYXNlUGxvdGx5LmRpc3BsYXlNb2RlQmFyO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hDb25maWdQYXJhbWV0ZXJzKFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIHRyYWNlczogcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBsYXlvdXQ6IHBsb3RseU9wdGlvbnMubGF5b3V0LFxuICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgfTtcbiAgICBQbG90bHlTZXR1cC5vblBsb3RDcmVhdGluZy5maXJlKHRoaXMubW9kZWwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGxvdCA9ICg8YW55PlBsb3RseSkubmV3UGxvdChcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIG9wdGlvbnMudHJhY2VzLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG5cbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfY2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEucG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGl0ZW1UZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKCFwbG90bHlPcHRpb25zLmhhc1Nlcmllcykge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgICAgY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TGFiZWwgPSBkYXRhLnBvaW50c1swXS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZXMgPSB0aGlzLm1vZGVsLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMubW9kZWwuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNlcmllc1ZhbHVlc1tzZXJpZXNMYWJlbHMuaW5kZXhPZihwcm9wZXJ0eUxhYmVsKV07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB0aGlzLm1vZGVsLmdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtVmFsdWUoeyBbcHJvcGVydHlWYWx1ZV06IHNlbGVjdGVkSXRlbS52YWx1ZSB9LCBwcm9wZXJ0eUxhYmVsICsgXCI6IFwiICsgc2VsZWN0ZWRJdGVtLnRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3QgaXRlbVRleHQgPSBwbG90bHlPcHRpb25zLmhhc1Nlcmllc1xuICAgICAgICAvLyAgID8gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lXG4gICAgICAgIC8vICAgOiBBcnJheS5pc0FycmF5KGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGEpXG4gICAgICAgIC8vICAgICA/IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGFbMF1cbiAgICAgICAgLy8gICAgIDogZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YTtcbiAgICAgICAgLy8gY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBnZXREcmFnTGF5ZXIgPSAoKSA9PlxuICAgICAgPEhUTUxFbGVtZW50PmNoYXJ0Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibnNld2RyYWdcIilbMF07XG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2hvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCIpO1xuICAgIH0pO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV91bmhvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFydCA9IHBsb3Q7XG4gICAgcmV0dXJuIHBsb3Q7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VQbG90bHkgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcInNjYXR0ZXJcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheU1vZGVCYXI6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBbXS5jb25jYXQoU2VsZWN0QmFzZVBsb3RseS50eXBlcyk7XG4gICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgPT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZXMucHVzaChcInN0YWNrZWRiYXJcIik7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcykge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnNwbGljZSgxLCAwLCBcInZiYXJcIik7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICBpZiAodGhpcy5jaGFydFR5cGVzLmluZGV4T2Yob3B0aW9ucy5kZWZhdWx0Q2hhcnRUeXBlKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZTtcbiAgICB9XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNoZWNrYm94XCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFkaW9ncm91cFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImRyb3Bkb3duXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiaW1hZ2VwaWNrZXJcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0YWdib3hcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RseU9wdGlvbnMge1xuICB0cmFjZXM6IEFycmF5PGFueT47XG4gIGxheW91dDogYW55O1xuICBoYXNTZXJpZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlTZXR1cCB7XG4gIHB1YmxpYyBzdGF0aWMgaW1hZ2VFeHBvcnRGb3JtYXQgPSBcInBuZ1wiO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiBlbmQgdXNlciBjbGlja3Mgb24gdGhlICdzYXZlIGFzIGltYWdlJyBidXR0b24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uSW1hZ2VTYXZpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU2VsZWN0QmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgU2VsZWN0QmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyBiZWZvcmUgcGxvdCB3aWxsIGJlIGNyZWF0ZWQuIFVzZXIgY2FuIGNoYW5nZSB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKiBPcHRpb25zIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvblBsb3RDcmVhdGluZyA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBzdGF0aWMgc2V0dXBzOiB7IFt0eXBlOiBzdHJpbmddOiAobW9kZWw6IFNlbGVjdEJhc2UpID0+IFBsb3RseU9wdGlvbnMgfSA9IHtcbiAgICBiYXI6IFBsb3RseVNldHVwLnNldHVwQmFyLFxuICAgIHZiYXI6IFBsb3RseVNldHVwLnNldHVwVkJhcixcbiAgICBzdGFja2VkYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICBkb3VnaG51dDogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgcGllOiBQbG90bHlTZXR1cC5zZXR1cFBpZSxcbiAgICBzY2F0dGVyOiBQbG90bHlTZXR1cC5zZXR1cFNjYXR0ZXIsXG4gIH07XG5cbiAgc3RhdGljIHNldHVwKGNoYXJUeXBlOiBzdHJpbmcsIG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dXBzW2NoYXJUeXBlXShtb2RlbCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHJ1bmNhdGVkTGFiZWwgPSAobGFiZWw6IHN0cmluZywgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzID0gXCIuLi5cIjtcbiAgICBjb25zdCB0cnVuY2F0ZVN5bWJvbHNMZW5ndGggPSB0cnVuY2F0ZVN5bWJvbHMubGVuZ3RoO1xuXG4gICAgaWYgKCFsYWJlbFRydW5jYXRlTGVuZ3RoKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsVHJ1bmNhdGVMZW5ndGggPT09IC0xKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA8PSBsYWJlbFRydW5jYXRlTGVuZ3RoICsgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoKVxuICAgICAgcmV0dXJuIGxhYmVsO1xuXG4gICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBsYWJlbFRydW5jYXRlTGVuZ3RoKSArIHRydW5jYXRlU3ltYm9scztcbiAgfTtcblxuICBzdGF0aWMgc2V0dXBQaWUobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGxldCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcblxuICAgIGNvbnN0IHRyYWNlQ29uZmlnOiBhbnkgPSB7XG4gICAgICB0eXBlOiBtb2RlbC5jaGFydFR5cGUsXG4gICAgICB5OiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICB0ZXh0OiAoaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzKS5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcblxuICAgIHRyYWNlQ29uZmlnLmhvdmVyaW5mbyA9IFwibGFiZWwrdmFsdWUrcGVyY2VudFwiO1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvcnMgPSBjb2xvcnM7XG4gICAgdHJhY2VDb25maWcudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcblxuICAgIGlmIChtb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VDb25maWcudHlwZSA9IFwicGllXCI7XG4gICAgICB0cmFjZUNvbmZpZy5ob2xlID0gMC40O1xuICAgIH1cblxuICAgIGlmICghaGFzU2VyaWVzKSB7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc3ltYm9sID0gXCJjaXJjbGVcIjtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zaXplID0gMTY7XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdHJhY2VzLnB1c2goXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgICAgdmFsdWVzOiBkYXRhc2V0LFxuICAgICAgICAgIGxhYmVsczogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgcmFkaXVzID0gbGFiZWxzLmxlbmd0aCA8IDEwID8gbGFiZWxzLmxlbmd0aCAqIDUwICsgMTAwIDogNTUwO1xuICAgIGNvbnN0IGhlaWdodCA9IHJhZGl1cyAqIE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpICsgMjU7XG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgbDogMCxcbiAgICAgICAgdDogMjUsXG4gICAgICAgIGI6IDAsXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LmFubm90YXRpb25zID0gW107XG4gICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0udGl0bGUgPSB7IHBvc2l0aW9uOiBcImJvdHRvbSBjZW50ZXJcIiwgdGV4dDogbGFiZWwgfTtcbiAgICAgIH0pO1xuICAgICAgdHJhY2VzID0gdHJhY2VzLmZpbHRlcih0ID0+ICEodC52YWx1ZXMubGVuZ3RoID09PSAxICYmIHQudmFsdWVzWzBdID09PSAwKSk7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0uZG9tYWluID0ge1xuICAgICAgICAgIGNvbHVtbjogaW5kZXggJSAyLFxuICAgICAgICAgIHJvdzogTWF0aC5mbG9vcihpbmRleCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBsYXlvdXQuZ3JpZCA9IHtcbiAgICAgICAgcm93czogTWF0aC5yb3VuZCh0cmFjZXMubGVuZ3RoIC8gMiksXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICB9O1xuICAgICAgbGF5b3V0LmhlaWdodCA9IHJhZGl1cyAqIE1hdGgucm91bmQodHJhY2VzLmxlbmd0aCAvIDIpICsgMjU7XG4gICAgfVxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cEJhcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCBsaW5lSGVpZ2h0ID0gMzA7XG4gICAgbGV0IHRvcE1hcmdpbiA9IDMwO1xuICAgIGxldCBib3R0b21NYXJnaW4gPSAzMDtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDEgfHwgbW9kZWwucXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1hdHJpeFwiO1xuICAgIGNvbnN0IHlGdWxsVGV4dHMgPSBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHM7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogeUZ1bGxUZXh0cyxcbiAgICAgIHRleHQ6IHlGdWxsVGV4dHMsXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwidGV4dFwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB0ZXh0cG9zaXRpb246IFwibm9uZVwiLFxuICAgICAgd2lkdGg6IDAuNSxcbiAgICAgIGJhcmdhcDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG4gICAgdHJhY2VDb25maWcubWFya2VyLmNvbG9yID0gY29sb3JzO1xuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgeDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgICBob3ZlcnRleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nLCBsYWJlbEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbaW5kZXhdW2xhYmVsSW5kZXhdfSwgJHtsYWJlbH1gO1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcykge1xuICAgICAgICBsZXQgdGV4dHRlbXBsYXRlID0gbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IFwiJXt0ZXh0fSVcIiA6IFwiJXt2YWx1ZX0gKCV7dGV4dH0lKVwiO1xuICAgICAgICB0cmFjZS50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuICAgICAgICB0cmFjZS50ZXh0dGVtcGxhdGUgPSB0ZXh0dGVtcGxhdGU7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhlaWdodCA9IChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luO1xuXG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBvcmllbnRhdGlvbjogXCJoXCIsXG4gICAgICAgIHRpY2ttb2RlOiBcImFycmF5XCIsXG4gICAgICAgIHRpY2t2YWxzOiB5RnVsbFRleHRzLFxuICAgICAgICB0aWNrdGV4dDogeUZ1bGxUZXh0cy5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgICApICsgXCIgIFwiO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICB4YXhpczoge1xuICAgICAgICByYW5nZW1vZGU6IFwibm9ubmVnYXRpdmVcIixcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgLy8gZHRpY2s6IDFcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoaGFzU2VyaWVzKSB7XG4gICAgICBsYXlvdXQuc2hvd2xlZ2VuZCA9IHRydWU7XG4gICAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgIGxheW91dC5iYXJtb2RlID0gXCJzdGFja1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0LmhlaWdodCA9XG4gICAgICAgICAgKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKiBzZXJpZXNMYWJlbHMubGVuZ3RoICtcbiAgICAgICAgICB0b3BNYXJnaW4gK1xuICAgICAgICAgIGJvdHRvbU1hcmdpbjtcbiAgICAgIH1cblxuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG5cbiAgICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJzdGFja2VkYmFyXCIpIHtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLnR5cGUgPSBcImJhclwiO1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS53aWR0aCA9XG4gICAgICAgICAgICAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gMC43IDogMC41KSAvIHRyYWNlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2UsIHRyYWNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyY2VudFN0cmluZyA9IG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IFwiJVwiIDogXCJcIjtcbiAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dCA9IFtdO1xuICAgICAgICB5RnVsbFRleHRzLmZvckVhY2goKHlGdWxsVGV4dCwgeUZ1bGxUZXh0SW5kZXgpID0+IHtcbiAgICAgICAgICB0cmFjZXNbdHJhY2VJbmRleF0uaG92ZXJ0ZXh0LnB1c2goYCR7dHJhY2UueVt5RnVsbFRleHRJbmRleF19IDogJHt0cmFjZS5uYW1lfSwgJHt0cmFjZS50ZXh0W3lGdWxsVGV4dEluZGV4XX0ke3BlcmNlbnRTdHJpbmd9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwVkJhcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxIHx8IG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJtYXRyaXhcIjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGxhYmVscyxcbiAgICAgICAgeTogbW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gdGV4dHNbaW5kZXhdLm1hcCh5ID0+IHkgLyAxMDApIDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgfSk7XG4gICAgICBpZiAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzKSB7XG4gICAgICAgIGxldCB0ZXh0dGVtcGxhdGUgPSBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gXCIle3RleHR9JVwiIDogXCIle3ZhbHVlfSAoJXt0ZXh0fSUpXCI7XG4gICAgICAgIHRyYWNlLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG4gICAgICAgIHRyYWNlLnRleHR0ZW1wbGF0ZSA9IHRleHR0ZW1wbGF0ZTtcbiAgICAgICAgdHJhY2Uud2lkdGggPSAwLjk7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMgJiYgbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcykge1xuICAgICAgbGF5b3V0LnlheGlzID0ge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0aWNrZm9ybWF0OiBcIi4wJVwiLFxuICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICB0aWNrbGVuOiBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gMjUgOiA1LFxuICAgICAgICB0aWNrY29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwU2NhdHRlcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCBsaW5lSGVpZ2h0ID0gMzA7XG4gICAgbGV0IHRvcE1hcmdpbiA9IDMwO1xuICAgIGxldCBib3R0b21NYXJnaW4gPSAzMDtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMSB8fCBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibWF0cml4XCI7XG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcblxuICAgIGNvbnN0IHRyYWNlQ29uZmlnOiBhbnkgPSB7XG4gICAgICB0eXBlOiBcInNjYXR0ZXJcIixcbiAgICAgIHk6IChoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMpLm1hcCgobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbW9kZWwubGFiZWxUcnVuY2F0ZUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICB0ZXh0OiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwieCt5XCIsXG4gICAgICBvcmllbnRhdGlvbjogXCJoXCIsXG4gICAgICBtb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBtYXJrZXI6IDxhbnk+e30sXG4gICAgfTtcblxuICAgIGlmICghaGFzU2VyaWVzKSB7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc3ltYm9sID0gXCJjaXJjbGVcIjtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zaXplID0gMTY7XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPikgPT4ge1xuICAgICAge1xuICAgICAgICB2YXIgdHJhY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICAgIHg6IGRhdGFzZXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWlnaHQgPSAobGFiZWxzLmxlbmd0aCArIDEpICogbGluZUhlaWdodCArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgdGlja2xlbjogNSxcbiAgICAgICAgdGlja2NvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB9LFxuICAgICAgeGF4aXM6IHtcbiAgICAgICAgcmFuZ2Vtb2RlOiBcIm5vbm5lZ2F0aXZlXCIsXG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICB9LFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LnNob3dsZWdlbmQgPSB0cnVlO1xuICAgICAgbGF5b3V0LmhlaWdodCA9IHVuZGVmaW5lZDtcblxuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLmhvdmVyaW5mbyA9IFwieCtuYW1lXCI7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubWFya2VyLmNvbG9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm5hbWUgPSBsYWJlbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cbn0iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25TZWxlY3RCYXNlLCBJdGVtVmFsdWUsIEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBEYXRhSGVscGVyLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzL2luZGV4XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIHtcbiAgc2VsZWN0aW9uOiBJdGVtVmFsdWU7XG4gIG9uRGF0YUl0ZW1TZWxlY3RlZDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbnN3ZXJzRGF0YSB7XG4gIGRhdGFzZXRzOiBBcnJheTxBcnJheTxhbnk+PjtcbiAgbGFiZWxzOiBBcnJheTxzdHJpbmc+O1xuICBjb2xvcnM6IEFycmF5PHN0cmluZz47XG4gIHRleHRzOiBBcnJheTxBcnJheTxhbnk+PjtcbiAgc2VyaWVzTGFiZWxzOiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YTogSUFuc3dlcnNEYXRhKTogSUFuc3dlcnNEYXRhIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGRhdGFzZXRzOiA8QXJyYXk8YW55Pj5bXSxcbiAgICBsYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgdGV4dHM6IDxBcnJheTxhbnk+PltdLFxuICAgIHNlcmllc0xhYmVsczogPEFycmF5PGFueT4+W10sXG4gIH07XG4gIGlmKGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuZGF0YXNldHMucHVzaChbXSk7XG4gICAgcmVzdWx0LnRleHRzLnB1c2goW10pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXVtpXSAhPSAwKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhc2V0c1swXS5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdW2ldKTtcbiAgICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1tpXSk7XG4gICAgICAgIHJlc3VsdC5jb2xvcnMucHVzaChhbnN3ZXJzRGF0YS5jb2xvcnNbaV0pO1xuICAgICAgICByZXN1bHQudGV4dHNbMF0ucHVzaChhbnN3ZXJzRGF0YS50ZXh0c1swXVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3Qgc2VyaWVzRGF0YUV4aXN0ZW5jZSA9IDxBcnJheTxib29sZWFuPj5bXTtcbiAgc2VyaWVzRGF0YUV4aXN0ZW5jZS5sZW5ndGggPSBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMubGVuZ3RoO1xuICBjb25zdCB2YWx1ZXNEYXRhRXhpc3RlbmNlID0gPEFycmF5PGJvb2xlYW4+PltdO1xuICB2YWx1ZXNEYXRhRXhpc3RlbmNlLmxlbmd0aCA9IGFuc3dlcnNEYXRhLmxhYmVscy5sZW5ndGg7XG4gIGZvciAodmFyIHZhbHVlSW5kZXggPSAwOyB2YWx1ZUluZGV4IDwgYW5zd2Vyc0RhdGEubGFiZWxzLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7XG4gICAgZm9yICh2YXIgc2VyaWVzSW5kZXggPSAwOyBzZXJpZXNJbmRleCA8IGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICAgIGlmIChhbnN3ZXJzRGF0YS5kYXRhc2V0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0gIT0gMCkge1xuICAgICAgICBzZXJpZXNEYXRhRXhpc3RlbmNlW3Nlcmllc0luZGV4XSA9IHRydWU7XG4gICAgICAgIHZhbHVlc0RhdGFFeGlzdGVuY2VbdmFsdWVJbmRleF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciB2YWx1ZUluZGV4ID0gMDsgdmFsdWVJbmRleCA8IHZhbHVlc0RhdGFFeGlzdGVuY2UubGVuZ3RoOyB2YWx1ZUluZGV4KyspIHtcbiAgICBpZiAodmFsdWVzRGF0YUV4aXN0ZW5jZVt2YWx1ZUluZGV4XSkge1xuICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1t2YWx1ZUluZGV4XSk7XG4gICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW3ZhbHVlSW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgc2VyaWVzSW5kZXggPSAwOyBzZXJpZXNJbmRleCA8IGFuc3dlcnNEYXRhLnNlcmllc0xhYmVscy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICBpZiAoc2VyaWVzRGF0YUV4aXN0ZW5jZVtzZXJpZXNJbmRleF0pIHtcbiAgICAgIHJlc3VsdC5zZXJpZXNMYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHNbc2VyaWVzSW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgdmFsdWVJbmRleCA9IDA7IHZhbHVlSW5kZXggPCBhbnN3ZXJzRGF0YS5sYWJlbHMubGVuZ3RoOyB2YWx1ZUluZGV4KyspIHtcbiAgICBpZiAodmFsdWVzRGF0YUV4aXN0ZW5jZVt2YWx1ZUluZGV4XSkge1xuICAgICAgY29uc3QgZGF0YXNldCA9IFtdO1xuICAgICAgY29uc3QgdGV4dHMgPSBbXTtcbiAgICAgIGZvciAodmFyIHNlcmllc0luZGV4ID0gMDsgc2VyaWVzSW5kZXggPCBhbnN3ZXJzRGF0YS5kYXRhc2V0cy5sZW5ndGg7IHNlcmllc0luZGV4KyspIHtcbiAgICAgICAgaWYgKHNlcmllc0RhdGFFeGlzdGVuY2Vbc2VyaWVzSW5kZXhdKSB7XG4gICAgICAgICAgZGF0YXNldC5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzW3ZhbHVlSW5kZXhdW3Nlcmllc0luZGV4XSk7XG4gICAgICAgICAgdGV4dHMucHVzaChhbnN3ZXJzRGF0YS50ZXh0c1t2YWx1ZUluZGV4XVtzZXJpZXNJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQuZGF0YXNldHMucHVzaChkYXRhc2V0KTtcbiAgICAgIHJlc3VsdC50ZXh0cy5wdXNoKHRleHRzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VcbiAgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZVxuICBpbXBsZW1lbnRzIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHByb3RlY3RlZCBzZWxlY3RlZEl0ZW06IEl0ZW1WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjaG9pY2VzT3JkZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hvd1BlcmNlbnRhZ2VCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGVtcHR5QW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdHJhbnNwb3NlRGF0YUJ0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdG9wTlNlbGVjdG9yOiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2hvd1BlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dPbmx5UGVyY2VudGFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcGVyY2VudGFnZVByZWNpc2lvbjogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIF9hbnN3ZXJzT3JkZXI6IHN0cmluZyA9IFwiZGVmYXVsdFwiO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9oaWRlRW1wdHlBbnN3ZXJzID0gZmFsc2U7XG4gIHByaXZhdGUgX3RvcE4gPSAtMTtcbiAgcHVibGljIHN0YXRpYyB0b3BOVmFsdWVzRGVmYXVsdHMgPSBbLTEsIDUsIDEwLCAyMF07XG4gIHB1YmxpYyB0b3BOVmFsdWVzID0gW10uY29uY2F0KFNlbGVjdEJhc2UudG9wTlZhbHVlc0RlZmF1bHRzKTtcbiAgcHJpdmF0ZSBfdHJhbnNwb3NlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93TWlzc2luZ0Fuc3dlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaXNzaW5nQW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IGFueSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwic2VsZWN0QmFzZVwiKTtcbiAgICAoPGFueT5xdWVzdGlvbikudmlzaWJsZUNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCgpO1xuICAgIH07XG4gICAgdGhpcy5fc2hvd1BlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dQZXJjZW50YWdlcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dPbmx5UGVyY2VudGFnZXMgPT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb24pIHtcbiAgICAgIHRoaXMuX3BlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLm9wdGlvbnMucGVyY2VudGFnZVByZWNpc2lvbjtcbiAgICB9XG5cbiAgICB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzID0gdGhpcy5vcHRpb25zLmhpZGVFbXB0eUFuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5fYW5zd2Vyc09yZGVyID0gdGhpcy5vcHRpb25zLmFuc3dlcnNPcmRlciB8fCBcImRlZmF1bHRcIjtcbiAgICB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnMgPSB0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLnNob3dNaXNzaW5nQW5zd2VycyA9PT0gdHJ1ZTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VDaGFydFR5cGVcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMubWFwKChjaGFydFR5cGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBjaGFydFR5cGUsXG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaGFydFR5cGVfXCIgKyBjaGFydFR5cGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMuY2hhcnRUeXBlID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgICAgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDaGFydFR5cGUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUFuc3dlcnNPcmRlclwiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0NoYW5nZUFuc3dlcnNPcmRlcikgJiZcbiAgICAgICAgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVmYXVsdE9yZGVyXCIpLCB2YWx1ZTogXCJkZWZhdWx0XCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFzY09yZGVyXCIpLCB2YWx1ZTogXCJhc2NcIiB9LFxuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVzY09yZGVyXCIpLCB2YWx1ZTogXCJkZXNjXCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIChvcHRpb24pID0+IGZhbHNlLFxuICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFuc3dlcnNPcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93UGVyY2VudGFnZXNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dTaG93UGVyY2VudGFnZXMgJiZcbiAgICAgICAgKHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwiYmFyXCIpICE9PSAtMSB8fFxuICAgICAgICAgIHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwic3RhY2tlZGJhclwiKSAhPT0gLTEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZXMgPSAhdGhpcy5zaG93UGVyY2VudGFnZXM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dQZXJjZW50YWdlQnRuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImhpZGVFbXB0eUFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0hpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZUVtcHR5QW5zd2VycyA9ICF0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVFbXB0eUFuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVtcHR5QW5zd2Vyc0J0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0b3BOQW5zd2Vyc1wiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1RvcE5BbnN3ZXJzICYmXG4gICAgICAgIHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50b3BOU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLnRvcE5WYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInRvcE5WYWx1ZVRleHRcIiArIHZhbHVlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b3BOID0gcGFyc2VJbnQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRvcE5TZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0cmFuc3Bvc2VEYXRhXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dUcmFuc3Bvc2VEYXRhKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhID0gIXRoaXMudHJhbnNwb3NlRGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3NlRGF0YUJ0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93TWlzc2luZ0Fuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQW5zd2Vyc0J0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMgPSAhdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9jaGFydFR5cGU6IHN0cmluZyA9IFwiYmFyXCI7XG4gIC8qKlxuICAgKiBDaGFydCB0eXBlIC0gY3VycmVudCBjaGFydCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBjaGFydFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhcnRUeXBlO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hhcnRUeXBlKG5ld0NoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRDaGFydFR5cGUobmV3Q2hhcnRUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCkge1xuICAgIGlmICghIXRoaXMuZW1wdHlBbnN3ZXJzQnRuKSB7XG4gICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5pbm5lclRleHQgPSB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dFbXB0eUFuc3dlcnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZUVtcHR5QW5zd2Vyc1wiKTtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZSA9PSBcImJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwidmJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwic2NhdHRlclwiKSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpIHtcbiAgICBpZiAoISF0aGlzLnRyYW5zcG9zZURhdGFCdG4pIHtcbiAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5pbm5lclRleHQgPSB0aGlzLnRyYW5zcG9zZURhdGFcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlckNvbHVtbnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd1BlclZhbHVlc1wiKTtcbiAgICAgIGlmICh0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU9yZGVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvcikge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcImJhclwiIHx8XG4gICAgICAgIHRoaXMuY2hhcnRUeXBlID09IFwidmJhclwiIHx8XG4gICAgICAgIHRoaXMuY2hhcnRUeXBlID09IFwic2NhdHRlclwiIHx8XG4gICAgICAgICgodGhpcy5jaGFydFR5cGUgPT0gXCJwaWVcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcImRvdWdobnV0XCIpICYmXG4gICAgICAgICAgdGhpcy50b3BOID4gMClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1mbGV4XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICAgIFwic2VsZWN0XCJcbiAgICAgIClbMF0udmFsdWUgPSB0aGlzLmFuc3dlcnNPcmRlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCkge1xuICAgIGlmICghIXRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4pIHtcbiAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uaW5uZXJUZXh0ID0gdGhpcy5fc2hvd1BlcmNlbnRhZ2VzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVQZXJjZW50YWdlc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93UGVyY2VudGFnZXNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb3BOU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy50b3BOU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudG9wTlNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2VsZWN0XCIpWzBdLnZhbHVlID0gPGFueT4oXG4gICAgICAgIHRoaXMuX3RvcE5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuKSB7XG4gICAgICB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuLmlubmVyVGV4dCA9IHRoaXMuX3Nob3dNaXNzaW5nQW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlTWlzc2luZ0Fuc3dlcnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNoYXJ0VHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDaGFydFR5cGUoY2hhcnRUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihjaGFydFR5cGUpICE9PSAtMSAmJlxuICAgICAgdGhpcy5fY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuX2NoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gc3VwZXIuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvcnJlY3RBbnN3ZXJWYWx1ZSkgPyBjb3JyZWN0QW5zd2VyVmFsdWUgOiBbY29ycmVjdEFuc3dlclZhbHVlXTtcbiAgICBjb25zdCBzZWxlY3RCYXNlUXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZTtcbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHNlbGVjdEJhc2VRdWVzdGlvbi5jaG9pY2VzLCB2YWx1ZSkpLmpvaW4oXCIsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgJiYgaXRlbVRleHQgPT0gc2VsQmFzZS5vdGhlclRleHQpIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLm90aGVySXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbEJhc2UuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4gY2hvaWNlLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgICApWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25EYXRhSXRlbVNlbGVjdGVkKFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbSAhPT0gdW5kZWZpbmVkID8gaXRlbS50ZXh0IDogXCJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgcGVyY2VudGFnZXMgb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09ubHlQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd09ubHlQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgY2hhcnQgc2hvdWxkIHNob3cgdmFsdWVzIGFuZCBwZXJjZW50YWdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BlcmNlbnRhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGVyY2VudGFnZXMgPSB2YWw7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuZCBzZXRzIGNoYXJ0IGVsZW1lbnRzIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBhbnN3ZXJzT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fuc3dlcnNPcmRlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYW5zd2Vyc09yZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hbnN3ZXJzT3JkZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgbmVlZCB0byBoaWRlIGVtcHR5IGNoYXJ0IGVsZW1lbnRzIChlLmcuIGJhcnMgdml0aCB6ZXJvIHZhbHVlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZUVtcHR5QW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaGlkZUVtcHR5QW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVFbXB0eUFuc3dlcnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNwb3NlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3NlRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdHJhbnNwb3NlRGF0YSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3RyYW5zcG9zZURhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIHNvbWUgdmFsdWUgaWYgbmVlZCB0byBzaG93IHRvcCBOIGNoYXJ0IGVsZW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldCB0b3BOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvcE47XG4gIH1cblxuICBwdWJsaWMgc2V0IHRvcE4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RvcE4gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRvcE5TZWxlY3RvcigpO1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzZWUgY2hhcnQgZWxlbWVudHMgZm9yIG1pc3NpbmcgYW5zd2VycyAoZS5nLiByYWRpb2dyb3VwIGl0ZW1zIG5ldmVyIGJlZW4gc2VsZWN0ZWQgYnkgc3VydmV5ZWUpLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TWlzc2luZ0Fuc3dlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd01pc3NpbmdBbnN3ZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHZhbHVlO1xuICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCh0aGlzKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICByZWZyZXNoQ29udGVudCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gIH1cblxuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIGdldCBzaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2hvd1ZhbHVlc0luT3JpZ2luYWxPcmRlciAhPT0gZmFsc2U7XG4gIH1cblxuICB2YWx1ZXNTb3VyY2UoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgbGV0IHF1ZXN0aW9uID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmKCEhcXVlc3Rpb24uY2hvaWNlc0Zyb21RdWVzdGlvbiAmJiAhIXF1ZXN0aW9uLnN1cnZleSkge1xuICAgICAgcXVlc3Rpb24gPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnF1ZXN0aW9uLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbi5jaG9pY2VzRnJvbVF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uW1wiYWN0aXZlQ2hvaWNlc1wiXTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PGFueT4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcChcbiAgICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZVxuICAgICk7XG5cbiAgICBpZiAoKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikuaGFzTm9uZSkge1xuICAgICAgdmFsdWVzLnB1c2goKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikubm9uZUl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNPdGhlcikge1xuICAgICAgdmFsdWVzLnB1c2goXCJvdGhlclwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICB2YWx1ZXMudW5zaGlmdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWVzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVZhbHVlc0FzTGFiZWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWxzOiBBcnJheTxzdHJpbmc+ID0gdGhpcy52YWx1ZXNTb3VyY2UoKS5tYXAoKGNob2ljZSkgPT5cbiAgICAgIEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnZhbHVlc1NvdXJjZSgpLCBjaG9pY2UudmFsdWUpXG4gICAgKTtcbiAgICBjb25zdCBzZWxCYXNlID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmIChzZWxCYXNlLmhhc05vbmUpIHtcbiAgICAgIGxhYmVscy5wdXNoKHNlbEJhc2Uubm9uZVRleHQpO1xuICAgIH1cbiAgICBpZiAoc2VsQmFzZS5oYXNPdGhlcikge1xuICAgICAgbGFiZWxzLnB1c2goc2VsQmFzZS5vdGhlclRleHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIGxhYmVscy51bnNoaWZ0KGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaXNzaW5nQW5zd2Vyc0xhYmVsXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1ZhbHVlc0luT3JpZ2luYWxPcmRlcikge1xuICAgICAgcmV0dXJuIGxhYmVscy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlcygpOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG4gICAgdmFyIGRhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gdGhpcy5nZXREYXRhKCk7XG4gICAgdmFyIHBlcmNlbnRhZ2VzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhciBwZXJjZW50YWdlUHJlY2lzaW9uID0gdGhpcy5fcGVyY2VudGFnZVByZWNpc2lvbjtcblxuICAgIGlmIChkYXRhLmxlbmd0aCA8IDIpIHtcbiAgICAgIGRhdGEuZm9yRWFjaCgocmVzLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgc3VtID0gcmVzLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCk7XG4gICAgICAgIHBlcmNlbnRhZ2VzW2luZGV4XSA9IHJlcy5tYXAoKHZhbCkgPT4ge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHBlcmNlbnRhZ2VQcmVjaXNpb24gPyArKHZhbCAvIHN1bSkudG9GaXhlZChwZXJjZW50YWdlUHJlY2lzaW9uKSA6IE1hdGgucm91bmQoKHZhbCAvIHN1bSkgKiAxMDAwMCk7XG4gICAgICAgICAgcmV0dXJuIHN1bSAmJiAodmFsdWUgLyAxMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHN1bSArPSBkYXRhW2pdW2ldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwZXJjZW50YWdlc1tqXSkpIHBlcmNlbnRhZ2VzW2pdID0gW107XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGVyY2VudGFnZVByZWNpc2lvbiA/ICsoKGRhdGFbal1baV0gLyBzdW0pICogMTAwKS50b0ZpeGVkKHBlcmNlbnRhZ2VQcmVjaXNpb24pIDogTWF0aC5yb3VuZCgoZGF0YVtqXVtpXSAvIHN1bSkgKiAxMDApO1xuICAgICAgICAgIHBlcmNlbnRhZ2VzW2pdW2ldID0gc3VtICYmIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJjZW50YWdlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBhbnN3ZXJzRGF0YVJlYWR5KGFuc3dlcnNEYXRhOiBJQW5zd2Vyc0RhdGEpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5oaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICByZXN1bHQgPSBoaWRlRW1wdHlBbnN3ZXJzSW5EYXRhKGFuc3dlcnNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYW5zd2Vyc0RhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvcE4gPiAwKSB7XG4gICAgICByZXN1bHQuZGF0YXNldHNbMF0gPSByZXN1bHQuZGF0YXNldHNbMF0uc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQubGFiZWxzID0gcmVzdWx0LmxhYmVscy5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC5jb2xvcnMgPSByZXN1bHQuY29sb3JzLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LnRleHRzWzBdID0gcmVzdWx0LnRleHRzWzBdLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYW5zd2VyIGRhdGEgaGFzIGJlZW4gY29tYmluZWQgYmVmb3JlIHRoZXkgcGFzc2VkIHRvIGRyYXcgZ3JhcGguXG4gICAqIG9wdGlvbnMgLSB0aGUgYW5zd2VycyBkYXRhIG9iamVjdCBjb250YWluaW5nOiBkYXRhc2V0cywgbGFiZWxzLCBjb2xvcnMsIGFkZGl0aW9uYWwgdGV4dHMgKHBlcmNlbnRhZ2UpLlxuICAgKiBvcHRpb25zIGZpZWxkcyBjYW4gYmUgbW9kaWZpZWRcbiAgICovXG4gIHB1YmxpYyBvbkFuc3dlcnNEYXRhUmVhZHkgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU2VsZWN0QmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgU2VsZWN0QmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9iamVjdCB3aXRoIGFsbCBpbmZvdG1hdGlvbiBmb3IgZGF0YSB2aXN1YWxpemF0aW9uOiBkYXRhc2V0cywgbGFiZWxzLCBjb2xvcnMsIGFkZGl0aW9uYWwgdGV4dHMgKHBlcmNlbnRhZ2UpLlxuICAgKi9cbiAgcHVibGljIGdldEFuc3dlcnNEYXRhKCk6IElBbnN3ZXJzRGF0YSB7XG4gICAgbGV0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgbGV0IGRhdGFzZXRzID0gdGhpcy5nZXREYXRhKCk7XG4gICAgbGV0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgbGV0IGNvbG9ycyA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgdmFyIHRleHRzID0gdGhpcy5zaG93UGVyY2VudGFnZXMgPyB0aGlzLmdldFBlcmNlbnRhZ2VzKCkgOiBkYXRhc2V0cztcblxuICAgIGlmICh0aGlzLnRyYW5zcG9zZURhdGEpIHtcbiAgICAgIGRhdGFzZXRzID0gdGhpcy50cmFuc3Bvc2UoZGF0YXNldHMpO1xuICAgICAgdGV4dHMgPSB0aGlzLnRyYW5zcG9zZSh0ZXh0cyk7XG4gICAgICBjb25zdCB0ZW1wID0gc2VyaWVzTGFiZWxzO1xuICAgICAgc2VyaWVzTGFiZWxzID0gbGFiZWxzO1xuICAgICAgbGFiZWxzID0gdGVtcDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJhc2NcIiB8fCB0aGlzLmFuc3dlcnNPcmRlciA9PSBcImRlc2NcIikge1xuICAgICAgdmFyIHppcHBlZEFycmF5ID0gdGhpcy5zaG93UGVyY2VudGFnZXNcbiAgICAgICAgPyBEYXRhSGVscGVyLnppcEFycmF5cyhsYWJlbHMsIGNvbG9ycywgdGV4dHNbMF0pXG4gICAgICAgIDogRGF0YUhlbHBlci56aXBBcnJheXMobGFiZWxzLCBjb2xvcnMpO1xuICAgICAgbGV0IGRpY3QgPSBEYXRhSGVscGVyLnNvcnREaWN0aW9uYXJ5KFxuICAgICAgICB6aXBwZWRBcnJheSxcbiAgICAgICAgZGF0YXNldHNbMF0sXG4gICAgICAgIHRoaXMuYW5zd2Vyc09yZGVyID09IFwiZGVzY1wiXG4gICAgICApO1xuICAgICAgbGV0IHVuemlwcGVkQXJyYXkgPSBEYXRhSGVscGVyLnVuemlwQXJyYXlzKGRpY3Qua2V5cyk7XG4gICAgICBsYWJlbHMgPSB1bnppcHBlZEFycmF5WzBdO1xuICAgICAgY29sb3JzID0gdW56aXBwZWRBcnJheVsxXTtcbiAgICAgIGlmICh0aGlzLnNob3dQZXJjZW50YWdlcykgdGV4dHNbMF0gPSB1bnppcHBlZEFycmF5WzJdO1xuICAgICAgZGF0YXNldHNbMF0gPSBkaWN0LnZhbHVlcztcbiAgICB9XG5cbiAgICBsZXQgYW5zd2Vyc0RhdGEgPSB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH07XG4gICAgYW5zd2Vyc0RhdGEgPSB0aGlzLmFuc3dlcnNEYXRhUmVhZHkoYW5zd2Vyc0RhdGEpO1xuICAgIHRoaXMub25BbnN3ZXJzRGF0YVJlYWR5LmZpcmUodGhpcywgYW5zd2Vyc0RhdGEpO1xuXG4gICAgcmV0dXJuIGFuc3dlcnNEYXRhO1xuICB9XG4gIHByb3RlY3RlZCB0cmFuc3Bvc2UoZGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4pOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG4gICAgY29uc3QgZGltMiA9IGRhdGFbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PihkaW0yKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTI7ICsraSlcbiAgICAgIHJlc3VsdFtpXSA9IG5ldyBBcnJheTxudW1iZXI+KGRhdGEubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltMjsgKytqKSB7XG4gICAgICAgIHJlc3VsdFtqXVtpXSA9IGRhdGFbaV1bal07XG4gICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9zdGF0ZVByb3BlcnRpZXMgPSBbXCJjaGFydFR5cGVcIiwgXCJhbnN3ZXJzT3JkZXJcIiwgXCJoaWRlRW1wdHlBbnN3ZXJzXCIsIFwidG9wTlwiXTtcbiAgcHVibGljIGdldFN0YXRlKCk6IGFueSB7XG4gICAgbGV0IHN0YXRlOiBhbnkgPSB7fTtcbiAgICBTZWxlY3RCYXNlLl9zdGF0ZVByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgc3RhdGVbcHJvcGVydHlOYW1lXSA9ICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV07XG4gICAgfSk7XG4gICAgaWYoISF0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgc3RhdGUuZmlsdGVyID0gdGhpcy5zZWxlY3RlZEl0ZW0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBpZiAoc3RhdGVbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0gPSBzdGF0ZVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSgodGhpcy5xdWVzdGlvbiBhcyBRdWVzdGlvblNlbGVjdEJhc2UpLnZpc2libGVDaG9pY2VzLCBzdGF0ZS5maWx0ZXIpO1xuICAgIHRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSXRlbSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XHJcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vdGV4dC5zY3NzXCIpO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRUYWJsZUFkYXB0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IFRleHQpIHt9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zQ291bnQsIGRhdGEgfSA9IHRoaXMubW9kZWwuZ2V0RGF0YSgpO1xyXG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XHJcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLXRleHQtdGFibGVcIilcclxuICAgICk7XHJcblxyXG4gICAgdGFibGVOb2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XHJcblxyXG4gICAgZGF0YS5mb3JFYWNoKChyb3dEYXRhKSA9PiB7XHJcbiAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcclxuICAgICAgICB2YXIgdGQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS10ZXh0LXRhYmxlX19jZWxsXCIsIHtcclxuICAgICAgICAgIHRleHRDb250ZW50OiByb3dEYXRhW2ldLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh0ZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKHJvdyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS10ZXh0LXRhYmxlX19jb250YWluZXJcIjtcclxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcclxuICAgIG5vZGUuaW5uZXJIVE1MID0gXCJcIjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0IGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xyXG4gIHByaXZhdGUgX3RleHRUYWJsZUFkYXB0ZXI6IFRleHRUYWJsZUFkYXB0ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcclxuICAgIG9wdGlvbnM/OiBPYmplY3QsXHJcbiAgICBuYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInRleHRcIik7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyID0gbmV3IFRleHRUYWJsZUFkYXB0ZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXREYXRhKCkge1xyXG4gICAgbGV0IHJlc3VsdDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuICAgIGxldCBjb2x1bW5zQ291bnQgPSAwO1xyXG5cclxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xyXG4gICAgICBjb25zdCBkYXRhU3RyaW5nczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xyXG4gICAgICAgICAgZGF0YVN0cmluZ3MuY29uY2F0KHJvd1ZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWVba2V5XSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQucHVzaChkYXRhU3RyaW5ncyk7XHJcbiAgICAgICAgaWYgKGRhdGFTdHJpbmdzLmxlbmd0aCA+IGNvbHVtbnNDb3VudCkge1xyXG4gICAgICAgICAgY29sdW1uc0NvdW50ID0gZGF0YVN0cmluZ3MubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uc0NvdW50LCBkYXRhOiByZXN1bHQgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcclxuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmNyZWF0ZShjb250YWluZXIpO1xyXG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gIH1cclxufVxyXG5cclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFRleHQpO1xyXG4iLCJleHBvcnQgdmFyIF9fYXNzaWduID1cbiAgKDxhbnk+T2JqZWN0KVtcImFzc2lnblwiXSB8fFxuICBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIHAgaW4gcylcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyh0aGlzQ2xhc3M6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgZm9yICh2YXIgcCBpbiBiYXNlQ2xhc3MpXG4gICAgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzO1xuICB9XG4gIHRoaXNDbGFzcy5wcm90b3R5cGUgPVxuICAgIGJhc2VDbGFzcyA9PT0gbnVsbFxuICAgICAgPyBPYmplY3QuY3JlYXRlKGJhc2VDbGFzcylcbiAgICAgIDogKChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlKSwgbmV3ICg8YW55Pl9fKSgpKTtcbn1cblxuZXhwb3J0IHZhciBfX3Jlc3QgPSBmdW5jdGlvbihzb3VyY2U6IGFueSwgZTogYW55KSB7XG4gIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gc291cmNlKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIHByb3BlcnR5TmFtZSkgJiZcbiAgICAgIGUuaW5kZXhPZihwcm9wZXJ0eU5hbWUpIDwgMFxuICAgIClcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gc291cmNlW3Byb3BlcnR5TmFtZV07XG4gIGlmIChcbiAgICBzb3VyY2UgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiAoPGFueT5PYmplY3QpW1wiZ2V0T3duUHJvcGVydHlTeW1ib2xzXCJdID09PSBcImZ1bmN0aW9uXCJcbiAgKVxuICAgIGZvciAoXG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgIHByb3BlcnR5U3ltYm9scyA9ICg8YW55Pk9iamVjdClbXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIl0oc291cmNlKTtcbiAgICAgIGkgPCBwcm9wZXJ0eVN5bWJvbHMubGVuZ3RoO1xuICAgICAgaSsrXG4gICAgKVxuICAgICAgaWYgKGUuaW5kZXhPZihwcm9wZXJ0eVN5bWJvbHNbaV0pIDwgMClcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5U3ltYm9sc1tpXV0gPSBzb3VyY2VbcHJvcGVydHlTeW1ib2xzW2ldXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxuZXhwb3J0IHZhciBfX2RlY29yYXRlID0gZnVuY3Rpb24oXG4gIGRlY29yYXRvcnM6IGFueSxcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogYW55LFxuICBkZXNjOiBhbnlcbikge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcbiIsImV4cG9ydCBjbGFzcyBEb2N1bWVudEhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTZWxlY3RvcihcclxuICAgIG9wdGlvbnM6IEFycmF5PHsgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0+LFxyXG4gICAgaXNTZWxlY3RlZDogKG9wdGlvbjogeyB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfSkgPT4gYm9vbGVhbixcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgc2VsZWN0V3JhcHBlci5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3Qtd3JhcHBlclwiO1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcclxuICAgIHNlbGVjdC5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3RcIjtcclxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCBcIlwiLCB7XHJcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcclxuICAgICAgICB0ZXh0OiBvcHRpb24udGV4dCxcclxuICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZChvcHRpb24pLFxyXG4gICAgICB9KTtcclxuICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICBzZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVyO1xyXG4gICAgc2VsZWN0V3JhcHBlci5hcHBlbmRDaGlsZChzZWxlY3QpO1xyXG4gICAgcmV0dXJuIHNlbGVjdFdyYXBwZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUJ1dHRvbihcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWQsXHJcbiAgICB0ZXh0ID0gXCJcIixcclxuICAgIGNsYXNzTmFtZSA9IFwic2EtdG9vbGJhcl9fYnV0dG9uXCJcclxuICApIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIGNsYXNzTmFtZSwge1xyXG4gICAgICBpbm5lclRleHQ6IHRleHQsXHJcbiAgICAgIG9uY2xpY2s6IGhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBidXR0b247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUVsZW1lbnQoXHJcbiAgICB0YWdOYW1lOiBzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU6IHN0cmluZyA9IFwiXCIsXHJcbiAgICBhdHRycz86IGFueVxyXG4gICk6IEhUTUxFbGVtZW50IHtcclxuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcbiAgICBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XHJcbiAgICBpZiAoISFhdHRycykge1xyXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgKDxhbnk+ZWwpW2tleV0gPSBhdHRyc1trZXldO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnRWxlbWVudChwYXRoOiBzdHJpbmcpOiBTVkdTVkdFbGVtZW50IHtcclxuICAgIGNvbnN0IHN2Z0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJzdmdcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHVzZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJ1c2VcIlxyXG4gICAgKTtcclxuICAgIHVzZUVsZW0uc2V0QXR0cmlidXRlTlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxyXG4gICAgICBcImhyZWZcIixcclxuICAgICAgXCIjc2Etc3ZnLVwiICsgcGF0aFxyXG4gICAgKTtcclxuICAgIHN2Z0VsZW0uYXBwZW5kQ2hpbGQodXNlRWxlbSk7XHJcbiAgICByZXR1cm4gc3ZnRWxlbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQnV0dG9uKHBhdGg6IHN0cmluZyk6IEhUTUxCdXR0b25FbGVtZW50IHtcclxuICAgIGNvbnN0IGJ0biA9IDxIVE1MQnV0dG9uRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgXCJzYS10YWJsZV9fc3ZnLWJ1dHRvblwiKVxyXG4gICAgKTtcclxuICAgIGJ0bi5hcHBlbmRDaGlsZChEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KHBhdGgpKTtcclxuICAgIHJldHVybiBidG47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcclxuICAgIHN2Z1BhdGgxOiBzdHJpbmcsXHJcbiAgICBzdlBwYXRoMjogc3RyaW5nLFxyXG4gICAgdGV4dDE6IHN0cmluZyxcclxuICAgIHRleHQyOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyMTogKGU6IGFueSkgPT4gYW55LFxyXG4gICAgaGFuZGxlcjI6IChlOiBhbnkpID0+IGFueSxcclxuICAgIHN0YXRlID0gXCJmaXJzdFwiLFxyXG4gICAgY2xhc3NOYW1lID0gXCJzYS10b29sYmFyX19idXR0b24gc2EtdG9vbGJhcl9fc3ZnLWJ1dHRvblwiXHJcbiAgKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3Qgc3ZnMSA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZnUGF0aDEpO1xyXG4gICAgY29uc3Qgc3ZnMiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZQcGF0aDIpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBjbGFzc05hbWUpO1xyXG5cclxuICAgIGNvbnN0IHRvZ2dsZSA9IChlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgICBzdGF0ZSA9IFwic2Vjb25kXCI7XHJcbiAgICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgICAgYnV0dG9uLnJlbW92ZUNoaWxkKHN2ZzEpO1xyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgICAgICBoYW5kbGVyMihlKTtcclxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJzZWNvbmRcIikge1xyXG4gICAgICAgIHN0YXRlID0gXCJmaXJzdFwiO1xyXG4gICAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQxO1xyXG4gICAgICAgIGJ1dHRvbi5yZW1vdmVDaGlsZChzdmcyKTtcclxuICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMSk7XHJcbiAgICAgICAgaGFuZGxlcjEoZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDE7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcxKTtcclxuICAgIH0gZWxzZSBpZiAoKHN0YXRlID0gXCJzZWNvbmRcIikpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgIH1cclxuXHJcbiAgICBidXR0b24ub25jbGljayA9IHRvZ2dsZTtcclxuXHJcbiAgICByZXR1cm4gYnV0dG9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVJbnB1dChcclxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxyXG4gICAgcGxhY2Vob2xkZXIgPSBcIlwiLFxyXG4gICAgZGVmYXVsdFZhbHVlID0gXCJcIlxyXG4gICk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgdmFyIGVsID0gPEhUTUxJbnB1dEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgICAgXCJpbnB1dFwiLFxyXG4gICAgICBjbGFzc05hbWUsXHJcbiAgICAgIHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gZWw7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIG9wdGlvbnMgPSB7XHJcbiAgcnVubmluZ0luQnJvd3NlcjogdHlwZW9mIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIsXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dEb21SZW5kZXJpbmcoKSB7XHJcbiAgcmV0dXJuIG9wdGlvbnMucnVubmluZ0luQnJvd3NlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluaygpIHtcclxuICBjb25zdCBjb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCBsaW5rID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJzYS1jb21tZXJjaWFsX190ZXh0XCIsIHtcclxuICAgIGhyZWY6IFwiaHR0cHM6Ly93d3cuc3VydmV5anMuaW8vQnV5XCIsXHJcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXHJcbiAgfSk7XHJcbiAgY29uc3QgY29udGFpbmVyU3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiXCIpO1xyXG4gIGNvbnN0IGljb24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KFwibm9uY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCB0ZXh0U3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICBcInNwYW5cIixcclxuICAgIFwic2EtY29tbWVyY2lhbF9fcHJvZHVjdFwiLFxyXG4gICAge1xyXG4gICAgICBpbm5lclRleHQ6IFwiUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgQW5hbHl0aWNzIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcC5cIixcclxuICAgIH1cclxuICApO1xyXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKS5hcHBlbmRDaGlsZChjb250YWluZXJTcGFuKTtcclxuICBjb250YWluZXJTcGFuLmFwcGVuZENoaWxkKGljb24pO1xyXG4gIGNvbnRhaW5lclNwYW4uYXBwZW5kQ2hpbGQodGV4dFNwYW4pO1xyXG4gIHJldHVybiBjb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHppcEFycmF5cyguLi5hcnJheXM6IGFueVtdKTogYW55W11bXSB7XHJcbiAgICBsZXQgemlwQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB6aXBBcnJheVtpXSA9IFtdO1xyXG4gICAgICBhcnJheXMuZm9yRWFjaCgoYXJyKSA9PiB7XHJcbiAgICAgICAgemlwQXJyYXlbaV0ucHVzaChhcnJbaV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB6aXBBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdW56aXBBcnJheXMoemlwQXJyYXk6IGFueVtdW10pOiBhbnlbXVtdIHtcclxuICAgIGxldCBhcnJheXM6IGFueVtdW10gPSBbXTtcclxuICAgIHppcEFycmF5LmZvckVhY2goKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgIHZhbHVlLmZvckVhY2goKHZhbCwgaikgPT4ge1xyXG4gICAgICAgIGlmICghYXJyYXlzW2pdKSBhcnJheXNbal0gPSBbXTtcclxuICAgICAgICBhcnJheXNbal1baV0gPSB2YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXJyYXlzO1xyXG4gIH1cclxuICBwdWJsaWMgc3RhdGljIHNvcnREaWN0aW9uYXJ5KFxyXG4gICAga2V5czogYW55W10sXHJcbiAgICB2YWx1ZXM6IGFueVtdLFxyXG4gICAgZGVzYzogYm9vbGVhblxyXG4gICk6IHsga2V5czogYW55W10sIHZhbHVlczogYW55W10gfSB7XHJcbiAgICBsZXQgZGljdGlvbmFyeSA9IHRoaXMuemlwQXJyYXlzKGtleXMsIHZhbHVlcyk7XHJcbiAgICBsZXQgY29tcGFyYXRvciA9IChhOiBhbnlbXSwgYjogYW55W10sIGFzYzogYm9vbGVhbiA9IHRydWUpID0+IHtcclxuICAgICAgbGV0IHJlc3VsdCA9IGFbMV0gPCBiWzFdID8gMSA6IGFbMV0gPT0gYlsxXSA/IDAgOiAtMTtcclxuICAgICAgcmV0dXJuIGFzYyA/IHJlc3VsdCA6IHJlc3VsdCAqIC0xO1xyXG4gICAgfTtcclxuICAgIGRpY3Rpb25hcnkuc29ydCgoYTogYW55W10sIGI6IGFueVtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBkZXNjID8gY29tcGFyYXRvcihhLCBiLCBmYWxzZSkgOiBjb21wYXJhdG9yKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQga2V5c0FuZFZhbHVlcyA9IHRoaXMudW56aXBBcnJheXMoZGljdGlvbmFyeSk7XHJcbiAgICByZXR1cm4geyBrZXlzOiBrZXlzQW5kVmFsdWVzWzBdLCB2YWx1ZXM6IGtleXNBbmRWYWx1ZXNbMV0gfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdG9QZXJjZW50YWdlKHZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodmFsdWUgLyBtYXhWYWx1ZSkgKiAxMDA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGlua3NDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJcIiwge1xyXG4gICAgICAgIGlubmVyVGV4dDogbGluay5uYW1lLFxyXG4gICAgICAgIGRvd25sb2FkOiBsaW5rLm5hbWUsXHJcbiAgICAgICAgaHJlZjogbGluay5jb250ZW50LFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gbGlua3NDb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbWFnZXNDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImltZ1wiLCBcIlwiLCB7XHJcbiAgICAgICAgYWx0OiBsaW5rLm5hbWUsXHJcbiAgICAgICAgc3JjOiBsaW5rLmNvbnRlbnQsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG4gIHJldHVybiBsaW5rc0NvbnRhaW5lcjtcclxufVxyXG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuXG5kZWNsYXJlIHR5cGUgVmlzdWFsaXplckNvbnN0cnVjdG9yID0gbmV3IChcbiAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICBvcHRpb25zPzogT2JqZWN0XG4pID0+IGFueTtcblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdmlzdWFsaXplcnMgZm9yIGluZGl2aWR1YWwgcXVlc3Rpb24gdHlwZXMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWFuYWdlciB7XG4gIHN0YXRpYyBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHN0YXRpYyB2aXp1YWxpemVyczogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcj4gfSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmlzdWFsaXplciBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICpcbiAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvdmlzdWFsaXplLWFuc3dlcnMtZnJvbS10ZXh0LWVudHJ5LWZpZWxkcy13aXRoLWNoYXJ0cy8gKGxpbmtTdHlsZSkpXG4gICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgQSBxdWVzdGlvbiBbdHlwZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uI2dldFR5cGUpLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXN1YWxpemVyIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclZpc3VhbGl6ZXIoXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvclxuICApIHtcbiAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdO1xuICAgIGlmICghdmlzdWFsaXplcnMpIHtcbiAgICAgIHZpc3VhbGl6ZXJzID0gW107XG4gICAgICBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdID0gdmlzdWFsaXplcnM7XG4gICAgfVxuICAgIHZpc3VhbGl6ZXJzLnB1c2goY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZpc3VhbGl6ZXIgZm9yIGEgc3BlY2lmaWVkIHF1ZXN0aW9uIHR5cGUuXG4gICAqXG4gICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2V4YW1wbGVzL3Zpc3VhbGl6ZS1hbnN3ZXJzLWZyb20tdGV4dC1lbnRyeS1maWVsZHMtd2l0aC1jaGFydHMvIChsaW5rU3R5bGUpKVxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIEEgcXVlc3Rpb24gW3R5cGVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNnZXRUeXBlKS5cbiAgICogQHBhcmFtIGNvbnN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlzdWFsaXplciBjb25zdHJ1Y3RvciB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyVmlzdWFsaXplcihxdWVzdGlvblR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIGxldCBxdWVzdGlvblR5cGVzID0gW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYoIXF1ZXN0aW9uVHlwZSkge1xuICAgICAgcXVlc3Rpb25UeXBlcyA9IE9iamVjdC5rZXlzKFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzKTtcbiAgICB9XG4gICAgcXVlc3Rpb25UeXBlcy5mb3JFYWNoKHFUeXBlID0+IHtcbiAgICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3FUeXBlXTtcbiAgICAgIGlmICghIXZpc3VhbGl6ZXJzKSB7XG4gICAgICAgIGxldCBpbmRleCA9IHZpc3VhbGl6ZXJzLmluZGV4T2YoY29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdmlzdWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gUGFzcyBgdW5kZWZpbmVkYCB0byB0aGUgW2B1bnJlZ2lzdGVyVmlzdWFsaXplcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ubWFuYWdlciN1bnJlZ2lzdGVyVmlzdWFsaXplcikgbWV0aG9kIGluc3RlYWQuXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZpc3VhbGl6ZXIgY29uc3RydWN0b3IgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXJGb3JBbGwoY29uc3RydWN0b3I6IFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnVucmVnaXN0ZXJWaXN1YWxpemVyKHVuZGVmaW5lZCwgY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB2aXN1YWxpemVyIGNvbnN0cnVjdG9ycyBmb3IgYSBzcGVjaWZpZWQgcXVlc3Rpb24gdHlwZS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSBBIHF1ZXN0aW9uIFt0eXBlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jZ2V0VHlwZSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZpc3VhbGl6ZXJzQnlUeXBlKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nXG4gICk6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvcltdIHtcbiAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1txdWVzdGlvblR5cGVdO1xuICAgIGlmICghdmlzdWFsaXplcnMpIHtcbiAgICAgIHJldHVybiBbVmlzdWFsaXplckJhc2VdO1xuICAgIH1cbiAgICByZXR1cm4gdmlzdWFsaXplcnM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb25zdHJ1Y3RvciBmb3IgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICogQHNlZSByZWdpc3RlckFsdFZpc3VhbGl6ZXJTZWxlY3RvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbHRWaXN1YWxpemVyU2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIFZpc3VhbGl6YXRpb25NYW5hZ2VyLmFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIgfHwgVmlzdWFsaXplckJhc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBhbHRlcm5hdGl2ZSB2aXN1YWxpemVyIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0gY29uc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjb25zdHJ1Y3RvciBmb3IgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsaXplciBzZWxlY3Rvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJBbHRWaXN1YWxpemVyU2VsZWN0b3IoY29uc3RydWN0b3I6IGFueSkge1xuICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLmFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIgPSBjb25zdHJ1Y3RvcjtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgSXRlbVZhbHVlLFxuICBIZWxwZXJzLFxuICBRdWVzdGlvblNlbGVjdEJhc2UsXG59IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93biBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXI6IFZpc3VhbGl6ZXJCYXNlID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhEcm9wZG93blwiKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuZGlzYWJsZUxvY2FsZVN3aXRjaCA9IHRydWU7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmRhdGFQcm92aWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc1ZhbHVlcyA9IHF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnZhbHVlKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzTGFiZWxzID0gcXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiByb3cudGV4dCk7XG5cbiAgICBjb25zdCBpbm5lclF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zKCk7XG4gICAgY29uc3QgY2FuR3JvdXBDb2x1bW5zID0gdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc1ZhbHVlcy5sZW5ndGggPT0gMSAmJiBpbm5lclF1ZXN0aW9ucy5ldmVyeShpbm5lclF1ZXN0aW9uID0+IEhlbHBlcnMuaXNBcnJheXNFcXVhbChpbm5lclF1ZXN0aW9uLmNob2ljZXMsICg8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb24pLmNob2ljZXMpKTtcbiAgICBpZiAoY2FuR3JvdXBDb2x1bW5zKSB7XG4gICAgICB2YXIgY3JlYXRvcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRWaXN1YWxpemVyc0J5VHlwZShcIm1hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIik7XG4gICAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIgPSBuZXcgY3JlYXRvcnNbMF0odGhpcy5xdWVzdGlvbiwgW10sIHRoaXMuX2NoaWxkT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemF0aW9uUGFuZWwoaW5uZXJRdWVzdGlvbnMsIFtdLCB0aGlzLl9jaGlsZE9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5hZGQodGhpcy5vblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNMYWJlbHMgPSB0aGlzLnF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnRleHQpO1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hdHJpeERyb3Bkb3duVmlzdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCkge1xuICAgIGxldCBwYW5lbERhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgoZGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCByYXdEYXRhSXRlbSA9IGRhdGFJdGVtW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICBpZiAoISFyYXdEYXRhSXRlbSkge1xuICAgICAgICBPYmplY3Qua2V5cyhyYXdEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgdmFyIG5lc3RlZERhdGFJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3RGF0YUl0ZW1ba2V5XSk7XG4gICAgICAgICAgbmVzdGVkRGF0YUl0ZW1bRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gPSBrZXk7XG4gICAgICAgICAgcGFuZWxEYXRhLnB1c2gobmVzdGVkRGF0YUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIudXBkYXRlRGF0YShwYW5lbERhdGEpO1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpO1xuICAgIHN1cGVyLm9uRGF0YUNoYW5nZWQoKTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucygpIHtcbiAgICBjb25zdCBtYXRyaXhkcm9wZG93bjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsID0gPGFueT50aGlzLnF1ZXN0aW9uO1xuICAgIHJldHVybiBtYXRyaXhkcm9wZG93bi5jb2x1bW5zLm1hcChcbiAgICAgIChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGxRdWVzdGlvbjogYW55ID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGxRdWVzdGlvbi5jaG9pY2VzKSAmJiBjZWxsUXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjZWxsUXVlc3Rpb24uY2hvaWNlcyA9IG1hdHJpeGRyb3Bkb3duLmNob2ljZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlbGxRdWVzdGlvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5jbGVhcigpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIucmVuZGVyKGNvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vblBhbmVsQWZ0ZXJSZW5kZXJDYWxsYmFjayk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcIm1hdHJpeGRyb3Bkb3duXCIsXG4gIFZpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93blxuKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWF0cml4RHluYW1pYyBleHRlbmRzIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0XG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJtYXRyaXhEeW5hbWljXCI7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKSB7XG4gICAgY29uc3QgbWF0cml4ZHluYW1pYzogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsID0gPGFueT50aGlzLnF1ZXN0aW9uO1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gbWF0cml4ZHluYW1pYy52aXNpYmxlUm93cztcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIHJldHVybiB2aXNpYmxlUm93c1swXS5jZWxscy5tYXAoYyA9PiBjLnF1ZXN0aW9uKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwibWF0cml4ZHluYW1pY1wiLFxuICBWaXN1YWxpemF0aW9uTWF0cml4RHluYW1pY1xuKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IEV2ZW50LCBRdWVzdGlvbiwgU3VydmV5TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCAqIGFzIFN1cnZleUNvcmUgZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlLCBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciB9IGZyb20gXCIuL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciwgY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LCBJU3RhdGUsIElQZXJtaXNzaW9uIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBGaWx0ZXJJbmZvIH0gZnJvbSBcIi4vZmlsdGVySW5mb1wiO1xuaW1wb3J0IHsgTGF5b3V0RW5naW5lLCBNdXVyaUxheW91dEVuZ2luZSB9IGZyb20gXCIuL2xheW91dEVuZ2luZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemF0aW9uUGFuZWwuc2Nzc1wiKTtcblxuY29uc3QgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvblwiO1xuY29uc3QgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uLWxheW91dGVkXCI7XG5cbmlmICghIWRvY3VtZW50KSB7XG4gIGNvbnN0IHN2Z1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zdmdidW5kbGUuaHRtbFwiKTtcbiAgY29uc3QgdGVtcGxhdGVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wbGF0ZUhvbGRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRlbXBsYXRlSG9sZGVyLmlubmVySFRNTCA9IHN2Z1RlbXBsYXRlO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlSG9sZGVyKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50XG4gIGV4dGVuZHMgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQge1xuICByZW5kZXJlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uIFBhbmVsIGNvbmZpZ3VyYXRpb24uIFBhc3MgaXQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwic3VydmV5LWFuYWx5dGljc1wiO1xuICpcbiAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAqICAgc3VydmV5UXVlc3Rpb25zLFxuICogICBzdXJ2ZXlSZXN1bHRzLFxuICogICB2aXpQYW5lbE9wdGlvbnNcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyB7XG4gIC8vIEFuIG9iamVjdCBuYW1lZCBhZnRlciBhIHF1ZXN0aW9uIHRoYXQgaXQgY29uZmlndXJlcy5cbiAgLy8gcXVlc3Rpb25OYW1lOiB7XG4gIC8vICAgaW50ZXJ2YWxzOiBbXVxuICAvLyB9LFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGxhYmVsIGNoYXJhY3RlcnMgYWZ0ZXIgd2hpY2ggdHJ1bmNhdGlvbiBzdGFydHMuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIC0xIHRvIGRpc2FibGUgdHJ1bmNhdGlvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMjdcbiAgICovXG4gIGxhYmVsVHJ1bmNhdGVMZW5ndGg/OiBudW1iZXI7XG5cbiAgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgc2VyaWVzVmFsdWVzPzogc3RyaW5nW107XG4gIHNlcmllc0xhYmVscz86IHN0cmluZ1tdO1xuICB1c2VWYWx1ZXNBc0xhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhc3MgYSBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIHN1cnZleSBsb2NhbGVzIGluIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKi9cbiAgc3VydmV5PzogU3VydmV5TW9kZWw7XG4gIC8qKlxuICAgKiBBIGNvbW1vbiBkYXRhIHByb3ZpZGVyIGZvciBhbGwgdmlzdWFsaXplcnMuXG4gICAqL1xuICBkYXRhUHJvdmlkZXI/OiBEYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGluZGl2aWR1YWwgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93SGlkZVF1ZXN0aW9ucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIGNoYXJ0cyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGRpc2FibGVkLCBjaGFydHMgYXJlIGRpc3BsYXllZCBvbmUgdW5kZXIgYW5vdGhlciwgYW5kIHVzZXJzIGNhbm5vdCBkcmFnIGFuZCBkcm9wIHRoZW0uIElmIHlvdSB3YW50IHRvIGRpc2FibGUgb25seSBkcmFnIGFuZCBkcm9wLCBzZXQgdGhlIFtgYWxsb3dEcmFnRHJvcGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKlxuICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9jdXN0b20tbGF5b3V0LyAobGlua1N0eWxlKSlcbiAgICogQHNlZSBsYXlvdXRFbmdpbmVcbiAgICovXG4gIGFsbG93RHluYW1pY0xheW91dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB1c2VycyBjYW4gZHJhZyBhbmQgZHJvcCBjaGFydHMuIEFwcGxpZXMgb25seSBpZiBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIGlzIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqIEBzZWUgbGF5b3V0RW5naW5lXG4gICAqL1xuICBhbGxvd0RyYWdEcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgbGF5b3V0IGVuZ2luZSB1c2VkIHRvIGFycmFuZ2UgY2hhcnRzIG9uIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGludGVncmF0ZSBhIHRoaXJkLXBhcnR5IGxheW91dCBlbmdpbmUgd2l0aCBTdXJ2ZXlKUyBEYXNoYm9hcmQuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dEeW5hbWljTGF5b3V0XG4gICAqL1xuICBsYXlvdXRFbmdpbmU/OiBMYXlvdXRFbmdpbmU7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgYW5kIHBlcmNlbnRhZ2UgdmFsdWVzIGluIGJhciBjaGFydHMuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNob3cgUGVyY2VudGFnZXMgYnV0dG9uIHRvIGVhY2ggYmFyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIGFsbG93U2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBwZXJjZW50YWdlcyBpbiBhZGRpdGlvbiB0byBhYnNvbHV0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgc2hvd1BlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGJhciBjaGFydHMgZGlzcGxheSBvbmx5IHBlcmNlbnRhZ2VzLCB3aXRob3V0IGFic29sdXRlIHZhbHVlcy5cbiAgICpcbiAgICogQXBwbGllcyBvbmx5IGlmIHRoZSBgYWxsb3dTaG93UGVyY2VudGFnZXNgIG9yIGBzaG93UGVyY2VudGFnZXNgIHByb3BlcnR5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIHNob3dPbmx5UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHBlcmNlbnRhZ2UgcHJlY2lzaW9uLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiAwXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqL1xuICBwZXJjZW50YWdlUHJlY2lzaW9uPzogbnVtYmVyO1xuICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNvcnQgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuIEFwcGxpZXMgb25seSB0byBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTb3J0aW5nIGRyb3Bkb3duIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogQHNlZSBhbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gc29ydCBhbnN3ZXJzIGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczpcbiAgICpcbiAgICogLSBgXCJkZWZhdWx0XCJgIChkZWZhdWx0KSAtIERvIG5vdCBzb3J0IGFuc3dlcnMuXG4gICAqIC0gYFwiYXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGFzY2VuZGluZyBhbnN3ZXIgY291bnQuXG4gICAqIC0gYFwiZGVzY1wiYCAtIFNvcnQgYW5zd2VycyBieSBkZXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFuc3dlcnNPcmRlcj86IFwiZGVmYXVsdFwiIHwgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGhpZGUgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBFbXB0eSBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGJhciBhbmQgc2NhdHRlciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhpZGVzIGFuc3dlcnMgd2l0aCB6ZXJvIGNvdW50IGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93SGlkZUVtcHR5QW5zd2Vyc1xuICAgKi9cbiAgaGlkZUVtcHR5QW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoZXRoZXIgdG8gc2hvdyB0b3AgNSwgMTAsIG9yIDIwIGFuc3dlcnMgYnkgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUb3AgTiBBbnN3ZXJzIGRyb3Bkb3duIHRvIGVhY2ggY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VG9wTkFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNob3cgdGhlIG51bWJlciBvZiByZXNwb25kZW50cyB3aG8gZGlkIG5vdCBhbnN3ZXIgYSBwYXJ0aWN1bGFyIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IE1pc3NpbmcgQW5zd2VycyBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnM/OiBib29sZWFuO1xuXG4gIGFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBjaGFydCB0eXBlLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBxdWVzdGlvbiB0eXBlIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIC0gQm9vbGVhbjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImBcbiAgICogLSBEYXRlLCBOdW1iZXI6IGBcImJhclwiYCB8IGBcInNjYXR0ZXJcImBcbiAgICogLSBNYXRyaXg6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic3RhY2tlZGJhclwiYFxuICAgKiAtIFJhdGluZzogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYCB8IGBcImdhdWdlXCJgIHwgYFwiYnVsbGV0XCJgXG4gICAqIC0gUmFkaW9ncm91cCwgQ2hlY2tib3gsIERyb3Bkb3duLCBJbWFnZSBQaWNrZXI6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic2NhdHRlclwiYFxuICAgKlxuICAgKiBUbyBzZXQgYSB0eXBlIGZvciBhbiBpbmRpdmlkdWFsIGNoYXJ0LCBhY2Nlc3MgdGhpcyBjaGFydCBpbiB0aGUgYHZpc3VhbGl6ZXJzYCBhcnJheSBhbmQgc2V0IGl0cyBgY2hhcnRUeXBlYCBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIHZhbHVlcyBkZXNjcmliZWQgYWJvdmU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoIC4uLiApO1xuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5jaGFydFR5cGUgPSBcInN0YWNrZWRiYXJcIjtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBkZWZhdWx0Q2hhcnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHRyYW5zcG9zZSBhIHZpc3VhbGl6ZWQgbWF0cml4IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUcmFuc3Bvc2UgYnV0dG9uIHRvIGNoYXJ0cyB0aGF0IHZpc3VhbGl6ZSBtYXRyaXhlcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIFZhbHVlcywgbWF0cml4IHJvd3MgZ28gdG8gY2hhcnQgYXJndW1lbnRzIGFuZCBtYXRyaXggY29sdW1ucyBmb3JtIGNoYXJ0IHNlcmllcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIENvbHVtbnMsIG1hdHJpeCByb3dzIGZvcm0gY2hhcnQgc2VyaWVzIGFuZCBtYXRyaXggY29sdW1ucyBnbyB0byBjaGFydCBhcmd1bWVudHMuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VHJhbnNwb3NlRGF0YT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY3Jvc3MtZmlsdGVyIGNoYXJ0cy4gVGhlIGZpbHRlciBhcHBsaWVzIHdoZW4gdXNlcnMgc2VsZWN0IGEgc2VyaWVzIHBvaW50LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbjtcblxuICByZW5kZXJDb250ZW50PzogRnVuY3Rpb247XG4gIGRlc3Ryb3lDb250ZW50PzogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgSFRNTCB0YWdzIGZyb20gc3VydmV5IGVsZW1lbnQgdGl0bGVzLlxuICAgKlxuICAgKiBTdXJ2ZXkgZWxlbWVudCB0aXRsZXMgY2FuIGNvbnRhaW4gSFRNTCBtYXJrdXAgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdXNlcnMuIEFuIGF0dGFja2VyIGNhbiBpbmplY3QgbWFsaWNpb3VzIGNvZGUgaW50byB0aGUgdGl0bGVzLiBUbyBndWFyZCBhZ2FpbnN0IGl0LCBrZWVwIHRoaXMgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBzdHJpcEh0bWxGcm9tVGl0bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB2aXN1YWxpemVzIHN1cnZleSByZXN1bHRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gYW5hbHl6ZSB0aGVtLlxuICpcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnM6XG4gKlxuICogLSBgcXVlc3Rpb25zYDogQXJyYXlcXDxbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcPlxcXG4gKiBTdXJ2ZXkgcXVlc3Rpb25zIHRvIHZpc3VhbGl6ZS4gQ2FsbCBgU3VydmV5TW9kZWxgJ3MgW2BnZXRBbGxRdWVzdGlvbnMoKWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXktZGF0YS1tb2RlbCNnZXRRdWVzdGlvbkJ5TmFtZSkgbWV0aG9kIHRvIGFjY2VzcyBhbGwgc3VydmV5IHF1ZXN0aW9ucyBhbmQgcGFzcyBpdHMgcmVzdWx0IGFzIHRoZSBgcXVlc3Rpb25zYCBwYXJhbWV0ZXIuXG4gKiAtIGBkYXRhYDogYEFycmF5PGFueT5gXFxcbiAqIFN1cnZleSByZXN1bHRzLlxuICogLSBgb3B0aW9uc2A6IFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpXFxcbiAqIFZpc3VhbGl6YXRpb24gUGFuZWwgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9leGFtcGxlcy9pbnRlcmFjdGl2ZS1zdXJ2ZXktZGF0YS1kYXNoYm9hcmQvIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwdWJsaWMgc3RhdGljIGhhdmVDb21tZXJjaWFsTGljZW5zZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdmlzdWFsaXplcnM6IEFycmF5PFZpc3VhbGl6ZXJCYXNlPiA9IFtdO1xuICBwcml2YXRlIGhhdmVDb21tZXJjaWFsTGljZW5zZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlbmRlcmVkUXVlc3Rpb25zQ291bnQ6IG51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBxdWVzdGlvbnM6IEFycmF5PGFueT4sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyA9IHt9LFxuICAgIHByaXZhdGUgX2VsZW1lbnRzOiBBcnJheTxJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50PiA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihudWxsLCBkYXRhLCBvcHRpb25zLCBcInBhbmVsXCIpO1xuXG4gICAgdGhpcy5fbGF5b3V0RW5naW5lID1cbiAgICAgIG9wdGlvbnMubGF5b3V0RW5naW5lIHx8XG4gICAgICBuZXcgTXV1cmlMYXlvdXRFbmdpbmUoXG4gICAgICAgIHRoaXMuYWxsb3dEeW5hbWljTGF5b3V0LFxuICAgICAgICBcIi5cIiArIHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lLFxuICAgICAgICB0aGlzLmFsbG93RHJhZ0Ryb3BcbiAgICAgICk7XG4gICAgdGhpcy5fbGF5b3V0RW5naW5lLm9uTW92ZUNhbGxiYWNrID0gKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+XG4gICAgICB0aGlzLm1vdmVWaXNpYmxlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXJ2ZXkpIHtcbiAgICAgIGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdGhpcy5vcHRpb25zLnN1cnZleS5sb2NhbGU7XG4gICAgfVxuXG4gICAgaWYgKF9lbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lbGVtZW50cyA9IHRoaXMuYnVpbGRFbGVtZW50cyhxdWVzdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBmID0gKDxhbnk+U3VydmV5Q29yZSkuaGFzTGljZW5zZTtcbiAgICB0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSA9ICghIWYgJiYgZig0KSkgfHxcbiAgICAgIFZpc3VhbGl6YXRpb25QYW5lbC5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgfHxcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZVxuICAgICAgICA6IGZhbHNlKTtcblxuICAgIHRoaXMuYnVpbGRWaXN1YWxpemVycyhxdWVzdGlvbnMpO1xuICAgIGlmICghdGhpcy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNvbW1lcmNpYWxMaWNlbnNlXCIsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluaygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwicmVzZXRGaWx0ZXJcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgICAgIGlmICh2aXN1YWxpemVyIGluc3RhbmNlb2YgU2VsZWN0QmFzZSB8fCB2aXN1YWxpemVyIGluc3RhbmNlb2YgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIpIHtcbiAgICAgICAgICAgIHZpc3VhbGl6ZXIuc2V0U2VsZWN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXNldEZpbHRlclwiKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJhZGRFbGVtZW50XCIsICh0b29sYmFyOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWxsb3dIaWRlUXVlc3Rpb25zKSB7XG4gICAgICAgIGxldCBhZGRFbGVtZW50U2VsZWN0b3I6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyID0gKFxuICAgICAgICAgIHBhbmVsOiBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgICAgICAgb3B0aW9uczogYW55XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhpZGRlbkVsZW1lbnRzID0gdGhpcy5oaWRkZW5FbGVtZW50cztcbiAgICAgICAgICBpZiAoaGlkZGVuRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0V3JhcHBlciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgPGFueT57XG4gICAgICAgICAgICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFkZEVsZW1lbnRcIiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaGlkZGVuRWxlbWVudHMpXG4gICAgICAgICAgICAgICAgLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZWxlbWVudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIChvcHRpb246IGFueSkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIChhZGRFbGVtZW50U2VsZWN0b3IgJiZcbiAgICAgICAgICAgICAgdG9vbGJhci5yZXBsYWNlQ2hpbGQoc2VsZWN0V3JhcHBlciwgYWRkRWxlbWVudFNlbGVjdG9yKSkgfHxcbiAgICAgICAgICAgICAgdG9vbGJhci5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcbiAgICAgICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvciA9IHNlbGVjdFdyYXBwZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvciAmJiB0b29sYmFyLnJlbW92ZUNoaWxkKGFkZEVsZW1lbnRTZWxlY3Rvcik7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyKHRoaXMsIHt9KTtcbiAgICAgICAgdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuYWRkKGFkZEVsZW1lbnRTZWxlY3RvclVwZGF0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlTG9jYWxlU3dpdGNoICYmIHRoaXMubG9jYWxlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBsb2NhbGVDaG9pY2VzID0gdGhpcy5sb2NhbGVzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBlbGVtZW50LFxuICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoZWxlbWVudClcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8gbG9jYWxlQ2hvaWNlcy51bnNoaWZ0KHtcbiAgICAgIC8vICAgdmFsdWU6IFwiXCIsXG4gICAgICAvLyAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaGFuZ2VMb2NhbGVcIiksXG4gICAgICAvLyB9KTtcbiAgICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUxvY2FsZVwiLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3Rvcihsb2NhbGVDaG9pY2VzLFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gISFvcHRpb24udmFsdWUgJiYgdGhpcy5sb2NhbGUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3TG9jYWxlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrID0gKFxuICAgIHNlbmRlcjogVmlzdWFsaXplckJhc2UsXG4gICAgb3B0aW9uczogYW55XG4gICkgPT4ge1xuICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCsrO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkUXVlc3Rpb25zQ291bnQgPT0gdGhpcy5xdWVzdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25zQ291bnQgPSAwO1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBhIHVzZXIgc2VsZWN0cyBhIGRpZmZlcmVudCB2aXN1YWxpemVyIHR5cGUgZnJvbSB0aGUgVHlwZSBkcm9wLWRvd24gbWVudS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogYEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyYFxcXG4gICAqIEFuIG9iamVjdCB0aGF0IGNvbnRyb2xzIGFsdGVuYXRpdmUgdmlzdWFsaXplcnMuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMudmlzdWFsaXplcmA6IGBWaXN1YWxpemVyQmFzZWBcXFxuICAgKiBBbiBhcHBsaWVkIHZpc3VhbGl6ZXIuXG4gICAqKi9cbiAgcHVibGljIG9uQWx0ZXJuYXRpdmVWaXN1YWxpemVyQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSwgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsIGFueT4oKTtcblxuICBwcml2YXRlIG9uQWx0ZXJuYXRpdmVWaXN1YWxpemVyQ2hhbmdlZENhbGxiYWNrID0gKFxuICAgIHNlbmRlcjogQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIsXG4gICAgb3B0aW9uczogeyB2aXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSB9XG4gICkgPT4ge1xuICAgIHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkLmZpcmUoc2VuZGVyLCBvcHRpb25zKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQsIGVsZW1lbnRJbmRleCA9IC0xKTogdm9pZCB7XG4gICAgZWxlbWVudC5pc1Zpc2libGUgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXN0aW9uRWxlbWVudCA9IHRoaXMucmVuZGVyUGFuZWxFbGVtZW50KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lclxuICAgICk7XG4gICAgbGV0IG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgaWYoZWxlbWVudEluZGV4ID49IDApIHtcbiAgICAgIG9wdGlvbnMgPSB7IGluZGV4OiBlbGVtZW50SW5kZXggfTtcbiAgICB9XG4gICAgdGhpcy5sYXlvdXRFbmdpbmUuYWRkKFtxdWVzdGlvbkVsZW1lbnRdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93RWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgY29uc3QgZWxlbWVudEluZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgICB0aGlzLnNob3dFbGVtZW50Q29yZShlbGVtZW50LCBlbGVtZW50SW5kZXgpO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50LCBcIkFEREVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbGVtZW50Q29yZShlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50KSB7XG4gICAgZWxlbWVudC5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpZiAoISFlbGVtZW50LnJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5sYXlvdXRFbmdpbmUucmVtb3ZlKFtlbGVtZW50LnJlbmRlcmVkRWxlbWVudF0pO1xuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyLnJlbW92ZUNoaWxkKGVsZW1lbnQucmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlRWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgdGhpcy5oaWRlRWxlbWVudENvcmUoZWxlbWVudCk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKGVsZW1lbnQsIFwiUkVNT1ZFRFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBhbGwgcGFuZWwgZWxlbWVudHMuIFVzZXJzIGNhbiBzZWxlY3QgdGhlIGVsZW1lbnRzIHRoZXkgd2FudCB0byBzaG93IGZyb20gYSBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBzaG93QWxsRWxlbWVudHNcbiAgICogQHNlZSBhbGxvd0hpZGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBoaWRlQWxsRWxlbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWZmZWN0ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZihlbGVtZW50LmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmhpZGVFbGVtZW50Q29yZShlbGVtZW50KTtcbiAgICAgICAgYWZmZWN0ZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZCh1bmRlZmluZWQsIFwiUkVNT1ZFREFMTFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbGwgcGFuZWwgZWxlbWVudHMgaWYgdGhleSBhcmUgaGlkZGVuIHRvIGEgZHJvcC1kb3duIG1lbnUuXG4gICAqIEBzZWUgaGlkZUFsbEVsZW1lbnRzXG4gICAqIEBzZWUgYWxsb3dIaWRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgc2hvd0FsbEVsZW1lbnRzKCkge1xuICAgIGNvbnN0IGFmZmVjdGVkRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLl9lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYoIWVsZW1lbnQuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2hvd0VsZW1lbnRDb3JlKGVsZW1lbnQpO1xuICAgICAgICBhZmZlY3RlZEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHNDaGFuZ2VkKHVuZGVmaW5lZCwgXCJBRERFRERBTExcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSB7XG4gICAgZWxlbWVudC5pc1B1YmxpYyA9IGZhbHNlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlRWxlbWVudFB1YmxpYyhlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkge1xuICAgIGVsZW1lbnQuaXNQdWJsaWMgPSB0cnVlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb3ZlVmlzaWJsZUVsZW1lbnQoXG4gICAgZnJvbVZpc2libGVJbmRleDogbnVtYmVyLFxuICAgIHRvVmlzaWJsZUluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IGZyb21JbmRleCwgdG9JbmRleDtcblxuICAgIGxldCBmcm9tVmlzaWJsZUluZGV4RWxlbWVudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzW2Zyb21WaXNpYmxlSW5kZXhdO1xuICAgIGxldCB0b1Zpc2libGVJbmRleEVsZW1lbnQgPSB0aGlzLnZpc2libGVFbGVtZW50c1t0b1Zpc2libGVJbmRleF07XG5cbiAgICBmcm9tSW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGZyb21WaXNpYmxlSW5kZXhFbGVtZW50KTtcbiAgICB0b0luZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZih0b1Zpc2libGVJbmRleEVsZW1lbnQpO1xuXG4gICAgdGhpcy5tb3ZlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVFbGVtZW50KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLl9lbGVtZW50cy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICB0aGlzLl9lbGVtZW50cy5zcGxpY2UodG9JbmRleCwgMCwgZWxlbWVudHNbMF0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50c1swXSwgXCJNT1ZFRFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godmlzdWFsaXplciA9PiB2aXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWaXN1YWxpemVycyhxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPikge1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuY3JlYXRlVmlzdWFsaXplcihxdWVzdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJyZW1vdmVRdWVzdGlvblwiLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUVsZW1lbnQocXVlc3Rpb24ubmFtZSksIDApO1xuICAgICAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlQnV0dG9uXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUpIHtcbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwibWFrZVByaXZhdGVQdWJsaWNcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGVsZW1lbnQuaXNQdWJsaWMgPyBcImZpcnN0XCIgOiBcInNlY29uZFwiO1xuXG4gICAgICAgICAgY29uc3QgcGF0aE1ha2VQcml2YXRlU3ZnID0gXCJtYWtlcHJpdmF0ZVwiO1xuICAgICAgICAgIGNvbnN0IHBhdGhNYWtlUHVibGljU3ZnID0gXCJtYWtlcHVibGljXCI7XG4gICAgICAgICAgY29uc3QgbWFrZVByaXZhdGVUaXRsZSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYWtlUHJpdmF0ZUJ1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBtYWtlUHVibGljVGl0bGUgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWFrZVB1YmxpY0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBkb1ByaXZhdGUgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRvUHVibGljID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm1ha2VFbGVtZW50UHVibGljKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcbiAgICAgICAgICAgIHBhdGhNYWtlUHVibGljU3ZnLFxuICAgICAgICAgICAgcGF0aE1ha2VQcml2YXRlU3ZnLFxuICAgICAgICAgICAgbWFrZVByaXZhdGVUaXRsZSxcbiAgICAgICAgICAgIG1ha2VQdWJsaWNUaXRsZSxcbiAgICAgICAgICAgIGRvUHVibGljLFxuICAgICAgICAgICAgZG9Qcml2YXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpc3VhbGl6ZXIuc3VwcG9ydFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCB2aXN1YWxpemVyV2l0aFNlbGVjdGlvbiA9IDxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+KFxuICAgICAgICAgICg8YW55PnZpc3VhbGl6ZXIpXG4gICAgICAgICk7XG4gICAgICAgIGxldCBmaWx0ZXJJbmZvID0gbmV3IEZpbHRlckluZm8odmlzdWFsaXplcldpdGhTZWxlY3Rpb24pO1xuXG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcInF1ZXN0aW9uRmlsdGVySW5mb1wiLCAoKSA9PiB7XG4gICAgICAgICAgZmlsdGVySW5mby51cGRhdGUodmlzdWFsaXplcldpdGhTZWxlY3Rpb24uc2VsZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZmlsdGVySW5mby5odG1sRWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlzdWFsaXplcldpdGhTZWxlY3Rpb24ub25EYXRhSXRlbVNlbGVjdGVkID0gKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWU6IGFueSxcbiAgICAgICAgICBzZWxlY3RlZFRleHQ6IHN0cmluZ1xuICAgICAgICApID0+IHtcbiAgICAgICAgICBmaWx0ZXJJbmZvLnVwZGF0ZSh7IHZhbHVlOiBzZWxlY3RlZFZhbHVlLCB0ZXh0OiBzZWxlY3RlZFRleHQgfSk7XG4gICAgICAgICAgdGhpcy5zZXRGaWx0ZXIocXVlc3Rpb24ubmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmxheW91dCgpO1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKTtcblxuICAgICAgaWYgKHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcikge1xuICAgICAgICB2aXN1YWxpemVyLm9uVmlzdWFsaXplckNoYW5nZWQuYWRkKHRoaXMub25BbHRlcm5hdGl2ZVZpc3VhbGl6ZXJDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpc3VhbGl6ZXJzLnB1c2godmlzdWFsaXplcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaXN1YWxpemVycygpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UpIHtcbiAgICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIub25WaXN1YWxpemVyQ2hhbmdlZC5yZW1vdmUodGhpcy5vbkFsdGVybmF0aXZlVmlzdWFsaXplckNoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICB2aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVycyA9IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgICh0aGlzLnF1ZXN0aW9ucyB8fCBbXSkuZm9yRWFjaCgocXVlc3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG4gICAgICBpZiAoISFlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZGlzcGxheU5hbWUgPSB0aGlzLnByb2Nlc3NUZXh0KHF1ZXN0aW9uLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godiA9PiB7XG4gICAgICB2Lm9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5vcHRpb25zLnNlcmllc0xhYmVscztcbiAgICAgIHYubG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIH0pO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93RHluYW1pY0xheW91dGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0R5bmFtaWNMYXlvdXQpIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBbYElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93RHluYW1pY0xheW91dCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93RHJhZ0Ryb3BgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dEcmFnRHJvcCkgcHJvcGVydHkgdmFsdWUgb2YgdGhlIFtgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dEcmFnRHJvcCgpIHtcbiAgICBpZihTdXJ2ZXlDb3JlLklzVG91Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0RyYWdEcm9wID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0RyYWdEcm9wID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBbYGFsbG93SGlkZVF1ZXN0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBbYElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93SGlkZVF1ZXN0aW9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93SGlkZVF1ZXN0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dIaWRlUXVlc3Rpb25zID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUgPT09IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9sYXlvdXRFbmdpbmU6IExheW91dEVuZ2luZTtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBbYExheW91dEVuZ2luZWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9sYXlvdXRlbmdpbmUpIGluc3RhbmNlIHVzZWQgdG8gYXJyYW5nZSB2aXN1YWxpemF0aW9uIGl0ZW1zIG9uIGBWaXN1YWxpemF0aW9uUGFuZWxgLlxuICAgKi9cbiAgcHVibGljIGdldCBsYXlvdXRFbmdpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEVsZW1lbnRzKHF1ZXN0aW9uczogYW55W10pOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudFtdIHtcbiAgICByZXR1cm4gKHF1ZXN0aW9ucyB8fCBbXSkubWFwKChxdWVzdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMucHJvY2Vzc1RleHQocXVlc3Rpb24udGl0bGUpLFxuICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgIGlzUHVibGljOiB0cnVlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpIG9iamVjdHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lcyBRdWVzdGlvbiBbbmFtZXNdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS4gRG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIgdG8gZ2V0IGFuIGFycmF5IG9mIGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKiBAc2VlIHZpc2libGVFbGVtZW50c1xuICAgKiBAc2VlIGhpZGRlbkVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudHMocXVlc3Rpb25OYW1lcz86IEFycmF5PHN0cmluZz4pOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudFtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAodGhpcy5fZWxlbWVudHMgfHwgW10pLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmKCFxdWVzdGlvbk5hbWVzIHx8IHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlbGVtZW50Lm5hbWUpICE9PSAtMSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBlbGVtZW50LmRpc3BsYXlOYW1lLFxuICAgICAgICAgIGlzVmlzaWJsZTogZWxlbWVudC5pc1Zpc2libGUsXG4gICAgICAgICAgaXNQdWJsaWM6IGVsZW1lbnQuaXNQdWJsaWMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KSBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudGx5IHZpc2libGUgdmlzdWFsaXphdGlvbiBpdGVtcy5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gZGlzYWxsb3cgdXNlcnMgdG8gaGlkZSB2aXN1YWxpemF0aW9uIGl0ZW1zLCBzZXQgdGhlIFtgYWxsb3dIaWRlUXVlc3Rpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemF0aW9ucGFuZWxvcHRpb25zI2FsbG93SGlkZVF1ZXN0aW9ucykgcHJvcGVydHkgdG8gYGZhbHNlYC5cbiAgICogQHNlZSBoaWRkZW5FbGVtZW50c1xuICAgKiBAc2VlIGdldEVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzVmlzaWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KSBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudGx5IGhpZGRlbiB2aXN1YWxpemF0aW9uIGl0ZW1zLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB1c2VycyB0byBoaWRlIHZpc3VhbGl6YXRpb24gaXRlbXMsIHNldCB0aGUgW2BhbGxvd0hpZGVRdWVzdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKSBwcm9wZXJ0eSB0byBgZmFsc2VgLlxuICAgKiBAc2VlIHZpc2libGVFbGVtZW50c1xuICAgKiBAc2VlIGdldEVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGRlbkVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoXG4gICAgICAoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiAhZWwuaXNWaXNpYmxlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHVibGljRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiBlbC5pc1B1YmxpYyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByaXZhdGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+ICFlbC5pc1B1YmxpYyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGxvY2FsZXMoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXJ2ZXkpIHJldHVybiB0aGlzLm9wdGlvbnMuc3VydmV5LmdldFVzZWRMb2NhbGVzKCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2aXN1YWxpemF0aW9uIGl0ZW0gd2l0aCBhIHNwZWNpZmllZCBxdWVzdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBBIHF1ZXN0aW9uIFtuYW1lXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24jbmFtZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChxdWVzdGlvbk5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsKSA9PiBlbC5uYW1lID09PSBxdWVzdGlvbk5hbWUpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBbdmlzdWFsaXplcl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlKSB0aGF0IHZpc3VhbGl6ZXMgYSBzcGVjaWZpZWQgc3VydmV5IHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICovXG4gIHB1YmxpYyBnZXRWaXN1YWxpemVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnF1ZXN0aW9uLm5hbWUgPT09IHF1ZXN0aW9uTmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSBbYG9uRWxlbWVudFNob3duYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRTaG93biksIFtgb25FbGVtZW50SGlkZGVuYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRIaWRkZW4pLCBvciBbYG9uRWxlbWVudE1vdmVkYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNvbkVsZW1lbnRNb3ZlZCkgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVFbGVtZW50c0NoYW5nZWQgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gdXNlcnMgW3Nob3cgYSB2aXN1YWxpemF0aW9uIGl0ZW1dKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXphdGlvbnBhbmVsb3B0aW9ucyNhbGxvd0hpZGVRdWVzdGlvbnMpLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBbYFZpc3VhbGl6YXRpb25QYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwpXFxcbiAgICogQSBgVmlzdWFsaXphdGlvblBhbmVsYCB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudHNgOiBBcnJheVxcPFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFw+XFxcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYWxsIHZpc3VhbGl6YXRpb24gaXRlbXMgcmVuZGVyZWQgYnkgdGhpcyBgVmlzdWFsaXphdGlvblBhbmVsYC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5lbGVtZW50YDogW2BJVmlzdWFsaXplclBhbmVsRWxlbWVudGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pdmlzdWFsaXplcnBhbmVsZWxlbWVudClcXFxuICAgKiBBIHZpc3VhbGl6YXRpb24gaXRlbSB0aGF0IGhhcyBiZWVuIHNob3duLlxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudFNob3duID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIHVzZXJzIFtoaWRlIGEgdmlzdWFsaXphdGlvbiBpdGVtXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dIaWRlUXVlc3Rpb25zKS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKVxcXG4gICAqIEEgYFZpc3VhbGl6YXRpb25QYW5lbGAgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRzYDogQXJyYXlcXDxbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcPlxcXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zIHJlbmRlcmVkIGJ5IHRoaXMgYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudGA6IFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFxcbiAgICogQSB2aXN1YWxpemF0aW9uIGl0ZW0gdGhhdCBoYXMgYmVlbiBoaWRkZW4uXG4gICAqL1xuICBwdWJsaWMgb25FbGVtZW50SGlkZGVuID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIHVzZXJzIFttb3ZlIGEgdmlzdWFsaXphdGlvbiBpdGVtXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6YXRpb25wYW5lbG9wdGlvbnMjYWxsb3dEeW5hbWljTGF5b3V0KS5cbiAgICpcbiAgICogUGFyYW1ldGVyczpcbiAgICpcbiAgICogLSBgc2VuZGVyYDogW2BWaXN1YWxpemF0aW9uUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbnBhbmVsKVxcXG4gICAqIEEgYFZpc3VhbGl6YXRpb25QYW5lbGAgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgKlxuICAgKiAtIGBvcHRpb25zLmVsZW1lbnRzYDogQXJyYXlcXDxbYElWaXN1YWxpemVyUGFuZWxFbGVtZW50YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2l2aXN1YWxpemVycGFuZWxlbGVtZW50KVxcPlxcXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGFsbCB2aXN1YWxpemF0aW9uIGl0ZW1zIHJlbmRlcmVkIGJ5IHRoaXMgYFZpc3VhbGl6YXRpb25QYW5lbGAuXG4gICAqXG4gICAqIC0gYG9wdGlvbnMuZWxlbWVudGA6IFtgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaXZpc3VhbGl6ZXJwYW5lbGVsZW1lbnQpXFxcbiAgICogQSB2aXN1YWxpemF0aW9uIGl0ZW0gdGhhdCBoYXMgYmVlbiBtb3ZlZC5cbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRNb3ZlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgYW55XG4gID4oKTtcblxuICBwcm90ZWN0ZWQgdmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChcbiAgICBlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCxcbiAgICByZWFzb246IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAocmVhc29uID09PSBcIlNIT1dOXCIgJiYgIXRoaXMub25FbGVtZW50U2hvd24uaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRTaG93bi5maXJlKHRoaXMsIHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJlYXNvbiA9PT0gXCJSRU1PVkVEXCIgJiYgIXRoaXMub25FbGVtZW50SGlkZGVuLmlzRW1wdHkpIHtcbiAgICAgIHRoaXMub25FbGVtZW50SGlkZGVuLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocmVhc29uID09PSBcIk1PVkVEXCIgJiYgIXRoaXMub25FbGVtZW50TW92ZWQuaXNFbXB0eSkge1xuICAgICAgdGhpcy5vbkVsZW1lbnRNb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmlzRW1wdHkpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBlbGVtZW50czogdGhpcy5fZWxlbWVudHMsXG4gICAgICAgIGNoYW5nZWQ6IGVsZW1lbnQsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgc3RhdGU6IElTdGF0ZSkgPT4gYW55LFxuICAgIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHB1YmxpYyBvblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrOiBhbnk7XG5cbiAgcHJvdGVjdGVkIHJlbmRlclBhbmVsRWxlbWVudChcbiAgICBlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50LFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgKSB7XG4gICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50Lm5hbWUpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICEhY29udGFpbmVyICYmIGNvbnRhaW5lci5hcHBlbmRDaGlsZChxdWVzdGlvbkVsZW1lbnQpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25Db250ZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiaDNcIik7XG4gICAgY29uc3Qgdml6dWFsaXplckVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgdGl0bGVFbGVtZW50LmlubmVyVGV4dCA9IGVsZW1lbnQuZGlzcGxheU5hbWU7XG5cbiAgICBxdWVzdGlvbkVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5hbGxvd0R5bmFtaWNMYXlvdXRcbiAgICAgID8gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCIgXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZVxuICAgICAgOiBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWU7XG4gICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArIFwiX190aXRsZVwiO1xuICAgIGlmICh0aGlzLmFsbG93RHluYW1pY0xheW91dCAmJiB0aGlzLmFsbG93RHJhZ0Ryb3ApIHtcbiAgICAgIHRpdGxlRWxlbWVudC5jbGFzc05hbWUgPVxuICAgICAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lICtcbiAgICAgICAgXCIgXCIgK1xuICAgICAgICBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgK1xuICAgICAgICBcIl9fdGl0bGUtLWRyYWdnYWJsZVwiO1xuICAgIH1cbiAgICBxdWVzdGlvbkNvbnRlbnQuY2xhc3NOYW1lID0gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCJfX2NvbnRlbnRcIjtcbiAgICBxdWVzdGlvbkNvbnRlbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICBxdWVzdGlvbkNvbnRlbnQuYXBwZW5kQ2hpbGQodGl0bGVFbGVtZW50KTtcbiAgICBxdWVzdGlvbkNvbnRlbnQuYXBwZW5kQ2hpbGQodml6dWFsaXplckVsZW1lbnQpO1xuICAgIHF1ZXN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChxdWVzdGlvbkNvbnRlbnQpO1xuXG4gICAgdmlzdWFsaXplci5yZW5kZXIodml6dWFsaXplckVsZW1lbnQpO1xuXG4gICAgZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQgPSBxdWVzdGlvbkVsZW1lbnQ7XG4gICAgcmV0dXJuIHF1ZXN0aW9uRWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lICs9IFwiIHNhLXBhbmVsX19oZWFkZXJcIjtcbiAgICBzdXBlci5yZW5kZXJUb29sYmFyKGNvbnRhaW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSBcIiBzYS1wYW5lbF9fY29udGVudCBzYS1ncmlkXCI7XG5cbiAgICB0aGlzLnZpc2libGVFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoZWxlbWVudCwgY29udGFpbmVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RW5naW5lLnN0YXJ0KGNvbnRhaW5lcik7XG4gICAgLy8gISF3aW5kb3cgJiYgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFVJRXZlbnQoXCJyZXNpemVcIikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS5zdG9wKCk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXdzIHRoZSBgVmlzdWFsaXphdGlvblBhbmVsYCBhbmQgYWxsIGl0cyBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKCEhdGhpcy50b29sYmFyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgc3VwZXIucmVmcmVzaCgpO1xuICB9XG5cbiAgcHVibGljIGxheW91dCgpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHZpc3VhbGl6ZWQgZGF0YSBiYXNlZCBvbiBhIHNwZWNpZmllZCBxdWVzdGlvbiBuYW1lIGFuZCB2YWx1ZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSB1c2VyIGNsaWNrcyBhIGNoYXJ0IHBvaW50LlxuICAgKiBAcGFyYW0gcXVlc3Rpb25OYW1lIEEgcXVlc3Rpb24gW25hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9xdWVzdGlvbiNuYW1lKS5cbiAgICogQHBhcmFtIHNlbGVjdGVkVmFsdWVcbiAgICogQHNlZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucy5hbGxvd1NlbGVjdGlvblxuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcihxdWVzdGlvbk5hbWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhUHJvdmlkZXIuc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRlIG9mIGBWaXN1YWxpemF0aW9uUGFuZWxgLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlzdWFsaXplZCBlbGVtZW50cyBhbmQgY3VycmVudCBsb2NhbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IElTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICBlbGVtZW50czogW10uY29uY2F0KHRoaXMuX2VsZW1lbnRzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50Lm5hbWUpO1xuICAgICAgICBjb25zdCBlbGVtZW50U3RhdGUgPSB7IC4uLmVsZW1lbnQsIC4uLnZpc3VhbGl6ZXI/LmdldFN0YXRlKCkgfTtcbiAgICAgICAgaWYgKGVsZW1lbnRTdGF0ZS5yZW5kZXJlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSBlbGVtZW50U3RhdGUucmVuZGVyZWRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50U3RhdGU7XG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXRlKG5ld1N0YXRlOiBJU3RhdGUpIHtcbiAgICBpZiAoIW5ld1N0YXRlKSByZXR1cm47XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdTdGF0ZS5lbGVtZW50cykpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uTmFtZXMgPSB0aGlzLnF1ZXN0aW9ucy5tYXAocSA9PiBxLm5hbWUpO1xuICAgICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQobmV3U3RhdGUuZWxlbWVudHMuZmlsdGVyKGUgPT4gKHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlLm5hbWUpICE9PSAtMSkpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld1N0YXRlLmxvY2FsZSAhPT0gXCJ1bmRlZmluZWRcIikgdGhpcy5zZXRMb2NhbGUobmV3U3RhdGUubG9jYWxlKTtcblxuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudFN0YXRlID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudFN0YXRlLm5hbWUpO1xuICAgICAgaWYgKHZpc3VhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aXN1YWxpemVyLnNldFN0YXRlKGVsZW1lbnRTdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnMoKTogSVBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBJUGVybWlzc2lvbltdKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uLm5hbWUgPT09IGVsZW1lbnQubmFtZSlcbiAgICAgICAgICBlbGVtZW50LmlzUHVibGljID0gcGVybWlzc2lvbi5pc1B1YmxpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyAuLi5lbGVtZW50IH07XG4gICAgfSk7XG4gICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQodXBkYXRlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveVZpc3VhbGl6ZXJzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsIElRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJvdGVjdGVkIF9wYW5lbFZpc3VhbGl6ZXI6IFZpc3VhbGl6YXRpb25QYW5lbCA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInBhbmVsRHluYW1pY1wiKTtcbiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID0gZmFsc2U7XG4gICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChcbiAgICAgIHRoaXMuZ2V0UXVlc3Rpb25zKCksXG4gICAgICBbXSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJwYW5lbER5bmFtaWNcIjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBpZiAoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhbmVsRGF0YSA9IHBhbmVsRGF0YS5jb25jYXQoZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKTogSVF1ZXN0aW9uW10ge1xuICAgIGNvbnN0IHBhbmVsZHluYW1pYzogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gcGFuZWxkeW5hbWljLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Db21tZW50TW9kZWwsIHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJRGF0YUluZm8sIERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckZhY3RvcnkgfSBmcm9tIFwiLi92aXN1YWxpemVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL3Zpc3VhbGl6ZXJCYXNlLnNjc3NcIik7XG5cbi8qKlxuICogQSBiYXNlIG9iamVjdCBmb3IgYWxsIHZpc3VhbGl6ZXJzLiBVc2UgaXQgdG8gaW1wbGVtZW50IGEgY3VzdG9tIHZpc3VhbGl6ZXIuXG4gKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVyczpcbiAqXG4gKiAtIGBxdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAqIEEgc3VydmV5IHF1ZXN0aW9uIHRvIHZpc3VhbGl6ZS5cbiAqIC0gYGRhdGFgOiBgQXJyYXk8YW55PmBcXFxuICogU3VydmV5IHJlc3VsdHMuXG4gKiAtIGBvcHRpb25zYFxcXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAtIGBzZXJpZXNWYWx1ZXNgOiBgQXJyYXk8c3RyaW5nPmBcXFxuICogICAgU2VyaWVzIHZhbHVlcyB1c2VkIHRvIGdyb3VwIGRhdGEuXG4gKiAgICAtIGBzZXJpZXNMYWJlbHNgOiBgQXJyYXk8c3RyaW5nPmBcXFxuICogICAgU2VyaWVzIGxhYmVscyB0byBkaXNwbGF5LiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQsIGBzZXJpZXNWYWx1ZXNgIGFyZSB1c2VkIGFzIGxhYmVscy5cbiAqICAgIC0gYHN1cnZleWA6IFtgU3VydmV5TW9kZWxgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwpXFxcbiAqICAgIFBhc3MgYSBgU3VydmV5TW9kZWxgIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIHVzZSBsb2NhbGVzIGZyb20gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAqICAgIC0gYGRhdGFQcm92aWRlcmA6IGBEYXRhUHJvdmlkZXJgXFxcbiAqICAgIEEgZGF0YSBwcm92aWRlciBmb3IgdGhpcyB2aXN1YWxpemVyLlxuICogLSBgdHlwZWA6IGBzdHJpbmdgXFxcbiAqICooT3B0aW9uYWwpKiBUaGUgdmlzdWFsaXplcidzIHR5cGUuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZXhhbXBsZXMvaG93LXRvLXBsb3Qtc3VydmV5LWRhdGEtaW4tY3VzdG9tLWJhci1jaGFydC8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyQmFzZSBpbXBsZW1lbnRzIElEYXRhSW5mbyB7XG4gIHByaXZhdGUgX3Nob3dUb29sYmFyID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZm9vdGVyVmlzdWFsaXplcjogVmlzdWFsaXplckJhc2UgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2RhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyID0gMjc7XG4gIHByb3RlY3RlZCByZW5kZXJSZXN1bHQ6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdG9vbGJhckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBoZWFkZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgY29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBmb290ZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRRdWVzdGlvblR5cGUgPSBcImNvbW1lbnRcIjsgLy8gVE9ETzogbWFrZSBpdCBjb25maWd1cmVhYmxlIC0gYWxsb3cgY2hvb3NlIHdoYXQga2luZCBvZiBxdWVzdGlvbi92aXN1YWxpemVyIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMvb3RoZXJzXG4gIHB1YmxpYyBzdGF0aWMgb3RoZXJDb21tZW50Q29sbGFwc2VkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgYWZ0ZXIgdGhlIHZpc3VhbGl6ZXIncyBjb250ZW50IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgVmlzdWFsaXplckJhc2VgXFxcbiAgICogQSBgVmlzdWFsaXplckJhc2VgIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5odG1sRWxlbWVudGA6IGBIVE1MRWxlbWVudGBcXFxuICAgKiBBIHBhZ2UgZWxlbWVudCB3aXRoIHRoZSB2aXN1YWxpemVyJ3MgY29udGVudC5cbiAgICogQHNlZSByZW5kZXJcbiAgICogQHNlZSByZWZyZXNoXG4gICAqKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6ZXJCYXNlLCBhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIGFmdGVyUmVuZGVyKGNvbnRlbnRDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyLmZpcmUodGhpcywgeyBodG1sRWxlbWVudDogY29udGVudENvbnRhaW5lciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCBhZnRlciBhIG5ldyBsb2NhbGUgaXMgc2V0LlxuICAgKlxuICAgKiBQYXJhbWV0ZXJzOlxuICAgKlxuICAgKiAtIGBzZW5kZXJgOiBgVmlzdWFsaXplckJhc2VgXFxcbiAgICogQSBgVmlzdWFsaXplckJhc2VgIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICpcbiAgICogLSBgb3B0aW9ucy5sb2NhbGVgOiBgc3RyaW5nYFxcXG4gICAqIFRoZSBpbmRlbnRpZmllciBvZiBhIG5ldyBsb2NhbGUgKGZvciBleGFtcGxlLCBcImVuXCIpLlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogeyBsb2NhbGU6IHN0cmluZyB9KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBwcm90ZWN0ZWQgdG9vbGJhckl0ZW1DcmVhdG9yczogeyBbbmFtZTogc3RyaW5nXTogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBwdWJsaWMgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBvcHRpb25zLmRhdGFQcm92aWRlciB8fCBuZXcgRGF0YVByb3ZpZGVyKGRhdGEpO1xuICAgIHRoaXMuX2RhdGFQcm92aWRlci5vbkRhdGFDaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLm9uRGF0YUNoYW5nZWQoKSk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubGFiZWxUcnVuY2F0ZUxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5sYWJlbFRydW5jYXRlTGVuZ3RoID0gb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgYSB2aXN1YWxpemVkIHF1ZXN0aW9uLlxuICAgKi9cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWVOYW1lIHx8IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlzdWFsaXplciBkaXNwbGF5cyBhIGhlYWRlci4gVGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgd2hlbiBhIHZpc3VhbGl6ZWQgcXVlc3Rpb24gaGFzIGEgY29ycmVjdCBhbnN3ZXIuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgaGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd0NvcnJlY3RBbnN3ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gJiYgISF0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpc3VhbGl6ZXIgZGlzcGxheXMgYSBmb290ZXIuIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHdoZW4gYSB2aXN1YWxpemVkIHF1ZXN0aW9uIGhhcyBhIGNvbW1lbnQuXG4gICAqIEBzZWUgaGFzSGVhZGVyXG4gICAqL1xuICBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMucXVlc3Rpb24gJiYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCB8fCB0aGlzLnF1ZXN0aW9uLmhhc090aGVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVmlzdWFsaXplcjxUID0gVmlzdWFsaXplckJhc2U+KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFQge1xuICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kYXRhUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFZpc3VhbGl6ZXJGYWN0b3J5LmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24sIHRoaXMuZGF0YSwgb3B0aW9ucykgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9vdGVyIHZpc3VhbGl6ZXIuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGZvb3RlciBpcyBhYnNlbnQuXG4gICAqIEBzZWUgaGFzRm9vdGVyXG4gICAqL1xuICBnZXQgZm9vdGVyVmlzdWFsaXplcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLm5hbWUgKyAoc2V0dGluZ3MgfHwge30pLmNvbW1lbnRQcmVmaXhcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi50aXRsZSA9IHRoaXMucHJvY2Vzc1RleHQodGhpcy5xdWVzdGlvbi50aXRsZSk7XG5cbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdXNlcnMgY2FuIHNlbGVjdCBzZXJpZXMgcG9pbnRzIHRvIGNyb3NzLWZpbHRlciBjaGFydHMuIFRvIGFsbG93IG9yIGRpc2FsbG93IHNlbGVjdGlvbiwgc2V0IHRoZSBgYWxsb3dTZWxlY3Rpb25gIHByb3BlcnR5IG9mIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbikgJiZcbiAgICAgIHRoaXMuX3N1cHBvcnRTZWxlY3Rpb25cbiAgICApO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzVmFsdWVzIHx8IFtdO1xuICB9XG5cbiAgZ2V0U2VyaWVzTGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzTGFiZWxzIHx8IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gIH1cblxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gIH1cblxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSB0b29sYmFyIGl0ZW0gZm9yIHRoaXMgdmlzdWFsaXplci5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0byBhZGQgYSBjdXN0b20gYnV0dG9uIGFuZCBkcm9wLWRvd24gbWVudSB0byB0aGUgdG9vbGJhcjpcbiAgICpcbiAgICogYGBganNcbiAgICogaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCJzdXJ2ZXktYW5hbHl0aWNzXCI7XG4gICAqXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbCggLi4uICk7XG4gICAqXG4gICAqIC8vIEFkZCBhIGN1c3RvbSBidXR0b24gdG8gdGhlIHRvb2xiYXJcbiAgICogdml6UGFuZWwudmlzdWFsaXplcnNbMF0ucmVnaXN0ZXJUb29sYmFySXRlbShcIm15LXRvb2xiYXItYnV0dG9uXCIsICgpID0+IHtcbiAgICogICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKFxuICAgKiAgICAgLy8gQSBidXR0b24gY2xpY2sgZXZlbnQgaGFuZGxlclxuICAgKiAgICAgKCkgPT4ge1xuICAgKiAgICAgICBhbGVydChcIkN1c3RvbSB0b29sYmFyIGJ1dHRvbiBpcyBjbGlja2VkXCIpO1xuICAgKiAgICAgfSxcbiAgICogICAgIC8vIEJ1dHRvbiBjYXB0aW9uXG4gICAqICAgICBcIkJ1dHRvblwiXG4gICAqICAgKTtcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEFkZCBhIGN1c3RvbSBkcm9wLWRvd24gbWVudSB0byB0aGUgdG9vbGJhclxuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5yZWdpc3RlclRvb2xiYXJJdGVtKFwibXktdG9vbGJhci1kcm9wZG93blwiLCAoKSA9PiB7XG4gICAqICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgKiAgICAgLy8gTWVudSBpdGVtc1xuICAgKiAgICAgW1xuICAgKiAgICAgICB7IHZhbHVlOiAxLCB0ZXh0OiBcIk9uZVwiIH0sXG4gICAqICAgICAgIHsgdmFsdWU6IDIsIHRleHQ6IFwiVHdvXCIgfSxcbiAgICogICAgICAgeyB2YWx1ZTogMywgdGV4dDogXCJUaHJlZVwiIH1cbiAgICogICAgIF0sXG4gICAqICAgICAvLyBBIGZ1bmN0aW9uIHRoYXQgc3BlY2lmaWVzIGluaXRpYWwgc2VsZWN0aW9uXG4gICAqICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICogICAgIC8vIEFuIGV2ZW50IGhhbmRsZXIgdGhhdCBpcyBleGVjdXRlZCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkXG4gICAqICAgICAoZSkgPT4ge1xuICAgKiAgICAgICBhbGVydChlLnRhcmdldC52YWx1ZSk7XG4gICAqICAgICB9XG4gICAqICAgKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gbmFtZSBBIGN1c3RvbSBuYW1lIGZvciB0aGUgdG9vbGJhciBpdGVtLlxuICAgKiBAcGFyYW0gY3JlYXRvciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgdG9vbGJhciBhbmQgc2hvdWxkIHJldHVybiBhbiBgSFRNTEVsZW1lbnRgIHdpdGggdGhlIHRvb2xiYXIgaXRlbS5cbiAgICogQHNlZSB1bnJlZ2lzdGVyVG9vbGJhckl0ZW1cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRvb2xiYXJJdGVtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVhdG9yOiAodG9vbGJhcj86IEhUTUxEaXZFbGVtZW50KSA9PiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV0gPSBjcmVhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBVbnJlZ2lzdGVycyBhIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgdG9vbGJhciBpdGVtLiBBbGxvd3MgeW91IHRvIHJlbW92ZSBhIHRvb2xiYXIgaXRlbS5cbiAgICogQHBhcmFtIG5hbWUgQSB0b29sYmFyIGl0ZW0gbmFtZS5cbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiBwcmV2aW91c2x5IHVzZWQgdG8gW3JlZ2lzdGVyXSgjcmVnaXN0ZXJUb29sYmFySXRlbSkgdGhlIHJlbW92ZWQgdG9vbGJhciBpdGVtLlxuICAgKiBAc2VlIHJlZ2lzdGVyVG9vbGJhckl0ZW1cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVG9vbGJhckl0ZW0oXG4gICAgbmFtZTogc3RyaW5nXG4gICk6ICh0b29sYmFyPzogSFRNTERpdkVsZW1lbnQpID0+IEhUTUxFbGVtZW50IHtcbiAgICBpZih0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3JlYXRvciA9IHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1tuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnNbbmFtZV07XG4gICAgICByZXR1cm4gY3JlYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXN1YWxpemVyJ3MgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZSB8fCBcInZpc3VhbGl6ZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgc3VydmV5RGF0YWBdKGh0dHBzOi8vc3VydmV5anMuaW8vZGFzaGJvYXJkL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS92aXN1YWxpemF0aW9ucGFuZWwjc3VydmV5RGF0YSkgaW5zdGVhZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3VydmV5IHJlc3VsdHMgdXNlZCB0byBjYWxjdWxhdGUgdmFsdWVzIGZvciB2aXN1YWxpemF0aW9uLiBJZiBhIHVzZXIgYXBwbGllcyBhIGZpbHRlciwgdGhlIGFycmF5IGlzIGFsc28gZmlsdGVyZWQuXG4gICAqXG4gICAqIFRvIGdldCBhbiBhcnJheSBvZiBjYWxjdWxhdGVkIGFuZCB2aXN1YWxpemVkIHZhbHVlcywgY2FsbCB0aGUgW2BnZXRDYWxjdWxhdGVkVmFsdWVzKClgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2UjZ2V0Q2FsY3VsYXRlZFZhbHVlcykgbWV0aG9kLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5maWx0ZXJlZERhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGRhdGFQcm92aWRlcigpOiBEYXRhUHJvdmlkZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2aXN1YWxpemVkIGRhdGEuXG4gICAqIEBwYXJhbSBkYXRhIEEgZGF0YSBhcnJheSB3aXRoIHN1cnZleSByZXN1bHRzIHRvIGJlIHZpc3VhbGl6ZWQuXG4gICAqL1xuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNGb290ZXIpIHtcbiAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG9uVXBkYXRlOiAoKSA9PiB2b2lkO1xuXG4gIGludm9rZU9uVXBkYXRlKCkge1xuICAgIHRoaXMub25VcGRhdGUgJiYgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZpc3VhbGl6ZXIgYW5kIGFsbCBpdHMgZWxlbWVudHMgZnJvbSB0aGUgRE9NLlxuICAgKiBAc2VlIGNsZWFyXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGlmICghIXRoaXMucmVuZGVyUmVzdWx0KSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB0aGlzLnRvb2xiYXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmhlYWRlckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZm9vdGVyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5yZW5kZXJSZXN1bHQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMucmVuZGVyUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSB0b29sYmFyLCBoZWFkZXIsIGZvb3RlciwgYW5kIGNvbnRlbnQgY29udGFpbmVycy5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gZW1wdHkgYW5kIGRlbGV0ZSB0aGUgdmlzdWFsaXplciBhbmQgYWxsIGl0cyBlbGVtZW50cyBmcm9tIHRoZSBET00sIGNhbGwgdGhlIFtgZGVzdHJveSgpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6ZXJiYXNlI2Rlc3Ryb3kpIG1ldGhvZCBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIGlmICghIXRoaXMudG9vbGJhckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmhlYWRlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95SGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5jb250ZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZm9vdGVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUb29sYmFySXRlbXModG9vbGJhcjogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnMgfHwge30pLmZvckVhY2goKHRvb2xiYXJJdGVtTmFtZSkgPT4ge1xuICAgICAgbGV0IHRvb2xiYXJJdGVtID0gdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW3Rvb2xiYXJJdGVtTmFtZV0odG9vbGJhcik7XG4gICAgICBpZiAoISF0b29sYmFySXRlbSkge1xuICAgICAgICB0b29sYmFyLmFwcGVuZENoaWxkKHRvb2xiYXJJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gPyB0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXIgOiBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgY29uc3QgdG9vbGJhciA9IDxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS10b29sYmFyXCIpXG4gICAgICApO1xuICAgICAgdGhpcy5jcmVhdGVUb29sYmFySXRlbXModG9vbGJhcik7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbGJhcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0cm95Q29udGVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckhlYWRlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMucmVuZGVySGVhZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yZW5kZXJIZWFkZXIoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29ycmVjdEFuc3dlckVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2NvcnJlY3QtYW5zd2VyXCJcbiAgICAgICk7XG4gICAgICBjb3JyZWN0QW5zd2VyRWxlbWVudC5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29ycmVjdEFuc3dlclwiKSArIHRoaXMuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb3JyZWN0QW5zd2VyRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvblwiKTtcbiAgICB9XG4gICAgdGhpcy5hZnRlclJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckZvb3Rlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICBjb25zdCBmb290ZXJUaXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImg0XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9fZm9vdGVyLXRpdGxlXCIsXG4gICAgICAgIHsgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJDb21tZW50VGl0bGVcIikgfVxuICAgICAgKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb290ZXJUaXRsZUVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBmb290ZXJDb250ZW50RWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9fZm9vdGVyLWNvbnRlbnRcIlxuICAgICAgKTtcbiAgICAgIGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBWaXN1YWxpemVyQmFzZS5vdGhlckNvbW1lbnRDb2xsYXBzZWRcbiAgICAgICAgPyBcIm5vbmVcIlxuICAgICAgICA6IFwiYmxvY2tcIjtcblxuICAgICAgY29uc3QgdmlzaWJpbGl0eUJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgIGlmIChmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgIGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgdmlzaWJpbGl0eUJ1dHRvbi5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZUJ1dHRvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgdmlzaWJpbGl0eUJ1dHRvbi5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFxuICAgICAgICAgICAgVmlzdWFsaXplckJhc2Uub3RoZXJDb21tZW50Q29sbGFwc2VkID8gXCJzaG93QnV0dG9uXCIgOiBcImhpZGVCdXR0b25cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb290ZXJWaXN1YWxpemVyLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd0J1dHRvblwiKSAvKiwgXCJzYS10b29sYmFyX19idXR0b24tLXJpZ2h0XCIqLyk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodmlzaWJpbGl0eUJ1dHRvbik7XG5cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb290ZXJDb250ZW50RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci5yZW5kZXIoZm9vdGVyQ29udGVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB2aXN1YWxpemVyIGluIGEgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHRhcmdldEVsZW1lbnQgQW4gYEhUTUxFbGVtZW50YCBvciBhbiBgaWRgIG9mIGEgcGFnZSBlbGVtZW50IGluIHdoaWNoIHlvdSB3YW50IHRvIHJlbmRlciB0aGUgdmlzdWFsaXplci5cbiAgICovXG4gIHJlbmRlcih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0RWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGFyZ2V0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldEVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlclJlc3VsdCA9IHRhcmdldEVsZW1lbnQ7XG5cbiAgICB0aGlzLnRvb2xiYXJDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fdG9vbGJhclwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG5cbiAgICBpZiAodGhpcy5oYXNIZWFkZXIpIHtcbiAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19oZWFkZXJcIlxuICAgICAgKTtcbiAgICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJIZWFkZXIodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX19jb250ZW50XCJcbiAgICApO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcblxuICAgIHRoaXMuZm9vdGVyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3RlclwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLnJlbmRlckZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVuZGVycyB0aGUgdmlzdWFsaXplciBhbmQgaXRzIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLmhlYWRlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyRm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcEh0bWxGcm9tVGl0bGVzICE9PSBmYWxzZSkge1xuICAgICAgbGV0IG9yaWdpbmFsVGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICAgIGxldCBwcm9jZXNzZWRUZXh0ID0gb3JpZ2luYWxUZXh0LnJlcGxhY2UoLyg8KFtePl0rKT4pL2dpLCBcIlwiKTtcbiAgICAgIHJldHVybiBwcm9jZXNzZWRUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGdldFJhbmRvbUNvbG9yKCkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgcmV0dXJuIGNvbG9yc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjb2xvcnMubGVuZ3RoKV07XG4gIH1cblxuICBwcml2YXRlIF9iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmN2Y3ZjdcIjtcblxuICBnZXQgYmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gdGhpcy5nZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCk7IH1cbiAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZSkgeyB0aGlzLnNldEJhY2tncm91bmRDb2xvckNvcmUodmFsdWUpOyB9XG5cbiAgcHJvdGVjdGVkIGdldEJhY2tncm91bmRDb2xvckNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgaWYgKHRoaXMuZm9vdGVyVmlzdWFsaXplcikgdGhpcy5mb290ZXJWaXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICB9XG5cbiAgc3RhdGljIGN1c3RvbUNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3JzID0gW1xuICAgIFwiIzg2ZTFmYlwiLFxuICAgIFwiIzM5OTlmYlwiLFxuICAgIFwiI2ZmNjc3MVwiLFxuICAgIFwiIzFlYjQ5NlwiLFxuICAgIFwiI2ZmYzE1MlwiLFxuICAgIFwiI2FiYTFmZlwiLFxuICAgIFwiIzdkOGRhNVwiLFxuICAgIFwiIzRlYzQ2Y1wiLFxuICAgIFwiI2NmMzdhNlwiLFxuICAgIFwiIzRlNjE5OFwiLFxuICBdO1xuXG4gIGdldENvbG9ycyhjb3VudCA9IDEwKSB7XG4gICAgY29uc3QgY29sb3JzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzKSAmJlxuICAgICAgICBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnMubGVuZ3RoID4gMFxuICAgICAgICA/IFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9yc1xuICAgICAgICA6IFZpc3VhbGl6ZXJCYXNlLmNvbG9ycztcblxuICAgIGxldCBtYW55Q29sb3JzOiBhbnkgPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgbWFueUNvbG9ycyA9IG1hbnlDb2xvcnMuY29uY2F0KGNvbG9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbnlDb2xvcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB2aXN1YWxpemVyJ3MgdG9vbGJhci5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dUb29sYmFyO1xuICB9XG4gIHNldCBzaG93VG9vbGJhcihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLl9zaG93VG9vbGJhcikge1xuICAgICAgdGhpcy5fc2hvd1Rvb2xiYXIgPSBuZXdWYWx1ZTtcbiAgICAgIGlmICghIXRoaXMudG9vbGJhckNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIFtgZ2V0Q2FsY3VsYXRlZFZhbHVlcygpYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCNnZXRDYWxjdWxhdGVkVmFsdWVzKSBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2FsY3VsYXRlZCBhbmQgdmlzdWFsaXplZCB2YWx1ZXMuIElmIGEgdXNlciBhcHBsaWVzIGEgZmlsdGVyLCB0aGUgYXJyYXkgaXMgYWxzbyBmaWx0ZXJlZC5cbiAgICpcbiAgICogVG8gZ2V0IGFuIGFycmF5IG9mIHNvdXJjZSBzdXJ2ZXkgcmVzdWx0cywgdXNlIHRoZSBbYHN1cnZleURhdGFgXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXplcmJhc2Ujc3VydmV5RGF0YSkgcHJvcGVydHkuXG4gICAqL1xuICBnZXRDYWxjdWxhdGVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjdXJyZW50IHZpc3VhbGl6ZXIgc3RhdGUuIFRoZSBwcm9wZXJ0aWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aXN1YWxpemVyLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgc2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzdWFsaXplcidzIHN0YXRlLlxuICAgKlxuICAgKiA+IFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50IGNsYXNzZXMuXG4gICAqIEBzZWUgZ2V0U3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IGxvY2FsZS5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gaW5oZXJpdCB0aGUgbG9jYWxlIGZyb20gYSB2aXN1YWxpemVkIHN1cnZleSwgYXNzaWduIGEgYFN1cnZleU1vZGVsYCBpbnN0YW5jZSB0byB0aGUgYHN1cnZleWAgcHJvcGVydHkgb2YgdGhlIGBvcHRpb25zYCBvYmplY3QgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBJZiB0aGUgc3VydmV5IGlzIFt0cmFuc2xhdGVkIGludG8gbW9yZSB0aGFuIG9uZSBsYW5ndWFnZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvc3VydmV5LWxvY2FsaXphdGlvbi8pLCB0aGUgdG9vbGJhciBkaXNwbGF5cyBhIGxhbmd1YWdlIHNlbGVjdGlvbiBkcm9wLWRvd24gbWVudS5cbiAgICogQHNlZSBvbkxvY2FsZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmV0dXJuIHN1cnZleS5sb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLm9uTG9jYWxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgbG9jYWxlOiBuZXdMb2NhbGUgfSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMub3B0aW9ucy5zdXJ2ZXk7XG4gICAgaWYgKCEhc3VydmV5ICYmIHN1cnZleS5sb2NhbGUgIT09IG5ld0xvY2FsZSkge1xuICAgICAgc3VydmV5LmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICB9XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBpbmRpdmlkdWFsIHZpc3VhbGl6ZXJzIHdpdGhvdXQgY3JlYXRpbmcgYSBbdmlzdWFsaXphdGlvbiBwYW5lbF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9kYXNoYm9hcmQvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25wYW5lbCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdmlzdWFsaXplciBmb3IgYSBzaW5nbGUgcXVlc3Rpb24uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGltcG9ydCB7IFZpc3VhbGl6ZXJGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1hbmFseXRpY3NcIjtcbiAgICpcbiAgICogY29uc3QgdmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemVyRmFjdG9yeS5jcmVhdGVWaXN1YWxpemVyKFxuICAgKiAgIHF1ZXN0aW9uLFxuICAgKiAgIGRhdGEsXG4gICAqICAgb3B0aW9uc1xuICAgKiApO1xuICAgKlxuICAgKiB2aXN1YWxpemVyLnJlbmRlcihcImNvbnRhaW5lcklkXCIpXG4gICAqIGBgYFxuICAgKlxuICAgKiBJZiBhIHF1ZXN0aW9uIGhhcyBtb3JlIHRoYW4gb25lIFtyZWdpc3RlcmVkXShodHRwczovL3N1cnZleWpzLmlvL2Rhc2hib2FyZC9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvdmlzdWFsaXphdGlvbm1hbmFnZXIjcmVnaXN0ZXJWaXN1YWxpemVyKSB2aXN1YWxpemVyLCB1c2VycyBjYW4gc3dpdGNoIGJldHdlZW4gdGhlbSB1c2luZyBhIGRyb3AtZG93biBtZW51LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gQSBxdWVzdGlvbiBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgdmlzdWFsaXplci5cbiAgICogQHBhcmFtIGRhdGEgQSBkYXRhIGFycmF5IHdpdGggc3VydmV5IHJlc3VsdHMgdG8gYmUgdmlzdWFsaXplZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IHdpdGggYW55IGN1c3RvbSBwcm9wZXJ0aWVzIHlvdSBuZWVkIHdpdGhpbiB0aGUgdmlzdWFsaXplci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlVmlzdWFsaXplcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG4gICk6IFZpc3VhbGl6ZXJCYXNlIHtcbiAgICBsZXQgdHlwZTtcblxuICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwidGV4dFwiICYmICg8YW55PnF1ZXN0aW9uKS5pbnB1dFR5cGUpIHtcbiAgICAgIHR5cGUgPSAoPGFueT5xdWVzdGlvbikuaW5wdXRUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIH1cblxuICAgIHZhciBjcmVhdG9ycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLmdldFZpc3VhbGl6ZXJzQnlUeXBlKHR5cGUpO1xuICAgIHZhciB2aXN1YWxpemVycyA9IGNyZWF0b3JzLm1hcChcbiAgICAgIChjcmVhdG9yKSA9PiBuZXcgY3JlYXRvcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucylcbiAgICApO1xuICAgIGlmICh2aXN1YWxpemVycy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyQ29uc3RydWN0b3IgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRBbHRWaXN1YWxpemVyU2VsZWN0b3IoKTtcbiAgICAgIGxldCB2aXN1YWxpemVyID0gbmV3IGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgdmlzdWFsaXplcnMsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBkYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZpc3VhbGl6ZXI7XG4gICAgfVxuICAgIHJldHVybiB2aXN1YWxpemVyc1swXTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiZGVcIixcbiAgXCJlblwiLFxuICBcInZhblwiLFxuICBcImlrXCIsXG4gIFwidGVcIixcbiAgXCJkYXRcIixcbiAgXCJkaWVcIixcbiAgXCJpblwiLFxuICBcImVlblwiLFxuICBcImhpalwiLFxuICBcImhldFwiLFxuICBcIm5pZXRcIixcbiAgXCJ6aWpuXCIsXG4gIFwiaXNcIixcbiAgXCJ3YXNcIixcbiAgXCJvcFwiLFxuICBcImFhblwiLFxuICBcIm1ldFwiLFxuICBcImFsc1wiLFxuICBcInZvb3JcIixcbiAgXCJoYWRcIixcbiAgXCJlclwiLFxuICBcIm1hYXJcIixcbiAgXCJvbVwiLFxuICBcImhlbVwiLFxuICBcImRhblwiLFxuICBcInpvdVwiLFxuICBcIm9mXCIsXG4gIFwid2F0XCIsXG4gIFwibWlqblwiLFxuICBcIm1lblwiLFxuICBcImRpdFwiLFxuICBcInpvXCIsXG4gIFwiZG9vclwiLFxuICBcIm92ZXJcIixcbiAgXCJ6ZVwiLFxuICBcInppY2hcIixcbiAgXCJiaWpcIixcbiAgXCJvb2tcIixcbiAgXCJ0b3RcIixcbiAgXCJqZVwiLFxuICBcIm1palwiLFxuICBcInVpdFwiLFxuICBcImRlclwiLFxuICBcImRhYXJcIixcbiAgXCJoYWFyXCIsXG4gIFwibmFhclwiLFxuICBcImhlYlwiLFxuICBcImhvZVwiLFxuICBcImhlZWZ0XCIsXG4gIFwiaGViYmVuXCIsXG4gIFwiZGV6ZVwiLFxuICBcInVcIixcbiAgXCJ3YW50XCIsXG4gIFwibm9nXCIsXG4gIFwiemFsXCIsXG4gIFwibWVcIixcbiAgXCJ6aWpcIixcbiAgXCJudVwiLFxuICBcImdlXCIsXG4gIFwiZ2VlblwiLFxuICBcIm9tZGF0XCIsXG4gIFwiaWV0c1wiLFxuICBcIndvcmRlblwiLFxuICBcInRvY2hcIixcbiAgXCJhbFwiLFxuICBcIndhcmVuXCIsXG4gIFwidmVlbFwiLFxuICBcIm1lZXJcIixcbiAgXCJkb2VuXCIsXG4gIFwidG9lblwiLFxuICBcIm1vZXRcIixcbiAgXCJiZW5cIixcbiAgXCJ6b25kZXJcIixcbiAgXCJrYW5cIixcbiAgXCJodW5cIixcbiAgXCJkdXNcIixcbiAgXCJhbGxlc1wiLFxuICBcIm9uZGVyXCIsXG4gIFwiamFcIixcbiAgXCJlZW5zXCIsXG4gIFwiaGllclwiLFxuICBcIndpZVwiLFxuICBcIndlcmRcIixcbiAgXCJhbHRpamRcIixcbiAgXCJkb2NoXCIsXG4gIFwid29yZHRcIixcbiAgXCJ3ZXplblwiLFxuICBcImt1bm5lblwiLFxuICBcIm9uc1wiLFxuICBcInplbGZcIixcbiAgXCJ0ZWdlblwiLFxuICBcIm5hXCIsXG4gIFwicmVlZHNcIixcbiAgXCJ3aWxcIixcbiAgXCJrb25cIixcbiAgXCJuaWV0c1wiLFxuICBcInV3XCIsXG4gIFwiaWVtYW5kXCIsXG4gIFwiZ2V3ZWVzdFwiLFxuICBcImFuZGVyZVwiXG5dO1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYVwiLFxuICBcImFib3V0XCIsXG4gIFwiYWJvdmVcIixcbiAgXCJhY3Jvc3NcIixcbiAgXCJhZnRlclwiLFxuICBcImFnYWluXCIsXG4gIFwiYWdhaW5zdFwiLFxuICBcImFsbFwiLFxuICBcImFsbW9zdFwiLFxuICBcImFsb25lXCIsXG4gIFwiYWxvbmdcIixcbiAgXCJhbHJlYWR5XCIsXG4gIFwiYWxzb1wiLFxuICBcImFsdGhvdWdoXCIsXG4gIFwiYWx3YXlzXCIsXG4gIFwiYW1vbmdcIixcbiAgXCJhblwiLFxuICBcImFuZFwiLFxuICBcImFub3RoZXJcIixcbiAgXCJhbnlcIixcbiAgXCJhbnlib2R5XCIsXG4gIFwiYW55b25lXCIsXG4gIFwiYW55dGhpbmdcIixcbiAgXCJhbnl3aGVyZVwiLFxuICBcImFyZVwiLFxuICBcImFyZWFcIixcbiAgXCJhcmVhc1wiLFxuICBcImFyb3VuZFwiLFxuICBcImFzXCIsXG4gIFwiYXNrXCIsXG4gIFwiYXNrZWRcIixcbiAgXCJhc2tpbmdcIixcbiAgXCJhc2tzXCIsXG4gIFwiYXRcIixcbiAgXCJhd2F5XCIsXG4gIFwiYlwiLFxuICBcImJhY2tcIixcbiAgXCJiYWNrZWRcIixcbiAgXCJiYWNraW5nXCIsXG4gIFwiYmFja3NcIixcbiAgXCJiZVwiLFxuICBcImJlY2FtZVwiLFxuICBcImJlY2F1c2VcIixcbiAgXCJiZWNvbWVcIixcbiAgXCJiZWNvbWVzXCIsXG4gIFwiYmVlblwiLFxuICBcImJlZm9yZVwiLFxuICBcImJlZ2FuXCIsXG4gIFwiYmVoaW5kXCIsXG4gIFwiYmVpbmdcIixcbiAgXCJiZWluZ3NcIixcbiAgXCJiZXN0XCIsXG4gIFwiYmV0dGVyXCIsXG4gIFwiYmV0d2VlblwiLFxuICBcImJpZ1wiLFxuICBcImJvdGhcIixcbiAgXCJidXRcIixcbiAgXCJieVwiLFxuICBcImNcIixcbiAgXCJjYW1lXCIsXG4gIFwiY2FuXCIsXG4gIFwiY2Fubm90XCIsXG4gIFwiY2FzZVwiLFxuICBcImNhc2VzXCIsXG4gIFwiY2VydGFpblwiLFxuICBcImNlcnRhaW5seVwiLFxuICBcImNsZWFyXCIsXG4gIFwiY2xlYXJseVwiLFxuICBcImNvbWVcIixcbiAgXCJjb3VsZFwiLFxuICBcImRcIixcbiAgXCJkaWRcIixcbiAgXCJkaWZmZXJcIixcbiAgXCJkaWZmZXJlbnRcIixcbiAgXCJkaWZmZXJlbnRseVwiLFxuICBcImRvXCIsXG4gIFwiZG9lc1wiLFxuICBcImRvbmVcIixcbiAgXCJkb3duXCIsXG4gIFwiZG93blwiLFxuICBcImRvd25lZFwiLFxuICBcImRvd25pbmdcIixcbiAgXCJkb3duc1wiLFxuICBcImR1cmluZ1wiLFxuICBcImVcIixcbiAgXCJlYWNoXCIsXG4gIFwiZWFybHlcIixcbiAgXCJlaXRoZXJcIixcbiAgXCJlbmRcIixcbiAgXCJlbmRlZFwiLFxuICBcImVuZGluZ1wiLFxuICBcImVuZHNcIixcbiAgXCJlbm91Z2hcIixcbiAgXCJldmVuXCIsXG4gIFwiZXZlbmx5XCIsXG4gIFwiZXZlclwiLFxuICBcImV2ZXJ5XCIsXG4gIFwiZXZlcnlib2R5XCIsXG4gIFwiZXZlcnlvbmVcIixcbiAgXCJldmVyeXRoaW5nXCIsXG4gIFwiZXZlcnl3aGVyZVwiLFxuICBcImZcIixcbiAgXCJmYWNlXCIsXG4gIFwiZmFjZXNcIixcbiAgXCJmYWN0XCIsXG4gIFwiZmFjdHNcIixcbiAgXCJmYXJcIixcbiAgXCJmZWx0XCIsXG4gIFwiZmV3XCIsXG4gIFwiZmluZFwiLFxuICBcImZpbmRzXCIsXG4gIFwiZmlyc3RcIixcbiAgXCJmb3JcIixcbiAgXCJmb3VyXCIsXG4gIFwiZnJvbVwiLFxuICBcImZ1bGxcIixcbiAgXCJmdWxseVwiLFxuICBcImZ1cnRoZXJcIixcbiAgXCJmdXJ0aGVyZWRcIixcbiAgXCJmdXJ0aGVyaW5nXCIsXG4gIFwiZnVydGhlcnNcIixcbiAgXCJnXCIsXG4gIFwiZ2F2ZVwiLFxuICBcImdlbmVyYWxcIixcbiAgXCJnZW5lcmFsbHlcIixcbiAgXCJnZXRcIixcbiAgXCJnZXRzXCIsXG4gIFwiZ2l2ZVwiLFxuICBcImdpdmVuXCIsXG4gIFwiZ2l2ZXNcIixcbiAgXCJnb1wiLFxuICBcImdvaW5nXCIsXG4gIFwiZ29vZFwiLFxuICBcImdvb2RzXCIsXG4gIFwiZ290XCIsXG4gIFwiZ3JlYXRcIixcbiAgXCJncmVhdGVyXCIsXG4gIFwiZ3JlYXRlc3RcIixcbiAgXCJncm91cFwiLFxuICBcImdyb3VwZWRcIixcbiAgXCJncm91cGluZ1wiLFxuICBcImdyb3Vwc1wiLFxuICBcImhcIixcbiAgXCJoYWRcIixcbiAgXCJoYXNcIixcbiAgXCJoYXZlXCIsXG4gIFwiaGF2aW5nXCIsXG4gIFwiaGVcIixcbiAgXCJoZXJcIixcbiAgXCJoZXJlXCIsXG4gIFwiaGVyc2VsZlwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hlclwiLFxuICBcImhpZ2hlc3RcIixcbiAgXCJoaW1cIixcbiAgXCJoaW1zZWxmXCIsXG4gIFwiaGlzXCIsXG4gIFwiaG93XCIsXG4gIFwiaG93ZXZlclwiLFxuICBcImlcIixcbiAgXCJpZlwiLFxuICBcImltcG9ydGFudFwiLFxuICBcImluXCIsXG4gIFwiaW50ZXJlc3RcIixcbiAgXCJpbnRlcmVzdGVkXCIsXG4gIFwiaW50ZXJlc3RpbmdcIixcbiAgXCJpbnRlcmVzdHNcIixcbiAgXCJpbnRvXCIsXG4gIFwiaXNcIixcbiAgXCJpdFwiLFxuICBcIml0c1wiLFxuICBcIml0c2VsZlwiLFxuICBcImpcIixcbiAgXCJqdXN0XCIsXG4gIFwia1wiLFxuICBcImtlZXBcIixcbiAgXCJrZWVwc1wiLFxuICBcImtpbmRcIixcbiAgXCJrbmV3XCIsXG4gIFwia25vd1wiLFxuICBcImtub3duXCIsXG4gIFwia25vd3NcIixcbiAgXCJsXCIsXG4gIFwibGFyZ2VcIixcbiAgXCJsYXJnZWx5XCIsXG4gIFwibGFzdFwiLFxuICBcImxhdGVyXCIsXG4gIFwibGF0ZXN0XCIsXG4gIFwibGVhc3RcIixcbiAgXCJsZXNzXCIsXG4gIFwibGV0XCIsXG4gIFwibGV0c1wiLFxuICBcImxpa2VcIixcbiAgXCJsaWtlbHlcIixcbiAgXCJsb25nXCIsXG4gIFwibG9uZ2VyXCIsXG4gIFwibG9uZ2VzdFwiLFxuICBcIm1cIixcbiAgXCJtYWRlXCIsXG4gIFwibWFrZVwiLFxuICBcIm1ha2luZ1wiLFxuICBcIm1hblwiLFxuICBcIm1hbnlcIixcbiAgXCJtYXlcIixcbiAgXCJtZVwiLFxuICBcIm1lbWJlclwiLFxuICBcIm1lbWJlcnNcIixcbiAgXCJtZW5cIixcbiAgXCJtaWdodFwiLFxuICBcIm1vcmVcIixcbiAgXCJtb3N0XCIsXG4gIFwibW9zdGx5XCIsXG4gIFwibXJcIixcbiAgXCJtcnNcIixcbiAgXCJtdWNoXCIsXG4gIFwibXVzdFwiLFxuICBcIm15XCIsXG4gIFwibXlzZWxmXCIsXG4gIFwiblwiLFxuICBcIm5lY2Vzc2FyeVwiLFxuICBcIm5lZWRcIixcbiAgXCJuZWVkZWRcIixcbiAgXCJuZWVkaW5nXCIsXG4gIFwibmVlZHNcIixcbiAgXCJuZXZlclwiLFxuICBcIm5ld1wiLFxuICBcIm5ld1wiLFxuICBcIm5ld2VyXCIsXG4gIFwibmV3ZXN0XCIsXG4gIFwibmV4dFwiLFxuICBcIm5vXCIsXG4gIFwibm9ib2R5XCIsXG4gIFwibm9uXCIsXG4gIFwibm9vbmVcIixcbiAgXCJub3RcIixcbiAgXCJub3RoaW5nXCIsXG4gIFwibm93XCIsXG4gIFwibm93aGVyZVwiLFxuICBcIm51bWJlclwiLFxuICBcIm51bWJlcnNcIixcbiAgXCJvXCIsXG4gIFwib2ZcIixcbiAgXCJvZmZcIixcbiAgXCJvZnRlblwiLFxuICBcIm9sZFwiLFxuICBcIm9sZGVyXCIsXG4gIFwib2xkZXN0XCIsXG4gIFwib25cIixcbiAgXCJvbmNlXCIsXG4gIFwib25lXCIsXG4gIFwib25seVwiLFxuICBcIm9wZW5cIixcbiAgXCJvcGVuZWRcIixcbiAgXCJvcGVuaW5nXCIsXG4gIFwib3BlbnNcIixcbiAgXCJvclwiLFxuICBcIm9yZGVyXCIsXG4gIFwib3JkZXJlZFwiLFxuICBcIm9yZGVyaW5nXCIsXG4gIFwib3JkZXJzXCIsXG4gIFwib3RoZXJcIixcbiAgXCJvdGhlcnNcIixcbiAgXCJvdXJcIixcbiAgXCJvdXRcIixcbiAgXCJvdmVyXCIsXG4gIFwicFwiLFxuICBcInBhcnRcIixcbiAgXCJwYXJ0ZWRcIixcbiAgXCJwYXJ0aW5nXCIsXG4gIFwicGFydHNcIixcbiAgXCJwZXJcIixcbiAgXCJwZXJoYXBzXCIsXG4gIFwicGxhY2VcIixcbiAgXCJwbGFjZXNcIixcbiAgXCJwb2ludFwiLFxuICBcInBvaW50ZWRcIixcbiAgXCJwb2ludGluZ1wiLFxuICBcInBvaW50c1wiLFxuICBcInBvc3NpYmxlXCIsXG4gIFwicHJlc2VudFwiLFxuICBcInByZXNlbnRlZFwiLFxuICBcInByZXNlbnRpbmdcIixcbiAgXCJwcmVzZW50c1wiLFxuICBcInByb2JsZW1cIixcbiAgXCJwcm9ibGVtc1wiLFxuICBcInB1dFwiLFxuICBcInB1dHNcIixcbiAgXCJxXCIsXG4gIFwicXVpdGVcIixcbiAgXCJyXCIsXG4gIFwicmF0aGVyXCIsXG4gIFwicmVhbGx5XCIsXG4gIFwicmlnaHRcIixcbiAgXCJyaWdodFwiLFxuICBcInJvb21cIixcbiAgXCJyb29tc1wiLFxuICBcInNcIixcbiAgXCJzYWlkXCIsXG4gIFwic2FtZVwiLFxuICBcInNhd1wiLFxuICBcInNheVwiLFxuICBcInNheXNcIixcbiAgXCJzZWNvbmRcIixcbiAgXCJzZWNvbmRzXCIsXG4gIFwic2VlXCIsXG4gIFwic2VlbVwiLFxuICBcInNlZW1lZFwiLFxuICBcInNlZW1pbmdcIixcbiAgXCJzZWVtc1wiLFxuICBcInNlZXNcIixcbiAgXCJzZXZlcmFsXCIsXG4gIFwic2hhbGxcIixcbiAgXCJzaGVcIixcbiAgXCJzaG91bGRcIixcbiAgXCJzaG93XCIsXG4gIFwic2hvd2VkXCIsXG4gIFwic2hvd2luZ1wiLFxuICBcInNob3dzXCIsXG4gIFwic2lkZVwiLFxuICBcInNpZGVzXCIsXG4gIFwic2luY2VcIixcbiAgXCJzbWFsbFwiLFxuICBcInNtYWxsZXJcIixcbiAgXCJzbWFsbGVzdFwiLFxuICBcInNvXCIsXG4gIFwic29tZVwiLFxuICBcInNvbWVib2R5XCIsXG4gIFwic29tZW9uZVwiLFxuICBcInNvbWV0aGluZ1wiLFxuICBcInNvbWV3aGVyZVwiLFxuICBcInN0YXRlXCIsXG4gIFwic3RhdGVzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJzdGlsbFwiLFxuICBcInN1Y2hcIixcbiAgXCJzdXJlXCIsXG4gIFwidFwiLFxuICBcInRha2VcIixcbiAgXCJ0YWtlblwiLFxuICBcInRoYW5cIixcbiAgXCJ0aGF0XCIsXG4gIFwidGhlXCIsXG4gIFwidGhlaXJcIixcbiAgXCJ0aGVtXCIsXG4gIFwidGhlblwiLFxuICBcInRoZXJlXCIsXG4gIFwidGhlcmVmb3JlXCIsXG4gIFwidGhlc2VcIixcbiAgXCJ0aGV5XCIsXG4gIFwidGhpbmdcIixcbiAgXCJ0aGluZ3NcIixcbiAgXCJ0aGlua1wiLFxuICBcInRoaW5rc1wiLFxuICBcInRoaXNcIixcbiAgXCJ0aG9zZVwiLFxuICBcInRob3VnaFwiLFxuICBcInRob3VnaHRcIixcbiAgXCJ0aG91Z2h0c1wiLFxuICBcInRocmVlXCIsXG4gIFwidGhyb3VnaFwiLFxuICBcInRodXNcIixcbiAgXCJ0b1wiLFxuICBcInRvZGF5XCIsXG4gIFwidG9nZXRoZXJcIixcbiAgXCJ0b29cIixcbiAgXCJ0b29rXCIsXG4gIFwidG93YXJkXCIsXG4gIFwidHVyblwiLFxuICBcInR1cm5lZFwiLFxuICBcInR1cm5pbmdcIixcbiAgXCJ0dXJuc1wiLFxuICBcInR3b1wiLFxuICBcInVcIixcbiAgXCJ1bmRlclwiLFxuICBcInVudGlsXCIsXG4gIFwidXBcIixcbiAgXCJ1cG9uXCIsXG4gIFwidXNcIixcbiAgXCJ1c2VcIixcbiAgXCJ1c2VkXCIsXG4gIFwidXNlc1wiLFxuICBcInZcIixcbiAgXCJ2ZXJ5XCIsXG4gIFwid1wiLFxuICBcIndhbnRcIixcbiAgXCJ3YW50ZWRcIixcbiAgXCJ3YW50aW5nXCIsXG4gIFwid2FudHNcIixcbiAgXCJ3YXNcIixcbiAgXCJ3YXlcIixcbiAgXCJ3YXlzXCIsXG4gIFwid2VcIixcbiAgXCJ3ZWxsXCIsXG4gIFwid2VsbHNcIixcbiAgXCJ3ZW50XCIsXG4gIFwid2VyZVwiLFxuICBcIndoYXRcIixcbiAgXCJ3aGVuXCIsXG4gIFwid2hlcmVcIixcbiAgXCJ3aGV0aGVyXCIsXG4gIFwid2hpY2hcIixcbiAgXCJ3aGlsZVwiLFxuICBcIndob1wiLFxuICBcIndob2xlXCIsXG4gIFwid2hvc2VcIixcbiAgXCJ3aHlcIixcbiAgXCJ3aWxsXCIsXG4gIFwid2l0aFwiLFxuICBcIndpdGhpblwiLFxuICBcIndpdGhvdXRcIixcbiAgXCJ3b3JrXCIsXG4gIFwid29ya2VkXCIsXG4gIFwid29ya2luZ1wiLFxuICBcIndvcmtzXCIsXG4gIFwid291bGRcIixcbiAgXCJ4XCIsXG4gIFwieVwiLFxuICBcInllYXJcIixcbiAgXCJ5ZWFyc1wiLFxuICBcInlldFwiLFxuICBcInlvdVwiLFxuICBcInlvdW5nXCIsXG4gIFwieW91bmdlclwiLFxuICBcInlvdW5nZXN0XCIsXG4gIFwieW91clwiLFxuICBcInlvdXJzXCIsXG4gIFwielwiXG5dO1xuIiwiaW1wb3J0IHsgc3RvcFdvcmRzIH0gZnJvbSBcIi4vZW5nbGlzaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIG5vU3RvcFdvcmRzIH0gZnJvbSBcIi4vbm9yd2VnaWFuXCI7XG5pbXBvcnQgeyBzdG9wV29yZHMgYXMgbmxTdG9wV29yZHMgfSBmcm9tIFwiLi9kdXRjaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIGVzU3RvcFdvcmRzIH0gZnJvbSBcIi4vc3BhbmlzaFwiO1xuXG52YXIgc3RvcFdvcmRzRGljdGlvbmFyeTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PHN0cmluZz4gfSA9IHt9O1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcImVuXCJdID0gc3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcIm5vXCJdID0gbm9TdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wibmxcIl0gPSBubFN0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJlc1wiXSA9IGVzU3RvcFdvcmRzO1xuXG5leHBvcnQgdmFyIHRleHRIZWxwZXIgPSB7XG4gIGdldFN0b3BXb3JkczogKGxvY2FsZTogc3RyaW5nID0gXCJcIikgPT4ge1xuICAgIHJldHVybiBzdG9wV29yZHNEaWN0aW9uYXJ5W2xvY2FsZSB8fCBcImVuXCJdIHx8IFtdO1xuICB9LFxufTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFsbGVcIixcbiAgXCJhbmRyZVwiLFxuICBcImFyYmVpZFwiLFxuICBcImF0XCIsXG4gIFwiYXZcIixcbiAgXCJiYXJlXCIsXG4gIFwiYmVnZ2VcIixcbiAgXCJibGVcIixcbiAgXCJibGVpXCIsXG4gIFwiYmxpXCIsXG4gIFwiYmxpclwiLFxuICBcImJsaXR0XCIsXG4gIFwiYm9ydFwiLFxuICBcImJydWtlXCIsXG4gIFwiYsOlZGVcIixcbiAgXCJiw6VlXCIsXG4gIFwiZGFcIixcbiAgXCJkZVwiLFxuICBcImRlZ1wiLFxuICBcImRlaVwiLFxuICBcImRlaW1cIixcbiAgXCJkZWlyYVwiLFxuICBcImRlaXJlc1wiLFxuICBcImRlbVwiLFxuICBcImRlblwiLFxuICBcImRlbm5lXCIsXG4gIFwiZGVyXCIsXG4gIFwiZGVyZVwiLFxuICBcImRlcmVzXCIsXG4gIFwiZGV0XCIsXG4gIFwiZGV0dGVcIixcbiAgXCJkaVwiLFxuICBcImRpblwiLFxuICBcImRpc3NlXCIsXG4gIFwiZGl0dFwiLFxuICBcImR1XCIsXG4gIFwiZHlra1wiLFxuICBcImR5a2thclwiLFxuICBcImTDpVwiLFxuICBcImVnXCIsXG4gIFwiZWluXCIsXG4gIFwiZWl0XCIsXG4gIFwiZWl0dFwiLFxuICBcImVsbGVyXCIsXG4gIFwiZWxsZXNcIixcbiAgXCJlblwiLFxuICBcImVuZVwiLFxuICBcImVuZXN0ZVwiLFxuICBcImVuaHZlclwiLFxuICBcImVublwiLFxuICBcImVyXCIsXG4gIFwiZXRcIixcbiAgXCJldHRcIixcbiAgXCJldHRlclwiLFxuICBcImZvbGtcIixcbiAgXCJmb3JcIixcbiAgXCJmb3JkaVwiLFxuICBcImZvcnPDuGtlXCIsXG4gIFwiZnJhXCIsXG4gIFwiZsOlXCIsXG4gIFwiZsO4clwiLFxuICBcImbDuHJcIixcbiAgXCJmw7hyc3RcIixcbiAgXCJnam9yZGVcIixcbiAgXCJnasO4cmVcIixcbiAgXCJnb2RcIixcbiAgXCJnw6VcIixcbiAgXCJoYVwiLFxuICBcImhhZGRlXCIsXG4gIFwiaGFuXCIsXG4gIFwiaGFuc1wiLFxuICBcImhhclwiLFxuICBcImhlbm5hclwiLFxuICBcImhlbm5lXCIsXG4gIFwiaGVubmVzXCIsXG4gIFwiaGVyXCIsXG4gIFwiaGrDpVwiLFxuICBcImhvXCIsXG4gIFwiaG9lXCIsXG4gIFwiaG9ub21cIixcbiAgXCJob3NzXCIsXG4gIFwiaG9zc2VuXCIsXG4gIFwiaHVuXCIsXG4gIFwiaHZhXCIsXG4gIFwiaHZlbVwiLFxuICBcImh2ZXJcIixcbiAgXCJodmlsa2VcIixcbiAgXCJodmlsa2VuXCIsXG4gIFwiaHZpc1wiLFxuICBcImh2b3JcIixcbiAgXCJodm9yZGFuXCIsXG4gIFwiaHZvcmZvclwiLFxuICBcImlcIixcbiAgXCJpa2tlXCIsXG4gIFwiaWtramVcIixcbiAgXCJpbmdlblwiLFxuICBcImluZ2lcIixcbiAgXCJpbmtqZVwiLFxuICBcImlublwiLFxuICBcImlubmVuXCIsXG4gIFwiaW5uaVwiLFxuICBcImphXCIsXG4gIFwiamVnXCIsXG4gIFwia2FuXCIsXG4gIFwia29tXCIsXG4gIFwia29ybGVpc1wiLFxuICBcImtvcnNvXCIsXG4gIFwia3VuXCIsXG4gIFwia3VubmVcIixcbiAgXCJrdmFcIixcbiAgXCJrdmFyXCIsXG4gIFwia3ZhcmhlbHN0XCIsXG4gIFwia3ZlblwiLFxuICBcImt2aVwiLFxuICBcImt2aWZvclwiLFxuICBcImxhZ2VcIixcbiAgXCJsYW5nXCIsXG4gIFwibGlrXCIsXG4gIFwibGlrZVwiLFxuICBcIm1ha3RcIixcbiAgXCJtYW5cIixcbiAgXCJtYW5nZVwiLFxuICBcIm1lXCIsXG4gIFwibWVkXCIsXG4gIFwibWVkYW5cIixcbiAgXCJtZWdcIixcbiAgXCJtZWdldFwiLFxuICBcIm1lbGxvbVwiLFxuICBcIm1lblwiLFxuICBcIm1lbnNcIixcbiAgXCJtZXJcIixcbiAgXCJtZXN0XCIsXG4gIFwibWlcIixcbiAgXCJtaW5cIixcbiAgXCJtaW5lXCIsXG4gIFwibWl0dFwiLFxuICBcIm1vdFwiLFxuICBcIm15ZVwiLFxuICBcIm15a2plXCIsXG4gIFwibcOlXCIsXG4gIFwibcOldGVcIixcbiAgXCJuYXZuXCIsXG4gIFwibmVkXCIsXG4gIFwibmVpXCIsXG4gIFwibm9cIixcbiAgXCJub2VcIixcbiAgXCJub2VuXCIsXG4gIFwibm9rYVwiLFxuICBcIm5va29cIixcbiAgXCJub2tvblwiLFxuICBcIm5va29yXCIsXG4gIFwibm9rcmVcIixcbiAgXCJueVwiLFxuICBcIm7DpVwiLFxuICBcIm7DpXJcIixcbiAgXCJvZ1wiLFxuICBcIm9nc8OlXCIsXG4gIFwib21cIixcbiAgXCJvcHBcIixcbiAgXCJvc3NcIixcbiAgXCJvdmVyXCIsXG4gIFwicGFydFwiLFxuICBcInB1bmt0XCIsXG4gIFwicMOlXCIsXG4gIFwic2FtbWVcIixcbiAgXCJzZWdcIixcbiAgXCJzZWx2XCIsXG4gIFwic2lcIixcbiAgXCJzaWFcIixcbiAgXCJzaWRhblwiLFxuICBcInNpZGVuXCIsXG4gIFwic2luXCIsXG4gIFwic2luZVwiLFxuICBcInNpc3RcIixcbiAgXCJzaXR0XCIsXG4gIFwic2rDuGxcIixcbiAgXCJza2FsXCIsXG4gIFwic2t1bGxlXCIsXG4gIFwic2xpa1wiLFxuICBcInNsdXR0XCIsXG4gIFwic29cIixcbiAgXCJzb21cIixcbiAgXCJzb21tZVwiLFxuICBcInNvbXRcIixcbiAgXCJzdGFydFwiLFxuICBcInN0aWxsZVwiLFxuICBcInPDpVwiLFxuICBcInPDpW5uXCIsXG4gIFwidGlkXCIsXG4gIFwidGlsXCIsXG4gIFwidGlsYmFrZVwiLFxuICBcInRpbHN0YW5kXCIsXG4gIFwidW1cIixcbiAgXCJ1bmRlclwiLFxuICBcInVwcFwiLFxuICBcInV0XCIsXG4gIFwidXRlblwiLFxuICBcInZhclwiLFxuICBcInZhcnRcIixcbiAgXCJ2YXJ0ZVwiLFxuICBcInZlZFwiLFxuICBcInZlcmRpXCIsXG4gIFwidmVyZVwiLFxuICBcInZlcnRlXCIsXG4gIFwidmlcIixcbiAgXCJ2aWxcIixcbiAgXCJ2aWxsZVwiLFxuICBcInZpdGVcIixcbiAgXCJ2b3JlXCIsXG4gIFwidm9yc1wiLFxuICBcInZvcnRcIixcbiAgXCJ2w6VyXCIsXG4gIFwidsOmcmVcIixcbiAgXCJ2w6ZydFwiLFxuICBcInbDuHJlXCIsXG4gIFwidsO4cnRcIixcbiAgXCLDplwiLFxuICBcIsOlXCJcbl07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhXCIsXG4gIFwiYWN0dWFsbWVudGVcIixcbiAgXCJhZGVsYW50ZVwiLFxuICBcImFkZW3DoXNcIixcbiAgXCJhZmlybcOzXCIsXG4gIFwiYWdyZWfDs1wiLFxuICBcImFob3JhXCIsXG4gIFwiYWjDrVwiLFxuICBcImFsXCIsXG4gIFwiYWxnb1wiLFxuICBcImFsZ3VuYVwiLFxuICBcImFsZ3VuYXNcIixcbiAgXCJhbGd1bm9cIixcbiAgXCJhbGd1bm9zXCIsXG4gIFwiYWxnw7puXCIsXG4gIFwiYWxyZWRlZG9yXCIsXG4gIFwiYW1ib3NcIixcbiAgXCJhbXBsZWFtb3NcIixcbiAgXCJhbnRlXCIsXG4gIFwiYW50ZXJpb3JcIixcbiAgXCJhbnRlc1wiLFxuICBcImFwZW5hc1wiLFxuICBcImFwcm94aW1hZGFtZW50ZVwiLFxuICBcImFxdWVsXCIsXG4gIFwiYXF1ZWxsYXNcIixcbiAgXCJhcXVlbGxvc1wiLFxuICBcImFxdWlcIixcbiAgXCJhcXXDrVwiLFxuICBcImFycmliYVwiLFxuICBcImFzZWd1csOzXCIsXG4gIFwiYXPDrVwiLFxuICBcImF0cmFzXCIsXG4gIFwiYXVucXVlXCIsXG4gIFwiYXllclwiLFxuICBcImHDsWFkacOzXCIsXG4gIFwiYcO6blwiLFxuICBcImJham9cIixcbiAgXCJiYXN0YW50ZVwiLFxuICBcImJpZW5cIixcbiAgXCJidWVuXCIsXG4gIFwiYnVlbmFcIixcbiAgXCJidWVuYXNcIixcbiAgXCJidWVub1wiLFxuICBcImJ1ZW5vc1wiLFxuICBcImNhZGFcIixcbiAgXCJjYXNpXCIsXG4gIFwiY2VyY2FcIixcbiAgXCJjaWVydGFcIixcbiAgXCJjaWVydGFzXCIsXG4gIFwiY2llcnRvXCIsXG4gIFwiY2llcnRvc1wiLFxuICBcImNpbmNvXCIsXG4gIFwiY29tZW50w7NcIixcbiAgXCJjb21vXCIsXG4gIFwiY29uXCIsXG4gIFwiY29ub2NlclwiLFxuICBcImNvbnNlZ3VpbW9zXCIsXG4gIFwiY29uc2VndWlyXCIsXG4gIFwiY29uc2lkZXJhXCIsXG4gIFwiY29uc2lkZXLDs1wiLFxuICBcImNvbnNpZ29cIixcbiAgXCJjb25zaWd1ZVwiLFxuICBcImNvbnNpZ3VlblwiLFxuICBcImNvbnNpZ3Vlc1wiLFxuICBcImNvbnRyYVwiLFxuICBcImNvc2FzXCIsXG4gIFwiY3Jlb1wiLFxuICBcImN1YWxcIixcbiAgXCJjdWFsZXNcIixcbiAgXCJjdWFscXVpZXJcIixcbiAgXCJjdWFuZG9cIixcbiAgXCJjdWFudG9cIixcbiAgXCJjdWF0cm9cIixcbiAgXCJjdWVudGFcIixcbiAgXCJjw7Ntb1wiLFxuICBcImRhXCIsXG4gIFwiZGFkb1wiLFxuICBcImRhblwiLFxuICBcImRhclwiLFxuICBcImRlXCIsXG4gIFwiZGViZVwiLFxuICBcImRlYmVuXCIsXG4gIFwiZGViaWRvXCIsXG4gIFwiZGVjaXJcIixcbiAgXCJkZWrDs1wiLFxuICBcImRlbFwiLFxuICBcImRlbcOhc1wiLFxuICBcImRlbnRyb1wiLFxuICBcImRlc2RlXCIsXG4gIFwiZGVzcHXDqXNcIixcbiAgXCJkaWNlXCIsXG4gIFwiZGljZW5cIixcbiAgXCJkaWNob1wiLFxuICBcImRpZXJvblwiLFxuICBcImRpZmVyZW50ZVwiLFxuICBcImRpZmVyZW50ZXNcIixcbiAgXCJkaWplcm9uXCIsXG4gIFwiZGlqb1wiLFxuICBcImRpb1wiLFxuICBcImRvbmRlXCIsXG4gIFwiZG9zXCIsXG4gIFwiZHVyYW50ZVwiLFxuICBcImVcIixcbiAgXCJlamVtcGxvXCIsXG4gIFwiZWxcIixcbiAgXCJlbGxhXCIsXG4gIFwiZWxsYXNcIixcbiAgXCJlbGxvXCIsXG4gIFwiZWxsb3NcIixcbiAgXCJlbWJhcmdvXCIsXG4gIFwiZW1wbGVhaXNcIixcbiAgXCJlbXBsZWFuXCIsXG4gIFwiZW1wbGVhclwiLFxuICBcImVtcGxlYXNcIixcbiAgXCJlbXBsZW9cIixcbiAgXCJlblwiLFxuICBcImVuY2ltYVwiLFxuICBcImVuY3VlbnRyYVwiLFxuICBcImVudG9uY2VzXCIsXG4gIFwiZW50cmVcIixcbiAgXCJlcmFcIixcbiAgXCJlcmFpc1wiLFxuICBcImVyYW1vc1wiLFxuICBcImVyYW5cIixcbiAgXCJlcmFzXCIsXG4gIFwiZXJlc1wiLFxuICBcImVzXCIsXG4gIFwiZXNhXCIsXG4gIFwiZXNhc1wiLFxuICBcImVzZVwiLFxuICBcImVzb1wiLFxuICBcImVzb3NcIixcbiAgXCJlc3RhXCIsXG4gIFwiZXN0YWJhXCIsXG4gIFwiZXN0YWJhaXNcIixcbiAgXCJlc3RhYmFuXCIsXG4gIFwiZXN0YWJhc1wiLFxuICBcImVzdGFkXCIsXG4gIFwiZXN0YWRhXCIsXG4gIFwiZXN0YWRhc1wiLFxuICBcImVzdGFkb1wiLFxuICBcImVzdGFkb3NcIixcbiAgXCJlc3RhaXNcIixcbiAgXCJlc3RhbW9zXCIsXG4gIFwiZXN0YW5cIixcbiAgXCJlc3RhbmRvXCIsXG4gIFwiZXN0YXJcIixcbiAgXCJlc3RhcmVtb3NcIixcbiAgXCJlc3RhcsOhXCIsXG4gIFwiZXN0YXLDoW5cIixcbiAgXCJlc3RhcsOhc1wiLFxuICBcImVzdGFyw6lcIixcbiAgXCJlc3RhcsOpaXNcIixcbiAgXCJlc3RhcsOtYVwiLFxuICBcImVzdGFyw61haXNcIixcbiAgXCJlc3RhcsOtYW1vc1wiLFxuICBcImVzdGFyw61hblwiLFxuICBcImVzdGFyw61hc1wiLFxuICBcImVzdGFzXCIsXG4gIFwiZXN0ZVwiLFxuICBcImVzdGVtb3NcIixcbiAgXCJlc3RvXCIsXG4gIFwiZXN0b3NcIixcbiAgXCJlc3RveVwiLFxuICBcImVzdHV2ZVwiLFxuICBcImVzdHV2aWVyYVwiLFxuICBcImVzdHV2aWVyYWlzXCIsXG4gIFwiZXN0dXZpZXJhblwiLFxuICBcImVzdHV2aWVyYXNcIixcbiAgXCJlc3R1dmllcm9uXCIsXG4gIFwiZXN0dXZpZXNlXCIsXG4gIFwiZXN0dXZpZXNlaXNcIixcbiAgXCJlc3R1dmllc2VuXCIsXG4gIFwiZXN0dXZpZXNlc1wiLFxuICBcImVzdHV2aW1vc1wiLFxuICBcImVzdHV2aXN0ZVwiLFxuICBcImVzdHV2aXN0ZWlzXCIsXG4gIFwiZXN0dXZpw6lyYW1vc1wiLFxuICBcImVzdHV2acOpc2Vtb3NcIixcbiAgXCJlc3R1dm9cIixcbiAgXCJlc3TDoVwiLFxuICBcImVzdMOhYmFtb3NcIixcbiAgXCJlc3TDoWlzXCIsXG4gIFwiZXN0w6FuXCIsXG4gIFwiZXN0w6FzXCIsXG4gIFwiZXN0w6lcIixcbiAgXCJlc3TDqWlzXCIsXG4gIFwiZXN0w6luXCIsXG4gIFwiZXN0w6lzXCIsXG4gIFwiZXhcIixcbiAgXCJleGlzdGVcIixcbiAgXCJleGlzdGVuXCIsXG4gIFwiZXhwbGljw7NcIixcbiAgXCJleHByZXPDs1wiLFxuICBcImZpblwiLFxuICBcImZ1ZVwiLFxuICBcImZ1ZXJhXCIsXG4gIFwiZnVlcmFpc1wiLFxuICBcImZ1ZXJhblwiLFxuICBcImZ1ZXJhc1wiLFxuICBcImZ1ZXJvblwiLFxuICBcImZ1ZXNlXCIsXG4gIFwiZnVlc2Vpc1wiLFxuICBcImZ1ZXNlblwiLFxuICBcImZ1ZXNlc1wiLFxuICBcImZ1aVwiLFxuICBcImZ1aW1vc1wiLFxuICBcImZ1aXN0ZVwiLFxuICBcImZ1aXN0ZWlzXCIsXG4gIFwiZnXDqXJhbW9zXCIsXG4gIFwiZnXDqXNlbW9zXCIsXG4gIFwiZ3JhblwiLFxuICBcImdyYW5kZXNcIixcbiAgXCJndWVub1wiLFxuICBcImhhXCIsXG4gIFwiaGFiZXJcIixcbiAgXCJoYWJpZGFcIixcbiAgXCJoYWJpZGFzXCIsXG4gIFwiaGFiaWRvXCIsXG4gIFwiaGFiaWRvc1wiLFxuICBcImhhYmllbmRvXCIsXG4gIFwiaGFicmVtb3NcIixcbiAgXCJoYWJyw6FcIixcbiAgXCJoYWJyw6FuXCIsXG4gIFwiaGFicsOhc1wiLFxuICBcImhhYnLDqVwiLFxuICBcImhhYnLDqWlzXCIsXG4gIFwiaGFicsOtYVwiLFxuICBcImhhYnLDrWFpc1wiLFxuICBcImhhYnLDrWFtb3NcIixcbiAgXCJoYWJyw61hblwiLFxuICBcImhhYnLDrWFzXCIsXG4gIFwiaGFiw6lpc1wiLFxuICBcImhhYsOtYVwiLFxuICBcImhhYsOtYWlzXCIsXG4gIFwiaGFiw61hbW9zXCIsXG4gIFwiaGFiw61hblwiLFxuICBcImhhYsOtYXNcIixcbiAgXCJoYWNlXCIsXG4gIFwiaGFjZWlzXCIsXG4gIFwiaGFjZW1vc1wiLFxuICBcImhhY2VuXCIsXG4gIFwiaGFjZXJcIixcbiAgXCJoYWNlcmxvXCIsXG4gIFwiaGFjZXNcIixcbiAgXCJoYWNpYVwiLFxuICBcImhhY2llbmRvXCIsXG4gIFwiaGFnb1wiLFxuICBcImhhblwiLFxuICBcImhhc1wiLFxuICBcImhhc3RhXCIsXG4gIFwiaGF5XCIsXG4gIFwiaGF5YVwiLFxuICBcImhheWFtb3NcIixcbiAgXCJoYXlhblwiLFxuICBcImhheWFzXCIsXG4gIFwiaGF5w6Fpc1wiLFxuICBcImhlXCIsXG4gIFwiaGVjaG9cIixcbiAgXCJoZW1vc1wiLFxuICBcImhpY2llcm9uXCIsXG4gIFwiaGl6b1wiLFxuICBcImhveVwiLFxuICBcImh1YmVcIixcbiAgXCJodWJpZXJhXCIsXG4gIFwiaHViaWVyYWlzXCIsXG4gIFwiaHViaWVyYW5cIixcbiAgXCJodWJpZXJhc1wiLFxuICBcImh1Ymllcm9uXCIsXG4gIFwiaHViaWVzZVwiLFxuICBcImh1Ymllc2Vpc1wiLFxuICBcImh1Ymllc2VuXCIsXG4gIFwiaHViaWVzZXNcIixcbiAgXCJodWJpbW9zXCIsXG4gIFwiaHViaXN0ZVwiLFxuICBcImh1YmlzdGVpc1wiLFxuICBcImh1YmnDqXJhbW9zXCIsXG4gIFwiaHViacOpc2Vtb3NcIixcbiAgXCJodWJvXCIsXG4gIFwiaWd1YWxcIixcbiAgXCJpbmNsdXNvXCIsXG4gIFwiaW5kaWPDs1wiLFxuICBcImluZm9ybcOzXCIsXG4gIFwiaW50ZW50YVwiLFxuICBcImludGVudGFpc1wiLFxuICBcImludGVudGFtb3NcIixcbiAgXCJpbnRlbnRhblwiLFxuICBcImludGVudGFyXCIsXG4gIFwiaW50ZW50YXNcIixcbiAgXCJpbnRlbnRvXCIsXG4gIFwiaXJcIixcbiAgXCJqdW50b1wiLFxuICBcImxhXCIsXG4gIFwibGFkb1wiLFxuICBcImxhcmdvXCIsXG4gIFwibGFzXCIsXG4gIFwibGVcIixcbiAgXCJsZXNcIixcbiAgXCJsbGVnw7NcIixcbiAgXCJsbGV2YVwiLFxuICBcImxsZXZhclwiLFxuICBcImxvXCIsXG4gIFwibG9zXCIsXG4gIFwibHVlZ29cIixcbiAgXCJsdWdhclwiLFxuICBcIm1hbmVyYVwiLFxuICBcIm1hbmlmZXN0w7NcIixcbiAgXCJtYXlvclwiLFxuICBcIm1lXCIsXG4gIFwibWVkaWFudGVcIixcbiAgXCJtZWpvclwiLFxuICBcIm1lbmNpb27Ds1wiLFxuICBcIm1lbm9zXCIsXG4gIFwibWlcIixcbiAgXCJtaWVudHJhc1wiLFxuICBcIm1pb1wiLFxuICBcIm1pc1wiLFxuICBcIm1pc21hXCIsXG4gIFwibWlzbWFzXCIsXG4gIFwibWlzbW9cIixcbiAgXCJtaXNtb3NcIixcbiAgXCJtb2RvXCIsXG4gIFwibW9tZW50b1wiLFxuICBcIm11Y2hhXCIsXG4gIFwibXVjaGFzXCIsXG4gIFwibXVjaG9cIixcbiAgXCJtdWNob3NcIixcbiAgXCJtdXlcIixcbiAgXCJtw6FzXCIsXG4gIFwibcOtXCIsXG4gIFwibcOtYVwiLFxuICBcIm3DrWFzXCIsXG4gIFwibcOtb1wiLFxuICBcIm3DrW9zXCIsXG4gIFwibmFkYVwiLFxuICBcIm5hZGllXCIsXG4gIFwibmlcIixcbiAgXCJuaW5ndW5hXCIsXG4gIFwibmluZ3VuYXNcIixcbiAgXCJuaW5ndW5vXCIsXG4gIFwibmluZ3Vub3NcIixcbiAgXCJuaW5nw7puXCIsXG4gIFwibm9cIixcbiAgXCJub3NcIixcbiAgXCJub3NvdHJhc1wiLFxuICBcIm5vc290cm9zXCIsXG4gIFwibnVlc3RyYVwiLFxuICBcIm51ZXN0cmFzXCIsXG4gIFwibnVlc3Ryb1wiLFxuICBcIm51ZXN0cm9zXCIsXG4gIFwibnVldmFcIixcbiAgXCJudWV2YXNcIixcbiAgXCJudWV2b1wiLFxuICBcIm51ZXZvc1wiLFxuICBcIm51bmNhXCIsXG4gIFwib1wiLFxuICBcIm9jaG9cIixcbiAgXCJvc1wiLFxuICBcIm90cmFcIixcbiAgXCJvdHJhc1wiLFxuICBcIm90cm9cIixcbiAgXCJvdHJvc1wiLFxuICBcInBhcmFcIixcbiAgXCJwYXJlY2VcIixcbiAgXCJwYXJ0ZVwiLFxuICBcInBhcnRpclwiLFxuICBcInBhc2FkYVwiLFxuICBcInBhc2Fkb1wiLFxuICBcInBlcm9cIixcbiAgXCJwZXNhclwiLFxuICBcInBvY2FcIixcbiAgXCJwb2Nhc1wiLFxuICBcInBvY29cIixcbiAgXCJwb2Nvc1wiLFxuICBcInBvZGVpc1wiLFxuICBcInBvZGVtb3NcIixcbiAgXCJwb2RlclwiLFxuICBcInBvZHJpYVwiLFxuICBcInBvZHJpYWlzXCIsXG4gIFwicG9kcmlhbW9zXCIsXG4gIFwicG9kcmlhblwiLFxuICBcInBvZHJpYXNcIixcbiAgXCJwb2Ryw6FcIixcbiAgXCJwb2Ryw6FuXCIsXG4gIFwicG9kcsOtYVwiLFxuICBcInBvZHLDrWFuXCIsXG4gIFwicG9uZXJcIixcbiAgXCJwb3JcIixcbiAgXCJwb3IgcXXDqVwiLFxuICBcInBvcnF1ZVwiLFxuICBcInBvc2libGVcIixcbiAgXCJwcmltZXJcIixcbiAgXCJwcmltZXJhXCIsXG4gIFwicHJpbWVyb1wiLFxuICBcInByaW1lcm9zXCIsXG4gIFwicHJpbmNpcGFsbWVudGVcIixcbiAgXCJwcm9waWFcIixcbiAgXCJwcm9waWFzXCIsXG4gIFwicHJvcGlvXCIsXG4gIFwicHJvcGlvc1wiLFxuICBcInByw7N4aW1vXCIsXG4gIFwicHLDs3hpbW9zXCIsXG4gIFwicHVkb1wiLFxuICBcInB1ZWRhXCIsXG4gIFwicHVlZGVcIixcbiAgXCJwdWVkZW5cIixcbiAgXCJwdWVkb1wiLFxuICBcInB1ZXNcIixcbiAgXCJxdWVcIixcbiAgXCJxdWVkw7NcIixcbiAgXCJxdWVyZW1vc1wiLFxuICBcInF1aWVuXCIsXG4gIFwicXVpZW5lc1wiLFxuICBcInF1aWVyZVwiLFxuICBcInF1acOpblwiLFxuICBcInF1w6lcIixcbiAgXCJyZWFsaXphZG9cIixcbiAgXCJyZWFsaXphclwiLFxuICBcInJlYWxpesOzXCIsXG4gIFwicmVzcGVjdG9cIixcbiAgXCJzYWJlXCIsXG4gIFwic2FiZWlzXCIsXG4gIFwic2FiZW1vc1wiLFxuICBcInNhYmVuXCIsXG4gIFwic2FiZXJcIixcbiAgXCJzYWJlc1wiLFxuICBcInNlXCIsXG4gIFwic2VhXCIsXG4gIFwic2VhbW9zXCIsXG4gIFwic2VhblwiLFxuICBcInNlYXNcIixcbiAgXCJzZWd1bmRhXCIsXG4gIFwic2VndW5kb1wiLFxuICBcInNlZ8O6blwiLFxuICBcInNlaXNcIixcbiAgXCJzZXJcIixcbiAgXCJzZXJlbW9zXCIsXG4gIFwic2Vyw6FcIixcbiAgXCJzZXLDoW5cIixcbiAgXCJzZXLDoXNcIixcbiAgXCJzZXLDqVwiLFxuICBcInNlcsOpaXNcIixcbiAgXCJzZXLDrWFcIixcbiAgXCJzZXLDrWFpc1wiLFxuICBcInNlcsOtYW1vc1wiLFxuICBcInNlcsOtYW5cIixcbiAgXCJzZXLDrWFzXCIsXG4gIFwic2XDoWlzXCIsXG4gIFwic2XDsWFsw7NcIixcbiAgXCJzaVwiLFxuICBcInNpZG9cIixcbiAgXCJzaWVtcHJlXCIsXG4gIFwic2llbmRvXCIsXG4gIFwic2lldGVcIixcbiAgXCJzaWd1ZVwiLFxuICBcInNpZ3VpZW50ZVwiLFxuICBcInNpblwiLFxuICBcInNpbm9cIixcbiAgXCJzb2JyZVwiLFxuICBcInNvaXNcIixcbiAgXCJzb2xhXCIsXG4gIFwic29sYW1lbnRlXCIsXG4gIFwic29sYXNcIixcbiAgXCJzb2xvXCIsXG4gIFwic29sb3NcIixcbiAgXCJzb21vc1wiLFxuICBcInNvblwiLFxuICBcInNveVwiLFxuICBcInN1XCIsXG4gIFwic3VzXCIsXG4gIFwic3V5YVwiLFxuICBcInN1eWFzXCIsXG4gIFwic3V5b1wiLFxuICBcInN1eW9zXCIsXG4gIFwic8OtXCIsXG4gIFwic8OzbG9cIixcbiAgXCJ0YWxcIixcbiAgXCJ0YW1iacOpblwiLFxuICBcInRhbXBvY29cIixcbiAgXCJ0YW5cIixcbiAgXCJ0YW50b1wiLFxuICBcInRlXCIsXG4gIFwidGVuZHJlbW9zXCIsXG4gIFwidGVuZHLDoVwiLFxuICBcInRlbmRyw6FuXCIsXG4gIFwidGVuZHLDoXNcIixcbiAgXCJ0ZW5kcsOpXCIsXG4gIFwidGVuZHLDqWlzXCIsXG4gIFwidGVuZHLDrWFcIixcbiAgXCJ0ZW5kcsOtYWlzXCIsXG4gIFwidGVuZHLDrWFtb3NcIixcbiAgXCJ0ZW5kcsOtYW5cIixcbiAgXCJ0ZW5kcsOtYXNcIixcbiAgXCJ0ZW5lZFwiLFxuICBcInRlbmVpc1wiLFxuICBcInRlbmVtb3NcIixcbiAgXCJ0ZW5lclwiLFxuICBcInRlbmdhXCIsXG4gIFwidGVuZ2Ftb3NcIixcbiAgXCJ0ZW5nYW5cIixcbiAgXCJ0ZW5nYXNcIixcbiAgXCJ0ZW5nb1wiLFxuICBcInRlbmfDoWlzXCIsXG4gIFwidGVuaWRhXCIsXG4gIFwidGVuaWRhc1wiLFxuICBcInRlbmlkb1wiLFxuICBcInRlbmlkb3NcIixcbiAgXCJ0ZW5pZW5kb1wiLFxuICBcInRlbsOpaXNcIixcbiAgXCJ0ZW7DrWFcIixcbiAgXCJ0ZW7DrWFpc1wiLFxuICBcInRlbsOtYW1vc1wiLFxuICBcInRlbsOtYW5cIixcbiAgXCJ0ZW7DrWFzXCIsXG4gIFwidGVyY2VyYVwiLFxuICBcInRpXCIsXG4gIFwidGllbXBvXCIsXG4gIFwidGllbmVcIixcbiAgXCJ0aWVuZW5cIixcbiAgXCJ0aWVuZXNcIixcbiAgXCJ0b2RhXCIsXG4gIFwidG9kYXNcIixcbiAgXCJ0b2RhdsOtYVwiLFxuICBcInRvZG9cIixcbiAgXCJ0b2Rvc1wiLFxuICBcInRvdGFsXCIsXG4gIFwidHJhYmFqYVwiLFxuICBcInRyYWJhamFpc1wiLFxuICBcInRyYWJhamFtb3NcIixcbiAgXCJ0cmFiYWphblwiLFxuICBcInRyYWJhamFyXCIsXG4gIFwidHJhYmFqYXNcIixcbiAgXCJ0cmFiYWpvXCIsXG4gIFwidHJhc1wiLFxuICBcInRyYXRhXCIsXG4gIFwidHJhdsOpc1wiLFxuICBcInRyZXNcIixcbiAgXCJ0dVwiLFxuICBcInR1c1wiLFxuICBcInR1dmVcIixcbiAgXCJ0dXZpZXJhXCIsXG4gIFwidHV2aWVyYWlzXCIsXG4gIFwidHV2aWVyYW5cIixcbiAgXCJ0dXZpZXJhc1wiLFxuICBcInR1dmllcm9uXCIsXG4gIFwidHV2aWVzZVwiLFxuICBcInR1dmllc2Vpc1wiLFxuICBcInR1dmllc2VuXCIsXG4gIFwidHV2aWVzZXNcIixcbiAgXCJ0dXZpbW9zXCIsXG4gIFwidHV2aXN0ZVwiLFxuICBcInR1dmlzdGVpc1wiLFxuICBcInR1dmnDqXJhbW9zXCIsXG4gIFwidHV2acOpc2Vtb3NcIixcbiAgXCJ0dXZvXCIsXG4gIFwidHV5YVwiLFxuICBcInR1eWFzXCIsXG4gIFwidHV5b1wiLFxuICBcInR1eW9zXCIsXG4gIFwidMO6XCIsXG4gIFwidWx0aW1vXCIsXG4gIFwidW5cIixcbiAgXCJ1bmFcIixcbiAgXCJ1bmFzXCIsXG4gIFwidW5vXCIsXG4gIFwidW5vc1wiLFxuICBcInVzYVwiLFxuICBcInVzYWlzXCIsXG4gIFwidXNhbW9zXCIsXG4gIFwidXNhblwiLFxuICBcInVzYXJcIixcbiAgXCJ1c2FzXCIsXG4gIFwidXNvXCIsXG4gIFwidXN0ZWRcIixcbiAgXCJ2YVwiLFxuICBcInZhaXNcIixcbiAgXCJ2YWxvclwiLFxuICBcInZhbW9zXCIsXG4gIFwidmFuXCIsXG4gIFwidmFyaWFzXCIsXG4gIFwidmFyaW9zXCIsXG4gIFwidmF5YVwiLFxuICBcInZlY2VzXCIsXG4gIFwidmVyXCIsXG4gIFwidmVyZGFkXCIsXG4gIFwidmVyZGFkZXJhXCIsXG4gIFwidmVyZGFkZXJvXCIsXG4gIFwidmV6XCIsXG4gIFwidm9zb3RyYXNcIixcbiAgXCJ2b3NvdHJvc1wiLFxuICBcInZveVwiLFxuICBcInZ1ZXN0cmFcIixcbiAgXCJ2dWVzdHJhc1wiLFxuICBcInZ1ZXN0cm9cIixcbiAgXCJ2dWVzdHJvc1wiLFxuICBcInlcIixcbiAgXCJ5YVwiLFxuICBcInlvXCIsXG4gIFwiw6lsXCIsXG4gIFwiw6lyYW1vc1wiLFxuICBcIsOpc3RhXCIsXG4gIFwiw6lzdGFzXCIsXG4gIFwiw6lzdGVcIixcbiAgXCLDqXN0b3NcIixcbiAgXCLDumx0aW1hXCIsXG4gIFwiw7psdGltYXNcIixcbiAgXCLDumx0aW1vXCIsXG4gIFwiw7psdGltb3NcIlxuXTsiLCJpbXBvcnQgeyBRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4uL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgdGV4dEhlbHBlciB9IGZyb20gXCIuL3N0b3B3b3Jkcy9pbmRleFwiO1xuaW1wb3J0IFdvcmRDbG91ZExpYiBmcm9tIFwid29yZGNsb3VkXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmRDbG91ZEFkYXB0ZXIge1xuICBwcml2YXRlIF93b3JkY2xvdWQ6IGFueTtcblxuICBwdWJsaWMgc3RhdGljIGRyYXdPdXRPZkJvdW5kID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgc2hyaW5rVG9GaXQgPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIGFib3J0VGhyZXNob2xkOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgd2VpZ2h0RmFjdG9yID0gMjA7XG5cbiAgcHVibGljIHN0YXRpYyBvbldvcmRjbG91ZENyZWF0aW5nID0gbmV3IEV2ZW50PFxuICAgICAgKHNlbmRlcjogV29yZENsb3VkLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICAgIFdvcmRDbG91ZCxcbiAgICAgIGFueVxuICAgID4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBXb3JkQ2xvdWQpIHt9XG5cbiAgcHVibGljIGdldCB3b3JkY2xvdWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5tb2RlbC5nZXREYXRhKCk7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjYW52YXNOb2RlID0gPEhUTUxDYW52YXNFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiwgXCJcIilcbiAgICApO1xuICAgIGNvbnN0IGVtcHR5VGV4dE5vZGUgPSA8SFRNTEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInBcIiwgXCJcIiwge1xuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2FudmFzTm9kZSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBsaXN0OiBkYXRhLFxuICAgICAgd2VpZ2h0RmFjdG9yOiBXb3JkQ2xvdWRBZGFwdGVyLndlaWdodEZhY3RvcixcbiAgICAgIGFib3J0VGhyZXNob2xkOiBXb3JkQ2xvdWRBZGFwdGVyLmFib3J0VGhyZXNob2xkLFxuICAgICAgZHJhd091dE9mQm91bmQ6IFdvcmRDbG91ZEFkYXB0ZXIuZHJhd091dE9mQm91bmQsXG4gICAgICBzaHJpbmtUb0ZpdDogV29yZENsb3VkQWRhcHRlci5zaHJpbmtUb0ZpdCxcbiAgICAgIGZvbnRGYW1pbHk6IFwiU2Vnb2UgVUkgQm9sZCwgc2Fucy1zZXJpZlwiLFxuICAgICAgY29sb3I6ICh3b3JkOiBzdHJpbmcsIHdlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmdldFJhbmRvbUNvbG9yKCk7XG4gICAgICB9LFxuICAgICAgcm90YXRlUmF0aW86IDAuNSxcbiAgICAgIHJvdGF0aW9uU3RlcHM6IDIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgY2xpY2s6IGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coaXRlbVswXSArIFwiOiBcIiArIGl0ZW1bMV0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNhbnZhczogY2FudmFzTm9kZSxcbiAgICAgIGNvbmZpZ1xuICAgIH07XG4gICAgV29yZENsb3VkQWRhcHRlci5vbldvcmRjbG91ZENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG4gICAgdGhpcy5fd29yZGNsb3VkID0gV29yZENsb3VkTGliKG9wdGlvbnMuY2FudmFzLCBvcHRpb25zLmNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLl93b3JkY2xvdWQ7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29yZENsb3VkIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcml2YXRlIF93b3JkY2xvdWRBZGFwdGVyOiBXb3JkQ2xvdWRBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIndvcmRjbG91ZFwiKTtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyID0gbmV3IFdvcmRDbG91ZEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBnZXREYXRhKCkge1xuICAgIGxldCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgIGxldCBzdG9wV29yZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbG9jYWxlID0gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMobG9jYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcFdvcmRzID0gdGV4dEhlbHBlci5nZXRTdG9wV29yZHMoKTtcbiAgICB9XG5cbiAgICBsZXQgc3RvcFRoZVdvcmQgPSAod29yZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc3RvcFdvcmRzLmluZGV4T2Yod29yZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmQ7XG4gICAgfTtcblxuICAgIGxldCBwcm9jZXNzU3RyaW5nID0gKHJvdzogc3RyaW5nKSA9PiB7XG4gICAgICByb3cgPSBcIlwiICsgcm93O1xuXG4gICAgICBpZiAocm93Lmxlbmd0aCA+IDE1KSByb3cgPSByb3cuc3Vic3RyaW5nKDAsIDE0KSArIFwiLi4uXCI7XG5cbiAgICAgIGlmICghIXJvdykge1xuICAgICAgICByb3cuc3BsaXQoXCIgXCIpLmZvckVhY2goKHdvcmQpID0+IHtcbiAgICAgICAgICB3b3JkID0gc3RvcFRoZVdvcmQod29yZC50b0xvd2VyQ2FzZSgpIHx8IFwiXCIpO1xuICAgICAgICAgIGlmICghIXdvcmQpIHtcbiAgICAgICAgICAgIGlmICghcmVzdWx0W3dvcmRdKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFt3b3JkXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRbd29yZF0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dWYWx1ZSkpIHtcbiAgICAgICAgICByb3dWYWx1ZS5mb3JFYWNoKHByb2Nlc3NTdHJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5mb3JFYWNoKChrZXkpID0+XG4gICAgICAgICAgICAgIHByb2Nlc3NTdHJpbmcocm93VmFsdWVba2V5XSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2Nlc3NTdHJpbmcocm93VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiBba2V5LCByZXN1bHRba2V5XV07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fd29yZGNsb3VkQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJ0ZXh0XCIsIFdvcmRDbG91ZCk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjb21tZW50XCIsIFdvcmRDbG91ZCk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtdWx0aXBsZXRleHRcIiwgV29yZENsb3VkKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9wbG90bHlfanNfZGlzdF9taW5fXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2NvcmVfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfd29yZGNsb3VkX187Il0sInNvdXJjZVJvb3QiOiIifQ==