UNPKG

custom-metrosurvey-widgets

Version:

Custom widgets for the SurveyJS library

410 lines (395 loc) 37.3 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("widgets/jquery-bar-rating", [], factory); else if(typeof exports === 'object') exports["widgets/jquery-bar-rating"] = factory(); else root["widgets/jquery-bar-rating"] = factory(); })(window, function() { 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/jquery-bar-rating.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/barrating.svg": /*!*******************************************************************************!*\ !*** ./node_modules/svg-inline-loader?classPrefix!./src/images/barrating.svg ***! \*******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><g><path d=\"M12.1,15l-4.6-2.4L2.9,15l0.9-5.1L0,6.3l5.2-0.7L7.5,1l2.3,4.6L15,6.3l-3.8,3.6L12.1,15z\"></path></g></svg>" /***/ }), /***/ "./src/jquery-bar-rating.js": /*!**********************************!*\ !*** ./src/jquery-bar-rating.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); function init (Survey, $) { const iconId = 'icon-barrating' Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, __webpack_require__(/*! svg-inline-loader?classPrefix!./images/barrating.svg */ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/barrating.svg"), '') $ = $ || window.$ var widget = { name: 'barrating', title: 'Bar rating', iconName: iconId, widgetIsLoaded: function () { return typeof $ == 'function' && !!$.fn.barrating }, defaultJSON: { choices: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }, isFit: function (question) { return question.getType() === 'barrating' }, isDefaultRender: true, activatedByChanged: function (activatedBy) { Survey.JsonObject.metaData.addClass( 'barrating', [ { name: 'hasOther', visible: false }, { name: 'otherText', visible: false }, { name: 'optionsCaption', visible: false }, { name: 'otherErrorText', visible: false }, { name: 'storeOthersAsComment', visible: false }, { name: 'renderAs', visible: false }, { name: 'select2Config', visible: false }, ], null, 'dropdown', ) Survey.JsonObject.metaData.addProperty('barrating', { name: 'showValues:boolean', default: false, category: 'general', }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'ratingTheme', category: 'general', default: 'css-estrellas', choices: [ 'css-caras', 'css-estrellas', 'css-manos', 'css-numeros', ], }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'ratingScala', category: 'general', default: 'Escala10', choices: [ { value: 'Escala5', text: 'Escala de 5' }, { value: 'Escala10', text: 'Escala de 10' }, ], }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'orientation', category: 'general', default: 'horizontal', choices: [ { value: 'horizontal', text: 'Horizontal' }, { value: 'vertical', text: 'Vertical' }, ], }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'colorScale', category: 'general', default: 'scale-color', choices: [ { value: 'scale-color', text: 'Color' }, { value: 'scale-gray', text: 'Escala de grises' }, ], }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'textoInicial', category: 'general', default: 'Inicio', isLocalizable: true, }) Survey.JsonObject.metaData.addProperty('barrating', { name: 'textoFinalizacion', category: 'general', default: 'Fin', isLocalizable: true, }) }, afterRender: function (question, el) { var $customSelect var $questionInput var contentContainer = $(el).is('select') ? $(el).parent().parent()[0] : $(el).parent()[0] var renderCustomSelect = function () { $customSelect = $('<select class=\'sv-widget-select\'></select>') $customSelect.append('<option disabled selected value style="display:none"></option>') question.visibleChoices.forEach(function (choice) { $customSelect.append( '<option value="{0}">{1}</option>'.format(choice.value, choice.text), ) }) $questionInput = $(contentContainer).find( '[id="{0}"]'.format(question.inputId), ) $questionInput.css('display', 'none') $questionInput.after($customSelect) console.log("abccc:",$customSelect[0].selectedIndex) setTimeout(()=>{ $customSelect[0].selectedIndex = customSelect[0].length - 1 },250) } var removeCustomSelect = function () { $questionInput.css('display', '') $customSelect.barrating('destroy') $customSelect.remove() } var renderBarrating = function () { $customSelect.barrating('show', { theme: question.ratingTheme, initialRating: question.value, showValues: question.showValues, showSelectedRating: false, readonly: question.isReadOnly, onSelect: function (value, text) { valueChangingByWidget = true question.value = value valueChangingByWidget = false }, }) } var renderBarratingText = function () { let parent = $customSelect.parents()[0] const list = parent.lastChild let elemInit = document.getElementById(`id-text-barrating-init-${question.inputId}`) if (elemInit) { elemInit.innerHTML = question.textoInicial } else { const newNodeInit = document.createElement('span') newNodeInit.id = `id-text-barrating-init-${question.inputId}` newNodeInit.className = 'text-barrating text-barrating-init' newNodeInit.innerHTML = question.textoInicial list.insertBefore(newNodeInit, list.children[0]) } let elemEnd = document.getElementById(`id-text-barrating-end-${question.inputId}`) if (elemEnd) { elemEnd.innerHTML = question.textoFinalizacion } else { const newNodeEnd = document.createElement('span') newNodeEnd.id = `id-text-barrating-end-${question.inputId}` newNodeEnd.className = 'text-barrating text-barrating-end' newNodeEnd.innerHTML = question.textoFinalizacion list.insertBefore(newNodeEnd, null) } } var renderBarratingScale = function () { let parent = $customSelect.parents()[0] if (question.ratingScala === 'Escala5') { parent.classList.remove(`br-theme-scale-10`) parent.classList.add(`br-theme-scale-5`) } if (question.ratingScala === 'Escala10') { parent.classList.remove(`br-theme-scale-5`) parent.classList.add(`br-theme-scale-10`) } } var renderBarratingOrientation = function () { let parent = $customSelect.parents()[0] if (question.orientation === 'horizontal') { parent.classList.remove(`br-theme-vertical`) parent.classList.add(`br-theme-horizontal`) } if (question.orientation === 'vertical') { parent.classList.add(`br-theme-vertical`) parent.classList.remove(`br-theme-horizontal`) } } var renderBarratingColor = function () { let parent = $customSelect.parents()[0] if (question.colorScale === 'scale-gray') { parent.classList.add(`br-theme-scale-gray`) } else { parent.classList.remove(`br-theme-scale-gray`) } } renderCustomSelect() renderBarrating() renderBarratingText() renderBarratingScale() renderBarratingOrientation() renderBarratingColor() if (!!$customSelect.parents()[0]) $customSelect.parents()[0].style.marginBottom = '3px' var valueChangingByWidget = false question.valueChangedCallback = function () { if ( !valueChangingByWidget && $(contentContainer).find('select.sv-widget-select')[0].value !== question.value ) { $(contentContainer).find('select.sv-widget-select').barrating('set', question.value) } } question.__barratingOnPropertyChangedCallback = function ( sender, options, ) { let parent = $customSelect.parents()[0] if (options.name === 'ratingTheme') { question.showValues = false if (question.ratingTheme === 'css-numeros') { question.showValues = true } $customSelect.barrating('destroy') renderBarrating() renderBarratingText() } if (options.name === 'textoInicial' || options.name === 'textoFinalizacion') { renderBarratingText() } if (options.name === 'ratingScala') { if (question.ratingScala === 'Escala5') { question.choices = [1, 2, 3, 4, 5] } if (question.ratingScala === 'Escala10') { question.choices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } renderBarratingScale() } if (options.name === 'orientation') { renderBarratingOrientation() } if (options.name === 'colorScale') { renderBarratingColor() } } question.onPropertyChanged.add( question.__barratingOnPropertyChangedCallback, ) question.readOnlyChangedCallback = function () { removeCustomSelect() renderCustomSelect() renderBarrating() renderBarratingText() renderBarratingScale() renderBarratingOrientation() renderBarratingColor() } question.visibleChoicesChangedCallback = function () { removeCustomSelect() renderCustomSelect() renderBarrating() renderBarratingText() renderBarratingScale() renderBarratingOrientation() renderBarratingColor() } }, willUnmount: function (question, el) { var $contentContainer = $(el).is('select') ? $(el).parent().parent() : $(el).parent() var $el = $contentContainer.find('select.sv-widget-select') $el.barrating('destroy') $el.remove() question.valueChangedCallback = undefined question.onPropertyChanged.remove( question.__barratingOnPropertyChangedCallback, ) question.__barratingOnPropertyChangedCallback = undefined }, pdfQuestionType: 'dropdown', } Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, 'customtype') } if (typeof Survey !== 'undefined') { init(Survey, window.$) } /* harmony default export */ __webpack_exports__["default"] = (init); /***/ }) /******/ }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1tuYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaW1hZ2VzL2JhcnJhdGluZy5zdmciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2pxdWVyeS1iYXItcmF0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkEseU07Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFDQTtBQUNBLHVFQUF1RSxtQkFBTyxDQUFDLDhJQUFzRDtBQUNySTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxrQkFBa0IsMkNBQTJDO0FBQzdEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsb0NBQW9DO0FBQy9DLFdBQVcseUNBQXlDO0FBQ3BELFdBQVcseUNBQXlDO0FBQ3BELFdBQVcsK0NBQStDO0FBQzFELFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsd0NBQXdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0NBQXdDO0FBQ25ELFdBQVcsMENBQTBDO0FBQ3JEO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDBDQUEwQztBQUNyRCxXQUFXLHNDQUFzQztBQUNqRDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxzQ0FBc0M7QUFDakQsV0FBVyxnREFBZ0Q7QUFDM0Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0FBQ3BDO0FBQ0EsU0FBUztBQUNUO0FBQ0EsaUJBQWlCLEVBQUU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxpQkFBaUI7QUFDMUY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHFEQUFxRCxpQkFBaUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUVBQXVFLGlCQUFpQjtBQUN4RjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsbURBQW1ELGlCQUFpQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSSIsImZpbGUiOiJ3aWRnZXRzL2pxdWVyeS1iYXItcmF0aW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJ3aWRnZXRzL2pxdWVyeS1iYXItcmF0aW5nXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndpZGdldHMvanF1ZXJ5LWJhci1yYXRpbmdcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wid2lkZ2V0cy9qcXVlcnktYmFyLXJhdGluZ1wiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvanF1ZXJ5LWJhci1yYXRpbmcuanNcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGc+PHBhdGggZD1cXFwiTTEyLjEsMTVsLTQuNi0yLjRMMi45LDE1bDAuOS01LjFMMCw2LjNsNS4yLTAuN0w3LjUsMWwyLjMsNC42TDE1LDYuM2wtMy44LDMuNkwxMi4xLDE1elxcXCI+PC9wYXRoPjwvZz48L3N2Zz5cIiIsImZ1bmN0aW9uIGluaXQgKFN1cnZleSwgJCkge1xuICBjb25zdCBpY29uSWQgPSAnaWNvbi1iYXJyYXRpbmcnXG4gIFN1cnZleS5TdmdSZWdpc3RyeSAmJiBTdXJ2ZXkuU3ZnUmVnaXN0cnkucmVnaXN0ZXJJY29uRnJvbVN2ZyhpY29uSWQsIHJlcXVpcmUoJ3N2Zy1pbmxpbmUtbG9hZGVyP2NsYXNzUHJlZml4IS4vaW1hZ2VzL2JhcnJhdGluZy5zdmcnKSwgJycpXG4gICQgPSAkIHx8IHdpbmRvdy4kXG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogJ2JhcnJhdGluZycsXG4gICAgdGl0bGU6ICdCYXIgcmF0aW5nJyxcbiAgICBpY29uTmFtZTogaWNvbklkLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mICQgPT0gJ2Z1bmN0aW9uJyAmJiAhISQuZm4uYmFycmF0aW5nXG4gICAgfSxcbiAgICBkZWZhdWx0SlNPTjogeyBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gJ2JhcnJhdGluZydcbiAgICB9LFxuICAgIGlzRGVmYXVsdFJlbmRlcjogdHJ1ZSxcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uIChhY3RpdmF0ZWRCeSkge1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gICAgICAgICdiYXJyYXRpbmcnLFxuICAgICAgICBbXG4gICAgICAgICAgeyBuYW1lOiAnaGFzT3RoZXInLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ290aGVyVGV4dCcsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiAnb3B0aW9uc0NhcHRpb24nLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ290aGVyRXJyb3JUZXh0JywgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6ICdzdG9yZU90aGVyc0FzQ29tbWVudCcsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiAncmVuZGVyQXMnLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogJ3NlbGVjdDJDb25maWcnLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICAnZHJvcGRvd24nLFxuICAgICAgKVxuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoJ2JhcnJhdGluZycsIHtcbiAgICAgICAgbmFtZTogJ3Nob3dWYWx1ZXM6Ym9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdyYXRpbmdUaGVtZScsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdjc3MtZXN0cmVsbGFzJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICdjc3MtY2FyYXMnLFxuICAgICAgICAgICdjc3MtZXN0cmVsbGFzJyxcbiAgICAgICAgICAnY3NzLW1hbm9zJyxcbiAgICAgICAgICAnY3NzLW51bWVyb3MnLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdyYXRpbmdTY2FsYScsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdFc2NhbGExMCcsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHZhbHVlOiAnRXNjYWxhNScsIHRleHQ6ICdFc2NhbGEgZGUgNScgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnRXNjYWxhMTAnLCB0ZXh0OiAnRXNjYWxhIGRlIDEwJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdvcmllbnRhdGlvbicsXG4gICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgIGRlZmF1bHQ6ICdob3Jpem9udGFsJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdmFsdWU6ICdob3Jpem9udGFsJywgdGV4dDogJ0hvcml6b250YWwnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJ3ZlcnRpY2FsJywgdGV4dDogJ1ZlcnRpY2FsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICdjb2xvclNjYWxlJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdnZW5lcmFsJyxcbiAgICAgICAgZGVmYXVsdDogJ3NjYWxlLWNvbG9yJyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdmFsdWU6ICdzY2FsZS1jb2xvcicsIHRleHQ6ICdDb2xvcicgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnc2NhbGUtZ3JheScsIHRleHQ6ICdFc2NhbGEgZGUgZ3Jpc2VzJyB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KCdiYXJyYXRpbmcnLCB7XG4gICAgICAgIG5hbWU6ICd0ZXh0b0luaWNpYWwnLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgICBkZWZhdWx0OiAnSW5pY2lvJyxcbiAgICAgICAgaXNMb2NhbGl6YWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eSgnYmFycmF0aW5nJywge1xuICAgICAgICBuYW1lOiAndGV4dG9GaW5hbGl6YWNpb24nLFxuICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgICBkZWZhdWx0OiAnRmluJyxcbiAgICAgICAgaXNMb2NhbGl6YWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyICRjdXN0b21TZWxlY3RcbiAgICAgIHZhciAkcXVlc3Rpb25JbnB1dFxuICAgICAgdmFyIGNvbnRlbnRDb250YWluZXIgPSAkKGVsKS5pcygnc2VsZWN0JylcbiAgICAgICAgPyAkKGVsKS5wYXJlbnQoKS5wYXJlbnQoKVswXVxuICAgICAgICA6ICQoZWwpLnBhcmVudCgpWzBdXG4gICAgICB2YXIgcmVuZGVyQ3VzdG9tU2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkY3VzdG9tU2VsZWN0ID0gJCgnPHNlbGVjdCBjbGFzcz1cXCdzdi13aWRnZXQtc2VsZWN0XFwnPjwvc2VsZWN0PicpXG4gICAgICAgICRjdXN0b21TZWxlY3QuYXBwZW5kKCc8b3B0aW9uIGRpc2FibGVkIHNlbGVjdGVkIHZhbHVlIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9vcHRpb24+JylcbiAgICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hvaWNlKSB7XG4gICAgICAgICAgJGN1c3RvbVNlbGVjdC5hcHBlbmQoXG4gICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT1cInswfVwiPnsxfTwvb3B0aW9uPicuZm9ybWF0KGNob2ljZS52YWx1ZSwgY2hvaWNlLnRleHQpLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgICAgJHF1ZXN0aW9uSW5wdXQgPSAkKGNvbnRlbnRDb250YWluZXIpLmZpbmQoXG4gICAgICAgICAgJ1tpZD1cInswfVwiXScuZm9ybWF0KHF1ZXN0aW9uLmlucHV0SWQpLFxuICAgICAgICApXG4gICAgICAgICRxdWVzdGlvbklucHV0LmNzcygnZGlzcGxheScsICdub25lJylcbiAgICAgICAgJHF1ZXN0aW9uSW5wdXQuYWZ0ZXIoJGN1c3RvbVNlbGVjdClcbiAgICAgICAgY29uc29sZS5sb2coXCJhYmNjYzpcIiwkY3VzdG9tU2VsZWN0WzBdLnNlbGVjdGVkSW5kZXgpXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAkY3VzdG9tU2VsZWN0WzBdLnNlbGVjdGVkSW5kZXggPSBjdXN0b21TZWxlY3RbMF0ubGVuZ3RoIC0gMVxuICAgICAgICB9LDI1MClcbiAgICAgIH1cbiAgICAgIHZhciByZW1vdmVDdXN0b21TZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRxdWVzdGlvbklucHV0LmNzcygnZGlzcGxheScsICcnKVxuICAgICAgICAkY3VzdG9tU2VsZWN0LmJhcnJhdGluZygnZGVzdHJveScpXG4gICAgICAgICRjdXN0b21TZWxlY3QucmVtb3ZlKClcbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRjdXN0b21TZWxlY3QuYmFycmF0aW5nKCdzaG93Jywge1xuICAgICAgICAgIHRoZW1lOiBxdWVzdGlvbi5yYXRpbmdUaGVtZSxcbiAgICAgICAgICBpbml0aWFsUmF0aW5nOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICBzaG93VmFsdWVzOiBxdWVzdGlvbi5zaG93VmFsdWVzLFxuICAgICAgICAgIHNob3dTZWxlY3RlZFJhdGluZzogZmFsc2UsXG4gICAgICAgICAgcmVhZG9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uICh2YWx1ZSwgdGV4dCkge1xuICAgICAgICAgICAgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gdHJ1ZVxuICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICB9XG4gICAgICB2YXIgcmVuZGVyQmFycmF0aW5nVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGNvbnN0IGxpc3QgPSBwYXJlbnQubGFzdENoaWxkXG4gICAgICAgIGxldCBlbGVtSW5pdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBpZC10ZXh0LWJhcnJhdGluZy1pbml0LSR7cXVlc3Rpb24uaW5wdXRJZH1gKVxuICAgICAgICBpZiAoZWxlbUluaXQpIHtcbiAgICAgICAgICBlbGVtSW5pdC5pbm5lckhUTUwgPSBxdWVzdGlvbi50ZXh0b0luaWNpYWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXdOb2RlSW5pdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgICAgIG5ld05vZGVJbml0LmlkID0gYGlkLXRleHQtYmFycmF0aW5nLWluaXQtJHtxdWVzdGlvbi5pbnB1dElkfWBcbiAgICAgICAgICBuZXdOb2RlSW5pdC5jbGFzc05hbWUgPSAndGV4dC1iYXJyYXRpbmcgdGV4dC1iYXJyYXRpbmctaW5pdCdcbiAgICAgICAgICBuZXdOb2RlSW5pdC5pbm5lckhUTUwgPSBxdWVzdGlvbi50ZXh0b0luaWNpYWxcbiAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShuZXdOb2RlSW5pdCwgbGlzdC5jaGlsZHJlblswXSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtRW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGlkLXRleHQtYmFycmF0aW5nLWVuZC0ke3F1ZXN0aW9uLmlucHV0SWR9YClcbiAgICAgICAgaWYgKGVsZW1FbmQpIHtcbiAgICAgICAgICBlbGVtRW5kLmlubmVySFRNTCA9IHF1ZXN0aW9uLnRleHRvRmluYWxpemFjaW9uXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZUVuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgICAgIG5ld05vZGVFbmQuaWQgPSBgaWQtdGV4dC1iYXJyYXRpbmctZW5kLSR7cXVlc3Rpb24uaW5wdXRJZH1gXG4gICAgICAgICAgbmV3Tm9kZUVuZC5jbGFzc05hbWUgPSAndGV4dC1iYXJyYXRpbmcgdGV4dC1iYXJyYXRpbmctZW5kJ1xuICAgICAgICAgIG5ld05vZGVFbmQuaW5uZXJIVE1MID0gcXVlc3Rpb24udGV4dG9GaW5hbGl6YWNpb25cbiAgICAgICAgICBsaXN0Lmluc2VydEJlZm9yZShuZXdOb2RlRW5kLCBudWxsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgcmVuZGVyQmFycmF0aW5nU2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAkY3VzdG9tU2VsZWN0LnBhcmVudHMoKVswXVxuICAgICAgICBpZiAocXVlc3Rpb24ucmF0aW5nU2NhbGEgPT09ICdFc2NhbGE1Jykge1xuICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKGBici10aGVtZS1zY2FsZS0xMGApXG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoYGJyLXRoZW1lLXNjYWxlLTVgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTEwJykge1xuICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKGBici10aGVtZS1zY2FsZS01YClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtc2NhbGUtMTBgKVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGlmIChxdWVzdGlvbi5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5yZW1vdmUoYGJyLXRoZW1lLXZlcnRpY2FsYClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtaG9yaXpvbnRhbGApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXN0aW9uLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoYGJyLXRoZW1lLXZlcnRpY2FsYClcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShgYnItdGhlbWUtaG9yaXpvbnRhbGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByZW5kZXJCYXJyYXRpbmdDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdXG4gICAgICAgIGlmIChxdWVzdGlvbi5jb2xvclNjYWxlID09PSAnc2NhbGUtZ3JheScpIHtcbiAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChgYnItdGhlbWUtc2NhbGUtZ3JheWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5yZW1vdmUoYGJyLXRoZW1lLXNjYWxlLWdyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nKClcbiAgICAgIHJlbmRlckJhcnJhdGluZ1RleHQoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgcmVuZGVyQmFycmF0aW5nT3JpZW50YXRpb24oKVxuICAgICAgcmVuZGVyQmFycmF0aW5nQ29sb3IoKVxuICAgICAgaWYgKCEhJGN1c3RvbVNlbGVjdC5wYXJlbnRzKClbMF0pXG4gICAgICAgICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdLnN0eWxlLm1hcmdpbkJvdHRvbSA9ICczcHgnXG4gICAgICB2YXIgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gZmFsc2VcblxuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ICYmXG4gICAgICAgICAgJChjb250ZW50Q29udGFpbmVyKS5maW5kKCdzZWxlY3Quc3Ytd2lkZ2V0LXNlbGVjdCcpWzBdLnZhbHVlICE9PVxuICAgICAgICAgIHF1ZXN0aW9uLnZhbHVlXG4gICAgICAgICkge1xuICAgICAgICAgICQoY29udGVudENvbnRhaW5lcikuZmluZCgnc2VsZWN0LnN2LXdpZGdldC1zZWxlY3QnKS5iYXJyYXRpbmcoJ3NldCcsIHF1ZXN0aW9uLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gICAgICAgIHNlbmRlcixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICkge1xuICAgICAgICBsZXQgcGFyZW50ID0gJGN1c3RvbVNlbGVjdC5wYXJlbnRzKClbMF1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3JhdGluZ1RoZW1lJykge1xuICAgICAgICAgIHF1ZXN0aW9uLnNob3dWYWx1ZXMgPSBmYWxzZVxuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdUaGVtZSA9PT0gJ2Nzcy1udW1lcm9zJykge1xuICAgICAgICAgICAgcXVlc3Rpb24uc2hvd1ZhbHVlcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgJGN1c3RvbVNlbGVjdC5iYXJyYXRpbmcoJ2Rlc3Ryb3knKVxuICAgICAgICAgIHJlbmRlckJhcnJhdGluZygpXG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nVGV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3RleHRvSW5pY2lhbCcgfHwgb3B0aW9ucy5uYW1lID09PSAndGV4dG9GaW5hbGl6YWNpb24nKSB7XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nVGV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ3JhdGluZ1NjYWxhJykge1xuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTUnKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWVzdGlvbi5yYXRpbmdTY2FsYSA9PT0gJ0VzY2FsYTEwJykge1xuICAgICAgICAgICAgcXVlc3Rpb24uY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdvcmllbnRhdGlvbicpIHtcbiAgICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ2NvbG9yU2NhbGUnKSB7XG4gICAgICAgICAgcmVuZGVyQmFycmF0aW5nQ29sb3IoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5hZGQoXG4gICAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayxcbiAgICAgIClcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZW1vdmVDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmcoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdUZXh0KClcbiAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIHJlbmRlckJhcnJhdGluZ0NvbG9yKClcbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZW1vdmVDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJDdXN0b21TZWxlY3QoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmcoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdUZXh0KClcbiAgICAgICAgcmVuZGVyQmFycmF0aW5nU2NhbGUoKVxuICAgICAgICByZW5kZXJCYXJyYXRpbmdPcmllbnRhdGlvbigpXG4gICAgICAgIHJlbmRlckJhcnJhdGluZ0NvbG9yKClcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGNvbnRlbnRDb250YWluZXIgPSAkKGVsKS5pcygnc2VsZWN0JylcbiAgICAgICAgPyAkKGVsKS5wYXJlbnQoKS5wYXJlbnQoKVxuICAgICAgICA6ICQoZWwpLnBhcmVudCgpXG4gICAgICB2YXIgJGVsID0gJGNvbnRlbnRDb250YWluZXIuZmluZCgnc2VsZWN0LnN2LXdpZGdldC1zZWxlY3QnKVxuICAgICAgJGVsLmJhcnJhdGluZygnZGVzdHJveScpXG4gICAgICAkZWwucmVtb3ZlKClcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkXG4gICAgICBxdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5yZW1vdmUoXG4gICAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayxcbiAgICAgIClcbiAgICAgIHF1ZXN0aW9uLl9fYmFycmF0aW5nT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgcGRmUXVlc3Rpb25UeXBlOiAnZHJvcGRvd24nLFxuICB9XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgJ2N1c3RvbXR5cGUnKVxufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgaW5pdChTdXJ2ZXksIHdpbmRvdy4kKVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0XG4iXSwic291cmNlUm9vdCI6IiJ9