custom-metrosurvey-widgets
Version:
Custom widgets for the SurveyJS library
373 lines (357 loc) • 33.1 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("nouislider"));
else if(typeof define === 'function' && define.amd)
define("widgets/nouislider", ["nouislider"], factory);
else if(typeof exports === 'object')
exports["widgets/nouislider"] = factory(require("nouislider"));
else
root["widgets/nouislider"] = factory(root["noUiSlider"]);
})(window, function(__WEBPACK_EXTERNAL_MODULE_nouislider__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/nouislider.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/nouislider.svg":
/*!********************************************************************************!*\
!*** ./node_modules/svg-inline-loader?classPrefix!./src/images/nouislider.svg ***!
\********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><rect y=\"10\" width=\"16\" height=\"2\"></rect><polygon points=\"2,4 2,7 4,9 6,7 6,4 \"></polygon><polygon points=\"10,4 10,7 12,9 14,7 14,4 \"></polygon></svg>"
/***/ }),
/***/ "./src/nouislider.js":
/*!***************************!*\
!*** ./src/nouislider.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var nouislider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! nouislider */ "nouislider");
/* harmony import */ var nouislider__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(nouislider__WEBPACK_IMPORTED_MODULE_0__);
function init(Survey) {
const iconId = "icon-nouislider";
Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, __webpack_require__(/*! svg-inline-loader?classPrefix!./images/nouislider.svg */ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/nouislider.svg"), "");
var widget = {
name: "nouislider",
title: "noUiSlider",
iconName: iconId,
widgetIsLoaded: function () {
return typeof nouislider__WEBPACK_IMPORTED_MODULE_0___default.a != "undefined";
},
isFit: function (question) {
return question.getType() === "nouislider";
},
htmlTemplate:
"<div><div></div></div>",
activatedByChanged: function (activatedBy) {
Survey.JsonObject.metaData.addClass("nouislider", [], null, "empty");
Survey.JsonObject.metaData.addProperties("nouislider", [
{
name: "step:number",
category: "slider",
categoryIndex: 1,
default: 1,
},
{
name: "rangeMin:number",
category: "slider",
default: 0,
},
{
name: "rangeMax:number",
category: "slider",
default: 100,
},
{
name: "pipsMode",
category: "slider",
default: "positions",
},
{
name: "pipsValues:itemvalues",
category: "slider",
default: [0, 25, 50, 75, 100],
},
{
name: "pipsText:itemvalues",
category: "slider",
default: [0, 25, 50, 75, 100],
},
{
name: "pipsDensity:number",
category: "slider",
default: 5,
},
{
name: "orientation",
category: "slider",
default: "horizontal",
choices: ["horizontal", "vertical"]
},
{
name: "direction:string",
category: "slider",
default: "ltr",
},
{
name: "tooltips:boolean",
category: "slider",
default: true,
},
]);
},
afterRender: function (question, el) {
el.style.paddingBottom = "19px";
el.style.paddingLeft = "20px";
el.style.paddingRight = "20px";
el.style.paddingTop = "44px";
el = el.children[0];
el.style.marginBottom = "60px";
if (question.orientation === "vertical") {
el.style.height = "250px";
el.style.marginLeft = "60px";
}
var slider = nouislider__WEBPACK_IMPORTED_MODULE_0___default.a.create(el, {
start: question.rangeMin <= question.value && question.value <= question.rangeMax ?
question.value : (question.rangeMin + question.rangeMax) / 2,
connect: [true, false],
step: question.step,
tooltips: question.tooltips,
pips: {
mode: question.pipsMode || "positions",
values: question.pipsValues.map(function (pVal) {
var pipValue = pVal;
if (pVal.value !== undefined) {
pipValue = pVal.value;
}
return parseInt(pipValue);
}),
density: question.pipsDensity || 5,
format: {
to: function (pVal) {
var pipText = pVal;
question.pipsText.map(function (el) {
if (el.text !== undefined && pVal === el.value) {
pipText = el.text;
}
});
return pipText;
},
},
},
range: {
min: question.rangeMin,
max: question.rangeMax,
},
orientation: question.orientation,
direction: question.direction,
});
slider.on("change", function () {
question.value = Number(slider.get());
});
question.updateSliderProperties = function () {
const elems = document.getElementsByClassName("noUi-pips");
if (elems.length > 0) elems[elems.length - 1].style.display = "none";
if (elems.length > 1) elems[elems.length - 2].style.display = "none";
var getStart = function(currentStart) {
return question.rangeMin + Math.round((currentStart - question.rangeMin) / question.step) * question.step;
}
slider.updateOptions(
{ step: question.step,
start: question.rangeMin <= question.value && question.value <= question.rangeMax ?
getStart(question.value) : getStart((question.rangeMin + question.rangeMax) / 2),
range: {
min: question.rangeMin,
max: question.rangeMax
}
}, true);
slider.pips(
{ mode: question.pipsMode || "positions",
values: question.pipsValues.map(function (pVal) {
var pipValue = pVal;
if (pVal.value !== undefined) {
pipValue = pVal.value;
}
return parseInt(pipValue);
}),
density: question.pipsDensity || 5,
format: {
to: function (pVal) {
var pipText = pVal;
question.pipsText.map(function (el) {
if (el.text !== undefined && pVal === el.value) {
pipText = el.text;
}
});
return pipText;
},
},
});
};
var updateValueHandler = function () {
slider.set(question.value);
};
if (question.isReadOnly) {
el.setAttribute("disabled", true);
}
updateValueHandler();
question.noUiSlider = slider;
question.registerFunctionOnPropertiesValueChanged(
["pipsValues", "step", "rangeMin", "rangeMax", "pipsMode", "pipsDensity"],
question.updateSliderProperties
);
question.valueChangedCallback = updateValueHandler;
question.readOnlyChangedCallback = function () {
if (question.isReadOnly) {
el.setAttribute("disabled", true);
} else {
el.removeAttribute("disabled");
}
};
},
willUnmount: function (question, el) {
if (!!question.noUiSlider) {
question.noUiSlider.destroy();
question.noUiSlider = null;
}
question.readOnlyChangedCallback = null;
question.valueChangedCallback = null;
if (!question.updateSliderProperties) return;
question.unRegisterFunctionOnPropertiesValueChanged(
["pipsValues", "step", "rangeMin", "rangeMax", "pipsMode", "pipsDensity"],
question.updateSliderProperties
);
question.updateSliderProperties = undefined
},
pdfRender: function (_, options) {
if (options.question.getType() === "nouislider") {
var point = options.module.SurveyHelper.createPoint(
options.module.SurveyHelper.mergeRects.apply(null, options.bricks)
);
point.xLeft += options.controller.unitWidth;
point.yTop +=
options.controller.unitHeight *
options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;
var rect = options.module.SurveyHelper.createTextFieldRect(
point,
options.controller
);
var textboxBrick = new options.module.TextFieldBrick(
options.question,
options.controller,
rect,
true,
options.question.id,
options.question.value || options.question.defaultValue || "",
"",
options.question.isReadOnly,
false,
"text"
);
options.bricks.push(textboxBrick);
}
},
};
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, "customtype");
}
if (typeof Survey !== "undefined") {
init(Survey);
}
/* harmony default export */ __webpack_exports__["default"] = (init);
/***/ }),
/***/ "nouislider":
/*!**********************************************************************************************************!*\
!*** external {"root":"noUiSlider","commonjs2":"nouislider","commonjs":"nouislider","amd":"nouislider"} ***!
\**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_nouislider__;
/***/ })
/******/ });
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1tuYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaW1hZ2VzL25vdWlzbGlkZXIuc3ZnIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ub3Vpc2xpZGVyLmpzIiwid2VicGFjazovL1tuYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJub1VpU2xpZGVyXCIsXCJjb21tb25qczJcIjpcIm5vdWlzbGlkZXJcIixcImNvbW1vbmpzXCI6XCJub3Vpc2xpZGVyXCIsXCJhbWRcIjpcIm5vdWlzbGlkZXJcIn0iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSxvUDs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQW9DOztBQUVwQztBQUNBO0FBQ0EsdUVBQXVFLG1CQUFPLENBQUMsZ0pBQXVEO0FBQ3RJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaURBQVU7QUFDOUIsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVlLG1FQUFJLEVBQUM7Ozs7Ozs7Ozs7OztBQzFPcEIsd0QiLCJmaWxlIjoid2lkZ2V0cy9ub3Vpc2xpZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibm91aXNsaWRlclwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIndpZGdldHMvbm91aXNsaWRlclwiLCBbXCJub3Vpc2xpZGVyXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndpZGdldHMvbm91aXNsaWRlclwiXSA9IGZhY3RvcnkocmVxdWlyZShcIm5vdWlzbGlkZXJcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIndpZGdldHMvbm91aXNsaWRlclwiXSA9IGZhY3Rvcnkocm9vdFtcIm5vVWlTbGlkZXJcIl0pO1xufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX25vdWlzbGlkZXJfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL25vdWlzbGlkZXIuanNcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PHJlY3QgeT1cXFwiMTBcXFwiIHdpZHRoPVxcXCIxNlxcXCIgaGVpZ2h0PVxcXCIyXFxcIj48L3JlY3Q+PHBvbHlnb24gcG9pbnRzPVxcXCIyLDQgMiw3IDQsOSA2LDcgNiw0IFxcXCI+PC9wb2x5Z29uPjxwb2x5Z29uIHBvaW50cz1cXFwiMTAsNCAxMCw3IDEyLDkgMTQsNyAxNCw0IFxcXCI+PC9wb2x5Z29uPjwvc3ZnPlwiIiwiaW1wb3J0IG5vVWlTbGlkZXIgZnJvbSBcIm5vdWlzbGlkZXJcIjtcblxuZnVuY3Rpb24gaW5pdChTdXJ2ZXkpIHtcbiAgY29uc3QgaWNvbklkID0gXCJpY29uLW5vdWlzbGlkZXJcIjtcbiAgU3VydmV5LlN2Z1JlZ2lzdHJ5ICYmIFN1cnZleS5TdmdSZWdpc3RyeS5yZWdpc3Rlckljb25Gcm9tU3ZnKGljb25JZCwgcmVxdWlyZSgnc3ZnLWlubGluZS1sb2FkZXI/Y2xhc3NQcmVmaXghLi9pbWFnZXMvbm91aXNsaWRlci5zdmcnKSwgXCJcIik7XG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogXCJub3Vpc2xpZGVyXCIsXG4gICAgdGl0bGU6IFwibm9VaVNsaWRlclwiLFxuICAgIGljb25OYW1lOiBpY29uSWQsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygbm9VaVNsaWRlciAhPSBcInVuZGVmaW5lZFwiO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJub3Vpc2xpZGVyXCI7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6XG4gICAgICBcIjxkaXY+PGRpdj48L2Rpdj48L2Rpdj5cIixcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uIChhY3RpdmF0ZWRCeSkge1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJub3Vpc2xpZGVyXCIsIFtdLCBudWxsLCBcImVtcHR5XCIpO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydGllcyhcIm5vdWlzbGlkZXJcIiwgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzdGVwOm51bWJlclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGNhdGVnb3J5SW5kZXg6IDEsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmFuZ2VNaW46bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmFuZ2VNYXg6bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMTAwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwaXBzTW9kZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwicG9zaXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNWYWx1ZXM6aXRlbXZhbHVlc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFswLCAyNSwgNTAsIDc1LCAxMDBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwaXBzVGV4dDppdGVtdmFsdWVzXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDI1LCA1MCwgNzUsIDEwMF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNEZW5zaXR5Om51bWJlclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm9yaWVudGF0aW9uXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgY2hvaWNlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvbjpzdHJpbmdcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiBcImx0clwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b29sdGlwczpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIjE5cHhcIjtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdMZWZ0ID0gXCIyMHB4XCI7XG4gICAgICBlbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIjIwcHhcIjtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdUb3AgPSBcIjQ0cHhcIjtcbiAgICAgIGVsID0gZWwuY2hpbGRyZW5bMF07XG4gICAgICBlbC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjYwcHhcIjtcbiAgICAgIGlmIChxdWVzdGlvbi5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IFwiMjUwcHhcIjtcbiAgICAgICAgZWwuc3R5bGUubWFyZ2luTGVmdCA9IFwiNjBweFwiO1xuICAgICAgfVxuICAgICAgdmFyIHNsaWRlciA9IG5vVWlTbGlkZXIuY3JlYXRlKGVsLCB7XG4gICAgICAgIHN0YXJ0OiBxdWVzdGlvbi5yYW5nZU1pbiA8PSBxdWVzdGlvbi52YWx1ZSAmJiBxdWVzdGlvbi52YWx1ZSA8PSBxdWVzdGlvbi5yYW5nZU1heCA/IFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA6IChxdWVzdGlvbi5yYW5nZU1pbiArIHF1ZXN0aW9uLnJhbmdlTWF4KSAvIDIsXG4gICAgICAgIGNvbm5lY3Q6IFt0cnVlLCBmYWxzZV0sXG4gICAgICAgIHN0ZXA6IHF1ZXN0aW9uLnN0ZXAsXG4gICAgICAgIHRvb2x0aXBzOiBxdWVzdGlvbi50b29sdGlwcyxcbiAgICAgICAgcGlwczoge1xuICAgICAgICAgIG1vZGU6IHF1ZXN0aW9uLnBpcHNNb2RlIHx8IFwicG9zaXRpb25zXCIsXG4gICAgICAgICAgdmFsdWVzOiBxdWVzdGlvbi5waXBzVmFsdWVzLm1hcChmdW5jdGlvbiAocFZhbCkge1xuICAgICAgICAgICAgdmFyIHBpcFZhbHVlID0gcFZhbDtcbiAgICAgICAgICAgIGlmIChwVmFsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcGlwVmFsdWUgPSBwVmFsLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBpcFZhbHVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkZW5zaXR5OiBxdWVzdGlvbi5waXBzRGVuc2l0eSB8fCA1LFxuICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdG86IGZ1bmN0aW9uIChwVmFsKSB7XG4gICAgICAgICAgICAgIHZhciBwaXBUZXh0ID0gcFZhbDtcbiAgICAgICAgICAgICAgcXVlc3Rpb24ucGlwc1RleHQubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgIGlmIChlbC50ZXh0ICE9PSB1bmRlZmluZWQgJiYgcFZhbCA9PT0gZWwudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHBpcFRleHQgPSBlbC50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBwaXBUZXh0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByYW5nZToge1xuICAgICAgICAgIG1pbjogcXVlc3Rpb24ucmFuZ2VNaW4sXG4gICAgICAgICAgbWF4OiBxdWVzdGlvbi5yYW5nZU1heCxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZW50YXRpb246IHF1ZXN0aW9uLm9yaWVudGF0aW9uLFxuICAgICAgICBkaXJlY3Rpb246IHF1ZXN0aW9uLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuICAgICAgc2xpZGVyLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSBOdW1iZXIoc2xpZGVyLmdldCgpKTtcbiAgICAgIH0pO1xuICAgICAgcXVlc3Rpb24udXBkYXRlU2xpZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZWxlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibm9VaS1waXBzXCIpO1xuICAgICAgICBpZiAoZWxlbXMubGVuZ3RoID4gMCkgZWxlbXNbZWxlbXMubGVuZ3RoIC0gMV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBpZiAoZWxlbXMubGVuZ3RoID4gMSkgZWxlbXNbZWxlbXMubGVuZ3RoIC0gMl0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB2YXIgZ2V0U3RhcnQgPSBmdW5jdGlvbihjdXJyZW50U3RhcnQpIHtcbiAgICAgICAgICByZXR1cm4gcXVlc3Rpb24ucmFuZ2VNaW4gKyBNYXRoLnJvdW5kKChjdXJyZW50U3RhcnQgLSBxdWVzdGlvbi5yYW5nZU1pbikgLyBxdWVzdGlvbi5zdGVwKSAqIHF1ZXN0aW9uLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgc2xpZGVyLnVwZGF0ZU9wdGlvbnMoXG4gICAgICAgICAgeyBzdGVwOiBxdWVzdGlvbi5zdGVwLFxuICAgICAgICAgICAgc3RhcnQ6IHF1ZXN0aW9uLnJhbmdlTWluIDw9IHF1ZXN0aW9uLnZhbHVlICYmIHF1ZXN0aW9uLnZhbHVlIDw9IHF1ZXN0aW9uLnJhbmdlTWF4ID8gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhcnQocXVlc3Rpb24udmFsdWUpIDogZ2V0U3RhcnQoKHF1ZXN0aW9uLnJhbmdlTWluICsgcXVlc3Rpb24ucmFuZ2VNYXgpIC8gMiksXG4gICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICBtaW46IHF1ZXN0aW9uLnJhbmdlTWluLFxuICAgICAgICAgICAgICBtYXg6IHF1ZXN0aW9uLnJhbmdlTWF4XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgc2xpZGVyLnBpcHMoXG4gICAgICAgICAgICB7IG1vZGU6IHF1ZXN0aW9uLnBpcHNNb2RlIHx8IFwicG9zaXRpb25zXCIsXG4gICAgICAgICAgICAgIHZhbHVlczogcXVlc3Rpb24ucGlwc1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHBWYWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGlwVmFsdWUgPSBwVmFsO1xuICAgICAgICAgICAgICAgIGlmIChwVmFsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHBpcFZhbHVlID0gcFZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBpcFZhbHVlKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGRlbnNpdHk6IHF1ZXN0aW9uLnBpcHNEZW5zaXR5IHx8IDUsXG4gICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgdG86IGZ1bmN0aW9uIChwVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwaXBUZXh0ID0gcFZhbDtcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ucGlwc1RleHQubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC50ZXh0ICE9PSB1bmRlZmluZWQgJiYgcFZhbCA9PT0gZWwudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcFRleHQgPSBlbC50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaXBUZXh0O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzbGlkZXIuc2V0KHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVZhbHVlSGFuZGxlcigpO1xuICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlciA9IHNsaWRlcjtcbiAgICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICAgIFtcInBpcHNWYWx1ZXNcIiwgXCJzdGVwXCIsIFwicmFuZ2VNaW5cIiwgXCJyYW5nZU1heFwiLCBcInBpcHNNb2RlXCIsIFwicGlwc0RlbnNpdHlcIl0sXG4gICAgICAgIHF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXNcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IHVwZGF0ZVZhbHVlSGFuZGxlcjtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIGlmICghIXF1ZXN0aW9uLm5vVWlTbGlkZXIpIHtcbiAgICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlci5kZXN0cm95KCk7XG4gICAgICAgIHF1ZXN0aW9uLm5vVWlTbGlkZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgXG4gICAgICBpZiAoIXF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXMpIHJldHVybjtcbiAgICAgIHF1ZXN0aW9uLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgICAgW1wicGlwc1ZhbHVlc1wiLCBcInN0ZXBcIiwgXCJyYW5nZU1pblwiLCBcInJhbmdlTWF4XCIsIFwicGlwc01vZGVcIiwgXCJwaXBzRGVuc2l0eVwiXSxcbiAgICAgICAgcXVlc3Rpb24udXBkYXRlU2xpZGVyUHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXMgPSB1bmRlZmluZWRcbiAgICB9LFxuICAgIHBkZlJlbmRlcjogZnVuY3Rpb24gKF8sIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJub3Vpc2xpZGVyXCIpIHtcbiAgICAgICAgdmFyIHBvaW50ID0gb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFxuICAgICAgICAgIG9wdGlvbnMubW9kdWxlLlN1cnZleUhlbHBlci5tZXJnZVJlY3RzLmFwcGx5KG51bGwsIG9wdGlvbnMuYnJpY2tzKVxuICAgICAgICApO1xuICAgICAgICBwb2ludC54TGVmdCArPSBvcHRpb25zLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICBwb2ludC55VG9wICs9XG4gICAgICAgICAgb3B0aW9ucy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgIG9wdGlvbnMubW9kdWxlLkZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9WRVJUX1NDQUxFO1xuICAgICAgICB2YXIgcmVjdCA9IG9wdGlvbnMubW9kdWxlLlN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KFxuICAgICAgICAgIHBvaW50LFxuICAgICAgICAgIG9wdGlvbnMuY29udHJvbGxlclxuICAgICAgICApO1xuICAgICAgICB2YXIgdGV4dGJveEJyaWNrID0gbmV3IG9wdGlvbnMubW9kdWxlLlRleHRGaWVsZEJyaWNrKFxuICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24sXG4gICAgICAgICAgb3B0aW9ucy5jb250cm9sbGVyLFxuICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLmlkLFxuICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24udmFsdWUgfHwgb3B0aW9ucy5xdWVzdGlvbi5kZWZhdWx0VmFsdWUgfHwgXCJcIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24uaXNSZWFkT25seSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBcInRleHRcIlxuICAgICAgICApO1xuICAgICAgICBvcHRpb25zLmJyaWNrcy5wdXNoKHRleHRib3hCcmljayk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfbm91aXNsaWRlcl9fOyJdLCJzb3VyY2VSb290IjoiIn0=