From f471ed951bd96225a959bb5cd99a6046e33a9542 Mon Sep 17 00:00:00 2001 From: E98Developer Date: Mon, 27 Apr 2026 21:12:28 +0200 Subject: [PATCH] ADD new feature icon to legacy sepeedbuttonnavbar --- public/css/app.css | 43 +++++++++++++++++-- public/js/admin.js | 2 +- public/js/module.js | 2 +- public/mix-manifest.json | 6 +-- resources/css/speedButtonNavBar.css | 43 +++++++++++++++++-- resources/views/dashboard.blade.php | 1 + .../views/layout/speedButtonNavBar.blade.php | 36 +++++++++++++++- 7 files changed, 120 insertions(+), 13 deletions(-) diff --git a/public/css/app.css b/public/css/app.css index 32a9473..16366ba 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -7110,8 +7110,14 @@ .speedButtonNavBar img{ max-width: 64px; } .speedButtonNavBar ul{ - overflow: hidden; margin-bottom: 1px; + list-style: none; + padding-left: 0; +} +.speedButtonNavBar ul::after { + content: ""; + clear: both; + display: table; } .speedButtonNavBar ul li{ text-align: center; @@ -7121,9 +7127,40 @@ .speedButtonNavBar ul li{ float: left; /*margin: 10px;*/ font-size: 11px; - overflow: hidden; line-height: 1.2; - + position: relative; +} +.speedButtonDropdown { + display: none; + position: absolute; + top: 105px; + left: 0; + width: 200px; + background-color: #343a40; + border: 1px solid #453821; + z-index: 1000; + text-align: left; + border-radius: 0 0 5px 5px; + box-shadow: 0 4px 6px rgba(0,0,0,0.3); +} +.speedButtonNavBar ul li:hover .speedButtonDropdown { + display: block; +} +.speedButtonDropdown a { + padding: 10px 15px; + color: white !important; + text-decoration: none; + display: block !important; + height: auto !important; + border-bottom: 1px solid #454545; + font-weight: bold; +} +.speedButtonDropdown a:hover { + background-color: #453821; + text-decoration: none; +} +.speedButtonDropdown a:last-child { + border-bottom: none; } .speedButtonNavBar ul li.selected{ background-color: rgba(200,200,200,0.5); diff --git a/public/js/admin.js b/public/js/admin.js index 9f4eb37..8473112 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -65,7 +65,7 @@ eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"fun \****************************************/ () { -eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nif (typeof Supplier === 'undefined') {\n var _Supplier = /*#__PURE__*/function (_DataModel) {\n /*\n * Constructor\n */\n function _Supplier(data, options) {\n var _this;\n _classCallCheck(this, _Supplier);\n _this = _callSuper(this, _Supplier, [data, options]);\n if (typeof _this.contact === \"undefined\") {\n _this.contact = [];\n }\n if (typeof _this.canSee === \"undefined\") {\n _this.canSee = 1;\n }\n if (typeof _this.canSeeInOrder === \"undefined\") {\n _this.canSeeInOrder = 1;\n }\n if (typeof _this.hasDeliveryConstraint === \"undefined\") {\n _this.hasDeliveryConstraint = 0;\n }\n if (typeof _this.orderCutOffTime === \"undefined\") {\n _this.orderCutOffTime = 12;\n }\n if (typeof _this.deliveryLeadTime === \"undefined\") {\n _this.deliveryLeadTime = 48;\n }\n console.log('Supplier constructor called');\n return _this;\n }\n _inherits(_Supplier, _DataModel);\n return _createClass(_Supplier);\n }(DataModel);\n ;\n window.Supplier = _Supplier;\n}\nwindow.SupplierAdmin = function (options, SupplierItem) {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n token: null,\n containerCssSelector: '.containerSupplier',\n testMode: false,\n URL: {\n getDataTableContent: '',\n index: '',\n show: '',\n edit: '',\n create: '',\n store: '',\n update: '',\n destroy: '',\n attachFile: '',\n detachFile: '',\n createUser: ''\n },\n dataTable: {\n orderDirective: [1, 'asc']\n },\n onAfterInitViewDetails: function onAfterInitViewDetails() {}\n };\n var Supplier = {};\n var root = this;\n var contactPopupWorkflow = 'new';\n /*\n * Constructor\n */\n this.construct = function (options, SupplierItem) {\n console.log('SupplierAdmin constructor called');\n $.extend(Opts, options);\n if (!SupplierItem) {\n console.log('supplier letre kellet hozni ');\n if (!APP.Supplier) {\n APP.Supplier = new window.Supplier();\n }\n root.Supplier = APP.Supplier;\n }\n };\n this.getOpts = function () {\n return Opts;\n };\n this.formDataToDataObjectAPICallOld = function (CSSSelector) {\n var data = new FormData(document.querySelector(CSSSelector));\n //let formJSON = Object.fromEntries(data.entries());\n var formJSON = {};\n data.forEach(function (value, key) {\n // Reflect.has in favor of: formJSON.hasOwnProperty(key)\n if (!Reflect.has(formJSON, key)) {\n formJSON[key] = value;\n return;\n }\n if (!Array.isArray(formJSON[key])) {\n formJSON[key] = [formJSON[key]];\n }\n formJSON[key].push(value);\n });\n $(CSSSelector + ' input[data-inputmask]').each(function () {\n if (formJSON[$(this).attr('name')]) {\n formJSON[$(this).attr('name')] = formJSON[$(this).attr('name')].replace(/[_ ]+$/g, \"\");\n }\n });\n //formJSON.productGroups=$(\".productCategorySelect\").select2().val();\n\n /*Multiselect or checkbox to array:\n ajaxData['productGroup']=$(\".productCategorySelect\").select2().val();\n formJSON.multiselectName = data.getAll('multiselectName');\n $.each(formJSON, function (item, value) {\n formJSON[$.lcFirst(item.replace('contact', ''))] = value;\n delete formJSON[item];\n });\n if(formJSON.phone){\n formJSON.phone=formJSON.phone.replaceAll('_','');\n }\n if(formJSON.email){\n formJSON.email=formJSON.email.replaceAll('_','');\n }\n */\n return formJSON;\n };\n this.formDataToDataObjectAPICall = function (CSSSelectorForm) {\n var ajaxData = new FormData($(CSSSelectorForm)[0]);\n $.each(ajaxData.getAll('profitCenter'), function (key, value) {\n ajaxData.append('profitCenter[]', value);\n });\n $.each(ajaxData.getAll('productGroup'), function (key, value) {\n ajaxData.append('productGroup[]', value);\n });\n $.each(ajaxData.getAll('supplierService'), function (key, value) {\n ajaxData.append('supplierService[]', value);\n });\n $.each(ajaxData.getAll('contactId'), function (key, value) {\n ajaxData.append('contactId[]', value);\n });\n ajaxData.append('_token', $('input[name=_token]').val());\n $(CSSSelectorForm + ' input[data-inputmask]').each(function () {\n var indexKey = $(this).attr('name');\n if (ajaxData.get(indexKey)) {\n ajaxData.set(indexKey, ajaxData.get(indexKey).replace(/[_ ]+$/g, \"\"));\n }\n });\n return ajaxData;\n };\n this.clickSaveButton = function (event) {\n debug('Save clicked');\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n event.preventDefault();\n if ($(CSSSelectorForm + ' input[name=\"canSeeInOrder\"]').val() == 1 && $(CSSSelectorForm)[0].checkValidity() === false) {\n console.log('validaton false');\n $(CSSSelectorForm).addClass('was-validated');\n $(CSSSelectorForm)[0].reportValidity();\n Toast.create({\n title: \"Validációs hiba!\",\n message: \"Kérjük, töltse ki a kötelező mezőket!\",\n status: TOAST_STATUS.DANGER,\n timeout: 5000\n });\n event.stopPropagation();\n return;\n } else {\n console.log('validaton ok');\n $(CSSSelectorForm).removeClass('was-validated');\n //do your ajax submition here\n }\n var ajaxData = root.formDataToDataObjectAPICall(CSSSelectorForm);\n var ajaxUrl = Opts.URL.store;\n var ajaxMethod = \"POST\";\n if (root.Supplier.id) {\n ajaxUrl = Opts.URL.update.replace('%id%', root.Supplier.id);\n //ajaxMethod=\"PUT\";\n //ajaxData=new FormData($(CSSSelectorForm)[0]);\n ajaxData.append('_method', 'PUT');\n }\n debug(ajaxMethod);\n debug(ajaxData);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n type: ajaxMethod,\n contentType: false,\n processData: false,\n headers: {\n 'X-CSRF-TOKEN': $('input[name=\"_token\"]').val()\n },\n success: function success(data) {\n debug('d1: Save success ');\n debug(data);\n if (data.success == true) {\n //Opts.onAfterInitViewDetails=root.autofillDetails;\n Opts.dataTable.orderDirective = [0, 'desc'];\n Toast.create({\n title: \"Sikeres rögzítés!\",\n message: ajaxData.get('name') + \" nevű beszálllító elmentve\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n APP.loadMainContent(Opts.URL.index + '?init=0', root.initViewList);\n }\n }\n });\n };\n this.setDetailsViewData = function () {\n debug('setDetailsViewData');\n console.log(Supplier);\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n var needToSet = ['name', 'hooreycaId', 'nameId', 'orderEmail', 'orderEmail2', 'address', 'mailingAddress', 'phone', 'fax', 'customerServicePhone', 'name22', 'openHours', 'ordersDeadline', 'minOrderValue'];\n $.each(needToSet, function () {\n if (typeof root.Supplier[this] != 'undefined') {\n $(CSSSelectorForm + ' input[name=' + this + ']').val(root.Supplier[this]);\n $(CSSSelectorForm + ' textarea[name=' + this + ']').val(root.Supplier[this]);\n }\n });\n if (typeof root.Supplier['note'] != 'undefined') {\n $(CSSSelectorForm + ' textarea[name=note]').val(root.Supplier.note);\n }\n if (typeof root.Supplier['emailAttachmentType'] != 'undefined') {\n $(CSSSelectorForm + ' input[name=emailAttachmentType][value=' + root.Supplier['emailAttachmentType'] + ']').prop('checked', true);\n }\n $(CSSSelectorForm + ' *[data-toggle=canSee][data-title=' + root.Supplier.canSee + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=canSeeInOrder][data-title=' + root.Supplier.canSeeInOrder + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=hooreycaDataActive][data-title=' + root.Supplier.hooreycaDataActive + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=hasDeliveryConstraint][data-title=' + root.Supplier.hasDeliveryConstraint + ']').click();\n $(CSSSelectorForm + ' input[name=orderCutOffTime]').val(root.Supplier.orderCutOffTime);\n $(CSSSelectorForm + ' select[name=deliveryLeadTime]').val(root.Supplier.deliveryLeadTime);\n var productGroup = [];\n $.each(root.Supplier.product_group, function () {\n productGroup.push(this.name);\n });\n $(CSSSelectorForm + ' .productCategorySelect').val(productGroup).change();\n var service = [];\n $.each(root.Supplier.service, function () {\n service.push(this.name);\n });\n $(CSSSelectorForm + ' .serviceSelect').val(service).change();\n var profitCenter = [];\n $.each(root.Supplier.profit_center, function () {\n profitCenter.push(this.name);\n });\n //$(CSSSelectorForm+' .profitCenterSelect').val(profitCenter).change();\n //debug(profitCenter);\n $.each(profitCenter, function () {\n $('input[value=\"' + $.escapeSelector(this) + '\"]').prop(\"checked\", true);\n });\n if (typeof root.Supplier['logoFile'] != 'undefined' && root.Supplier['logoFile']) {\n $(CSSSelectorForm + ' img.imageLogo').attr('src', root.Supplier['logoFile']);\n }\n if (typeof root.Supplier.users !== 'undefined') {\n root.resetUserTable();\n }\n\n //debug(APP.SupplierAdmin.formDataToDataObjectAPICall('.supplierForm')['productGroup']);\n //$('[name=productGroup]').val(['Büféáru_édesipari_termékek','Tojás']).change();\n //root.setDetailsViewData();\n };\n this.initViewDetails = function (options, SupplierItem) {\n debug('**call initViewDetails ');\n if (!APP.ContactPopUp) {\n console.log('nincs APP.ContactPopUp');\n APP.ContactPopUp = new window.ContactPopUp();\n } else {\n console.log('mar van APP.ContactPopUp');\n }\n APP.ContactPopUp.init({\n active: true,\n onAfterSave: root.contactAction\n });\n root.renderContact();\n $('.supplierForm .buttonNewContact').bind('click', function () {\n APP.SupplierAdmin.setContactPopupWorkflow('new');\n APP.ContactPopUp.clearData();\n APP.ContactPopUp.show();\n });\n $('[data-toggle=\"tooltip\"]').tooltip();\n initRadioButtons();\n $(\":input\").inputmask({\n \"onincomplete\": function onincomplete() {\n console.log($(this).data('required'));\n if ($(this).val().length > 0 || $(this).data('required') === true) {\n $(this).addClass('is-invalid');\n }\n },\n \"oncomplete\": function oncomplete() {\n $(this).removeClass('is-invalid');\n $(this).addClass('is-valid');\n },\n \"oncleared\": function oncleared() {\n console.log('cleared');\n $(this).removeClass('is-invalid');\n }\n });\n $('form.supplierForm button.FormSaveButton').off('click');\n $('form.supplierForm button.FormSaveButton').on('click', root.clickSaveButton);\n root.setDetailsViewData();\n root.initUserCreate();\n $(\".productCategorySelect\").select2();\n $(\".serviceSelect\").select2({\n tags: true,\n createTag: function createTag(params) {\n var term = $.trim(params.term);\n if (term === '') {\n return null;\n }\n return {\n id: term,\n text: term,\n newTag: true // add additional parameters\n };\n }\n });\n\n //$(\".profitCenterSelect\").select2();\n $(\"input[name=logoFile]\").change(function () {\n setImageFromLocal(this, Opts.containerCssSelector + ' .imageLogo');\n });\n $('form.supplierForm .profitCenterSelectCheckboxAll').off('click');\n $('form.supplierForm .profitCenterSelectCheckboxAll').on('click', function () {\n //console.log();\n //let checked=$(this).is(\":checked\")\n $('form.supplierForm input.profitCenterSelectCheckbox').prop('checked', $(this).is(\":checked\"));\n });\n root.renderAttachment();\n //Opts.onAfterInitViewDetails();\n root.initFileAttachmentFeature();\n root.initDeliveryConstraintToggle();\n debug('**end initViewDetails ');\n };\n this.initDeliveryConstraintToggle = function () {\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n var toggleDeliveryFields = function toggleDeliveryFields() {\n var val = $(CSSSelectorForm + ' input[name=\"hasDeliveryConstraint\"]').val();\n if (val == 1) {\n $(CSSSelectorForm + ' .deliveryConstraintFields').show();\n } else {\n $(CSSSelectorForm + ' .deliveryConstraintFields').hide();\n }\n };\n $(CSSSelectorForm + ' a[data-toggle=\"hasDeliveryConstraint\"]').off('click.deliveryConstraint');\n $(CSSSelectorForm + ' a[data-toggle=\"hasDeliveryConstraint\"]').on('click.deliveryConstraint', function () {\n setTimeout(toggleDeliveryFields, 0);\n });\n toggleDeliveryFields();\n };\n this.selectedUploadFileToggle = function (fileInput) {\n /*\n console.log(fileInput.attr('name'));\n console.log(fileInput[0].files[0]);\n console.log(fileInput[0].files[0].name);\n */\n if (fileInput) {\n $('.containerFileUpload').addClass('d-none');\n if (fileInput[0].files[0]) {\n $('.containerUploadedFileName').text(fileInput[0].files[0].name);\n }\n $('.containerFileUploadStarted').removeClass('d-none');\n $('.containerUploadedSpinner').removeClass('d-none');\n } else {\n $('.containerUploadedFileName').text('');\n $('.custom-file-label.selected').text('');\n $('.containerFileUploadStarted').addClass('d-none');\n $('.uploadStatusRow').addClass('d-none');\n $('.containerFileUpload').removeClass('d-none');\n }\n };\n this.initFileAttachmentFeature = function () {\n console.log('-------initFileAttachmentFeature-----------');\n if (root.Supplier.id) {\n $('.containerFileUpload').removeClass('d-none');\n $('.containerFileUploadNone').addClass('d-none');\n }\n $(Opts.containerCssSelector + ' .buttonUpload').off('click');\n $(Opts.containerCssSelector + ' .buttonUpload').on('click', function () {\n console.group('-------buttonUpload-----------');\n var fileInput = $('#inputGroupAttacheFile');\n if (fileInput[0].files.length < 1) {\n Toast.create({\n title: \"Hiba!\",\n message: 'Vállaszon ki fájlt!',\n status: TOAST_STATUS.DANGER,\n timeout: 10000\n });\n return;\n }\n console.log($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n var data = new FormData($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n data.append(fileInput.attr('name'), fileInput[0].files[0]);\n root.selectedUploadFileToggle(fileInput);\n var ajaxUrl = Opts.URL.attachFile.replace('%id%', root.Supplier.id);\n console.groupEnd();\n $.ajax({\n url: ajaxUrl,\n data: data,\n type: 'POST',\n contentType: false,\n processData: false,\n beforeSend: function beforeSend() {},\n success: function success(data) {\n console.log(data);\n if (data.success == true) {\n root.addAttachment(data.data.attachment);\n root.selectedUploadFileToggle();\n }\n },\n error: function error(data) {\n console.log(data.responseJSON);\n root.selectedUploadFileToggle();\n ajaxErrorFieldHandler(data.responseJSON.error);\n }\n });\n });\n };\n this.clickNew = function () {\n debug('clickNew');\n APP.loadMainContent(Opts.URL.create, root.clickNewCallBack);\n };\n this.clickNewCallBack = function () {\n debug('callbackNew');\n root.Supplier = new window.Supplier();\n root.initViewDetails();\n };\n this.datatableRowActionEdit = function (rowData, node) {\n console.log('datatableRowActionEdit Called');\n //Opts.onAfterInitViewDetails=root.autofillDetails;\n var ajaxUrl = Opts.URL.edit.replace('%id%', rowData.id);\n APP.loadMainContent(ajaxUrl, root.initViewDetails);\n console.log('datatableRowActionEdit End');\n };\n this.clickOrderDeleteConfirmed = function (event) {\n debug('clickSupplierDeleteConfirmed');\n debug(event);\n debug(event.data);\n $('#dialogModal').modal('hide');\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var ajaxUrl = Opts.URL.destroy.replace('%id%', event.data.id);\n ajaxData._token = $('input[name=_token]').val();\n console.log(ajaxUrl);\n console.log(ajaxData);\n var row = $(dataTableCSSSelector).DataTable().row(root.dadatatableRowActionCallerNode.parents('tr'));\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n method: \"DELETE\",\n success: function success(data) {\n if (data.success == true) {\n row.remove().draw();\n root.dadatatableRowActionCallerNode = false;\n }\n }\n });\n };\n var datatableRowActionCallerNode = false;\n this.datatableRowActionDelete = function (rowData, node) {\n console.log('datatableRowActionDelete Called');\n root.dadatatableRowActionCallerNode = node;\n $('#dialogModal').on('show.bs.modal', function (event) {\n // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).\n // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.\n var modal = $(this);\n modal.find('.modal-title').text('Megerősítés ');\n modal.find('.modal-body').text('Biztosan törli a beszállítót?');\n modal.find('.buttonYes').off('click');\n modal.find('.buttonYes').on('click', {\n id: rowData.id\n }, root.clickOrderDeleteConfirmed);\n });\n $('#dialogModal').modal('show');\n };\n this.datatableRowActionButtonClick = function (event) {\n debug('datatableRowActionButtonClick');\n var node = $(event[0].currentTarget);\n var row = $(dataTableCSSSelector).DataTable().row(node.parents('tr'));\n var rowData = row.data();\n var actionName = 'datatableRowAction' + node.data('buttontype').capitalize();\n if (typeof root[actionName] === \"function\") {\n return root[actionName](rowData, node);\n }\n };\n this.initViewList = function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n debug('listview inicialization');\n dataTableCSSSelector = Opts.containerCssSelector + ' .dataTable'; //\n\n var colNum = $(dataTableCSSSelector + ' thead th').length; //buttons insert position need\n APP.setOpts({\n datatableActionButtonClickCallBack: root.clickNew,\n datatableRowActionButtonClickCallBack: root.datatableRowActionButtonClick\n });\n var orderDirective = Opts.dataTable.orderDirective;\n if (typeof options['orderDirective'] != 'undefined') {\n orderDirective = options['orderDirective'];\n }\n $(dataTableCSSSelector).DataTable({\n language: {\n url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/Hungarian.json'\n },\n //\"ajax\": \"{{asset('exapmle2.json')}}\",\n \"ajax\": Opts.URL.getDataTableContent,\n \"columnDefs\": [{\n \"targets\": colNum - 1,\n \"render\": function render(data, type, row) {\n var buttons = APP.datatableAddRowTrashButton(0, arguments);\n buttons += APP.datatableAddRowEditButton(0, arguments);\n return buttons;\n }\n }, {\n \"targets\": 1,\n \"render\": function render(data, type, row) {\n return type === \"sort\" ? data.latinise() : data;\n }\n }\n //{ \"visible\": false, \"targets\": [ 0 ] }\n ],\n buttons: {\n buttons: ['excel', 'pdf', {\n extend: 'print',\n //text: 'Print current page',\n 'title': 'title custom text',\n 'messageTop': 'Message On Top',\n autoPrint: true\n }, /**/\n\n {\n text: 'Új felvitele',\n className: 'btn btn-success newItem',\n attr: {\n /*\n data:{\n a:1,\n b:2\n }\n */\n 'data': 'newItem'\n },\n init: function init(api, node, config) {\n $(node).removeClass('ui-button');\n },\n action: function action(e, dt, node, config) {\n APP.datatableActionButtonClickCallBack(arguments);\n /* console.log(e);\n console.log(dt);\n console.log(node);\n console.log(config);*/\n }\n }]\n },\n \"columns\": [{\n \"data\": \"id\"\n }, {\n \"data\": \"name\"\n }, {\n \"data\": \"hooreycaId\"\n }, {\n \"data\": \"nameId\"\n }, {\n \"data\": \"created_at\"\n }, null],\n \"order\": orderDirective,\n \"stateSave\": true,\n \"drawCallback\": function drawCallback(settings) {\n APP.datatableAddRowAction(dataTableCSSSelector);\n }\n });\n debug('listview end');\n };\n this.autofillDetails = function () {\n debug('nyeresre allunk');\n var randomNumber = getRandomInt(9999);\n $('input[name=name]').val('Beszalító' + randomNumber);\n $('input[name=hooreycaId]').val('hb' + randomNumber);\n $('input[name=nameId]').val('be' + randomNumber);\n $('input[name=orderEmail]').val('kapcsolat' + randomNumber + '@beszallito.hu');\n $('input[name=orderEmail2]').val('informacio' + randomNumber + '@beszallito.hu');\n $('input[name=address]').val('8989 Supplier utca ' + randomNumber);\n $('input[name=mailingAddress]').val('8989 Postai út' + randomNumber);\n $('input[name=phone]').val('+36301234567');\n $('input[name=fax]').val('36308889999');\n $('input[name=customerServicePhone]').val('+36761234444');\n $('textarea[name=note]').val('Megjegyzem ' + randomNumber);\n };\n this.testMode = function () {\n console.debug('!!!!testmode !!!!');\n root.Supplier = new window.Supplier({\n 'contact': [{\n id: 2\n }, {\n id: 3\n }\n /*\n {\n id:3,\n name:'Kósa Veronika',\n email:'szamlazas4@funkcio.hu',\n phone:'{{formatterPhoneNumber(\"+36204589180\")}}'\n }\n */]\n });\n Opts.onAfterInitViewDetails = root.autofillDetails;\n APP.loadMainContent(Opts.URL.create, root.initViewDetails);\n };\n this.init = function (options, SupplierItem) {\n $.extend(Opts, options);\n if (Opts.testMode) {\n return root.testMode();\n }\n if (SupplierItem) {\n root.Supplier = SupplierItem;\n }\n root.initViewList();\n };\n this.renderAttachment = function () {\n var rowNum = 1;\n console.log('renderingAttachment');\n $.each(root.Supplier.getData('attachment'), function () {\n var attachmentData = this;\n attachmentData.rowNum = rowNum;\n date = new Date(attachmentData.created_at);\n attachmentData.date = date.toLocaleString();\n attachmentData.link = attachmentData.PublicUrl + '/' + attachmentData.filename;\n var template = $('template[data-name=\"supplierAttachmentTableRow\"]').html();\n var render = Mustache.render(template, attachmentData);\n $('.attachmentTable tbody').append(render);\n rowNum++;\n });\n root.bindAttachmentClickAction();\n };\n this.addAttachment = function (attachmentData) {\n console.log(attachmentData);\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n root.Supplier.attachment.push(attachmentData);\n attachmentData.rowNum = root.Supplier.attachment.length;\n var template = $('template[data-name=\"supplierAttachmentTableRow\"]').html();\n var render = Mustache.render(template, attachmentData);\n $(CSSSelectorForm + ' .attachmentTable tbody').append(render);\n root.bindContactClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: \"Fájl hozzáadva!\",\n message: attachmentData.original_filename + \" fájl hozzáadva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.resetContactTable = function () {\n $('.contactTable tbody tr').remove();\n root.renderContact();\n };\n this.renderContact = function () {\n var rowNum = 1;\n console.log('renderingContacts');\n $.each(root.Supplier.getData('contact'), function () {\n var contactData = this;\n contactData.rowNum = rowNum;\n //console.log(contactData);\n var template = $('template[data-name=\"supplierContactTableRow\"]').html();\n var render = Mustache.render(template, contactData);\n $('.contactTable tbody').append(render);\n rowNum++;\n });\n root.bindContactClickAction();\n };\n this.bindContactClickAction = function () {\n var node = $('.contactTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.contactDeleteClick);\n node = $('.contactTable .buttonEdit');\n node.unbind('click');\n node.bind('click', root.contactEditClick);\n };\n this.bindAttachmentClickAction = function () {\n var node = $('.attachmentTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.attachmentDeleteClick);\n };\n var currentAttachmentRow = false;\n this.attachmentDeleteClick = function (event) {\n var row = $(this).closest('tr');\n var id = row.find('input[name=attachmentId]').val();\n var ajaxUrl = Opts.URL.detachFile.replace('%id%', root.Supplier.id);\n //let data= new FormData($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n //data.append(fileInput.attr('name'),fileInput[0].files[0]);\n var data = {};\n data._token = $('input[name=\"_token\"]').val();\n data.attachemntId = id;\n $.ajax({\n url: ajaxUrl,\n data: data,\n type: 'POST',\n //contentType:false,\n //processData: false,\n beforeSend: function beforeSend() {},\n success: function success(data) {\n console.log(data);\n if (data.success == true) {\n root.Supplier.attachment = root.Supplier.attachment.filter(function (value, index, arr) {\n if (value.id !== data.data.attachment.id * 1) {\n return true;\n }\n return false;\n });\n /*\n */\n //row.remove();\n root.resetAttachmentTable();\n }\n },\n error: function error(data) {\n console.log(data.responseJSON);\n root.selectedUploadFileToggle();\n ajaxErrorFieldHandler(data.responseJSON.error);\n }\n });\n };\n this.resetAttachmentTable = function () {\n $('.attachmentTable tbody tr').remove();\n root.renderAttachment();\n };\n this.contactDeleteClick = function (event) {\n var row = $(this).closest('tr');\n var id = row.find('input[name=contactId]').val();\n root.Supplier.contact = root.Supplier.contact.filter(function (value, index, arr) {\n if (value.id !== id * 1) {\n return true;\n }\n return false;\n });\n row.remove();\n root.resetContactTable();\n };\n root.getContactPopupWorkflow = function () {\n return contactPopupWorkflow;\n };\n root.setContactPopupWorkflow = function (status) {\n contactPopupWorkflow = status;\n };\n this.contactEditClick = function (event) {\n //console.log(this);\n var row = $(this).closest('tr');\n var id = row.find('input[name=contactId]').val();\n root.setContactPopupWorkflow('edit');\n APP.ContactPopUp.loadData(id);\n };\n this.getSupplier = function () {\n return root.Supplier;\n };\n this.contactAction = function (contactData) {\n console.log('nah most kellene meg valamit csinalni.');\n if (root.getContactPopupWorkflow() == 'new') {\n root.addContact(contactData);\n } else if (root.getContactPopupWorkflow() == 'edit') {\n root.editContact(contactData.id, contactData);\n }\n };\n this.editContact = function (id, contactData) {\n var newContacts = [];\n $.each(root.Supplier.getData('contact'), function (index) {\n if (this.id == id) {\n newContacts.push(contactData);\n } else {\n newContacts.push(this);\n }\n });\n root.Supplier.contact = newContacts;\n root.resetContactTable();\n Toast.create({\n title: \"Kapcsolat adatai módosítva!\",\n message: contactData.name + \" nevű kapcsolattartó módosítva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.addContact = function (contactData) {\n /*\n fel kell venni a sorba\n */\n root.Supplier.contact.push(contactData);\n contactData.rowNum = root.Supplier.contact.length;\n var template = $('template[data-name=\"supplierContactTableRow\"]').html();\n var render = Mustache.render(template, contactData);\n $('.contactTable tbody').append(render);\n root.bindContactClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: \"Kapcsolattartó hozzáadva!\",\n message: contactData.name + \" nevű kapcsolattartó hozzáadva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.resetUserTable = function () {\n $('.supplierUserTable tbody tr').remove();\n root.renderUsers();\n };\n this.renderUsers = function () {\n var rowNum = 1;\n var users = root.Supplier.users || [];\n $.each(users, function () {\n var userData = $.extend({}, this);\n userData.rowNum = rowNum;\n var template = $('template[data-name=\"supplierUserTableRow\"]').html();\n var render = Mustache.render(template, userData);\n $('.supplierUserTable tbody').append(render);\n rowNum++;\n });\n root.bindUserClickAction();\n };\n this.bindUserClickAction = function () {\n var node = $('.supplierUserTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.userDeleteClick);\n };\n this.userDeleteClick = function () {\n var row = $(this).closest('tr');\n var id = row.find('input[name=userId]').val() * 1;\n root.Supplier.users = root.Supplier.users.filter(function (value) {\n return value.id !== id;\n });\n row.remove();\n root.resetUserTable();\n };\n this.addUser = function (userData) {\n if (!root.Supplier.users) {\n root.Supplier.users = [];\n }\n var alreadyAdded = root.Supplier.users.some(function (u) {\n return u.id === userData.id;\n });\n if (alreadyAdded) {\n return;\n }\n root.Supplier.users.push(userData);\n userData.rowNum = root.Supplier.users.length;\n var template = $('template[data-name=\"supplierUserTableRow\"]').html();\n var render = Mustache.render(template, userData);\n $('.supplierUserTable tbody').append(render);\n root.bindUserClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: 'Felhasználó hozzáadva!',\n message: userData.name + ' hozzárendelve',\n status: TOAST_STATUS.SUCCESS,\n timeout: 3000\n });\n };\n this.initUserCreate = function () {\n var createUrl = Opts.URL.createUser || '';\n var container = $(Opts.containerCssSelector);\n function clearForm() {\n container.find('.supplierNewUserName').val('');\n container.find('.supplierNewUserEmail').val('');\n container.find('.supplierNewUserPassword').val('');\n container.find('.supplierNewUserError').hide().text('');\n }\n container.find('.buttonCreateUser').off('click').on('click', function () {\n var name = container.find('.supplierNewUserName').val().trim();\n var email = container.find('.supplierNewUserEmail').val().trim();\n var password = container.find('.supplierNewUserPassword').val();\n var errorEl = container.find('.supplierNewUserError');\n errorEl.hide().text('');\n if (!name || !email || !password) {\n errorEl.text('Minden mező kitöltése kötelező!').show();\n return;\n }\n $.ajax({\n url: createUrl,\n type: 'POST',\n data: {\n name: name,\n email: email,\n password: password\n },\n headers: {\n 'X-CSRF-TOKEN': $('input[name=\"_token\"]').val()\n },\n success: function success(data) {\n if (data.success) {\n root.addUser(data.user);\n clearForm();\n } else {\n errorEl.text('Hiba történt a felhasználó létrehozásakor!').show();\n }\n },\n error: function error(xhr) {\n var msg = 'Hiba történt!';\n if (xhr.responseJSON && xhr.responseJSON.errors) {\n var errors = xhr.responseJSON.errors;\n var firstKey = Object.keys(errors)[0];\n msg = errors[firstKey][0];\n }\n errorEl.text(msg).show();\n }\n });\n });\n };\n this.construct(options, SupplierItem);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vc3VwcGxpZXIuanMiLCJuYW1lcyI6WyJTdXBwbGllciIsIl9EYXRhTW9kZWwiLCJfU3VwcGxpZXIiLCJkYXRhIiwib3B0aW9ucyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsImNvbnRhY3QiLCJjYW5TZWUiLCJjYW5TZWVJbk9yZGVyIiwiaGFzRGVsaXZlcnlDb25zdHJhaW50Iiwib3JkZXJDdXRPZmZUaW1lIiwiZGVsaXZlcnlMZWFkVGltZSIsImNvbnNvbGUiLCJsb2ciLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJEYXRhTW9kZWwiLCJ3aW5kb3ciLCJTdXBwbGllckFkbWluIiwiU3VwcGxpZXJJdGVtIiwiT3B0cyIsInRva2VuIiwiY29udGFpbmVyQ3NzU2VsZWN0b3IiLCJ0ZXN0TW9kZSIsIlVSTCIsImdldERhdGFUYWJsZUNvbnRlbnQiLCJpbmRleCIsInNob3ciLCJlZGl0IiwiY3JlYXRlIiwic3RvcmUiLCJ1cGRhdGUiLCJkZXN0cm95IiwiYXR0YWNoRmlsZSIsImRldGFjaEZpbGUiLCJjcmVhdGVVc2VyIiwiZGF0YVRhYmxlIiwib3JkZXJEaXJlY3RpdmUiLCJvbkFmdGVySW5pdFZpZXdEZXRhaWxzIiwicm9vdCIsImNvbnRhY3RQb3B1cFdvcmtmbG93IiwiY29uc3RydWN0IiwiJCIsImV4dGVuZCIsIkFQUCIsImdldE9wdHMiLCJmb3JtRGF0YVRvRGF0YU9iamVjdEFQSUNhbGxPbGQiLCJDU1NTZWxlY3RvciIsIkZvcm1EYXRhIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZm9ybUpTT04iLCJmb3JFYWNoIiwidmFsdWUiLCJrZXkiLCJSZWZsZWN0IiwiaGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHVzaCIsImVhY2giLCJhdHRyIiwicmVwbGFjZSIsImZvcm1EYXRhVG9EYXRhT2JqZWN0QVBJQ2FsbCIsIkNTU1NlbGVjdG9yRm9ybSIsImFqYXhEYXRhIiwiZ2V0QWxsIiwiYXBwZW5kIiwidmFsIiwiaW5kZXhLZXkiLCJnZXQiLCJzZXQiLCJjbGlja1NhdmVCdXR0b24iLCJldmVudCIsImRlYnVnIiwicHJldmVudERlZmF1bHQiLCJjaGVja1ZhbGlkaXR5IiwiYWRkQ2xhc3MiLCJyZXBvcnRWYWxpZGl0eSIsIlRvYXN0IiwidGl0bGUiLCJtZXNzYWdlIiwic3RhdHVzIiwiVE9BU1RfU1RBVFVTIiwiREFOR0VSIiwidGltZW91dCIsInN0b3BQcm9wYWdhdGlvbiIsInJlbW92ZUNsYXNzIiwiYWpheFVybCIsImFqYXhNZXRob2QiLCJpZCIsImFqYXgiLCJ1cmwiLCJ0eXBlIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsImhlYWRlcnMiLCJzdWNjZXNzIiwiU1VDQ0VTUyIsImxvYWRNYWluQ29udGVudCIsImluaXRWaWV3TGlzdCIsInNldERldGFpbHNWaWV3RGF0YSIsIm5lZWRUb1NldCIsIm5vdGUiLCJwcm9wIiwiY2xpY2siLCJob29yZXljYURhdGFBY3RpdmUiLCJwcm9kdWN0R3JvdXAiLCJwcm9kdWN0X2dyb3VwIiwibmFtZSIsImNoYW5nZSIsInNlcnZpY2UiLCJwcm9maXRDZW50ZXIiLCJwcm9maXRfY2VudGVyIiwiZXNjYXBlU2VsZWN0b3IiLCJ1c2VycyIsInJlc2V0VXNlclRhYmxlIiwiaW5pdFZpZXdEZXRhaWxzIiwiQ29udGFjdFBvcFVwIiwiaW5pdCIsImFjdGl2ZSIsIm9uQWZ0ZXJTYXZlIiwiY29udGFjdEFjdGlvbiIsInJlbmRlckNvbnRhY3QiLCJiaW5kIiwic2V0Q29udGFjdFBvcHVwV29ya2Zsb3ciLCJjbGVhckRhdGEiLCJ0b29sdGlwIiwiaW5pdFJhZGlvQnV0dG9ucyIsImlucHV0bWFzayIsIm9uaW5jb21wbGV0ZSIsImxlbmd0aCIsIm9uY29tcGxldGUiLCJvbmNsZWFyZWQiLCJvZmYiLCJvbiIsImluaXRVc2VyQ3JlYXRlIiwic2VsZWN0MiIsInRhZ3MiLCJjcmVhdGVUYWciLCJwYXJhbXMiLCJ0ZXJtIiwidHJpbSIsInRleHQiLCJuZXdUYWciLCJzZXRJbWFnZUZyb21Mb2NhbCIsImlzIiwicmVuZGVyQXR0YWNobWVudCIsImluaXRGaWxlQXR0YWNobWVudEZlYXR1cmUiLCJpbml0RGVsaXZlcnlDb25zdHJhaW50VG9nZ2xlIiwidG9nZ2xlRGVsaXZlcnlGaWVsZHMiLCJoaWRlIiwic2V0VGltZW91dCIsInNlbGVjdGVkVXBsb2FkRmlsZVRvZ2dsZSIsImZpbGVJbnB1dCIsImZpbGVzIiwiZ3JvdXAiLCJmaW5kIiwiZ3JvdXBFbmQiLCJiZWZvcmVTZW5kIiwiYWRkQXR0YWNobWVudCIsImF0dGFjaG1lbnQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsImFqYXhFcnJvckZpZWxkSGFuZGxlciIsImNsaWNrTmV3IiwiY2xpY2tOZXdDYWxsQmFjayIsImRhdGF0YWJsZVJvd0FjdGlvbkVkaXQiLCJyb3dEYXRhIiwibm9kZSIsImNsaWNrT3JkZXJEZWxldGVDb25maXJtZWQiLCJtb2RhbCIsIl90b2tlbiIsInJvdyIsImRhdGFUYWJsZUNTU1NlbGVjdG9yIiwiRGF0YVRhYmxlIiwiZGFkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlIiwicGFyZW50cyIsIm1ldGhvZCIsInJlbW92ZSIsImRyYXciLCJkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlIiwiZGF0YXRhYmxlUm93QWN0aW9uRGVsZXRlIiwiZGF0YXRhYmxlUm93QWN0aW9uQnV0dG9uQ2xpY2siLCJjdXJyZW50VGFyZ2V0IiwiYWN0aW9uTmFtZSIsImNhcGl0YWxpemUiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJjb2xOdW0iLCJzZXRPcHRzIiwiZGF0YXRhYmxlQWN0aW9uQnV0dG9uQ2xpY2tDYWxsQmFjayIsImRhdGF0YWJsZVJvd0FjdGlvbkJ1dHRvbkNsaWNrQ2FsbEJhY2siLCJsYW5ndWFnZSIsInJlbmRlciIsImJ1dHRvbnMiLCJkYXRhdGFibGVBZGRSb3dUcmFzaEJ1dHRvbiIsImRhdGF0YWJsZUFkZFJvd0VkaXRCdXR0b24iLCJsYXRpbmlzZSIsImF1dG9QcmludCIsImNsYXNzTmFtZSIsImFwaSIsImNvbmZpZyIsImFjdGlvbiIsImUiLCJkdCIsImRyYXdDYWxsYmFjayIsInNldHRpbmdzIiwiZGF0YXRhYmxlQWRkUm93QWN0aW9uIiwiYXV0b2ZpbGxEZXRhaWxzIiwicmFuZG9tTnVtYmVyIiwiZ2V0UmFuZG9tSW50Iiwicm93TnVtIiwiZ2V0RGF0YSIsImF0dGFjaG1lbnREYXRhIiwiZGF0ZSIsIkRhdGUiLCJjcmVhdGVkX2F0IiwidG9Mb2NhbGVTdHJpbmciLCJsaW5rIiwiUHVibGljVXJsIiwiZmlsZW5hbWUiLCJ0ZW1wbGF0ZSIsImh0bWwiLCJNdXN0YWNoZSIsImJpbmRBdHRhY2htZW50Q2xpY2tBY3Rpb24iLCJiaW5kQ29udGFjdENsaWNrQWN0aW9uIiwiZW5hYmxlVGltZXJzIiwib3JpZ2luYWxfZmlsZW5hbWUiLCJyZXNldENvbnRhY3RUYWJsZSIsImNvbnRhY3REYXRhIiwidW5iaW5kIiwiY29udGFjdERlbGV0ZUNsaWNrIiwiY29udGFjdEVkaXRDbGljayIsImF0dGFjaG1lbnREZWxldGVDbGljayIsImN1cnJlbnRBdHRhY2htZW50Um93IiwiY2xvc2VzdCIsImF0dGFjaGVtbnRJZCIsImZpbHRlciIsImFyciIsInJlc2V0QXR0YWNobWVudFRhYmxlIiwiZ2V0Q29udGFjdFBvcHVwV29ya2Zsb3ciLCJsb2FkRGF0YSIsImdldFN1cHBsaWVyIiwiYWRkQ29udGFjdCIsImVkaXRDb250YWN0IiwibmV3Q29udGFjdHMiLCJyZW5kZXJVc2VycyIsInVzZXJEYXRhIiwiYmluZFVzZXJDbGlja0FjdGlvbiIsInVzZXJEZWxldGVDbGljayIsImFkZFVzZXIiLCJhbHJlYWR5QWRkZWQiLCJzb21lIiwidSIsImNyZWF0ZVVybCIsImNvbnRhaW5lciIsImNsZWFyRm9ybSIsImVtYWlsIiwicGFzc3dvcmQiLCJlcnJvckVsIiwidXNlciIsInhociIsIm1zZyIsImVycm9ycyIsImZpcnN0S2V5IiwiT2JqZWN0Iiwia2V5cyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2FkbWluL3N1cHBsaWVyLmpzP2E3YzQiXSwic291cmNlc0NvbnRlbnQiOlsiaWYodHlwZW9mIFN1cHBsaWVyPT09J3VuZGVmaW5lZCcpe1xuICAgIGNsYXNzIFN1cHBsaWVyIGV4dGVuZHMgRGF0YU1vZGVse1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIENvbnN0cnVjdG9yXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdHJ1Y3RvciAoZGF0YSxvcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihkYXRhLG9wdGlvbnMpXG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5jb250YWN0ID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdD1bXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLmNhblNlZSA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhblNlZT0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuY2FuU2VlSW5PcmRlciA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhblNlZUluT3JkZXI9MTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLmhhc0RlbGl2ZXJ5Q29uc3RyYWludCA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlbGl2ZXJ5Q29uc3RyYWludD0wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMub3JkZXJDdXRPZmZUaW1lID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJDdXRPZmZUaW1lPTEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuZGVsaXZlcnlMZWFkVGltZSA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGl2ZXJ5TGVhZFRpbWU9NDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU3VwcGxpZXIgY29uc3RydWN0b3IgY2FsbGVkJyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICB3aW5kb3cuU3VwcGxpZXI9U3VwcGxpZXI7XG59XG5cblxud2luZG93LlN1cHBsaWVyQWRtaW49ZnVuY3Rpb24gKG9wdGlvbnMsU3VwcGxpZXJJdGVtKSB7XG4gICAgLypcbiAgICAgKiBWYXJpYWJsZXMgYWNjZXNzaWJsZVxuICAgICAqIGluIHRoZSBjbGFzc1xuICAgICAqL1xuICAgIGxldCBPcHRzID0ge1xuICAgICAgICB0b2tlbjpudWxsLFxuICAgICAgICBjb250YWluZXJDc3NTZWxlY3RvcjogJy5jb250YWluZXJTdXBwbGllcicsXG4gICAgICAgIHRlc3RNb2RlOmZhbHNlLFxuICAgICAgICBVUkw6e1xuICAgICAgICAgICAgZ2V0RGF0YVRhYmxlQ29udGVudDonJyxcbiAgICAgICAgICAgIGluZGV4OicnLFxuICAgICAgICAgICAgc2hvdzonJyxcbiAgICAgICAgICAgIGVkaXQ6JycsXG4gICAgICAgICAgICBjcmVhdGU6JycsXG4gICAgICAgICAgICBzdG9yZTonJyxcbiAgICAgICAgICAgIHVwZGF0ZTonJyxcbiAgICAgICAgICAgIGRlc3Ryb3k6JycsXG4gICAgICAgICAgICBhdHRhY2hGaWxlOicnLFxuICAgICAgICAgICAgZGV0YWNoRmlsZTonJyxcbiAgICAgICAgICAgIGNyZWF0ZVVzZXI6JycsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGFUYWJsZTp7XG4gICAgICAgICAgICBvcmRlckRpcmVjdGl2ZTpbMSwgJ2FzYyddXG4gICAgICAgIH0sXG4gICAgICAgIG9uQWZ0ZXJJbml0Vmlld0RldGFpbHM6ZnVuY3Rpb24gKCl7fVxuICAgIH07XG4gICAgbGV0IFN1cHBsaWVyID0ge307XG4gICAgbGV0IHJvb3QgPSB0aGlzO1xuICAgIGxldCBjb250YWN0UG9wdXBXb3JrZmxvdz0nbmV3JztcbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgdGhpcy5jb25zdHJ1Y3QgPSBmdW5jdGlvbiAob3B0aW9ucyxTdXBwbGllckl0ZW0pIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1N1cHBsaWVyQWRtaW4gY29uc3RydWN0b3IgY2FsbGVkJyk7XG4gICAgICAgICQuZXh0ZW5kKE9wdHMsIG9wdGlvbnMpO1xuICAgICAgICBpZighU3VwcGxpZXJJdGVtKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdXBwbGllciBsZXRyZSBrZWxsZXQgaG96bmkgJyk7XG4gICAgICAgICAgICBpZighQVBQLlN1cHBsaWVyKXtcbiAgICAgICAgICAgICAgICBBUFAuU3VwcGxpZXI9bmV3IHdpbmRvdy5TdXBwbGllcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm9vdC5TdXBwbGllcj1BUFAuU3VwcGxpZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZ2V0T3B0cz1mdW5jdGlvbiAoKXtcbiAgICAgICAgcmV0dXJuIE9wdHM7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtRGF0YVRvRGF0YU9iamVjdEFQSUNhbGxPbGQ9IGZ1bmN0aW9uIChDU1NTZWxlY3Rvcikge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKENTU1NlbGVjdG9yKSk7XG4gICAgICAgIC8vbGV0IGZvcm1KU09OID0gT2JqZWN0LmZyb21FbnRyaWVzKGRhdGEuZW50cmllcygpKTtcbiAgICAgICAgdmFyIGZvcm1KU09OID0ge307XG4gICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgLy8gUmVmbGVjdC5oYXMgaW4gZmF2b3Igb2Y6IGZvcm1KU09OLmhhc093blByb3BlcnR5KGtleSlcbiAgICAgICAgICAgIGlmKCFSZWZsZWN0Lmhhcyhmb3JtSlNPTiwga2V5KSl7XG4gICAgICAgICAgICAgICAgZm9ybUpTT05ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGZvcm1KU09OW2tleV0pKXtcbiAgICAgICAgICAgICAgICBmb3JtSlNPTltrZXldID0gW2Zvcm1KU09OW2tleV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUpTT05ba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJChDU1NTZWxlY3RvcisnIGlucHV0W2RhdGEtaW5wdXRtYXNrXScpLmVhY2goZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBpZihmb3JtSlNPTlskKHRoaXMpLmF0dHIoJ25hbWUnKV0pe1xuICAgICAgICAgICAgICAgIGZvcm1KU09OWyQodGhpcykuYXR0cignbmFtZScpXT1mb3JtSlNPTlskKHRoaXMpLmF0dHIoJ25hbWUnKV0ucmVwbGFjZSgvW18gXSskL2csXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvL2Zvcm1KU09OLnByb2R1Y3RHcm91cHM9JChcIi5wcm9kdWN0Q2F0ZWdvcnlTZWxlY3RcIikuc2VsZWN0MigpLnZhbCgpO1xuXG5cbiAgICAgICAgLypNdWx0aXNlbGVjdCBvciBjaGVja2JveCB0byBhcnJheTpcbiAgICAgICAgYWpheERhdGFbJ3Byb2R1Y3RHcm91cCddPSQoXCIucHJvZHVjdENhdGVnb3J5U2VsZWN0XCIpLnNlbGVjdDIoKS52YWwoKTtcblxuICAgICAgICBmb3JtSlNPTi5tdWx0aXNlbGVjdE5hbWUgPSBkYXRhLmdldEFsbCgnbXVsdGlzZWxlY3ROYW1lJyk7XG4gICAgICAgICQuZWFjaChmb3JtSlNPTiwgZnVuY3Rpb24gKGl0ZW0sIHZhbHVlKSB7XG4gICAgICAgICAgICBmb3JtSlNPTlskLmxjRmlyc3QoaXRlbS5yZXBsYWNlKCdjb250YWN0JywgJycpKV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSBmb3JtSlNPTltpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmKGZvcm1KU09OLnBob25lKXtcbiAgICAgICAgICAgIGZvcm1KU09OLnBob25lPWZvcm1KU09OLnBob25lLnJlcGxhY2VBbGwoJ18nLCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZihmb3JtSlNPTi5lbWFpbCl7XG4gICAgICAgICAgICBmb3JtSlNPTi5lbWFpbD1mb3JtSlNPTi5lbWFpbC5yZXBsYWNlQWxsKCdfJywnJyk7XG4gICAgICAgIH1cbiAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIGZvcm1KU09OO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybURhdGFUb0RhdGFPYmplY3RBUElDYWxsID0gZnVuY3Rpb24gKENTU1NlbGVjdG9yRm9ybSkge1xuICAgICAgICBsZXQgYWpheERhdGE9bmV3IEZvcm1EYXRhKCQoQ1NTU2VsZWN0b3JGb3JtKVswXSk7XG4gICAgICAgICQuZWFjaChhamF4RGF0YS5nZXRBbGwoJ3Byb2ZpdENlbnRlcicpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7XG4gICAgICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ3Byb2ZpdENlbnRlcltdJyx2YWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgICQuZWFjaChhamF4RGF0YS5nZXRBbGwoJ3Byb2R1Y3RHcm91cCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7XG4gICAgICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ3Byb2R1Y3RHcm91cFtdJyx2YWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgICQuZWFjaChhamF4RGF0YS5nZXRBbGwoJ3N1cHBsaWVyU2VydmljZScpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7XG4gICAgICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ3N1cHBsaWVyU2VydmljZVtdJyx2YWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgICQuZWFjaChhamF4RGF0YS5nZXRBbGwoJ2NvbnRhY3RJZCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7XG4gICAgICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ2NvbnRhY3RJZFtdJyx2YWx1ZSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWpheERhdGEuYXBwZW5kKCdfdG9rZW4nLCQoJ2lucHV0W25hbWU9X3Rva2VuXScpLnZhbCgpKTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W2RhdGEtaW5wdXRtYXNrXScpLmVhY2goZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBsZXQgaW5kZXhLZXk9JCh0aGlzKS5hdHRyKCduYW1lJyk7XG4gICAgICAgICAgICBpZihhamF4RGF0YS5nZXQoaW5kZXhLZXkpKXtcbiAgICAgICAgICAgICAgICBhamF4RGF0YS5zZXQoaW5kZXhLZXksYWpheERhdGEuZ2V0KGluZGV4S2V5KS5yZXBsYWNlKC9bXyBdKyQvZyxcIlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhamF4RGF0YTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrU2F2ZUJ1dHRvbj1mdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZGVidWcoJ1NhdmUgY2xpY2tlZCcpO1xuICAgICAgICBsZXQgQ1NTU2VsZWN0b3JGb3JtPU9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuc3VwcGxpZXJGb3JtJztcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICBpZiAoJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPVwiY2FuU2VlSW5PcmRlclwiXScpLnZhbCgpPT0xICYmICQoQ1NTU2VsZWN0b3JGb3JtKVswXS5jaGVja1ZhbGlkaXR5KCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndmFsaWRhdG9uIGZhbHNlJyk7XG4gICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSkuYWRkQ2xhc3MoJ3dhcy12YWxpZGF0ZWQnKTtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKVswXS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiVmFsaWTDoWNpw7NzIGhpYmEhXCIsIG1lc3NhZ2U6IFwiS8OpcmrDvGssIHTDtmx0c2Uga2kgYSBrw7Z0ZWxlesWRIG1lesWRa2V0IVwiLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5EQU5HRVIsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd2YWxpZGF0b24gb2snKTtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKS5yZW1vdmVDbGFzcygnd2FzLXZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgLy9kbyB5b3VyIGFqYXggc3VibWl0aW9uIGhlcmVcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWpheERhdGE9cm9vdC5mb3JtRGF0YVRvRGF0YU9iamVjdEFQSUNhbGwoQ1NTU2VsZWN0b3JGb3JtKTtcblxuXG5cbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuc3RvcmU7XG4gICAgICAgIGxldCBhamF4TWV0aG9kPVwiUE9TVFwiO1xuICAgICAgICBpZihyb290LlN1cHBsaWVyLmlkKXtcbiAgICAgICAgICAgIGFqYXhVcmw9T3B0cy5VUkwudXBkYXRlLnJlcGxhY2UoJyVpZCUnLHJvb3QuU3VwcGxpZXIuaWQpO1xuICAgICAgICAgICAgLy9hamF4TWV0aG9kPVwiUFVUXCI7XG4gICAgICAgICAgICAvL2FqYXhEYXRhPW5ldyBGb3JtRGF0YSgkKENTU1NlbGVjdG9yRm9ybSlbMF0pO1xuICAgICAgICAgICAgYWpheERhdGEuYXBwZW5kKCdfbWV0aG9kJywnUFVUJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1ZyhhamF4TWV0aG9kKTtcbiAgICAgICAgZGVidWcoYWpheERhdGEpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICB0eXBlOmFqYXhNZXRob2QsXG4gICAgICAgICAgICBjb250ZW50VHlwZTpmYWxzZSxcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1DU1JGLVRPS0VOJzogJCgnaW5wdXRbbmFtZT1cIl90b2tlblwiXScpLnZhbCgpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKXtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnZDE6IFNhdmUgc3VjY2VzcyAnKTtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhkYXRhKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3M9PXRydWUpe1xuXG4gICAgICAgICAgICAgICAgICAgIC8vT3B0cy5vbkFmdGVySW5pdFZpZXdEZXRhaWxzPXJvb3QuYXV0b2ZpbGxEZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICBPcHRzLmRhdGFUYWJsZS5vcmRlckRpcmVjdGl2ZT1bMCwgJ2Rlc2MnXTtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiU2lrZXJlcyByw7ZnesOtdMOpcyFcIiwgbWVzc2FnZTogYWpheERhdGEuZ2V0KCduYW1lJykrXCIgbmV2xbEgYmVzesOhbGxsw610w7MgZWxtZW50dmVcIiwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuU1VDQ0VTUywgdGltZW91dDogNTAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChPcHRzLlVSTC5pbmRleCsnP2luaXQ9MCcscm9vdC5pbml0Vmlld0xpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0RGV0YWlsc1ZpZXdEYXRhPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ3NldERldGFpbHNWaWV3RGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZyhTdXBwbGllcik7XG4gICAgICAgIGxldCBDU1NTZWxlY3RvckZvcm09T3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5zdXBwbGllckZvcm0nO1xuICAgICAgICBsZXQgbmVlZFRvU2V0PVtcbiAgICAgICAgICAgICduYW1lJywnaG9vcmV5Y2FJZCcsJ25hbWVJZCcsXG4gICAgICAgICAgICAnb3JkZXJFbWFpbCcsJ29yZGVyRW1haWwyJywnYWRkcmVzcycsJ21haWxpbmdBZGRyZXNzJywncGhvbmUnLCdmYXgnLCdjdXN0b21lclNlcnZpY2VQaG9uZScsXG4gICAgICAgICAgICAnbmFtZTIyJyxcbiAgICAgICAgICAgICdvcGVuSG91cnMnLCAnb3JkZXJzRGVhZGxpbmUnLCAnbWluT3JkZXJWYWx1ZScsXG4gICAgICAgIF07XG4gICAgICAgICQuZWFjaChuZWVkVG9TZXQsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodHlwZW9mIHJvb3QuU3VwcGxpZXJbdGhpc10hPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9Jyt0aGlzKyddJykudmFsKHJvb3QuU3VwcGxpZXJbdGhpc10pO1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgdGV4dGFyZWFbbmFtZT0nK3RoaXMrJ10nKS52YWwocm9vdC5TdXBwbGllclt0aGlzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmKHR5cGVvZiByb290LlN1cHBsaWVyWydub3RlJ10hPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgdGV4dGFyZWFbbmFtZT1ub3RlXScpLnZhbChyb290LlN1cHBsaWVyLm5vdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHR5cGVvZiByb290LlN1cHBsaWVyWydlbWFpbEF0dGFjaG1lbnRUeXBlJ10hPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1lbWFpbEF0dGFjaG1lbnRUeXBlXVt2YWx1ZT0nK3Jvb3QuU3VwcGxpZXJbJ2VtYWlsQXR0YWNobWVudFR5cGUnXSsnXScpLnByb3AoJ2NoZWNrZWQnLHRydWUpO1xuICAgICAgICB9XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgKltkYXRhLXRvZ2dsZT1jYW5TZWVdW2RhdGEtdGl0bGU9Jytyb290LlN1cHBsaWVyLmNhblNlZSsnXScpLmNsaWNrKCk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgKltkYXRhLXRvZ2dsZT1jYW5TZWVJbk9yZGVyXVtkYXRhLXRpdGxlPScrcm9vdC5TdXBwbGllci5jYW5TZWVJbk9yZGVyKyddJykuY2xpY2soKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAqW2RhdGEtdG9nZ2xlPWhvb3JleWNhRGF0YUFjdGl2ZV1bZGF0YS10aXRsZT0nK3Jvb3QuU3VwcGxpZXIuaG9vcmV5Y2FEYXRhQWN0aXZlKyddJykuY2xpY2soKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAqW2RhdGEtdG9nZ2xlPWhhc0RlbGl2ZXJ5Q29uc3RyYWludF1bZGF0YS10aXRsZT0nK3Jvb3QuU3VwcGxpZXIuaGFzRGVsaXZlcnlDb25zdHJhaW50KyddJykuY2xpY2soKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPW9yZGVyQ3V0T2ZmVGltZV0nKS52YWwocm9vdC5TdXBwbGllci5vcmRlckN1dE9mZlRpbWUpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIHNlbGVjdFtuYW1lPWRlbGl2ZXJ5TGVhZFRpbWVdJykudmFsKHJvb3QuU3VwcGxpZXIuZGVsaXZlcnlMZWFkVGltZSk7XG4gICAgICAgIGxldCBwcm9kdWN0R3JvdXA9W107XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLnByb2R1Y3RfZ3JvdXAsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcHJvZHVjdEdyb3VwLnB1c2godGhpcy5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLnByb2R1Y3RDYXRlZ29yeVNlbGVjdCcpLnZhbChwcm9kdWN0R3JvdXApLmNoYW5nZSgpO1xuXG4gICAgICAgIGxldCBzZXJ2aWNlPVtdO1xuICAgICAgICAkLmVhY2gocm9vdC5TdXBwbGllci5zZXJ2aWNlLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlcnZpY2UucHVzaCh0aGlzLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAuc2VydmljZVNlbGVjdCcpLnZhbChzZXJ2aWNlKS5jaGFuZ2UoKTtcblxuICAgICAgICBsZXQgcHJvZml0Q2VudGVyPVtdO1xuICAgICAgICAkLmVhY2gocm9vdC5TdXBwbGllci5wcm9maXRfY2VudGVyLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByb2ZpdENlbnRlci5wdXNoKHRoaXMubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyQoQ1NTU2VsZWN0b3JGb3JtKycgLnByb2ZpdENlbnRlclNlbGVjdCcpLnZhbChwcm9maXRDZW50ZXIpLmNoYW5nZSgpO1xuICAgICAgICAvL2RlYnVnKHByb2ZpdENlbnRlcik7XG4gICAgICAgICQuZWFjaChwcm9maXRDZW50ZXIsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCgnaW5wdXRbdmFsdWU9XCInKyQuZXNjYXBlU2VsZWN0b3IodGhpcykrJ1wiXScpLnByb3AoIFwiY2hlY2tlZFwiLCB0cnVlICk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYodHlwZW9mIHJvb3QuU3VwcGxpZXJbJ2xvZ29GaWxlJ10hPSd1bmRlZmluZWQnICYmIChyb290LlN1cHBsaWVyWydsb2dvRmlsZSddKSl7XG4gICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGltZy5pbWFnZUxvZ28nKS5hdHRyKCdzcmMnLHJvb3QuU3VwcGxpZXJbJ2xvZ29GaWxlJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmKHR5cGVvZiByb290LlN1cHBsaWVyLnVzZXJzICE9PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICByb290LnJlc2V0VXNlclRhYmxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2RlYnVnKEFQUC5TdXBwbGllckFkbWluLmZvcm1EYXRhVG9EYXRhT2JqZWN0QVBJQ2FsbCgnLnN1cHBsaWVyRm9ybScpWydwcm9kdWN0R3JvdXAnXSk7XG4gICAgICAgIC8vJCgnW25hbWU9cHJvZHVjdEdyb3VwXScpLnZhbChbJ0LDvGbDqcOhcnVfw6lkZXNpcGFyaV90ZXJtw6lrZWsnLCdUb2rDoXMnXSkuY2hhbmdlKCk7XG4gICAgICAgIC8vcm9vdC5zZXREZXRhaWxzVmlld0RhdGEoKTtcbiAgICB9XG4gICAgdGhpcy5pbml0Vmlld0RldGFpbHM9ZnVuY3Rpb24gKG9wdGlvbnMsU3VwcGxpZXJJdGVtKXtcbiAgICAgICAgZGVidWcoJyoqY2FsbCBpbml0Vmlld0RldGFpbHMgJyk7XG4gICAgICAgIGlmKCFBUFAuQ29udGFjdFBvcFVwKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduaW5jcyBBUFAuQ29udGFjdFBvcFVwJylcbiAgICAgICAgICAgIEFQUC5Db250YWN0UG9wVXAgPSBuZXcgd2luZG93LkNvbnRhY3RQb3BVcCgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXIgdmFuICBBUFAuQ29udGFjdFBvcFVwJylcbiAgICAgICAgfVxuICAgICAgICBBUFAuQ29udGFjdFBvcFVwLmluaXQoe1xuICAgICAgICAgICAgYWN0aXZlOnRydWUsXG4gICAgICAgICAgICBvbkFmdGVyU2F2ZTpyb290LmNvbnRhY3RBY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QucmVuZGVyQ29udGFjdCgpO1xuICAgICAgICAkKCcuc3VwcGxpZXJGb3JtIC5idXR0b25OZXdDb250YWN0JykuYmluZCgnY2xpY2snLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgQVBQLlN1cHBsaWVyQWRtaW4uc2V0Q29udGFjdFBvcHVwV29ya2Zsb3coJ25ldycpO1xuICAgICAgICAgICAgQVBQLkNvbnRhY3RQb3BVcC5jbGVhckRhdGEoKTtcbiAgICAgICAgICAgIEFQUC5Db250YWN0UG9wVXAuc2hvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCgnW2RhdGEtdG9nZ2xlPVwidG9vbHRpcFwiXScpLnRvb2x0aXAoKTtcbiAgICAgICAgaW5pdFJhZGlvQnV0dG9ucygpO1xuICAgICAgICAkKFwiOmlucHV0XCIpLmlucHV0bWFzayh7XG4gICAgICAgICAgICBcIm9uaW5jb21wbGV0ZVwiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJCh0aGlzKS5kYXRhKCdyZXF1aXJlZCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKS5sZW5ndGggPiAwIHx8ICQodGhpcykuZGF0YSgncmVxdWlyZWQnKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib25jb21wbGV0ZVwiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2lzLXZhbGlkJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvbmNsZWFyZWRcIjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjbGVhcmVkJyk7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCdmb3JtLnN1cHBsaWVyRm9ybSBidXR0b24uRm9ybVNhdmVCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ2Zvcm0uc3VwcGxpZXJGb3JtIGJ1dHRvbi5Gb3JtU2F2ZUJ1dHRvbicpLm9uKCdjbGljaycscm9vdC5jbGlja1NhdmVCdXR0b24pO1xuICAgICAgICByb290LnNldERldGFpbHNWaWV3RGF0YSgpO1xuICAgICAgICByb290LmluaXRVc2VyQ3JlYXRlKCk7XG4gICAgICAgICQoXCIucHJvZHVjdENhdGVnb3J5U2VsZWN0XCIpLnNlbGVjdDIoKTtcbiAgICAgICAgJChcIi5zZXJ2aWNlU2VsZWN0XCIpLnNlbGVjdDIoe1xuICAgICAgICAgICAgdGFnczogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZVRhZzogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXJtID0gJC50cmltKHBhcmFtcy50ZXJtKTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXJtID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGVybSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGVybSxcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFnOiB0cnVlIC8vIGFkZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vJChcIi5wcm9maXRDZW50ZXJTZWxlY3RcIikuc2VsZWN0MigpO1xuICAgICAgICAkKFwiaW5wdXRbbmFtZT1sb2dvRmlsZV1cIikuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBzZXRJbWFnZUZyb21Mb2NhbCh0aGlzLE9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuaW1hZ2VMb2dvJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJ2Zvcm0uc3VwcGxpZXJGb3JtIC5wcm9maXRDZW50ZXJTZWxlY3RDaGVja2JveEFsbCcpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnZm9ybS5zdXBwbGllckZvcm0gLnByb2ZpdENlbnRlclNlbGVjdENoZWNrYm94QWxsJykub24oJ2NsaWNrJyxmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAvL2xldCBjaGVja2VkPSQodGhpcykuaXMoXCI6Y2hlY2tlZFwiKVxuICAgICAgICAgICAgJCgnZm9ybS5zdXBwbGllckZvcm0gaW5wdXQucHJvZml0Q2VudGVyU2VsZWN0Q2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywkKHRoaXMpLmlzKFwiOmNoZWNrZWRcIikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9vdC5yZW5kZXJBdHRhY2htZW50KCk7XG4gICAgICAgIC8vT3B0cy5vbkFmdGVySW5pdFZpZXdEZXRhaWxzKCk7XG4gICAgICAgIHJvb3QuaW5pdEZpbGVBdHRhY2htZW50RmVhdHVyZSgpO1xuXG4gICAgICAgIHJvb3QuaW5pdERlbGl2ZXJ5Q29uc3RyYWludFRvZ2dsZSgpO1xuXG4gICAgICAgIGRlYnVnKCcqKmVuZCBpbml0Vmlld0RldGFpbHMgJyk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0RGVsaXZlcnlDb25zdHJhaW50VG9nZ2xlPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT1PcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKycgLnN1cHBsaWVyRm9ybSc7XG4gICAgICAgIGxldCB0b2dnbGVEZWxpdmVyeUZpZWxkcz1mdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdmFsPSQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1cImhhc0RlbGl2ZXJ5Q29uc3RyYWludFwiXScpLnZhbCgpO1xuICAgICAgICAgICAgaWYodmFsPT0xKXtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5kZWxpdmVyeUNvbnN0cmFpbnRGaWVsZHMnKS5zaG93KCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5kZWxpdmVyeUNvbnN0cmFpbnRGaWVsZHMnKS5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgYVtkYXRhLXRvZ2dsZT1cImhhc0RlbGl2ZXJ5Q29uc3RyYWludFwiXScpLm9mZignY2xpY2suZGVsaXZlcnlDb25zdHJhaW50Jyk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgYVtkYXRhLXRvZ2dsZT1cImhhc0RlbGl2ZXJ5Q29uc3RyYWludFwiXScpLm9uKCdjbGljay5kZWxpdmVyeUNvbnN0cmFpbnQnLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgc2V0VGltZW91dCh0b2dnbGVEZWxpdmVyeUZpZWxkcywwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvZ2dsZURlbGl2ZXJ5RmllbGRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFVwbG9hZEZpbGVUb2dnbGU9ZnVuY3Rpb24gKGZpbGVJbnB1dCl7XG4gICAgICAgIC8qXG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGVJbnB1dC5hdHRyKCduYW1lJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhmaWxlSW5wdXRbMF0uZmlsZXNbMF0pO1xuICAgICAgICBjb25zb2xlLmxvZyhmaWxlSW5wdXRbMF0uZmlsZXNbMF0ubmFtZSk7XG4gICAgICAgICovXG4gICAgICAgIGlmKGZpbGVJbnB1dCl7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyRmlsZVVwbG9hZCcpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgICAgIGlmKGZpbGVJbnB1dFswXS5maWxlc1swXSl7XG4gICAgICAgICAgICAgICAgJCgnLmNvbnRhaW5lclVwbG9hZGVkRmlsZU5hbWUnKS50ZXh0KGZpbGVJbnB1dFswXS5maWxlc1swXS5uYW1lKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnLmNvbnRhaW5lckZpbGVVcGxvYWRTdGFydGVkJykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lclVwbG9hZGVkU3Bpbm5lcicpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyVXBsb2FkZWRGaWxlTmFtZScpLnRleHQoJycpO1xuICAgICAgICAgICAgJCgnLmN1c3RvbS1maWxlLWxhYmVsLnNlbGVjdGVkJykudGV4dCgnJyk7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyRmlsZVVwbG9hZFN0YXJ0ZWQnKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAkKCcudXBsb2FkU3RhdHVzUm93JykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lckZpbGVVcGxvYWQnKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluaXRGaWxlQXR0YWNobWVudEZlYXR1cmU9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLWluaXRGaWxlQXR0YWNobWVudEZlYXR1cmUtLS0tLS0tLS0tLScpO1xuICAgICAgICBpZihyb290LlN1cHBsaWVyLmlkKXtcbiAgICAgICAgICAgICQoJy5jb250YWluZXJGaWxlVXBsb2FkJykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lckZpbGVVcGxvYWROb25lJykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICB9XG5cblxuICAgICAgICAkKE9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuYnV0dG9uVXBsb2FkJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKE9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuYnV0dG9uVXBsb2FkJykub24oJ2NsaWNrJyxmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoJy0tLS0tLS1idXR0b25VcGxvYWQtLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgbGV0IGZpbGVJbnB1dD0kKCcjaW5wdXRHcm91cEF0dGFjaGVGaWxlJyk7XG4gICAgICAgICAgICBpZihmaWxlSW5wdXRbMF0uZmlsZXMubGVuZ3RoPDEpe1xuICAgICAgICAgICAgICAgIFRvYXN0LmNyZWF0ZSh7IHRpdGxlOiBcIkhpYmEhXCIsIG1lc3NhZ2U6ICdWw6FsbGFzem9uIGtpIGbDoWpsdCEnLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5EQU5HRVIsIHRpbWVvdXQ6IDEwMDAwIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCQoT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcikuZmluZCgnZm9ybS5zdXBwbGllckZvcm0nKVswXSk7XG4gICAgICAgICAgICBsZXQgZGF0YT0gbmV3IEZvcm1EYXRhKCQoT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcikuZmluZCgnZm9ybS5zdXBwbGllckZvcm0nKVswXSk7XG4gICAgICAgICAgICBkYXRhLmFwcGVuZChmaWxlSW5wdXQuYXR0cignbmFtZScpLGZpbGVJbnB1dFswXS5maWxlc1swXSk7XG5cbiAgICAgICAgICAgIHJvb3Quc2VsZWN0ZWRVcGxvYWRGaWxlVG9nZ2xlKGZpbGVJbnB1dCk7XG4gICAgICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5hdHRhY2hGaWxlLnJlcGxhY2UoJyVpZCUnLHJvb3QuU3VwcGxpZXIuaWQpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDphamF4VXJsLFxuICAgICAgICAgICAgICAgIGRhdGE6ZGF0YSxcbiAgICAgICAgICAgICAgICB0eXBlOidQT1NUJyxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTpmYWxzZSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcz09dHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LmFkZEF0dGFjaG1lbnQoZGF0YS5kYXRhLmF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5zZWxlY3RlZFVwbG9hZEZpbGVUb2dnbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS5yZXNwb25zZUpTT04pO1xuICAgICAgICAgICAgICAgICAgICByb290LnNlbGVjdGVkVXBsb2FkRmlsZVRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgICAgICBhamF4RXJyb3JGaWVsZEhhbmRsZXIoZGF0YS5yZXNwb25zZUpTT04uZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrTmV3PWZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrTmV3Jyk7XG4gICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoT3B0cy5VUkwuY3JlYXRlLHJvb3QuY2xpY2tOZXdDYWxsQmFjayk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja05ld0NhbGxCYWNrPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NhbGxiYWNrTmV3Jyk7XG4gICAgICAgIHJvb3QuU3VwcGxpZXI9bmV3IHdpbmRvdy5TdXBwbGllcigpO1xuICAgICAgICByb290LmluaXRWaWV3RGV0YWlscygpO1xuICAgIH1cbiAgICB0aGlzLmRhdGF0YWJsZVJvd0FjdGlvbkVkaXQ9ZnVuY3Rpb24gKHJvd0RhdGEsbm9kZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnZGF0YXRhYmxlUm93QWN0aW9uRWRpdCBDYWxsZWQnKTtcbiAgICAgICAgLy9PcHRzLm9uQWZ0ZXJJbml0Vmlld0RldGFpbHM9cm9vdC5hdXRvZmlsbERldGFpbHM7XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmVkaXQucmVwbGFjZSgnJWlkJScscm93RGF0YS5pZCk7XG4gICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoYWpheFVybCxyb290LmluaXRWaWV3RGV0YWlscyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhdGFibGVSb3dBY3Rpb25FZGl0IEVuZCcpO1xuICAgIH1cblxuICAgIHRoaXMuY2xpY2tPcmRlckRlbGV0ZUNvbmZpcm1lZD1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICBkZWJ1ZygnY2xpY2tTdXBwbGllckRlbGV0ZUNvbmZpcm1lZCcpO1xuICAgICAgICBkZWJ1ZyhldmVudCk7XG4gICAgICAgIGRlYnVnKGV2ZW50LmRhdGEpO1xuICAgICAgICAkKCcjZGlhbG9nTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICBsZXQgYWpheERhdGE9e307XG4gICAgICAgIGFqYXhEYXRhLl90b2tlbj1PcHRzLnRva2VuO1xuICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5kZXN0cm95LnJlcGxhY2UoJyVpZCUnLGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICBhamF4RGF0YS5fdG9rZW49JCgnaW5wdXRbbmFtZT1fdG9rZW5dJykudmFsKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGFqYXhVcmwpO1xuICAgICAgICBjb25zb2xlLmxvZyhhamF4RGF0YSk7XG4gICAgICAgIGxldCByb3c9JChkYXRhVGFibGVDU1NTZWxlY3RvcikuRGF0YVRhYmxlKCkucm93KHJvb3QuZGFkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlLnBhcmVudHMoJ3RyJykpO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOmFqYXhVcmwsXG4gICAgICAgICAgICBkYXRhOmFqYXhEYXRhLFxuICAgICAgICAgICAgbWV0aG9kOlwiREVMRVRFXCIsXG4gICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKXtcbiAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3M9PXRydWUpe1xuICAgICAgICAgICAgICAgICAgICByb3cucmVtb3ZlKCkuZHJhdygpO1xuICAgICAgICAgICAgICAgICAgICByb290LmRhZGF0YXRhYmxlUm93QWN0aW9uQ2FsbGVyTm9kZT1mYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuICAgIGxldCBkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlPWZhbHNlO1xuXG4gICAgdGhpcy5kYXRhdGFibGVSb3dBY3Rpb25EZWxldGU9ZnVuY3Rpb24gKHJvd0RhdGEsbm9kZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnZGF0YXRhYmxlUm93QWN0aW9uRGVsZXRlIENhbGxlZCcpO1xuICAgICAgICByb290LmRhZGF0YXRhYmxlUm93QWN0aW9uQ2FsbGVyTm9kZT1ub2RlO1xuICAgICAgICAkKCcjZGlhbG9nTW9kYWwnKS5vbignc2hvdy5icy5tb2RhbCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCB5b3UgY291bGQgaW5pdGlhdGUgYW4gQUpBWCByZXF1ZXN0IGhlcmUgKGFuZCB0aGVuIGRvIHRoZSB1cGRhdGluZyBpbiBhIGNhbGxiYWNrKS5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kYWwncyBjb250ZW50LiBXZSdsbCB1c2UgalF1ZXJ5IGhlcmUsIGJ1dCB5b3UgY291bGQgdXNlIGEgZGF0YSBiaW5kaW5nIGxpYnJhcnkgb3Igb3RoZXIgbWV0aG9kcyBpbnN0ZWFkLlxuICAgICAgICAgICAgdmFyIG1vZGFsID0gJCh0aGlzKTtcbiAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5tb2RhbC10aXRsZScpLnRleHQoJ01lZ2VyxZFzw610w6lzICcpO1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnLm1vZGFsLWJvZHknKS50ZXh0KCdCaXp0b3NhbiB0w7ZybGkgYSBiZXN6w6FsbMOtdMOzdD8nKTtcbiAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5idXR0b25ZZXMnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICAgICBtb2RhbC5maW5kKCcuYnV0dG9uWWVzJykub24oJ2NsaWNrJyx7aWQ6cm93RGF0YS5pZH0scm9vdC5jbGlja09yZGVyRGVsZXRlQ29uZmlybWVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoJyNkaWFsb2dNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhdGFibGVSb3dBY3Rpb25CdXR0b25DbGljaz1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICBkZWJ1ZygnZGF0YXRhYmxlUm93QWN0aW9uQnV0dG9uQ2xpY2snKTtcbiAgICAgICAgbGV0IG5vZGU9JChldmVudFswXS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgbGV0IHJvdz0kKGRhdGFUYWJsZUNTU1NlbGVjdG9yKS5EYXRhVGFibGUoKS5yb3cobm9kZS5wYXJlbnRzKCd0cicpKTtcbiAgICAgICAgbGV0IHJvd0RhdGE9cm93LmRhdGEoKTtcbiAgICAgICAgbGV0IGFjdGlvbk5hbWU9J2RhdGF0YWJsZVJvd0FjdGlvbicrbm9kZS5kYXRhKCdidXR0b250eXBlJykuY2FwaXRhbGl6ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3RbYWN0aW9uTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3RbYWN0aW9uTmFtZV0ocm93RGF0YSxub2RlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pbml0Vmlld0xpc3QgPSBmdW5jdGlvbiAob3B0aW9ucz17fSkge1xuICAgICAgICBkZWJ1ZygnbGlzdHZpZXcgaW5pY2lhbGl6YXRpb24nKTtcbiAgICAgICAgZGF0YVRhYmxlQ1NTU2VsZWN0b3I9T3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5kYXRhVGFibGUnOyAvL1xuXG4gICAgICAgIGxldCBjb2xOdW09JChkYXRhVGFibGVDU1NTZWxlY3RvcisnIHRoZWFkIHRoJykubGVuZ3RoOyAvL2J1dHRvbnMgaW5zZXJ0IHBvc2l0aW9uIG5lZWRcbiAgICAgICAgQVBQLnNldE9wdHMoe1xuICAgICAgICAgICAgZGF0YXRhYmxlQWN0aW9uQnV0dG9uQ2xpY2tDYWxsQmFjazpyb290LmNsaWNrTmV3LFxuICAgICAgICAgICAgZGF0YXRhYmxlUm93QWN0aW9uQnV0dG9uQ2xpY2tDYWxsQmFjazpyb290LmRhdGF0YWJsZVJvd0FjdGlvbkJ1dHRvbkNsaWNrLFxuXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBvcmRlckRpcmVjdGl2ZT1PcHRzLmRhdGFUYWJsZS5vcmRlckRpcmVjdGl2ZTtcbiAgICAgICAgaWYodHlwZW9mIG9wdGlvbnNbJ29yZGVyRGlyZWN0aXZlJ10hPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIG9yZGVyRGlyZWN0aXZlPW9wdGlvbnNbJ29yZGVyRGlyZWN0aXZlJ107XG4gICAgICAgIH1cbiAgICAgICAgJChkYXRhVGFibGVDU1NTZWxlY3RvcikuRGF0YVRhYmxlKCB7XG4gICAgICAgICAgICBsYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHVybDogJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMjQvaTE4bi9IdW5nYXJpYW4uanNvbidcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vXCJhamF4XCI6IFwie3thc3NldCgnZXhhcG1sZTIuanNvbicpfX1cIixcbiAgICAgICAgICAgIFwiYWpheFwiOiBPcHRzLlVSTC5nZXREYXRhVGFibGVDb250ZW50LFxuICAgICAgICAgICAgXCJjb2x1bW5EZWZzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwidGFyZ2V0c1wiOiBjb2xOdW0tMSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZW5kZXJcIjogZnVuY3Rpb24gKCBkYXRhLCB0eXBlLCByb3cgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9ucz1BUFAuZGF0YXRhYmxlQWRkUm93VHJhc2hCdXR0b24oMCxhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucys9QVBQLmRhdGF0YWJsZUFkZFJvd0VkaXRCdXR0b24oMCxhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbnM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwidGFyZ2V0c1wiOiAxLFxuICAgICAgICAgICAgICAgICAgICBcInJlbmRlclwiOiBmdW5jdGlvbiAoIGRhdGEsIHR5cGUsIHJvdyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09PSBcInNvcnRcIiA/IGRhdGEubGF0aW5pc2UoKSA6IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvL3sgXCJ2aXNpYmxlXCI6IGZhbHNlLCAgXCJ0YXJnZXRzXCI6IFsgMCBdIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBidXR0b25zOntcbiAgICAgICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgICAgICAgICdleGNlbCcsJ3BkZicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZDogJ3ByaW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dDogJ1ByaW50IGN1cnJlbnQgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnOiAndGl0bGUgY3VzdG9tIHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2VUb3AnOiAnTWVzc2FnZSBPbiBUb3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1ByaW50OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8qKi9cblxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnw5pqIGZlbHZpdGVsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdidG4gYnRuLXN1Y2Nlc3MgbmV3SXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6MlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzonbmV3SXRlbSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbihhcGksIG5vZGUsIGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobm9kZSkucmVtb3ZlQ2xhc3MoJ3VpLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoIGUsIGR0LCBub2RlLCBjb25maWcgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBQLmRhdGF0YWJsZUFjdGlvbkJ1dHRvbkNsaWNrQ2FsbEJhY2soYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29uZmlnKTsqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjb2x1bW5zXCI6IFtcbiAgICAgICAgICAgICAgICB7IFwiZGF0YVwiOiBcImlkXCIgfSxcbiAgICAgICAgICAgICAgICB7IFwiZGF0YVwiOiBcIm5hbWVcIiB9LFxuICAgICAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwiaG9vcmV5Y2FJZFwiIH0sXG4gICAgICAgICAgICAgICAgeyBcImRhdGFcIjogXCJuYW1lSWRcIiB9LFxuICAgICAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwiY3JlYXRlZF9hdFwiIH0sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcIm9yZGVyXCI6IG9yZGVyRGlyZWN0aXZlLFxuICAgICAgICAgICAgXCJzdGF0ZVNhdmVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uKCBzZXR0aW5ncyApIHtcbiAgICAgICAgICAgICAgICBBUFAuZGF0YXRhYmxlQWRkUm93QWN0aW9uKGRhdGFUYWJsZUNTU1NlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgICBkZWJ1ZygnbGlzdHZpZXcgZW5kJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvZmlsbERldGFpbHM9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGRlYnVnKCdueWVyZXNyZSBhbGx1bmsnKTtcbiAgICAgICAgbGV0IHJhbmRvbU51bWJlcj1nZXRSYW5kb21JbnQoOTk5OSk7XG4gICAgICAgICQoJ2lucHV0W25hbWU9bmFtZV0nKS52YWwoJ0Jlc3phbMOtdMOzJytyYW5kb21OdW1iZXIpO1xuICAgICAgICAkKCdpbnB1dFtuYW1lPWhvb3JleWNhSWRdJykudmFsKCdoYicrcmFuZG9tTnVtYmVyKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1uYW1lSWRdJykudmFsKCdiZScrcmFuZG9tTnVtYmVyKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1vcmRlckVtYWlsXScpLnZhbCgna2FwY3NvbGF0JytyYW5kb21OdW1iZXIrJ0BiZXN6YWxsaXRvLmh1Jyk7XG4gICAgICAgICQoJ2lucHV0W25hbWU9b3JkZXJFbWFpbDJdJykudmFsKCdpbmZvcm1hY2lvJytyYW5kb21OdW1iZXIrJ0BiZXN6YWxsaXRvLmh1Jyk7XG4gICAgICAgICQoJ2lucHV0W25hbWU9YWRkcmVzc10nKS52YWwoJzg5ODkgU3VwcGxpZXIgdXRjYSAnK3JhbmRvbU51bWJlcik7XG4gICAgICAgICQoJ2lucHV0W25hbWU9bWFpbGluZ0FkZHJlc3NdJykudmFsKCc4OTg5IFBvc3RhaSDDunQnK3JhbmRvbU51bWJlcik7XG4gICAgICAgICQoJ2lucHV0W25hbWU9cGhvbmVdJykudmFsKCcrMzYzMDEyMzQ1NjcnKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1mYXhdJykudmFsKCczNjMwODg4OTk5OScpO1xuICAgICAgICAkKCdpbnB1dFtuYW1lPWN1c3RvbWVyU2VydmljZVBob25lXScpLnZhbCgnKzM2NzYxMjM0NDQ0Jyk7XG4gICAgICAgICQoJ3RleHRhcmVhW25hbWU9bm90ZV0nKS52YWwoJ01lZ2plZ3l6ZW0gJytyYW5kb21OdW1iZXIpO1xuXG4gICAgfVxuICAgIHRoaXMudGVzdE1vZGU9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCchISEhdGVzdG1vZGUgISEhIScpO1xuICAgICAgICByb290LlN1cHBsaWVyID0gbmV3IHdpbmRvdy5TdXBwbGllcih7XG4gICAgICAgICAgICAnY29udGFjdCc6W1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6MixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6MyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOjMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOidLw7NzYSBWZXJvbmlrYScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDonc3phbWxhemFzNEBmdW5rY2lvLmh1JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lOid7e2Zvcm1hdHRlclBob25lTnVtYmVyKFwiKzM2MjA0NTg5MTgwXCIpfX0nXG4gICAgICAgICAgICB9XG4qL1xuXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICBPcHRzLm9uQWZ0ZXJJbml0Vmlld0RldGFpbHM9cm9vdC5hdXRvZmlsbERldGFpbHM7XG4gICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoT3B0cy5VUkwuY3JlYXRlLHJvb3QuaW5pdFZpZXdEZXRhaWxzKTtcbiAgICB9XG4gICAgdGhpcy5pbml0PWZ1bmN0aW9uIChvcHRpb25zLFN1cHBsaWVySXRlbSl7XG4gICAgICAgICQuZXh0ZW5kKE9wdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmKE9wdHMudGVzdE1vZGUpe1xuICAgICAgICAgICAgcmV0dXJuIHJvb3QudGVzdE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZihTdXBwbGllckl0ZW0pe1xuICAgICAgICAgICAgcm9vdC5TdXBwbGllcj1TdXBwbGllckl0ZW1cbiAgICAgICAgfVxuICAgICAgICByb290LmluaXRWaWV3TGlzdCgpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyQXR0YWNobWVudD1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IHJvd051bT0xO1xuICAgICAgICBjb25zb2xlLmxvZygncmVuZGVyaW5nQXR0YWNobWVudCcpO1xuICAgICAgICAkLmVhY2gocm9vdC5TdXBwbGllci5nZXREYXRhKCdhdHRhY2htZW50JyksZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBsZXQgYXR0YWNobWVudERhdGE9dGhpcztcbiAgICAgICAgICAgIGF0dGFjaG1lbnREYXRhLnJvd051bT1yb3dOdW07XG4gICAgICAgICAgICBkYXRlPW5ldyBEYXRlKGF0dGFjaG1lbnREYXRhLmNyZWF0ZWRfYXQpO1xuICAgICAgICAgICAgYXR0YWNobWVudERhdGEuZGF0ZT1kYXRlLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgICAgICBhdHRhY2htZW50RGF0YS5saW5rPWF0dGFjaG1lbnREYXRhLlB1YmxpY1VybCsnLycrYXR0YWNobWVudERhdGEuZmlsZW5hbWU7XG4gICAgICAgICAgICBsZXQgdGVtcGxhdGU9JCgndGVtcGxhdGVbZGF0YS1uYW1lPVwic3VwcGxpZXJBdHRhY2htZW50VGFibGVSb3dcIl0nKS5odG1sKClcbiAgICAgICAgICAgIGxldCByZW5kZXI9TXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLGF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgICAgICQoJy5hdHRhY2htZW50VGFibGUgdGJvZHknKS5hcHBlbmQocmVuZGVyKTtcbiAgICAgICAgICAgIHJvd051bSsrO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9vdC5iaW5kQXR0YWNobWVudENsaWNrQWN0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRBdHRhY2htZW50PWZ1bmN0aW9uIChhdHRhY2htZW50RGF0YSl7XG4gICAgICAgIGNvbnNvbGUubG9nKGF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT1PcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKycgLnN1cHBsaWVyRm9ybSc7XG4gICAgICAgIHJvb3QuU3VwcGxpZXIuYXR0YWNobWVudC5wdXNoKGF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgYXR0YWNobWVudERhdGEucm93TnVtPXJvb3QuU3VwcGxpZXIuYXR0YWNobWVudC5sZW5ndGg7XG4gICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllckF0dGFjaG1lbnRUYWJsZVJvd1wiXScpLmh0bWwoKVxuICAgICAgICBsZXQgcmVuZGVyPU11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSxhdHRhY2htZW50RGF0YSk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLmF0dGFjaG1lbnRUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICByb290LmJpbmRDb250YWN0Q2xpY2tBY3Rpb24oKTtcbiAgICAgICAgVG9hc3QuZW5hYmxlVGltZXJzKGZhbHNlKTtcbiAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiRsOhamwgaG96esOhYWR2YSFcIiwgbWVzc2FnZTogYXR0YWNobWVudERhdGEub3JpZ2luYWxfZmlsZW5hbWUrXCIgZsOhamwgaG96esOhYWR2YVwiLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5TVUNDRVNTLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIH1cblxuXG4gICAgdGhpcy5yZXNldENvbnRhY3RUYWJsZT1mdW5jdGlvbiAoKXtcbiAgICAgICAgJCgnLmNvbnRhY3RUYWJsZSB0Ym9keSB0cicpLnJlbW92ZSgpO1xuICAgICAgICByb290LnJlbmRlckNvbnRhY3QoKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJDb250YWN0PWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgcm93TnVtPTE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdyZW5kZXJpbmdDb250YWN0cycpO1xuICAgICAgICAkLmVhY2gocm9vdC5TdXBwbGllci5nZXREYXRhKCdjb250YWN0JyksZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBsZXQgY29udGFjdERhdGE9dGhpcztcbiAgICAgICAgICAgIGNvbnRhY3REYXRhLnJvd051bT1yb3dOdW07XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNvbnRhY3REYXRhKTtcbiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllckNvbnRhY3RUYWJsZVJvd1wiXScpLmh0bWwoKVxuICAgICAgICAgICAgbGV0IHJlbmRlcj1NdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsY29udGFjdERhdGEpO1xuICAgICAgICAgICAgJCgnLmNvbnRhY3RUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICAgICAgcm93TnVtKys7XG4gICAgICAgIH0pO1xuICAgICAgICByb290LmJpbmRDb250YWN0Q2xpY2tBY3Rpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRDb250YWN0Q2xpY2tBY3Rpb24gPWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgbm9kZT0kKCcuY29udGFjdFRhYmxlIC5idXR0b25EZWxldGUnKTtcbiAgICAgICAgbm9kZS51bmJpbmQoJ2NsaWNrJyk7XG4gICAgICAgIG5vZGUuYmluZCgnY2xpY2snLHJvb3QuY29udGFjdERlbGV0ZUNsaWNrKTtcblxuICAgICAgICBub2RlPSQoJy5jb250YWN0VGFibGUgLmJ1dHRvbkVkaXQnKTtcbiAgICAgICAgbm9kZS51bmJpbmQoJ2NsaWNrJyk7XG4gICAgICAgIG5vZGUuYmluZCgnY2xpY2snLHJvb3QuY29udGFjdEVkaXRDbGljayk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmJpbmRBdHRhY2htZW50Q2xpY2tBY3Rpb249ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBub2RlPSQoJy5hdHRhY2htZW50VGFibGUgLmJ1dHRvbkRlbGV0ZScpO1xuICAgICAgICBub2RlLnVuYmluZCgnY2xpY2snKTtcbiAgICAgICAgbm9kZS5iaW5kKCdjbGljaycscm9vdC5hdHRhY2htZW50RGVsZXRlQ2xpY2spO1xuICAgIH1cbiAgICBsZXQgY3VycmVudEF0dGFjaG1lbnRSb3c9ZmFsc2U7XG4gICAgdGhpcy5hdHRhY2htZW50RGVsZXRlQ2xpY2s9ZnVuY3Rpb24gKGV2ZW50KXtcbiAgICAgICAgbGV0IHJvdz0kKHRoaXMpLmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgIGxldCBpZD1yb3cuZmluZCgnaW5wdXRbbmFtZT1hdHRhY2htZW50SWRdJykudmFsKCk7XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmRldGFjaEZpbGUucmVwbGFjZSgnJWlkJScscm9vdC5TdXBwbGllci5pZCk7XG4gICAgICAgIC8vbGV0IGRhdGE9IG5ldyBGb3JtRGF0YSgkKE9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IpLmZpbmQoJ2Zvcm0uc3VwcGxpZXJGb3JtJylbMF0pO1xuICAgICAgICAvL2RhdGEuYXBwZW5kKGZpbGVJbnB1dC5hdHRyKCduYW1lJyksZmlsZUlucHV0WzBdLmZpbGVzWzBdKTtcbiAgICAgICAgbGV0IGRhdGE9e307XG4gICAgICAgIGRhdGEuX3Rva2VuPSQoJ2lucHV0W25hbWU9XCJfdG9rZW5cIl0nKS52YWwoKTtcbiAgICAgICAgZGF0YS5hdHRhY2hlbW50SWQ9aWQ7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6ZGF0YSxcbiAgICAgICAgICAgIHR5cGU6J1BPU1QnLFxuICAgICAgICAgICAgLy9jb250ZW50VHlwZTpmYWxzZSxcbiAgICAgICAgICAgIC8vcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzPT10cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5TdXBwbGllci5hdHRhY2htZW50PXJvb3QuU3VwcGxpZXIuYXR0YWNobWVudC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUsaW5kZXgsYXJyKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaWQhPT1kYXRhLmRhdGEuICAgYXR0YWNobWVudC5pZCoxKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIC8vcm93LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICByb290LnJlc2V0QXR0YWNobWVudFRhYmxlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS5yZXNwb25zZUpTT04pO1xuICAgICAgICAgICAgICAgIHJvb3Quc2VsZWN0ZWRVcGxvYWRGaWxlVG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgYWpheEVycm9yRmllbGRIYW5kbGVyKGRhdGEucmVzcG9uc2VKU09OLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgIH1cblxuXG4gICAgdGhpcy5yZXNldEF0dGFjaG1lbnRUYWJsZT1mdW5jdGlvbiAoKXtcbiAgICAgICAgJCgnLmF0dGFjaG1lbnRUYWJsZSB0Ym9keSB0cicpLnJlbW92ZSgpO1xuICAgICAgICByb290LnJlbmRlckF0dGFjaG1lbnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhY3REZWxldGVDbGljaz1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICBsZXQgcm93PSQodGhpcykuY2xvc2VzdCgndHInKTtcbiAgICAgICAgbGV0IGlkPXJvdy5maW5kKCdpbnB1dFtuYW1lPWNvbnRhY3RJZF0nKS52YWwoKTtcbiAgICAgICAgcm9vdC5TdXBwbGllci5jb250YWN0PXJvb3QuU3VwcGxpZXIuY29udGFjdC5maWx0ZXIoXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUsaW5kZXgsYXJyKXtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaWQhPT1pZCoxKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJvdy5yZW1vdmUoKTtcbiAgICAgICAgcm9vdC5yZXNldENvbnRhY3RUYWJsZSgpO1xuICAgIH1cbiAgICByb290LmdldENvbnRhY3RQb3B1cFdvcmtmbG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY29udGFjdFBvcHVwV29ya2Zsb3c7XG4gICAgfVxuICAgIHJvb3Quc2V0Q29udGFjdFBvcHVwV29ya2Zsb3cgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGNvbnRhY3RQb3B1cFdvcmtmbG93PXN0YXR1cztcbiAgICB9XG5cblxuICAgIHRoaXMuY29udGFjdEVkaXRDbGljaz1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMpO1xuICAgICAgICBsZXQgcm93PSQodGhpcykuY2xvc2VzdCgndHInKTtcbiAgICAgICAgbGV0IGlkPXJvdy5maW5kKCdpbnB1dFtuYW1lPWNvbnRhY3RJZF0nKS52YWwoKTtcbiAgICAgICAgcm9vdC5zZXRDb250YWN0UG9wdXBXb3JrZmxvdygnZWRpdCcpO1xuICAgICAgICBBUFAuQ29udGFjdFBvcFVwLmxvYWREYXRhKGlkKTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFN1cHBsaWVyPWZ1bmN0aW9uICgpe1xuICAgICAgICByZXR1cm4gcm9vdC5TdXBwbGllcjtcbiAgICB9XG4gICAgdGhpcy5jb250YWN0QWN0aW9uPWZ1bmN0aW9uIChjb250YWN0RGF0YSl7XG4gICAgICAgIGNvbnNvbGUubG9nKCduYWggbW9zdCBrZWxsZW5lIG1lZyB2YWxhbWl0IGNzaW5hbG5pLicpXG4gICAgICAgIGlmKHJvb3QuZ2V0Q29udGFjdFBvcHVwV29ya2Zsb3coKT09J25ldycpe1xuICAgICAgICAgICAgcm9vdC5hZGRDb250YWN0KGNvbnRhY3REYXRhKTtcbiAgICAgICAgfWVsc2UgaWYocm9vdC5nZXRDb250YWN0UG9wdXBXb3JrZmxvdygpPT0nZWRpdCcpe1xuICAgICAgICAgICAgcm9vdC5lZGl0Q29udGFjdChjb250YWN0RGF0YS5pZCxjb250YWN0RGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVkaXRDb250YWN0PWZ1bmN0aW9uIChpZCxjb250YWN0RGF0YSl7XG5cbiAgICAgICAgbGV0IG5ld0NvbnRhY3RzPVtdO1xuICAgICAgICAkLmVhY2gocm9vdC5TdXBwbGllci5nZXREYXRhKCdjb250YWN0JyksZnVuY3Rpb24gKGluZGV4KXtcbiAgICAgICAgICAgIGlmKHRoaXMuaWQ9PWlkKXtcbiAgICAgICAgICAgICAgICBuZXdDb250YWN0cy5wdXNoKGNvbnRhY3REYXRhKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIG5ld0NvbnRhY3RzLnB1c2godGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByb290LlN1cHBsaWVyLmNvbnRhY3Q9bmV3Q29udGFjdHM7XG4gICAgICAgIHJvb3QucmVzZXRDb250YWN0VGFibGUoKTtcbiAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiS2FwY3NvbGF0IGFkYXRhaSBtw7Nkb3PDrXR2YSFcIiwgbWVzc2FnZTogY29udGFjdERhdGEubmFtZStcIiBuZXbFsSBrYXBjc29sYXR0YXJ0w7MgbcOzZG9zw610dmFcIiwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuU1VDQ0VTUywgdGltZW91dDogNTAwMCB9KTtcbiAgICB9XG4gICAgdGhpcy5hZGRDb250YWN0PWZ1bmN0aW9uIChjb250YWN0RGF0YSl7XG4gICAgICAgIC8qXG4gICAgICAgIGZlbCBrZWxsIHZlbm5pIGEgc29yYmFcbiAgICAgICAgICovXG4gICAgICAgIHJvb3QuU3VwcGxpZXIuY29udGFjdC5wdXNoKGNvbnRhY3REYXRhKTtcbiAgICAgICAgY29udGFjdERhdGEucm93TnVtPXJvb3QuU3VwcGxpZXIuY29udGFjdC5sZW5ndGg7XG4gICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllckNvbnRhY3RUYWJsZVJvd1wiXScpLmh0bWwoKVxuICAgICAgICBsZXQgcmVuZGVyPU11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSxjb250YWN0RGF0YSk7XG4gICAgICAgICQoJy5jb250YWN0VGFibGUgdGJvZHknKS5hcHBlbmQocmVuZGVyKTtcbiAgICAgICAgcm9vdC5iaW5kQ29udGFjdENsaWNrQWN0aW9uKCk7XG4gICAgICAgIFRvYXN0LmVuYWJsZVRpbWVycyhmYWxzZSk7XG4gICAgICAgIFRvYXN0LmNyZWF0ZSh7IHRpdGxlOiBcIkthcGNzb2xhdHRhcnTDsyBob3p6w6FhZHZhIVwiLCBtZXNzYWdlOiBjb250YWN0RGF0YS5uYW1lK1wiIG5ldsWxIGthcGNzb2xhdHRhcnTDsyBob3p6w6FhZHZhXCIsIHN0YXR1czogVE9BU1RfU1RBVFVTLlNVQ0NFU1MsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgfVxuXG5cbiAgICB0aGlzLnJlc2V0VXNlclRhYmxlPWZ1bmN0aW9uICgpe1xuICAgICAgICAkKCcuc3VwcGxpZXJVc2VyVGFibGUgdGJvZHkgdHInKS5yZW1vdmUoKTtcbiAgICAgICAgcm9vdC5yZW5kZXJVc2VycygpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlclVzZXJzPWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgcm93TnVtPTE7XG4gICAgICAgIGxldCB1c2Vycz1yb290LlN1cHBsaWVyLnVzZXJzfHxbXTtcbiAgICAgICAgJC5lYWNoKHVzZXJzLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgbGV0IHVzZXJEYXRhPSQuZXh0ZW5kKHt9LHRoaXMpO1xuICAgICAgICAgICAgdXNlckRhdGEucm93TnVtPXJvd051bTtcbiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllclVzZXJUYWJsZVJvd1wiXScpLmh0bWwoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXI9TXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLHVzZXJEYXRhKTtcbiAgICAgICAgICAgICQoJy5zdXBwbGllclVzZXJUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICAgICAgcm93TnVtKys7XG4gICAgICAgIH0pO1xuICAgICAgICByb290LmJpbmRVc2VyQ2xpY2tBY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kVXNlckNsaWNrQWN0aW9uPWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgbm9kZT0kKCcuc3VwcGxpZXJVc2VyVGFibGUgLmJ1dHRvbkRlbGV0ZScpO1xuICAgICAgICBub2RlLnVuYmluZCgnY2xpY2snKTtcbiAgICAgICAgbm9kZS5iaW5kKCdjbGljaycscm9vdC51c2VyRGVsZXRlQ2xpY2spO1xuICAgIH1cbiAgICB0aGlzLnVzZXJEZWxldGVDbGljaz1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IHJvdz0kKHRoaXMpLmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgIGxldCBpZD1yb3cuZmluZCgnaW5wdXRbbmFtZT11c2VySWRdJykudmFsKCkqMTtcbiAgICAgICAgcm9vdC5TdXBwbGllci51c2Vycz1yb290LlN1cHBsaWVyLnVzZXJzLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpe1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmlkIT09aWQ7XG4gICAgICAgIH0pO1xuICAgICAgICByb3cucmVtb3ZlKCk7XG4gICAgICAgIHJvb3QucmVzZXRVc2VyVGFibGUoKTtcbiAgICB9XG4gICAgdGhpcy5hZGRVc2VyPWZ1bmN0aW9uICh1c2VyRGF0YSl7XG4gICAgICAgIGlmKCFyb290LlN1cHBsaWVyLnVzZXJzKXsgcm9vdC5TdXBwbGllci51c2Vycz1bXTsgfVxuICAgICAgICBsZXQgYWxyZWFkeUFkZGVkPXJvb3QuU3VwcGxpZXIudXNlcnMuc29tZShmdW5jdGlvbih1KXsgcmV0dXJuIHUuaWQ9PT11c2VyRGF0YS5pZDsgfSk7XG4gICAgICAgIGlmKGFscmVhZHlBZGRlZCl7IHJldHVybjsgfVxuICAgICAgICByb290LlN1cHBsaWVyLnVzZXJzLnB1c2godXNlckRhdGEpO1xuICAgICAgICB1c2VyRGF0YS5yb3dOdW09cm9vdC5TdXBwbGllci51c2Vycy5sZW5ndGg7XG4gICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllclVzZXJUYWJsZVJvd1wiXScpLmh0bWwoKTtcbiAgICAgICAgbGV0IHJlbmRlcj1NdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsdXNlckRhdGEpO1xuICAgICAgICAkKCcuc3VwcGxpZXJVc2VyVGFibGUgdGJvZHknKS5hcHBlbmQocmVuZGVyKTtcbiAgICAgICAgcm9vdC5iaW5kVXNlckNsaWNrQWN0aW9uKCk7XG4gICAgICAgIFRvYXN0LmVuYWJsZVRpbWVycyhmYWxzZSk7XG4gICAgICAgIFRvYXN0LmNyZWF0ZSh7IHRpdGxlOiAnRmVsaGFzem7DoWzDsyBob3p6w6FhZHZhIScsIG1lc3NhZ2U6IHVzZXJEYXRhLm5hbWUrJyBob3p6w6FyZW5kZWx2ZScsIHN0YXR1czogVE9BU1RfU1RBVFVTLlNVQ0NFU1MsIHRpbWVvdXQ6IDMwMDAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdFVzZXJDcmVhdGU9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBjcmVhdGVVcmw9T3B0cy5VUkwuY3JlYXRlVXNlcnx8Jyc7XG4gICAgICAgIGxldCBjb250YWluZXI9JChPcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKTtcbiAgICAgICAgZnVuY3Rpb24gY2xlYXJGb3JtKCl7XG4gICAgICAgICAgICBjb250YWluZXIuZmluZCgnLnN1cHBsaWVyTmV3VXNlck5hbWUnKS52YWwoJycpO1xuICAgICAgICAgICAgY29udGFpbmVyLmZpbmQoJy5zdXBwbGllck5ld1VzZXJFbWFpbCcpLnZhbCgnJyk7XG4gICAgICAgICAgICBjb250YWluZXIuZmluZCgnLnN1cHBsaWVyTmV3VXNlclBhc3N3b3JkJykudmFsKCcnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyRXJyb3InKS5oaWRlKCkudGV4dCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyLmZpbmQoJy5idXR0b25DcmVhdGVVc2VyJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxldCBuYW1lPWNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyTmFtZScpLnZhbCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCBlbWFpbD1jb250YWluZXIuZmluZCgnLnN1cHBsaWVyTmV3VXNlckVtYWlsJykudmFsKCkudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHBhc3N3b3JkPWNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyUGFzc3dvcmQnKS52YWwoKTtcbiAgICAgICAgICAgIGxldCBlcnJvckVsPWNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyRXJyb3InKTtcbiAgICAgICAgICAgIGVycm9yRWwuaGlkZSgpLnRleHQoJycpO1xuICAgICAgICAgICAgaWYoIW5hbWV8fCFlbWFpbHx8IXBhc3N3b3JkKXtcbiAgICAgICAgICAgICAgICBlcnJvckVsLnRleHQoJ01pbmRlbiBtZXrFkSBraXTDtmx0w6lzZSBrw7Z0ZWxlesWRIScpLnNob3coKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDpjcmVhdGVVcmwsXG4gICAgICAgICAgICAgICAgdHlwZTonUE9TVCcsXG4gICAgICAgICAgICAgICAgZGF0YTp7bmFtZTpuYW1lLCBlbWFpbDplbWFpbCwgcGFzc3dvcmQ6cGFzc3dvcmR9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6eydYLUNTUkYtVE9LRU4nOiAkKCdpbnB1dFtuYW1lPVwiX3Rva2VuXCJdJykudmFsKCl9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LmFkZFVzZXIoZGF0YS51c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRWwudGV4dCgnSGliYSB0w7ZydMOpbnQgYSBmZWxoYXN6bsOhbMOzIGzDqXRyZWhvesOhc2Frb3IhJykuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjpmdW5jdGlvbih4aHIpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbXNnPSdIaWJhIHTDtnJ0w6ludCEnO1xuICAgICAgICAgICAgICAgICAgICBpZih4aHIucmVzcG9uc2VKU09OJiZ4aHIucmVzcG9uc2VKU09OLmVycm9ycyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JzPXhoci5yZXNwb25zZUpTT04uZXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0S2V5PU9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyb3JzW2ZpcnN0S2V5XVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlcnJvckVsLnRleHQobXNnKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnN0cnVjdChvcHRpb25zLFN1cHBsaWVySXRlbSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBRyxPQUFPQSxRQUFRLEtBQUcsV0FBVyxFQUFDO0VBQUEsSUFDdkJBLFNBQVEsMEJBQUFDLFVBQUE7SUFFVjtBQUNSO0FBQ0E7SUFDUSxTQUFBQyxVQUFhQyxJQUFJLEVBQUNDLE9BQU8sRUFBRTtNQUFBLElBQUFDLEtBQUE7TUFBQUMsZUFBQSxPQUFBSixTQUFBO01BQ3ZCRyxLQUFBLEdBQUFF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QUUsQ0FBQ0MsUUFBUSxFQUFDO1FBQ3hCQyxPQUFPLENBQUNySCxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQ3BILElBQUksQ0FBQyxDQUFDO1FBQ3REO01BQ0o7TUFDQWUsQ0FBQyxDQUFDaUQsSUFBSSxDQUFDO1FBQ0hDLEdBQUcsRUFBQ21LLFNBQVM7UUFDYmxLLElBQUksRUFBQyxNQUFNO1FBQ1g1RixJQUFJLEVBQUM7VUFBQzRHLElBQUksRUFBQ0EsSUFBSTtVQUFFcUosS0FBSyxFQUFDQSxLQUFLO1VBQUVDLFFBQVEsRUFBQ0E7UUFBUSxDQUFDO1FBQ2hEbkssT0FBTyxFQUFDO1VBQUMsY0FBYyxFQUFFdEQsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMwQixHQUFHLENBQUM7UUFBQyxDQUFDO1FBQ3pENkIsT0FBTyxFQUFDLFNBQVJBLE9BQU9BLENBQVVoRyxJQUFJLEVBQUM7VUFDbEIsSUFBR0EsSUFBSSxDQUFDZ0csT0FBTyxFQUFDO1lBQ1oxRCxJQUFJLENBQUNvTixPQUFPLENBQUMxUCxJQUFJLENBQUNvUSxJQUFJLENBQUM7WUFDdkJKLFNBQVMsQ0FBQyxDQUFDO1VBQ2YsQ0FBQyxNQUFJO1lBQ0RHLE9BQU8sQ0FBQ3JILElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDcEgsSUFBSSxDQUFDLENBQUM7VUFDckU7UUFDSixDQUFDO1FBQ0R1SSxLQUFLLEVBQUMsU0FBTkEsS0FBS0EsQ0FBVW9HLEdBQUcsRUFBQztVQUNmLElBQUlDLEdBQUcsR0FBQyxlQUFlO1VBQ3ZCLElBQUdELEdBQUcsQ0FBQ25HLFlBQVksSUFBRW1HLEdBQUcsQ0FBQ25HLFlBQVksQ0FBQ3FHLE1BQU0sRUFBQztZQUN6QyxJQUFJQSxNQUFNLEdBQUNGLEdBQUcsQ0FBQ25HLFlBQVksQ0FBQ3FHLE1BQU07WUFDbEMsSUFBSUMsUUFBUSxHQUFDQyxNQUFNLENBQUNDLElBQUksQ0FBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DRCxHQUFHLEdBQUNDLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQzNCO1VBQ0FMLE9BQU8sQ0FBQ3JILElBQUksQ0FBQ3dILEdBQUcsQ0FBQyxDQUFDNU8sSUFBSSxDQUFDLENBQUM7UUFDNUI7TUFDSixDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7RUFDTixDQUFDO0VBQ0QsSUFBSSxDQUFDYyxTQUFTLENBQUN2QyxPQUFPLEVBQUNpQixZQUFZLENBQUM7QUFDeEMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./resources/js/admin/supplier.js\n\n}"); +eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nif (typeof Supplier === 'undefined') {\n var _Supplier = /*#__PURE__*/function (_DataModel) {\n /*\n * Constructor\n */\n function _Supplier(data, options) {\n var _this;\n _classCallCheck(this, _Supplier);\n _this = _callSuper(this, _Supplier, [data, options]);\n if (typeof _this.contact === \"undefined\") {\n _this.contact = [];\n }\n if (typeof _this.canSee === \"undefined\") {\n _this.canSee = 1;\n }\n if (typeof _this.canSeeInOrder === \"undefined\") {\n _this.canSeeInOrder = 1;\n }\n if (typeof _this.hasDeliveryConstraint === \"undefined\") {\n _this.hasDeliveryConstraint = 0;\n }\n if (typeof _this.orderCutOffTime === \"undefined\") {\n _this.orderCutOffTime = 12;\n }\n if (typeof _this.deliveryLeadTime === \"undefined\") {\n _this.deliveryLeadTime = 48;\n }\n console.log('Supplier constructor called');\n return _this;\n }\n _inherits(_Supplier, _DataModel);\n return _createClass(_Supplier);\n }(DataModel);\n ;\n window.Supplier = _Supplier;\n}\nwindow.SupplierAdmin = function (options, SupplierItem) {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n token: null,\n containerCssSelector: '.containerSupplier',\n testMode: false,\n URL: {\n getDataTableContent: '',\n index: '',\n show: '',\n edit: '',\n create: '',\n store: '',\n update: '',\n destroy: '',\n attachFile: '',\n detachFile: '',\n createUser: ''\n },\n dataTable: {\n orderDirective: [1, 'asc']\n },\n onAfterInitViewDetails: function onAfterInitViewDetails() {}\n };\n var Supplier = {};\n var root = this;\n var contactPopupWorkflow = 'new';\n /*\n * Constructor\n */\n this.construct = function (options, SupplierItem) {\n console.log('SupplierAdmin constructor called');\n $.extend(Opts, options);\n if (!SupplierItem) {\n console.log('supplier letre kellet hozni ');\n if (!APP.Supplier) {\n APP.Supplier = new window.Supplier();\n }\n root.Supplier = APP.Supplier;\n }\n };\n this.getOpts = function () {\n return Opts;\n };\n this.formDataToDataObjectAPICallOld = function (CSSSelector) {\n var data = new FormData(document.querySelector(CSSSelector));\n //let formJSON = Object.fromEntries(data.entries());\n var formJSON = {};\n data.forEach(function (value, key) {\n // Reflect.has in favor of: formJSON.hasOwnProperty(key)\n if (!Reflect.has(formJSON, key)) {\n formJSON[key] = value;\n return;\n }\n if (!Array.isArray(formJSON[key])) {\n formJSON[key] = [formJSON[key]];\n }\n formJSON[key].push(value);\n });\n $(CSSSelector + ' input[data-inputmask]').each(function () {\n if (formJSON[$(this).attr('name')]) {\n formJSON[$(this).attr('name')] = formJSON[$(this).attr('name')].replace(/[_ ]+$/g, \"\");\n }\n });\n //formJSON.productGroups=$(\".productCategorySelect\").select2().val();\n\n /*Multiselect or checkbox to array:\n ajaxData['productGroup']=$(\".productCategorySelect\").select2().val();\n formJSON.multiselectName = data.getAll('multiselectName');\n $.each(formJSON, function (item, value) {\n formJSON[$.lcFirst(item.replace('contact', ''))] = value;\n delete formJSON[item];\n });\n if(formJSON.phone){\n formJSON.phone=formJSON.phone.replaceAll('_','');\n }\n if(formJSON.email){\n formJSON.email=formJSON.email.replaceAll('_','');\n }\n */\n return formJSON;\n };\n this.formDataToDataObjectAPICall = function (CSSSelectorForm) {\n var ajaxData = new FormData($(CSSSelectorForm)[0]);\n $.each(ajaxData.getAll('profitCenter'), function (key, value) {\n ajaxData.append('profitCenter[]', value);\n });\n $.each(ajaxData.getAll('productGroup'), function (key, value) {\n ajaxData.append('productGroup[]', value);\n });\n $.each(ajaxData.getAll('supplierService'), function (key, value) {\n ajaxData.append('supplierService[]', value);\n });\n $.each(ajaxData.getAll('contactId'), function (key, value) {\n ajaxData.append('contactId[]', value);\n });\n ajaxData.append('_token', $('input[name=_token]').val());\n $(CSSSelectorForm + ' input[data-inputmask]').each(function () {\n var indexKey = $(this).attr('name');\n if (ajaxData.get(indexKey)) {\n ajaxData.set(indexKey, ajaxData.get(indexKey).replace(/[_ ]+$/g, \"\"));\n }\n });\n return ajaxData;\n };\n this.clickSaveButton = function (event) {\n debug('Save clicked');\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n event.preventDefault();\n if ($(CSSSelectorForm + ' input[name=\"canSeeInOrder\"]').val() == 1 && $(CSSSelectorForm)[0].checkValidity() === false) {\n console.log('validaton false');\n $(CSSSelectorForm).addClass('was-validated');\n $(CSSSelectorForm)[0].reportValidity();\n Toast.create({\n title: \"Validációs hiba!\",\n message: \"Kérjük, töltse ki a kötelező mezőket!\",\n status: TOAST_STATUS.DANGER,\n timeout: 5000\n });\n event.stopPropagation();\n return;\n } else {\n console.log('validaton ok');\n $(CSSSelectorForm).removeClass('was-validated');\n //do your ajax submition here\n }\n var ajaxData = root.formDataToDataObjectAPICall(CSSSelectorForm);\n var ajaxUrl = Opts.URL.store;\n var ajaxMethod = \"POST\";\n if (root.Supplier.id) {\n ajaxUrl = Opts.URL.update.replace('%id%', root.Supplier.id);\n //ajaxMethod=\"PUT\";\n //ajaxData=new FormData($(CSSSelectorForm)[0]);\n ajaxData.append('_method', 'PUT');\n }\n debug(ajaxMethod);\n debug(ajaxData);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n type: ajaxMethod,\n contentType: false,\n processData: false,\n headers: {\n 'X-CSRF-TOKEN': $('input[name=\"_token\"]').val()\n },\n success: function success(data) {\n debug('d1: Save success ');\n debug(data);\n if (data.success == true) {\n //Opts.onAfterInitViewDetails=root.autofillDetails;\n Opts.dataTable.orderDirective = [0, 'desc'];\n Toast.create({\n title: \"Sikeres rögzítés!\",\n message: ajaxData.get('name') + \" nevű beszálllító elmentve\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n APP.loadMainContent(Opts.URL.index + '?init=0', root.initViewList);\n }\n }\n });\n };\n this.setDetailsViewData = function () {\n debug('setDetailsViewData');\n console.log(Supplier);\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n var needToSet = ['name', 'hooreycaId', 'nameId', 'orderEmail', 'orderEmail2', 'address', 'mailingAddress', 'phone', 'fax', 'customerServicePhone', 'name22', 'openHours', 'ordersDeadline', 'minOrderValue'];\n $.each(needToSet, function () {\n if (typeof root.Supplier[this] != 'undefined') {\n $(CSSSelectorForm + ' input[name=' + this + ']').val(root.Supplier[this]);\n $(CSSSelectorForm + ' textarea[name=' + this + ']').val(root.Supplier[this]);\n }\n });\n if (typeof root.Supplier['note'] != 'undefined') {\n $(CSSSelectorForm + ' textarea[name=note]').val(root.Supplier.note);\n }\n if (typeof root.Supplier['emailAttachmentType'] != 'undefined') {\n $(CSSSelectorForm + ' input[name=emailAttachmentType][value=' + root.Supplier['emailAttachmentType'] + ']').prop('checked', true);\n }\n $(CSSSelectorForm + ' *[data-toggle=canSee][data-title=' + root.Supplier.canSee + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=canSeeInOrder][data-title=' + root.Supplier.canSeeInOrder + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=hooreycaDataActive][data-title=' + root.Supplier.hooreycaDataActive + ']').click();\n $(CSSSelectorForm + ' *[data-toggle=hasDeliveryConstraint][data-title=' + root.Supplier.hasDeliveryConstraint + ']').click();\n $(CSSSelectorForm + ' input[name=orderCutOffTime]').val(root.Supplier.orderCutOffTime);\n $(CSSSelectorForm + ' select[name=deliveryLeadTime]').val(root.Supplier.deliveryLeadTime);\n var productGroup = [];\n $.each(root.Supplier.product_group, function () {\n productGroup.push(this.name);\n });\n $(CSSSelectorForm + ' .productCategorySelect').val(productGroup).change();\n var service = [];\n $.each(root.Supplier.service, function () {\n service.push(this.name);\n });\n $(CSSSelectorForm + ' .serviceSelect').val(service).change();\n var profitCenter = [];\n $.each(root.Supplier.profit_center, function () {\n profitCenter.push(this.name);\n });\n //$(CSSSelectorForm+' .profitCenterSelect').val(profitCenter).change();\n //debug(profitCenter);\n $.each(profitCenter, function () {\n $('input[value=\"' + $.escapeSelector(this) + '\"]').prop(\"checked\", true);\n });\n if (typeof root.Supplier['logoFile'] != 'undefined' && root.Supplier['logoFile']) {\n $(CSSSelectorForm + ' img.imageLogo').attr('src', root.Supplier['logoFile']);\n }\n if (typeof root.Supplier.users !== 'undefined') {\n root.resetUserTable();\n }\n\n //debug(APP.SupplierAdmin.formDataToDataObjectAPICall('.supplierForm')['productGroup']);\n //$('[name=productGroup]').val(['Büféáru_édesipari_termékek','Tojás']).change();\n //root.setDetailsViewData();\n };\n this.initViewDetails = function (options, SupplierItem) {\n debug('**call initViewDetails ');\n if (!APP.ContactPopUp) {\n console.log('nincs APP.ContactPopUp');\n APP.ContactPopUp = new window.ContactPopUp();\n } else {\n console.log('mar van APP.ContactPopUp');\n }\n APP.ContactPopUp.init({\n active: true,\n onAfterSave: root.contactAction\n });\n root.renderContact();\n $('.supplierForm .buttonNewContact').bind('click', function () {\n APP.SupplierAdmin.setContactPopupWorkflow('new');\n APP.ContactPopUp.clearData();\n APP.ContactPopUp.show();\n });\n $('[data-toggle=\"tooltip\"]').tooltip();\n initRadioButtons();\n $(\":input\").inputmask({\n \"onincomplete\": function onincomplete() {\n console.log($(this).data('required'));\n if ($(this).val().length > 0 || $(this).data('required') === true) {\n $(this).addClass('is-invalid');\n }\n },\n \"oncomplete\": function oncomplete() {\n $(this).removeClass('is-invalid');\n $(this).addClass('is-valid');\n },\n \"oncleared\": function oncleared() {\n console.log('cleared');\n $(this).removeClass('is-invalid');\n }\n });\n $('form.supplierForm button.FormSaveButton').off('click');\n $('form.supplierForm button.FormSaveButton').on('click', root.clickSaveButton);\n root.setDetailsViewData();\n root.initUserCreate();\n $(\".productCategorySelect\").select2();\n $(\".serviceSelect\").select2({\n tags: true,\n createTag: function createTag(params) {\n var term = $.trim(params.term);\n if (term === '') {\n return null;\n }\n return {\n id: term,\n text: term,\n newTag: true // add additional parameters\n };\n }\n });\n\n //$(\".profitCenterSelect\").select2();\n $(\"input[name=logoFile]\").change(function () {\n setImageFromLocal(this, Opts.containerCssSelector + ' .imageLogo');\n });\n $('form.supplierForm .profitCenterSelectCheckboxAll').off('click');\n $('form.supplierForm .profitCenterSelectCheckboxAll').on('click', function () {\n //console.log();\n //let checked=$(this).is(\":checked\")\n $('form.supplierForm input.profitCenterSelectCheckbox').prop('checked', $(this).is(\":checked\"));\n });\n root.renderAttachment();\n //Opts.onAfterInitViewDetails();\n root.initFileAttachmentFeature();\n root.initDeliveryConstraintToggle();\n debug('**end initViewDetails ');\n };\n this.initDeliveryConstraintToggle = function () {\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n var toggleDeliveryFields = function toggleDeliveryFields() {\n var val = $(CSSSelectorForm + ' input[name=\"hasDeliveryConstraint\"]').val();\n if (val == 1) {\n $(CSSSelectorForm + ' .deliveryConstraintFields').show();\n } else {\n $(CSSSelectorForm + ' .deliveryConstraintFields').hide();\n }\n };\n $(CSSSelectorForm + ' a[data-toggle=\"hasDeliveryConstraint\"]').off('click.deliveryConstraint');\n $(CSSSelectorForm + ' a[data-toggle=\"hasDeliveryConstraint\"]').on('click.deliveryConstraint', function () {\n setTimeout(toggleDeliveryFields, 0);\n });\n toggleDeliveryFields();\n };\n this.selectedUploadFileToggle = function (fileInput) {\n /*\n console.log(fileInput.attr('name'));\n console.log(fileInput[0].files[0]);\n console.log(fileInput[0].files[0].name);\n */\n if (fileInput) {\n $('.containerFileUpload').addClass('d-none');\n if (fileInput[0].files[0]) {\n $('.containerUploadedFileName').text(fileInput[0].files[0].name);\n }\n $('.containerFileUploadStarted').removeClass('d-none');\n $('.containerUploadedSpinner').removeClass('d-none');\n } else {\n $('.containerUploadedFileName').text('');\n $('.custom-file-label.selected').text('');\n $('.containerFileUploadStarted').addClass('d-none');\n $('.uploadStatusRow').addClass('d-none');\n $('.containerFileUpload').removeClass('d-none');\n }\n };\n this.initFileAttachmentFeature = function () {\n console.log('-------initFileAttachmentFeature-----------');\n if (root.Supplier.id) {\n $('.containerFileUpload').removeClass('d-none');\n $('.containerFileUploadNone').addClass('d-none');\n }\n $(Opts.containerCssSelector + ' .buttonUpload').off('click');\n $(Opts.containerCssSelector + ' .buttonUpload').on('click', function () {\n console.group('-------buttonUpload-----------');\n var fileInput = $('#inputGroupAttacheFile');\n if (fileInput[0].files.length < 1) {\n Toast.create({\n title: \"Hiba!\",\n message: 'Vállaszon ki fájlt!',\n status: TOAST_STATUS.DANGER,\n timeout: 10000\n });\n return;\n }\n console.log($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n var data = new FormData($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n data.append(fileInput.attr('name'), fileInput[0].files[0]);\n root.selectedUploadFileToggle(fileInput);\n var ajaxUrl = Opts.URL.attachFile.replace('%id%', root.Supplier.id);\n console.groupEnd();\n $.ajax({\n url: ajaxUrl,\n data: data,\n type: 'POST',\n contentType: false,\n processData: false,\n beforeSend: function beforeSend() {},\n success: function success(data) {\n console.log(data);\n if (data.success == true) {\n root.addAttachment(data.data.attachment);\n root.selectedUploadFileToggle();\n }\n },\n error: function error(data) {\n console.log(data.responseJSON);\n root.selectedUploadFileToggle();\n ajaxErrorFieldHandler(data.responseJSON.error);\n }\n });\n });\n };\n this.clickNew = function () {\n debug('clickNew');\n APP.loadMainContent(Opts.URL.create, root.clickNewCallBack);\n };\n this.clickNewCallBack = function () {\n debug('callbackNew');\n root.Supplier = new window.Supplier();\n root.initViewDetails();\n };\n this.datatableRowActionEdit = function (rowData, node) {\n console.log('datatableRowActionEdit Called');\n //Opts.onAfterInitViewDetails=root.autofillDetails;\n var ajaxUrl = Opts.URL.edit.replace('%id%', rowData.id);\n APP.loadMainContent(ajaxUrl, root.initViewDetails);\n console.log('datatableRowActionEdit End');\n };\n this.clickOrderDeleteConfirmed = function (event) {\n debug('clickSupplierDeleteConfirmed');\n debug(event);\n debug(event.data);\n $('#dialogModal').modal('hide');\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var ajaxUrl = Opts.URL.destroy.replace('%id%', event.data.id);\n ajaxData._token = $('input[name=_token]').val();\n console.log(ajaxUrl);\n console.log(ajaxData);\n var row = $(dataTableCSSSelector).DataTable().row(root.dadatatableRowActionCallerNode.parents('tr'));\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n method: \"DELETE\",\n success: function success(data) {\n if (data.success == true) {\n row.remove().draw();\n root.dadatatableRowActionCallerNode = false;\n }\n }\n });\n };\n var datatableRowActionCallerNode = false;\n this.datatableRowActionDelete = function (rowData, node) {\n console.log('datatableRowActionDelete Called');\n root.dadatatableRowActionCallerNode = node;\n $('#dialogModal').on('show.bs.modal', function (event) {\n // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).\n // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.\n var modal = $(this);\n modal.find('.modal-title').text('Megerősítés ');\n modal.find('.modal-body').text('Biztosan törli a beszállítót?');\n modal.find('.buttonYes').off('click');\n modal.find('.buttonYes').on('click', {\n id: rowData.id\n }, root.clickOrderDeleteConfirmed);\n });\n $('#dialogModal').modal('show');\n };\n this.datatableRowActionButtonClick = function (event) {\n debug('datatableRowActionButtonClick');\n var node = $(event[0].currentTarget);\n var row = $(dataTableCSSSelector).DataTable().row(node.parents('tr'));\n var rowData = row.data();\n var actionName = 'datatableRowAction' + node.data('buttontype').capitalize();\n if (typeof root[actionName] === \"function\") {\n return root[actionName](rowData, node);\n }\n };\n this.initViewList = function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n debug('listview inicialization');\n dataTableCSSSelector = Opts.containerCssSelector + ' .dataTable'; //\n\n var colNum = $(dataTableCSSSelector + ' thead th').length; //buttons insert position need\n APP.setOpts({\n datatableActionButtonClickCallBack: root.clickNew,\n datatableRowActionButtonClickCallBack: root.datatableRowActionButtonClick\n });\n var orderDirective = Opts.dataTable.orderDirective;\n if (typeof options['orderDirective'] != 'undefined') {\n orderDirective = options['orderDirective'];\n }\n $(dataTableCSSSelector).DataTable({\n language: {\n url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/Hungarian.json'\n },\n //\"ajax\": \"{{asset('exapmle2.json')}}\",\n \"ajax\": Opts.URL.getDataTableContent,\n \"columnDefs\": [{\n \"targets\": colNum - 1,\n \"render\": function render(data, type, row) {\n var buttons = APP.datatableAddRowTrashButton(0, arguments);\n buttons += APP.datatableAddRowEditButton(0, arguments);\n return buttons;\n }\n }, {\n \"targets\": 1,\n \"render\": function render(data, type, row) {\n return type === \"sort\" ? data.latinise() : data;\n }\n }\n //{ \"visible\": false, \"targets\": [ 0 ] }\n ],\n buttons: {\n buttons: ['excel', 'pdf', {\n extend: 'print',\n //text: 'Print current page',\n 'title': 'title custom text',\n 'messageTop': 'Message On Top',\n autoPrint: true\n }, /**/\n\n {\n text: 'Új felvitele',\n className: 'btn btn-success newItem',\n attr: {\n /*\n data:{\n a:1,\n b:2\n }\n */\n 'data': 'newItem'\n },\n init: function init(api, node, config) {\n $(node).removeClass('ui-button');\n },\n action: function action(e, dt, node, config) {\n APP.datatableActionButtonClickCallBack(arguments);\n /* console.log(e);\n console.log(dt);\n console.log(node);\n console.log(config);*/\n }\n }]\n },\n \"columns\": [{\n \"data\": \"id\"\n }, {\n \"data\": \"name\"\n }, {\n \"data\": \"hooreycaId\"\n }, {\n \"data\": \"nameId\"\n }, {\n \"data\": \"created_at\"\n }, null],\n \"order\": orderDirective,\n \"stateSave\": true,\n \"drawCallback\": function drawCallback(settings) {\n APP.datatableAddRowAction(dataTableCSSSelector);\n }\n });\n debug('listview end');\n };\n this.autofillDetails = function () {\n debug('nyeresre allunk');\n var randomNumber = getRandomInt(9999);\n $('input[name=name]').val('Beszalító' + randomNumber);\n $('input[name=hooreycaId]').val('hb' + randomNumber);\n $('input[name=nameId]').val('be' + randomNumber);\n $('input[name=orderEmail]').val('kapcsolat' + randomNumber + '@beszallito.hu');\n $('input[name=orderEmail2]').val('informacio' + randomNumber + '@beszallito.hu');\n $('input[name=address]').val('8989 Supplier utca ' + randomNumber);\n $('input[name=mailingAddress]').val('8989 Postai út' + randomNumber);\n $('input[name=phone]').val('+36301234567');\n $('input[name=fax]').val('36308889999');\n $('input[name=customerServicePhone]').val('+36761234444');\n $('textarea[name=note]').val('Megjegyzem ' + randomNumber);\n };\n this.testMode = function () {\n console.debug('!!!!testmode !!!!');\n root.Supplier = new window.Supplier({\n 'contact': [{\n id: 2\n }, {\n id: 3\n }\n /*\n {\n id:3,\n name:'Kósa Veronika',\n email:'szamlazas4@funkcio.hu',\n phone:'{{formatterPhoneNumber(\"+36204589180\")}}'\n }\n */]\n });\n Opts.onAfterInitViewDetails = root.autofillDetails;\n APP.loadMainContent(Opts.URL.create, root.initViewDetails);\n };\n this.init = function (options, SupplierItem) {\n $.extend(Opts, options);\n if (Opts.testMode) {\n return root.testMode();\n }\n if (SupplierItem) {\n root.Supplier = SupplierItem;\n }\n root.initViewList();\n };\n this.renderAttachment = function () {\n var rowNum = 1;\n console.log('renderingAttachment');\n $.each(root.Supplier.getData('attachment'), function () {\n var attachmentData = this;\n attachmentData.rowNum = rowNum;\n date = new Date(attachmentData.created_at);\n attachmentData.date = date.toLocaleString();\n attachmentData.link = attachmentData.PublicUrl + '/' + attachmentData.filename;\n var template = $('template[data-name=\"supplierAttachmentTableRow\"]').html();\n var render = Mustache.render(template, attachmentData);\n $('.attachmentTable tbody').append(render);\n rowNum++;\n });\n root.bindAttachmentClickAction();\n };\n this.addAttachment = function (attachmentData) {\n console.log(attachmentData);\n var CSSSelectorForm = Opts.containerCssSelector + ' .supplierForm';\n root.Supplier.attachment.push(attachmentData);\n attachmentData.rowNum = root.Supplier.attachment.length;\n var template = $('template[data-name=\"supplierAttachmentTableRow\"]').html();\n var render = Mustache.render(template, attachmentData);\n $(CSSSelectorForm + ' .attachmentTable tbody').append(render);\n root.bindContactClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: \"Fájl hozzáadva!\",\n message: attachmentData.original_filename + \" fájl hozzáadva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.resetContactTable = function () {\n $('.contactTable tbody tr').remove();\n root.renderContact();\n };\n this.renderContact = function () {\n var rowNum = 1;\n console.log('renderingContacts');\n $.each(root.Supplier.getData('contact'), function () {\n var contactData = this;\n contactData.rowNum = rowNum;\n //console.log(contactData);\n var template = $('template[data-name=\"supplierContactTableRow\"]').html();\n var render = Mustache.render(template, contactData);\n $('.contactTable tbody').append(render);\n rowNum++;\n });\n root.bindContactClickAction();\n };\n this.bindContactClickAction = function () {\n var node = $('.contactTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.contactDeleteClick);\n node = $('.contactTable .buttonEdit');\n node.unbind('click');\n node.bind('click', root.contactEditClick);\n };\n this.bindAttachmentClickAction = function () {\n var node = $('.attachmentTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.attachmentDeleteClick);\n };\n var currentAttachmentRow = false;\n this.attachmentDeleteClick = function (event) {\n var row = $(this).closest('tr');\n var id = row.find('input[name=attachmentId]').val();\n var ajaxUrl = Opts.URL.detachFile.replace('%id%', root.Supplier.id);\n //let data= new FormData($(Opts.containerCssSelector).find('form.supplierForm')[0]);\n //data.append(fileInput.attr('name'),fileInput[0].files[0]);\n var data = {};\n data._token = $('input[name=\"_token\"]').val();\n data.attachemntId = id;\n $.ajax({\n url: ajaxUrl,\n data: data,\n type: 'POST',\n //contentType:false,\n //processData: false,\n beforeSend: function beforeSend() {},\n success: function success(data) {\n console.log(data);\n if (data.success == true) {\n root.Supplier.attachment = root.Supplier.attachment.filter(function (value, index, arr) {\n if (value.id !== data.data.attachment.id * 1) {\n return true;\n }\n return false;\n });\n /*\n */\n //row.remove();\n root.resetAttachmentTable();\n }\n },\n error: function error(data) {\n console.log(data.responseJSON);\n root.selectedUploadFileToggle();\n ajaxErrorFieldHandler(data.responseJSON.error);\n }\n });\n };\n this.resetAttachmentTable = function () {\n $('.attachmentTable tbody tr').remove();\n root.renderAttachment();\n };\n this.contactDeleteClick = function (event) {\n var row = $(this).closest('tr');\n var id = row.find('input[name=contactId]').val();\n root.Supplier.contact = root.Supplier.contact.filter(function (value, index, arr) {\n if (value.id !== id * 1) {\n return true;\n }\n return false;\n });\n row.remove();\n root.resetContactTable();\n };\n root.getContactPopupWorkflow = function () {\n return contactPopupWorkflow;\n };\n root.setContactPopupWorkflow = function (status) {\n contactPopupWorkflow = status;\n };\n this.contactEditClick = function (event) {\n //console.log(this);\n var row = $(this).closest('tr');\n var id = row.find('input[name=contactId]').val();\n root.setContactPopupWorkflow('edit');\n APP.ContactPopUp.loadData(id);\n };\n this.getSupplier = function () {\n return root.Supplier;\n };\n this.contactAction = function (contactData) {\n console.log('nah most kellene meg valamit csinalni.');\n if (root.getContactPopupWorkflow() == 'new') {\n root.addContact(contactData);\n } else if (root.getContactPopupWorkflow() == 'edit') {\n root.editContact(contactData.id, contactData);\n }\n };\n this.editContact = function (id, contactData) {\n var newContacts = [];\n $.each(root.Supplier.getData('contact'), function (index) {\n if (this.id == id) {\n newContacts.push(contactData);\n } else {\n newContacts.push(this);\n }\n });\n root.Supplier.contact = newContacts;\n root.resetContactTable();\n Toast.create({\n title: \"Kapcsolat adatai módosítva!\",\n message: contactData.name + \" nevű kapcsolattartó módosítva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.addContact = function (contactData) {\n /*\n fel kell venni a sorba\n */\n root.Supplier.contact.push(contactData);\n contactData.rowNum = root.Supplier.contact.length;\n var template = $('template[data-name=\"supplierContactTableRow\"]').html();\n var render = Mustache.render(template, contactData);\n $('.contactTable tbody').append(render);\n root.bindContactClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: \"Kapcsolattartó hozzáadva!\",\n message: contactData.name + \" nevű kapcsolattartó hozzáadva\",\n status: TOAST_STATUS.SUCCESS,\n timeout: 5000\n });\n };\n this.resetUserTable = function () {\n $('.supplierUserTable tbody tr').remove();\n root.renderUsers();\n };\n this.renderUsers = function () {\n var rowNum = 1;\n var users = root.Supplier.users || [];\n $.each(users, function () {\n var userData = $.extend({}, this);\n userData.rowNum = rowNum;\n var template = $('template[data-name=\"supplierUserTableRow\"]').html();\n var render = Mustache.render(template, userData);\n $('.supplierUserTable tbody').append(render);\n rowNum++;\n });\n root.bindUserClickAction();\n };\n this.bindUserClickAction = function () {\n var node = $('.supplierUserTable .buttonDelete');\n node.unbind('click');\n node.bind('click', root.userDeleteClick);\n };\n this.userDeleteClick = function () {\n var row = $(this).closest('tr');\n var id = row.find('input[name=userId]').val() * 1;\n root.Supplier.users = root.Supplier.users.filter(function (value) {\n return value.id !== id;\n });\n row.remove();\n root.resetUserTable();\n };\n this.addUser = function (userData) {\n if (!root.Supplier.users) {\n root.Supplier.users = [];\n }\n var alreadyAdded = root.Supplier.users.some(function (u) {\n return u.id === userData.id;\n });\n if (alreadyAdded) {\n return;\n }\n root.Supplier.users.push(userData);\n userData.rowNum = root.Supplier.users.length;\n var template = $('template[data-name=\"supplierUserTableRow\"]').html();\n var render = Mustache.render(template, userData);\n $('.supplierUserTable tbody').append(render);\n root.bindUserClickAction();\n Toast.enableTimers(false);\n Toast.create({\n title: 'Felhasználó hozzáadva!',\n message: userData.name + ' hozzárendelve',\n status: TOAST_STATUS.SUCCESS,\n timeout: 3000\n });\n };\n this.initUserCreate = function () {\n var createUrl = Opts.URL.createUser || '';\n var container = $(Opts.containerCssSelector);\n function clearForm() {\n container.find('.supplierNewUserName').val('');\n container.find('.supplierNewUserEmail').val('');\n container.find('.supplierNewUserPassword').val('');\n container.find('.supplierNewUserError').hide().text('');\n }\n container.find('.buttonCreateUser').off('click').on('click', function () {\n var name = container.find('.supplierNewUserName').val().trim();\n var email = container.find('.supplierNewUserEmail').val().trim();\n var password = container.find('.supplierNewUserPassword').val();\n var errorEl = container.find('.supplierNewUserError');\n errorEl.hide().text('');\n if (!name || !email || !password) {\n errorEl.text('Minden mező kitöltése kötelező!').show();\n return;\n }\n $.ajax({\n url: createUrl,\n type: 'POST',\n data: {\n name: name,\n email: email,\n password: password\n },\n headers: {\n 'X-CSRF-TOKEN': $('input[name=\"_token\"]').val()\n },\n success: function success(data) {\n if (data.success) {\n root.addUser(data.user);\n clearForm();\n } else {\n errorEl.text('Hiba történt a felhasználó létrehozásakor!').show();\n }\n },\n error: function error(xhr) {\n var msg = 'Hiba történt!';\n if (xhr.responseJSON && xhr.responseJSON.errors) {\n var errors = xhr.responseJSON.errors;\n var firstKey = Object.keys(errors)[0];\n msg = errors[firstKey][0];\n }\n errorEl.text(msg).show();\n }\n });\n });\n };\n this.construct(options, SupplierItem);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdXBwbGllciIsIl9EYXRhTW9kZWwiLCJfU3VwcGxpZXIiLCJkYXRhIiwib3B0aW9ucyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsImNvbnRhY3QiLCJjYW5TZWUiLCJjYW5TZWVJbk9yZGVyIiwiaGFzRGVsaXZlcnlDb25zdHJhaW50Iiwib3JkZXJDdXRPZmZUaW1lIiwiZGVsaXZlcnlMZWFkVGltZSIsImNvbnNvbGUiLCJsb2ciLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJEYXRhTW9kZWwiLCJ3aW5kb3ciLCJTdXBwbGllckFkbWluIiwiU3VwcGxpZXJJdGVtIiwiT3B0cyIsInRva2VuIiwiY29udGFpbmVyQ3NzU2VsZWN0b3IiLCJ0ZXN0TW9kZSIsIlVSTCIsImdldERhdGFUYWJsZUNvbnRlbnQiLCJpbmRleCIsInNob3ciLCJlZGl0IiwiY3JlYXRlIiwic3RvcmUiLCJ1cGRhdGUiLCJkZXN0cm95IiwiYXR0YWNoRmlsZSIsImRldGFjaEZpbGUiLCJjcmVhdGVVc2VyIiwiZGF0YVRhYmxlIiwib3JkZXJEaXJlY3RpdmUiLCJvbkFmdGVySW5pdFZpZXdEZXRhaWxzIiwicm9vdCIsImNvbnRhY3RQb3B1cFdvcmtmbG93IiwiY29uc3RydWN0IiwiJCIsImV4dGVuZCIsIkFQUCIsImdldE9wdHMiLCJmb3JtRGF0YVRvRGF0YU9iamVjdEFQSUNhbGxPbGQiLCJDU1NTZWxlY3RvciIsIkZvcm1EYXRhIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZm9ybUpTT04iLCJmb3JFYWNoIiwidmFsdWUiLCJrZXkiLCJSZWZsZWN0IiwiaGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHVzaCIsImVhY2giLCJhdHRyIiwicmVwbGFjZSIsImZvcm1EYXRhVG9EYXRhT2JqZWN0QVBJQ2FsbCIsIkNTU1NlbGVjdG9yRm9ybSIsImFqYXhEYXRhIiwiZ2V0QWxsIiwiYXBwZW5kIiwidmFsIiwiaW5kZXhLZXkiLCJnZXQiLCJzZXQiLCJjbGlja1NhdmVCdXR0b24iLCJldmVudCIsImRlYnVnIiwicHJldmVudERlZmF1bHQiLCJjaGVja1ZhbGlkaXR5IiwiYWRkQ2xhc3MiLCJyZXBvcnRWYWxpZGl0eSIsIlRvYXN0IiwidGl0bGUiLCJtZXNzYWdlIiwic3RhdHVzIiwiVE9BU1RfU1RBVFVTIiwiREFOR0VSIiwidGltZW91dCIsInN0b3BQcm9wYWdhdGlvbiIsInJlbW92ZUNsYXNzIiwiYWpheFVybCIsImFqYXhNZXRob2QiLCJpZCIsImFqYXgiLCJ1cmwiLCJ0eXBlIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsImhlYWRlcnMiLCJzdWNjZXNzIiwiU1VDQ0VTUyIsImxvYWRNYWluQ29udGVudCIsImluaXRWaWV3TGlzdCIsInNldERldGFpbHNWaWV3RGF0YSIsIm5lZWRUb1NldCIsIm5vdGUiLCJwcm9wIiwiY2xpY2siLCJob29yZXljYURhdGFBY3RpdmUiLCJwcm9kdWN0R3JvdXAiLCJwcm9kdWN0X2dyb3VwIiwibmFtZSIsImNoYW5nZSIsInNlcnZpY2UiLCJwcm9maXRDZW50ZXIiLCJwcm9maXRfY2VudGVyIiwiZXNjYXBlU2VsZWN0b3IiLCJ1c2VycyIsInJlc2V0VXNlclRhYmxlIiwiaW5pdFZpZXdEZXRhaWxzIiwiQ29udGFjdFBvcFVwIiwiaW5pdCIsImFjdGl2ZSIsIm9uQWZ0ZXJTYXZlIiwiY29udGFjdEFjdGlvbiIsInJlbmRlckNvbnRhY3QiLCJiaW5kIiwic2V0Q29udGFjdFBvcHVwV29ya2Zsb3ciLCJjbGVhckRhdGEiLCJ0b29sdGlwIiwiaW5pdFJhZGlvQnV0dG9ucyIsImlucHV0bWFzayIsIm9uaW5jb21wbGV0ZSIsImxlbmd0aCIsIm9uY29tcGxldGUiLCJvbmNsZWFyZWQiLCJvZmYiLCJvbiIsImluaXRVc2VyQ3JlYXRlIiwic2VsZWN0MiIsInRhZ3MiLCJjcmVhdGVUYWciLCJwYXJhbXMiLCJ0ZXJtIiwidHJpbSIsInRleHQiLCJuZXdUYWciLCJzZXRJbWFnZUZyb21Mb2NhbCIsImlzIiwicmVuZGVyQXR0YWNobWVudCIsImluaXRGaWxlQXR0YWNobWVudEZlYXR1cmUiLCJpbml0RGVsaXZlcnlDb25zdHJhaW50VG9nZ2xlIiwidG9nZ2xlRGVsaXZlcnlGaWVsZHMiLCJoaWRlIiwic2V0VGltZW91dCIsInNlbGVjdGVkVXBsb2FkRmlsZVRvZ2dsZSIsImZpbGVJbnB1dCIsImZpbGVzIiwiZ3JvdXAiLCJmaW5kIiwiZ3JvdXBFbmQiLCJiZWZvcmVTZW5kIiwiYWRkQXR0YWNobWVudCIsImF0dGFjaG1lbnQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsImFqYXhFcnJvckZpZWxkSGFuZGxlciIsImNsaWNrTmV3IiwiY2xpY2tOZXdDYWxsQmFjayIsImRhdGF0YWJsZVJvd0FjdGlvbkVkaXQiLCJyb3dEYXRhIiwibm9kZSIsImNsaWNrT3JkZXJEZWxldGVDb25maXJtZWQiLCJtb2RhbCIsIl90b2tlbiIsInJvdyIsImRhdGFUYWJsZUNTU1NlbGVjdG9yIiwiRGF0YVRhYmxlIiwiZGFkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlIiwicGFyZW50cyIsIm1ldGhvZCIsInJlbW92ZSIsImRyYXciLCJkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlIiwiZGF0YXRhYmxlUm93QWN0aW9uRGVsZXRlIiwiZGF0YXRhYmxlUm93QWN0aW9uQnV0dG9uQ2xpY2siLCJjdXJyZW50VGFyZ2V0IiwiYWN0aW9uTmFtZSIsImNhcGl0YWxpemUiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJjb2xOdW0iLCJzZXRPcHRzIiwiZGF0YXRhYmxlQWN0aW9uQnV0dG9uQ2xpY2tDYWxsQmFjayIsImRhdGF0YWJsZVJvd0FjdGlvbkJ1dHRvbkNsaWNrQ2FsbEJhY2siLCJsYW5ndWFnZSIsInJlbmRlciIsImJ1dHRvbnMiLCJkYXRhdGFibGVBZGRSb3dUcmFzaEJ1dHRvbiIsImRhdGF0YWJsZUFkZFJvd0VkaXRCdXR0b24iLCJsYXRpbmlzZSIsImF1dG9QcmludCIsImNsYXNzTmFtZSIsImFwaSIsImNvbmZpZyIsImFjdGlvbiIsImUiLCJkdCIsImRyYXdDYWxsYmFjayIsInNldHRpbmdzIiwiZGF0YXRhYmxlQWRkUm93QWN0aW9uIiwiYXV0b2ZpbGxEZXRhaWxzIiwicmFuZG9tTnVtYmVyIiwiZ2V0UmFuZG9tSW50Iiwicm93TnVtIiwiZ2V0RGF0YSIsImF0dGFjaG1lbnREYXRhIiwiZGF0ZSIsIkRhdGUiLCJjcmVhdGVkX2F0IiwidG9Mb2NhbGVTdHJpbmciLCJsaW5rIiwiUHVibGljVXJsIiwiZmlsZW5hbWUiLCJ0ZW1wbGF0ZSIsImh0bWwiLCJNdXN0YWNoZSIsImJpbmRBdHRhY2htZW50Q2xpY2tBY3Rpb24iLCJiaW5kQ29udGFjdENsaWNrQWN0aW9uIiwiZW5hYmxlVGltZXJzIiwib3JpZ2luYWxfZmlsZW5hbWUiLCJyZXNldENvbnRhY3RUYWJsZSIsImNvbnRhY3REYXRhIiwidW5iaW5kIiwiY29udGFjdERlbGV0ZUNsaWNrIiwiY29udGFjdEVkaXRDbGljayIsImF0dGFjaG1lbnREZWxldGVDbGljayIsImN1cnJlbnRBdHRhY2htZW50Um93IiwiY2xvc2VzdCIsImF0dGFjaGVtbnRJZCIsImZpbHRlciIsImFyciIsInJlc2V0QXR0YWNobWVudFRhYmxlIiwiZ2V0Q29udGFjdFBvcHVwV29ya2Zsb3ciLCJsb2FkRGF0YSIsImdldFN1cHBsaWVyIiwiYWRkQ29udGFjdCIsImVkaXRDb250YWN0IiwibmV3Q29udGFjdHMiLCJyZW5kZXJVc2VycyIsInVzZXJEYXRhIiwiYmluZFVzZXJDbGlja0FjdGlvbiIsInVzZXJEZWxldGVDbGljayIsImFkZFVzZXIiLCJhbHJlYWR5QWRkZWQiLCJzb21lIiwidSIsImNyZWF0ZVVybCIsImNvbnRhaW5lciIsImNsZWFyRm9ybSIsImVtYWlsIiwicGFzc3dvcmQiLCJlcnJvckVsIiwidXNlciIsInhociIsIm1zZyIsImVycm9ycyIsImZpcnN0S2V5IiwiT2JqZWN0Iiwia2V5cyJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vc3VwcGxpZXIuanM/YTdjNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpZih0eXBlb2YgU3VwcGxpZXI9PT0ndW5kZWZpbmVkJyl7XG4gICAgY2xhc3MgU3VwcGxpZXIgZXh0ZW5kcyBEYXRhTW9kZWx7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQ29uc3RydWN0b3JcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yIChkYXRhLG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN1cGVyKGRhdGEsb3B0aW9ucylcbiAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLmNvbnRhY3QgPT09XCJ1bmRlZmluZWRcIil7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWN0PVtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuY2FuU2VlID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuU2VlPTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5jYW5TZWVJbk9yZGVyID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuU2VlSW5PcmRlcj0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuaGFzRGVsaXZlcnlDb25zdHJhaW50ID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVsaXZlcnlDb25zdHJhaW50PTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5vcmRlckN1dE9mZlRpbWUgPT09XCJ1bmRlZmluZWRcIil7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmRlckN1dE9mZlRpbWU9MTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5kZWxpdmVyeUxlYWRUaW1lID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsaXZlcnlMZWFkVGltZT00ODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdXBwbGllciBjb25zdHJ1Y3RvciBjYWxsZWQnKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHdpbmRvdy5TdXBwbGllcj1TdXBwbGllcjtcbn1cblxuXG53aW5kb3cuU3VwcGxpZXJBZG1pbj1mdW5jdGlvbiAob3B0aW9ucyxTdXBwbGllckl0ZW0pIHtcbiAgICAvKlxuICAgICAqIFZhcmlhYmxlcyBhY2Nlc3NpYmxlXG4gICAgICogaW4gdGhlIGNsYXNzXG4gICAgICovXG4gICAgbGV0IE9wdHMgPSB7XG4gICAgICAgIHRva2VuOm51bGwsXG4gICAgICAgIGNvbnRhaW5lckNzc1NlbGVjdG9yOiAnLmNvbnRhaW5lclN1cHBsaWVyJyxcbiAgICAgICAgdGVzdE1vZGU6ZmFsc2UsXG4gICAgICAgIFVSTDp7XG4gICAgICAgICAgICBnZXREYXRhVGFibGVDb250ZW50OicnLFxuICAgICAgICAgICAgaW5kZXg6JycsXG4gICAgICAgICAgICBzaG93OicnLFxuICAgICAgICAgICAgZWRpdDonJyxcbiAgICAgICAgICAgIGNyZWF0ZTonJyxcbiAgICAgICAgICAgIHN0b3JlOicnLFxuICAgICAgICAgICAgdXBkYXRlOicnLFxuICAgICAgICAgICAgZGVzdHJveTonJyxcbiAgICAgICAgICAgIGF0dGFjaEZpbGU6JycsXG4gICAgICAgICAgICBkZXRhY2hGaWxlOicnLFxuICAgICAgICAgICAgY3JlYXRlVXNlcjonJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YVRhYmxlOntcbiAgICAgICAgICAgIG9yZGVyRGlyZWN0aXZlOlsxLCAnYXNjJ11cbiAgICAgICAgfSxcbiAgICAgICAgb25BZnRlckluaXRWaWV3RGV0YWlsczpmdW5jdGlvbiAoKXt9XG4gICAgfTtcbiAgICBsZXQgU3VwcGxpZXIgPSB7fTtcbiAgICBsZXQgcm9vdCA9IHRoaXM7XG4gICAgbGV0IGNvbnRhY3RQb3B1cFdvcmtmbG93PSduZXcnO1xuICAgIC8qXG4gICAgICogQ29uc3RydWN0b3JcbiAgICAgKi9cbiAgICB0aGlzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLFN1cHBsaWVySXRlbSkge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VwcGxpZXJBZG1pbiBjb25zdHJ1Y3RvciBjYWxsZWQnKTtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgb3B0aW9ucyk7XG4gICAgICAgIGlmKCFTdXBwbGllckl0ZW0pe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1cHBsaWVyIGxldHJlIGtlbGxldCBob3puaSAnKTtcbiAgICAgICAgICAgIGlmKCFBUFAuU3VwcGxpZXIpe1xuICAgICAgICAgICAgICAgIEFQUC5TdXBwbGllcj1uZXcgd2luZG93LlN1cHBsaWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb290LlN1cHBsaWVyPUFQUC5TdXBwbGllcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5nZXRPcHRzPWZ1bmN0aW9uICgpe1xuICAgICAgICByZXR1cm4gT3B0cztcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1EYXRhVG9EYXRhT2JqZWN0QVBJQ2FsbE9sZD0gZnVuY3Rpb24gKENTU1NlbGVjdG9yKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoQ1NTU2VsZWN0b3IpKTtcbiAgICAgICAgLy9sZXQgZm9ybUpTT04gPSBPYmplY3QuZnJvbUVudHJpZXMoZGF0YS5lbnRyaWVzKCkpO1xuICAgICAgICB2YXIgZm9ybUpTT04gPSB7fTtcbiAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAvLyBSZWZsZWN0LmhhcyBpbiBmYXZvciBvZjogZm9ybUpTT04uaGFzT3duUHJvcGVydHkoa2V5KVxuICAgICAgICAgICAgaWYoIVJlZmxlY3QuaGFzKGZvcm1KU09OLCBrZXkpKXtcbiAgICAgICAgICAgICAgICBmb3JtSlNPTltrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZm9ybUpTT05ba2V5XSkpe1xuICAgICAgICAgICAgICAgIGZvcm1KU09OW2tleV0gPSBbZm9ybUpTT05ba2V5XV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtSlNPTltrZXldLnB1c2godmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yKycgaW5wdXRbZGF0YS1pbnB1dG1hc2tdJykuZWFjaChmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGlmKGZvcm1KU09OWyQodGhpcykuYXR0cignbmFtZScpXSl7XG4gICAgICAgICAgICAgICAgZm9ybUpTT05bJCh0aGlzKS5hdHRyKCduYW1lJyldPWZvcm1KU09OWyQodGhpcykuYXR0cignbmFtZScpXS5yZXBsYWNlKC9bXyBdKyQvZyxcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vZm9ybUpTT04ucHJvZHVjdEdyb3Vwcz0kKFwiLnByb2R1Y3RDYXRlZ29yeVNlbGVjdFwiKS5zZWxlY3QyKCkudmFsKCk7XG5cblxuICAgICAgICAvKk11bHRpc2VsZWN0IG9yIGNoZWNrYm94IHRvIGFycmF5OlxuICAgICAgICBhamF4RGF0YVsncHJvZHVjdEdyb3VwJ109JChcIi5wcm9kdWN0Q2F0ZWdvcnlTZWxlY3RcIikuc2VsZWN0MigpLnZhbCgpO1xuXG4gICAgICAgIGZvcm1KU09OLm11bHRpc2VsZWN0TmFtZSA9IGRhdGEuZ2V0QWxsKCdtdWx0aXNlbGVjdE5hbWUnKTtcbiAgICAgICAgJC5lYWNoKGZvcm1KU09OLCBmdW5jdGlvbiAoaXRlbSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGZvcm1KU09OWyQubGNGaXJzdChpdGVtLnJlcGxhY2UoJ2NvbnRhY3QnLCAnJykpXSA9IHZhbHVlO1xuICAgICAgICAgICAgZGVsZXRlIGZvcm1KU09OW2l0ZW1dO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYoZm9ybUpTT04ucGhvbmUpe1xuICAgICAgICAgICAgZm9ybUpTT04ucGhvbmU9Zm9ybUpTT04ucGhvbmUucmVwbGFjZUFsbCgnXycsJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGZvcm1KU09OLmVtYWlsKXtcbiAgICAgICAgICAgIGZvcm1KU09OLmVtYWlsPWZvcm1KU09OLmVtYWlsLnJlcGxhY2VBbGwoJ18nLCcnKTtcbiAgICAgICAgfVxuICAgICAgICAqL1xuICAgICAgICByZXR1cm4gZm9ybUpTT047XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtRGF0YVRvRGF0YU9iamVjdEFQSUNhbGwgPSBmdW5jdGlvbiAoQ1NTU2VsZWN0b3JGb3JtKSB7XG4gICAgICAgIGxldCBhamF4RGF0YT1uZXcgRm9ybURhdGEoJChDU1NTZWxlY3RvckZvcm0pWzBdKTtcbiAgICAgICAgJC5lYWNoKGFqYXhEYXRhLmdldEFsbCgncHJvZml0Q2VudGVyJyksZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgICAgIGFqYXhEYXRhLmFwcGVuZCgncHJvZml0Q2VudGVyW10nLHZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgJC5lYWNoKGFqYXhEYXRhLmdldEFsbCgncHJvZHVjdEdyb3VwJyksZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgICAgIGFqYXhEYXRhLmFwcGVuZCgncHJvZHVjdEdyb3VwW10nLHZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgJC5lYWNoKGFqYXhEYXRhLmdldEFsbCgnc3VwcGxpZXJTZXJ2aWNlJyksZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgICAgIGFqYXhEYXRhLmFwcGVuZCgnc3VwcGxpZXJTZXJ2aWNlW10nLHZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgJC5lYWNoKGFqYXhEYXRhLmdldEFsbCgnY29udGFjdElkJyksZnVuY3Rpb24oa2V5LHZhbHVlKXtcbiAgICAgICAgICAgIGFqYXhEYXRhLmFwcGVuZCgnY29udGFjdElkW10nLHZhbHVlKTtcbiAgICAgICAgfSlcblxuICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ190b2tlbicsJCgnaW5wdXRbbmFtZT1fdG9rZW5dJykudmFsKCkpO1xuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbZGF0YS1pbnB1dG1hc2tdJykuZWFjaChmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGxldCBpbmRleEtleT0kKHRoaXMpLmF0dHIoJ25hbWUnKTtcbiAgICAgICAgICAgIGlmKGFqYXhEYXRhLmdldChpbmRleEtleSkpe1xuICAgICAgICAgICAgICAgIGFqYXhEYXRhLnNldChpbmRleEtleSxhamF4RGF0YS5nZXQoaW5kZXhLZXkpLnJlcGxhY2UoL1tfIF0rJC9nLFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFqYXhEYXRhO1xuICAgIH1cblxuICAgIHRoaXMuY2xpY2tTYXZlQnV0dG9uPWZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBkZWJ1ZygnU2F2ZSBjbGlja2VkJyk7XG4gICAgICAgIGxldCBDU1NTZWxlY3RvckZvcm09T3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5zdXBwbGllckZvcm0nO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgIGlmICgkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9XCJjYW5TZWVJbk9yZGVyXCJdJykudmFsKCk9PTEgJiYgJChDU1NTZWxlY3RvckZvcm0pWzBdLmNoZWNrVmFsaWRpdHkoKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd2YWxpZGF0b24gZmFsc2UnKTtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKS5hZGRDbGFzcygnd2FzLXZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0pWzBdLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJWYWxpZMOhY2nDs3MgaGliYSFcIiwgbWVzc2FnZTogXCJLw6lyasO8aywgdMO2bHRzZSBraSBhIGvDtnRlbGV6xZEgbWV6xZFrZXQhXCIsIHN0YXR1czogVE9BU1RfU1RBVFVTLkRBTkdFUiwgdGltZW91dDogNTAwMCB9KTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZhbGlkYXRvbiBvaycpO1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0pLnJlbW92ZUNsYXNzKCd3YXMtdmFsaWRhdGVkJyk7XG4gICAgICAgICAgICAvL2RvIHlvdXIgYWpheCBzdWJtaXRpb24gaGVyZVxuICAgICAgICB9XG4gICAgICAgIGxldCBhamF4RGF0YT1yb290LmZvcm1EYXRhVG9EYXRhT2JqZWN0QVBJQ2FsbChDU1NTZWxlY3RvckZvcm0pO1xuXG5cblxuICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5zdG9yZTtcbiAgICAgICAgbGV0IGFqYXhNZXRob2Q9XCJQT1NUXCI7XG4gICAgICAgIGlmKHJvb3QuU3VwcGxpZXIuaWQpe1xuICAgICAgICAgICAgYWpheFVybD1PcHRzLlVSTC51cGRhdGUucmVwbGFjZSgnJWlkJScscm9vdC5TdXBwbGllci5pZCk7XG4gICAgICAgICAgICAvL2FqYXhNZXRob2Q9XCJQVVRcIjtcbiAgICAgICAgICAgIC8vYWpheERhdGE9bmV3IEZvcm1EYXRhKCQoQ1NTU2VsZWN0b3JGb3JtKVswXSk7XG4gICAgICAgICAgICBhamF4RGF0YS5hcHBlbmQoJ19tZXRob2QnLCdQVVQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGFqYXhNZXRob2QpO1xuICAgICAgICBkZWJ1ZyhhamF4RGF0YSk7XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDphamF4VXJsLFxuICAgICAgICAgICAgZGF0YTphamF4RGF0YSxcbiAgICAgICAgICAgIHR5cGU6YWpheE1ldGhvZCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOmZhbHNlLFxuICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdYLUNTUkYtVE9LRU4nOiAkKCdpbnB1dFtuYW1lPVwiX3Rva2VuXCJdJykudmFsKClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpe1xuICAgICAgICAgICAgICAgIGRlYnVnKCdkMTogU2F2ZSBzdWNjZXNzICcpO1xuICAgICAgICAgICAgICAgIGRlYnVnKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcz09dHJ1ZSl7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9PcHRzLm9uQWZ0ZXJJbml0Vmlld0RldGFpbHM9cm9vdC5hdXRvZmlsbERldGFpbHM7XG4gICAgICAgICAgICAgICAgICAgIE9wdHMuZGF0YVRhYmxlLm9yZGVyRGlyZWN0aXZlPVswLCAnZGVzYyddO1xuICAgICAgICAgICAgICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJTaWtlcmVzIHLDtmd6w610w6lzIVwiLCBtZXNzYWdlOiBhamF4RGF0YS5nZXQoJ25hbWUnKStcIiBuZXbFsSBiZXN6w6FsbGzDrXTDsyBlbG1lbnR2ZVwiLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5TVUNDRVNTLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgICAgICAgICAgICAgICAgICBBUFAubG9hZE1haW5Db250ZW50KE9wdHMuVVJMLmluZGV4Kyc/aW5pdD0wJyxyb290LmluaXRWaWV3TGlzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXREZXRhaWxzVmlld0RhdGE9ZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1Zygnc2V0RGV0YWlsc1ZpZXdEYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKFN1cHBsaWVyKTtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT1PcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKycgLnN1cHBsaWVyRm9ybSc7XG4gICAgICAgIGxldCBuZWVkVG9TZXQ9W1xuICAgICAgICAgICAgJ25hbWUnLCdob29yZXljYUlkJywnbmFtZUlkJyxcbiAgICAgICAgICAgICdvcmRlckVtYWlsJywnb3JkZXJFbWFpbDInLCdhZGRyZXNzJywnbWFpbGluZ0FkZHJlc3MnLCdwaG9uZScsJ2ZheCcsJ2N1c3RvbWVyU2VydmljZVBob25lJyxcbiAgICAgICAgICAgICduYW1lMjInLFxuICAgICAgICAgICAgJ29wZW5Ib3VycycsICdvcmRlcnNEZWFkbGluZScsICdtaW5PcmRlclZhbHVlJyxcbiAgICAgICAgXTtcbiAgICAgICAgJC5lYWNoKG5lZWRUb1NldCxmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0eXBlb2Ygcm9vdC5TdXBwbGllclt0aGlzXSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT0nK3RoaXMrJ10nKS52YWwocm9vdC5TdXBwbGllclt0aGlzXSk7XG4gICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyB0ZXh0YXJlYVtuYW1lPScrdGhpcysnXScpLnZhbChyb290LlN1cHBsaWVyW3RoaXNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgaWYodHlwZW9mIHJvb3QuU3VwcGxpZXJbJ25vdGUnXSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyB0ZXh0YXJlYVtuYW1lPW5vdGVdJykudmFsKHJvb3QuU3VwcGxpZXIubm90ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodHlwZW9mIHJvb3QuU3VwcGxpZXJbJ2VtYWlsQXR0YWNobWVudFR5cGUnXSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWVtYWlsQXR0YWNobWVudFR5cGVdW3ZhbHVlPScrcm9vdC5TdXBwbGllclsnZW1haWxBdHRhY2htZW50VHlwZSddKyddJykucHJvcCgnY2hlY2tlZCcsdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAqW2RhdGEtdG9nZ2xlPWNhblNlZV1bZGF0YS10aXRsZT0nK3Jvb3QuU3VwcGxpZXIuY2FuU2VlKyddJykuY2xpY2soKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAqW2RhdGEtdG9nZ2xlPWNhblNlZUluT3JkZXJdW2RhdGEtdGl0bGU9Jytyb290LlN1cHBsaWVyLmNhblNlZUluT3JkZXIrJ10nKS5jbGljaygpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnICpbZGF0YS10b2dnbGU9aG9vcmV5Y2FEYXRhQWN0aXZlXVtkYXRhLXRpdGxlPScrcm9vdC5TdXBwbGllci5ob29yZXljYURhdGFBY3RpdmUrJ10nKS5jbGljaygpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnICpbZGF0YS10b2dnbGU9aGFzRGVsaXZlcnlDb25zdHJhaW50XVtkYXRhLXRpdGxlPScrcm9vdC5TdXBwbGllci5oYXNEZWxpdmVyeUNvbnN0cmFpbnQrJ10nKS5jbGljaygpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9b3JkZXJDdXRPZmZUaW1lXScpLnZhbChyb290LlN1cHBsaWVyLm9yZGVyQ3V0T2ZmVGltZSk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9ZGVsaXZlcnlMZWFkVGltZV0nKS52YWwocm9vdC5TdXBwbGllci5kZWxpdmVyeUxlYWRUaW1lKTtcbiAgICAgICAgbGV0IHByb2R1Y3RHcm91cD1bXTtcbiAgICAgICAgJC5lYWNoKHJvb3QuU3VwcGxpZXIucHJvZHVjdF9ncm91cCxmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9kdWN0R3JvdXAucHVzaCh0aGlzLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAucHJvZHVjdENhdGVnb3J5U2VsZWN0JykudmFsKHByb2R1Y3RHcm91cCkuY2hhbmdlKCk7XG5cbiAgICAgICAgbGV0IHNlcnZpY2U9W107XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLnNlcnZpY2UsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VydmljZS5wdXNoKHRoaXMubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5zZXJ2aWNlU2VsZWN0JykudmFsKHNlcnZpY2UpLmNoYW5nZSgpO1xuXG4gICAgICAgIGxldCBwcm9maXRDZW50ZXI9W107XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLnByb2ZpdF9jZW50ZXIsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcHJvZml0Q2VudGVyLnB1c2godGhpcy5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vJChDU1NTZWxlY3RvckZvcm0rJyAucHJvZml0Q2VudGVyU2VsZWN0JykudmFsKHByb2ZpdENlbnRlcikuY2hhbmdlKCk7XG4gICAgICAgIC8vZGVidWcocHJvZml0Q2VudGVyKTtcbiAgICAgICAgJC5lYWNoKHByb2ZpdENlbnRlcixmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCdpbnB1dFt2YWx1ZT1cIicrJC5lc2NhcGVTZWxlY3Rvcih0aGlzKSsnXCJdJykucHJvcCggXCJjaGVja2VkXCIsIHRydWUgKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpZih0eXBlb2Ygcm9vdC5TdXBwbGllclsnbG9nb0ZpbGUnXSE9J3VuZGVmaW5lZCcgJiYgKHJvb3QuU3VwcGxpZXJbJ2xvZ29GaWxlJ10pKXtcbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW1nLmltYWdlTG9nbycpLmF0dHIoJ3NyYycscm9vdC5TdXBwbGllclsnbG9nb0ZpbGUnXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodHlwZW9mIHJvb3QuU3VwcGxpZXIudXNlcnMgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIHJvb3QucmVzZXRVc2VyVGFibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZGVidWcoQVBQLlN1cHBsaWVyQWRtaW4uZm9ybURhdGFUb0RhdGFPYmplY3RBUElDYWxsKCcuc3VwcGxpZXJGb3JtJylbJ3Byb2R1Y3RHcm91cCddKTtcbiAgICAgICAgLy8kKCdbbmFtZT1wcm9kdWN0R3JvdXBdJykudmFsKFsnQsO8ZsOpw6FydV/DqWRlc2lwYXJpX3Rlcm3DqWtlaycsJ1RvasOhcyddKS5jaGFuZ2UoKTtcbiAgICAgICAgLy9yb290LnNldERldGFpbHNWaWV3RGF0YSgpO1xuICAgIH1cbiAgICB0aGlzLmluaXRWaWV3RGV0YWlscz1mdW5jdGlvbiAob3B0aW9ucyxTdXBwbGllckl0ZW0pe1xuICAgICAgICBkZWJ1ZygnKipjYWxsIGluaXRWaWV3RGV0YWlscyAnKTtcbiAgICAgICAgaWYoIUFQUC5Db250YWN0UG9wVXApe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25pbmNzIEFQUC5Db250YWN0UG9wVXAnKVxuICAgICAgICAgICAgQVBQLkNvbnRhY3RQb3BVcCA9IG5ldyB3aW5kb3cuQ29udGFjdFBvcFVwKCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ21hciB2YW4gIEFQUC5Db250YWN0UG9wVXAnKVxuICAgICAgICB9XG4gICAgICAgIEFQUC5Db250YWN0UG9wVXAuaW5pdCh7XG4gICAgICAgICAgICBhY3RpdmU6dHJ1ZSxcbiAgICAgICAgICAgIG9uQWZ0ZXJTYXZlOnJvb3QuY29udGFjdEFjdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcm9vdC5yZW5kZXJDb250YWN0KCk7XG4gICAgICAgICQoJy5zdXBwbGllckZvcm0gLmJ1dHRvbk5ld0NvbnRhY3QnKS5iaW5kKCdjbGljaycsZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBBUFAuU3VwcGxpZXJBZG1pbi5zZXRDb250YWN0UG9wdXBXb3JrZmxvdygnbmV3Jyk7XG4gICAgICAgICAgICBBUFAuQ29udGFjdFBvcFVwLmNsZWFyRGF0YSgpO1xuICAgICAgICAgICAgQVBQLkNvbnRhY3RQb3BVcC5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKCdbZGF0YS10b2dnbGU9XCJ0b29sdGlwXCJdJykudG9vbHRpcCgpO1xuICAgICAgICBpbml0UmFkaW9CdXR0b25zKCk7XG4gICAgICAgICQoXCI6aW5wdXRcIikuaW5wdXRtYXNrKHtcbiAgICAgICAgICAgIFwib25pbmNvbXBsZXRlXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygkKHRoaXMpLmRhdGEoJ3JlcXVpcmVkJykpO1xuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpLmxlbmd0aCA+IDAgfHwgJCh0aGlzKS5kYXRhKCdyZXF1aXJlZCcpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvbmNvbXBsZXRlXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaXMtdmFsaWQnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9uY2xlYXJlZFwiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NsZWFyZWQnKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJ2Zvcm0uc3VwcGxpZXJGb3JtIGJ1dHRvbi5Gb3JtU2F2ZUJ1dHRvbicpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnZm9ybS5zdXBwbGllckZvcm0gYnV0dG9uLkZvcm1TYXZlQnV0dG9uJykub24oJ2NsaWNrJyxyb290LmNsaWNrU2F2ZUJ1dHRvbik7XG4gICAgICAgIHJvb3Quc2V0RGV0YWlsc1ZpZXdEYXRhKCk7XG4gICAgICAgIHJvb3QuaW5pdFVzZXJDcmVhdGUoKTtcbiAgICAgICAgJChcIi5wcm9kdWN0Q2F0ZWdvcnlTZWxlY3RcIikuc2VsZWN0MigpO1xuICAgICAgICAkKFwiLnNlcnZpY2VTZWxlY3RcIikuc2VsZWN0Mih7XG4gICAgICAgICAgICB0YWdzOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlVGFnOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlcm0gPSAkLnRyaW0ocGFyYW1zLnRlcm0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlcm0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0ZXJtLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXJtLFxuICAgICAgICAgICAgICAgICAgICBuZXdUYWc6IHRydWUgLy8gYWRkIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8kKFwiLnByb2ZpdENlbnRlclNlbGVjdFwiKS5zZWxlY3QyKCk7XG4gICAgICAgICQoXCJpbnB1dFtuYW1lPWxvZ29GaWxlXVwiKS5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHNldEltYWdlRnJvbUxvY2FsKHRoaXMsT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5pbWFnZUxvZ28nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnZm9ybS5zdXBwbGllckZvcm0gLnByb2ZpdENlbnRlclNlbGVjdENoZWNrYm94QWxsJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCdmb3JtLnN1cHBsaWVyRm9ybSAucHJvZml0Q2VudGVyU2VsZWN0Q2hlY2tib3hBbGwnKS5vbignY2xpY2snLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIC8vbGV0IGNoZWNrZWQ9JCh0aGlzKS5pcyhcIjpjaGVja2VkXCIpXG4gICAgICAgICAgICAkKCdmb3JtLnN1cHBsaWVyRm9ybSBpbnB1dC5wcm9maXRDZW50ZXJTZWxlY3RDaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCQodGhpcykuaXMoXCI6Y2hlY2tlZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByb290LnJlbmRlckF0dGFjaG1lbnQoKTtcbiAgICAgICAgLy9PcHRzLm9uQWZ0ZXJJbml0Vmlld0RldGFpbHMoKTtcbiAgICAgICAgcm9vdC5pbml0RmlsZUF0dGFjaG1lbnRGZWF0dXJlKCk7XG5cbiAgICAgICAgcm9vdC5pbml0RGVsaXZlcnlDb25zdHJhaW50VG9nZ2xlKCk7XG5cbiAgICAgICAgZGVidWcoJyoqZW5kIGluaXRWaWV3RGV0YWlscyAnKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXREZWxpdmVyeUNvbnN0cmFpbnRUb2dnbGU9ZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgQ1NTU2VsZWN0b3JGb3JtPU9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuc3VwcGxpZXJGb3JtJztcbiAgICAgICAgbGV0IHRvZ2dsZURlbGl2ZXJ5RmllbGRzPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB2YWw9JChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPVwiaGFzRGVsaXZlcnlDb25zdHJhaW50XCJdJykudmFsKCk7XG4gICAgICAgICAgICBpZih2YWw9PTEpe1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLmRlbGl2ZXJ5Q29uc3RyYWludEZpZWxkcycpLnNob3coKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLmRlbGl2ZXJ5Q29uc3RyYWludEZpZWxkcycpLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBhW2RhdGEtdG9nZ2xlPVwiaGFzRGVsaXZlcnlDb25zdHJhaW50XCJdJykub2ZmKCdjbGljay5kZWxpdmVyeUNvbnN0cmFpbnQnKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBhW2RhdGEtdG9nZ2xlPVwiaGFzRGVsaXZlcnlDb25zdHJhaW50XCJdJykub24oJ2NsaWNrLmRlbGl2ZXJ5Q29uc3RyYWludCcsZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRvZ2dsZURlbGl2ZXJ5RmllbGRzLDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdG9nZ2xlRGVsaXZlcnlGaWVsZHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkVXBsb2FkRmlsZVRvZ2dsZT1mdW5jdGlvbiAoZmlsZUlucHV0KXtcbiAgICAgICAgLypcbiAgICAgICAgY29uc29sZS5sb2coZmlsZUlucHV0LmF0dHIoJ25hbWUnKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGVJbnB1dFswXS5maWxlc1swXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGVJbnB1dFswXS5maWxlc1swXS5uYW1lKTtcbiAgICAgICAgKi9cbiAgICAgICAgaWYoZmlsZUlucHV0KXtcbiAgICAgICAgICAgICQoJy5jb250YWluZXJGaWxlVXBsb2FkJykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgaWYoZmlsZUlucHV0WzBdLmZpbGVzWzBdKXtcbiAgICAgICAgICAgICAgICAkKCcuY29udGFpbmVyVXBsb2FkZWRGaWxlTmFtZScpLnRleHQoZmlsZUlucHV0WzBdLmZpbGVzWzBdLm5hbWUpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyRmlsZVVwbG9hZFN0YXJ0ZWQnKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyVXBsb2FkZWRTcGlubmVyJykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICQoJy5jb250YWluZXJVcGxvYWRlZEZpbGVOYW1lJykudGV4dCgnJyk7XG4gICAgICAgICAgICAkKCcuY3VzdG9tLWZpbGUtbGFiZWwuc2VsZWN0ZWQnKS50ZXh0KCcnKTtcbiAgICAgICAgICAgICQoJy5jb250YWluZXJGaWxlVXBsb2FkU3RhcnRlZCcpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgICAgICQoJy51cGxvYWRTdGF0dXNSb3cnKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyRmlsZVVwbG9hZCcpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5pdEZpbGVBdHRhY2htZW50RmVhdHVyZT1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0taW5pdEZpbGVBdHRhY2htZW50RmVhdHVyZS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIGlmKHJvb3QuU3VwcGxpZXIuaWQpe1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lckZpbGVVcGxvYWQnKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyRmlsZVVwbG9hZE5vbmUnKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgIH1cblxuXG4gICAgICAgICQoT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5idXR0b25VcGxvYWQnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcisnIC5idXR0b25VcGxvYWQnKS5vbignY2xpY2snLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgY29uc29sZS5ncm91cCgnLS0tLS0tLWJ1dHRvblVwbG9hZC0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICBsZXQgZmlsZUlucHV0PSQoJyNpbnB1dEdyb3VwQXR0YWNoZUZpbGUnKTtcbiAgICAgICAgICAgIGlmKGZpbGVJbnB1dFswXS5maWxlcy5sZW5ndGg8MSl7XG4gICAgICAgICAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiSGliYSFcIiwgbWVzc2FnZTogJ1bDoWxsYXN6b24ga2kgZsOhamx0IScsIHN0YXR1czogVE9BU1RfU1RBVFVTLkRBTkdFUiwgdGltZW91dDogMTAwMDAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coJChPcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKS5maW5kKCdmb3JtLnN1cHBsaWVyRm9ybScpWzBdKTtcbiAgICAgICAgICAgIGxldCBkYXRhPSBuZXcgRm9ybURhdGEoJChPcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKS5maW5kKCdmb3JtLnN1cHBsaWVyRm9ybScpWzBdKTtcbiAgICAgICAgICAgIGRhdGEuYXBwZW5kKGZpbGVJbnB1dC5hdHRyKCduYW1lJyksZmlsZUlucHV0WzBdLmZpbGVzWzBdKTtcblxuICAgICAgICAgICAgcm9vdC5zZWxlY3RlZFVwbG9hZEZpbGVUb2dnbGUoZmlsZUlucHV0KTtcbiAgICAgICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmF0dGFjaEZpbGUucmVwbGFjZSgnJWlkJScscm9vdC5TdXBwbGllci5pZCk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOmFqYXhVcmwsXG4gICAgICAgICAgICAgICAgZGF0YTpkYXRhLFxuICAgICAgICAgICAgICAgIHR5cGU6J1BPU1QnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOmZhbHNlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzPT10cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuYWRkQXR0YWNobWVudChkYXRhLmRhdGEuYXR0YWNobWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LnNlbGVjdGVkVXBsb2FkRmlsZVRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLnJlc3BvbnNlSlNPTik7XG4gICAgICAgICAgICAgICAgICAgIHJvb3Quc2VsZWN0ZWRVcGxvYWRGaWxlVG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgICAgIGFqYXhFcnJvckZpZWxkSGFuZGxlcihkYXRhLnJlc3BvbnNlSlNPTi5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMuY2xpY2tOZXc9ZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygnY2xpY2tOZXcnKTtcbiAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChPcHRzLlVSTC5jcmVhdGUscm9vdC5jbGlja05ld0NhbGxCYWNrKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrTmV3Q2FsbEJhY2s9ZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygnY2FsbGJhY2tOZXcnKTtcbiAgICAgICAgcm9vdC5TdXBwbGllcj1uZXcgd2luZG93LlN1cHBsaWVyKCk7XG4gICAgICAgIHJvb3QuaW5pdFZpZXdEZXRhaWxzKCk7XG4gICAgfVxuICAgIHRoaXMuZGF0YXRhYmxlUm93QWN0aW9uRWRpdD1mdW5jdGlvbiAocm93RGF0YSxub2RlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhdGFibGVSb3dBY3Rpb25FZGl0IENhbGxlZCcpO1xuICAgICAgICAvL09wdHMub25BZnRlckluaXRWaWV3RGV0YWlscz1yb290LmF1dG9maWxsRGV0YWlscztcbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuZWRpdC5yZXBsYWNlKCclaWQlJyxyb3dEYXRhLmlkKTtcbiAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChhamF4VXJsLHJvb3QuaW5pdFZpZXdEZXRhaWxzKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2RhdGF0YWJsZVJvd0FjdGlvbkVkaXQgRW5kJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja09yZGVyRGVsZXRlQ29uZmlybWVkPWZ1bmN0aW9uIChldmVudCl7XG4gICAgICAgIGRlYnVnKCdjbGlja1N1cHBsaWVyRGVsZXRlQ29uZmlybWVkJyk7XG4gICAgICAgIGRlYnVnKGV2ZW50KTtcbiAgICAgICAgZGVidWcoZXZlbnQuZGF0YSk7XG4gICAgICAgICQoJyNkaWFsb2dNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIGxldCBhamF4RGF0YT17fTtcbiAgICAgICAgYWpheERhdGEuX3Rva2VuPU9wdHMudG9rZW47XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmRlc3Ryb3kucmVwbGFjZSgnJWlkJScsZXZlbnQuZGF0YS5pZCk7XG4gICAgICAgIGFqYXhEYXRhLl90b2tlbj0kKCdpbnB1dFtuYW1lPV90b2tlbl0nKS52YWwoKTtcbiAgICAgICAgY29uc29sZS5sb2coYWpheFVybCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGFqYXhEYXRhKTtcbiAgICAgICAgbGV0IHJvdz0kKGRhdGFUYWJsZUNTU1NlbGVjdG9yKS5EYXRhVGFibGUoKS5yb3cocm9vdC5kYWRhdGF0YWJsZVJvd0FjdGlvbkNhbGxlck5vZGUucGFyZW50cygndHInKSk7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICBtZXRob2Q6XCJERUxFVEVcIixcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpe1xuICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcz09dHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5yZW1vdmUoKS5kcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZGFkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlPWZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9XG4gICAgbGV0IGRhdGF0YWJsZVJvd0FjdGlvbkNhbGxlck5vZGU9ZmFsc2U7XG5cbiAgICB0aGlzLmRhdGF0YWJsZVJvd0FjdGlvbkRlbGV0ZT1mdW5jdGlvbiAocm93RGF0YSxub2RlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhdGFibGVSb3dBY3Rpb25EZWxldGUgQ2FsbGVkJyk7XG4gICAgICAgIHJvb3QuZGFkYXRhdGFibGVSb3dBY3Rpb25DYWxsZXJOb2RlPW5vZGU7XG4gICAgICAgICQoJyNkaWFsb2dNb2RhbCcpLm9uKCdzaG93LmJzLm1vZGFsJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBuZWNlc3NhcnksIHlvdSBjb3VsZCBpbml0aWF0ZSBhbiBBSkFYIHJlcXVlc3QgaGVyZSAoYW5kIHRoZW4gZG8gdGhlIHVwZGF0aW5nIGluIGEgY2FsbGJhY2spLlxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtb2RhbCdzIGNvbnRlbnQuIFdlJ2xsIHVzZSBqUXVlcnkgaGVyZSwgYnV0IHlvdSBjb3VsZCB1c2UgYSBkYXRhIGJpbmRpbmcgbGlicmFyeSBvciBvdGhlciBtZXRob2RzIGluc3RlYWQuXG4gICAgICAgICAgICB2YXIgbW9kYWwgPSAkKHRoaXMpO1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnLm1vZGFsLXRpdGxlJykudGV4dCgnTWVnZXLFkXPDrXTDqXMgJyk7XG4gICAgICAgICAgICBtb2RhbC5maW5kKCcubW9kYWwtYm9keScpLnRleHQoJ0JpenRvc2FuIHTDtnJsaSBhIGJlc3rDoWxsw610w7N0PycpO1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnLmJ1dHRvblllcycpLm9mZignY2xpY2snKTtcbiAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5idXR0b25ZZXMnKS5vbignY2xpY2snLHtpZDpyb3dEYXRhLmlkfSxyb290LmNsaWNrT3JkZXJEZWxldGVDb25maXJtZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCgnI2RpYWxvZ01vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGF0YWJsZVJvd0FjdGlvbkJ1dHRvbkNsaWNrPWZ1bmN0aW9uIChldmVudCl7XG4gICAgICAgIGRlYnVnKCdkYXRhdGFibGVSb3dBY3Rpb25CdXR0b25DbGljaycpO1xuICAgICAgICBsZXQgbm9kZT0kKGV2ZW50WzBdLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgcm93PSQoZGF0YVRhYmxlQ1NTU2VsZWN0b3IpLkRhdGFUYWJsZSgpLnJvdyhub2RlLnBhcmVudHMoJ3RyJykpO1xuICAgICAgICBsZXQgcm93RGF0YT1yb3cuZGF0YSgpO1xuICAgICAgICBsZXQgYWN0aW9uTmFtZT0nZGF0YXRhYmxlUm93QWN0aW9uJytub2RlLmRhdGEoJ2J1dHRvbnR5cGUnKS5jYXBpdGFsaXplKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdFthY3Rpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdFthY3Rpb25OYW1lXShyb3dEYXRhLG5vZGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluaXRWaWV3TGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zPXt9KSB7XG4gICAgICAgIGRlYnVnKCdsaXN0dmlldyBpbmljaWFsaXphdGlvbicpO1xuICAgICAgICBkYXRhVGFibGVDU1NTZWxlY3Rvcj1PcHRzLmNvbnRhaW5lckNzc1NlbGVjdG9yKycgLmRhdGFUYWJsZSc7IC8vXG5cbiAgICAgICAgbGV0IGNvbE51bT0kKGRhdGFUYWJsZUNTU1NlbGVjdG9yKycgdGhlYWQgdGgnKS5sZW5ndGg7IC8vYnV0dG9ucyBpbnNlcnQgcG9zaXRpb24gbmVlZFxuICAgICAgICBBUFAuc2V0T3B0cyh7XG4gICAgICAgICAgICBkYXRhdGFibGVBY3Rpb25CdXR0b25DbGlja0NhbGxCYWNrOnJvb3QuY2xpY2tOZXcsXG4gICAgICAgICAgICBkYXRhdGFibGVSb3dBY3Rpb25CdXR0b25DbGlja0NhbGxCYWNrOnJvb3QuZGF0YXRhYmxlUm93QWN0aW9uQnV0dG9uQ2xpY2ssXG5cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IG9yZGVyRGlyZWN0aXZlPU9wdHMuZGF0YVRhYmxlLm9yZGVyRGlyZWN0aXZlO1xuICAgICAgICBpZih0eXBlb2Ygb3B0aW9uc1snb3JkZXJEaXJlY3RpdmUnXSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgb3JkZXJEaXJlY3RpdmU9b3B0aW9uc1snb3JkZXJEaXJlY3RpdmUnXTtcbiAgICAgICAgfVxuICAgICAgICAkKGRhdGFUYWJsZUNTU1NlbGVjdG9yKS5EYXRhVGFibGUoIHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgICAgICAgICAgdXJsOiAnLy9jZG4uZGF0YXRhYmxlcy5uZXQvcGx1Zy1pbnMvMS4xMC4yNC9pMThuL0h1bmdhcmlhbi5qc29uJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9cImFqYXhcIjogXCJ7e2Fzc2V0KCdleGFwbWxlMi5qc29uJyl9fVwiLFxuICAgICAgICAgICAgXCJhamF4XCI6IE9wdHMuVVJMLmdldERhdGFUYWJsZUNvbnRlbnQsXG4gICAgICAgICAgICBcImNvbHVtbkRlZnNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0YXJnZXRzXCI6IGNvbE51bS0xLFxuICAgICAgICAgICAgICAgICAgICBcInJlbmRlclwiOiBmdW5jdGlvbiAoIGRhdGEsIHR5cGUsIHJvdyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25zPUFQUC5kYXRhdGFibGVBZGRSb3dUcmFzaEJ1dHRvbigwLGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zKz1BUFAuZGF0YXRhYmxlQWRkUm93RWRpdEJ1dHRvbigwLGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnV0dG9ucztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0YXJnZXRzXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmVuZGVyXCI6IGZ1bmN0aW9uICggZGF0YSwgdHlwZSwgcm93ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09IFwic29ydFwiID8gZGF0YS5sYXRpbmlzZSgpIDogZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8veyBcInZpc2libGVcIjogZmFsc2UsICBcInRhcmdldHNcIjogWyAwIF0gfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGJ1dHRvbnM6e1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2V4Y2VsJywncGRmJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kOiAncHJpbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy90ZXh0OiAnUHJpbnQgY3VycmVudCBwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0aXRsZSc6ICd0aXRsZSBjdXN0b20gdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZVRvcCc6ICdNZXNzYWdlIE9uIFRvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvUHJpbnQ6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLyoqL1xuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICfDmmogZmVsdml0ZWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2J0biBidG4tc3VjY2VzcyBuZXdJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYToxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjoyXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiduZXdJdGVtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSwgbm9kZSwgY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChub2RlKS5yZW1vdmVDbGFzcygndWktYnV0dG9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uICggZSwgZHQsIG5vZGUsIGNvbmZpZyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFAuZGF0YXRhYmxlQWN0aW9uQnV0dG9uQ2xpY2tDYWxsQmFjayhhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb25maWcpOyovXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwiaWRcIiB9LFxuICAgICAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwibmFtZVwiIH0sXG4gICAgICAgICAgICAgICAgeyBcImRhdGFcIjogXCJob29yZXljYUlkXCIgfSxcbiAgICAgICAgICAgICAgICB7IFwiZGF0YVwiOiBcIm5hbWVJZFwiIH0sXG4gICAgICAgICAgICAgICAgeyBcImRhdGFcIjogXCJjcmVhdGVkX2F0XCIgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwib3JkZXJcIjogb3JkZXJEaXJlY3RpdmUsXG4gICAgICAgICAgICBcInN0YXRlU2F2ZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24oIHNldHRpbmdzICkge1xuICAgICAgICAgICAgICAgIEFQUC5kYXRhdGFibGVBZGRSb3dBY3Rpb24oZGF0YVRhYmxlQ1NTU2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ICk7XG4gICAgICAgIGRlYnVnKCdsaXN0dmlldyBlbmQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9maWxsRGV0YWlscz1mdW5jdGlvbiAoKXtcbiAgICAgICAgZGVidWcoJ255ZXJlc3JlIGFsbHVuaycpO1xuICAgICAgICBsZXQgcmFuZG9tTnVtYmVyPWdldFJhbmRvbUludCg5OTk5KTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1uYW1lXScpLnZhbCgnQmVzemFsw610w7MnK3JhbmRvbU51bWJlcik7XG4gICAgICAgICQoJ2lucHV0W25hbWU9aG9vcmV5Y2FJZF0nKS52YWwoJ2hiJytyYW5kb21OdW1iZXIpO1xuICAgICAgICAkKCdpbnB1dFtuYW1lPW5hbWVJZF0nKS52YWwoJ2JlJytyYW5kb21OdW1iZXIpO1xuICAgICAgICAkKCdpbnB1dFtuYW1lPW9yZGVyRW1haWxdJykudmFsKCdrYXBjc29sYXQnK3JhbmRvbU51bWJlcisnQGJlc3phbGxpdG8uaHUnKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1vcmRlckVtYWlsMl0nKS52YWwoJ2luZm9ybWFjaW8nK3JhbmRvbU51bWJlcisnQGJlc3phbGxpdG8uaHUnKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1hZGRyZXNzXScpLnZhbCgnODk4OSBTdXBwbGllciB1dGNhICcrcmFuZG9tTnVtYmVyKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1tYWlsaW5nQWRkcmVzc10nKS52YWwoJzg5ODkgUG9zdGFpIMO6dCcrcmFuZG9tTnVtYmVyKTtcbiAgICAgICAgJCgnaW5wdXRbbmFtZT1waG9uZV0nKS52YWwoJyszNjMwMTIzNDU2NycpO1xuICAgICAgICAkKCdpbnB1dFtuYW1lPWZheF0nKS52YWwoJzM2MzA4ODg5OTk5Jyk7XG4gICAgICAgICQoJ2lucHV0W25hbWU9Y3VzdG9tZXJTZXJ2aWNlUGhvbmVdJykudmFsKCcrMzY3NjEyMzQ0NDQnKTtcbiAgICAgICAgJCgndGV4dGFyZWFbbmFtZT1ub3RlXScpLnZhbCgnTWVnamVneXplbSAnK3JhbmRvbU51bWJlcik7XG5cbiAgICB9XG4gICAgdGhpcy50ZXN0TW9kZT1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJyEhISF0ZXN0bW9kZSAhISEhJyk7XG4gICAgICAgIHJvb3QuU3VwcGxpZXIgPSBuZXcgd2luZG93LlN1cHBsaWVyKHtcbiAgICAgICAgICAgICdjb250YWN0JzpbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDoyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDozLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6J0vDs3NhIFZlcm9uaWthJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOidzemFtbGF6YXM0QGZ1bmtjaW8uaHUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmU6J3t7Zm9ybWF0dGVyUGhvbmVOdW1iZXIoXCIrMzYyMDQ1ODkxODBcIil9fSdcbiAgICAgICAgICAgIH1cbiovXG5cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgICAgIE9wdHMub25BZnRlckluaXRWaWV3RGV0YWlscz1yb290LmF1dG9maWxsRGV0YWlscztcbiAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChPcHRzLlVSTC5jcmVhdGUscm9vdC5pbml0Vmlld0RldGFpbHMpO1xuICAgIH1cbiAgICB0aGlzLmluaXQ9ZnVuY3Rpb24gKG9wdGlvbnMsU3VwcGxpZXJJdGVtKXtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYoT3B0cy50ZXN0TW9kZSl7XG4gICAgICAgICAgICByZXR1cm4gcm9vdC50ZXN0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKFN1cHBsaWVySXRlbSl7XG4gICAgICAgICAgICByb290LlN1cHBsaWVyPVN1cHBsaWVySXRlbVxuICAgICAgICB9XG4gICAgICAgIHJvb3QuaW5pdFZpZXdMaXN0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJBdHRhY2htZW50PWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgcm93TnVtPTE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdyZW5kZXJpbmdBdHRhY2htZW50Jyk7XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLmdldERhdGEoJ2F0dGFjaG1lbnQnKSxmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGxldCBhdHRhY2htZW50RGF0YT10aGlzO1xuICAgICAgICAgICAgYXR0YWNobWVudERhdGEucm93TnVtPXJvd051bTtcbiAgICAgICAgICAgIGRhdGU9bmV3IERhdGUoYXR0YWNobWVudERhdGEuY3JlYXRlZF9hdCk7XG4gICAgICAgICAgICBhdHRhY2htZW50RGF0YS5kYXRlPWRhdGUudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnREYXRhLmxpbms9YXR0YWNobWVudERhdGEuUHVibGljVXJsKycvJythdHRhY2htZW50RGF0YS5maWxlbmFtZTtcbiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZT0kKCd0ZW1wbGF0ZVtkYXRhLW5hbWU9XCJzdXBwbGllckF0dGFjaG1lbnRUYWJsZVJvd1wiXScpLmh0bWwoKVxuICAgICAgICAgICAgbGV0IHJlbmRlcj1NdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsYXR0YWNobWVudERhdGEpO1xuICAgICAgICAgICAgJCgnLmF0dGFjaG1lbnRUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICAgICAgcm93TnVtKys7XG4gICAgICAgIH0pO1xuICAgICAgICByb290LmJpbmRBdHRhY2htZW50Q2xpY2tBY3Rpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEF0dGFjaG1lbnQ9ZnVuY3Rpb24gKGF0dGFjaG1lbnREYXRhKXtcbiAgICAgICAgY29uc29sZS5sb2coYXR0YWNobWVudERhdGEpO1xuICAgICAgICBsZXQgQ1NTU2VsZWN0b3JGb3JtPU9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IrJyAuc3VwcGxpZXJGb3JtJztcbiAgICAgICAgcm9vdC5TdXBwbGllci5hdHRhY2htZW50LnB1c2goYXR0YWNobWVudERhdGEpO1xuICAgICAgICBhdHRhY2htZW50RGF0YS5yb3dOdW09cm9vdC5TdXBwbGllci5hdHRhY2htZW50Lmxlbmd0aDtcbiAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cInN1cHBsaWVyQXR0YWNobWVudFRhYmxlUm93XCJdJykuaHRtbCgpXG4gICAgICAgIGxldCByZW5kZXI9TXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLGF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAuYXR0YWNobWVudFRhYmxlIHRib2R5JykuYXBwZW5kKHJlbmRlcik7XG4gICAgICAgIHJvb3QuYmluZENvbnRhY3RDbGlja0FjdGlvbigpO1xuICAgICAgICBUb2FzdC5lbmFibGVUaW1lcnMoZmFsc2UpO1xuICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJGw6FqbCBob3p6w6FhZHZhIVwiLCBtZXNzYWdlOiBhdHRhY2htZW50RGF0YS5vcmlnaW5hbF9maWxlbmFtZStcIiBmw6FqbCBob3p6w6FhZHZhXCIsIHN0YXR1czogVE9BU1RfU1RBVFVTLlNVQ0NFU1MsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgfVxuXG5cbiAgICB0aGlzLnJlc2V0Q29udGFjdFRhYmxlPWZ1bmN0aW9uICgpe1xuICAgICAgICAkKCcuY29udGFjdFRhYmxlIHRib2R5IHRyJykucmVtb3ZlKCk7XG4gICAgICAgIHJvb3QucmVuZGVyQ29udGFjdCgpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckNvbnRhY3Q9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCByb3dOdW09MTtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlbmRlcmluZ0NvbnRhY3RzJyk7XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLmdldERhdGEoJ2NvbnRhY3QnKSxmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGxldCBjb250YWN0RGF0YT10aGlzO1xuICAgICAgICAgICAgY29udGFjdERhdGEucm93TnVtPXJvd051bTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coY29udGFjdERhdGEpO1xuICAgICAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cInN1cHBsaWVyQ29udGFjdFRhYmxlUm93XCJdJykuaHRtbCgpXG4gICAgICAgICAgICBsZXQgcmVuZGVyPU11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSxjb250YWN0RGF0YSk7XG4gICAgICAgICAgICAkKCcuY29udGFjdFRhYmxlIHRib2R5JykuYXBwZW5kKHJlbmRlcik7XG4gICAgICAgICAgICByb3dOdW0rKztcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QuYmluZENvbnRhY3RDbGlja0FjdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuYmluZENvbnRhY3RDbGlja0FjdGlvbiA9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBub2RlPSQoJy5jb250YWN0VGFibGUgLmJ1dHRvbkRlbGV0ZScpO1xuICAgICAgICBub2RlLnVuYmluZCgnY2xpY2snKTtcbiAgICAgICAgbm9kZS5iaW5kKCdjbGljaycscm9vdC5jb250YWN0RGVsZXRlQ2xpY2spO1xuXG4gICAgICAgIG5vZGU9JCgnLmNvbnRhY3RUYWJsZSAuYnV0dG9uRWRpdCcpO1xuICAgICAgICBub2RlLnVuYmluZCgnY2xpY2snKTtcbiAgICAgICAgbm9kZS5iaW5kKCdjbGljaycscm9vdC5jb250YWN0RWRpdENsaWNrKTtcblxuICAgIH1cblxuICAgIHRoaXMuYmluZEF0dGFjaG1lbnRDbGlja0FjdGlvbj1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IG5vZGU9JCgnLmF0dGFjaG1lbnRUYWJsZSAuYnV0dG9uRGVsZXRlJyk7XG4gICAgICAgIG5vZGUudW5iaW5kKCdjbGljaycpO1xuICAgICAgICBub2RlLmJpbmQoJ2NsaWNrJyxyb290LmF0dGFjaG1lbnREZWxldGVDbGljayk7XG4gICAgfVxuICAgIGxldCBjdXJyZW50QXR0YWNobWVudFJvdz1mYWxzZTtcbiAgICB0aGlzLmF0dGFjaG1lbnREZWxldGVDbGljaz1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICBsZXQgcm93PSQodGhpcykuY2xvc2VzdCgndHInKTtcbiAgICAgICAgbGV0IGlkPXJvdy5maW5kKCdpbnB1dFtuYW1lPWF0dGFjaG1lbnRJZF0nKS52YWwoKTtcbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuZGV0YWNoRmlsZS5yZXBsYWNlKCclaWQlJyxyb290LlN1cHBsaWVyLmlkKTtcbiAgICAgICAgLy9sZXQgZGF0YT0gbmV3IEZvcm1EYXRhKCQoT3B0cy5jb250YWluZXJDc3NTZWxlY3RvcikuZmluZCgnZm9ybS5zdXBwbGllckZvcm0nKVswXSk7XG4gICAgICAgIC8vZGF0YS5hcHBlbmQoZmlsZUlucHV0LmF0dHIoJ25hbWUnKSxmaWxlSW5wdXRbMF0uZmlsZXNbMF0pO1xuICAgICAgICBsZXQgZGF0YT17fTtcbiAgICAgICAgZGF0YS5fdG9rZW49JCgnaW5wdXRbbmFtZT1cIl90b2tlblwiXScpLnZhbCgpO1xuICAgICAgICBkYXRhLmF0dGFjaGVtbnRJZD1pZDtcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDphamF4VXJsLFxuICAgICAgICAgICAgZGF0YTpkYXRhLFxuICAgICAgICAgICAgdHlwZTonUE9TVCcsXG4gICAgICAgICAgICAvL2NvbnRlbnRUeXBlOmZhbHNlLFxuICAgICAgICAgICAgLy9wcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3M9PXRydWUpe1xuICAgICAgICAgICAgICAgICAgICByb290LlN1cHBsaWVyLmF0dGFjaG1lbnQ9cm9vdC5TdXBwbGllci5hdHRhY2htZW50LmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSxpbmRleCxhcnIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pZCE9PWRhdGEuZGF0YS4gICBhdHRhY2htZW50LmlkKjEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgLy9yb3cucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QucmVzZXRBdHRhY2htZW50VGFibGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLnJlc3BvbnNlSlNPTik7XG4gICAgICAgICAgICAgICAgcm9vdC5zZWxlY3RlZFVwbG9hZEZpbGVUb2dnbGUoKTtcbiAgICAgICAgICAgICAgICBhamF4RXJyb3JGaWVsZEhhbmRsZXIoZGF0YS5yZXNwb25zZUpTT04uZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgfVxuXG5cbiAgICB0aGlzLnJlc2V0QXR0YWNobWVudFRhYmxlPWZ1bmN0aW9uICgpe1xuICAgICAgICAkKCcuYXR0YWNobWVudFRhYmxlIHRib2R5IHRyJykucmVtb3ZlKCk7XG4gICAgICAgIHJvb3QucmVuZGVyQXR0YWNobWVudCgpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFjdERlbGV0ZUNsaWNrPWZ1bmN0aW9uIChldmVudCl7XG4gICAgICAgIGxldCByb3c9JCh0aGlzKS5jbG9zZXN0KCd0cicpO1xuICAgICAgICBsZXQgaWQ9cm93LmZpbmQoJ2lucHV0W25hbWU9Y29udGFjdElkXScpLnZhbCgpO1xuICAgICAgICByb290LlN1cHBsaWVyLmNvbnRhY3Q9cm9vdC5TdXBwbGllci5jb250YWN0LmZpbHRlcihcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSxpbmRleCxhcnIpe1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pZCE9PWlkKjEpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcm93LnJlbW92ZSgpO1xuICAgICAgICByb290LnJlc2V0Q29udGFjdFRhYmxlKCk7XG4gICAgfVxuICAgIHJvb3QuZ2V0Q29udGFjdFBvcHVwV29ya2Zsb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjb250YWN0UG9wdXBXb3JrZmxvdztcbiAgICB9XG4gICAgcm9vdC5zZXRDb250YWN0UG9wdXBXb3JrZmxvdyA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgY29udGFjdFBvcHVwV29ya2Zsb3c9c3RhdHVzO1xuICAgIH1cblxuXG4gICAgdGhpcy5jb250YWN0RWRpdENsaWNrPWZ1bmN0aW9uIChldmVudCl7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcyk7XG4gICAgICAgIGxldCByb3c9JCh0aGlzKS5jbG9zZXN0KCd0cicpO1xuICAgICAgICBsZXQgaWQ9cm93LmZpbmQoJ2lucHV0W25hbWU9Y29udGFjdElkXScpLnZhbCgpO1xuICAgICAgICByb290LnNldENvbnRhY3RQb3B1cFdvcmtmbG93KCdlZGl0Jyk7XG4gICAgICAgIEFQUC5Db250YWN0UG9wVXAubG9hZERhdGEoaWQpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0U3VwcGxpZXI9ZnVuY3Rpb24gKCl7XG4gICAgICAgIHJldHVybiByb290LlN1cHBsaWVyO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhY3RBY3Rpb249ZnVuY3Rpb24gKGNvbnRhY3REYXRhKXtcbiAgICAgICAgY29uc29sZS5sb2coJ25haCBtb3N0IGtlbGxlbmUgbWVnIHZhbGFtaXQgY3NpbmFsbmkuJylcbiAgICAgICAgaWYocm9vdC5nZXRDb250YWN0UG9wdXBXb3JrZmxvdygpPT0nbmV3Jyl7XG4gICAgICAgICAgICByb290LmFkZENvbnRhY3QoY29udGFjdERhdGEpO1xuICAgICAgICB9ZWxzZSBpZihyb290LmdldENvbnRhY3RQb3B1cFdvcmtmbG93KCk9PSdlZGl0Jyl7XG4gICAgICAgICAgICByb290LmVkaXRDb250YWN0KGNvbnRhY3REYXRhLmlkLGNvbnRhY3REYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZWRpdENvbnRhY3Q9ZnVuY3Rpb24gKGlkLGNvbnRhY3REYXRhKXtcblxuICAgICAgICBsZXQgbmV3Q29udGFjdHM9W107XG4gICAgICAgICQuZWFjaChyb290LlN1cHBsaWVyLmdldERhdGEoJ2NvbnRhY3QnKSxmdW5jdGlvbiAoaW5kZXgpe1xuICAgICAgICAgICAgaWYodGhpcy5pZD09aWQpe1xuICAgICAgICAgICAgICAgIG5ld0NvbnRhY3RzLnB1c2goY29udGFjdERhdGEpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgbmV3Q29udGFjdHMucHVzaCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QuU3VwcGxpZXIuY29udGFjdD1uZXdDb250YWN0cztcbiAgICAgICAgcm9vdC5yZXNldENvbnRhY3RUYWJsZSgpO1xuICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJLYXBjc29sYXQgYWRhdGFpIG3Ds2Rvc8OtdHZhIVwiLCBtZXNzYWdlOiBjb250YWN0RGF0YS5uYW1lK1wiIG5ldsWxIGthcGNzb2xhdHRhcnTDsyBtw7Nkb3PDrXR2YVwiLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5TVUNDRVNTLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIH1cbiAgICB0aGlzLmFkZENvbnRhY3Q9ZnVuY3Rpb24gKGNvbnRhY3REYXRhKXtcbiAgICAgICAgLypcbiAgICAgICAgZmVsIGtlbGwgdmVubmkgYSBzb3JiYVxuICAgICAgICAgKi9cbiAgICAgICAgcm9vdC5TdXBwbGllci5jb250YWN0LnB1c2goY29udGFjdERhdGEpO1xuICAgICAgICBjb250YWN0RGF0YS5yb3dOdW09cm9vdC5TdXBwbGllci5jb250YWN0Lmxlbmd0aDtcbiAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cInN1cHBsaWVyQ29udGFjdFRhYmxlUm93XCJdJykuaHRtbCgpXG4gICAgICAgIGxldCByZW5kZXI9TXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLGNvbnRhY3REYXRhKTtcbiAgICAgICAgJCgnLmNvbnRhY3RUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICByb290LmJpbmRDb250YWN0Q2xpY2tBY3Rpb24oKTtcbiAgICAgICAgVG9hc3QuZW5hYmxlVGltZXJzKGZhbHNlKTtcbiAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiS2FwY3NvbGF0dGFydMOzIGhvenrDoWFkdmEhXCIsIG1lc3NhZ2U6IGNvbnRhY3REYXRhLm5hbWUrXCIgbmV2xbEga2FwY3NvbGF0dGFydMOzIGhvenrDoWFkdmFcIiwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuU1VDQ0VTUywgdGltZW91dDogNTAwMCB9KTtcbiAgICB9XG5cblxuICAgIHRoaXMucmVzZXRVc2VyVGFibGU9ZnVuY3Rpb24gKCl7XG4gICAgICAgICQoJy5zdXBwbGllclVzZXJUYWJsZSB0Ym9keSB0cicpLnJlbW92ZSgpO1xuICAgICAgICByb290LnJlbmRlclVzZXJzKCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyVXNlcnM9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCByb3dOdW09MTtcbiAgICAgICAgbGV0IHVzZXJzPXJvb3QuU3VwcGxpZXIudXNlcnN8fFtdO1xuICAgICAgICAkLmVhY2godXNlcnMsZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBsZXQgdXNlckRhdGE9JC5leHRlbmQoe30sdGhpcyk7XG4gICAgICAgICAgICB1c2VyRGF0YS5yb3dOdW09cm93TnVtO1xuICAgICAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cInN1cHBsaWVyVXNlclRhYmxlUm93XCJdJykuaHRtbCgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcj1NdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsdXNlckRhdGEpO1xuICAgICAgICAgICAgJCgnLnN1cHBsaWVyVXNlclRhYmxlIHRib2R5JykuYXBwZW5kKHJlbmRlcik7XG4gICAgICAgICAgICByb3dOdW0rKztcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QuYmluZFVzZXJDbGlja0FjdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmJpbmRVc2VyQ2xpY2tBY3Rpb249ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBub2RlPSQoJy5zdXBwbGllclVzZXJUYWJsZSAuYnV0dG9uRGVsZXRlJyk7XG4gICAgICAgIG5vZGUudW5iaW5kKCdjbGljaycpO1xuICAgICAgICBub2RlLmJpbmQoJ2NsaWNrJyxyb290LnVzZXJEZWxldGVDbGljayk7XG4gICAgfVxuICAgIHRoaXMudXNlckRlbGV0ZUNsaWNrPWZ1bmN0aW9uICgpe1xuICAgICAgICBsZXQgcm93PSQodGhpcykuY2xvc2VzdCgndHInKTtcbiAgICAgICAgbGV0IGlkPXJvdy5maW5kKCdpbnB1dFtuYW1lPXVzZXJJZF0nKS52YWwoKSoxO1xuICAgICAgICByb290LlN1cHBsaWVyLnVzZXJzPXJvb3QuU3VwcGxpZXIudXNlcnMuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSl7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuaWQhPT1pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5yZW1vdmUoKTtcbiAgICAgICAgcm9vdC5yZXNldFVzZXJUYWJsZSgpO1xuICAgIH1cbiAgICB0aGlzLmFkZFVzZXI9ZnVuY3Rpb24gKHVzZXJEYXRhKXtcbiAgICAgICAgaWYoIXJvb3QuU3VwcGxpZXIudXNlcnMpeyByb290LlN1cHBsaWVyLnVzZXJzPVtdOyB9XG4gICAgICAgIGxldCBhbHJlYWR5QWRkZWQ9cm9vdC5TdXBwbGllci51c2Vycy5zb21lKGZ1bmN0aW9uKHUpeyByZXR1cm4gdS5pZD09PXVzZXJEYXRhLmlkOyB9KTtcbiAgICAgICAgaWYoYWxyZWFkeUFkZGVkKXsgcmV0dXJuOyB9XG4gICAgICAgIHJvb3QuU3VwcGxpZXIudXNlcnMucHVzaCh1c2VyRGF0YSk7XG4gICAgICAgIHVzZXJEYXRhLnJvd051bT1yb290LlN1cHBsaWVyLnVzZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cInN1cHBsaWVyVXNlclRhYmxlUm93XCJdJykuaHRtbCgpO1xuICAgICAgICBsZXQgcmVuZGVyPU11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSx1c2VyRGF0YSk7XG4gICAgICAgICQoJy5zdXBwbGllclVzZXJUYWJsZSB0Ym9keScpLmFwcGVuZChyZW5kZXIpO1xuICAgICAgICByb290LmJpbmRVc2VyQ2xpY2tBY3Rpb24oKTtcbiAgICAgICAgVG9hc3QuZW5hYmxlVGltZXJzKGZhbHNlKTtcbiAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6ICdGZWxoYXN6bsOhbMOzIGhvenrDoWFkdmEhJywgbWVzc2FnZTogdXNlckRhdGEubmFtZSsnIGhvenrDoXJlbmRlbHZlJywgc3RhdHVzOiBUT0FTVF9TVEFUVVMuU1VDQ0VTUywgdGltZW91dDogMzAwMCB9KTtcbiAgICB9XG4gICAgdGhpcy5pbml0VXNlckNyZWF0ZT1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IGNyZWF0ZVVybD1PcHRzLlVSTC5jcmVhdGVVc2VyfHwnJztcbiAgICAgICAgbGV0IGNvbnRhaW5lcj0kKE9wdHMuY29udGFpbmVyQ3NzU2VsZWN0b3IpO1xuICAgICAgICBmdW5jdGlvbiBjbGVhckZvcm0oKXtcbiAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyTmFtZScpLnZhbCgnJyk7XG4gICAgICAgICAgICBjb250YWluZXIuZmluZCgnLnN1cHBsaWVyTmV3VXNlckVtYWlsJykudmFsKCcnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyUGFzc3dvcmQnKS52YWwoJycpO1xuICAgICAgICAgICAgY29udGFpbmVyLmZpbmQoJy5zdXBwbGllck5ld1VzZXJFcnJvcicpLmhpZGUoKS50ZXh0KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluZXIuZmluZCgnLmJ1dHRvbkNyZWF0ZVVzZXInKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxmdW5jdGlvbigpe1xuICAgICAgICAgICAgbGV0IG5hbWU9Y29udGFpbmVyLmZpbmQoJy5zdXBwbGllck5ld1VzZXJOYW1lJykudmFsKCkudHJpbSgpO1xuICAgICAgICAgICAgbGV0IGVtYWlsPWNvbnRhaW5lci5maW5kKCcuc3VwcGxpZXJOZXdVc2VyRW1haWwnKS52YWwoKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcGFzc3dvcmQ9Y29udGFpbmVyLmZpbmQoJy5zdXBwbGllck5ld1VzZXJQYXNzd29yZCcpLnZhbCgpO1xuICAgICAgICAgICAgbGV0IGVycm9yRWw9Y29udGFpbmVyLmZpbmQoJy5zdXBwbGllck5ld1VzZXJFcnJvcicpO1xuICAgICAgICAgICAgZXJyb3JFbC5oaWRlKCkudGV4dCgnJyk7XG4gICAgICAgICAgICBpZighbmFtZXx8IWVtYWlsfHwhcGFzc3dvcmQpe1xuICAgICAgICAgICAgICAgIGVycm9yRWwudGV4dCgnTWluZGVuIG1lesWRIGtpdMO2bHTDqXNlIGvDtnRlbGV6xZEhJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOmNyZWF0ZVVybCxcbiAgICAgICAgICAgICAgICB0eXBlOidQT1NUJyxcbiAgICAgICAgICAgICAgICBkYXRhOntuYW1lOm5hbWUsIGVtYWlsOmVtYWlsLCBwYXNzd29yZDpwYXNzd29yZH0sXG4gICAgICAgICAgICAgICAgaGVhZGVyczp7J1gtQ1NSRi1UT0tFTic6ICQoJ2lucHV0W25hbWU9XCJfdG9rZW5cIl0nKS52YWwoKX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuYWRkVXNlcihkYXRhLnVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJGb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JFbC50ZXh0KCdIaWJhIHTDtnJ0w6ludCBhIGZlbGhhc3puw6Fsw7MgbMOpdHJlaG96w6FzYWtvciEnKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOmZ1bmN0aW9uKHhocil7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c9J0hpYmEgdMO2cnTDqW50ISc7XG4gICAgICAgICAgICAgICAgICAgIGlmKHhoci5yZXNwb25zZUpTT04mJnhoci5yZXNwb25zZUpTT04uZXJyb3JzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvcnM9eGhyLnJlc3BvbnNlSlNPTi5lcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RLZXk9T2JqZWN0LmtleXMoZXJyb3JzKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZz1lcnJvcnNbZmlyc3RLZXldWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yRWwudGV4dChtc2cpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3RydWN0KG9wdGlvbnMsU3VwcGxpZXJJdGVtKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFHLE9BQU9BLFFBQVEsS0FBRyxXQUFXLEVBQUM7RUFBQSxJQUN2QkEsU0FBUSwwQkFBQUMsVUFBQTtJQUVWO0FBQ1I7QUFDQTtJQUNRLFNBQUFDLFVBQWFDLElBQUksRUFBQ0MsT0FBTyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUFBQyxlQUFBLE9BQUFKLFNBQUE7TUFDdkJHLEtBQUEsR0FBQUUsVUFBQSxPQUFBTCxTQUFBLEdBQU1DLElBQUksRUFBQ0MsT0FBTztNQUNsQixJQUFHLE9BQU9DLEtB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QyxDQUFDcEgsSUFBSSxDQUFDLENBQUM7UUFDdEQ7TUFDSjtNQUNBZSxDQUFDLENBQUNpRCxJQUFJLENBQUM7UUFDSEMsR0FBRyxFQUFDbUssU0FBUztRQUNibEssSUFBSSxFQUFDLE1BQU07UUFDWDVGLElBQUksRUFBQztVQUFDNEcsSUFBSSxFQUFDQSxJQUFJO1VBQUVxSixLQUFLLEVBQUNBLEtBQUs7VUFBRUMsUUFBUSxFQUFDQTtRQUFRLENBQUM7UUFDaERuSyxPQUFPLEVBQUM7VUFBQyxjQUFjLEVBQUV0RCxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQzBCLEdBQUcsQ0FBQztRQUFDLENBQUM7UUFDekQ2QixPQUFPLEVBQUMsU0FBUkEsT0FBT0EsQ0FBVWhHLElBQUksRUFBQztVQUNsQixJQUFHQSxJQUFJLENBQUNnRyxPQUFPLEVBQUM7WUFDWjFELElBQUksQ0FBQ29OLE9BQU8sQ0FBQzFQLElBQUksQ0FBQ29RLElBQUksQ0FBQztZQUN2QkosU0FBUyxDQUFDLENBQUM7VUFDZixDQUFDLE1BQUk7WUFDREcsT0FBTyxDQUFDckgsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUNwSCxJQUFJLENBQUMsQ0FBQztVQUNyRTtRQUNKLENBQUM7UUFDRHVJLEtBQUssRUFBQyxTQUFOQSxLQUFLQSxDQUFVb0csR0FBRyxFQUFDO1VBQ2YsSUFBSUMsR0FBRyxHQUFDLGVBQWU7VUFDdkIsSUFBR0QsR0FBRyxDQUFDbkcsWUFBWSxJQUFFbUcsR0FBRyxDQUFDbkcsWUFBWSxDQUFDcUcsTUFBTSxFQUFDO1lBQ3pDLElBQUlBLE1BQU0sR0FBQ0YsR0FBRyxDQUFDbkcsWUFBWSxDQUFDcUcsTUFBTTtZQUNsQyxJQUFJQyxRQUFRLEdBQUNDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkNELEdBQUcsR0FBQ0MsTUFBTSxDQUFDQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDM0I7VUFDQUwsT0FBTyxDQUFDckgsSUFBSSxDQUFDd0gsR0FBRyxDQUFDLENBQUM1TyxJQUFJLENBQUMsQ0FBQztRQUM1QjtNQUNKLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztFQUNOLENBQUM7RUFDRCxJQUFJLENBQUNjLFNBQVMsQ0FBQ3ZDLE9BQU8sRUFBQ2lCLFlBQVksQ0FBQztBQUN4QyxDQUFDIiwiaWdub3JlTGlzdCI6W10sImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbi9zdXBwbGllci5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/admin/supplier.js\n\n}"); /***/ } diff --git a/public/js/module.js b/public/js/module.js index 0e89aa0..00e4529 100644 --- a/public/js/module.js +++ b/public/js/module.js @@ -25,7 +25,7 @@ eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"fun \****************************************/ () { -eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nwindow.OrderModulDefault = {\n actionFunction: function actionFunction() {}\n};\nvar DataModelOrder = /*#__PURE__*/function (_DataModel) {\n /*\n * Constructor\n */\n function DataModelOrder(data, options) {\n var _this;\n _classCallCheck(this, DataModelOrder);\n _this = _callSuper(this, DataModelOrder, [data, options]);\n if (typeof _this.productSelected === \"undefined\") {\n _this.productSelected = {};\n }\n if (typeof _this.productComment === \"undefined\") {\n _this.productComment = {};\n }\n console.log(_this.constructor.name + ' constructor called');\n return _this;\n }\n _inherits(DataModelOrder, _DataModel);\n return _createClass(DataModelOrder);\n}(DataModel);\n;\nwindow.DataModelOrder = DataModelOrder;\nwindow.Stepper = function () {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n complete: ['supplier'],\n available: ['supplier', 'parameter', 'productSelect', 'invoice', 'send'],\n enable: ['supplier', 'invoice'],\n load: [],\n excludeLoaded: ['invoice', 'send'],\n loaded: [],\n active: false,\n URL: {\n create: ''\n },\n UrlData: false,\n onAfterLoad: function onAfterLoad() {},\n onAfterActivate: function onAfterActivate() {},\n autoCallback: {\n 'invoice': {\n onAfterActivate: function onAfterActivate() {}\n },\n 'send': {\n onAfterActivate: function onAfterActivate() {}\n }\n },\n nowLoaded: false\n };\n var root = this;\n /*\n * Constructor\n */\n this.construct = function (options) {\n $.extend(Opts, options);\n };\n this.getOpts = function () {\n return Opts;\n };\n this.setOpts = function (options) {\n $.extend(Opts, options);\n };\n this.init = function (options) {\n $.extend(Opts, options);\n debug(Opts);\n $('.step').each(function () {\n var stepName = $(this).data('stepname');\n if (Opts.complete.includes(stepName)) {\n root.setCompleted(stepName);\n }\n if (Opts.enable.includes(stepName)) {\n root.setEnabled(stepName);\n }\n if (Opts.load.includes(stepName)) {\n root.loadStepContent(stepName);\n }\n if (Opts.active === stepName) {\n root.setActive(stepName);\n }\n });\n root.bindClickAction();\n };\n this.bindClickAction = function () {\n var stepClickButtons = $('.stepClick');\n stepClickButtons.off('click');\n stepClickButtons.on('click', root.stepClick);\n };\n this.setCompleted = function (stepName) {\n console.log(stepName + ' completed');\n $('.step[data-stepName=\"' + stepName + '\"]').addClass('completed');\n };\n this.unsetCompleted = function (stepName) {\n console.log(stepName + ' Uncompleted');\n $('.step[data-stepName=\"' + stepName + '\"]').removeClass('completed');\n Opts.complete = arrayRemove(Opts.complete, stepName);\n };\n this.unsetEnabled = function (stepName) {\n console.log(stepName + ' Un enabled');\n $('.click' + stepName).contents().unwrap();\n Opts.enable = arrayRemove(Opts.enable, stepName);\n };\n this.setEnabled = function (stepName) {\n console.log(stepName + ' enabled');\n var stepItem = $('.step[data-stepName=\"' + stepName + '\"]');\n stepItem.html('' + stepItem.html() + '');\n root.bindClickAction();\n //$('.stepClick').click(root.stepClick);\n };\n this.addEnabled = function (stepName) {\n if (!Opts.enable.includes(stepName)) {\n Opts.enable.push(stepName);\n }\n root.setEnabled(stepName);\n };\n this.addCompleted = function (stepName) {\n if (!Opts.complete.includes(stepName)) {\n Opts.complete.push(stepName);\n }\n root.setCompleted(stepName);\n root.bindClickAction();\n };\n this.loadStepContent = function (stepName) {\n var data = {\n 'type': stepName\n };\n $.extend(data, Opts.UrlData);\n $.ajax({\n async: true,\n type: \"GET\",\n url: Opts.URL.create,\n data: data,\n cache: false,\n success: function success(result) {\n var container = $('.SC' + stepName.capitalize());\n if ($.inArray(stepName, Opts.excludeLoaded) == -1) {\n Opts.loaded.push(stepName);\n } else {\n console.log('excluded View');\n }\n container.html(result);\n if (Opts.nowLoaded) {\n Opts.nowLoaded(stepName);\n }\n Opts.onAfterLoad();\n }\n });\n };\n this.clearLoaded = function () {\n Opts.loaded = ['supplier'];\n $('.stepContainer').each(function () {\n /*\n console.log(this.classList);\n console.log(this.classList.contains('SCSupplier'));\n console.log($(this).attr('class'));\n */\n if (!this.classList.contains('SCSupplier')) {\n $(this).html('');\n }\n });\n };\n this.setActiveFinish = function (stepName) {\n var container = $('.SC' + stepName.capitalize());\n if (stepName === 'productSelect') {\n $('.containerStepper').addClass('activeSideBar');\n } else {\n $('.containerStepper').removeClass('activeSideBar');\n }\n debug('setActiveFinish show:' + stepName);\n container.show();\n Opts.nowLoaded = false;\n root.active = stepName;\n Opts.onAfterActivate();\n if (typeof Opts.autoCallback[stepName] !== 'undefined') {\n Opts.autoCallback[stepName].onAfterActivate();\n }\n };\n this.setActive = function (stepName) {\n $('.stepContainer').hide();\n if (!Opts.loaded.includes(stepName)) {\n root.loadStepContent(stepName);\n Opts.nowLoaded = this.setActiveFinish;\n } else {\n this.setActiveFinish(stepName);\n }\n };\n this.stepClick = function (event) {\n event.preventDefault();\n var stepName = $(event.currentTarget).data('stepname');\n console.log('setActive:' + stepName);\n root.setActive(stepName);\n };\n};\nwindow.OrderModule = function () {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n testMode: false,\n needStepper: true,\n CSSSelectorForm: '.orderParameterForm',\n defaultDeliveryDate: '',\n dataSyncPauseTime: 500,\n token: null,\n URL: {\n root: null,\n getDataTableContentProductList: null,\n checkReadyToSend: null,\n index: null,\n show: null,\n edit: null,\n create: null,\n store: null,\n update: null,\n destroy: null,\n toggleFavorites: null\n }\n };\n var PublicVar = {};\n var PublicVar2 = {\n 'asd': '21'\n };\n var ApiToken = null;\n var Order = null;\n var root = this;\n var viewInicialized = [];\n this.setOpts = function (options) {\n $.extend(Opts, options);\n };\n this.getOpts = function () {\n return Opts;\n };\n this.clickOrderEdit = function (data) {\n debug('clickEdit');\n debug(data);\n var ajaxUrl = Opts.URL.edit.replace('%id%', data.id);\n APP.loadMainContent(ajaxUrl);\n /* let ajaxData={};\n ajaxData._token=Opts.token;\n $.extend(ajaxData,Order);\n let ajaxUrl=Opts.URL.edit.replace('%id%',data.id);\n $.ajax({\n url: ajaxUrl,\n method:'GET',\n data:ajaxData,\n success:function (response) {\n if(response.success){\n let orderData=response.data;\n orderData.supplierId=orderData.supplier_id;\n delete(orderData.supplier_id);\n root.initOrder(orderData);\n root.initStepper();\n //root.afterOrderSetSupplierOk(data.data);\n }\n }\n });*/\n };\n this.afterOrderDeleted = function (data) {\n if (data.success == true) {\n debug('Order delete success');\n APP.loadMainContent(Opts.URL.index);\n } else {\n Toast.create({\n title: \"Error deleted !\",\n message: '',\n status: TOAST_STATUS.DANGER,\n timeout: 5000\n });\n }\n };\n this.clickOrderDeleteConfirmed = function (event) {\n debug('clickOrderDeleteConfirmed');\n debug(event);\n debug(event.data);\n $('#dialogModal').modal('hide');\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var ajaxUrl = Opts.URL.destroy.replace('%id%', event.data.id);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n method: \"DELETE\",\n success: root.afterOrderDeleted\n //error:ajaxErrorHandler\n });\n };\n this.initViewOrderSelect = function () {\n debug('called initViewOrderSelect ');\n $('.ordersSelectTable button').off('click');\n $('.ordersSelectTable button').on('click', function () {\n var action = $(this).data('action');\n var orderId = $($(this).closest('tr')[0]).data('orderid');\n debug(action);\n debug(orderId);\n if (action == 'delete') {\n $('#dialogModal').on('show.bs.modal', function (event) {\n // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).\n // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.\n var modal = $(this);\n modal.find('.modal-title').text('Megerősítés ');\n modal.find('.modal-body').text('Biztosan törli a megrendelést?');\n modal.find('.buttonYes').off('click');\n modal.find('.buttonYes').on('click', {\n id: orderId\n }, root.clickOrderDeleteConfirmed);\n });\n $('#dialogModal').modal('show');\n } else {\n root.clickOrderEdit({\n id: orderId\n });\n }\n });\n $('.buttonNew').off('click');\n $('.buttonNew').on('click', function () {\n APP.loadMainContent(Opts.URL.index, 'force=true');\n });\n };\n this.initStepper = function () {\n debug(Order.getData());\n viewInicialized = [];\n $('.statusNamePlace').text('Nincs elküldve');\n $('.statusNamePlace').addClass('statusBlink');\n root.setDeliveryDate('-');\n root.setSupplier('-');\n var unEnabled = ['parameter', 'productSelect', 'invoice', 'send'];\n $.each(unEnabled, function (index, value) {\n root.Stepper.unsetEnabled(value);\n root.Stepper.unsetCompleted(value);\n });\n debug(root.Stepper.getOpts()['available']);\n debug(Order.getData()['orderStatus']);\n var stepActive = 'supplier';\n var stepComplete = ['supplier'];\n var stepEnable = [];\n var stepOnAfterActivate = function stepOnAfterActivate() {};\n var avalaibleSteps = root.Stepper.getOpts()['available'];\n var stepUrlData = false;\n var stepAutoCallback = [];\n var _iterator = _createForOfIteratorHelper(avalaibleSteps),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _stepName = _step.value;\n stepOnAfterActivate = this['initView' + _stepName.capitalize()];\n var item = {};\n item['onAfterActivate'] = stepOnAfterActivate;\n stepAutoCallback[_stepName] = item;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n debug(stepAutoCallback);\n debug(Order.getData()['id']);\n if (Order.getData()['id'] > 0) {\n debug('hajra');\n debug(Order.getData());\n if (Order.getData()['deliveryDate']) {\n root.setDeliveryDate(Order.getData()['deliveryDate']);\n /*\n @todo: weekly-t beallitani\n */\n }\n if (Order.getData()['supplierName']) {\n root.setSupplier(Order.getData()['supplierName']);\n }\n stepUrlData = {\n 'supplierId': Order.supplierId,\n id: Order.id\n };\n var _iterator2 = _createForOfIteratorHelper(avalaibleSteps),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var stepName = _step2.value;\n console.log(stepName);\n stepComplete.push(stepName);\n stepEnable.push(stepName);\n if (Order.getData()['orderStatus'] == stepName) {\n stepActive = stepName;\n /*\n debug('initView'+stepName.capitalize());\n if(stepName!=='invoice' && stepName!=='send'){\n stepOnAfterActivate=this['initView'+stepName.capitalize()];\n }else{\n stepOnAfterActivate=function (){};\n }\n */\n break;\n }\n }\n\n /*\n //refactored for loop\n var BreakException = {};\n try {\n avalaibleSteps.forEach(function(stepName) {\n console.log(stepName);\n stepComplete.push(stepName);\n stepEnable.push(stepName);\n if(Order.getData()['orderStatus']==stepName){\n stepActive=stepName;\n throw BreakException;\n }\n \n });\n } catch (e) {\n if (e !== BreakException) throw e;\n }*/\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n root.Stepper.init({\n complete: stepComplete,\n enable: stepEnable,\n loaded: [],\n active: stepActive,\n URL: {\n create: Opts.URL.create\n },\n UrlData: stepUrlData,\n onAfterActivate: stepOnAfterActivate,\n autoCallback: stepAutoCallback\n /*{\n invoice: {\n onAfterActivate:root.initViewInvoice\n },\n send: {\n onAfterActivate:root.initViewSend\n },\n }*/\n });\n };\n this.initOrder = function (data) {\n Order = new DataModelOrder(data);\n };\n this.init = function (options) {\n debug('OrderModul init called');\n $.extend(Opts, window.OrderModulDefault, options);\n Order = new DataModelOrder();\n if (Opts.needStepper) {\n if (typeof this.Stepper == 'undefined') {\n this.Stepper = new Stepper();\n }\n }\n if (Opts.testMode) {\n return root.testMode();\n }\n };\n this.setSupplier = function (supplierName, supplierId) {\n if (supplierName) {\n $('.supplierNamePlace').text(supplierName);\n }\n if (supplierId) {\n Order.setData({\n supplierId: supplierId\n });\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': supplierId\n }\n });\n }\n };\n this.setDeliveryDate = function (dateText, dateTextTo) {\n var dateTextHuman = dateText.replaceAll('-', '.') + '.';\n if (dateTextHuman.length < 5) {\n $('.deliveryDatePlace').text(dateText);\n return;\n }\n if (dateTextTo) {\n dateTextHuman += ' - ' + dateTextTo.replaceAll('-', '.') + '.';\n }\n $(Opts.CSSSelectorForm + ' .selectedDateText').text(dateTextHuman);\n $('.deliveryDatePlace').text(dateTextHuman);\n $(Opts.CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(dateText);\n };\n this.getData = function () {\n return Order;\n };\n this.setSupplierCompleted = function () {\n console.log('bingo');\n root.initViewParameter();\n };\n this.afterOrderSetSupplierOk = function (data) {\n Toast.create({\n title: \"Supplier selected !\",\n message: data.supplier.name,\n status: TOAST_STATUS.INFO,\n timeout: 5000\n });\n root.setSupplier(data.supplier.name, data.supplier.id);\n Order.setData({\n id: data.id\n });\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n id: Order.id\n }\n });\n //root.Stepper.setOpts({onAfterLoad:root.setSupplierCompleted})\n root.Stepper.setEnabled('parameter');\n root.Stepper.addCompleted('parameter');\n root.Stepper.setCompleted('parameter');\n root.Stepper.setActive('parameter');\n };\n this.initViewSupplier = function () {\n debug('call initViewSupplier');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n $('.supplierItem').off('click');\n $('.supplierItem').on('click', function (event) {\n console.log(Order.getData());\n event.preventDefault();\n var supplierId = $(event.currentTarget).data('id');\n var supplierName = $(event.currentTarget).find('h5.card-title').text();\n if (typeof Order.supplierId == 'undefined') {\n //new order\n\n var ajaxData = {};\n ajaxData._token = Opts.token;\n ajaxData.supplierId = supplierId;\n ajaxData.storeType = 'supplierSelect';\n $.extend(ajaxData, Order);\n $.ajax({\n url: Opts.URL.store,\n method: 'POST',\n data: ajaxData,\n success: function success(data) {\n if (data.success) {\n root.afterOrderSetSupplierOk(data.data);\n }\n }\n });\n //Order.setData({supplierId:supplierId});\n } else {\n //ide kellene egy jo kis kerdes\n if (Order.supplierId != supplierId) {\n Toast.create({\n title: \"Supplier change to!\",\n message: supplierName,\n status: TOAST_STATUS.WARNING,\n timeout: 5000\n });\n root.Stepper.clearLoaded();\n Order = new DataModelOrder();\n //Order.setData({supplierId:supplierId});\n }\n }\n return;\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n\n //$('.supplierNamePlace').text(supplierName);\n // removed by dead control flow\n\n // removed by dead control flow\n\n //@todo:ide kell egy mentes!\n //@todo:mentes eredemenyekeppen lehet valtani\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n });\n };\n this.checkContactNameField = function () {\n var CSSSelectorForm = '.orderParameterForm';\n var node = $(CSSSelectorForm + ' input[name=contactName]');\n if (node.val().length < 2) {\n node.removeClass('is-valid');\n node.addClass('is-invalid');\n return false;\n } else {\n node.addClass('is-valid');\n node.removeClass('is-invalid');\n return true;\n }\n };\n this.sendOrderDataToServer = function (updateType, callback, errorCallback) {\n var ajaxData = {};\n var ajaxUrl = Opts.URL.store;\n var ajaxMethod = \"POST\";\n if (Order.id) {\n ajaxUrl = Opts.URL.update.replace('%id%', Order.id);\n //ajaxMethod=\"PUT\";\n //ajaxData=new FormData($(CSSSelectorForm)[0]);\n ajaxData._method = 'PUT';\n }\n ajaxData._token = Opts.token;\n ajaxData.updateType = updateType;\n $.extend(ajaxData, Order);\n debug(Order);\n debug(ajaxData);\n debug('ajaxUrl:' + ajaxUrl);\n ajaxData = jsonToFormData(ajaxData);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n type: ajaxMethod,\n contentType: false,\n processData: false,\n success: function success(data) {\n debug('ajax returned data');\n debug(data);\n if (data.success) {\n //root.afterOrderSetSupplierOk(data.data);\n callback(data);\n }\n },\n error: function error(xhr, ajaxOptions, thrownError) {\n ajaxErrorHandler(xhr, ajaxOptions, thrownError);\n if (typeof errorCallback != 'undefined') {\n errorCallback(xhr.responseJSON);\n }\n }\n });\n };\n this.afterOrderSetParameterOk = function (data) {\n debug('called afterOrderSetParameterOk');\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n 'id': Order.id\n }\n });\n //root.Stepper.setOpts({onAfterLoad:root.setParameterCompleted})\n root.Stepper.setEnabled('productSelect');\n root.Stepper.addCompleted('productSelect');\n root.Stepper.setCompleted('productSelect');\n root.Stepper.setActive('productSelect');\n };\n this.selectCurrentWeek = function () {\n console.error('selectCurrentWeek');\n console.error($('.ui-datepicker').find('.ui-datepicker-current-day a'));\n $('.ui-datepicker').find('.ui-datepicker-current-selected-weekday a').addClass('ui-state-active');\n };\n this.weekHover = function () {\n console.error('hover Active');\n $('.ui-datepicker-calendar tr').off('mousemove');\n $('.ui-datepicker-calendar tr').off('mouseleave');\n $('.ui-datepicker-calendar tr').on('mousemove', function () {\n $(this).find('td a').addClass('ui-state-hover');\n });\n $('.ui-datepicker-calendar tr').on('mouseleave', function () {\n $(this).find('td a').removeClass('ui-state-hover');\n });\n };\n this.weekHoverSlow = function () {\n console.error('weekHoverSlow');\n if ($('.ui-datepicker-calendar tr').length < 1) {\n setTimeout(root.weekHoverSlow, 1);\n return;\n }\n root.weekHover();\n };\n this.initDatePicker = function (type) {\n console.error('asdasdadad');\n console.log('tipus' + type);\n var CSSSelectorForm = '.orderParameterForm';\n var startDate = new Date('1900-01-01');\n var endDate = new Date('1900-01-02');\n $(CSSSelectorForm + ' .datePicker').datepicker(\"destroy\");\n if (type == 'weekly') {\n $(CSSSelectorForm + ' .datePicker').datepicker({\n showOtherMonths: true,\n selectOtherMonths: true,\n showWeek: true,\n dateFormat: 'yy-mm-dd',\n firstDay: 1,\n minDate: new Date(),\n afterShow: function afterShow(dateText, inst) {\n root.weekHover();\n root.selectCurrentWeek();\n },\n onSelect: function onSelect(dateText, inst) {\n var date = $(this).datepicker('getDate');\n startDate = new getMonday(date);\n endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay() + 7);\n root.setDeliveryDate($.datepicker.formatDate('yy-mm-dd', startDate), $.datepicker.formatDate('yy-mm-dd', endDate));\n },\n beforeShow: function beforeShow() {\n console.group('beforeShow');\n console.log(startDate);\n console.log(endDate);\n //root.weekHoverSlow();\n console.groupEnd();\n },\n beforeShowDay: function beforeShowDay(date) {\n console.group('beforeShowDay');\n console.log(date.toLocaleDateString('hu-Hu'));\n var cssClass = '';\n if (date >= startDate && date <= endDate) {\n console.error(date.toLocaleDateString('hu-Hu'));\n cssClass = 'ui-datepicker-current-selected-weekday';\n //cssClass = 'ui-state-active';\n }\n console.log(cssClass);\n console.groupEnd();\n return [true, cssClass];\n },\n onChangeMonthYear: function onChangeMonthYear(year, month, inst) {\n //root.selectCurrentWeek();\n }\n });\n } else {\n // Szállítási korlátozás adatok betöltése (csak ha hasDeliveryConstraint = true)\n var availableDates = [];\n var nextDeliveryDate = null;\n var hasDeliveryConstraint = false;\n var holidays = [];\n var workingDays = [];\n var datepickerInput = $(CSSSelectorForm + ' .datePicker');\n var calendarUrl = datepickerInput.data('delivery-calendar-url');\n var supplierId = datepickerInput.data('supplier-id');\n var profitCenterId = datepickerInput.data('profit-center-id');\n if (calendarUrl && supplierId && profitCenterId) {\n $.ajax({\n url: calendarUrl,\n data: {\n supplierId: supplierId,\n profitCenterId: profitCenterId,\n orderDateTime: new Date().toISOString()\n },\n async: false,\n success: function success(data) {\n hasDeliveryConstraint = data.hasDeliveryConstraint || false;\n // Ünnepnapok és áthelyezett munkanapok – mindig betöltjük\n holidays = (data.holidays || []).map(function (h) {\n return {\n date: h.date,\n description: h.description\n };\n });\n workingDays = (data.workingDays || []).map(function (w) {\n return {\n date: w.date,\n description: w.description\n };\n });\n if (hasDeliveryConstraint) {\n availableDates = data.availableDates || [];\n nextDeliveryDate = data.nextDeliveryDate || null;\n }\n // Ha nincs szállítási korlátozás, az availableDates és nextDeliveryDate\n // üres marad – a datepicker az eredeti módon viselkedik\n }\n });\n }\n if (hasDeliveryConstraint && nextDeliveryDate) {\n // Következő szállítási nap beállítása alapértelmezettként\n root.setDeliveryDate(nextDeliveryDate);\n $(CSSSelectorForm + ' .selectedDateText').text(nextDeliveryDate);\n $(CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(nextDeliveryDate);\n $('.deliveryDatePlace').text(nextDeliveryDate.replaceAll('-', '.') + '.');\n }\n\n // Szín jelmagyarázat megjelenítése csak szállítási korlátozás esetén\n if (hasDeliveryConstraint) {\n $('#deliveryDateLegend').show();\n }\n var datepickerOpts = {\n dateFormat: 'yy-mm-dd',\n minDate: hasDeliveryConstraint && nextDeliveryDate ? new Date(nextDeliveryDate) : new Date(),\n onSelect: function onSelect(dateText) {\n $(CSSSelectorForm + ' .selectedDateText').text(dateText);\n $('.deliveryDatePlace').text(dateText.replaceAll('-', '.') + '.');\n $(CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(dateText);\n }\n };\n\n // beforeShowDay: mindig aktív ha van munkanaptár adat vagy hasDeliveryConstraint\n datepickerOpts.beforeShowDay = function (date) {\n var dateStr = $.datepicker.formatDate('yy-mm-dd', date);\n var holidayEntry = holidays.find(function (h) {\n return h.date === dateStr;\n });\n var workingDayEntry = workingDays.find(function (w) {\n return w.date === dateStr;\n });\n var isDelivery = hasDeliveryConstraint && availableDates.includes(dateStr);\n var cssClasses = [];\n var tooltip = '';\n var selectable = true;\n if (holidayEntry) {\n cssClasses.push('work-calendar-holiday');\n tooltip = 'Ünnepnap' + (holidayEntry.description ? ': ' + holidayEntry.description : '');\n } else if (workingDayEntry) {\n cssClasses.push('work-calendar-working-day');\n tooltip = 'Áthelyezett munkanap' + (workingDayEntry.description ? ': ' + workingDayEntry.description : '');\n }\n if (hasDeliveryConstraint) {\n if (isDelivery) {\n cssClasses.push('delivery-day-available');\n if (!tooltip) tooltip = 'Szállítási nap';\n } else {\n cssClasses.push('delivery-day-unavailable');\n if (!tooltip) tooltip = 'Nem szállítási nap';\n selectable = false;\n }\n }\n // Ha ünnepnap és hasDeliveryConstraint nincs bekapcsolva, az ünnepnap is letiltandó\n if (holidayEntry && !hasDeliveryConstraint) {\n selectable = false;\n }\n return [selectable, cssClasses.join(' '), tooltip];\n };\n $(CSSSelectorForm + ' .datePicker').datepicker(datepickerOpts);\n }\n };\n this.callChangeOrderType = function () {\n console.log(this);\n console.log(this.value);\n root.initDatePicker(this.value);\n //enum('daily', 'weekly')\n /*let CSSSelectorForm='.orderParameterForm';\n let node=$(CSSSelectorForm+' input[name=contactName]');\n if(node.val().length<2){\n node.removeClass('is-valid');\n node.addClass('is-invalid');\n return false;\n }else{\n node.addClass('is-valid');\n node.removeClass('is-invalid');\n return true;\n }\n */\n };\n this.initViewParameter = function () {\n debug('call initViewParameter');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n var CSSSelectorForm = '.orderParameterForm';\n $(CSSSelectorForm + ' .datePickerClick').click(function () {\n $(CSSSelectorForm + ' .datePicker').datepicker('show');\n });\n $(CSSSelectorForm + ' .orderParameterDeliveryAddress').select2({}).show();\n $(CSSSelectorForm + ' input[name=contactName]').off('blur');\n $(CSSSelectorForm + ' input[name=contactName]').off('keyup');\n $(CSSSelectorForm + ' input[name=contactName]').on('blur', root.checkContactNameField);\n $(CSSSelectorForm + ' input[name=contactName]').on('keyup', root.checkContactNameField);\n $(CSSSelectorForm + ' input[name=orderType]').off('change');\n $(CSSSelectorForm + ' input[name=orderType]').on('change', root.callChangeOrderType);\n $(CSSSelectorForm + ' .orderParameterNextButton').off('click');\n if (Order.getData()['id'] > 0) {\n if (Order.getData()['orderType'] == 'weekly') {\n root.initDatePicker(Order.getData()['orderType']);\n $(CSSSelectorForm + \" input[name=orderType][value=\" + Order.getData()['orderType'] + \"]\").prop('checked', true);\n var endDate = new Date(Order.getData()['deliveryDate']);\n endDate.setDate(endDate.getDate() + 6);\n root.setDeliveryDate(Order.getData()['deliveryDate'], $.datepicker.formatDate('yy-mm-dd', endDate));\n root.initDatePicker('weekly');\n } else {\n if (Order.getData()['deliveryDate']) {\n root.setDeliveryDate(Order.getData()['deliveryDate']);\n }\n root.initDatePicker('daily');\n }\n if (Order.getData()['contactName']) {\n $(CSSSelectorForm + ' input[name=contactName]').val(Order.getData()['contactName']);\n }\n if (Order.getData()['note']) {\n $(CSSSelectorForm + ' textarea[name=note]').val(Order.getData()['note']);\n }\n if (Order.getData()['deliveryAddressId']) {\n console.log($(CSSSelectorForm + ' select[name=deliveryAddressId]'));\n $(CSSSelectorForm + ' select[name=deliveryAddressId]').val(Order.getData()['deliveryAddressId']);\n }\n if (Order.getData()['customNotificationEmail']) {\n console.log($(CSSSelectorForm + ' select[name=customNotificationEmail]'));\n $(CSSSelectorForm + ' select[name=customNotificationEmail]').val(Order.getData()['customNotificationEmail']);\n }\n } else {\n root.initDatePicker('daily');\n }\n $(CSSSelectorForm + ' .orderParameterDeliveryAddress').select2({}).show();\n $(CSSSelectorForm + ' .orderParameterCustomNotificationEmail').select2({}).show();\n $(CSSSelectorForm).submit(function (event) {\n event.preventDefault();\n if ($(CSSSelectorForm)[0].checkValidity() === false) {\n debug('validaton false');\n event.stopPropagation();\n return;\n } else {\n debug('validaton ok');\n //do your ajax submition here\n }\n $('.deliveryDatePlace').text($(CSSSelectorForm + ' input[name=deliveryDate]').val().replaceAll('-', '.') + '.');\n Order.setData({\n contactName: $(CSSSelectorForm + ' input[name=contactName]').val(),\n note: $(CSSSelectorForm + ' textarea[name=note]').val(),\n orderType: $(CSSSelectorForm + ' input:checked[name=orderType]').val(),\n deliveryDate: $(CSSSelectorForm + ' input[name=deliveryDate]').val(),\n deliveryAddressId: $(CSSSelectorForm + ' select[name=deliveryAddressId]').val(),\n deliveryAddress: $(CSSSelectorForm + ' select[name=deliveryAddress]').val(),\n customNotificationEmail: $(CSSSelectorForm + ' select[name=customNotificationEmail]').val()\n });\n console.group('parameter form submit');\n console.error($(CSSSelectorForm + ' input:checked[name=orderType]').val());\n console.error($(CSSSelectorForm + ' input[name=deliveryDate]').val());\n debug(Order.getData());\n console.groupEnd();\n root.sendOrderDataToServer('parameter', root.afterOrderSetParameterOk);\n });\n };\n this.blank = function () {};\n this.setParameterCompleted = function () {\n console.log('setParameterCompleted called');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n //root.initViewProductSelect()\n };\n this.bindRowFavoritesAction = function () {\n $('.buttonItemFavorites').off('click');\n $('.buttonItemFavorites').on('click', function () {\n var productId = $(this).data('id');\n console.log(productId);\n var ajaxUrl = Opts.URL.toggleFavorites.replace('%id%', productId);\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var button = this;\n console.log(ajaxUrl);\n $.ajax({\n url: ajaxUrl,\n method: 'POST',\n data: ajaxData,\n success: function success(response) {\n if (response.success) {\n if (response.status) {\n console.log('true');\n $(button).addClass('btn-warning');\n $(button).removeClass('btn-light');\n } else {\n $(button).removeClass('btn-warning');\n $(button).addClass('btn-light');\n console.log('false');\n }\n }\n }\n });\n /*\n $(this).toggleClass('btn-warning');\n $(this).toggleClass('btn-light');\n */\n });\n };\n this.bindRowDescriptionAction = function () {\n $('textarea.orderItemComment').on('change', function () {\n var comment = $(this).val();\n var productId = $(this).data('id');\n var productComment = Order.getData('productComment');\n if (productComment !== null) {\n if (typeof productComment[productId] == 'undefined' && comment.length === 0) {\n return;\n }\n if (productComment[productId] === comment) {\n return;\n }\n }\n productComment[productId] = comment;\n if (comment.length === 0) {\n delete Order.productComment[productId];\n }\n Order.productComment = productComment;\n queueAjax.push(Date.now());\n root.syncOrderDataToServer();\n });\n };\n this.productSelectDatatablesRowFormatter = function (d) {\n // `d` is the original data object for the row\n /**\n @todo: felszedni es updatelni az adott termek memojat az orderban\n */\n console.group('productSelectDatatablesRowFormatter');\n console.log(d);\n var templateData = d;\n templateData.comment = '';\n // debug(Order);\n if (Order.productComment && Order.productComment !== null) {\n debug(_typeof(Order.productComment[d.id]));\n if (typeof Order.productComment[d.id] != 'undefined' && Order.productComment[d.id].length > 0) {\n templateData.comment = Order.productComment[d.id];\n }\n }\n /** @typedef {boolean} d.favorites */\n if (d.favorites === true) {\n templateData.btnFavoritesClass = 'btn-warning';\n } else {\n templateData.btnFavoritesClass = 'btn-light';\n }\n var template = $('template[data-name=\"orderProductSelectDetails\"]').html();\n templateData.weekly = false;\n if (Order.getData().orderType === 'weekly') {\n templateData.weekly = true;\n /*\n \n templateData.weeklyDay=[\n {\"index\":1,\"name\":\"Hétfő\"},\n {\"index\":2,\"name\":\"Kedd\"},\n {\"index\":3,\"name\":\"Szerda\"},\n {\"index\":4,\"name\":\"Csütörtök\"},\n {\"index\":5,\"name\":\"Péntek\"},\n {\"index\":6,\"name\":\"Szombat\"},\n {\"index\":7,\"name\":\"Vasárnap\"},\n ];\n \n templateData.weeklyDay=[\n {\"index\":2,\"name\":\"Hétfő\" },\n {\"name\":\"Kedd\"},\n {\"name\":\"Szerda\"},\n {\"name\":\"Csütörtök\"},\n {\"name\":\"Péntek\"},\n {\"name\":\"Szombat\"},\n {\"name\":\"Vasárnap\"}\n ];\n */\n }\n var productSelected = Order.getData('productSelected');\n if (typeof productSelected[d.id] != 'undefined') {\n templateData.itemQuantity = productSelected[d.id];\n }\n console.log(['templateData', templateData]);\n var oldTags = Mustache.tags;\n Mustache.tags = [\"~!\", \"!~\"];\n if (templateData['specification'] == 'false' || templateData['specification'] == false) {\n templateData.specificationClass = 'd-none';\n }\n templateData.pictureImg = '';\n if (templateData['picture'] == 'false' || templateData['picture'] == false) {\n templateData.pictureClass = 'd-none';\n } else {\n templateData.pictureImg = '';\n }\n console.log('templateData', templateData);\n //templateData['aa_specification']=false;\n var render = Mustache.render(template, templateData);\n Mustache.tags = oldTags;\n console.groupEnd();\n return render;\n /*\n solution before template\n return ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n /!*\n ''+\n ''+\n ''+\n ''+\n *!/\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n /!*\n *!/\n '
Info:'+d.note+'
hooreyca :'+d.hooreycaId+'' +\n \n '' +\n '
Extension number:'+d.extn+'
Info:'+d.note+'
Megjegyzés:
';\n */\n };\n this.setDatatableHeaderText = function (text) {\n $('.tableHeaderText').text(text);\n };\n this.getTreePathName = function (node) {\n var res = '';\n var items = $(node).parents('li').toArray();\n items.shift();\n items.reverse();\n for (var item in items) {\n console.log($(items[item]).children('a.categoryItem'));\n if ($(items[item]).children('a.categoryItem').length > 0) {\n res += $(items[item]).children('a.categoryItem').text() + '/';\n }\n }\n res += $(node).text();\n console.log(res);\n return res;\n };\n var selectedProductGroup = null;\n var dataTableSearchStr = null;\n var dataTableSearchKrel = false;\n this.searchProductByString = function (filterStr) {\n root.setDatatableHeaderText('Termékek szűrve:' + filterStr);\n dataTableSearchStr = filterStr;\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickSearchProduct = function () {\n debug(this);\n var filterStr = $('.sidebar-search input[name=searchValue]').val();\n debug(filterStr);\n root.searchProductByString(filterStr);\n };\n this.clickFavoritesProduct = function () {\n debug('clickFavoritesProduct');\n root.setDatatableHeaderText('Termékek szűrve: kedvencek');\n dataTableSearchStr = '**favorites**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickOftenProduct = function () {\n debug('clickOftenProduct');\n root.setDatatableHeaderText('Termékek szűrve: gyakran vásárolt');\n dataTableSearchStr = '**often**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickSpecialOffer = function () {\n debug('clickSpecialOffer');\n root.setDatatableHeaderText('Termékek szűrve: Akciós termékek');\n dataTableSearchStr = '**specialOffer**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickLastProduct = function () {\n debug('clickLastProduct');\n root.setDatatableHeaderText('Termékek szűrve: utoljára vásárolt');\n dataTableSearchStr = '**last**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickWeeklyProduct = function () {\n debug('clickWeeklyProduct');\n root.setDatatableHeaderText('Termékek szűrve: Heti termékek');\n dataTableSearchStr = '**weekly**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickKrelProduct = function () {\n debug('clickKrelProduct');\n //root.setDatatableHeaderText('Termékek szűrve: Heti termékek');\n //dataTableSearchStr='**weekly**';\n //$('.dataTableOrderProductSelect').DataTable().ajax.reload();\n $(this).parent().toggleClass('krelActive');\n dataTableSearchKrel = !dataTableSearchKrel;\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.productSelectDataTableColumnDefs = function () {\n return [{\n \"width\": \"10px\",\n \"targets\": 0\n }, {\n \"className\": \"dt-left\",\n \"targets\": 1\n },\n // { \"width\": \"120px\", \"targets\": 1 },\n {\n \"width\": \"28px\",\n \"targets\": 2\n }, {\n \"width\": \"41px\",\n \"targets\": 3\n }, {\n \"width\": \"76px\",\n \"targets\": 4\n }, {\n \"width\": \"55px\",\n \"targets\": 5\n }, {\n \"width\": \"70px\",\n \"targets\": 6\n }, {\n \"width\": \"54px\",\n \"targets\": 7\n }, {\n \"width\": \"57px\",\n \"targets\": 8\n }, {\n \"width\": \"42px\",\n \"targets\": 9\n }, {\n \"width\": \"100px\",\n \"targets\": 10\n }, {\n \"className\": \"dt-center\",\n \"targets\": \"_all\"\n }];\n };\n this.productSelectDataTableColumn = function () {\n var columnData = [{\n \"className\": 'details-control',\n \"orderable\": false,\n \"data\": null,\n \"defaultContent\": ''\n }, {\n \"data\": \"name\"\n }, {\n \"data\": \"krel\"\n }, {\n \"data\": \"packing\"\n }, {\n \"data\": \"unitValue\"\n }, {\n \"data\": \"productUnit\"\n }, {\n \"data\": \"sellerUnit\"\n }, {\n \"data\": \"unitMultiplier\"\n }, {\n \"data\": \"amountUnit\"\n }, {\n \"data\": \"price\"\n }];\n var actionColumn = {\n \"className\": 'details-control2',\n \"orderable\": false,\n \"data\": null,\n \"width\": \"100px\",\n \"defaultContent\": ''\n };\n if (Order.getData('orderType') == 'daily') {\n actionColumn.defaultContent = ''\n /*\n \"defaultContent\":'
' +\n '' +\n '' +\n '' +\n '
'\n */;\n }\n columnData.push(actionColumn);\n return columnData;\n };\n this.getDatatables = function (orderType) {\n console.error(orderType);\n var table = $('.dataTableOrderProductSelect').DataTable({\n language: {\n url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/Hungarian.json'\n },\n //\"ajax\": \"{{asset('exapmle2.json')}}\",\n \"ajax\": {\n url: Opts.URL.getDataTableContentProductList,\n data: function data(_data) {\n _data.searchStr = dataTableSearchStr;\n _data.krel = dataTableSearchKrel;\n _data.groupId = selectedProductGroup;\n _data.supplierId = Order.supplierId;\n _data.deliveryDate = Order.deliveryDate;\n }\n },\n buttons: {\n buttons: []\n },\n \"columnDefs\": root.productSelectDataTableColumnDefs(),\n \"columns\": root.productSelectDataTableColumn(),\n \"order\": [[1, 'asc']]\n });\n return table;\n };\n this.productSelectDataTableDrawDT = function (e) {\n //debug( 'Table draw complete: '+new Date().getTime() );\n\n //$('td:contains(\"*\")').html('');\n $(\"td\").filter(function () {\n return $(this).text() === '*';\n }).html('');\n if (Order.getData().orderType == 'daily') {\n $(\"input[type='number'].inputNumberSpinner\").inputSpinner({\n template: '
' + '' +\n //'' +\n '' + '' + '
',\n buttonsWidth: \"0.5rem\",\n groupClass: \"\",\n // css class of the resulting input-group\n buttonsClass: \"btn-outline-secondary\"\n });\n }\n root.bindWeakUserHelper();\n /*\n ----------------------------------------------------------\n change order quantity\n */\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").off('change');\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").on('change', function (e) {\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n var rowData = $('.dataTableOrderProductSelect').DataTable().row($(this).closest('tr')).data();\n root.orderItemsChange(rowData, quantity);\n });\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").each(function () {\n //debug('ez a function2')\n var quantity = $(this).val();\n var rowData = $('.dataTableOrderProductSelect').DataTable().row($(this).closest('tr')).data();\n if (Order.productSelected[rowData.id]) {\n debug(rowData);\n debug($($(this).closest('tr').find('input[type=number]')[0]));\n debug(Order.productSelected[rowData.id]);\n var quantityCurrent = Order.productSelected[rowData.id];\n if (typeof quantityCurrent != 'string') {\n quantityCurrent += '';\n }\n $($(this).closest('tr').find('input[type=number]')[0]).val(quantityCurrent.replace(',', '.'));\n }\n });\n $(\".dataTableOrderProductSelect .details-control2 button\").off('click');\n $(\".dataTableOrderProductSelect .details-control2 button\").on('click', function () {\n // debug('.details-control2 button click ')\n // debug(this);\n $(this).parent().find('input[type=text]').trigger('change');\n });\n };\n this.initViewProductSelect = function () {\n var functionName = 'initViewProductSelect';\n console.log(functionName + ' called');\n if (viewInicialized.includes(functionName)) {\n return;\n }\n //debug(Object.getOwnPropertyNames(root));\n root.setDatatableHeaderText('');\n root.Stepper.setOpts({\n onAfterActivate: function onAfterActivate() {}\n });\n //@note: be kell kapcsolni az elonezetet\n root.Stepper.addCompleted('invoice');\n root.Stepper.addEnabled('invoice');\n var CSSSelectorForm = '.orderParameterForm';\n //console.log(Opts.URL.getDataTableContentProductList);change\n debug(CSSSelectorForm + ' .fa-search');\n $('.sidebar-search .fa-search').off('click');\n $('.sidebar-search .fa-search').on('click', root.clickSearchProduct);\n $('a.sidebar.favorites').off('click');\n $('a.sidebar.favorites').on('click', root.clickFavoritesProduct);\n $('a.sidebar.often').off('click');\n $('a.sidebar.often').on('click', root.clickOftenProduct);\n $('a.sidebar.last').off('click');\n $('a.sidebar.last').on('click', root.clickLastProduct);\n $('a.sidebar.weekly').off('click');\n $('a.sidebar.weekly').on('click', root.clickWeeklyProduct);\n $('a.sidebar.krel').off('click');\n $('a.sidebar.krel').on('click', root.clickKrelProduct);\n $('a.sidebar.specialOffer').off('click');\n $('a.sidebar.specialOffer').on('click', root.clickSpecialOffer);\n $('.sidebar-search input[name=searchValue]').off('keypress');\n $('.sidebar-search input[name=searchValue]').on('keypress', function (event) {\n if (event.which == 13) {\n event.preventDefault();\n }\n if ($(this).val().length >= 2) {\n root.searchProductByString($(this).val() + event.key);\n }\n });\n $('.sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu li a.categoryItem.clickable').off('click');\n $('.sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu li a.categoryItem.clickable').on('click', function () {\n var groupId = $(this).data('id');\n selectedProductGroup = groupId;\n dataTableSearchStr = null;\n console.log(groupId);\n console.log(root.getTreePathName(this));\n root.setDatatableHeaderText(root.getTreePathName(this));\n /*\n let ajaxData={\n 'groupId':groupId,\n 'supplier_id':Order.supplierId,\n };\n //$('.dataTableOrderProductSelect').DataTable().ajax.data(ajaxData).load();\n \n */\n /*\n let ajaxUrl=Opts.URL.getDataTableContentProductList+'?groupId='+groupId+'&supplier_id='+Order.supplierId;\n $('.dataTableOrderProductSelect').DataTable().ajax.url(ajaxUrl).load();\n */\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n });\n var table = root.getDatatables(Order.getData('orderType'));\n $('.dataTableOrderProductSelect').on('init.dt', function () {\n console.log('Table initialisation complete: ' + new Date().getTime());\n }).dataTable();\n $('.dataTableOrderProductSelect').on('draw.dt', root.productSelectDataTableDrawDT).dataTable();\n\n //$('.dataTableOrderProductSelect').on( 'draw.dt', ).dataTable();\n\n $('.dataTableOrderProductSelect').on('xhr.dt', function () {\n debug('Table xhr complete: ' + new Date().getTime());\n }).dataTable();\n\n //$(\"input[type='number'].inputNumberSpinner\").inputSpinner();\n\n /*\n ----------------------------------------------------------\n Add event listener for opening and closing details\n */\n\n $('.dataTableOrderProductSelect tbody').on('click', 'td.details-control', function () {\n var tr = $(this).closest('tr');\n var row = table.row(tr);\n if (row.child.isShown()) {\n // This row is already open - close it\n row.child.hide();\n tr.removeClass('shown');\n } else {\n // Open this row\n row.child(root.productSelectDatatablesRowFormatter(row.data())).show();\n tr.addClass('shown');\n root.bindProductDetailsAction();\n }\n });\n viewInicialized.push(functionName);\n };\n this.bindProductDetailsAction = function () {\n root.bindRowDescriptionAction();\n root.bindRowFavoritesAction();\n if (Order.getData()['orderType'] == 'weekly') {\n root.bindOrderItemWeekQuantity();\n }\n };\n this.bindWeakUserHelper = function () {\n $(\"input.inputNumberSpinner\").off(\"focus\");\n $(\"input.inputNumberSpinner\").on(\"focus\", function () {\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n if (quantity === 0) {\n $(this).val('');\n }\n });\n $(\"input[type=text].inputNumberSpinner\").off(\"keypress\");\n $(\"input[type=text].inputNumberSpinner\").on(\"keypress\", function (event) {\n if (event.which == 13) {\n // console.error('enter pressed');\n var actualItem = this;\n var items = $(\"input[type=text].inputNumberSpinner\");\n items.each(function (item) {\n // console.log(this);\n if (this == actualItem) {\n // console.error(item);\n if (item + 1 <= items.length) {\n // console.error(items[item+1]);\n $(items[item + 1]).focus();\n }\n return false;\n }\n });\n }\n });\n };\n this.bindOrderItemWeekQuantity = function () {\n $(\"input.productSelectDayQuantity\").off('change');\n $(\"input.productSelectDayQuantity\").on('change', function () {\n console.log(this.name);\n console.log(this.value);\n console.log($(this).data('dayindex'));\n var rowData = null;\n var rowNode = $($(this).closest('table.orderProductSelectRowDetailsTable').closest('tr')).prev();\n rowData = $('.dataTableOrderProductSelect').DataTable().row(rowNode).data();\n console.log(rowData);\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n console.log(rowData.id);\n root.orderItemsChange(rowData, quantity, $(this).data('dayindex'));\n // root.orderItemsChange\n //orderItemsChange\n //quantity[1683][1]\n });\n };\n this.afterSyncOrderDataToServer = function (data) {\n //root.toggleEnableSend();\n //console.log('most vegzett. ennyit kiszed'+batchNum);\n for (var i = 0; i < queueAjax.length; i++) {\n console.log('shiftel');\n queueAjax.shift();\n }\n //console.log('remaining left '+queueAjax.length);\n setTimeout(function () {\n syncDoing = false;\n root.syncOrderDataToServer();\n }, Opts.dataSyncPauseTime);\n };\n var queueAjax = [];\n var syncDoing = false;\n this.syncOrderDataToServer = function () {\n //debug(queueAjax);\n if (syncDoing) {\n //debug('sync in progress....');\n return false;\n }\n if (queueAjax.length < 1) {\n return;\n }\n syncDoing = true;\n root.sendOrderDataToServer('productSelect', root.afterSyncOrderDataToServer);\n return;\n };\n this.orderItemsChange = function (ItemData, quantity, dayIndex) {\n /*\n debug('-----------------');\n debug(ItemData);\n debug(quantity);\n debug(Order.getData('productSelected'));\n debug('-----------------');\n \n */\n if (isNaN(quantity)) {\n quantity = 0;\n }\n var productSelected = Order.getData('productSelected');\n console.group('orderItemsChange');\n console.log(['productSelected', productSelected]);\n console.log(['ItemData', ItemData]);\n console.log(['ItemData.id', ItemData.id]);\n console.log(['quantity', quantity]);\n console.log(['dayIndex', dayIndex]);\n console.log(productSelected[ItemData.id]);\n var productSelectedItem = productSelected[ItemData.id];\n /*\n ha 0 ertek jon es nem is volt akkor hamar kiugratjuk\n */\n if (quantity == 0) {\n console.error('quantity==0');\n if (typeof productSelectedItem == 'undefined') {\n console.error('itt lep1');\n console.groupEnd();\n return;\n }\n if (dayIndex) {\n console.log('van dayIndex');\n if (typeof productSelected[ItemData.id][dayIndex] == 'undefined') {\n console.log(['productSelectedItem', productSelectedItem]);\n console.error('itt lep2');\n console.groupEnd();\n return;\n }\n }\n }\n /*\n ha azonos az ertek kiugrunk\n */\n if (dayIndex) {\n if (typeof productSelected[ItemData.id] != 'undefined' && typeof productSelected[ItemData.id][dayIndex] != 'undefined') {\n if (productSelected[ItemData.id][dayIndex] == quantity) {\n console.error('azonos napi');\n console.groupEnd();\n return;\n }\n }\n } else {\n if (productSelected[ItemData.id] == quantity) {\n console.error('azonos');\n console.groupEnd();\n return;\n }\n }\n if (quantity == 0) {\n if (dayIndex) {\n delete Order.productSelected[ItemData.id][dayIndex];\n delete productSelected[ItemData.id][dayIndex];\n } else {\n delete Order.productSelected[ItemData.id];\n delete productSelected[ItemData.id];\n }\n } else {\n /*\n ha van ertek erteket adunk!\n */\n if (dayIndex) {\n if (typeof productSelected[ItemData.id] == 'undefined') {\n productSelected[ItemData.id] = [];\n }\n console.log('set quantity productSelected[ItemData.id][dayIndex]', quantity);\n productSelected[ItemData.id][dayIndex] = quantity;\n } else {\n productSelected[ItemData.id] = quantity;\n console.log('set quantity productSelected[ItemData.id]', quantity);\n }\n }\n console.log(['productSelected', productSelected]);\n Order.productSelected = productSelected;\n console.groupEnd();\n queueAjax.push(Date.now());\n root.syncOrderDataToServer();\n return;\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n\n /*\n debug(Order.getData('productSelected'));\n debug('*******************');\n */\n };\n this.initViewInvoice = function () {\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n if (Object.keys(Order.productSelected).length > 0) {\n root.Stepper.addCompleted('send');\n root.Stepper.addEnabled('send');\n }\n var styleStr = '';\n $('table.invoice button.printButton').off('click');\n $('table.invoice button.printButton').on('click', function () {\n window.print();\n return;\n // removed by dead control flow\n var newWin; \n // removed by dead control flow\n\n // removed by dead control flow\n var print; \n // removed by dead control flow\n\n // newWin.document.write($('table.invoice').prop('outerHTML'));\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n });\n };\n this.resetOrder = function () {\n root.init();\n root.setDeliveryDate('-');\n root.setSupplier('-');\n };\n this.afterOrderSendOk = function (data) {\n Toast.create({\n title: \"Sent!\",\n message: 'Order Sent',\n status: TOAST_STATUS.INFO,\n timeout: 5000\n });\n $('.buttonOrderSend').off('click');\n $('.buttonOrderSend').prop('disabled', true);\n $('.statusNamePlace').removeClass('statusBlink');\n $('.statusNamePlace').text('elküldve');\n $('.buttonOrderSending').toggleClass('d-none');\n $('.buttonOrderSendOk').toggleClass('d-none');\n $('div.invoiceContainer').html(data.retHTML);\n //root.resetOrder();\n };\n this.afterOrderSendError = function (data) {\n $('.buttonOrderSend').toggleClass('d-none');\n $('.buttonOrderSending').toggleClass('d-none');\n $.each(APP.OrderModule.Stepper.getOpts().available, function (index, value) {\n APP.OrderModule.Stepper.setEnabled(value);\n APP.OrderModule.Stepper.setCompleted(value);\n });\n };\n this.initViewSend = function () {\n console.log('initViewSend called 2');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n $('.buttonOrderSend').off('click');\n $('.buttonOrderSend').on('click', function () {\n console.log('Send buton clicked');\n //@todo: datasynchere and callback\n $('.buttonOrderSend').toggleClass('d-none');\n $('.buttonOrderSending').toggleClass('d-none');\n /**\n * PM158\n */\n $.each(APP.OrderModule.Stepper.getOpts().available, function (index, value) {\n root.Stepper.unsetEnabled(value);\n root.Stepper.unsetCompleted(value);\n });\n /**\n */\n root.sendOrderDataToServer('send', root.afterOrderSendOk, root.afterOrderSendError);\n\n /* let ajaxData={};\n ajaxData._token=Opts.token;\n ajaxData.send=true;\n $.extend(ajaxData,Order);\n $.ajax({\n url: Opts.URL.store,\n method:'POST',\n data:ajaxData,\n success:function (data) {\n if(data.success){\n root.afterOrderSendOk(data);\n }\n }\n });*/\n });\n };\n this.testModeSend = function () {};\n this.testMode = function () {\n console.log('testMode called ');\n Order.setData({\n id: 234,\n supplierId: 7,\n productSelected: {\n 116: 3,\n 293: 2\n },\n contactName: 'Contact Name',\n note: 'Note',\n type: 'daily',\n deliveryDate: Opts.defaultDeliveryDate,\n deliveryAddress: 12\n });\n console.log(Order.getData());\n console.log('*******************');\n //root.Stepper.setOpts({'UrlData':{'supplierId':supplierId}});\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n id: Order.id\n }\n });\n this.Stepper.init({\n URL: {\n create: Opts.URL.create\n },\n /*\n csupasz az elejerol\n complete:['supplier'],\n enable: ['supplier'],\n active: 'supplier',\n onAfterActivate:this.initViewSupplier,\n \n product select\n complete:['supplier','parameter','productSelect'],\n enable: ['supplier','parameter','productSelect'],\n active: 'productSelect',\n onAfterActivate:this.initViewProductSelect,\n \n fullos\n complete:['supplier','parameter','productSelect','invoice'],\n enable: ['supplier','parameter','productSelect','invoice','send'],\n active: 'productSelect',\n onAfterActivate:this.initViewProductSelect,\n \n send\n complete:['supplier','parameter','productSelect','invoice','send'],\n enable: ['supplier','parameter','productSelect','invoice','send'],\n active: 'send',\n onAfterActivate:this.initViewProductSelect,\n \n */\n complete: ['supplier', 'parameter', 'productSelect'],\n enable: ['supplier', 'parameter', 'productSelect'],\n active: 'productSelect',\n onAfterActivate: this.initViewProductSelect,\n autoCallback: {\n invoice: {\n onAfterActivate: root.initViewInvoice\n },\n send: {\n onAfterActivate: root.initViewSend\n }\n }\n });\n console.log('*******************');\n };\n this.toggleEnableSend = function () {\n console.log('toggleEnableSend called');\n var ajaxUrl = Opts.URL.checkReadyToSend.replace('%id%', Order.id);\n $.ajax({\n url: ajaxUrl,\n success: function success(data) {\n if (data.success) {\n if (data.readyToSend) {\n root.Stepper.addCompleted('send');\n /*\n root.Stepper.addCompleted('invoice');\n root.Stepper.addEnabled('invoice');\n */\n root.Stepper.addEnabled('send');\n } else {\n root.Stepper.unsetCompleted('send');\n /*\n root.Stepper.unsetCompleted('invoice');\n root.Stepper.unsetEnabled('invoice');\n */\n root.Stepper.unsetEnabled('send');\n }\n }\n console.log(data);\n }\n });\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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M0Q7QUFDQTtBQUNBO0FBQ0E7WUFDd0JyQixJQUFJLENBQUNoQixPQUFPLENBQUN3QyxZQUFZLENBQUMsTUFBTSxDQUFDO1VBQ3JDO1FBQ0o7UUFDQS9DLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDUixJQUFJLENBQUM7TUFDckI7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDO0FBRUwsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9tb2R1bGVKcy9vcmRlci5qcz81NjFmIl0sInNvdXJjZXNDb250ZW50IjpbIndpbmRvdy5PcmRlck1vZHVsRGVmYXVsdD17XG4gICAgYWN0aW9uRnVuY3Rpb246IGZ1bmN0aW9uICgpIHt9LFxufVxuY2xhc3MgRGF0YU1vZGVsT3JkZXIgZXh0ZW5kcyBEYXRhTW9kZWx7XG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKGRhdGEsb3B0aW9ucykge1xuICAgICAgICBzdXBlcihkYXRhLG9wdGlvbnMpXG4gICAgICAgIGlmKHR5cGVvZiB0aGlzLnByb2R1Y3RTZWxlY3RlZCA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdFNlbGVjdGVkPXt9O1xuICAgICAgICB9XG4gICAgICAgIGlmKHR5cGVvZiB0aGlzLnByb2R1Y3RDb21tZW50ID09PVwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0Q29tbWVudD17fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNvbnN0cnVjdG9yLm5hbWUrJyBjb25zdHJ1Y3RvciBjYWxsZWQnKTtcbiAgICB9O1xufTtcbndpbmRvdy5EYXRhTW9kZWxPcmRlcj1EYXRhTW9kZWxPcmRlcjtcblxud2luZG93LlN0ZXBwZXI9ZnVuY3Rpb24gKCkge1xuXG4gICAgLypcbiAgICAgKiBWYXJpYWJsZXMgYWNjZXNzaWJsZVxuICAgICAqIGluIHRoZSBjbGFzc1xuICAgICAqL1xuICAgIGxldCBPcHRzID0ge1xuICAgICAgICBjb21wbGV0ZTogWydzdXBwbGllciddLFxuICAgICAgICBhdmFpbGFibGU6IFsnc3VwcGxpZXInLCAncGFyYW1ldGVyJywgJ3Byb2R1Y3RTZWxlY3QnLCAnaW52b2ljZScsICdzZW5kJ10sXG4gICAgICAgIGVuYWJsZTogWydzdXBwbGllcicsICdpbnZvaWNlJ10sXG4gICAgICAgIGxvYWQ6IFtdLFxuICAgICAgICBleGNsdWRlTG9hZGVkOlsnaW52b2ljZScsJ3NlbmQnXSxcbiAgICAgICAgbG9hZGVkOiBbXSxcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgVVJMOiB7XG4gICAgICAgICAgICBjcmVhdGU6ICcnLFxuICAgICAgICB9LFxuICAgICAgICBVcmxEYXRhOmZhbHNlLFxuICAgICAgICBvbkFmdGVyTG9hZDpmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgb25BZnRlckFjdGl2YXRlOmZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBhdXRvQ2FsbGJhY2s6e1xuICAgICAgICAgICAgJ2ludm9pY2UnOntcbiAgICAgICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6ZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3NlbmQnOntcbiAgICAgICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6ZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBub3dMb2FkZWQ6ZmFsc2UsXG5cbiAgICB9O1xuXG4gICAgbGV0IHJvb3Q9dGhpcztcbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgdGhpcy5jb25zdHJ1Y3QgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAkLmV4dGVuZChPcHRzLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRPcHRzPWZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBPcHRzO1xuICAgIH1cbiAgICB0aGlzLnNldE9wdHM9ZnVuY3Rpb24ob3B0aW9ucyl7XG4gICAgICAgICQuZXh0ZW5kKE9wdHMsIG9wdGlvbnMpO1xuICAgIH1cblxuXG5cbiAgICB0aGlzLmluaXQ9ZnVuY3Rpb24gKG9wdGlvbnMpe1xuICAgICAgICAkLmV4dGVuZChPcHRzLCBvcHRpb25zKTtcblxuICAgICAgICBkZWJ1ZyhPcHRzKTtcbiAgICAgICAgJCgnLnN0ZXAnKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsZXQgc3RlcE5hbWU9JCh0aGlzKS5kYXRhKCdzdGVwbmFtZScpO1xuICAgICAgICAgICAgaWYoT3B0cy5jb21wbGV0ZS5pbmNsdWRlcyhzdGVwTmFtZSkpe1xuICAgICAgICAgICAgICAgIHJvb3Quc2V0Q29tcGxldGVkKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKE9wdHMuZW5hYmxlLmluY2x1ZGVzKHN0ZXBOYW1lKSl7XG4gICAgICAgICAgICAgICAgcm9vdC5zZXRFbmFibGVkKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKE9wdHMubG9hZC5pbmNsdWRlcyhzdGVwTmFtZSkpe1xuICAgICAgICAgICAgICAgIHJvb3QubG9hZFN0ZXBDb250ZW50KHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoT3B0cy5hY3RpdmU9PT1zdGVwTmFtZSl7XG4gICAgICAgICAgICAgICAgcm9vdC5zZXRBY3RpdmUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcm9vdC5iaW5kQ2xpY2tBY3Rpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRDbGlja0FjdGlvbj1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IHN0ZXBDbGlja0J1dHRvbnM9JCgnLnN0ZXBDbGljaycpO1xuICAgICAgICBzdGVwQ2xpY2tCdXR0b25zLm9mZignY2xpY2snKTtcbiAgICAgICAgc3RlcENsaWNrQnV0dG9ucy5vbignY2xpY2snLHJvb3Quc3RlcENsaWNrKTtcblxuICAgIH1cblxuICAgIHRoaXMuc2V0Q29tcGxldGVkPWZ1bmN0aW9uIChzdGVwTmFtZSl7XG4gICAgICAgIGNvbnNvbGUubG9nKHN0ZXBOYW1lKycgY29tcGxldGVkJyk7XG4gICAgICAgICQoJy5zdGVwW2RhdGEtc3RlcE5hbWU9XCInK3N0ZXBOYW1lKydcIl0nKS5hZGRDbGFzcygnY29tcGxldGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy51bnNldENvbXBsZXRlZD1mdW5jdGlvbiAoc3RlcE5hbWUpe1xuICAgICAgICBjb25zb2xlLmxvZyhzdGVwTmFtZSsnIFVuY29tcGxldGVkJyk7XG4gICAgICAgICQoJy5zdGVwW2RhdGEtc3RlcE5hbWU9XCInK3N0ZXBOYW1lKydcIl0nKS5yZW1vdmVDbGFzcygnY29tcGxldGVkJyk7XG4gICAgICAgIE9wdHMuY29tcGxldGU9YXJyYXlSZW1vdmUoT3B0cy5jb21wbGV0ZSxzdGVwTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy51bnNldEVuYWJsZWQ9ZnVuY3Rpb24gKHN0ZXBOYW1lKXtcbiAgICAgICAgY29uc29sZS5sb2coc3RlcE5hbWUrJyBVbiBlbmFibGVkJyk7XG4gICAgICAgICQoJy5jbGljaycrc3RlcE5hbWUpLmNvbnRlbnRzKCkudW53cmFwKCk7XG4gICAgICAgIE9wdHMuZW5hYmxlPWFycmF5UmVtb3ZlKE9wdHMuZW5hYmxlLHN0ZXBOYW1lKTtcbiAgICB9XG4gICAgdGhpcy5zZXRFbmFibGVkPWZ1bmN0aW9uIChzdGVwTmFtZSl7XG4gICAgICAgIGNvbnNvbGUubG9nKHN0ZXBOYW1lKycgZW5hYmxlZCcpO1xuICAgICAgICBsZXQgc3RlcEl0ZW09JCgnLnN0ZXBbZGF0YS1zdGVwTmFtZT1cIicrc3RlcE5hbWUrJ1wiXScpO1xuICAgICAgICBzdGVwSXRlbS5odG1sKCc8YSBjbGFzcz1cInN0ZXBDbGljayBjbGljaycrc3RlcE5hbWUrJ1wiIGRhdGEtc3RlcE5hbWU9XCInK3N0ZXBOYW1lKydcIiBocmVmPVwiI1wiPicrc3RlcEl0ZW0uaHRtbCgpKyc8L2E+Jyk7XG4gICAgICAgIHJvb3QuYmluZENsaWNrQWN0aW9uKCk7XG4gICAgICAgIC8vJCgnLnN0ZXBDbGljaycpLmNsaWNrKHJvb3Quc3RlcENsaWNrKTtcblxuICAgIH1cblxuICAgIHRoaXMuYWRkRW5hYmxlZD1mdW5jdGlvbihzdGVwTmFtZSl7XG4gICAgICAgIGlmKCFPcHRzLmVuYWJsZS5pbmNsdWRlcyhzdGVwTmFtZSkpe1xuICAgICAgICAgICAgT3B0cy5lbmFibGUucHVzaChzdGVwTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5zZXRFbmFibGVkKHN0ZXBOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENvbXBsZXRlZD1mdW5jdGlvbihzdGVwTmFtZSl7XG4gICAgICAgIGlmKCFPcHRzLmNvbXBsZXRlLmluY2x1ZGVzKHN0ZXBOYW1lKSl7XG4gICAgICAgICAgICBPcHRzLmNvbXBsZXRlLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3Quc2V0Q29tcGxldGVkKHN0ZXBOYW1lKTtcbiAgICAgICAgcm9vdC5iaW5kQ2xpY2tBY3Rpb24oKTtcbiAgICB9XG5cblxuICAgIHRoaXMubG9hZFN0ZXBDb250ZW50PWZ1bmN0aW9uIChzdGVwTmFtZSl7XG4gICAgICAgIGxldCBkYXRhPXsndHlwZSc6c3RlcE5hbWV9O1xuICAgICAgICAkLmV4dGVuZChkYXRhLCBPcHRzLlVybERhdGEpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXG4gICAgICAgICAgICB1cmw6IE9wdHMuVVJMLmNyZWF0ZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXN1bHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lcj0kKCcuU0MnK3N0ZXBOYW1lLmNhcGl0YWxpemUoKSk7XG4gICAgICAgICAgICAgICAgaWYoJC5pbkFycmF5KHN0ZXBOYW1lLE9wdHMuZXhjbHVkZUxvYWRlZCk9PS0xKXtcbiAgICAgICAgICAgICAgICAgICAgT3B0cy5sb2FkZWQucHVzaChzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdleGNsdWRlZCBWaWV3Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5odG1sKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYoT3B0cy5ub3dMb2FkZWQpe1xuICAgICAgICAgICAgICAgICAgICBPcHRzLm5vd0xvYWRlZChzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9wdHMub25BZnRlckxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhckxvYWRlZD1mdW5jdGlvbiAoKSB7XG4gICAgICAgIE9wdHMubG9hZGVkPVsnc3VwcGxpZXInXTtcbiAgICAgICAgJCgnLnN0ZXBDb250YWluZXInKS5lYWNoKGZ1bmN0aW9uKCl7XG4vKlxuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5jbGFzc0xpc3QpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ1NDU3VwcGxpZXInKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygkKHRoaXMpLmF0dHIoJ2NsYXNzJykpO1xuKi9cbiAgICAgICAgICAgIGlmKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygnU0NTdXBwbGllcicpKXtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmh0bWwoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEFjdGl2ZUZpbmlzaD1mdW5jdGlvbihzdGVwTmFtZSl7XG4gICAgICAgIGxldCBjb250YWluZXI9JCgnLlNDJytzdGVwTmFtZS5jYXBpdGFsaXplKCkpO1xuICAgICAgICBpZihzdGVwTmFtZT09PSdwcm9kdWN0U2VsZWN0Jyl7XG4gICAgICAgICAgICAkKCcuY29udGFpbmVyU3RlcHBlcicpLmFkZENsYXNzKCdhY3RpdmVTaWRlQmFyJyk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lclN0ZXBwZXInKS5yZW1vdmVDbGFzcygnYWN0aXZlU2lkZUJhcicpO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnKCdzZXRBY3RpdmVGaW5pc2ggc2hvdzonK3N0ZXBOYW1lKTtcbiAgICAgICAgY29udGFpbmVyLnNob3coKTtcbiAgICAgICAgT3B0cy5ub3dMb2FkZWQ9ZmFsc2U7XG4gICAgICAgIHJvb3QuYWN0aXZlPXN0ZXBOYW1lO1xuICAgICAgICBPcHRzLm9uQWZ0ZXJBY3RpdmF0ZSgpO1xuICAgICAgICBpZih0eXBlb2YgT3B0cy5hdXRvQ2FsbGJhY2tbc3RlcE5hbWVdIT09J3VuZGVmaW5lZCcgKXtcbiAgICAgICAgICAgIE9wdHMuYXV0b0NhbGxiYWNrW3N0ZXBOYW1lXS5vbkFmdGVyQWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldEFjdGl2ZT1mdW5jdGlvbihzdGVwTmFtZSl7XG4gICAgICAgICQoJy5zdGVwQ29udGFpbmVyJykuaGlkZSgpO1xuICAgICAgICBpZighT3B0cy5sb2FkZWQuaW5jbHVkZXMoc3RlcE5hbWUpKXtcbiAgICAgICAgICAgIHJvb3QubG9hZFN0ZXBDb250ZW50KHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIE9wdHMubm93TG9hZGVkPXRoaXMuc2V0QWN0aXZlRmluaXNoO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRmluaXNoKHN0ZXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RlcENsaWNrPWZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IHN0ZXBOYW1lPSQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnc3RlcG5hbWUnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3NldEFjdGl2ZTonK3N0ZXBOYW1lKTtcbiAgICAgICAgcm9vdC5zZXRBY3RpdmUoc3RlcE5hbWUpO1xuICAgIH1cbn1cblxud2luZG93Lk9yZGVyTW9kdWxlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgLypcbiAgICAgKiBWYXJpYWJsZXMgYWNjZXNzaWJsZVxuICAgICAqIGluIHRoZSBjbGFzc1xuICAgICAqL1xuICAgIGxldCBPcHRzID0ge1xuICAgICAgICB0ZXN0TW9kZTogZmFsc2UsXG4gICAgICAgIG5lZWRTdGVwcGVyOnRydWUsXG4gICAgICAgIENTU1NlbGVjdG9yRm9ybTonLm9yZGVyUGFyYW1ldGVyRm9ybScsXG4gICAgICAgIGRlZmF1bHREZWxpdmVyeURhdGU6JycsXG4gICAgICAgIGRhdGFTeW5jUGF1c2VUaW1lOjUwMCxcbiAgICAgICAgdG9rZW46bnVsbCxcbiAgICAgICAgVVJMOiB7XG4gICAgICAgICAgICByb290Om51bGwsXG4gICAgICAgICAgICBnZXREYXRhVGFibGVDb250ZW50UHJvZHVjdExpc3Q6bnVsbCxcbiAgICAgICAgICAgIGNoZWNrUmVhZHlUb1NlbmQ6bnVsbCxcbiAgICAgICAgICAgIGluZGV4Om51bGwsXG4gICAgICAgICAgICBzaG93Om51bGwsXG4gICAgICAgICAgICBlZGl0Om51bGwsXG4gICAgICAgICAgICBjcmVhdGU6IG51bGwsXG4gICAgICAgICAgICBzdG9yZTogbnVsbCxcbiAgICAgICAgICAgIHVwZGF0ZTpudWxsLFxuICAgICAgICAgICAgZGVzdHJveTpudWxsLFxuICAgICAgICAgICAgdG9nZ2xlRmF2b3JpdGVzOm51bGwsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IFB1YmxpY1ZhciA9IHt9O1xuICAgIGxldCBQdWJsaWNWYXIyID0geydhc2QnOiAnMjEnfTtcbiAgICBsZXQgQXBpVG9rZW4gPSBudWxsO1xuICAgIGxldCBPcmRlcj1udWxsO1xuICAgIGxldCByb290ID0gdGhpcztcbiAgICBsZXQgdmlld0luaWNpYWxpemVkPVtdO1xuXG4gICAgdGhpcy5zZXRPcHRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRPcHRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gT3B0cztcbiAgICB9XG4gICAgdGhpcy5jbGlja09yZGVyRWRpdD1mdW5jdGlvbiAoZGF0YSl7XG4gICAgICAgIGRlYnVnKCdjbGlja0VkaXQnKTtcbiAgICAgICAgZGVidWcoZGF0YSk7XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmVkaXQucmVwbGFjZSgnJWlkJScsZGF0YS5pZCk7XG4gICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoYWpheFVybCk7XG4vKiAgICAgICAgbGV0IGFqYXhEYXRhPXt9O1xuICAgICAgICBhamF4RGF0YS5fdG9rZW49T3B0cy50b2tlbjtcbiAgICAgICAgJC5leHRlbmQoYWpheERhdGEsT3JkZXIpO1xuICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5lZGl0LnJlcGxhY2UoJyVpZCUnLGRhdGEuaWQpO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBhamF4VXJsLFxuICAgICAgICAgICAgbWV0aG9kOidHRVQnLFxuICAgICAgICAgICAgZGF0YTphamF4RGF0YSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3VjY2Vzcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcmRlckRhdGE9cmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJEYXRhLnN1cHBsaWVySWQ9b3JkZXJEYXRhLnN1cHBsaWVyX2lkO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUob3JkZXJEYXRhLnN1cHBsaWVyX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5pbml0T3JkZXIob3JkZXJEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5pbml0U3RlcHBlcigpO1xuICAgICAgICAgICAgICAgICAgICAvL3Jvb3QuYWZ0ZXJPcmRlclNldFN1cHBsaWVyT2soZGF0YS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pOyovXG5cblxuICAgIH1cbiAgICB0aGlzLmFmdGVyT3JkZXJEZWxldGVkPWZ1bmN0aW9uIChkYXRhKXtcbiAgICAgICAgaWYoZGF0YS5zdWNjZXNzPT10cnVlKXtcbiAgICAgICAgICAgIGRlYnVnKCdPcmRlciBkZWxldGUgc3VjY2VzcycpO1xuICAgICAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChPcHRzLlVSTC5pbmRleCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiRXJyb3IgZGVsZXRlZCAhXCIsIG1lc3NhZ2U6ICcnLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5EQU5HRVIsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGlja09yZGVyRGVsZXRlQ29uZmlybWVkPWZ1bmN0aW9uIChldmVudCl7XG4gICAgICAgIGRlYnVnKCdjbGlja09yZGVyRGVsZXRlQ29uZmlybWVkJyk7XG4gICAgICAgIGRlYnVnKGV2ZW50KTtcbiAgICAgICAgZGVidWcoZXZlbnQuZGF0YSk7XG4gICAgICAgICQoJyNkaWFsb2dNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIGxldCBhamF4RGF0YT17fTtcbiAgICAgICAgYWpheERhdGEuX3Rva2VuPU9wdHMudG9rZW47XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmRlc3Ryb3kucmVwbGFjZSgnJWlkJScsZXZlbnQuZGF0YS5pZCk7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICBtZXRob2Q6XCJERUxFVEVcIixcbiAgICAgICAgICAgIHN1Y2Nlc3M6cm9vdC5hZnRlck9yZGVyRGVsZXRlZCxcbiAgICAgICAgICAgIC8vZXJyb3I6YWpheEVycm9ySGFuZGxlclxuICAgICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLmluaXRWaWV3T3JkZXJTZWxlY3Q9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGRlYnVnKCdjYWxsZWQgaW5pdFZpZXdPcmRlclNlbGVjdCAnKTtcbiAgICAgICAgJCgnLm9yZGVyc1NlbGVjdFRhYmxlIGJ1dHRvbicpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnLm9yZGVyc1NlbGVjdFRhYmxlIGJ1dHRvbicpLm9uKCdjbGljaycsZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBsZXQgYWN0aW9uPSQodGhpcykuZGF0YSgnYWN0aW9uJyk7XG4gICAgICAgICAgICBsZXQgb3JkZXJJZD0kKCQodGhpcykuY2xvc2VzdCgndHInKVswXSkuZGF0YSgnb3JkZXJpZCcpO1xuICAgICAgICAgICAgZGVidWcoYWN0aW9uKTtcbiAgICAgICAgICAgIGRlYnVnKG9yZGVySWQpO1xuXG4gICAgICAgICAgICBpZihhY3Rpb249PSdkZWxldGUnKXtcbiAgICAgICAgICAgICAgICAkKCcjZGlhbG9nTW9kYWwnKS5vbignc2hvdy5icy5tb2RhbCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBuZWNlc3NhcnksIHlvdSBjb3VsZCBpbml0aWF0ZSBhbiBBSkFYIHJlcXVlc3QgaGVyZSAoYW5kIHRoZW4gZG8gdGhlIHVwZGF0aW5nIGluIGEgY2FsbGJhY2spLlxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1vZGFsJ3MgY29udGVudC4gV2UnbGwgdXNlIGpRdWVyeSBoZXJlLCBidXQgeW91IGNvdWxkIHVzZSBhIGRhdGEgYmluZGluZyBsaWJyYXJ5IG9yIG90aGVyIG1ldGhvZHMgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuZmluZCgnLm1vZGFsLXRpdGxlJykudGV4dCgnTWVnZXLFkXPDrXTDqXMgJyk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5tb2RhbC1ib2R5JykudGV4dCgnQml6dG9zYW4gdMO2cmxpIGEgbWVncmVuZGVsw6lzdD8nKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuZmluZCgnLmJ1dHRvblllcycpLm9mZignY2xpY2snKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuZmluZCgnLmJ1dHRvblllcycpLm9uKCdjbGljaycse2lkOm9yZGVySWR9LHJvb3QuY2xpY2tPcmRlckRlbGV0ZUNvbmZpcm1lZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgJCgnI2RpYWxvZ01vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJvb3QuY2xpY2tPcmRlckVkaXQoe2lkOm9yZGVySWR9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICQoJy5idXR0b25OZXcnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5idXR0b25OZXcnKS5vbignY2xpY2snLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgQVBQLmxvYWRNYWluQ29udGVudChPcHRzLlVSTC5pbmRleCwnZm9yY2U9dHJ1ZScpO1xuICAgICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLmluaXRTdGVwcGVyPWZ1bmN0aW9uICgpe1xuICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKCkpO1xuICAgICAgICB2aWV3SW5pY2lhbGl6ZWQ9W107XG4gICAgICAgICQoJy5zdGF0dXNOYW1lUGxhY2UnKS50ZXh0KCdOaW5jcyBlbGvDvGxkdmUnKTtcbiAgICAgICAgJCgnLnN0YXR1c05hbWVQbGFjZScpLmFkZENsYXNzKCdzdGF0dXNCbGluaycpO1xuICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZSgnLScpO1xuICAgICAgICByb290LnNldFN1cHBsaWVyKCctJyk7XG5cbiAgICAgICAgbGV0IHVuRW5hYmxlZD1bJ3BhcmFtZXRlcicsICdwcm9kdWN0U2VsZWN0JywgJ2ludm9pY2UnLCAnc2VuZCddO1xuICAgICAgICAkLmVhY2godW5FbmFibGVkLGZ1bmN0aW9uIChpbmRleCx2YWx1ZSkge1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0RW5hYmxlZCh2YWx1ZSk7XG4gICAgICAgICAgICByb290LlN0ZXBwZXIudW5zZXRDb21wbGV0ZWQodmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZWJ1Zyhyb290LlN0ZXBwZXIuZ2V0T3B0cygpWydhdmFpbGFibGUnXSk7XG4gICAgICAgIGRlYnVnKE9yZGVyLmdldERhdGEoKVsnb3JkZXJTdGF0dXMnXSk7XG5cbiAgICAgICAgbGV0IHN0ZXBBY3RpdmU9J3N1cHBsaWVyJztcbiAgICAgICAgbGV0IHN0ZXBDb21wbGV0ZT1bJ3N1cHBsaWVyJ107XG4gICAgICAgIGxldCBzdGVwRW5hYmxlPVtdO1xuICAgICAgICBsZXQgc3RlcE9uQWZ0ZXJBY3RpdmF0ZT1mdW5jdGlvbiAoKXt9O1xuXG4gICAgICAgIGxldCBhdmFsYWlibGVTdGVwcz1yb290LlN0ZXBwZXIuZ2V0T3B0cygpWydhdmFpbGFibGUnXTtcbiAgICAgICAgbGV0IHN0ZXBVcmxEYXRhPWZhbHNlO1xuICAgICAgICBsZXQgc3RlcEF1dG9DYWxsYmFjaz1bXTtcbiAgICAgICAgZm9yIChsZXQgc3RlcE5hbWUgb2YgYXZhbGFpYmxlU3RlcHMpIHtcbiAgICAgICAgICAgIHN0ZXBPbkFmdGVyQWN0aXZhdGU9dGhpc1snaW5pdFZpZXcnK3N0ZXBOYW1lLmNhcGl0YWxpemUoKV07XG4gICAgICAgICAgICBsZXQgaXRlbT17fTtcbiAgICAgICAgICAgIGl0ZW1bJ29uQWZ0ZXJBY3RpdmF0ZSddPXN0ZXBPbkFmdGVyQWN0aXZhdGU7XG4gICAgICAgICAgICBzdGVwQXV0b0NhbGxiYWNrW3N0ZXBOYW1lXT1pdGVtO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnKHN0ZXBBdXRvQ2FsbGJhY2spO1xuICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKClbJ2lkJ10pO1xuICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2lkJ10+MCl7XG4gICAgICAgICAgICBkZWJ1ZygnaGFqcmEnKTtcbiAgICAgICAgICAgIGRlYnVnKE9yZGVyLmdldERhdGEoKSk7XG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddKXtcbiAgICAgICAgICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZShPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddKTtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIEB0b2RvOiB3ZWVrbHktdCBiZWFsbGl0YW5pXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ3N1cHBsaWVyTmFtZSddKXtcbiAgICAgICAgICAgICAgICByb290LnNldFN1cHBsaWVyKE9yZGVyLmdldERhdGEoKVsnc3VwcGxpZXJOYW1lJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RlcFVybERhdGE9eydzdXBwbGllcklkJzpPcmRlci5zdXBwbGllcklkLGlkOk9yZGVyLmlkfTtcbiAgICAgICAgICAgIGZvciAobGV0IHN0ZXBOYW1lIG9mIGF2YWxhaWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIHN0ZXBDb21wbGV0ZS5wdXNoKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICBzdGVwRW5hYmxlLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnb3JkZXJTdGF0dXMnXT09c3RlcE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICBzdGVwQWN0aXZlPXN0ZXBOYW1lO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnaW5pdFZpZXcnK3N0ZXBOYW1lLmNhcGl0YWxpemUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHN0ZXBOYW1lIT09J2ludm9pY2UnICYmIHN0ZXBOYW1lIT09J3NlbmQnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBPbkFmdGVyQWN0aXZhdGU9dGhpc1snaW5pdFZpZXcnK3N0ZXBOYW1lLmNhcGl0YWxpemUoKV07XG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE9uQWZ0ZXJBY3RpdmF0ZT1mdW5jdGlvbiAoKXt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuLypcbiAgICAgICAgICAgIC8vcmVmYWN0b3JlZCBmb3IgbG9vcFxuICAgICAgICAgICAgdmFyIEJyZWFrRXhjZXB0aW9uID0ge307XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF2YWxhaWJsZVN0ZXBzLmZvckVhY2goZnVuY3Rpb24oc3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBzdGVwQ29tcGxldGUucHVzaChzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBFbmFibGUucHVzaChzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnb3JkZXJTdGF0dXMnXT09c3RlcE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEFjdGl2ZT1zdGVwTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJyZWFrRXhjZXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAhPT0gQnJlYWtFeGNlcHRpb24pIHRocm93IGU7XG4gICAgICAgICAgICB9Ki9cblxuICAgICAgICB9XG5cbiAgICAgICAgcm9vdC5TdGVwcGVyLmluaXQoe1xuICAgICAgICAgICAgY29tcGxldGU6c3RlcENvbXBsZXRlLFxuICAgICAgICAgICAgZW5hYmxlOnN0ZXBFbmFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6W10sXG4gICAgICAgICAgICBhY3RpdmU6IHN0ZXBBY3RpdmUsXG4gICAgICAgICAgICBVUkw6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGU6IE9wdHMuVVJMLmNyZWF0ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBVcmxEYXRhOnN0ZXBVcmxEYXRhLFxuICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnN0ZXBPbkFmdGVyQWN0aXZhdGUsXG4gICAgICAgICAgICBhdXRvQ2FsbGJhY2s6IHN0ZXBBdXRvQ2FsbGJhY2ssXG4gICAgICAgICAgICAvKntcbiAgICAgICAgICAgICAgICBpbnZvaWNlOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTpyb290LmluaXRWaWV3SW52b2ljZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VuZDoge1xuICAgICAgICAgICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6cm9vdC5pbml0Vmlld1NlbmRcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0T3JkZXI9ZnVuY3Rpb24gKGRhdGEpe1xuICAgICAgICBPcmRlcj1uZXcgRGF0YU1vZGVsT3JkZXIoZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgZGVidWcoJ09yZGVyTW9kdWwgaW5pdCBjYWxsZWQnKTtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgd2luZG93Lk9yZGVyTW9kdWxEZWZhdWx0LCBvcHRpb25zKTtcbiAgICAgICAgT3JkZXI9bmV3IERhdGFNb2RlbE9yZGVyKCk7XG4gICAgICAgIGlmKE9wdHMubmVlZFN0ZXBwZXIpe1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLlN0ZXBwZXIgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLlN0ZXBwZXI9bmV3IFN0ZXBwZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZihPcHRzLnRlc3RNb2RlKXtcbiAgICAgICAgICAgIHJldHVybiByb290LnRlc3RNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN1cHBsaWVyPWZ1bmN0aW9uIChzdXBwbGllck5hbWUsc3VwcGxpZXJJZCl7XG4gICAgICAgaWYoc3VwcGxpZXJOYW1lKXtcbiAgICAgICAgICAgJCgnLnN1cHBsaWVyTmFtZVBsYWNlJykudGV4dChzdXBwbGllck5hbWUpO1xuICAgICAgIH1cbiAgICAgICBpZihzdXBwbGllcklkKXtcbiAgICAgICAgICAgT3JkZXIuc2V0RGF0YSh7c3VwcGxpZXJJZDpzdXBwbGllcklkfSk7XG4gICAgICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHsnVXJsRGF0YSc6eydzdXBwbGllcklkJzpzdXBwbGllcklkfX0pO1xuICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXREZWxpdmVyeURhdGU9ZnVuY3Rpb24gKGRhdGVUZXh0LGRhdGVUZXh0VG8pe1xuICAgICAgICBsZXQgZGF0ZVRleHRIdW1hbj1kYXRlVGV4dC5yZXBsYWNlQWxsKCctJywnLicpKycuJztcbiAgICAgICAgaWYoZGF0ZVRleHRIdW1hbi5sZW5ndGg8NSl7XG4gICAgICAgICAgICAkKCcuZGVsaXZlcnlEYXRlUGxhY2UnKS50ZXh0KGRhdGVUZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZihkYXRlVGV4dFRvKXtcbiAgICAgICAgICAgIGRhdGVUZXh0SHVtYW4rPScgLSAnK2RhdGVUZXh0VG8ucmVwbGFjZUFsbCgnLScsJy4nKSsnLic7XG4gICAgICAgIH1cblxuICAgICAgICAkKE9wdHMuQ1NTU2VsZWN0b3JGb3JtKycgLnNlbGVjdGVkRGF0ZVRleHQnKS50ZXh0KGRhdGVUZXh0SHVtYW4pO1xuICAgICAgICAkKCcuZGVsaXZlcnlEYXRlUGxhY2UnKS50ZXh0KGRhdGVUZXh0SHVtYW4pO1xuICAgICAgICAkKE9wdHMuQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1cImRlbGl2ZXJ5RGF0ZVwiXScpLnZhbChkYXRlVGV4dCk7XG4gICAgfVxuXG5cblxuICAgIHRoaXMuZ2V0RGF0YT1mdW5jdGlvbiAoKXtcbiAgICAgICAgcmV0dXJuIE9yZGVyO1xuICAgIH1cblxuXG4gICAgdGhpcy5zZXRTdXBwbGllckNvbXBsZXRlZD1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdiaW5nbycpO1xuICAgICAgICByb290LmluaXRWaWV3UGFyYW1ldGVyKClcbiAgICB9XG5cbiAgICB0aGlzLmFmdGVyT3JkZXJTZXRTdXBwbGllck9rPWZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIFRvYXN0LmNyZWF0ZSh7IHRpdGxlOiBcIlN1cHBsaWVyIHNlbGVjdGVkICFcIiwgbWVzc2FnZTogZGF0YS5zdXBwbGllci5uYW1lICwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuSU5GTywgdGltZW91dDogNTAwMCB9KTtcbiAgICAgICAgcm9vdC5zZXRTdXBwbGllcihkYXRhLnN1cHBsaWVyLm5hbWUsZGF0YS5zdXBwbGllci5pZCk7XG4gICAgICAgIE9yZGVyLnNldERhdGEoe2lkOmRhdGEuaWR9KTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoeydVcmxEYXRhJzp7J3N1cHBsaWVySWQnOk9yZGVyLnN1cHBsaWVySWQsaWQ6T3JkZXIuaWR9fSk7XG4gICAgICAgIC8vcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOnJvb3Quc2V0U3VwcGxpZXJDb21wbGV0ZWR9KVxuICAgICAgICByb290LlN0ZXBwZXIuc2V0RW5hYmxlZCgncGFyYW1ldGVyJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5hZGRDb21wbGV0ZWQoJ3BhcmFtZXRlcicpO1xuICAgICAgICByb290LlN0ZXBwZXIuc2V0Q29tcGxldGVkKCdwYXJhbWV0ZXInKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldEFjdGl2ZSgncGFyYW1ldGVyJyk7XG4gICAgfVxuXG5cbiAgICB0aGlzLmluaXRWaWV3U3VwcGxpZXI9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGRlYnVnKCdjYWxsIGluaXRWaWV3U3VwcGxpZXInKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOmZ1bmN0aW9uICgpe319KTtcbiAgICAgICAgJCgnLnN1cHBsaWVySXRlbScpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnLnN1cHBsaWVySXRlbScpLm9uKCdjbGljaycsZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coT3JkZXIuZ2V0RGF0YSgpKTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxldCBzdXBwbGllcklkPSQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnaWQnKTtcbiAgICAgICAgICAgIGxldCBzdXBwbGllck5hbWU9JChldmVudC5jdXJyZW50VGFyZ2V0KS5maW5kKCdoNS5jYXJkLXRpdGxlJykudGV4dCgpO1xuICAgICAgICAgICAgaWYodHlwZW9mIE9yZGVyLnN1cHBsaWVySWQ9PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAvL25ldyBvcmRlclxuXG4gICAgICAgICAgICAgICAgbGV0IGFqYXhEYXRhPXt9O1xuICAgICAgICAgICAgICAgIGFqYXhEYXRhLl90b2tlbj1PcHRzLnRva2VuO1xuICAgICAgICAgICAgICAgIGFqYXhEYXRhLnN1cHBsaWVySWQ9c3VwcGxpZXJJZDtcbiAgICAgICAgICAgICAgICBhamF4RGF0YS5zdG9yZVR5cGU9J3N1cHBsaWVyU2VsZWN0JztcbiAgICAgICAgICAgICAgICAkLmV4dGVuZChhamF4RGF0YSxPcmRlcik7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBPcHRzLlVSTC5zdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOidQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTphamF4RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LmFmdGVyT3JkZXJTZXRTdXBwbGllck9rKGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL09yZGVyLnNldERhdGEoe3N1cHBsaWVySWQ6c3VwcGxpZXJJZH0pO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgLy9pZGUga2VsbGVuZSBlZ3kgam8ga2lzIGtlcmRlc1xuICAgICAgICAgICAgICAgIGlmKE9yZGVyLnN1cHBsaWVySWQhPXN1cHBsaWVySWQpe1xuICAgICAgICAgICAgICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJTdXBwbGllciBjaGFuZ2UgdG8hXCIsIG1lc3NhZ2U6IHN1cHBsaWVyTmFtZSwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuV0FSTklORywgdGltZW91dDogNTAwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmNsZWFyTG9hZGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIE9yZGVyPW5ldyBEYXRhTW9kZWxPcmRlcigpO1xuICAgICAgICAgICAgICAgICAgICAvL09yZGVyLnNldERhdGEoe3N1cHBsaWVySWQ6c3VwcGxpZXJJZH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyb290LlN0ZXBwZXIuZ2V0T3B0cygpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLScpO1xuXG4gICAgICAgICAgICAvLyQoJy5zdXBwbGllck5hbWVQbGFjZScpLnRleHQoc3VwcGxpZXJOYW1lKTtcbiAgICAgICAgICAgIHJvb3Quc2V0U3VwcGxpZXIoc3VwcGxpZXJOYW1lLHN1cHBsaWVySWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coc3VwcGxpZXJOYW1lKVxuICAgICAgICAgICAgLy9AdG9kbzppZGUga2VsbCBlZ3kgbWVudGVzIVxuICAgICAgICAgICAgLy9AdG9kbzptZW50ZXMgZXJlZGVtZW55ZWtlcHBlbiBsZWhldCB2YWx0YW5pXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOnJvb3Quc2V0U3VwcGxpZXJDb21wbGV0ZWR9KVxuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnNldEVuYWJsZWQoJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmFkZENvbXBsZXRlZCgncGFyYW1ldGVyJyk7XG4gICAgICAgICAgICByb290LlN0ZXBwZXIuc2V0Q29tcGxldGVkKCdwYXJhbWV0ZXInKTtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5zZXRBY3RpdmUoJ3BhcmFtZXRlcicpO1xuXG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja0NvbnRhY3ROYW1lRmllbGQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgQ1NTU2VsZWN0b3JGb3JtPScub3JkZXJQYXJhbWV0ZXJGb3JtJztcbiAgICAgICAgbGV0IG5vZGU9JChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpO1xuICAgICAgICBpZihub2RlLnZhbCgpLmxlbmd0aDwyKXtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ2lzLXZhbGlkJyk7XG4gICAgICAgICAgICBub2RlLmFkZENsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbm9kZS5hZGRDbGFzcygnaXMtdmFsaWQnKTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIHRoaXMuc2VuZE9yZGVyRGF0YVRvU2VydmVyPWZ1bmN0aW9uICh1cGRhdGVUeXBlLGNhbGxiYWNrLGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgbGV0IGFqYXhEYXRhPSB7fTtcbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuc3RvcmU7XG4gICAgICAgIGxldCBhamF4TWV0aG9kPVwiUE9TVFwiO1xuICAgICAgICBpZihPcmRlci5pZCl7XG4gICAgICAgICAgICBhamF4VXJsPU9wdHMuVVJMLnVwZGF0ZS5yZXBsYWNlKCclaWQlJyxPcmRlci5pZCk7XG4gICAgICAgICAgICAvL2FqYXhNZXRob2Q9XCJQVVRcIjtcbiAgICAgICAgICAgIC8vYWpheERhdGE9bmV3IEZvcm1EYXRhKCQoQ1NTU2VsZWN0b3JGb3JtKVswXSk7XG4gICAgICAgICAgICBhamF4RGF0YS5fbWV0aG9kPSdQVVQnO1xuICAgICAgICB9XG4gICAgICAgIGFqYXhEYXRhLl90b2tlbj1PcHRzLnRva2VuO1xuICAgICAgICBhamF4RGF0YS51cGRhdGVUeXBlPXVwZGF0ZVR5cGU7XG4gICAgICAgICQuZXh0ZW5kKGFqYXhEYXRhLE9yZGVyKTtcbiAgICAgICAgZGVidWcoT3JkZXIpO1xuICAgICAgICBkZWJ1ZyhhamF4RGF0YSk7XG4gICAgICAgIGRlYnVnKCdhamF4VXJsOicrYWpheFVybCk7XG4gICAgICAgIGFqYXhEYXRhPWpzb25Ub0Zvcm1EYXRhKGFqYXhEYXRhKTtcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDphamF4VXJsLFxuICAgICAgICAgICAgZGF0YTphamF4RGF0YSxcbiAgICAgICAgICAgIHR5cGU6YWpheE1ldGhvZCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOmZhbHNlLFxuICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdhamF4IHJldHVybmVkIGRhdGEnKTtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhkYXRhKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3Mpe1xuICAgICAgICAgICAgICAgICAgICAvL3Jvb3QuYWZ0ZXJPcmRlclNldFN1cHBsaWVyT2soZGF0YS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyLCBhamF4T3B0aW9ucywgdGhyb3duRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhamF4RXJyb3JIYW5kbGVyKHhociwgYWpheE9wdGlvbnMsIHRocm93bkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgZXJyb3JDYWxsYmFjayE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHhoci5yZXNwb25zZUpTT04pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgfSk7XG5cbiAgICB9XG4gICAgdGhpcy5hZnRlck9yZGVyU2V0UGFyYW1ldGVyT2s9ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZGVidWcoJ2NhbGxlZCBhZnRlck9yZGVyU2V0UGFyYW1ldGVyT2snKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoeydVcmxEYXRhJzp7J3N1cHBsaWVySWQnOk9yZGVyLnN1cHBsaWVySWQsJ2lkJzpPcmRlci5pZH19KTtcbiAgICAgICAgLy9yb290LlN0ZXBwZXIuc2V0T3B0cyh7b25BZnRlckxvYWQ6cm9vdC5zZXRQYXJhbWV0ZXJDb21wbGV0ZWR9KVxuICAgICAgICByb290LlN0ZXBwZXIuc2V0RW5hYmxlZCgncHJvZHVjdFNlbGVjdCcpO1xuICAgICAgICByb290LlN0ZXBwZXIuYWRkQ29tcGxldGVkKCdwcm9kdWN0U2VsZWN0Jyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRDb21wbGV0ZWQoJ3Byb2R1Y3RTZWxlY3QnKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldEFjdGl2ZSgncHJvZHVjdFNlbGVjdCcpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEN1cnJlbnRXZWVrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NlbGVjdEN1cnJlbnRXZWVrJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJCgnLnVpLWRhdGVwaWNrZXInKS5maW5kKCcudWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSBhJykpO1xuICAgICAgICAkKCcudWktZGF0ZXBpY2tlcicpLmZpbmQoJy51aS1kYXRlcGlja2VyLWN1cnJlbnQtc2VsZWN0ZWQtd2Vla2RheSBhJykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWFjdGl2ZScpXG4gICAgfVxuICAgIHRoaXMud2Vla0hvdmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvdmVyIEFjdGl2ZScpO1xuICAgICAgICAkKCcudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0cicpLm9mZignbW91c2Vtb3ZlJyk7XG4gICAgICAgICQoJy51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRyJykub2ZmKCdtb3VzZWxlYXZlJyk7XG5cbiAgICAgICAgJCgnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdHInKS5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24oKSB7ICQodGhpcykuZmluZCgndGQgYScpLmFkZENsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpOyB9KTtcbiAgICAgICAgJCgnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdHInKS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmZpbmQoJ3RkIGEnKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKTsgfSk7XG5cbiAgICB9XG4gICAgdGhpcy53ZWVrSG92ZXJTbG93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3dlZWtIb3ZlclNsb3cnKTtcbiAgICAgICAgaWYoJCgnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdHInKS5sZW5ndGg8MSl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJvb3Qud2Vla0hvdmVyU2xvdywgMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC53ZWVrSG92ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5pbml0RGF0ZVBpY2tlcj1mdW5jdGlvbiAodHlwZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdhc2Rhc2RhZGFkJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aXB1cycgKyB0eXBlKTtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybSA9ICcub3JkZXJQYXJhbWV0ZXJGb3JtJztcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZT1uZXcgRGF0ZSgnMTkwMC0wMS0wMScpO1xuICAgICAgICBsZXQgZW5kRGF0ZT1uZXcgRGF0ZSgnMTkwMC0wMS0wMicpO1xuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtICsgJyAuZGF0ZVBpY2tlcicpLmRhdGVwaWNrZXIoXCJkZXN0cm95XCIpO1xuXG4gICAgICAgIGlmICh0eXBlID09ICd3ZWVrbHknKSB7XG4gICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSArICcgLmRhdGVQaWNrZXInKS5kYXRlcGlja2VyKHtcbiAgICAgICAgICAgICAgICBzaG93T3RoZXJNb250aHM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0T3RoZXJNb250aHM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd1dlZWs6IHRydWUsXG4gICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogJ3l5LW1tLWRkJyxcbiAgICAgICAgICAgICAgICBmaXJzdERheTogMSxcbiAgICAgICAgICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGFmdGVyU2hvdzogZnVuY3Rpb24gKGRhdGVUZXh0LCBpbnN0KSB7XG4gICAgICAgICAgICAgICAgICByb290LndlZWtIb3ZlcigpO1xuICAgICAgICAgICAgICAgICAgcm9vdC5zZWxlY3RDdXJyZW50V2VlaygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChkYXRlVGV4dCwgaW5zdCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9ICQodGhpcykuZGF0ZXBpY2tlcignZ2V0RGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBuZXcgZ2V0TW9uZGF5KGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBlbmREYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpIC0gZGF0ZS5nZXREYXkoKSArIDcpO1xuICAgICAgICAgICAgICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZSgkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSggJ3l5LW1tLWRkJyxzdGFydERhdGUpLCQuZGF0ZXBpY2tlci5mb3JtYXREYXRlKCAneXktbW0tZGQnLGVuZERhdGUpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYmVmb3JlU2hvdzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKCdiZWZvcmVTaG93JylcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZW5kRGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcm9vdC53ZWVrSG92ZXJTbG93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJlZm9yZVNob3dEYXk6IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cCgnYmVmb3JlU2hvd0RheScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnaHUtSHUnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjc3NDbGFzcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRlID49IHN0YXJ0RGF0ZSAmJiBkYXRlIDw9IGVuZERhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnaHUtSHUnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NDbGFzcyA9ICd1aS1kYXRlcGlja2VyLWN1cnJlbnQtc2VsZWN0ZWQtd2Vla2RheSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Nzc0NsYXNzID0gJ3VpLXN0YXRlLWFjdGl2ZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3NzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBjc3NDbGFzc107XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oeWVhciwgbW9udGgsIGluc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yb290LnNlbGVjdEN1cnJlbnRXZWVrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN6w6FsbMOtdMOhc2kga29ybMOhdG96w6FzIGFkYXRvayBiZXTDtmx0w6lzZSAoY3NhayBoYSBoYXNEZWxpdmVyeUNvbnN0cmFpbnQgPSB0cnVlKVxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZURhdGVzID0gW107XG4gICAgICAgICAgICBsZXQgbmV4dERlbGl2ZXJ5RGF0ZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaGFzRGVsaXZlcnlDb25zdHJhaW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaG9saWRheXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB3b3JraW5nRGF5cyA9IFtdO1xuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJJbnB1dCA9ICQoQ1NTU2VsZWN0b3JGb3JtICsgJyAuZGF0ZVBpY2tlcicpO1xuICAgICAgICAgICAgbGV0IGNhbGVuZGFyVXJsID0gZGF0ZXBpY2tlcklucHV0LmRhdGEoJ2RlbGl2ZXJ5LWNhbGVuZGFyLXVybCcpO1xuICAgICAgICAgICAgbGV0IHN1cHBsaWVySWQgPSBkYXRlcGlja2VySW5wdXQuZGF0YSgnc3VwcGxpZXItaWQnKTtcbiAgICAgICAgICAgIGxldCBwcm9maXRDZW50ZXJJZCA9IGRhdGVwaWNrZXJJbnB1dC5kYXRhKCdwcm9maXQtY2VudGVyLWlkJyk7XG5cbiAgICAgICAgICAgIGlmIChjYWxlbmRhclVybCAmJiBzdXBwbGllcklkICYmIHByb2ZpdENlbnRlcklkKSB7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjYWxlbmRhclVybCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXJJZDogc3VwcGxpZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdENlbnRlcklkOiBwcm9maXRDZW50ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyRGF0ZVRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVsaXZlcnlDb25zdHJhaW50ID0gZGF0YS5oYXNEZWxpdmVyeUNvbnN0cmFpbnQgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDDnG5uZXBuYXBvayDDqXMgw6F0aGVseWV6ZXR0IG11bmthbmFwb2sg4oCTIG1pbmRpZyBiZXTDtmx0asO8a1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9saWRheXMgPSAoZGF0YS5ob2xpZGF5cyB8fCBbXSkubWFwKGZ1bmN0aW9uKGgpIHsgcmV0dXJuIHsgZGF0ZTogaC5kYXRlLCBkZXNjcmlwdGlvbjogaC5kZXNjcmlwdGlvbiB9OyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdEYXlzID0gKGRhdGEud29ya2luZ0RheXMgfHwgW10pLm1hcChmdW5jdGlvbih3KSB7IHJldHVybiB7IGRhdGU6IHcuZGF0ZSwgZGVzY3JpcHRpb246IHcuZGVzY3JpcHRpb24gfTsgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNEZWxpdmVyeUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVEYXRlcyA9IGRhdGEuYXZhaWxhYmxlRGF0ZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dERlbGl2ZXJ5RGF0ZSA9IGRhdGEubmV4dERlbGl2ZXJ5RGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGEgbmluY3Mgc3rDoWxsw610w6FzaSBrb3Jsw6F0b3rDoXMsIGF6IGF2YWlsYWJsZURhdGVzIMOpcyBuZXh0RGVsaXZlcnlEYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDDvHJlcyBtYXJhZCDigJMgYSBkYXRlcGlja2VyIGF6IGVyZWRldGkgbcOzZG9uIHZpc2Vsa2VkaWtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0RlbGl2ZXJ5Q29uc3RyYWludCAmJiBuZXh0RGVsaXZlcnlEYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gS8O2dmV0a2V6xZEgc3rDoWxsw610w6FzaSBuYXAgYmXDoWxsw610w6FzYSBhbGFww6lydGVsbWV6ZXR0a8OpbnRcbiAgICAgICAgICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZShuZXh0RGVsaXZlcnlEYXRlKTtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSArICcgLnNlbGVjdGVkRGF0ZVRleHQnKS50ZXh0KG5leHREZWxpdmVyeURhdGUpO1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtICsgJyBpbnB1dFtuYW1lPVwiZGVsaXZlcnlEYXRlXCJdJykudmFsKG5leHREZWxpdmVyeURhdGUpO1xuICAgICAgICAgICAgICAgICQoJy5kZWxpdmVyeURhdGVQbGFjZScpLnRleHQobmV4dERlbGl2ZXJ5RGF0ZS5yZXBsYWNlQWxsKCctJywgJy4nKSArICcuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN6w61uIGplbG1hZ3lhcsOhemF0IG1lZ2plbGVuw610w6lzZSBjc2FrIHN6w6FsbMOtdMOhc2kga29ybMOhdG96w6FzIGVzZXTDqW5cbiAgICAgICAgICAgIGlmIChoYXNEZWxpdmVyeUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAkKCcjZGVsaXZlcnlEYXRlTGVnZW5kJykuc2hvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZGF0ZXBpY2tlck9wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogJ3l5LW1tLWRkJyxcbiAgICAgICAgICAgICAgICBtaW5EYXRlOiAoaGFzRGVsaXZlcnlDb25zdHJhaW50ICYmIG5leHREZWxpdmVyeURhdGUpID8gbmV3IERhdGUobmV4dERlbGl2ZXJ5RGF0ZSkgOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0ZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0gKyAnIC5zZWxlY3RlZERhdGVUZXh0JykudGV4dChkYXRlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICQoJy5kZWxpdmVyeURhdGVQbGFjZScpLnRleHQoZGF0ZVRleHQucmVwbGFjZUFsbCgnLScsICcuJykgKyAnLicpO1xuICAgICAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSArICcgaW5wdXRbbmFtZT1cImRlbGl2ZXJ5RGF0ZVwiXScpLnZhbChkYXRlVGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGJlZm9yZVNob3dEYXk6IG1pbmRpZyBha3TDrXYgaGEgdmFuIG11bmthbmFwdMOhciBhZGF0IHZhZ3kgaGFzRGVsaXZlcnlDb25zdHJhaW50XG4gICAgICAgICAgICBkYXRlcGlja2VyT3B0cy5iZWZvcmVTaG93RGF5ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZVN0ciA9ICQuZGF0ZXBpY2tlci5mb3JtYXREYXRlKCd5eS1tbS1kZCcsIGRhdGUpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGhvbGlkYXlFbnRyeSA9IGhvbGlkYXlzLmZpbmQoZnVuY3Rpb24oaCkgeyByZXR1cm4gaC5kYXRlID09PSBkYXRlU3RyOyB9KTtcbiAgICAgICAgICAgICAgICBsZXQgd29ya2luZ0RheUVudHJ5ID0gd29ya2luZ0RheXMuZmluZChmdW5jdGlvbih3KSB7IHJldHVybiB3LmRhdGUgPT09IGRhdGVTdHI7IH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzRGVsaXZlcnkgPSBoYXNEZWxpdmVyeUNvbnN0cmFpbnQgJiYgYXZhaWxhYmxlRGF0ZXMuaW5jbHVkZXMoZGF0ZVN0cik7XG5cbiAgICAgICAgICAgICAgICBsZXQgY3NzQ2xhc3NlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB0b29sdGlwID0gJyc7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGhvbGlkYXlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzLnB1c2goJ3dvcmstY2FsZW5kYXItaG9saWRheScpO1xuICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gJ8Ocbm5lcG5hcCcgKyAoaG9saWRheUVudHJ5LmRlc2NyaXB0aW9uID8gJzogJyArIGhvbGlkYXlFbnRyeS5kZXNjcmlwdGlvbiA6ICcnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmtpbmdEYXlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzLnB1c2goJ3dvcmstY2FsZW5kYXItd29ya2luZy1kYXknKTtcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9ICfDgXRoZWx5ZXpldHQgbXVua2FuYXAnICsgKHdvcmtpbmdEYXlFbnRyeS5kZXNjcmlwdGlvbiA/ICc6ICcgKyB3b3JraW5nRGF5RW50cnkuZGVzY3JpcHRpb24gOiAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlbGl2ZXJ5Q29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcy5wdXNoKCdkZWxpdmVyeS1kYXktYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvb2x0aXApIHRvb2x0aXAgPSAnU3rDoWxsw610w6FzaSBuYXAnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcy5wdXNoKCdkZWxpdmVyeS1kYXktdW5hdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9vbHRpcCkgdG9vbHRpcCA9ICdOZW0gc3rDoWxsw610w6FzaSBuYXAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhIMO8bm5lcG5hcCDDqXMgaGFzRGVsaXZlcnlDb25zdHJhaW50IG5pbmNzIGJla2FwY3NvbHZhLCBheiDDvG5uZXBuYXAgaXMgbGV0aWx0YW5kw7NcbiAgICAgICAgICAgICAgICBpZiAoaG9saWRheUVudHJ5ICYmICFoYXNEZWxpdmVyeUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbc2VsZWN0YWJsZSwgY3NzQ2xhc3Nlcy5qb2luKCcgJyksIHRvb2x0aXBdO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0gKyAnIC5kYXRlUGlja2VyJykuZGF0ZXBpY2tlcihkYXRlcGlja2VyT3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jYWxsQ2hhbmdlT3JkZXJUeXBlPWZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnZhbHVlKTtcbiAgICAgICAgcm9vdC5pbml0RGF0ZVBpY2tlcih0aGlzLnZhbHVlKTtcbiAgICAgICAgLy9lbnVtKCdkYWlseScsICd3ZWVrbHknKVxuICAgICAgICAvKmxldCBDU1NTZWxlY3RvckZvcm09Jy5vcmRlclBhcmFtZXRlckZvcm0nO1xuICAgICAgICBsZXQgbm9kZT0kKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9Y29udGFjdE5hbWVdJyk7XG4gICAgICAgIGlmKG5vZGUudmFsKCkubGVuZ3RoPDIpe1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVDbGFzcygnaXMtdmFsaWQnKTtcbiAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBub2RlLmFkZENsYXNzKCdpcy12YWxpZCcpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgKi9cbiAgICB9XG5cbiAgICB0aGlzLmluaXRWaWV3UGFyYW1ldGVyPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NhbGwgaW5pdFZpZXdQYXJhbWV0ZXInKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOmZ1bmN0aW9uICgpe319KTtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT0nLm9yZGVyUGFyYW1ldGVyRm9ybSc7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLmRhdGVQaWNrZXJDbGljaycpLmNsaWNrKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5kYXRlUGlja2VyJykuZGF0ZXBpY2tlcignc2hvdycpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5vcmRlclBhcmFtZXRlckRlbGl2ZXJ5QWRkcmVzcycpLnNlbGVjdDIoe30pLnNob3coKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpLm9mZignYmx1cicpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9Y29udGFjdE5hbWVdJykub2ZmKCdrZXl1cCcpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9Y29udGFjdE5hbWVdJykub24oJ2JsdXInLHJvb3QuY2hlY2tDb250YWN0TmFtZUZpZWxkKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpLm9uKCdrZXl1cCcscm9vdC5jaGVja0NvbnRhY3ROYW1lRmllbGQpO1xuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1vcmRlclR5cGVdJykub2ZmKCdjaGFuZ2UnKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPW9yZGVyVHlwZV0nKS5vbignY2hhbmdlJyxyb290LmNhbGxDaGFuZ2VPcmRlclR5cGUpO1xuXG5cbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAub3JkZXJQYXJhbWV0ZXJOZXh0QnV0dG9uJykub2ZmKCdjbGljaycpO1xuICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2lkJ10+MCl7XG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ29yZGVyVHlwZSddPT0nd2Vla2x5Jyl7XG4gICAgICAgICAgICAgICAgcm9vdC5pbml0RGF0ZVBpY2tlcihPcmRlci5nZXREYXRhKClbJ29yZGVyVHlwZSddKTtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybStcIiBpbnB1dFtuYW1lPW9yZGVyVHlwZV1bdmFsdWU9XCIgKyBPcmRlci5nZXREYXRhKClbJ29yZGVyVHlwZSddICsgXCJdXCIpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddKTtcbiAgICAgICAgICAgICAgICBlbmREYXRlLnNldERhdGUoZW5kRGF0ZS5nZXREYXRlKCkgKyA2KTtcbiAgICAgICAgICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZShPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddLCQuZGF0ZXBpY2tlci5mb3JtYXREYXRlKCAneXktbW0tZGQnLGVuZERhdGUpKTtcbiAgICAgICAgICAgICAgICByb290LmluaXREYXRlUGlja2VyKCd3ZWVrbHknKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnZGVsaXZlcnlEYXRlJ10pe1xuICAgICAgICAgICAgICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZShPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm9vdC5pbml0RGF0ZVBpY2tlcignZGFpbHknKTtcbiAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnY29udGFjdE5hbWUnXSl7XG4gICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpLnZhbChPcmRlci5nZXREYXRhKClbJ2NvbnRhY3ROYW1lJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydub3RlJ10pe1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgdGV4dGFyZWFbbmFtZT1ub3RlXScpLnZhbChPcmRlci5nZXREYXRhKClbJ25vdGUnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5QWRkcmVzc0lkJ10pe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9ZGVsaXZlcnlBZGRyZXNzSWRdJykpO1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9ZGVsaXZlcnlBZGRyZXNzSWRdJykudmFsKE9yZGVyLmdldERhdGEoKVsnZGVsaXZlcnlBZGRyZXNzSWQnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2N1c3RvbU5vdGlmaWNhdGlvbkVtYWlsJ10pe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9Y3VzdG9tTm90aWZpY2F0aW9uRW1haWxdJykpO1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9Y3VzdG9tTm90aWZpY2F0aW9uRW1haWxdJykudmFsKE9yZGVyLmdldERhdGEoKVsnY3VzdG9tTm90aWZpY2F0aW9uRW1haWwnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcm9vdC5pbml0RGF0ZVBpY2tlcignZGFpbHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLm9yZGVyUGFyYW1ldGVyRGVsaXZlcnlBZGRyZXNzJykuc2VsZWN0Mih7fSkuc2hvdygpO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5vcmRlclBhcmFtZXRlckN1c3RvbU5vdGlmaWNhdGlvbkVtYWlsJykuc2VsZWN0Mih7fSkuc2hvdygpO1xuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKS5zdWJtaXQoZnVuY3Rpb24oZXZlbnQpe1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKCQoQ1NTU2VsZWN0b3JGb3JtKVswXS5jaGVja1ZhbGlkaXR5KCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ3ZhbGlkYXRvbiBmYWxzZScpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICBkZWJ1ZygndmFsaWRhdG9uIG9rJyk7XG4gICAgICAgICAgICAgICAgLy9kbyB5b3VyIGFqYXggc3VibWl0aW9uIGhlcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQoJy5kZWxpdmVyeURhdGVQbGFjZScpLnRleHQoJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWRlbGl2ZXJ5RGF0ZV0nKS52YWwoKS5yZXBsYWNlQWxsKCctJywnLicpKycuJyk7XG5cbiAgICAgICAgICAgIE9yZGVyLnNldERhdGEoe1xuICAgICAgICAgICAgICAgIGNvbnRhY3ROYW1lOiQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1jb250YWN0TmFtZV0nKS52YWwoKSxcbiAgICAgICAgICAgICAgICBub3RlOiQoQ1NTU2VsZWN0b3JGb3JtKycgdGV4dGFyZWFbbmFtZT1ub3RlXScpLnZhbCgpLFxuICAgICAgICAgICAgICAgIG9yZGVyVHlwZTokKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0OmNoZWNrZWRbbmFtZT1vcmRlclR5cGVdJykudmFsKCksXG4gICAgICAgICAgICAgICAgZGVsaXZlcnlEYXRlOiQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1kZWxpdmVyeURhdGVdJykudmFsKCksXG4gICAgICAgICAgICAgICAgZGVsaXZlcnlBZGRyZXNzSWQ6JChDU1NTZWxlY3RvckZvcm0rJyBzZWxlY3RbbmFtZT1kZWxpdmVyeUFkZHJlc3NJZF0nKS52YWwoKSxcbiAgICAgICAgICAgICAgICBkZWxpdmVyeUFkZHJlc3M6JChDU1NTZWxlY3RvckZvcm0rJyBzZWxlY3RbbmFtZT1kZWxpdmVyeUFkZHJlc3NdJykudmFsKCksXG4gICAgICAgICAgICAgICAgY3VzdG9tTm90aWZpY2F0aW9uRW1haWw6JChDU1NTZWxlY3RvckZvcm0rJyBzZWxlY3RbbmFtZT1jdXN0b21Ob3RpZmljYXRpb25FbWFpbF0nKS52YWwoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cCgncGFyYW1ldGVyIGZvcm0gc3VibWl0JylcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dDpjaGVja2VkW25hbWU9b3JkZXJUeXBlXScpLnZhbCgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWRlbGl2ZXJ5RGF0ZV0nKS52YWwoKSk7XG4gICAgICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKCkpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgcm9vdC5zZW5kT3JkZXJEYXRhVG9TZXJ2ZXIoJ3BhcmFtZXRlcicscm9vdC5hZnRlck9yZGVyU2V0UGFyYW1ldGVyT2spO1xuICAgICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLmJsYW5rPWZ1bmN0aW9uICgpe307XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJDb21wbGV0ZWQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2V0UGFyYW1ldGVyQ29tcGxldGVkIGNhbGxlZCcpO1xuICAgICAgICByb290LlN0ZXBwZXIuc2V0T3B0cyh7b25BZnRlckxvYWQ6ZnVuY3Rpb24gKCl7fX0pO1xuICAgICAgICAvL3Jvb3QuaW5pdFZpZXdQcm9kdWN0U2VsZWN0KClcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRSb3dGYXZvcml0ZXNBY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy5idXR0b25JdGVtRmF2b3JpdGVzJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCcuYnV0dG9uSXRlbUZhdm9yaXRlcycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBwcm9kdWN0SWQgPSAkKHRoaXMpLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwcm9kdWN0SWQpO1xuXG4gICAgICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC50b2dnbGVGYXZvcml0ZXMucmVwbGFjZSgnJWlkJScscHJvZHVjdElkKTtcbiAgICAgICAgICAgIGxldCBhamF4RGF0YT17fTtcbiAgICAgICAgICAgIGFqYXhEYXRhLl90b2tlbj1PcHRzLnRva2VuO1xuICAgICAgICAgICAgbGV0IGJ1dHRvbj10aGlzO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYWpheFVybCk7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogYWpheFVybCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6J1BPU1QnLFxuICAgICAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3VjY2Vzcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChidXR0b24pLmFkZENsYXNzKCdidG4td2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYnV0dG9uKS5yZW1vdmVDbGFzcygnYnRuLWxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJ1dHRvbikucmVtb3ZlQ2xhc3MoJ2J0bi13YXJuaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChidXR0b24pLmFkZENsYXNzKCdidG4tbGlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYnRuLXdhcm5pbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYnRuLWxpZ2h0Jyk7XG4gICAgICAgICAgICAqL1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRSb3dEZXNjcmlwdGlvbkFjdGlvbj1mdW5jdGlvbiAoKXtcbiAgICAgICAgJCgndGV4dGFyZWEub3JkZXJJdGVtQ29tbWVudCcpLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgbGV0IGNvbW1lbnQ9JCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIGxldCBwcm9kdWN0SWQ9JCh0aGlzKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgbGV0IHByb2R1Y3RDb21tZW50PU9yZGVyLmdldERhdGEoJ3Byb2R1Y3RDb21tZW50Jyk7XG4gICAgICAgICAgICBpZihwcm9kdWN0Q29tbWVudCE9PW51bGwpe1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9kdWN0Q29tbWVudFtwcm9kdWN0SWRdPT0ndW5kZWZpbmVkJyAmJiBjb21tZW50Lmxlbmd0aD09PTApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHByb2R1Y3RDb21tZW50W3Byb2R1Y3RJZF09PT1jb21tZW50KXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2R1Y3RDb21tZW50W3Byb2R1Y3RJZF09Y29tbWVudDtcbiAgICAgICAgICAgIGlmKGNvbW1lbnQubGVuZ3RoPT09MCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9yZGVyLnByb2R1Y3RDb21tZW50W3Byb2R1Y3RJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPcmRlci5wcm9kdWN0Q29tbWVudD1wcm9kdWN0Q29tbWVudDtcbiAgICAgICAgICAgIHF1ZXVlQWpheC5wdXNoKERhdGUubm93KCkpO1xuICAgICAgICAgICAgcm9vdC5zeW5jT3JkZXJEYXRhVG9TZXJ2ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0U2VsZWN0RGF0YXRhYmxlc1Jvd0Zvcm1hdHRlcj1mdW5jdGlvbiAoZCkge1xuICAgICAgICAvLyBgZGAgaXMgdGhlIG9yaWdpbmFsIGRhdGEgb2JqZWN0IGZvciB0aGUgcm93XG4gICAgICAgIC8qKlxuICAgICAgICBAdG9kbzogZmVsc3plZG5pIGVzIHVwZGF0ZWxuaSBheiBhZG90dCB0ZXJtZWsgbWVtb2phdCBheiBvcmRlcmJhblxuICAgICAgICAgKi9cbiAgICAgICAgY29uc29sZS5ncm91cCgncHJvZHVjdFNlbGVjdERhdGF0YWJsZXNSb3dGb3JtYXR0ZXInKTtcbiAgICAgICAgY29uc29sZS5sb2coZCk7XG4gICAgICAgIGxldCB0ZW1wbGF0ZURhdGE9ZDtcbiAgICAgICAgdGVtcGxhdGVEYXRhLmNvbW1lbnQ9Jyc7XG4vLyAgICAgICAgZGVidWcoT3JkZXIpO1xuICAgICAgICBpZihPcmRlci5wcm9kdWN0Q29tbWVudCAmJiBPcmRlci5wcm9kdWN0Q29tbWVudCE9PW51bGwpe1xuICAgICAgICAgICAgZGVidWcodHlwZW9mIE9yZGVyLnByb2R1Y3RDb21tZW50W2QuaWRdKTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBPcmRlci5wcm9kdWN0Q29tbWVudFtkLmlkXSE9J3VuZGVmaW5lZCcgJiYgT3JkZXIucHJvZHVjdENvbW1lbnRbZC5pZF0ubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5jb21tZW50PU9yZGVyLnByb2R1Y3RDb21tZW50W2QuaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAdHlwZWRlZiB7Ym9vbGVhbn0gZC5mYXZvcml0ZXMgKi9cbiAgICAgICAgaWYoZC5mYXZvcml0ZXM9PT10cnVlKXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5idG5GYXZvcml0ZXNDbGFzcz0nYnRuLXdhcm5pbmcnO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5idG5GYXZvcml0ZXNDbGFzcz0nYnRuLWxpZ2h0JztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGVtcGxhdGU9JCgndGVtcGxhdGVbZGF0YS1uYW1lPVwib3JkZXJQcm9kdWN0U2VsZWN0RGV0YWlsc1wiXScpLmh0bWwoKVxuICAgICAgICB0ZW1wbGF0ZURhdGEud2Vla2x5PWZhbHNlO1xuICAgICAgICBpZihPcmRlci5nZXREYXRhKCkub3JkZXJUeXBlPT09J3dlZWtseScpe1xuICAgICAgICAgICAgdGVtcGxhdGVEYXRhLndlZWtseT10cnVlO1xuLypcblxuICAgICAgICAgICAgdGVtcGxhdGVEYXRhLndlZWtseURheT1bXG4gICAgICAgICAgICAgICAge1wiaW5kZXhcIjoxLFwibmFtZVwiOlwiSMOpdGbFkVwifSxcbiAgICAgICAgICAgIHtcImluZGV4XCI6MixcIm5hbWVcIjpcIktlZGRcIn0sXG4gICAgICAgICAgICB7XCJpbmRleFwiOjMsXCJuYW1lXCI6XCJTemVyZGFcIn0sXG4gICAgICAgICAgICB7XCJpbmRleFwiOjQsXCJuYW1lXCI6XCJDc8O8dMO2cnTDtmtcIn0sXG4gICAgICAgICAgICB7XCJpbmRleFwiOjUsXCJuYW1lXCI6XCJQw6ludGVrXCJ9LFxuICAgICAgICAgICAge1wiaW5kZXhcIjo2LFwibmFtZVwiOlwiU3pvbWJhdFwifSxcbiAgICAgICAgICAgIHtcImluZGV4XCI6NyxcIm5hbWVcIjpcIlZhc8Ohcm5hcFwifSxcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS53ZWVrbHlEYXk9W1xuICAgICAgICAgICAgICAgIHtcImluZGV4XCI6MixcIm5hbWVcIjpcIkjDqXRmxZFcIiB9LFxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjpcIktlZGRcIn0sXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOlwiU3plcmRhXCJ9LFxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjpcIkNzw7x0w7ZydMO2a1wifSxcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6XCJQw6ludGVrXCJ9LFxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjpcIlN6b21iYXRcIn0sXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOlwiVmFzw6FybmFwXCJ9XG4gICAgICAgICAgICBdO1xuKi9cbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvZHVjdFNlbGVjdGVkPU9yZGVyLmdldERhdGEoJ3Byb2R1Y3RTZWxlY3RlZCcpO1xuICAgICAgICBpZih0eXBlb2YgcHJvZHVjdFNlbGVjdGVkW2QuaWRdIT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICB0ZW1wbGF0ZURhdGEuaXRlbVF1YW50aXR5PXByb2R1Y3RTZWxlY3RlZFtkLmlkXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhbJ3RlbXBsYXRlRGF0YScsdGVtcGxhdGVEYXRhXSk7XG4gICAgICAgIGxldCBvbGRUYWdzPU11c3RhY2hlLnRhZ3M7XG4gICAgICAgIE11c3RhY2hlLnRhZ3MgPSBbXCJ+IVwiLCBcIiF+XCJdO1xuICAgICAgICBpZih0ZW1wbGF0ZURhdGFbJ3NwZWNpZmljYXRpb24nXT09J2ZhbHNlJyB8fCB0ZW1wbGF0ZURhdGFbJ3NwZWNpZmljYXRpb24nXT09ZmFsc2Upe1xuICAgICAgICAgICAgdGVtcGxhdGVEYXRhLnNwZWNpZmljYXRpb25DbGFzcz0nZC1ub25lJztcbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZURhdGEucGljdHVyZUltZz0nJztcbiAgICAgICAgaWYodGVtcGxhdGVEYXRhWydwaWN0dXJlJ109PSdmYWxzZScgfHwgdGVtcGxhdGVEYXRhWydwaWN0dXJlJ109PWZhbHNlKXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5waWN0dXJlQ2xhc3M9J2Qtbm9uZSc7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGVtcGxhdGVEYXRhLnBpY3R1cmVJbWc9JzxpbWcgc3JjPSBcIicrdGVtcGxhdGVEYXRhWydwaWN0dXJlJ10rJ1wiIGNsYXNzPVwicHJvZHVjdFBpY3R1cmVcIiA+PC9pbWc+JztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygndGVtcGxhdGVEYXRhJyx0ZW1wbGF0ZURhdGEpO1xuICAgICAgICAvL3RlbXBsYXRlRGF0YVsnYWFfc3BlY2lmaWNhdGlvbiddPWZhbHNlO1xuICAgICAgICBsZXQgcmVuZGVyPU11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSx0ZW1wbGF0ZURhdGEpO1xuICAgICAgICBNdXN0YWNoZS50YWdzID1vbGRUYWdzO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIHJldHVybiByZW5kZXI7XG4vKlxuc29sdXRpb24gYmVmb3JlIHRlbXBsYXRlXG4gICAgICAgIHJldHVybiAnPHRhYmxlIGNlbGxwYWRkaW5nPVwiNVwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIiBzdHlsZT1cInBhZGRpbmctbGVmdDo1MHB4O1wiPicrXG4gICAgICAgICAgICAnPHRyPicrXG4gICAgICAgICAgICAnPHRkPkluZm86PC90ZD4nK1xuICAgICAgICAgICAgJzx0ZD4nK2Qubm90ZSsnPC90ZD4nK1xuICAgICAgICAgICAgJzwvdHI+JytcbiAgICAgICAgICAgICc8dHI+JytcbiAgICAgICAgICAgICc8dGQ+aG9vcmV5Y2EgOjwvdGQ+JytcbiAgICAgICAgICAgICc8dGQ+PHNwYW4gc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAyZW07XCI+JytkLmhvb3JleWNhSWQrJzwvc3Bhbj4nICtcblxuICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICBkYXRhLWlkPVwiJytkLmlkKydcIlxcbicgK1xuICAgICAgICAgICAgJyAgICAgICAgY2xhc3M9XCJidXR0b25JdGVtRmF2b3JpdGVzIGJ0biAnK2J0bkZhdm9yaXRlc0NsYXNzKydcIj5cXG4nICtcbiAgICAgICAgICAgICcgICAgPGkgY2xhc3M9XCJiaSBiaS1zdGFyLWZpbGwgcHItMlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cXG4nICtcbiAgICAgICAgICAgICcgICAgS2VkdmVuY1xcbicgK1xuICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvdGQ+JytcbiAgICAgICAgICAgICc8L3RyPicrXG4gICAgICAgICAgICAvISpcbiAgICAgICAgICAgICAgICAgICAgICAgICc8dHI+JytcbiAgICAgICAgICAgICAgICAgICAgICAgICc8dGQ+RXh0ZW5zaW9uIG51bWJlcjo8L3RkPicrXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHRkPicrZC5leHRuKyc8L3RkPicrXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC90cj4nK1xuICAgICAgICAgICAgKiEvXG4gICAgICAgICAgICAnPHRyPicrXG4gICAgICAgICAgICAnPHRkPkluZm86PC90ZD4nK1xuICAgICAgICAgICAgJzx0ZD4nK2Qubm90ZSsnPC90ZD4nK1xuICAgICAgICAgICAgJzwvdHI+JytcbiAgICAgICAgICAgICc8dHI+JytcbiAgICAgICAgICAgICc8dGQ+TWVnamVneXrDqXM6PC90ZD4nK1xuICAgICAgICAgICAgJzx0ZD48dGV4dGFyZWEgY2xhc3M9XCJvcmRlckl0ZW1Db21tZW50XCIgZGF0YS1pZD1cIicrZC5pZCsnXCI+Jytjb21tZW50Kyc8L3RleHRhcmVhPjwvdGQ+JytcbiAgICAgICAgICAgICc8L3RyPicrXG4gICAgICAgICAgICAvISpcbiAgICAgICAgICAgICohL1xuICAgICAgICAgICAgJzwvdGFibGU+JztcbiovXG4gICAgfVxuXG4gICAgdGhpcy5zZXREYXRhdGFibGVIZWFkZXJUZXh0PWZ1bmN0aW9uKHRleHQpe1xuICAgICAgICAkKCcudGFibGVIZWFkZXJUZXh0JykudGV4dCh0ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFRyZWVQYXRoTmFtZT1mdW5jdGlvbiAobm9kZSl7XG4gICAgICAgIGxldCByZXM9Jyc7XG4gICAgICAgIGxldCBpdGVtcz0kKG5vZGUpLnBhcmVudHMoJ2xpJykudG9BcnJheSgpO1xuICAgICAgICBpdGVtcy5zaGlmdCgpO1xuICAgICAgICBpdGVtcy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBpbiBpdGVtcykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJChpdGVtc1tpdGVtXSkuY2hpbGRyZW4oJ2EuY2F0ZWdvcnlJdGVtJykpO1xuICAgICAgICAgICAgaWYoJChpdGVtc1tpdGVtXSkuY2hpbGRyZW4oJ2EuY2F0ZWdvcnlJdGVtJykubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJlcys9JChpdGVtc1tpdGVtXSkuY2hpbGRyZW4oJ2EuY2F0ZWdvcnlJdGVtJykudGV4dCgpKycvJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcys9JChub2RlKS50ZXh0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdGVkUHJvZHVjdEdyb3VwPW51bGw7XG4gICAgbGV0IGRhdGFUYWJsZVNlYXJjaFN0cj1udWxsO1xuICAgIGxldCBkYXRhVGFibGVTZWFyY2hLcmVsPWZhbHNlO1xuXG4gICAgdGhpcy5zZWFyY2hQcm9kdWN0QnlTdHJpbmc9ZnVuY3Rpb24gKGZpbHRlclN0cil7XG4gICAgICAgIHJvb3Quc2V0RGF0YXRhYmxlSGVhZGVyVGV4dCgnVGVybcOpa2VrIHN6xbFydmU6JytmaWx0ZXJTdHIpO1xuICAgICAgICBkYXRhVGFibGVTZWFyY2hTdHI9ZmlsdGVyU3RyO1xuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkuYWpheC5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrU2VhcmNoUHJvZHVjdD1mdW5jdGlvbiAoKXtcbiAgICAgICAgZGVidWcodGhpcyk7XG4gICAgICAgIGxldCBmaWx0ZXJTdHI9JCgnLnNpZGViYXItc2VhcmNoIGlucHV0W25hbWU9c2VhcmNoVmFsdWVdJykudmFsKClcbiAgICAgICAgZGVidWcoZmlsdGVyU3RyKTtcbiAgICAgICAgcm9vdC5zZWFyY2hQcm9kdWN0QnlTdHJpbmcoZmlsdGVyU3RyKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrRmF2b3JpdGVzUHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrRmF2b3JpdGVzUHJvZHVjdCcpO1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOiBrZWR2ZW5jZWsnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPScqKmZhdm9yaXRlcyoqJztcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuICAgIHRoaXMuY2xpY2tPZnRlblByb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdjbGlja09mdGVuUHJvZHVjdCcpO1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOiBneWFrcmFuIHbDoXPDoXJvbHQnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPScqKm9mdGVuKionO1xuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkuYWpheC5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrU3BlY2lhbE9mZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygnY2xpY2tTcGVjaWFsT2ZmZXInKTtcbiAgICAgICAgcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZTogQWtjacOzcyB0ZXJtw6lrZWsnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPScqKnNwZWNpYWxPZmZlcioqJztcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuXG5cblxuXG4gICAgdGhpcy5jbGlja0xhc3RQcm9kdWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygnY2xpY2tMYXN0UHJvZHVjdCcpO1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOiB1dG9sasOhcmEgdsOhc8Ohcm9sdCcpO1xuICAgICAgICBkYXRhVGFibGVTZWFyY2hTdHI9JyoqbGFzdCoqJztcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrV2Vla2x5UHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrV2Vla2x5UHJvZHVjdCcpO1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOiBIZXRpIHRlcm3DqWtlaycpO1xuICAgICAgICBkYXRhVGFibGVTZWFyY2hTdHI9Jyoqd2Vla2x5KionO1xuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkuYWpheC5yZWxvYWQoKTtcblxuICAgIH1cblxuICAgIHRoaXMuY2xpY2tLcmVsUHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrS3JlbFByb2R1Y3QnKTtcbiAgICAgICAgLy9yb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOiBIZXRpIHRlcm3DqWtlaycpO1xuICAgICAgICAvL2RhdGFUYWJsZVNlYXJjaFN0cj0nKip3ZWVrbHkqKic7XG4gICAgICAgIC8vJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgICAgICQodGhpcykucGFyZW50KCkudG9nZ2xlQ2xhc3MoJ2tyZWxBY3RpdmUnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoS3JlbD0hZGF0YVRhYmxlU2VhcmNoS3JlbDtcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0U2VsZWN0RGF0YVRhYmxlQ29sdW1uRGVmcz1mdW5jdGlvbiAoKXtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcIndpZHRoXCI6IFwiMTBweFwiLCBcInRhcmdldHNcIjogMCB9LFxuICAgICAgICAgICAgeyBcImNsYXNzTmFtZVwiOiBcImR0LWxlZnRcIiwgXCJ0YXJnZXRzXCI6IDEgfSxcbi8vICAgICAgICAgICAgICAgIHsgXCJ3aWR0aFwiOiBcIjEyMHB4XCIsIFwidGFyZ2V0c1wiOiAxIH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCIyOHB4XCIsIFwidGFyZ2V0c1wiOiAyIH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI0MXB4XCIsIFwidGFyZ2V0c1wiOiAzIH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI3NnB4XCIsIFwidGFyZ2V0c1wiOiA0IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI1NXB4XCIsIFwidGFyZ2V0c1wiOiA1IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI3MHB4XCIsIFwidGFyZ2V0c1wiOiA2IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI1NHB4XCIsIFwidGFyZ2V0c1wiOiA3IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI1N3B4XCIsIFwidGFyZ2V0c1wiOiA4IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCI0MnB4XCIsIFwidGFyZ2V0c1wiOiA5IH0sXG4gICAgICAgICAgICB7IFwid2lkdGhcIjogXCIxMDBweFwiLCBcInRhcmdldHNcIjogMTB9LFxuICAgICAgICAgICAge1wiY2xhc3NOYW1lXCI6IFwiZHQtY2VudGVyXCIsIFwidGFyZ2V0c1wiOiBcIl9hbGxcIn0sXG4gICAgICAgIF07XG4gICAgfVxuICAgIHRoaXMucHJvZHVjdFNlbGVjdERhdGFUYWJsZUNvbHVtbj1mdW5jdGlvbiAoKXtcbiAgICAgICAgbGV0IGNvbHVtbkRhdGE9W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiY2xhc3NOYW1lXCI6ICAgICAgJ2RldGFpbHMtY29udHJvbCcsXG4gICAgICAgICAgICAgICAgXCJvcmRlcmFibGVcIjogICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBcImRhdGFcIjogICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgXCJkZWZhdWx0Q29udGVudFwiOiAnJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwibmFtZVwiIH0sXG4gICAgICAgICAgICB7IFwiZGF0YVwiOiBcImtyZWxcIiB9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJwYWNraW5nXCJ9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJ1bml0VmFsdWVcIiB9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJwcm9kdWN0VW5pdFwifSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwic2VsbGVyVW5pdFwiIH0sXG4gICAgICAgICAgICB7IFwiZGF0YVwiOiBcInVuaXRNdWx0aXBsaWVyXCJ9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJhbW91bnRVbml0XCIgfSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwicHJpY2VcIiB9LFxuXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGFjdGlvbkNvbHVtbj17ICAgICAgICAgICAgICAgIFwiY2xhc3NOYW1lXCI6ICAgICAgJ2RldGFpbHMtY29udHJvbDInLFxuICAgICAgICAgICAgXCJvcmRlcmFibGVcIjogICAgICBmYWxzZSxcbiAgICAgICAgICAgIFwiZGF0YVwiOiAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwid2lkdGhcIjogXCIxMDBweFwiLFxuICAgICAgICAgICAgXCJkZWZhdWx0Q29udGVudFwiOicnXG4gICAgICAgIH07XG4gICAgICAgIGlmKE9yZGVyLmdldERhdGEoJ29yZGVyVHlwZScpPT0nZGFpbHknKXtcbiAgICAgICAgICAgIGFjdGlvbkNvbHVtbi5kZWZhdWx0Q29udGVudD0nPGlucHV0IHR5cGU9XCJudW1iZXJcIiB2YWx1ZT1cIjBcIiBtaW49XCIwXCIgbWF4PVwiOTk5OVwiIHN0ZXA9XCIxXCIgZGF0YS1kZWNpbWFscz1cIjFcIiAgY2xhc3M9XCJmb3JtLWNvbnRyb2wtc20gaW5wdXROdW1iZXJTcGlubmVyXCIgc3R5bGU9XCJ3aWR0aDogMWVtO1wiIFwiLz4nXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVmYXVsdENvbnRlbnRcIjonPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHN0eWxlPVwibWluLXdpZHRoOiAxLjVyZW1cIiBjbGFzcz1cImJ0bi1zbSBidG4tZGVjcmVtZW50IGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tbWludXNcIiB0eXBlPVwiYnV0dG9uXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJvbmc+4oiSPC9zdHJvbmc+PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIGlucHV0bW9kZT1cImRlY2ltYWxcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIFwiIHBsYWNlaG9sZGVyPVwiXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gc3R5bGU9XCJtaW4td2lkdGg6IDEuNXJlbVwiIGNsYXNzPVwiYnRuLXNtIGJ0bi1pbmNyZW1lbnQgYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1wbHVzXCIgdHlwZT1cImJ1dHRvblwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3Ryb25nPis8L3N0cm9uZz48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+J1xuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5EYXRhLnB1c2goYWN0aW9uQ29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbkRhdGE7XG4gICAgfVxuICAgIHRoaXMuZ2V0RGF0YXRhYmxlcz1mdW5jdGlvbiAob3JkZXJUeXBlKXtcbiAgICAgICAgY29uc29sZS5lcnJvcihvcmRlclR5cGUpO1xuICAgICAgICB2YXIgdGFibGUgPSAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCB7XG4gICAgICAgICAgICBsYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHVybDogJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMjQvaTE4bi9IdW5nYXJpYW4uanNvbidcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vXCJhamF4XCI6IFwie3thc3NldCgnZXhhcG1sZTIuanNvbicpfX1cIixcbiAgICAgICAgICAgIFwiYWpheFwiOiB7XG4gICAgICAgICAgICAgICAgdXJsOk9wdHMuVVJMLmdldERhdGFUYWJsZUNvbnRlbnRQcm9kdWN0TGlzdCxcbiAgICAgICAgICAgICAgICBkYXRhOmZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2VhcmNoU3RyPWRhdGFUYWJsZVNlYXJjaFN0cjtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5rcmVsPWRhdGFUYWJsZVNlYXJjaEtyZWw7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZ3JvdXBJZD1zZWxlY3RlZFByb2R1Y3RHcm91cDtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zdXBwbGllcklkPU9yZGVyLnN1cHBsaWVySWQ7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZGVsaXZlcnlEYXRlPU9yZGVyLmRlbGl2ZXJ5RGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjb2x1bW5EZWZzXCI6IHJvb3QucHJvZHVjdFNlbGVjdERhdGFUYWJsZUNvbHVtbkRlZnMoKSxcbiAgICAgICAgICAgIFwiY29sdW1uc1wiOiByb290LnByb2R1Y3RTZWxlY3REYXRhVGFibGVDb2x1bW4oKSxcbiAgICAgICAgICAgIFwib3JkZXJcIjogW1sxLCAnYXNjJ11dLFxuICAgICAgICB9ICk7XG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RTZWxlY3REYXRhVGFibGVEcmF3RFQ9ZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy9kZWJ1ZyggJ1RhYmxlIGRyYXcgY29tcGxldGU6ICcrbmV3IERhdGUoKS5nZXRUaW1lKCkgKTtcblxuICAgICAgICAvLyQoJ3RkOmNvbnRhaW5zKFwiKlwiKScpLmh0bWwoJzxpIGNsYXNzPVwiYmkgYmktY2hlY2stY2lyY2xlLWZpbGxcIj48L2k+Jyk7XG4gICAgICAgICQoXCJ0ZFwiKS5maWx0ZXIoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLnRleHQoKSA9PT0gJyonO1xuICAgICAgICB9KS5odG1sKCc8aSBjbGFzcz1cImJpIGJpLWNoZWNrLWNpcmNsZS1maWxsXCI+PC9pPicpO1xuICAgICAgICBpZihPcmRlci5nZXREYXRhKCkub3JkZXJUeXBlPT0nZGFpbHknKXtcbiAgICAgICAgICAgICQoXCJpbnB1dFt0eXBlPSdudW1iZXInXS5pbnB1dE51bWJlclNwaW5uZXJcIikuaW5wdXRTcGlubmVyKHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCAke2dyb3VwQ2xhc3N9XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHN0eWxlPVwibWluLXdpZHRoOiAke2J1dHRvbnNXaWR0aH1cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlY3JlbWVudCAke2J1dHRvbnNDbGFzc31cIiB0eXBlPVwiYnV0dG9uXCI+JHtkZWNyZW1lbnRCdXR0b259PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgIC8vJzxpbnB1dCB0eXBlPVwidGV4dFwiIGlucHV0bW9kZT1cImRlY2ltYWxcIiBzdHlsZT1cInRleHQtYWxpZ246ICR7dGV4dEFsaWdufVwiIGNsYXNzPVwicHJvZHVjdFF1YW50aXR5IGZvcm0tY29udHJvbFwiLz4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIHN0ZXA9XCIwLjFcIiBkYXRhLWRlY2ltYWxzPVwiMlwiIHN0eWxlPVwidGV4dC1hbGlnbjogJHt0ZXh0QWxpZ259XCIgY2xhc3M9XCJwcm9kdWN0UXVhbnRpdHkgZm9ybS1jb250cm9sXCIvPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBzdHlsZT1cIm1pbi13aWR0aDogJHtidXR0b25zV2lkdGh9XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pbmNyZW1lbnQgJHtidXR0b25zQ2xhc3N9XCIgdHlwZT1cImJ1dHRvblwiPiR7aW5jcmVtZW50QnV0dG9ufTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyxcbiAgICAgICAgICAgICAgICBidXR0b25zV2lkdGg6IFwiMC41cmVtXCIsXG4gICAgICAgICAgICAgICAgZ3JvdXBDbGFzczogXCJcIiwgLy8gY3NzIGNsYXNzIG9mIHRoZSByZXN1bHRpbmcgaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICBidXR0b25zQ2xhc3M6IFwiYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByb290LmJpbmRXZWFrVXNlckhlbHBlcigpO1xuICAgICAgICAvKlxuICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNoYW5nZSBvcmRlciBxdWFudGl0eVxuICAgICAgICAgKi9cbiAgICAgICAgJChcIi5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgLmRldGFpbHMtY29udHJvbDIgaW5wdXRbdHlwZT10ZXh0XVwiKS5vZmYoJ2NoYW5nZScpO1xuICAgICAgICAkKFwiLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCAuZGV0YWlscy1jb250cm9sMiBpbnB1dFt0eXBlPXRleHRdXCIpLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uIChlKXtcbiAgICAgICAgICAgIGxldCBxdWFudGl0eT0kKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgcXVhbnRpdHk9cXVhbnRpdHkucmVwbGFjZSgnLCcsJy4nKTtcbiAgICAgICAgICAgIHF1YW50aXR5PXBhcnNlRmxvYXQocXVhbnRpdHkpO1xuICAgICAgICAgICAgbGV0IHJvd0RhdGE9JCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLnJvdygkKHRoaXMpLmNsb3Nlc3QoJ3RyJykpLmRhdGEoKTtcbiAgICAgICAgICAgIHJvb3Qub3JkZXJJdGVtc0NoYW5nZShyb3dEYXRhLHF1YW50aXR5KVxuICAgICAgICB9KTtcblxuICAgICAgICAkKFwiLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCAuZGV0YWlscy1jb250cm9sMiBpbnB1dFt0eXBlPXRleHRdXCIpLmVhY2goZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICAvL2RlYnVnKCdleiBhIGZ1bmN0aW9uMicpXG4gICAgICAgICAgICBsZXQgcXVhbnRpdHk9JCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIGxldCByb3dEYXRhPSQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5yb3coJCh0aGlzKS5jbG9zZXN0KCd0cicpKS5kYXRhKCk7XG5cbiAgICAgICAgICAgIGlmKE9yZGVyLnByb2R1Y3RTZWxlY3RlZFtyb3dEYXRhLmlkXSl7XG4gICAgICAgICAgICAgICAgZGVidWcocm93RGF0YSk7XG4gICAgICAgICAgICAgICAgZGVidWcoJCgkKHRoaXMpLmNsb3Nlc3QoJ3RyJykuZmluZCgnaW5wdXRbdHlwZT1udW1iZXJdJylbMF0pKTtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhPcmRlci5wcm9kdWN0U2VsZWN0ZWRbcm93RGF0YS5pZF0pO1xuICAgICAgICAgICAgICAgIGxldCBxdWFudGl0eUN1cnJlbnQ9T3JkZXIucHJvZHVjdFNlbGVjdGVkW3Jvd0RhdGEuaWRdO1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBxdWFudGl0eUN1cnJlbnQhPSdzdHJpbmcnKXtcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHlDdXJyZW50Kz0nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCgkKHRoaXMpLmNsb3Nlc3QoJ3RyJykuZmluZCgnaW5wdXRbdHlwZT1udW1iZXJdJylbMF0pLnZhbChxdWFudGl0eUN1cnJlbnQucmVwbGFjZSgnLCcsJy4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgJChcIi5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgLmRldGFpbHMtY29udHJvbDIgYnV0dG9uXCIpLm9mZignY2xpY2snKTtcbiAgICAgICAgJChcIi5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgLmRldGFpbHMtY29udHJvbDIgYnV0dG9uXCIpLm9uKCdjbGljaycsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gZGVidWcoJy5kZXRhaWxzLWNvbnRyb2wyIGJ1dHRvbiBjbGljayAnKVxuICAgICAgICAgICAgLy8gZGVidWcodGhpcyk7XG4gICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmluaXRWaWV3UHJvZHVjdFNlbGVjdD1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBmdW5jdGlvbk5hbWU9J2luaXRWaWV3UHJvZHVjdFNlbGVjdCc7XG4gICAgICAgIGNvbnNvbGUubG9nKGZ1bmN0aW9uTmFtZSsnIGNhbGxlZCcpO1xuICAgICAgICBpZih2aWV3SW5pY2lhbGl6ZWQuaW5jbHVkZXMoZnVuY3Rpb25OYW1lKSl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9kZWJ1ZyhPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyb290KSk7XG4gICAgICAgIHJvb3Quc2V0RGF0YXRhYmxlSGVhZGVyVGV4dCgnJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyQWN0aXZhdGU6ZnVuY3Rpb24gKCl7fX0pO1xuICAgICAgICAvL0Bub3RlOiBiZSBrZWxsIGthcGNzb2xuaSBheiBlbG9uZXpldGV0XG4gICAgICAgIHJvb3QuU3RlcHBlci5hZGRDb21wbGV0ZWQoJ2ludm9pY2UnKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLmFkZEVuYWJsZWQoJ2ludm9pY2UnKTtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT0nLm9yZGVyUGFyYW1ldGVyRm9ybSc7XG4gICAgICAgIC8vY29uc29sZS5sb2coT3B0cy5VUkwuZ2V0RGF0YVRhYmxlQ29udGVudFByb2R1Y3RMaXN0KTtjaGFuZ2VcbiAgICAgICAgZGVidWcoKENTU1NlbGVjdG9yRm9ybSsnIC5mYS1zZWFyY2gnKSk7XG5cbiAgICAgICAgJCgnLnNpZGViYXItc2VhcmNoIC5mYS1zZWFyY2gnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5zaWRlYmFyLXNlYXJjaCAuZmEtc2VhcmNoJykub24oJ2NsaWNrJyxyb290LmNsaWNrU2VhcmNoUHJvZHVjdCk7XG5cbiAgICAgICAgJCgnYS5zaWRlYmFyLmZhdm9yaXRlcycpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLmZhdm9yaXRlcycpLm9uKCdjbGljaycscm9vdC5jbGlja0Zhdm9yaXRlc1Byb2R1Y3QpO1xuXG4gICAgICAgICQoJ2Euc2lkZWJhci5vZnRlbicpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLm9mdGVuJykub24oJ2NsaWNrJyxyb290LmNsaWNrT2Z0ZW5Qcm9kdWN0KTtcblxuICAgICAgICAkKCdhLnNpZGViYXIubGFzdCcpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLmxhc3QnKS5vbignY2xpY2snLHJvb3QuY2xpY2tMYXN0UHJvZHVjdCk7XG5cbiAgICAgICAgJCgnYS5zaWRlYmFyLndlZWtseScpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLndlZWtseScpLm9uKCdjbGljaycscm9vdC5jbGlja1dlZWtseVByb2R1Y3QpO1xuXG4gICAgICAgICQoJ2Euc2lkZWJhci5rcmVsJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCdhLnNpZGViYXIua3JlbCcpLm9uKCdjbGljaycscm9vdC5jbGlja0tyZWxQcm9kdWN0KTtcblxuICAgICAgICAkKCdhLnNpZGViYXIuc3BlY2lhbE9mZmVyJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCdhLnNpZGViYXIuc3BlY2lhbE9mZmVyJykub24oJ2NsaWNrJyxyb290LmNsaWNrU3BlY2lhbE9mZmVyKTtcblxuXG4gICAgICAgICQoJy5zaWRlYmFyLXNlYXJjaCBpbnB1dFtuYW1lPXNlYXJjaFZhbHVlXScpLm9mZigna2V5cHJlc3MnKTtcbiAgICAgICAgJCgnLnNpZGViYXItc2VhcmNoIGlucHV0W25hbWU9c2VhcmNoVmFsdWVdJykub24oJ2tleXByZXNzJyxmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICggZXZlbnQud2hpY2ggPT0gMTMgKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCQodGhpcykudmFsKCkubGVuZ3RoPj0yKXtcbiAgICAgICAgICAgICAgICByb290LnNlYXJjaFByb2R1Y3RCeVN0cmluZygkKHRoaXMpLnZhbCgpK2V2ZW50LmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cblxuICAgICAgICAkKCcuc2lkZWJhci13cmFwcGVyIC5zaWRlYmFyLW1lbnUgLnNpZGViYXItZHJvcGRvd24gLnNpZGViYXItc3VibWVudSBsaSBhLmNhdGVnb3J5SXRlbS5jbGlja2FibGUnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5zaWRlYmFyLXdyYXBwZXIgLnNpZGViYXItbWVudSAuc2lkZWJhci1kcm9wZG93biAuc2lkZWJhci1zdWJtZW51IGxpIGEuY2F0ZWdvcnlJdGVtLmNsaWNrYWJsZScpLm9uKCdjbGljaycsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwSWQ9JCh0aGlzKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdEdyb3VwPWdyb3VwSWQ7XG4gICAgICAgICAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPW51bGw7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZ3JvdXBJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocm9vdC5nZXRUcmVlUGF0aE5hbWUodGhpcykpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2V0RGF0YXRhYmxlSGVhZGVyVGV4dChyb290LmdldFRyZWVQYXRoTmFtZSh0aGlzKSk7XG4vKlxuICAgICAgICAgICAgICAgIGxldCBhamF4RGF0YT17XG4gICAgICAgICAgICAgICAgICAgICdncm91cElkJzpncm91cElkLFxuICAgICAgICAgICAgICAgICAgICAnc3VwcGxpZXJfaWQnOk9yZGVyLnN1cHBsaWVySWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LmRhdGEoYWpheERhdGEpLmxvYWQoKTtcblxuKi9cbi8qXG4gICAgICAgICAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuZ2V0RGF0YVRhYmxlQ29udGVudFByb2R1Y3RMaXN0Kyc/Z3JvdXBJZD0nK2dyb3VwSWQrJyZzdXBwbGllcl9pZD0nK09yZGVyLnN1cHBsaWVySWQ7XG4gICAgICAgICAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgudXJsKGFqYXhVcmwpLmxvYWQoKTtcbiovXG4gICAgICAgICAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIGxldCB0YWJsZSA9IHJvb3QuZ2V0RGF0YXRhYmxlcyhPcmRlci5nZXREYXRhKCdvcmRlclR5cGUnKSk7XG5cbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLm9uKCAnaW5pdC5kdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCAnVGFibGUgaW5pdGlhbGlzYXRpb24gY29tcGxldGU6ICcrbmV3IERhdGUoKS5nZXRUaW1lKCkgKTtcbiAgICAgICAgfSApLmRhdGFUYWJsZSgpO1xuXG5cblxuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0Jykub24oICdkcmF3LmR0Jyxyb290LnByb2R1Y3RTZWxlY3REYXRhVGFibGVEcmF3RFQpLmRhdGFUYWJsZSgpO1xuXG4gICAgICAgIC8vJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLm9uKCAnZHJhdy5kdCcsICApLmRhdGFUYWJsZSgpO1xuXG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5vbiggJ3hoci5kdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRlYnVnKCAnVGFibGUgeGhyIGNvbXBsZXRlOiAnK25ldyBEYXRlKCkuZ2V0VGltZSgpICk7XG4gICAgICAgIH0gKS5kYXRhVGFibGUoKTtcblxuICAgICAgICAvLyQoXCJpbnB1dFt0eXBlPSdudW1iZXInXS5pbnB1dE51bWJlclNwaW5uZXJcIikuaW5wdXRTcGlubmVyKCk7XG5cbi8qXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gQWRkIGV2ZW50IGxpc3RlbmVyIGZvciBvcGVuaW5nIGFuZCBjbG9zaW5nIGRldGFpbHNcbiAqL1xuXG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgdGJvZHknKS5vbignY2xpY2snLCAndGQuZGV0YWlscy1jb250cm9sJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHRyID0gJCh0aGlzKS5jbG9zZXN0KCd0cicpO1xuICAgICAgICAgICAgbGV0IHJvdyA9IHRhYmxlLnJvdyggdHIgKTtcblxuICAgICAgICAgICAgaWYgKCByb3cuY2hpbGQuaXNTaG93bigpICkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgcm93IGlzIGFscmVhZHkgb3BlbiAtIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgcm93LmNoaWxkLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB0ci5yZW1vdmVDbGFzcygnc2hvd24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gdGhpcyByb3dcbiAgICAgICAgICAgICAgICByb3cuY2hpbGQoIHJvb3QucHJvZHVjdFNlbGVjdERhdGF0YWJsZXNSb3dGb3JtYXR0ZXIocm93LmRhdGEoKSkgKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgdHIuYWRkQ2xhc3MoJ3Nob3duJyk7XG4gICAgICAgICAgICAgICAgcm9vdC5iaW5kUHJvZHVjdERldGFpbHNBY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgICB2aWV3SW5pY2lhbGl6ZWQucHVzaChmdW5jdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYmluZFByb2R1Y3REZXRhaWxzQWN0aW9uPWZ1bmN0aW9uICgpe1xuICAgICAgICByb290LmJpbmRSb3dEZXNjcmlwdGlvbkFjdGlvbigpO1xuICAgICAgICByb290LmJpbmRSb3dGYXZvcml0ZXNBY3Rpb24oKTtcbiAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydvcmRlclR5cGUnXT09J3dlZWtseScpe1xuICAgICAgICAgICAgcm9vdC5iaW5kT3JkZXJJdGVtV2Vla1F1YW50aXR5KCk7XG4gICAgICAgIH1cbiAgIH1cblxuICAgIHRoaXMuYmluZFdlYWtVc2VySGVscGVyPWZ1bmN0aW9uICgpe1xuICAgICAgICAkKCBcImlucHV0LmlucHV0TnVtYmVyU3Bpbm5lclwiICkub2ZmKCBcImZvY3VzXCIpO1xuICAgICAgICAkKCBcImlucHV0LmlucHV0TnVtYmVyU3Bpbm5lclwiICkub24oIFwiZm9jdXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBsZXQgcXVhbnRpdHk9JCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIHF1YW50aXR5PXF1YW50aXR5LnJlcGxhY2UoJywnLCcuJyk7XG4gICAgICAgICAgICBxdWFudGl0eT1wYXJzZUZsb2F0KHF1YW50aXR5KTtcbiAgICAgICAgICAgIGlmKHF1YW50aXR5PT09MCl7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoJycpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkKCBcImlucHV0W3R5cGU9dGV4dF0uaW5wdXROdW1iZXJTcGlubmVyXCIgKS5vZmYoIFwia2V5cHJlc3NcIik7XG4gICAgICAgICQoIFwiaW5wdXRbdHlwZT10ZXh0XS5pbnB1dE51bWJlclNwaW5uZXJcIiApLm9uKCBcImtleXByZXNzXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIGV2ZW50LndoaWNoID09IDEzICkge1xuLy8gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZW50ZXIgcHJlc3NlZCcpO1xuICAgICAgICAgICAgICAgIGxldCBhY3R1YWxJdGVtPXRoaXM7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1zPSQoIFwiaW5wdXRbdHlwZT10ZXh0XS5pbnB1dE51bWJlclNwaW5uZXJcIiApO1xuICAgICAgICAgICAgICAgIGl0ZW1zLmVhY2goZnVuY3Rpb24gKGl0ZW0pe1xuLy8gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzPT1hY3R1YWxJdGVtKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0rMTw9aXRlbXMubGVuZ3RoKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoaXRlbXNbaXRlbSsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpdGVtc1tpdGVtKzFdKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYmluZE9yZGVySXRlbVdlZWtRdWFudGl0eT1mdW5jdGlvbiAoKXtcbiAgICAgICAgJChcImlucHV0LnByb2R1Y3RTZWxlY3REYXlRdWFudGl0eVwiKS5vZmYoJ2NoYW5nZScpO1xuICAgICAgICAkKFwiaW5wdXQucHJvZHVjdFNlbGVjdERheVF1YW50aXR5XCIpLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMubmFtZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCQodGhpcykuZGF0YSgnZGF5aW5kZXgnKSk7XG5cbiAgICAgICAgICAgIGxldCByb3dEYXRhPW51bGw7XG4gICAgICAgICAgICBsZXQgcm93Tm9kZT0kKCQodGhpcykuY2xvc2VzdCgndGFibGUub3JkZXJQcm9kdWN0U2VsZWN0Um93RGV0YWlsc1RhYmxlJykuY2xvc2VzdCgndHInKSkucHJldigpO1xuICAgICAgICAgICAgcm93RGF0YT0kKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkucm93KHJvd05vZGUpLmRhdGEoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJvd0RhdGEpO1xuICAgICAgICAgICAgbGV0IHF1YW50aXR5PSQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBxdWFudGl0eT1xdWFudGl0eS5yZXBsYWNlKCcsJywnLicpO1xuICAgICAgICAgICAgcXVhbnRpdHk9cGFyc2VGbG9hdChxdWFudGl0eSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyb3dEYXRhLmlkKTtcbiAgICAgICAgICAgIHJvb3Qub3JkZXJJdGVtc0NoYW5nZShyb3dEYXRhLHF1YW50aXR5LCQodGhpcykuZGF0YSgnZGF5aW5kZXgnKSk7XG4vLyAgICAgICAgICAgIHJvb3Qub3JkZXJJdGVtc0NoYW5nZVxuICAgICAgICAgICAgLy9vcmRlckl0ZW1zQ2hhbmdlXG4gICAgICAgICAgICAvL3F1YW50aXR5WzE2ODNdWzFdXG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdGhpcy5hZnRlclN5bmNPcmRlckRhdGFUb1NlcnZlcj1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAvL3Jvb3QudG9nZ2xlRW5hYmxlU2VuZCgpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtb3N0IHZlZ3pldHQuIGVubnlpdCBraXN6ZWQnK2JhdGNoTnVtKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPHF1ZXVlQWpheC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NoaWZ0ZWwnKVxuICAgICAgICAgICAgcXVldWVBamF4LnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVtYWluaW5nIGxlZnQgJytxdWV1ZUFqYXgubGVuZ3RoKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgc3luY0RvaW5nPWZhbHNlO1xuICAgICAgICAgICAgcm9vdC5zeW5jT3JkZXJEYXRhVG9TZXJ2ZXIoKTtcbiAgICAgICAgfSwgT3B0cy5kYXRhU3luY1BhdXNlVGltZSk7XG4gICAgfVxuICAgIGxldCBxdWV1ZUFqYXg9W107XG4gICAgbGV0IHN5bmNEb2luZz1mYWxzZTtcblxuICAgIHRoaXMuc3luY09yZGVyRGF0YVRvU2VydmVyPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy9kZWJ1ZyhxdWV1ZUFqYXgpO1xuICAgICAgICBpZihzeW5jRG9pbmcpe1xuICAgICAgICAgICAgLy9kZWJ1Zygnc3luYyBpbiBwcm9ncmVzcy4uLi4nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihxdWV1ZUFqYXgubGVuZ3RoPDEpe1xuICAgICAgICAgICAgcmV0dXJuIDtcbiAgICAgICAgfVxuICAgICAgICBzeW5jRG9pbmc9dHJ1ZTtcblxuICAgICAgICByb290LnNlbmRPcmRlckRhdGFUb1NlcnZlcigncHJvZHVjdFNlbGVjdCcscm9vdC5hZnRlclN5bmNPcmRlckRhdGFUb1NlcnZlcik7XG4gICAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdGhpcy5vcmRlckl0ZW1zQ2hhbmdlPWZ1bmN0aW9uKEl0ZW1EYXRhLHF1YW50aXR5LGRheUluZGV4KXtcblxuLypcbiAgICAgICAgZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIGRlYnVnKEl0ZW1EYXRhKTtcbiAgICAgICAgZGVidWcocXVhbnRpdHkpO1xuICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKCdwcm9kdWN0U2VsZWN0ZWQnKSk7XG4gICAgICAgIGRlYnVnKCctLS0tLS0tLS0tLS0tLS0tLScpO1xuXG4qL1xuICAgICAgICBpZihpc05hTihxdWFudGl0eSkpe1xuICAgICAgICAgICAgcXVhbnRpdHk9MDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvZHVjdFNlbGVjdGVkPU9yZGVyLmdldERhdGEoJ3Byb2R1Y3RTZWxlY3RlZCcpO1xuICAgICAgICBjb25zb2xlLmdyb3VwKCdvcmRlckl0ZW1zQ2hhbmdlJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKFsncHJvZHVjdFNlbGVjdGVkJyxwcm9kdWN0U2VsZWN0ZWRdKTtcbiAgICAgICAgY29uc29sZS5sb2coWydJdGVtRGF0YScsSXRlbURhdGFdKTtcbiAgICAgICAgY29uc29sZS5sb2coWydJdGVtRGF0YS5pZCcsSXRlbURhdGEuaWRdKTtcbiAgICAgICAgY29uc29sZS5sb2coWydxdWFudGl0eScscXVhbnRpdHldKTtcbiAgICAgICAgY29uc29sZS5sb2coWydkYXlJbmRleCcsZGF5SW5kZXhdKTtcbiAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXSk7XG5cbiAgICAgICAgbGV0IHByb2R1Y3RTZWxlY3RlZEl0ZW09cHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXTtcbiAgICAgICAgLypcbiAgICAgICAgaGEgMCBlcnRlayBqb24gZXMgbmVtIGlzIHZvbHQgYWtrb3IgaGFtYXIga2l1Z3JhdGp1a1xuICAgICAgICAgKi9cbiAgICAgICAgaWYocXVhbnRpdHk9PTApe1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigncXVhbnRpdHk9PTAnKTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9kdWN0U2VsZWN0ZWRJdGVtPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdpdHQgbGVwMScpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGRheUluZGV4KXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndmFuIGRheUluZGV4JylcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXVtkYXlJbmRleF09PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coWydwcm9kdWN0U2VsZWN0ZWRJdGVtJyxwcm9kdWN0U2VsZWN0ZWRJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2l0dCBsZXAyJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKlxuICAgICAgICBoYSBhem9ub3MgYXogZXJ0ZWsga2l1Z3J1bmtcbiAgICAgICAgICovXG4gICAgICAgIGlmKGRheUluZGV4KXtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdIT0ndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICYmIHR5cGVvZiBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdW2RheUluZGV4XSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgIGlmKHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF1bZGF5SW5kZXhdPT1xdWFudGl0eSl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2F6b25vcyBuYXBpJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdPT1xdWFudGl0eSl7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignYXpvbm9zJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHF1YW50aXR5PT0wKXtcbiAgICAgICAgICAgIGlmKGRheUluZGV4KXtcbiAgICAgICAgICAgICAgICBkZWxldGUgT3JkZXIucHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXVtkYXlJbmRleF07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF1bZGF5SW5kZXhdO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9yZGVyLnByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGhhIHZhbiBlcnRlayBlcnRla2V0IGFkdW5rIVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZihkYXlJbmRleCl7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF09PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXT1bXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NldCBxdWFudGl0eSBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdW2RheUluZGV4XScscXVhbnRpdHkpO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF1bZGF5SW5kZXhdPXF1YW50aXR5O1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXT1xdWFudGl0eTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2V0IHF1YW50aXR5IHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF0nLHF1YW50aXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhbJ3Byb2R1Y3RTZWxlY3RlZCcscHJvZHVjdFNlbGVjdGVkXSk7XG4gICAgICAgIE9yZGVyLnByb2R1Y3RTZWxlY3RlZD1wcm9kdWN0U2VsZWN0ZWQ7XG5cbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICBxdWV1ZUFqYXgucHVzaChEYXRlLm5vdygpKTtcbiAgICAgICAgcm9vdC5zeW5jT3JkZXJEYXRhVG9TZXJ2ZXIoKTtcblxuICAgICAgICByZXR1cm47XG5cblxuICAgICAgICBpZihwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdPT1xdWFudGl0eSl7XG4gICAgICAgICAgICBkZWJ1ZygnaXR0IGxlcDEyJyk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXT1xdWFudGl0eTtcbiAgICAgICAgaWYocXVhbnRpdHk9PTApe1xuICAgICAgICAgICAgZGVsZXRlIE9yZGVyLnByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF07XG4gICAgICAgIH1cbiAgICAgICAgT3JkZXIucHJvZHVjdFNlbGVjdGVkPXByb2R1Y3RTZWxlY3RlZDtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcXVldWVBamF4LnB1c2goRGF0ZS5ub3coKSk7XG4gICAgICAgIHJvb3Quc3luY09yZGVyRGF0YVRvU2VydmVyKCk7XG5cbiAgICAgICAgLypcbiAgICAgICAgZGVidWcoT3JkZXIuZ2V0RGF0YSgncHJvZHVjdFNlbGVjdGVkJykpO1xuICAgICAgICBkZWJ1ZygnKioqKioqKioqKioqKioqKioqKicpO1xuKi9cbiAgICB9XG4gICAgdGhpcy5pbml0Vmlld0ludm9pY2U9ZnVuY3Rpb24gKCkge1xuICAgICAgICByb290LlN0ZXBwZXIuc2V0T3B0cyh7b25BZnRlckxvYWQ6ZnVuY3Rpb24gKCl7fX0pO1xuXG4gICAgICAgIGlmKE9iamVjdC5rZXlzKE9yZGVyLnByb2R1Y3RTZWxlY3RlZCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmFkZENvbXBsZXRlZCgnc2VuZCcpO1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmFkZEVuYWJsZWQoJ3NlbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3R5bGVTdHI9JzxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJytPcHRzLlVSTC5yb290KycvY3NzL2ludm9pY2UuY3NzXCI+JztcbiAgICAgICAgJCgndGFibGUuaW52b2ljZSBidXR0b24ucHJpbnRCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ3RhYmxlLmludm9pY2UgYnV0dG9uLnByaW50QnV0dG9uJykub24oJ2NsaWNrJyxmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aW5kb3cucHJpbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IG5ld1dpbj0gd2luZG93Lm9wZW4oXCJcIik7XG4gICAgICAgICAgICBuZXdXaW4uZG9jdW1lbnQud3JpdGUoc3R5bGVTdHIpO1xuICAgICAgICAgICAgbGV0IHByaW50PSQoJ3RhYmxlLmludm9pY2UnKS5jbG9uZSgpO1xuICAgICAgICAgICAgcHJpbnQuZmluZCgnYnV0dG9uLnByaW50QnV0dG9uJykucmVtb3ZlKCk7XG4vLyAgICAgICAgICAgIG5ld1dpbi5kb2N1bWVudC53cml0ZSgkKCd0YWJsZS5pbnZvaWNlJykucHJvcCgnb3V0ZXJIVE1MJykpO1xuICAgICAgICAgICAgbmV3V2luLmRvY3VtZW50LndyaXRlKHByaW50LnByb3AoJ291dGVySFRNTCcpKTtcbiAgICAgICAgICAgIG5ld1dpbi5wcmludCgpO1xuICAgICAgICAgICBuZXdXaW4uY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldE9yZGVyPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgcm9vdC5pbml0KCk7XG4gICAgICAgIHJvb3Quc2V0RGVsaXZlcnlEYXRlKCctJyk7XG4gICAgICAgIHJvb3Quc2V0U3VwcGxpZXIoJy0nKTtcblxuICAgIH1cblxuICAgIHRoaXMuYWZ0ZXJPcmRlclNlbmRPaz1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJTZW50IVwiLCBtZXNzYWdlOiAnT3JkZXIgU2VudCcgLCBzdGF0dXM6IFRPQVNUX1NUQVRVUy5JTkZPLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgICAgICAkKCcuYnV0dG9uT3JkZXJTZW5kJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCcuYnV0dG9uT3JkZXJTZW5kJykucHJvcCgnZGlzYWJsZWQnLHRydWUpO1xuICAgICAgICAkKCcuc3RhdHVzTmFtZVBsYWNlJykucmVtb3ZlQ2xhc3MoJ3N0YXR1c0JsaW5rJyk7XG4gICAgICAgICQoJy5zdGF0dXNOYW1lUGxhY2UnKS50ZXh0KCdlbGvDvGxkdmUnKTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZGluZycpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZE9rJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAkKCdkaXYuaW52b2ljZUNvbnRhaW5lcicpLmh0bWwoZGF0YS5yZXRIVE1MKTtcbiAgICAgICAgLy9yb290LnJlc2V0T3JkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5hZnRlck9yZGVyU2VuZEVycm9yPWZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmQnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmRpbmcnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICQuZWFjaChBUFAuT3JkZXJNb2R1bGUuU3RlcHBlci5nZXRPcHRzKCkuYXZhaWxhYmxlLGZ1bmN0aW9uIChpbmRleCx2YWx1ZSkge1xuICAgICAgICAgICAgQVBQLk9yZGVyTW9kdWxlLlN0ZXBwZXIuc2V0RW5hYmxlZCh2YWx1ZSk7XG4gICAgICAgICAgICBBUFAuT3JkZXJNb2R1bGUuU3RlcHBlci5zZXRDb21wbGV0ZWQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRWaWV3U2VuZD1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbml0Vmlld1NlbmQgY2FsbGVkIDInKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOmZ1bmN0aW9uICgpe319KTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZCcpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZCcpLm9uKCdjbGljaycsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NlbmQgYnV0b24gY2xpY2tlZCcpO1xuICAgICAgICAgICAgLy9AdG9kbzogZGF0YXN5bmNoZXJlIGFuZCBjYWxsYmFja1xuICAgICAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZCcpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgICAgICQoJy5idXR0b25PcmRlclNlbmRpbmcnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFBNMTU4XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICQuZWFjaChBUFAuT3JkZXJNb2R1bGUuU3RlcHBlci5nZXRPcHRzKCkuYXZhaWxhYmxlLGZ1bmN0aW9uIChpbmRleCx2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldEVuYWJsZWQodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldENvbXBsZXRlZCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qKlxuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJvb3Quc2VuZE9yZGVyRGF0YVRvU2VydmVyKCdzZW5kJyxyb290LmFmdGVyT3JkZXJTZW5kT2sscm9vdC5hZnRlck9yZGVyU2VuZEVycm9yKTtcblxuLyogICAgICAgICAgICBsZXQgYWpheERhdGE9e307XG4gICAgICAgICAgICBhamF4RGF0YS5fdG9rZW49T3B0cy50b2tlbjtcbiAgICAgICAgICAgIGFqYXhEYXRhLnNlbmQ9dHJ1ZTtcbiAgICAgICAgICAgICQuZXh0ZW5kKGFqYXhEYXRhLE9yZGVyKTtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICB1cmw6IE9wdHMuVVJMLnN0b3JlLFxuICAgICAgICAgICAgICAgIG1ldGhvZDonUE9TVCcsXG4gICAgICAgICAgICAgICAgZGF0YTphamF4RGF0YSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LmFmdGVyT3JkZXJTZW5kT2soZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsqL1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMudGVzdE1vZGVTZW5kPWZ1bmN0aW9uICgpIHtcblxuICAgIH1cblxuXG4gICAgdGhpcy50ZXN0TW9kZT1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0TW9kZSBjYWxsZWQgJylcbiAgICAgICAgT3JkZXIuc2V0RGF0YSh7XG4gICAgICAgICAgICBpZDoyMzQsXG4gICAgICAgICAgICBzdXBwbGllcklkOjcsXG4gICAgICAgICAgICBwcm9kdWN0U2VsZWN0ZWQ6e1xuICAgICAgICAgICAgICAgIDExNiA6IDMsXG4gICAgICAgICAgICAgICAgMjkzIDogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWN0TmFtZTonQ29udGFjdCBOYW1lJyxcbiAgICAgICAgICAgIG5vdGU6J05vdGUnLFxuICAgICAgICAgICAgdHlwZTonZGFpbHknLFxuICAgICAgICAgICAgZGVsaXZlcnlEYXRlOk9wdHMuZGVmYXVsdERlbGl2ZXJ5RGF0ZSxcbiAgICAgICAgICAgIGRlbGl2ZXJ5QWRkcmVzczoxMixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKE9yZGVyLmdldERhdGEoKSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJyoqKioqKioqKioqKioqKioqKionKTtcbiAgICAgICAgLy9yb290LlN0ZXBwZXIuc2V0T3B0cyh7J1VybERhdGEnOnsnc3VwcGxpZXJJZCc6c3VwcGxpZXJJZH19KTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoeydVcmxEYXRhJzp7J3N1cHBsaWVySWQnOk9yZGVyLnN1cHBsaWVySWQsaWQ6T3JkZXIuaWR9fSk7XG4gICAgICAgIHRoaXMuU3RlcHBlci5pbml0KHtcbiAgICAgICAgICAgIFVSTDoge1xuICAgICAgICAgICAgICAgIGNyZWF0ZTogT3B0cy5VUkwuY3JlYXRlLFxuICAgICAgICAgICAgfSxcbi8qXG5jc3VwYXN6IGF6IGVsZWplcm9sXG4gICAgICAgICAgICBjb21wbGV0ZTpbJ3N1cHBsaWVyJ10sXG4gICAgICAgICAgICBlbmFibGU6IFsnc3VwcGxpZXInXSxcbiAgICAgICAgICAgIGFjdGl2ZTogJ3N1cHBsaWVyJyxcbiAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTp0aGlzLmluaXRWaWV3U3VwcGxpZXIsXG5cbnByb2R1Y3Qgc2VsZWN0XG4gICAgICAgICAgICBjb21wbGV0ZTpbJ3N1cHBsaWVyJywncGFyYW1ldGVyJywncHJvZHVjdFNlbGVjdCddLFxuICAgICAgICAgICAgZW5hYmxlOiBbJ3N1cHBsaWVyJywncGFyYW1ldGVyJywncHJvZHVjdFNlbGVjdCddLFxuICAgICAgICAgICAgYWN0aXZlOiAncHJvZHVjdFNlbGVjdCcsXG4gICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6dGhpcy5pbml0Vmlld1Byb2R1Y3RTZWxlY3QsXG5cbmZ1bGxvc1xuICAgICAgICAgICAgY29tcGxldGU6WydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnLCdpbnZvaWNlJ10sXG4gICAgICAgICAgICBlbmFibGU6IFsnc3VwcGxpZXInLCdwYXJhbWV0ZXInLCdwcm9kdWN0U2VsZWN0JywnaW52b2ljZScsJ3NlbmQnXSxcbiAgICAgICAgICAgIGFjdGl2ZTogJ3Byb2R1Y3RTZWxlY3QnLFxuICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnRoaXMuaW5pdFZpZXdQcm9kdWN0U2VsZWN0LFxuXG5zZW5kXG4gICAgICAgICAgICBjb21wbGV0ZTpbJ3N1cHBsaWVyJywncGFyYW1ldGVyJywncHJvZHVjdFNlbGVjdCcsJ2ludm9pY2UnLCdzZW5kJ10sXG4gICAgICAgICAgICBlbmFibGU6IFsnc3VwcGxpZXInLCdwYXJhbWV0ZXInLCdwcm9kdWN0U2VsZWN0JywnaW52b2ljZScsJ3NlbmQnXSxcbiAgICAgICAgICAgIGFjdGl2ZTogJ3NlbmQnLFxuICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnRoaXMuaW5pdFZpZXdQcm9kdWN0U2VsZWN0LFxuXG4qL1xuICAgICAgICAgICAgY29tcGxldGU6WydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnXSxcbiAgICAgICAgICAgIGVuYWJsZTogWydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnXSxcbiAgICAgICAgICAgIGFjdGl2ZTogJ3Byb2R1Y3RTZWxlY3QnLFxuICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnRoaXMuaW5pdFZpZXdQcm9kdWN0U2VsZWN0LFxuXG5cbiAgICAgICAgICAgIGF1dG9DYWxsYmFjazoge1xuICAgICAgICAgICAgICAgIGludm9pY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnJvb3QuaW5pdFZpZXdJbnZvaWNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTpyb290LmluaXRWaWV3U2VuZFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJyoqKioqKioqKioqKioqKioqKionKTtcblxuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUVuYWJsZVNlbmQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygndG9nZ2xlRW5hYmxlU2VuZCBjYWxsZWQnKTtcbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuY2hlY2tSZWFkeVRvU2VuZC5yZXBsYWNlKCclaWQlJyxPcmRlci5pZCk7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3Mpe1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnJlYWR5VG9TZW5kKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci5hZGRDb21wbGV0ZWQoJ3NlbmQnKTtcbi8qXG4gICAgICAgICAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIuYWRkQ29tcGxldGVkKCdpbnZvaWNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIuYWRkRW5hYmxlZCgnaW52b2ljZScpO1xuKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci5hZGRFbmFibGVkKCdzZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0Q29tcGxldGVkKCdzZW5kJyk7XG4vKlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0Q29tcGxldGVkKCdpbnZvaWNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIudW5zZXRFbmFibGVkKCdpbnZvaWNlJyk7XG4qL1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0RW5hYmxlZCgnc2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbn1cbiJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJPcmRlck1vZHVsRGVmYXVsdCIsImFjdGlvbkZ1bmN0aW9uIiwiRGF0YU1vZGVsT3JkZXIiLCJfRGF0YU1vZGVsIiwiZGF0YSIsIm9wdGlvbnMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJwcm9kdWN0U2VsZWN0ZWQiLCJwcm9kdWN0Q29tbWVudCIsImNvbnNvbGUiLCJsb2ciLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJEYXRhTW9kZWwiLCJTdGVwcGVyIiwiT3B0cyIsImNvbXBsZXRlIiwiYXZhaWxhYmxlIiwiZW5hYmxlIiwibG9hZCIsImV4Y2x1ZGVMb2FkZWQiLCJsb2FkZWQiLCJhY3RpdmUiLCJVUkwiLCJjcmVhdGUiLCJVcmxEYXRhIiwib25BZnRlckxvYWQiLCJvbkFmdGVyQWN0aXZhdGUiLCJhdXRvQ2FsbGJhY2siLCJub3dMb2FkZWQiLCJyb290IiwiY29uc3RydWN0IiwiJCIsImV4dGVuZCIsImdldE9wdHMiLCJzZXRPcHRzIiwiaW5pdCIsImRlYnVnIiwiZWFjaCIsInN0ZXBOYW1lIiwiaW5jbHVkZXMiLCJzZXRDb21wbGV0ZWQiLCJzZXRFbmFibGVkIiwibG9hZFN0ZXBDb250ZW50Iiwic2V0QWN0aXZlIiwiYmluZENsaWNrQWN0aW9uIiwic3RlcENsaWNrQnV0dG9ucyIsIm9mZiIsIm9uIiwic3RlcENsaWNrIiwiYWRkQ2xhc3MiLCJ1bnNldENvbXBsZXRlZCIsInJlbW92ZUNsYXNzIiwiYXJyYXlSZW1vdmUiLCJ1bnNldEVuYWJsZWQiLCJjb250ZW50cyIsInVud3JhcCIsInN0ZXBJdGVtIiwiaHRtbCIsImFkZEVuYWJsZWQiLCJwdXNoIiwiYWRkQ29tcGxldGVkIiwiYWpheCIsImFzeW5jIiwidHlwZSIsInVybCIsImNhY2hlIiwic3VjY2VzcyIsInJlc3VsdCIsImNvbnRhaW5lciIsImNhcGl0YWxpemUiLCJpbkFycmF5IiwiY2xlYXJMb2FkZWQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsInNldEFjdGl2ZUZpbmlzaCIsInNob3ciLCJoaWRlIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImN1cnJlbnRUYXJnZXQiLCJPcmRlck1vZHVsZSIsInRlc3RNb2RlIiwibmVlZFN0ZXBwZXIiLCJDU1NTZWxlY3RvckZvcm0iLCJkZWZhdWx0RGVsaXZlcnlEYXRlIiwiZGF0YVN5bmNQYXVzZVRpbWUiLCJ0b2tlbiIsImdldERhdGFUYWJsZUNvbnRlbnRQcm9kdWN0TGlzdCIsImNoZWNrUmVhZHlUb1NlbmQiLCJpbmRleCIsImVkaXQiLCJzdG9yZSIsInVwZGF0ZSIsImRlc3Ryb3kiLCJ0b2dnbGVGYXZvcml0ZXMiLCJQdWJsaWNWYXIiLCJQdWJsaWNWYXIyIiwiQXBpVG9rZW4iLCJPcmRlciIsInZpZXdJbmljaWFsaXplZCIsImNsaWNrT3JkZXJFZGl0IiwiYWpheFVybCIsInJlcGxhY2UiLCJpZCIsIkFQUCIsImxvYWRNYWluQ29udGVudCIsImFmdGVyT3JkZXJEZWxldGVkIiwiVG9hc3QiLCJ0aXRsZSIsIm1lc3NhZ2UiLCJzdGF0dXMiLCJUT0FTVF9TVEFUVVMiLCJEQU5HRVIiLCJ0aW1lb3V0IiwiY2xpY2tPcmRlckRlbGV0ZUNvbmZpcm1lZCIsIm1vZGFsIiwiYWpheERhdGEiLCJfdG9rZW4iLCJtZXRob2QiLCJpbml0Vmlld09yZGVyU2VsZWN0IiwiYWN0aW9uIiwib3JkZXJJZCIsImNsb3Nlc3QiLCJmaW5kIiwidGV4dCIsImluaXRTdGVwcGVyIiwiZ2V0RGF0YSIsInNldERlbGl2ZXJ5RGF0ZSIsInNldFN1cHBsaWVyIiwidW5FbmFibGVkIiwidmFsdWUiLCJzdGVwQWN0aXZlIiwic3RlcENvbXBsZXRlIiwic3RlcEVuYWJsZSIsInN0ZXBPbkFmdGVyQWN0aXZhdGUiLCJhdmFsYWlibGVTdGVwcyIsInN0ZXBVcmxEYXRhIiwic3RlcEF1dG9DYWxsYmFjayIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJpdGVtIiwiZXJyIiwiZSIsImYiLCJzdXBwbGllcklkIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImluaXRPcmRlciIsInN1cHBsaWVyTmFtZSIsInNldERhdGEiLCJkYXRlVGV4dCIsImRhdGVUZXh0VG8iLCJkYXRlVGV4dEh1bWFuIiwicmVwbGFjZUFsbCIsImxlbmd0aCIsInZhbCIsInNldFN1cHBsaWVyQ29tcGxldGVkIiwiaW5pdFZpZXdQYXJhbWV0ZXIiLCJhZnRlck9yZGVyU2V0U3VwcGxpZXJPayIsInN1cHBsaWVyIiwiSU5GTyIsImluaXRWaWV3U3VwcGxpZXIiLCJzdG9yZVR5cGUiLCJXQVJOSU5HIiwiY2hlY2tDb250YWN0TmFtZUZpZWxkIiwibm9kZSIsInNlbmRPcmRlckRhdGFUb1NlcnZlciIsInVwZGF0ZVR5cGUiLCJjYWxsYmFjayIsImVycm9yQ2FsbGJhY2siLCJhamF4TWV0aG9kIiwiX21ldGhvZCIsImpzb25Ub0Zvcm1EYXRhIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsImVycm9yIiwieGhyIiwiYWpheE9wdGlvbnMiLCJ0aHJvd25FcnJvciIsImFqYXhFcnJvckhhbmRsZXIiLCJyZXNwb25zZUpTT04iLCJhZnRlck9yZGVyU2V0UGFyYW1ldGVyT2siLCJzZWxlY3RDdXJyZW50V2VlayIsIndlZWtIb3ZlciIsIndlZWtIb3ZlclNsb3ciLCJzZXRUaW1lb3V0IiwiaW5pdERhdGVQaWNrZXIiLCJzdGFydERhdGUiLCJEYXRlIiwiZW5kRGF0ZSIsImRhdGVwaWNrZXIiLCJzaG93T3RoZXJNb250aHMiLCJzZWxlY3RPdGhlck1vbnRocyIsInNob3dXZWVrIiwiZGF0ZUZvcm1hdCIsImZpcnN0RGF5IiwibWluRGF0ZSIsImFmdGVyU2hvdyIsImluc3QiLCJvblNlbGVjdCIsImRhdGUiLCJnZXRNb25kYXkiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldERheSIsImZvcm1hdERhdGUiLCJiZWZvcmVTaG93IiwiZ3JvdXAiLCJncm91cEVuZCIsImJlZm9yZVNob3dEYXkiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJjc3NDbGFzcyIsIm9uQ2hhbmdlTW9udGhZZWFyIiwieWVhciIsIm1vbnRoIiwiYXZhaWxhYmxlRGF0ZXMiLCJuZXh0RGVsaXZlcnlEYXRlIiwiaGFzRGVsaXZlcnlDb25zdHJhaW50IiwiaG9saWRheXMiLCJ3b3JraW5nRGF5cyIsImRhdGVwaWNrZXJJbnB1dCIsImNhbGVuZGFyVXJsIiwicHJvZml0Q2VudGVySWQiLCJvcmRlckRhdGVUaW1lIiwidG9JU09TdHJpbmciLCJtYXAiLCJoIiwiZGVzY3JpcHRpb24iLCJ3IiwiZGF0ZXBpY2tlck9wdHMiLCJkYXRlU3RyIiwiaG9saWRheUVudHJ5Iiwid29ya2luZ0RheUVudHJ5IiwiaXNEZWxpdmVyeSIsImNzc0NsYXNzZXMiLCJ0b29sdGlwIiwic2VsZWN0YWJsZSIsImpvaW4iLCJjYWxsQ2hhbmdlT3JkZXJUeXBlIiwiY2xpY2siLCJzZWxlY3QyIiwicHJvcCIsInNldERhdGUiLCJzdWJtaXQiLCJjaGVja1ZhbGlkaXR5Iiwic3RvcFByb3BhZ2F0aW9uIiwiY29udGFjdE5hbWUiLCJub3RlIiwib3JkZXJUeXBlIiwiZGVsaXZlcnlEYXRlIiwiZGVsaXZlcnlBZGRyZXNzSWQiLCJkZWxpdmVyeUFkZHJlc3MiLCJjdXN0b21Ob3RpZmljYXRpb25FbWFpbCIsImJsYW5rIiwic2V0UGFyYW1ldGVyQ29tcGxldGVkIiwiYmluZFJvd0Zhdm9yaXRlc0FjdGlvbiIsInByb2R1Y3RJZCIsImJ1dHRvbiIsInJlc3BvbnNlIiwiYmluZFJvd0Rlc2NyaXB0aW9uQWN0aW9uIiwiY29tbWVudCIsInF1ZXVlQWpheCIsIm5vdyIsInN5bmNPcmRlckRhdGFUb1NlcnZlciIsInByb2R1Y3RTZWxlY3REYXRhdGFibGVzUm93Rm9ybWF0dGVyIiwiZCIsInRlbXBsYXRlRGF0YSIsIl90eXBlb2YiLCJmYXZvcml0ZXMiLCJidG5GYXZvcml0ZXNDbGFzcyIsInRlbXBsYXRlIiwid2Vla2x5IiwiaXRlbVF1YW50aXR5Iiwib2xkVGFncyIsIk11c3RhY2hlIiwidGFncyIsInNwZWNpZmljYXRpb25DbGFzcyIsInBpY3R1cmVJbWciLCJwaWN0dXJlQ2xhc3MiLCJyZW5kZXIiLCJzZXREYXRhdGFibGVIZWFkZXJUZXh0IiwiZ2V0VHJlZVBhdGhOYW1lIiwicmVzIiwiaXRlbXMiLCJwYXJlbnRzIiwidG9BcnJheSIsInNoaWZ0IiwicmV2ZXJzZSIsImNoaWxkcmVuIiwic2VsZWN0ZWRQcm9kdWN0R3JvdXAiLCJkYXRhVGFibGVTZWFyY2hTdHIiLCJkYXRhVGFibGVTZWFyY2hLcmVsIiwic2VhcmNoUHJvZHVjdEJ5U3RyaW5nIiwiZmlsdGVyU3RyIiwiRGF0YVRhYmxlIiwicmVsb2FkIiwiY2xpY2tTZWFyY2hQcm9kdWN0IiwiY2xpY2tGYXZvcml0ZXNQcm9kdWN0IiwiY2xpY2tPZnRlblByb2R1Y3QiLCJjbGlja1NwZWNpYWxPZmZlciIsImNsaWNrTGFzdFByb2R1Y3QiLCJjbGlja1dlZWtseVByb2R1Y3QiLCJjbGlja0tyZWxQcm9kdWN0IiwicGFyZW50IiwidG9nZ2xlQ2xhc3MiLCJwcm9kdWN0U2VsZWN0RGF0YVRhYmxlQ29sdW1uRGVmcyIsInByb2R1Y3RTZWxlY3REYXRhVGFibGVDb2x1bW4iLCJjb2x1bW5EYXRhIiwiYWN0aW9uQ29sdW1uIiwiZGVmYXVsdENvbnRlbnQiLCJnZXREYXRhdGFibGVzIiwidGFibGUiLCJsYW5ndWFnZSIsInNlYXJjaFN0ciIsImtyZWwiLCJncm91cElkIiwiYnV0dG9ucyIsInByb2R1Y3RTZWxlY3REYXRhVGFibGVEcmF3RFQiLCJmaWx0ZXIiLCJpbnB1dFNwaW5uZXIiLCJidXR0b25zV2lkdGgiLCJncm91cENsYXNzIiwiYnV0dG9uc0NsYXNzIiwiYmluZFdlYWtVc2VySGVscGVyIiwicXVhbnRpdHkiLCJwYXJzZUZsb2F0Iiwicm93RGF0YSIsInJvdyIsIm9yZGVySXRlbXNDaGFuZ2UiLCJxdWFudGl0eUN1cnJlbnQiLCJ0cmlnZ2VyIiwiaW5pdFZpZXdQcm9kdWN0U2VsZWN0IiwiZnVuY3Rpb25OYW1lIiwid2hpY2giLCJrZXkiLCJnZXRUaW1lIiwiZGF0YVRhYmxlIiwidHIiLCJjaGlsZCIsImlzU2hvd24iLCJiaW5kUHJvZHVjdERldGFpbHNBY3Rpb24iLCJiaW5kT3JkZXJJdGVtV2Vla1F1YW50aXR5IiwiYWN0dWFsSXRlbSIsImZvY3VzIiwicm93Tm9kZSIsInByZXYiLCJhZnRlclN5bmNPcmRlckRhdGFUb1NlcnZlciIsImkiLCJzeW5jRG9pbmciLCJJdGVtRGF0YSIsImRheUluZGV4IiwiaXNOYU4iLCJwcm9kdWN0U2VsZWN0ZWRJdGVtIiwiaW5pdFZpZXdJbnZvaWNlIiwiT2JqZWN0Iiwia2V5cyIsInN0eWxlU3RyIiwicHJpbnQiLCJuZXdXaW4iLCJvcGVuIiwiZG9jdW1lbnQiLCJ3cml0ZSIsImNsb25lIiwicmVtb3ZlIiwiY2xvc2UiLCJyZXNldE9yZGVyIiwiYWZ0ZXJPcmRlclNlbmRPayIsInJldEhUTUwiLCJhZnRlck9yZGVyU2VuZEVycm9yIiwiaW5pdFZpZXdTZW5kIiwidGVzdE1vZGVTZW5kIiwiaW52b2ljZSIsInNlbmQiLCJ0b2dnbGVFbmFibGVTZW5kIiwicmVhZHlUb1NlbmQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/moduleJs/order.js\n\n}"); +eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nwindow.OrderModulDefault = {\n actionFunction: function actionFunction() {}\n};\nvar DataModelOrder = /*#__PURE__*/function (_DataModel) {\n /*\n * Constructor\n */\n function DataModelOrder(data, options) {\n var _this;\n _classCallCheck(this, DataModelOrder);\n _this = _callSuper(this, DataModelOrder, [data, options]);\n if (typeof _this.productSelected === \"undefined\") {\n _this.productSelected = {};\n }\n if (typeof _this.productComment === \"undefined\") {\n _this.productComment = {};\n }\n console.log(_this.constructor.name + ' constructor called');\n return _this;\n }\n _inherits(DataModelOrder, _DataModel);\n return _createClass(DataModelOrder);\n}(DataModel);\n;\nwindow.DataModelOrder = DataModelOrder;\nwindow.Stepper = function () {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n complete: ['supplier'],\n available: ['supplier', 'parameter', 'productSelect', 'invoice', 'send'],\n enable: ['supplier', 'invoice'],\n load: [],\n excludeLoaded: ['invoice', 'send'],\n loaded: [],\n active: false,\n URL: {\n create: ''\n },\n UrlData: false,\n onAfterLoad: function onAfterLoad() {},\n onAfterActivate: function onAfterActivate() {},\n autoCallback: {\n 'invoice': {\n onAfterActivate: function onAfterActivate() {}\n },\n 'send': {\n onAfterActivate: function onAfterActivate() {}\n }\n },\n nowLoaded: false\n };\n var root = this;\n /*\n * Constructor\n */\n this.construct = function (options) {\n $.extend(Opts, options);\n };\n this.getOpts = function () {\n return Opts;\n };\n this.setOpts = function (options) {\n $.extend(Opts, options);\n };\n this.init = function (options) {\n $.extend(Opts, options);\n debug(Opts);\n $('.step').each(function () {\n var stepName = $(this).data('stepname');\n if (Opts.complete.includes(stepName)) {\n root.setCompleted(stepName);\n }\n if (Opts.enable.includes(stepName)) {\n root.setEnabled(stepName);\n }\n if (Opts.load.includes(stepName)) {\n root.loadStepContent(stepName);\n }\n if (Opts.active === stepName) {\n root.setActive(stepName);\n }\n });\n root.bindClickAction();\n };\n this.bindClickAction = function () {\n var stepClickButtons = $('.stepClick');\n stepClickButtons.off('click');\n stepClickButtons.on('click', root.stepClick);\n };\n this.setCompleted = function (stepName) {\n console.log(stepName + ' completed');\n $('.step[data-stepName=\"' + stepName + '\"]').addClass('completed');\n };\n this.unsetCompleted = function (stepName) {\n console.log(stepName + ' Uncompleted');\n $('.step[data-stepName=\"' + stepName + '\"]').removeClass('completed');\n Opts.complete = arrayRemove(Opts.complete, stepName);\n };\n this.unsetEnabled = function (stepName) {\n console.log(stepName + ' Un enabled');\n $('.click' + stepName).contents().unwrap();\n Opts.enable = arrayRemove(Opts.enable, stepName);\n };\n this.setEnabled = function (stepName) {\n console.log(stepName + ' enabled');\n var stepItem = $('.step[data-stepName=\"' + stepName + '\"]');\n stepItem.html('' + stepItem.html() + '');\n root.bindClickAction();\n //$('.stepClick').click(root.stepClick);\n };\n this.addEnabled = function (stepName) {\n if (!Opts.enable.includes(stepName)) {\n Opts.enable.push(stepName);\n }\n root.setEnabled(stepName);\n };\n this.addCompleted = function (stepName) {\n if (!Opts.complete.includes(stepName)) {\n Opts.complete.push(stepName);\n }\n root.setCompleted(stepName);\n root.bindClickAction();\n };\n this.loadStepContent = function (stepName) {\n var data = {\n 'type': stepName\n };\n $.extend(data, Opts.UrlData);\n $.ajax({\n async: true,\n type: \"GET\",\n url: Opts.URL.create,\n data: data,\n cache: false,\n success: function success(result) {\n var container = $('.SC' + stepName.capitalize());\n if ($.inArray(stepName, Opts.excludeLoaded) == -1) {\n Opts.loaded.push(stepName);\n } else {\n console.log('excluded View');\n }\n container.html(result);\n if (Opts.nowLoaded) {\n Opts.nowLoaded(stepName);\n }\n Opts.onAfterLoad();\n }\n });\n };\n this.clearLoaded = function () {\n Opts.loaded = ['supplier'];\n $('.stepContainer').each(function () {\n /*\n console.log(this.classList);\n console.log(this.classList.contains('SCSupplier'));\n console.log($(this).attr('class'));\n */\n if (!this.classList.contains('SCSupplier')) {\n $(this).html('');\n }\n });\n };\n this.setActiveFinish = function (stepName) {\n var container = $('.SC' + stepName.capitalize());\n if (stepName === 'productSelect') {\n $('.containerStepper').addClass('activeSideBar');\n } else {\n $('.containerStepper').removeClass('activeSideBar');\n }\n debug('setActiveFinish show:' + stepName);\n container.show();\n Opts.nowLoaded = false;\n root.active = stepName;\n Opts.onAfterActivate();\n if (typeof Opts.autoCallback[stepName] !== 'undefined') {\n Opts.autoCallback[stepName].onAfterActivate();\n }\n };\n this.setActive = function (stepName) {\n $('.stepContainer').hide();\n if (!Opts.loaded.includes(stepName)) {\n root.loadStepContent(stepName);\n Opts.nowLoaded = this.setActiveFinish;\n } else {\n this.setActiveFinish(stepName);\n }\n };\n this.stepClick = function (event) {\n event.preventDefault();\n var stepName = $(event.currentTarget).data('stepname');\n console.log('setActive:' + stepName);\n root.setActive(stepName);\n };\n};\nwindow.OrderModule = function () {\n /*\n * Variables accessible\n * in the class\n */\n var Opts = {\n testMode: false,\n needStepper: true,\n CSSSelectorForm: '.orderParameterForm',\n defaultDeliveryDate: '',\n dataSyncPauseTime: 500,\n token: null,\n URL: {\n root: null,\n getDataTableContentProductList: null,\n checkReadyToSend: null,\n index: null,\n show: null,\n edit: null,\n create: null,\n store: null,\n update: null,\n destroy: null,\n toggleFavorites: null\n }\n };\n var PublicVar = {};\n var PublicVar2 = {\n 'asd': '21'\n };\n var ApiToken = null;\n var Order = null;\n var root = this;\n var viewInicialized = [];\n this.setOpts = function (options) {\n $.extend(Opts, options);\n };\n this.getOpts = function () {\n return Opts;\n };\n this.clickOrderEdit = function (data) {\n debug('clickEdit');\n debug(data);\n var ajaxUrl = Opts.URL.edit.replace('%id%', data.id);\n APP.loadMainContent(ajaxUrl);\n /* let ajaxData={};\n ajaxData._token=Opts.token;\n $.extend(ajaxData,Order);\n let ajaxUrl=Opts.URL.edit.replace('%id%',data.id);\n $.ajax({\n url: ajaxUrl,\n method:'GET',\n data:ajaxData,\n success:function (response) {\n if(response.success){\n let orderData=response.data;\n orderData.supplierId=orderData.supplier_id;\n delete(orderData.supplier_id);\n root.initOrder(orderData);\n root.initStepper();\n //root.afterOrderSetSupplierOk(data.data);\n }\n }\n });*/\n };\n this.afterOrderDeleted = function (data) {\n if (data.success == true) {\n debug('Order delete success');\n APP.loadMainContent(Opts.URL.index);\n } else {\n Toast.create({\n title: \"Error deleted !\",\n message: '',\n status: TOAST_STATUS.DANGER,\n timeout: 5000\n });\n }\n };\n this.clickOrderDeleteConfirmed = function (event) {\n debug('clickOrderDeleteConfirmed');\n debug(event);\n debug(event.data);\n $('#dialogModal').modal('hide');\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var ajaxUrl = Opts.URL.destroy.replace('%id%', event.data.id);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n method: \"DELETE\",\n success: root.afterOrderDeleted\n //error:ajaxErrorHandler\n });\n };\n this.initViewOrderSelect = function () {\n debug('called initViewOrderSelect ');\n $('.ordersSelectTable button').off('click');\n $('.ordersSelectTable button').on('click', function () {\n var action = $(this).data('action');\n var orderId = $($(this).closest('tr')[0]).data('orderid');\n debug(action);\n debug(orderId);\n if (action == 'delete') {\n $('#dialogModal').on('show.bs.modal', function (event) {\n // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).\n // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.\n var modal = $(this);\n modal.find('.modal-title').text('Megerősítés ');\n modal.find('.modal-body').text('Biztosan törli a megrendelést?');\n modal.find('.buttonYes').off('click');\n modal.find('.buttonYes').on('click', {\n id: orderId\n }, root.clickOrderDeleteConfirmed);\n });\n $('#dialogModal').modal('show');\n } else {\n root.clickOrderEdit({\n id: orderId\n });\n }\n });\n $('.buttonNew').off('click');\n $('.buttonNew').on('click', function () {\n APP.loadMainContent(Opts.URL.index, 'force=true');\n });\n };\n this.initStepper = function () {\n debug(Order.getData());\n viewInicialized = [];\n $('.statusNamePlace').text('Nincs elküldve');\n $('.statusNamePlace').addClass('statusBlink');\n root.setDeliveryDate('-');\n root.setSupplier('-');\n var unEnabled = ['parameter', 'productSelect', 'invoice', 'send'];\n $.each(unEnabled, function (index, value) {\n root.Stepper.unsetEnabled(value);\n root.Stepper.unsetCompleted(value);\n });\n debug(root.Stepper.getOpts()['available']);\n debug(Order.getData()['orderStatus']);\n var stepActive = 'supplier';\n var stepComplete = ['supplier'];\n var stepEnable = [];\n var stepOnAfterActivate = function stepOnAfterActivate() {};\n var avalaibleSteps = root.Stepper.getOpts()['available'];\n var stepUrlData = false;\n var stepAutoCallback = [];\n var _iterator = _createForOfIteratorHelper(avalaibleSteps),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _stepName = _step.value;\n stepOnAfterActivate = this['initView' + _stepName.capitalize()];\n var item = {};\n item['onAfterActivate'] = stepOnAfterActivate;\n stepAutoCallback[_stepName] = item;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n debug(stepAutoCallback);\n debug(Order.getData()['id']);\n if (Order.getData()['id'] > 0) {\n debug('hajra');\n debug(Order.getData());\n if (Order.getData()['deliveryDate']) {\n root.setDeliveryDate(Order.getData()['deliveryDate']);\n /*\n @todo: weekly-t beallitani\n */\n }\n if (Order.getData()['supplierName']) {\n root.setSupplier(Order.getData()['supplierName']);\n }\n stepUrlData = {\n 'supplierId': Order.supplierId,\n id: Order.id\n };\n var _iterator2 = _createForOfIteratorHelper(avalaibleSteps),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var stepName = _step2.value;\n console.log(stepName);\n stepComplete.push(stepName);\n stepEnable.push(stepName);\n if (Order.getData()['orderStatus'] == stepName) {\n stepActive = stepName;\n /*\n debug('initView'+stepName.capitalize());\n if(stepName!=='invoice' && stepName!=='send'){\n stepOnAfterActivate=this['initView'+stepName.capitalize()];\n }else{\n stepOnAfterActivate=function (){};\n }\n */\n break;\n }\n }\n\n /*\n //refactored for loop\n var BreakException = {};\n try {\n avalaibleSteps.forEach(function(stepName) {\n console.log(stepName);\n stepComplete.push(stepName);\n stepEnable.push(stepName);\n if(Order.getData()['orderStatus']==stepName){\n stepActive=stepName;\n throw BreakException;\n }\n \n });\n } catch (e) {\n if (e !== BreakException) throw e;\n }*/\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n root.Stepper.init({\n complete: stepComplete,\n enable: stepEnable,\n loaded: [],\n active: stepActive,\n URL: {\n create: Opts.URL.create\n },\n UrlData: stepUrlData,\n onAfterActivate: stepOnAfterActivate,\n autoCallback: stepAutoCallback\n /*{\n invoice: {\n onAfterActivate:root.initViewInvoice\n },\n send: {\n onAfterActivate:root.initViewSend\n },\n }*/\n });\n };\n this.initOrder = function (data) {\n Order = new DataModelOrder(data);\n };\n this.init = function (options) {\n debug('OrderModul init called');\n $.extend(Opts, window.OrderModulDefault, options);\n Order = new DataModelOrder();\n if (Opts.needStepper) {\n if (typeof this.Stepper == 'undefined') {\n this.Stepper = new Stepper();\n }\n }\n if (Opts.testMode) {\n return root.testMode();\n }\n };\n this.setSupplier = function (supplierName, supplierId) {\n if (supplierName) {\n $('.supplierNamePlace').text(supplierName);\n }\n if (supplierId) {\n Order.setData({\n supplierId: supplierId\n });\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': supplierId\n }\n });\n }\n };\n this.setDeliveryDate = function (dateText, dateTextTo) {\n var dateTextHuman = dateText.replaceAll('-', '.') + '.';\n if (dateTextHuman.length < 5) {\n $('.deliveryDatePlace').text(dateText);\n return;\n }\n if (dateTextTo) {\n dateTextHuman += ' - ' + dateTextTo.replaceAll('-', '.') + '.';\n }\n $(Opts.CSSSelectorForm + ' .selectedDateText').text(dateTextHuman);\n $('.deliveryDatePlace').text(dateTextHuman);\n $(Opts.CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(dateText);\n };\n this.getData = function () {\n return Order;\n };\n this.setSupplierCompleted = function () {\n console.log('bingo');\n root.initViewParameter();\n };\n this.afterOrderSetSupplierOk = function (data) {\n Toast.create({\n title: \"Supplier selected !\",\n message: data.supplier.name,\n status: TOAST_STATUS.INFO,\n timeout: 5000\n });\n root.setSupplier(data.supplier.name, data.supplier.id);\n Order.setData({\n id: data.id\n });\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n id: Order.id\n }\n });\n //root.Stepper.setOpts({onAfterLoad:root.setSupplierCompleted})\n root.Stepper.setEnabled('parameter');\n root.Stepper.addCompleted('parameter');\n root.Stepper.setCompleted('parameter');\n root.Stepper.setActive('parameter');\n };\n this.initViewSupplier = function () {\n debug('call initViewSupplier');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n $('.supplierItem').off('click');\n $('.supplierItem').on('click', function (event) {\n console.log(Order.getData());\n event.preventDefault();\n var supplierId = $(event.currentTarget).data('id');\n var supplierName = $(event.currentTarget).find('h5.card-title').text();\n if (typeof Order.supplierId == 'undefined') {\n //new order\n\n var ajaxData = {};\n ajaxData._token = Opts.token;\n ajaxData.supplierId = supplierId;\n ajaxData.storeType = 'supplierSelect';\n $.extend(ajaxData, Order);\n $.ajax({\n url: Opts.URL.store,\n method: 'POST',\n data: ajaxData,\n success: function success(data) {\n if (data.success) {\n root.afterOrderSetSupplierOk(data.data);\n }\n }\n });\n //Order.setData({supplierId:supplierId});\n } else {\n //ide kellene egy jo kis kerdes\n if (Order.supplierId != supplierId) {\n Toast.create({\n title: \"Supplier change to!\",\n message: supplierName,\n status: TOAST_STATUS.WARNING,\n timeout: 5000\n });\n root.Stepper.clearLoaded();\n Order = new DataModelOrder();\n //Order.setData({supplierId:supplierId});\n }\n }\n return;\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n\n //$('.supplierNamePlace').text(supplierName);\n // removed by dead control flow\n\n // removed by dead control flow\n\n //@todo:ide kell egy mentes!\n //@todo:mentes eredemenyekeppen lehet valtani\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n });\n };\n this.checkContactNameField = function () {\n var CSSSelectorForm = '.orderParameterForm';\n var node = $(CSSSelectorForm + ' input[name=contactName]');\n if (node.val().length < 2) {\n node.removeClass('is-valid');\n node.addClass('is-invalid');\n return false;\n } else {\n node.addClass('is-valid');\n node.removeClass('is-invalid');\n return true;\n }\n };\n this.sendOrderDataToServer = function (updateType, callback, errorCallback) {\n var ajaxData = {};\n var ajaxUrl = Opts.URL.store;\n var ajaxMethod = \"POST\";\n if (Order.id) {\n ajaxUrl = Opts.URL.update.replace('%id%', Order.id);\n //ajaxMethod=\"PUT\";\n //ajaxData=new FormData($(CSSSelectorForm)[0]);\n ajaxData._method = 'PUT';\n }\n ajaxData._token = Opts.token;\n ajaxData.updateType = updateType;\n $.extend(ajaxData, Order);\n debug(Order);\n debug(ajaxData);\n debug('ajaxUrl:' + ajaxUrl);\n ajaxData = jsonToFormData(ajaxData);\n $.ajax({\n url: ajaxUrl,\n data: ajaxData,\n type: ajaxMethod,\n contentType: false,\n processData: false,\n success: function success(data) {\n debug('ajax returned data');\n debug(data);\n if (data.success) {\n //root.afterOrderSetSupplierOk(data.data);\n callback(data);\n }\n },\n error: function error(xhr, ajaxOptions, thrownError) {\n ajaxErrorHandler(xhr, ajaxOptions, thrownError);\n if (typeof errorCallback != 'undefined') {\n errorCallback(xhr.responseJSON);\n }\n }\n });\n };\n this.afterOrderSetParameterOk = function (data) {\n debug('called afterOrderSetParameterOk');\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n 'id': Order.id\n }\n });\n //root.Stepper.setOpts({onAfterLoad:root.setParameterCompleted})\n root.Stepper.setEnabled('productSelect');\n root.Stepper.addCompleted('productSelect');\n root.Stepper.setCompleted('productSelect');\n root.Stepper.setActive('productSelect');\n };\n this.selectCurrentWeek = function () {\n console.error('selectCurrentWeek');\n console.error($('.ui-datepicker').find('.ui-datepicker-current-day a'));\n $('.ui-datepicker').find('.ui-datepicker-current-selected-weekday a').addClass('ui-state-active');\n };\n this.weekHover = function () {\n console.error('hover Active');\n $('.ui-datepicker-calendar tr').off('mousemove');\n $('.ui-datepicker-calendar tr').off('mouseleave');\n $('.ui-datepicker-calendar tr').on('mousemove', function () {\n $(this).find('td a').addClass('ui-state-hover');\n });\n $('.ui-datepicker-calendar tr').on('mouseleave', function () {\n $(this).find('td a').removeClass('ui-state-hover');\n });\n };\n this.weekHoverSlow = function () {\n console.error('weekHoverSlow');\n if ($('.ui-datepicker-calendar tr').length < 1) {\n setTimeout(root.weekHoverSlow, 1);\n return;\n }\n root.weekHover();\n };\n this.initDatePicker = function (type) {\n console.error('asdasdadad');\n console.log('tipus' + type);\n var CSSSelectorForm = '.orderParameterForm';\n var startDate = new Date('1900-01-01');\n var endDate = new Date('1900-01-02');\n $(CSSSelectorForm + ' .datePicker').datepicker(\"destroy\");\n if (type == 'weekly') {\n $(CSSSelectorForm + ' .datePicker').datepicker({\n showOtherMonths: true,\n selectOtherMonths: true,\n showWeek: true,\n dateFormat: 'yy-mm-dd',\n firstDay: 1,\n minDate: new Date(),\n afterShow: function afterShow(dateText, inst) {\n root.weekHover();\n root.selectCurrentWeek();\n },\n onSelect: function onSelect(dateText, inst) {\n var date = $(this).datepicker('getDate');\n startDate = new getMonday(date);\n endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay() + 7);\n root.setDeliveryDate($.datepicker.formatDate('yy-mm-dd', startDate), $.datepicker.formatDate('yy-mm-dd', endDate));\n },\n beforeShow: function beforeShow() {\n console.group('beforeShow');\n console.log(startDate);\n console.log(endDate);\n //root.weekHoverSlow();\n console.groupEnd();\n },\n beforeShowDay: function beforeShowDay(date) {\n console.group('beforeShowDay');\n console.log(date.toLocaleDateString('hu-Hu'));\n var cssClass = '';\n if (date >= startDate && date <= endDate) {\n console.error(date.toLocaleDateString('hu-Hu'));\n cssClass = 'ui-datepicker-current-selected-weekday';\n //cssClass = 'ui-state-active';\n }\n console.log(cssClass);\n console.groupEnd();\n return [true, cssClass];\n },\n onChangeMonthYear: function onChangeMonthYear(year, month, inst) {\n //root.selectCurrentWeek();\n }\n });\n } else {\n // Szállítási korlátozás adatok betöltése (csak ha hasDeliveryConstraint = true)\n var availableDates = [];\n var nextDeliveryDate = null;\n var hasDeliveryConstraint = false;\n var holidays = [];\n var workingDays = [];\n var datepickerInput = $(CSSSelectorForm + ' .datePicker');\n var calendarUrl = datepickerInput.data('delivery-calendar-url');\n var supplierId = datepickerInput.data('supplier-id');\n var profitCenterId = datepickerInput.data('profit-center-id');\n if (calendarUrl && supplierId && profitCenterId) {\n $.ajax({\n url: calendarUrl,\n data: {\n supplierId: supplierId,\n profitCenterId: profitCenterId,\n orderDateTime: new Date().toISOString()\n },\n async: false,\n success: function success(data) {\n hasDeliveryConstraint = data.hasDeliveryConstraint || false;\n // Ünnepnapok és áthelyezett munkanapok – mindig betöltjük\n holidays = (data.holidays || []).map(function (h) {\n return {\n date: h.date,\n description: h.description\n };\n });\n workingDays = (data.workingDays || []).map(function (w) {\n return {\n date: w.date,\n description: w.description\n };\n });\n if (hasDeliveryConstraint) {\n availableDates = data.availableDates || [];\n nextDeliveryDate = data.nextDeliveryDate || null;\n }\n // Ha nincs szállítási korlátozás, az availableDates és nextDeliveryDate\n // üres marad – a datepicker az eredeti módon viselkedik\n }\n });\n }\n if (hasDeliveryConstraint && nextDeliveryDate) {\n // Következő szállítási nap beállítása alapértelmezettként\n root.setDeliveryDate(nextDeliveryDate);\n $(CSSSelectorForm + ' .selectedDateText').text(nextDeliveryDate);\n $(CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(nextDeliveryDate);\n $('.deliveryDatePlace').text(nextDeliveryDate.replaceAll('-', '.') + '.');\n }\n\n // Szín jelmagyarázat megjelenítése csak szállítási korlátozás esetén\n if (hasDeliveryConstraint) {\n $('#deliveryDateLegend').show();\n }\n var datepickerOpts = {\n dateFormat: 'yy-mm-dd',\n minDate: hasDeliveryConstraint && nextDeliveryDate ? new Date(nextDeliveryDate) : new Date(),\n onSelect: function onSelect(dateText) {\n $(CSSSelectorForm + ' .selectedDateText').text(dateText);\n $('.deliveryDatePlace').text(dateText.replaceAll('-', '.') + '.');\n $(CSSSelectorForm + ' input[name=\"deliveryDate\"]').val(dateText);\n }\n };\n\n // beforeShowDay: mindig aktív ha van munkanaptár adat vagy hasDeliveryConstraint\n datepickerOpts.beforeShowDay = function (date) {\n var dateStr = $.datepicker.formatDate('yy-mm-dd', date);\n var holidayEntry = holidays.find(function (h) {\n return h.date === dateStr;\n });\n var workingDayEntry = workingDays.find(function (w) {\n return w.date === dateStr;\n });\n var isDelivery = hasDeliveryConstraint && availableDates.includes(dateStr);\n var cssClasses = [];\n var tooltip = '';\n var selectable = true;\n if (holidayEntry) {\n cssClasses.push('work-calendar-holiday');\n tooltip = 'Ünnepnap' + (holidayEntry.description ? ': ' + holidayEntry.description : '');\n } else if (workingDayEntry) {\n cssClasses.push('work-calendar-working-day');\n tooltip = 'Áthelyezett munkanap' + (workingDayEntry.description ? ': ' + workingDayEntry.description : '');\n }\n if (hasDeliveryConstraint) {\n if (isDelivery) {\n cssClasses.push('delivery-day-available');\n if (!tooltip) tooltip = 'Szállítási nap';\n } else {\n cssClasses.push('delivery-day-unavailable');\n if (!tooltip) tooltip = 'Nem szállítási nap';\n selectable = false;\n }\n }\n // Ha ünnepnap és hasDeliveryConstraint nincs bekapcsolva, az ünnepnap is letiltandó\n if (holidayEntry && !hasDeliveryConstraint) {\n selectable = false;\n }\n return [selectable, cssClasses.join(' '), tooltip];\n };\n $(CSSSelectorForm + ' .datePicker').datepicker(datepickerOpts);\n }\n };\n this.callChangeOrderType = function () {\n console.log(this);\n console.log(this.value);\n root.initDatePicker(this.value);\n //enum('daily', 'weekly')\n /*let CSSSelectorForm='.orderParameterForm';\n let node=$(CSSSelectorForm+' input[name=contactName]');\n if(node.val().length<2){\n node.removeClass('is-valid');\n node.addClass('is-invalid');\n return false;\n }else{\n node.addClass('is-valid');\n node.removeClass('is-invalid');\n return true;\n }\n */\n };\n this.initViewParameter = function () {\n debug('call initViewParameter');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n var CSSSelectorForm = '.orderParameterForm';\n $(CSSSelectorForm + ' .datePickerClick').click(function () {\n $(CSSSelectorForm + ' .datePicker').datepicker('show');\n });\n $(CSSSelectorForm + ' .orderParameterDeliveryAddress').select2({}).show();\n $(CSSSelectorForm + ' input[name=contactName]').off('blur');\n $(CSSSelectorForm + ' input[name=contactName]').off('keyup');\n $(CSSSelectorForm + ' input[name=contactName]').on('blur', root.checkContactNameField);\n $(CSSSelectorForm + ' input[name=contactName]').on('keyup', root.checkContactNameField);\n $(CSSSelectorForm + ' input[name=orderType]').off('change');\n $(CSSSelectorForm + ' input[name=orderType]').on('change', root.callChangeOrderType);\n $(CSSSelectorForm + ' .orderParameterNextButton').off('click');\n if (Order.getData()['id'] > 0) {\n if (Order.getData()['orderType'] == 'weekly') {\n root.initDatePicker(Order.getData()['orderType']);\n $(CSSSelectorForm + \" input[name=orderType][value=\" + Order.getData()['orderType'] + \"]\").prop('checked', true);\n var endDate = new Date(Order.getData()['deliveryDate']);\n endDate.setDate(endDate.getDate() + 6);\n root.setDeliveryDate(Order.getData()['deliveryDate'], $.datepicker.formatDate('yy-mm-dd', endDate));\n root.initDatePicker('weekly');\n } else {\n if (Order.getData()['deliveryDate']) {\n root.setDeliveryDate(Order.getData()['deliveryDate']);\n }\n root.initDatePicker('daily');\n }\n if (Order.getData()['contactName']) {\n $(CSSSelectorForm + ' input[name=contactName]').val(Order.getData()['contactName']);\n }\n if (Order.getData()['note']) {\n $(CSSSelectorForm + ' textarea[name=note]').val(Order.getData()['note']);\n }\n if (Order.getData()['deliveryAddressId']) {\n console.log($(CSSSelectorForm + ' select[name=deliveryAddressId]'));\n $(CSSSelectorForm + ' select[name=deliveryAddressId]').val(Order.getData()['deliveryAddressId']);\n }\n if (Order.getData()['customNotificationEmail']) {\n console.log($(CSSSelectorForm + ' select[name=customNotificationEmail]'));\n $(CSSSelectorForm + ' select[name=customNotificationEmail]').val(Order.getData()['customNotificationEmail']);\n }\n } else {\n root.initDatePicker('daily');\n }\n $(CSSSelectorForm + ' .orderParameterDeliveryAddress').select2({}).show();\n $(CSSSelectorForm + ' .orderParameterCustomNotificationEmail').select2({}).show();\n $(CSSSelectorForm).submit(function (event) {\n event.preventDefault();\n if ($(CSSSelectorForm)[0].checkValidity() === false) {\n debug('validaton false');\n event.stopPropagation();\n return;\n } else {\n debug('validaton ok');\n //do your ajax submition here\n }\n $('.deliveryDatePlace').text($(CSSSelectorForm + ' input[name=deliveryDate]').val().replaceAll('-', '.') + '.');\n Order.setData({\n contactName: $(CSSSelectorForm + ' input[name=contactName]').val(),\n note: $(CSSSelectorForm + ' textarea[name=note]').val(),\n orderType: $(CSSSelectorForm + ' input:checked[name=orderType]').val(),\n deliveryDate: $(CSSSelectorForm + ' input[name=deliveryDate]').val(),\n deliveryAddressId: $(CSSSelectorForm + ' select[name=deliveryAddressId]').val(),\n deliveryAddress: $(CSSSelectorForm + ' select[name=deliveryAddress]').val(),\n customNotificationEmail: $(CSSSelectorForm + ' select[name=customNotificationEmail]').val()\n });\n console.group('parameter form submit');\n console.error($(CSSSelectorForm + ' input:checked[name=orderType]').val());\n console.error($(CSSSelectorForm + ' input[name=deliveryDate]').val());\n debug(Order.getData());\n console.groupEnd();\n root.sendOrderDataToServer('parameter', root.afterOrderSetParameterOk);\n });\n };\n this.blank = function () {};\n this.setParameterCompleted = function () {\n console.log('setParameterCompleted called');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n //root.initViewProductSelect()\n };\n this.bindRowFavoritesAction = function () {\n $('.buttonItemFavorites').off('click');\n $('.buttonItemFavorites').on('click', function () {\n var productId = $(this).data('id');\n console.log(productId);\n var ajaxUrl = Opts.URL.toggleFavorites.replace('%id%', productId);\n var ajaxData = {};\n ajaxData._token = Opts.token;\n var button = this;\n console.log(ajaxUrl);\n $.ajax({\n url: ajaxUrl,\n method: 'POST',\n data: ajaxData,\n success: function success(response) {\n if (response.success) {\n if (response.status) {\n console.log('true');\n $(button).addClass('btn-warning');\n $(button).removeClass('btn-light');\n } else {\n $(button).removeClass('btn-warning');\n $(button).addClass('btn-light');\n console.log('false');\n }\n }\n }\n });\n /*\n $(this).toggleClass('btn-warning');\n $(this).toggleClass('btn-light');\n */\n });\n };\n this.bindRowDescriptionAction = function () {\n $('textarea.orderItemComment').on('change', function () {\n var comment = $(this).val();\n var productId = $(this).data('id');\n var productComment = Order.getData('productComment');\n if (productComment !== null) {\n if (typeof productComment[productId] == 'undefined' && comment.length === 0) {\n return;\n }\n if (productComment[productId] === comment) {\n return;\n }\n }\n productComment[productId] = comment;\n if (comment.length === 0) {\n delete Order.productComment[productId];\n }\n Order.productComment = productComment;\n queueAjax.push(Date.now());\n root.syncOrderDataToServer();\n });\n };\n this.productSelectDatatablesRowFormatter = function (d) {\n // `d` is the original data object for the row\n /**\n @todo: felszedni es updatelni az adott termek memojat az orderban\n */\n console.group('productSelectDatatablesRowFormatter');\n console.log(d);\n var templateData = d;\n templateData.comment = '';\n // debug(Order);\n if (Order.productComment && Order.productComment !== null) {\n debug(_typeof(Order.productComment[d.id]));\n if (typeof Order.productComment[d.id] != 'undefined' && Order.productComment[d.id].length > 0) {\n templateData.comment = Order.productComment[d.id];\n }\n }\n /** @typedef {boolean} d.favorites */\n if (d.favorites === true) {\n templateData.btnFavoritesClass = 'btn-warning';\n } else {\n templateData.btnFavoritesClass = 'btn-light';\n }\n var template = $('template[data-name=\"orderProductSelectDetails\"]').html();\n templateData.weekly = false;\n if (Order.getData().orderType === 'weekly') {\n templateData.weekly = true;\n /*\n \n templateData.weeklyDay=[\n {\"index\":1,\"name\":\"Hétfő\"},\n {\"index\":2,\"name\":\"Kedd\"},\n {\"index\":3,\"name\":\"Szerda\"},\n {\"index\":4,\"name\":\"Csütörtök\"},\n {\"index\":5,\"name\":\"Péntek\"},\n {\"index\":6,\"name\":\"Szombat\"},\n {\"index\":7,\"name\":\"Vasárnap\"},\n ];\n \n templateData.weeklyDay=[\n {\"index\":2,\"name\":\"Hétfő\" },\n {\"name\":\"Kedd\"},\n {\"name\":\"Szerda\"},\n {\"name\":\"Csütörtök\"},\n {\"name\":\"Péntek\"},\n {\"name\":\"Szombat\"},\n {\"name\":\"Vasárnap\"}\n ];\n */\n }\n var productSelected = Order.getData('productSelected');\n if (typeof productSelected[d.id] != 'undefined') {\n templateData.itemQuantity = productSelected[d.id];\n }\n console.log(['templateData', templateData]);\n var oldTags = Mustache.tags;\n Mustache.tags = [\"~!\", \"!~\"];\n if (templateData['specification'] == 'false' || templateData['specification'] == false) {\n templateData.specificationClass = 'd-none';\n }\n templateData.pictureImg = '';\n if (templateData['picture'] == 'false' || templateData['picture'] == false) {\n templateData.pictureClass = 'd-none';\n } else {\n templateData.pictureImg = '';\n }\n console.log('templateData', templateData);\n //templateData['aa_specification']=false;\n var render = Mustache.render(template, templateData);\n Mustache.tags = oldTags;\n console.groupEnd();\n return render;\n /*\n solution before template\n return ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n /!*\n ''+\n ''+\n ''+\n ''+\n *!/\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n /!*\n *!/\n '
Info:'+d.note+'
hooreyca :'+d.hooreycaId+'' +\n \n '' +\n '
Extension number:'+d.extn+'
Info:'+d.note+'
Megjegyzés:
';\n */\n };\n this.setDatatableHeaderText = function (text) {\n $('.tableHeaderText').text(text);\n };\n this.getTreePathName = function (node) {\n var res = '';\n var items = $(node).parents('li').toArray();\n items.shift();\n items.reverse();\n for (var item in items) {\n console.log($(items[item]).children('a.categoryItem'));\n if ($(items[item]).children('a.categoryItem').length > 0) {\n res += $(items[item]).children('a.categoryItem').text() + '/';\n }\n }\n res += $(node).text();\n console.log(res);\n return res;\n };\n var selectedProductGroup = null;\n var dataTableSearchStr = null;\n var dataTableSearchKrel = false;\n this.searchProductByString = function (filterStr) {\n root.setDatatableHeaderText('Termékek szűrve:' + filterStr);\n dataTableSearchStr = filterStr;\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickSearchProduct = function () {\n debug(this);\n var filterStr = $('.sidebar-search input[name=searchValue]').val();\n debug(filterStr);\n root.searchProductByString(filterStr);\n };\n this.clickFavoritesProduct = function () {\n debug('clickFavoritesProduct');\n root.setDatatableHeaderText('Termékek szűrve: kedvencek');\n dataTableSearchStr = '**favorites**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickOftenProduct = function () {\n debug('clickOftenProduct');\n root.setDatatableHeaderText('Termékek szűrve: gyakran vásárolt');\n dataTableSearchStr = '**often**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickSpecialOffer = function () {\n debug('clickSpecialOffer');\n root.setDatatableHeaderText('Termékek szűrve: Akciós termékek');\n dataTableSearchStr = '**specialOffer**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickLastProduct = function () {\n debug('clickLastProduct');\n root.setDatatableHeaderText('Termékek szűrve: utoljára vásárolt');\n dataTableSearchStr = '**last**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickWeeklyProduct = function () {\n debug('clickWeeklyProduct');\n root.setDatatableHeaderText('Termékek szűrve: Heti termékek');\n dataTableSearchStr = '**weekly**';\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.clickKrelProduct = function () {\n debug('clickKrelProduct');\n //root.setDatatableHeaderText('Termékek szűrve: Heti termékek');\n //dataTableSearchStr='**weekly**';\n //$('.dataTableOrderProductSelect').DataTable().ajax.reload();\n $(this).parent().toggleClass('krelActive');\n dataTableSearchKrel = !dataTableSearchKrel;\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n };\n this.productSelectDataTableColumnDefs = function () {\n return [{\n \"width\": \"10px\",\n \"targets\": 0\n }, {\n \"className\": \"dt-left\",\n \"targets\": 1\n },\n // { \"width\": \"120px\", \"targets\": 1 },\n {\n \"width\": \"28px\",\n \"targets\": 2\n }, {\n \"width\": \"41px\",\n \"targets\": 3\n }, {\n \"width\": \"76px\",\n \"targets\": 4\n }, {\n \"width\": \"55px\",\n \"targets\": 5\n }, {\n \"width\": \"70px\",\n \"targets\": 6\n }, {\n \"width\": \"54px\",\n \"targets\": 7\n }, {\n \"width\": \"57px\",\n \"targets\": 8\n }, {\n \"width\": \"42px\",\n \"targets\": 9\n }, {\n \"width\": \"100px\",\n \"targets\": 10\n }, {\n \"className\": \"dt-center\",\n \"targets\": \"_all\"\n }];\n };\n this.productSelectDataTableColumn = function () {\n var columnData = [{\n \"className\": 'details-control',\n \"orderable\": false,\n \"data\": null,\n \"defaultContent\": ''\n }, {\n \"data\": \"name\"\n }, {\n \"data\": \"krel\"\n }, {\n \"data\": \"packing\"\n }, {\n \"data\": \"unitValue\"\n }, {\n \"data\": \"productUnit\"\n }, {\n \"data\": \"sellerUnit\"\n }, {\n \"data\": \"unitMultiplier\"\n }, {\n \"data\": \"amountUnit\"\n }, {\n \"data\": \"price\"\n }];\n var actionColumn = {\n \"className\": 'details-control2',\n \"orderable\": false,\n \"data\": null,\n \"width\": \"100px\",\n \"defaultContent\": ''\n };\n if (Order.getData('orderType') == 'daily') {\n actionColumn.render = function (data, type, row) {\n if (row.stock_status === 'out_of_stock') {\n return '';\n }\n return '';\n };\n }\n columnData.push(actionColumn);\n return columnData;\n };\n this.getDatatables = function (orderType) {\n console.error(orderType);\n var table = $('.dataTableOrderProductSelect').DataTable({\n language: {\n url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/Hungarian.json'\n },\n //\"ajax\": \"{{asset('exapmle2.json')}}\",\n \"ajax\": {\n url: Opts.URL.getDataTableContentProductList,\n data: function data(_data) {\n _data.searchStr = dataTableSearchStr;\n _data.krel = dataTableSearchKrel;\n _data.groupId = selectedProductGroup;\n _data.supplierId = Order.supplierId;\n _data.deliveryDate = Order.deliveryDate;\n }\n },\n buttons: {\n buttons: []\n },\n \"columnDefs\": root.productSelectDataTableColumnDefs(),\n \"columns\": root.productSelectDataTableColumn(),\n \"order\": [[1, 'asc']]\n });\n return table;\n };\n this.productSelectDataTableDrawDT = function (e) {\n //debug( 'Table draw complete: '+new Date().getTime() );\n\n //$('td:contains(\"*\")').html('');\n $(\"td\").filter(function () {\n return $(this).text() === '*';\n }).html('');\n if (Order.getData().orderType == 'daily') {\n $(\"input[type='number'].inputNumberSpinner\").inputSpinner({\n template: '
' + '' +\n //'' +\n '' + '' + '
',\n buttonsWidth: \"0.5rem\",\n groupClass: \"\",\n // css class of the resulting input-group\n buttonsClass: \"btn-outline-secondary\"\n });\n }\n root.bindWeakUserHelper();\n /*\n ----------------------------------------------------------\n change order quantity\n */\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").off('change');\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").on('change', function (e) {\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n var rowData = $('.dataTableOrderProductSelect').DataTable().row($(this).closest('tr')).data();\n root.orderItemsChange(rowData, quantity);\n });\n $(\".dataTableOrderProductSelect .details-control2 input[type=text]\").each(function () {\n //debug('ez a function2')\n var quantity = $(this).val();\n var rowData = $('.dataTableOrderProductSelect').DataTable().row($(this).closest('tr')).data();\n if (Order.productSelected[rowData.id]) {\n debug(rowData);\n debug($($(this).closest('tr').find('input[type=number]')[0]));\n debug(Order.productSelected[rowData.id]);\n var quantityCurrent = Order.productSelected[rowData.id];\n if (typeof quantityCurrent != 'string') {\n quantityCurrent += '';\n }\n $($(this).closest('tr').find('input[type=number]')[0]).val(quantityCurrent.replace(',', '.'));\n }\n });\n $(\".dataTableOrderProductSelect .details-control2 button\").off('click');\n $(\".dataTableOrderProductSelect .details-control2 button\").on('click', function () {\n // debug('.details-control2 button click ')\n // debug(this);\n $(this).parent().find('input[type=text]').trigger('change');\n });\n };\n this.initViewProductSelect = function () {\n var functionName = 'initViewProductSelect';\n console.log(functionName + ' called');\n if (viewInicialized.includes(functionName)) {\n return;\n }\n //debug(Object.getOwnPropertyNames(root));\n root.setDatatableHeaderText('');\n root.Stepper.setOpts({\n onAfterActivate: function onAfterActivate() {}\n });\n //@note: be kell kapcsolni az elonezetet\n root.Stepper.addCompleted('invoice');\n root.Stepper.addEnabled('invoice');\n var CSSSelectorForm = '.orderParameterForm';\n //console.log(Opts.URL.getDataTableContentProductList);change\n debug(CSSSelectorForm + ' .fa-search');\n $('.sidebar-search .fa-search').off('click');\n $('.sidebar-search .fa-search').on('click', root.clickSearchProduct);\n $('a.sidebar.favorites').off('click');\n $('a.sidebar.favorites').on('click', root.clickFavoritesProduct);\n $('a.sidebar.often').off('click');\n $('a.sidebar.often').on('click', root.clickOftenProduct);\n $('a.sidebar.last').off('click');\n $('a.sidebar.last').on('click', root.clickLastProduct);\n $('a.sidebar.weekly').off('click');\n $('a.sidebar.weekly').on('click', root.clickWeeklyProduct);\n $('a.sidebar.krel').off('click');\n $('a.sidebar.krel').on('click', root.clickKrelProduct);\n $('a.sidebar.specialOffer').off('click');\n $('a.sidebar.specialOffer').on('click', root.clickSpecialOffer);\n $('.sidebar-search input[name=searchValue]').off('keypress');\n $('.sidebar-search input[name=searchValue]').on('keypress', function (event) {\n if (event.which == 13) {\n event.preventDefault();\n }\n if ($(this).val().length >= 2) {\n root.searchProductByString($(this).val() + event.key);\n }\n });\n $('.sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu li a.categoryItem.clickable').off('click');\n $('.sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu li a.categoryItem.clickable').on('click', function () {\n var groupId = $(this).data('id');\n selectedProductGroup = groupId;\n dataTableSearchStr = null;\n console.log(groupId);\n console.log(root.getTreePathName(this));\n root.setDatatableHeaderText(root.getTreePathName(this));\n /*\n let ajaxData={\n 'groupId':groupId,\n 'supplier_id':Order.supplierId,\n };\n //$('.dataTableOrderProductSelect').DataTable().ajax.data(ajaxData).load();\n \n */\n /*\n let ajaxUrl=Opts.URL.getDataTableContentProductList+'?groupId='+groupId+'&supplier_id='+Order.supplierId;\n $('.dataTableOrderProductSelect').DataTable().ajax.url(ajaxUrl).load();\n */\n $('.dataTableOrderProductSelect').DataTable().ajax.reload();\n });\n var table = root.getDatatables(Order.getData('orderType'));\n $('.dataTableOrderProductSelect').on('init.dt', function () {\n console.log('Table initialisation complete: ' + new Date().getTime());\n }).dataTable();\n $('.dataTableOrderProductSelect').on('draw.dt', root.productSelectDataTableDrawDT).dataTable();\n\n //$('.dataTableOrderProductSelect').on( 'draw.dt', ).dataTable();\n\n $('.dataTableOrderProductSelect').on('xhr.dt', function () {\n debug('Table xhr complete: ' + new Date().getTime());\n }).dataTable();\n\n //$(\"input[type='number'].inputNumberSpinner\").inputSpinner();\n\n /*\n ----------------------------------------------------------\n Add event listener for opening and closing details\n */\n\n $('.dataTableOrderProductSelect tbody').on('click', 'td.details-control', function () {\n var tr = $(this).closest('tr');\n var row = table.row(tr);\n if (row.child.isShown()) {\n // This row is already open - close it\n row.child.hide();\n tr.removeClass('shown');\n } else {\n // Open this row\n row.child(root.productSelectDatatablesRowFormatter(row.data())).show();\n tr.addClass('shown');\n root.bindProductDetailsAction();\n }\n });\n viewInicialized.push(functionName);\n };\n this.bindProductDetailsAction = function () {\n root.bindRowDescriptionAction();\n root.bindRowFavoritesAction();\n if (Order.getData()['orderType'] == 'weekly') {\n root.bindOrderItemWeekQuantity();\n }\n };\n this.bindWeakUserHelper = function () {\n $(\"input.inputNumberSpinner\").off(\"focus\");\n $(\"input.inputNumberSpinner\").on(\"focus\", function () {\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n if (quantity === 0) {\n $(this).val('');\n }\n });\n $(\"input[type=text].inputNumberSpinner\").off(\"keypress\");\n $(\"input[type=text].inputNumberSpinner\").on(\"keypress\", function (event) {\n if (event.which == 13) {\n // console.error('enter pressed');\n var actualItem = this;\n var items = $(\"input[type=text].inputNumberSpinner\");\n items.each(function (item) {\n // console.log(this);\n if (this == actualItem) {\n // console.error(item);\n if (item + 1 <= items.length) {\n // console.error(items[item+1]);\n $(items[item + 1]).focus();\n }\n return false;\n }\n });\n }\n });\n };\n this.bindOrderItemWeekQuantity = function () {\n $(\"input.productSelectDayQuantity\").off('change');\n $(\"input.productSelectDayQuantity\").on('change', function () {\n console.log(this.name);\n console.log(this.value);\n console.log($(this).data('dayindex'));\n var rowData = null;\n var rowNode = $($(this).closest('table.orderProductSelectRowDetailsTable').closest('tr')).prev();\n rowData = $('.dataTableOrderProductSelect').DataTable().row(rowNode).data();\n console.log(rowData);\n var quantity = $(this).val();\n quantity = quantity.replace(',', '.');\n quantity = parseFloat(quantity);\n console.log(rowData.id);\n root.orderItemsChange(rowData, quantity, $(this).data('dayindex'));\n // root.orderItemsChange\n //orderItemsChange\n //quantity[1683][1]\n });\n };\n this.afterSyncOrderDataToServer = function (data) {\n //root.toggleEnableSend();\n //console.log('most vegzett. ennyit kiszed'+batchNum);\n for (var i = 0; i < queueAjax.length; i++) {\n console.log('shiftel');\n queueAjax.shift();\n }\n //console.log('remaining left '+queueAjax.length);\n setTimeout(function () {\n syncDoing = false;\n root.syncOrderDataToServer();\n }, Opts.dataSyncPauseTime);\n };\n var queueAjax = [];\n var syncDoing = false;\n this.syncOrderDataToServer = function () {\n //debug(queueAjax);\n if (syncDoing) {\n //debug('sync in progress....');\n return false;\n }\n if (queueAjax.length < 1) {\n return;\n }\n syncDoing = true;\n root.sendOrderDataToServer('productSelect', root.afterSyncOrderDataToServer);\n return;\n };\n this.orderItemsChange = function (ItemData, quantity, dayIndex) {\n /*\n debug('-----------------');\n debug(ItemData);\n debug(quantity);\n debug(Order.getData('productSelected'));\n debug('-----------------');\n \n */\n if (isNaN(quantity)) {\n quantity = 0;\n }\n var productSelected = Order.getData('productSelected');\n console.group('orderItemsChange');\n console.log(['productSelected', productSelected]);\n console.log(['ItemData', ItemData]);\n console.log(['ItemData.id', ItemData.id]);\n console.log(['quantity', quantity]);\n console.log(['dayIndex', dayIndex]);\n console.log(productSelected[ItemData.id]);\n var productSelectedItem = productSelected[ItemData.id];\n /*\n ha 0 ertek jon es nem is volt akkor hamar kiugratjuk\n */\n if (quantity == 0) {\n console.error('quantity==0');\n if (typeof productSelectedItem == 'undefined') {\n console.error('itt lep1');\n console.groupEnd();\n return;\n }\n if (dayIndex) {\n console.log('van dayIndex');\n if (typeof productSelected[ItemData.id][dayIndex] == 'undefined') {\n console.log(['productSelectedItem', productSelectedItem]);\n console.error('itt lep2');\n console.groupEnd();\n return;\n }\n }\n }\n /*\n ha azonos az ertek kiugrunk\n */\n if (dayIndex) {\n if (typeof productSelected[ItemData.id] != 'undefined' && typeof productSelected[ItemData.id][dayIndex] != 'undefined') {\n if (productSelected[ItemData.id][dayIndex] == quantity) {\n console.error('azonos napi');\n console.groupEnd();\n return;\n }\n }\n } else {\n if (productSelected[ItemData.id] == quantity) {\n console.error('azonos');\n console.groupEnd();\n return;\n }\n }\n if (quantity == 0) {\n if (dayIndex) {\n delete Order.productSelected[ItemData.id][dayIndex];\n delete productSelected[ItemData.id][dayIndex];\n } else {\n delete Order.productSelected[ItemData.id];\n delete productSelected[ItemData.id];\n }\n } else {\n /*\n ha van ertek erteket adunk!\n */\n if (dayIndex) {\n if (typeof productSelected[ItemData.id] == 'undefined') {\n productSelected[ItemData.id] = [];\n }\n console.log('set quantity productSelected[ItemData.id][dayIndex]', quantity);\n productSelected[ItemData.id][dayIndex] = quantity;\n } else {\n productSelected[ItemData.id] = quantity;\n console.log('set quantity productSelected[ItemData.id]', quantity);\n }\n }\n console.log(['productSelected', productSelected]);\n Order.productSelected = productSelected;\n console.groupEnd();\n queueAjax.push(Date.now());\n root.syncOrderDataToServer();\n return;\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n\n /*\n debug(Order.getData('productSelected'));\n debug('*******************');\n */\n };\n this.initViewInvoice = function () {\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n if (Object.keys(Order.productSelected).length > 0) {\n root.Stepper.addCompleted('send');\n root.Stepper.addEnabled('send');\n }\n var styleStr = '';\n $('table.invoice button.printButton').off('click');\n $('table.invoice button.printButton').on('click', function () {\n window.print();\n return;\n // removed by dead control flow\n var newWin; \n // removed by dead control flow\n\n // removed by dead control flow\n var print; \n // removed by dead control flow\n\n // newWin.document.write($('table.invoice').prop('outerHTML'));\n // removed by dead control flow\n\n // removed by dead control flow\n\n // removed by dead control flow\n\n });\n };\n this.resetOrder = function () {\n root.init();\n root.setDeliveryDate('-');\n root.setSupplier('-');\n };\n this.afterOrderSendOk = function (data) {\n Toast.create({\n title: \"Sent!\",\n message: 'Order Sent',\n status: TOAST_STATUS.INFO,\n timeout: 5000\n });\n $('.buttonOrderSend').off('click');\n $('.buttonOrderSend').prop('disabled', true);\n $('.statusNamePlace').removeClass('statusBlink');\n $('.statusNamePlace').text('elküldve');\n $('.buttonOrderSending').toggleClass('d-none');\n $('.buttonOrderSendOk').toggleClass('d-none');\n $('div.invoiceContainer').html(data.retHTML);\n //root.resetOrder();\n };\n this.afterOrderSendError = function (data) {\n $('.buttonOrderSend').toggleClass('d-none');\n $('.buttonOrderSending').toggleClass('d-none');\n $.each(APP.OrderModule.Stepper.getOpts().available, function (index, value) {\n APP.OrderModule.Stepper.setEnabled(value);\n APP.OrderModule.Stepper.setCompleted(value);\n });\n };\n this.initViewSend = function () {\n console.log('initViewSend called 2');\n root.Stepper.setOpts({\n onAfterLoad: function onAfterLoad() {}\n });\n $('.buttonOrderSend').off('click');\n $('.buttonOrderSend').on('click', function () {\n console.log('Send buton clicked');\n //@todo: datasynchere and callback\n $('.buttonOrderSend').toggleClass('d-none');\n $('.buttonOrderSending').toggleClass('d-none');\n /**\n * PM158\n */\n $.each(APP.OrderModule.Stepper.getOpts().available, function (index, value) {\n root.Stepper.unsetEnabled(value);\n root.Stepper.unsetCompleted(value);\n });\n /**\n */\n root.sendOrderDataToServer('send', root.afterOrderSendOk, root.afterOrderSendError);\n\n /* let ajaxData={};\n ajaxData._token=Opts.token;\n ajaxData.send=true;\n $.extend(ajaxData,Order);\n $.ajax({\n url: Opts.URL.store,\n method:'POST',\n data:ajaxData,\n success:function (data) {\n if(data.success){\n root.afterOrderSendOk(data);\n }\n }\n });*/\n });\n };\n this.testModeSend = function () {};\n this.testMode = function () {\n console.log('testMode called ');\n Order.setData({\n id: 234,\n supplierId: 7,\n productSelected: {\n 116: 3,\n 293: 2\n },\n contactName: 'Contact Name',\n note: 'Note',\n type: 'daily',\n deliveryDate: Opts.defaultDeliveryDate,\n deliveryAddress: 12\n });\n console.log(Order.getData());\n console.log('*******************');\n //root.Stepper.setOpts({'UrlData':{'supplierId':supplierId}});\n root.Stepper.setOpts({\n 'UrlData': {\n 'supplierId': Order.supplierId,\n id: Order.id\n }\n });\n this.Stepper.init({\n URL: {\n create: Opts.URL.create\n },\n /*\n csupasz az elejerol\n complete:['supplier'],\n enable: ['supplier'],\n active: 'supplier',\n onAfterActivate:this.initViewSupplier,\n \n product select\n complete:['supplier','parameter','productSelect'],\n enable: ['supplier','parameter','productSelect'],\n active: 'productSelect',\n onAfterActivate:this.initViewProductSelect,\n \n fullos\n complete:['supplier','parameter','productSelect','invoice'],\n enable: ['supplier','parameter','productSelect','invoice','send'],\n active: 'productSelect',\n onAfterActivate:this.initViewProductSelect,\n \n send\n complete:['supplier','parameter','productSelect','invoice','send'],\n enable: ['supplier','parameter','productSelect','invoice','send'],\n active: 'send',\n onAfterActivate:this.initViewProductSelect,\n \n */\n complete: ['supplier', 'parameter', 'productSelect'],\n enable: ['supplier', 'parameter', 'productSelect'],\n active: 'productSelect',\n onAfterActivate: this.initViewProductSelect,\n autoCallback: {\n invoice: {\n onAfterActivate: root.initViewInvoice\n },\n send: {\n onAfterActivate: root.initViewSend\n }\n }\n });\n console.log('*******************');\n };\n this.toggleEnableSend = function () {\n console.log('toggleEnableSend called');\n var ajaxUrl = Opts.URL.checkReadyToSend.replace('%id%', Order.id);\n $.ajax({\n url: ajaxUrl,\n success: function success(data) {\n if (data.success) {\n if (data.readyToSend) {\n root.Stepper.addCompleted('send');\n /*\n root.Stepper.addCompleted('invoice');\n root.Stepper.addEnabled('invoice');\n */\n root.Stepper.addEnabled('send');\n } else {\n root.Stepper.unsetCompleted('send');\n /*\n root.Stepper.unsetCompleted('invoice');\n root.Stepper.unsetEnabled('invoice');\n */\n root.Stepper.unsetEnabled('send');\n }\n }\n console.log(data);\n }\n });\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxNQUFNLENBQUM7VUFDbkMsQ0FBQyxNQUFJO1lBQ0Q3QixJQUFJLENBQUNoQixPQUFPLENBQUNxQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzNEO0FBQ0E7QUFDQTtBQUNBO1lBQ3dCckIsSUFBSSxDQUFDaEIsT0FBTyxDQUFDd0MsWUFBWSxDQUFDLE1BQU0sQ0FBQztVQUNyQztRQUNKO1FBQ0EvQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ1IsSUFBSSxDQUFDO01BQ3JCO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQztBQUVMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbW9kdWxlSnMvb3JkZXIuanM/NTYxZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ3aW5kb3cuT3JkZXJNb2R1bERlZmF1bHQ9e1xuICAgIGFjdGlvbkZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7fSxcbn1cbmNsYXNzIERhdGFNb2RlbE9yZGVyIGV4dGVuZHMgRGF0YU1vZGVse1xuXG4gICAgLypcbiAgICAgKiBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChkYXRhLG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoZGF0YSxvcHRpb25zKVxuICAgICAgICBpZih0eXBlb2YgdGhpcy5wcm9kdWN0U2VsZWN0ZWQgPT09XCJ1bmRlZmluZWRcIil7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RTZWxlY3RlZD17fTtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YgdGhpcy5wcm9kdWN0Q29tbWVudCA9PT1cInVuZGVmaW5lZFwiKXtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdENvbW1lbnQ9e307XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2codGhpcy5jb25zdHJ1Y3Rvci5uYW1lKycgY29uc3RydWN0b3IgY2FsbGVkJyk7XG4gICAgfTtcbn07XG53aW5kb3cuRGF0YU1vZGVsT3JkZXI9RGF0YU1vZGVsT3JkZXI7XG5cbndpbmRvdy5TdGVwcGVyPWZ1bmN0aW9uICgpIHtcblxuICAgIC8qXG4gICAgICogVmFyaWFibGVzIGFjY2Vzc2libGVcbiAgICAgKiBpbiB0aGUgY2xhc3NcbiAgICAgKi9cbiAgICBsZXQgT3B0cyA9IHtcbiAgICAgICAgY29tcGxldGU6IFsnc3VwcGxpZXInXSxcbiAgICAgICAgYXZhaWxhYmxlOiBbJ3N1cHBsaWVyJywgJ3BhcmFtZXRlcicsICdwcm9kdWN0U2VsZWN0JywgJ2ludm9pY2UnLCAnc2VuZCddLFxuICAgICAgICBlbmFibGU6IFsnc3VwcGxpZXInLCAnaW52b2ljZSddLFxuICAgICAgICBsb2FkOiBbXSxcbiAgICAgICAgZXhjbHVkZUxvYWRlZDpbJ2ludm9pY2UnLCdzZW5kJ10sXG4gICAgICAgIGxvYWRlZDogW10sXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIFVSTDoge1xuICAgICAgICAgICAgY3JlYXRlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgVXJsRGF0YTpmYWxzZSxcbiAgICAgICAgb25BZnRlckxvYWQ6ZnVuY3Rpb24gKCkge30sXG4gICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTpmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgYXV0b0NhbGxiYWNrOntcbiAgICAgICAgICAgICdpbnZvaWNlJzp7XG4gICAgICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOmZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzZW5kJzp7XG4gICAgICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOmZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbm93TG9hZGVkOmZhbHNlLFxuXG4gICAgfTtcblxuICAgIGxldCByb290PXRoaXM7XG4gICAgLypcbiAgICAgKiBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIHRoaXMuY29uc3RydWN0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0T3B0cz1mdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gT3B0cztcbiAgICB9XG4gICAgdGhpcy5zZXRPcHRzPWZ1bmN0aW9uKG9wdGlvbnMpe1xuICAgICAgICAkLmV4dGVuZChPcHRzLCBvcHRpb25zKTtcbiAgICB9XG5cblxuXG4gICAgdGhpcy5pbml0PWZ1bmN0aW9uIChvcHRpb25zKXtcbiAgICAgICAgJC5leHRlbmQoT3B0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgZGVidWcoT3B0cyk7XG4gICAgICAgICQoJy5zdGVwJykuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgbGV0IHN0ZXBOYW1lPSQodGhpcykuZGF0YSgnc3RlcG5hbWUnKTtcbiAgICAgICAgICAgIGlmKE9wdHMuY29tcGxldGUuaW5jbHVkZXMoc3RlcE5hbWUpKXtcbiAgICAgICAgICAgICAgICByb290LnNldENvbXBsZXRlZChzdGVwTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihPcHRzLmVuYWJsZS5pbmNsdWRlcyhzdGVwTmFtZSkpe1xuICAgICAgICAgICAgICAgIHJvb3Quc2V0RW5hYmxlZChzdGVwTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihPcHRzLmxvYWQuaW5jbHVkZXMoc3RlcE5hbWUpKXtcbiAgICAgICAgICAgICAgICByb290LmxvYWRTdGVwQ29udGVudChzdGVwTmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKE9wdHMuYWN0aXZlPT09c3RlcE5hbWUpe1xuICAgICAgICAgICAgICAgIHJvb3Quc2V0QWN0aXZlKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QuYmluZENsaWNrQWN0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kQ2xpY2tBY3Rpb249ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBzdGVwQ2xpY2tCdXR0b25zPSQoJy5zdGVwQ2xpY2snKTtcbiAgICAgICAgc3RlcENsaWNrQnV0dG9ucy5vZmYoJ2NsaWNrJyk7XG4gICAgICAgIHN0ZXBDbGlja0J1dHRvbnMub24oJ2NsaWNrJyxyb290LnN0ZXBDbGljayk7XG5cbiAgICB9XG5cbiAgICB0aGlzLnNldENvbXBsZXRlZD1mdW5jdGlvbiAoc3RlcE5hbWUpe1xuICAgICAgICBjb25zb2xlLmxvZyhzdGVwTmFtZSsnIGNvbXBsZXRlZCcpO1xuICAgICAgICAkKCcuc3RlcFtkYXRhLXN0ZXBOYW1lPVwiJytzdGVwTmFtZSsnXCJdJykuYWRkQ2xhc3MoJ2NvbXBsZXRlZCcpO1xuICAgIH1cblxuICAgIHRoaXMudW5zZXRDb21wbGV0ZWQ9ZnVuY3Rpb24gKHN0ZXBOYW1lKXtcbiAgICAgICAgY29uc29sZS5sb2coc3RlcE5hbWUrJyBVbmNvbXBsZXRlZCcpO1xuICAgICAgICAkKCcuc3RlcFtkYXRhLXN0ZXBOYW1lPVwiJytzdGVwTmFtZSsnXCJdJykucmVtb3ZlQ2xhc3MoJ2NvbXBsZXRlZCcpO1xuICAgICAgICBPcHRzLmNvbXBsZXRlPWFycmF5UmVtb3ZlKE9wdHMuY29tcGxldGUsc3RlcE5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMudW5zZXRFbmFibGVkPWZ1bmN0aW9uIChzdGVwTmFtZSl7XG4gICAgICAgIGNvbnNvbGUubG9nKHN0ZXBOYW1lKycgVW4gZW5hYmxlZCcpO1xuICAgICAgICAkKCcuY2xpY2snK3N0ZXBOYW1lKS5jb250ZW50cygpLnVud3JhcCgpO1xuICAgICAgICBPcHRzLmVuYWJsZT1hcnJheVJlbW92ZShPcHRzLmVuYWJsZSxzdGVwTmFtZSk7XG4gICAgfVxuICAgIHRoaXMuc2V0RW5hYmxlZD1mdW5jdGlvbiAoc3RlcE5hbWUpe1xuICAgICAgICBjb25zb2xlLmxvZyhzdGVwTmFtZSsnIGVuYWJsZWQnKTtcbiAgICAgICAgbGV0IHN0ZXBJdGVtPSQoJy5zdGVwW2RhdGEtc3RlcE5hbWU9XCInK3N0ZXBOYW1lKydcIl0nKTtcbiAgICAgICAgc3RlcEl0ZW0uaHRtbCgnPGEgY2xhc3M9XCJzdGVwQ2xpY2sgY2xpY2snK3N0ZXBOYW1lKydcIiBkYXRhLXN0ZXBOYW1lPVwiJytzdGVwTmFtZSsnXCIgaHJlZj1cIiNcIj4nK3N0ZXBJdGVtLmh0bWwoKSsnPC9hPicpO1xuICAgICAgICByb290LmJpbmRDbGlja0FjdGlvbigpO1xuICAgICAgICAvLyQoJy5zdGVwQ2xpY2snKS5jbGljayhyb290LnN0ZXBDbGljayk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmFkZEVuYWJsZWQ9ZnVuY3Rpb24oc3RlcE5hbWUpe1xuICAgICAgICBpZighT3B0cy5lbmFibGUuaW5jbHVkZXMoc3RlcE5hbWUpKXtcbiAgICAgICAgICAgIE9wdHMuZW5hYmxlLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3Quc2V0RW5hYmxlZChzdGVwTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21wbGV0ZWQ9ZnVuY3Rpb24oc3RlcE5hbWUpe1xuICAgICAgICBpZighT3B0cy5jb21wbGV0ZS5pbmNsdWRlcyhzdGVwTmFtZSkpe1xuICAgICAgICAgICAgT3B0cy5jb21wbGV0ZS5wdXNoKHN0ZXBOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByb290LnNldENvbXBsZXRlZChzdGVwTmFtZSk7XG4gICAgICAgIHJvb3QuYmluZENsaWNrQWN0aW9uKCk7XG4gICAgfVxuXG5cbiAgICB0aGlzLmxvYWRTdGVwQ29udGVudD1mdW5jdGlvbiAoc3RlcE5hbWUpe1xuICAgICAgICBsZXQgZGF0YT17J3R5cGUnOnN0ZXBOYW1lfTtcbiAgICAgICAgJC5leHRlbmQoZGF0YSwgT3B0cy5VcmxEYXRhKTtcblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiBPcHRzLlVSTC5jcmVhdGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzdWx0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXI9JCgnLlNDJytzdGVwTmFtZS5jYXBpdGFsaXplKCkpO1xuICAgICAgICAgICAgICAgIGlmKCQuaW5BcnJheShzdGVwTmFtZSxPcHRzLmV4Y2x1ZGVMb2FkZWQpPT0tMSl7XG4gICAgICAgICAgICAgICAgICAgIE9wdHMubG9hZGVkLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXhjbHVkZWQgVmlldycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250YWluZXIuaHRtbChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmKE9wdHMubm93TG9hZGVkKXtcbiAgICAgICAgICAgICAgICAgICAgT3B0cy5ub3dMb2FkZWQoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPcHRzLm9uQWZ0ZXJMb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJMb2FkZWQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBPcHRzLmxvYWRlZD1bJ3N1cHBsaWVyJ107XG4gICAgICAgICQoJy5zdGVwQ29udGFpbmVyJykuZWFjaChmdW5jdGlvbigpe1xuLypcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2xhc3NMaXN0KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdTQ1N1cHBsaWVyJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJCh0aGlzKS5hdHRyKCdjbGFzcycpKTtcbiovXG4gICAgICAgICAgICBpZighdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ1NDU3VwcGxpZXInKSl7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5odG1sKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRBY3RpdmVGaW5pc2g9ZnVuY3Rpb24oc3RlcE5hbWUpe1xuICAgICAgICBsZXQgY29udGFpbmVyPSQoJy5TQycrc3RlcE5hbWUuY2FwaXRhbGl6ZSgpKTtcbiAgICAgICAgaWYoc3RlcE5hbWU9PT0ncHJvZHVjdFNlbGVjdCcpe1xuICAgICAgICAgICAgJCgnLmNvbnRhaW5lclN0ZXBwZXInKS5hZGRDbGFzcygnYWN0aXZlU2lkZUJhcicpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICQoJy5jb250YWluZXJTdGVwcGVyJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZVNpZGVCYXInKTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Zygnc2V0QWN0aXZlRmluaXNoIHNob3c6JytzdGVwTmFtZSk7XG4gICAgICAgIGNvbnRhaW5lci5zaG93KCk7XG4gICAgICAgIE9wdHMubm93TG9hZGVkPWZhbHNlO1xuICAgICAgICByb290LmFjdGl2ZT1zdGVwTmFtZTtcbiAgICAgICAgT3B0cy5vbkFmdGVyQWN0aXZhdGUoKTtcbiAgICAgICAgaWYodHlwZW9mIE9wdHMuYXV0b0NhbGxiYWNrW3N0ZXBOYW1lXSE9PSd1bmRlZmluZWQnICl7XG4gICAgICAgICAgICBPcHRzLmF1dG9DYWxsYmFja1tzdGVwTmFtZV0ub25BZnRlckFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRBY3RpdmU9ZnVuY3Rpb24oc3RlcE5hbWUpe1xuICAgICAgICAkKCcuc3RlcENvbnRhaW5lcicpLmhpZGUoKTtcbiAgICAgICAgaWYoIU9wdHMubG9hZGVkLmluY2x1ZGVzKHN0ZXBOYW1lKSl7XG4gICAgICAgICAgICByb290LmxvYWRTdGVwQ29udGVudChzdGVwTmFtZSk7XG4gICAgICAgICAgICBPcHRzLm5vd0xvYWRlZD10aGlzLnNldEFjdGl2ZUZpbmlzaDtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUZpbmlzaChzdGVwTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0ZXBDbGljaz1mdW5jdGlvbihldmVudCl7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBzdGVwTmFtZT0kKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoJ3N0ZXBuYW1lJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRBY3RpdmU6JytzdGVwTmFtZSk7XG4gICAgICAgIHJvb3Quc2V0QWN0aXZlKHN0ZXBOYW1lKTtcbiAgICB9XG59XG5cbndpbmRvdy5PcmRlck1vZHVsZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIC8qXG4gICAgICogVmFyaWFibGVzIGFjY2Vzc2libGVcbiAgICAgKiBpbiB0aGUgY2xhc3NcbiAgICAgKi9cbiAgICBsZXQgT3B0cyA9IHtcbiAgICAgICAgdGVzdE1vZGU6IGZhbHNlLFxuICAgICAgICBuZWVkU3RlcHBlcjp0cnVlLFxuICAgICAgICBDU1NTZWxlY3RvckZvcm06Jy5vcmRlclBhcmFtZXRlckZvcm0nLFxuICAgICAgICBkZWZhdWx0RGVsaXZlcnlEYXRlOicnLFxuICAgICAgICBkYXRhU3luY1BhdXNlVGltZTo1MDAsXG4gICAgICAgIHRva2VuOm51bGwsXG4gICAgICAgIFVSTDoge1xuICAgICAgICAgICAgcm9vdDpudWxsLFxuICAgICAgICAgICAgZ2V0RGF0YVRhYmxlQ29udGVudFByb2R1Y3RMaXN0Om51bGwsXG4gICAgICAgICAgICBjaGVja1JlYWR5VG9TZW5kOm51bGwsXG4gICAgICAgICAgICBpbmRleDpudWxsLFxuICAgICAgICAgICAgc2hvdzpudWxsLFxuICAgICAgICAgICAgZWRpdDpudWxsLFxuICAgICAgICAgICAgY3JlYXRlOiBudWxsLFxuICAgICAgICAgICAgc3RvcmU6IG51bGwsXG4gICAgICAgICAgICB1cGRhdGU6bnVsbCxcbiAgICAgICAgICAgIGRlc3Ryb3k6bnVsbCxcbiAgICAgICAgICAgIHRvZ2dsZUZhdm9yaXRlczpudWxsLFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBQdWJsaWNWYXIgPSB7fTtcbiAgICBsZXQgUHVibGljVmFyMiA9IHsnYXNkJzogJzIxJ307XG4gICAgbGV0IEFwaVRva2VuID0gbnVsbDtcbiAgICBsZXQgT3JkZXI9bnVsbDtcbiAgICBsZXQgcm9vdCA9IHRoaXM7XG4gICAgbGV0IHZpZXdJbmljaWFsaXplZD1bXTtcblxuICAgIHRoaXMuc2V0T3B0cyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICQuZXh0ZW5kKE9wdHMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0T3B0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE9wdHM7XG4gICAgfVxuICAgIHRoaXMuY2xpY2tPcmRlckVkaXQ9ZnVuY3Rpb24gKGRhdGEpe1xuICAgICAgICBkZWJ1ZygnY2xpY2tFZGl0Jyk7XG4gICAgICAgIGRlYnVnKGRhdGEpO1xuICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5lZGl0LnJlcGxhY2UoJyVpZCUnLGRhdGEuaWQpO1xuICAgICAgICBBUFAubG9hZE1haW5Db250ZW50KGFqYXhVcmwpO1xuLyogICAgICAgIGxldCBhamF4RGF0YT17fTtcbiAgICAgICAgYWpheERhdGEuX3Rva2VuPU9wdHMudG9rZW47XG4gICAgICAgICQuZXh0ZW5kKGFqYXhEYXRhLE9yZGVyKTtcbiAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwuZWRpdC5yZXBsYWNlKCclaWQlJyxkYXRhLmlkKTtcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogYWpheFVybCxcbiAgICAgICAgICAgIG1ldGhvZDonR0VUJyxcbiAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN1Y2Nlc3Mpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3JkZXJEYXRhPXJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIG9yZGVyRGF0YS5zdXBwbGllcklkPW9yZGVyRGF0YS5zdXBwbGllcl9pZDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlKG9yZGVyRGF0YS5zdXBwbGllcl9pZCk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuaW5pdE9yZGVyKG9yZGVyRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuaW5pdFN0ZXBwZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yb290LmFmdGVyT3JkZXJTZXRTdXBwbGllck9rKGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTsqL1xuXG5cbiAgICB9XG4gICAgdGhpcy5hZnRlck9yZGVyRGVsZXRlZD1mdW5jdGlvbiAoZGF0YSl7XG4gICAgICAgIGlmKGRhdGEuc3VjY2Vzcz09dHJ1ZSl7XG4gICAgICAgICAgICBkZWJ1ZygnT3JkZXIgZGVsZXRlIHN1Y2Nlc3MnKTtcbiAgICAgICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoT3B0cy5VUkwuaW5kZXgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIFRvYXN0LmNyZWF0ZSh7IHRpdGxlOiBcIkVycm9yIGRlbGV0ZWQgIVwiLCBtZXNzYWdlOiAnJywgc3RhdHVzOiBUT0FTVF9TVEFUVVMuREFOR0VSLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xpY2tPcmRlckRlbGV0ZUNvbmZpcm1lZD1mdW5jdGlvbiAoZXZlbnQpe1xuICAgICAgICBkZWJ1ZygnY2xpY2tPcmRlckRlbGV0ZUNvbmZpcm1lZCcpO1xuICAgICAgICBkZWJ1ZyhldmVudCk7XG4gICAgICAgIGRlYnVnKGV2ZW50LmRhdGEpO1xuICAgICAgICAkKCcjZGlhbG9nTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICBsZXQgYWpheERhdGE9e307XG4gICAgICAgIGFqYXhEYXRhLl90b2tlbj1PcHRzLnRva2VuO1xuICAgICAgICBsZXQgYWpheFVybD1PcHRzLlVSTC5kZXN0cm95LnJlcGxhY2UoJyVpZCUnLGV2ZW50LmRhdGEuaWQpO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOmFqYXhVcmwsXG4gICAgICAgICAgICBkYXRhOmFqYXhEYXRhLFxuICAgICAgICAgICAgbWV0aG9kOlwiREVMRVRFXCIsXG4gICAgICAgICAgICBzdWNjZXNzOnJvb3QuYWZ0ZXJPcmRlckRlbGV0ZWQsXG4gICAgICAgICAgICAvL2Vycm9yOmFqYXhFcnJvckhhbmRsZXJcbiAgICAgICAgfSk7XG5cbiAgICB9XG4gICAgdGhpcy5pbml0Vmlld09yZGVyU2VsZWN0PWZ1bmN0aW9uICgpe1xuICAgICAgICBkZWJ1ZygnY2FsbGVkIGluaXRWaWV3T3JkZXJTZWxlY3QgJyk7XG4gICAgICAgICQoJy5vcmRlcnNTZWxlY3RUYWJsZSBidXR0b24nKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5vcmRlcnNTZWxlY3RUYWJsZSBidXR0b24nKS5vbignY2xpY2snLGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgbGV0IGFjdGlvbj0kKHRoaXMpLmRhdGEoJ2FjdGlvbicpO1xuICAgICAgICAgICAgbGV0IG9yZGVySWQ9JCgkKHRoaXMpLmNsb3Nlc3QoJ3RyJylbMF0pLmRhdGEoJ29yZGVyaWQnKTtcbiAgICAgICAgICAgIGRlYnVnKGFjdGlvbik7XG4gICAgICAgICAgICBkZWJ1ZyhvcmRlcklkKTtcblxuICAgICAgICAgICAgaWYoYWN0aW9uPT0nZGVsZXRlJyl7XG4gICAgICAgICAgICAgICAgJCgnI2RpYWxvZ01vZGFsJykub24oJ3Nob3cuYnMubW9kYWwnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCB5b3UgY291bGQgaW5pdGlhdGUgYW4gQUpBWCByZXF1ZXN0IGhlcmUgKGFuZCB0aGVuIGRvIHRoZSB1cGRhdGluZyBpbiBhIGNhbGxiYWNrKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtb2RhbCdzIGNvbnRlbnQuIFdlJ2xsIHVzZSBqUXVlcnkgaGVyZSwgYnV0IHlvdSBjb3VsZCB1c2UgYSBkYXRhIGJpbmRpbmcgbGlicmFyeSBvciBvdGhlciBtZXRob2RzIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5tb2RhbC10aXRsZScpLnRleHQoJ01lZ2VyxZFzw610w6lzICcpO1xuICAgICAgICAgICAgICAgICAgICBtb2RhbC5maW5kKCcubW9kYWwtYm9keScpLnRleHQoJ0JpenRvc2FuIHTDtnJsaSBhIG1lZ3JlbmRlbMOpc3Q/Jyk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5idXR0b25ZZXMnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmZpbmQoJy5idXR0b25ZZXMnKS5vbignY2xpY2snLHtpZDpvcmRlcklkfSxyb290LmNsaWNrT3JkZXJEZWxldGVDb25maXJtZWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICQoJyNkaWFsb2dNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByb290LmNsaWNrT3JkZXJFZGl0KHtpZDpvcmRlcklkfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkKCcuYnV0dG9uTmV3Jykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCcuYnV0dG9uTmV3Jykub24oJ2NsaWNrJyxmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIEFQUC5sb2FkTWFpbkNvbnRlbnQoT3B0cy5VUkwuaW5kZXgsJ2ZvcmNlPXRydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG4gICAgdGhpcy5pbml0U3RlcHBlcj1mdW5jdGlvbiAoKXtcbiAgICAgICAgZGVidWcoT3JkZXIuZ2V0RGF0YSgpKTtcbiAgICAgICAgdmlld0luaWNpYWxpemVkPVtdO1xuICAgICAgICAkKCcuc3RhdHVzTmFtZVBsYWNlJykudGV4dCgnTmluY3MgZWxrw7xsZHZlJyk7XG4gICAgICAgICQoJy5zdGF0dXNOYW1lUGxhY2UnKS5hZGRDbGFzcygnc3RhdHVzQmxpbmsnKTtcbiAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUoJy0nKTtcbiAgICAgICAgcm9vdC5zZXRTdXBwbGllcignLScpO1xuXG4gICAgICAgIGxldCB1bkVuYWJsZWQ9WydwYXJhbWV0ZXInLCAncHJvZHVjdFNlbGVjdCcsICdpbnZvaWNlJywgJ3NlbmQnXTtcbiAgICAgICAgJC5lYWNoKHVuRW5hYmxlZCxmdW5jdGlvbiAoaW5kZXgsdmFsdWUpIHtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldEVuYWJsZWQodmFsdWUpO1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0Q29tcGxldGVkKHZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVidWcocm9vdC5TdGVwcGVyLmdldE9wdHMoKVsnYXZhaWxhYmxlJ10pO1xuICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKClbJ29yZGVyU3RhdHVzJ10pO1xuXG4gICAgICAgIGxldCBzdGVwQWN0aXZlPSdzdXBwbGllcic7XG4gICAgICAgIGxldCBzdGVwQ29tcGxldGU9WydzdXBwbGllciddO1xuICAgICAgICBsZXQgc3RlcEVuYWJsZT1bXTtcbiAgICAgICAgbGV0IHN0ZXBPbkFmdGVyQWN0aXZhdGU9ZnVuY3Rpb24gKCl7fTtcblxuICAgICAgICBsZXQgYXZhbGFpYmxlU3RlcHM9cm9vdC5TdGVwcGVyLmdldE9wdHMoKVsnYXZhaWxhYmxlJ107XG4gICAgICAgIGxldCBzdGVwVXJsRGF0YT1mYWxzZTtcbiAgICAgICAgbGV0IHN0ZXBBdXRvQ2FsbGJhY2s9W107XG4gICAgICAgIGZvciAobGV0IHN0ZXBOYW1lIG9mIGF2YWxhaWJsZVN0ZXBzKSB7XG4gICAgICAgICAgICBzdGVwT25BZnRlckFjdGl2YXRlPXRoaXNbJ2luaXRWaWV3JytzdGVwTmFtZS5jYXBpdGFsaXplKCldO1xuICAgICAgICAgICAgbGV0IGl0ZW09e307XG4gICAgICAgICAgICBpdGVtWydvbkFmdGVyQWN0aXZhdGUnXT1zdGVwT25BZnRlckFjdGl2YXRlO1xuICAgICAgICAgICAgc3RlcEF1dG9DYWxsYmFja1tzdGVwTmFtZV09aXRlbTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhzdGVwQXV0b0NhbGxiYWNrKTtcbiAgICAgICAgZGVidWcoT3JkZXIuZ2V0RGF0YSgpWydpZCddKTtcbiAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydpZCddPjApe1xuICAgICAgICAgICAgZGVidWcoJ2hhanJhJyk7XG4gICAgICAgICAgICBkZWJ1ZyhPcmRlci5nZXREYXRhKCkpO1xuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeURhdGUnXSl7XG4gICAgICAgICAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeURhdGUnXSk7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBAdG9kbzogd2Vla2x5LXQgYmVhbGxpdGFuaVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydzdXBwbGllck5hbWUnXSl7XG4gICAgICAgICAgICAgICAgcm9vdC5zZXRTdXBwbGllcihPcmRlci5nZXREYXRhKClbJ3N1cHBsaWVyTmFtZSddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXBVcmxEYXRhPXsnc3VwcGxpZXJJZCc6T3JkZXIuc3VwcGxpZXJJZCxpZDpPcmRlci5pZH07XG4gICAgICAgICAgICBmb3IgKGxldCBzdGVwTmFtZSBvZiBhdmFsYWlibGVTdGVwcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICBzdGVwQ29tcGxldGUucHVzaChzdGVwTmFtZSk7XG4gICAgICAgICAgICAgICAgc3RlcEVuYWJsZS5wdXNoKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ29yZGVyU3RhdHVzJ109PXN0ZXBOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEFjdGl2ZT1zdGVwTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2luaXRWaWV3JytzdGVwTmFtZS5jYXBpdGFsaXplKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZihzdGVwTmFtZSE9PSdpbnZvaWNlJyAmJiBzdGVwTmFtZSE9PSdzZW5kJyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwT25BZnRlckFjdGl2YXRlPXRoaXNbJ2luaXRWaWV3JytzdGVwTmFtZS5jYXBpdGFsaXplKCldO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBPbkFmdGVyQWN0aXZhdGU9ZnVuY3Rpb24gKCl7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbi8qXG4gICAgICAgICAgICAvL3JlZmFjdG9yZWQgZm9yIGxvb3BcbiAgICAgICAgICAgIHZhciBCcmVha0V4Y2VwdGlvbiA9IHt9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhdmFsYWlibGVTdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHN0ZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgc3RlcENvbXBsZXRlLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBzdGVwRW5hYmxlLnB1c2goc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ29yZGVyU3RhdHVzJ109PXN0ZXBOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBBY3RpdmU9c3RlcE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCcmVha0V4Y2VwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgIT09IEJyZWFrRXhjZXB0aW9uKSB0aHJvdyBlO1xuICAgICAgICAgICAgfSovXG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJvb3QuU3RlcHBlci5pbml0KHtcbiAgICAgICAgICAgIGNvbXBsZXRlOnN0ZXBDb21wbGV0ZSxcbiAgICAgICAgICAgIGVuYWJsZTpzdGVwRW5hYmxlLFxuICAgICAgICAgICAgbG9hZGVkOltdLFxuICAgICAgICAgICAgYWN0aXZlOiBzdGVwQWN0aXZlLFxuICAgICAgICAgICAgVVJMOiB7XG4gICAgICAgICAgICAgICAgY3JlYXRlOiBPcHRzLlVSTC5jcmVhdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVXJsRGF0YTpzdGVwVXJsRGF0YSxcbiAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTpzdGVwT25BZnRlckFjdGl2YXRlLFxuICAgICAgICAgICAgYXV0b0NhbGxiYWNrOiBzdGVwQXV0b0NhbGxiYWNrLFxuICAgICAgICAgICAgLyp7XG4gICAgICAgICAgICAgICAgaW52b2ljZToge1xuICAgICAgICAgICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6cm9vdC5pbml0Vmlld0ludm9pY2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnJvb3QuaW5pdFZpZXdTZW5kXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgfSovXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdE9yZGVyPWZ1bmN0aW9uIChkYXRhKXtcbiAgICAgICAgT3JkZXI9bmV3IERhdGFNb2RlbE9yZGVyKGRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGRlYnVnKCdPcmRlck1vZHVsIGluaXQgY2FsbGVkJyk7XG4gICAgICAgICQuZXh0ZW5kKE9wdHMsIHdpbmRvdy5PcmRlck1vZHVsRGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgICAgIE9yZGVyPW5ldyBEYXRhTW9kZWxPcmRlcigpO1xuICAgICAgICBpZihPcHRzLm5lZWRTdGVwcGVyKXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5TdGVwcGVyID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5TdGVwcGVyPW5ldyBTdGVwcGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoT3B0cy50ZXN0TW9kZSl7XG4gICAgICAgICAgICByZXR1cm4gcm9vdC50ZXN0TW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdXBwbGllcj1mdW5jdGlvbiAoc3VwcGxpZXJOYW1lLHN1cHBsaWVySWQpe1xuICAgICAgIGlmKHN1cHBsaWVyTmFtZSl7XG4gICAgICAgICAgICQoJy5zdXBwbGllck5hbWVQbGFjZScpLnRleHQoc3VwcGxpZXJOYW1lKTtcbiAgICAgICB9XG4gICAgICAgaWYoc3VwcGxpZXJJZCl7XG4gICAgICAgICAgIE9yZGVyLnNldERhdGEoe3N1cHBsaWVySWQ6c3VwcGxpZXJJZH0pO1xuICAgICAgICAgICByb290LlN0ZXBwZXIuc2V0T3B0cyh7J1VybERhdGEnOnsnc3VwcGxpZXJJZCc6c3VwcGxpZXJJZH19KTtcbiAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0RGVsaXZlcnlEYXRlPWZ1bmN0aW9uIChkYXRlVGV4dCxkYXRlVGV4dFRvKXtcbiAgICAgICAgbGV0IGRhdGVUZXh0SHVtYW49ZGF0ZVRleHQucmVwbGFjZUFsbCgnLScsJy4nKSsnLic7XG4gICAgICAgIGlmKGRhdGVUZXh0SHVtYW4ubGVuZ3RoPDUpe1xuICAgICAgICAgICAgJCgnLmRlbGl2ZXJ5RGF0ZVBsYWNlJykudGV4dChkYXRlVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGF0ZVRleHRUbyl7XG4gICAgICAgICAgICBkYXRlVGV4dEh1bWFuKz0nIC0gJytkYXRlVGV4dFRvLnJlcGxhY2VBbGwoJy0nLCcuJykrJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgJChPcHRzLkNTU1NlbGVjdG9yRm9ybSsnIC5zZWxlY3RlZERhdGVUZXh0JykudGV4dChkYXRlVGV4dEh1bWFuKTtcbiAgICAgICAgJCgnLmRlbGl2ZXJ5RGF0ZVBsYWNlJykudGV4dChkYXRlVGV4dEh1bWFuKTtcbiAgICAgICAgJChPcHRzLkNTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9XCJkZWxpdmVyeURhdGVcIl0nKS52YWwoZGF0ZVRleHQpO1xuICAgIH1cblxuXG5cbiAgICB0aGlzLmdldERhdGE9ZnVuY3Rpb24gKCl7XG4gICAgICAgIHJldHVybiBPcmRlcjtcbiAgICB9XG5cblxuICAgIHRoaXMuc2V0U3VwcGxpZXJDb21wbGV0ZWQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnYmluZ28nKTtcbiAgICAgICAgcm9vdC5pbml0Vmlld1BhcmFtZXRlcigpXG4gICAgfVxuXG4gICAgdGhpcy5hZnRlck9yZGVyU2V0U3VwcGxpZXJPaz1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBUb2FzdC5jcmVhdGUoeyB0aXRsZTogXCJTdXBwbGllciBzZWxlY3RlZCAhXCIsIG1lc3NhZ2U6IGRhdGEuc3VwcGxpZXIubmFtZSAsIHN0YXR1czogVE9BU1RfU1RBVFVTLklORk8sIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgICAgIHJvb3Quc2V0U3VwcGxpZXIoZGF0YS5zdXBwbGllci5uYW1lLGRhdGEuc3VwcGxpZXIuaWQpO1xuICAgICAgICBPcmRlci5zZXREYXRhKHtpZDpkYXRhLmlkfSk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHsnVXJsRGF0YSc6eydzdXBwbGllcklkJzpPcmRlci5zdXBwbGllcklkLGlkOk9yZGVyLmlkfX0pO1xuICAgICAgICAvL3Jvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyTG9hZDpyb290LnNldFN1cHBsaWVyQ29tcGxldGVkfSlcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldEVuYWJsZWQoJ3BhcmFtZXRlcicpO1xuICAgICAgICByb290LlN0ZXBwZXIuYWRkQ29tcGxldGVkKCdwYXJhbWV0ZXInKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldENvbXBsZXRlZCgncGFyYW1ldGVyJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRBY3RpdmUoJ3BhcmFtZXRlcicpO1xuICAgIH1cblxuXG4gICAgdGhpcy5pbml0Vmlld1N1cHBsaWVyPWZ1bmN0aW9uICgpe1xuICAgICAgICBkZWJ1ZygnY2FsbCBpbml0Vmlld1N1cHBsaWVyJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyTG9hZDpmdW5jdGlvbiAoKXt9fSk7XG4gICAgICAgICQoJy5zdXBwbGllckl0ZW0nKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5zdXBwbGllckl0ZW0nKS5vbignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKE9yZGVyLmdldERhdGEoKSk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBsZXQgc3VwcGxpZXJJZD0kKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgICBsZXQgc3VwcGxpZXJOYW1lPSQoZXZlbnQuY3VycmVudFRhcmdldCkuZmluZCgnaDUuY2FyZC10aXRsZScpLnRleHQoKTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBPcmRlci5zdXBwbGllcklkPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgLy9uZXcgb3JkZXJcblxuICAgICAgICAgICAgICAgIGxldCBhamF4RGF0YT17fTtcbiAgICAgICAgICAgICAgICBhamF4RGF0YS5fdG9rZW49T3B0cy50b2tlbjtcbiAgICAgICAgICAgICAgICBhamF4RGF0YS5zdXBwbGllcklkPXN1cHBsaWVySWQ7XG4gICAgICAgICAgICAgICAgYWpheERhdGEuc3RvcmVUeXBlPSdzdXBwbGllclNlbGVjdCc7XG4gICAgICAgICAgICAgICAgJC5leHRlbmQoYWpheERhdGEsT3JkZXIpO1xuICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogT3B0cy5VUkwuc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDonUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc3VjY2Vzcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5hZnRlck9yZGVyU2V0U3VwcGxpZXJPayhkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy9PcmRlci5zZXREYXRhKHtzdXBwbGllcklkOnN1cHBsaWVySWR9KTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIC8vaWRlIGtlbGxlbmUgZWd5IGpvIGtpcyBrZXJkZXNcbiAgICAgICAgICAgICAgICBpZihPcmRlci5zdXBwbGllcklkIT1zdXBwbGllcklkKXtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiU3VwcGxpZXIgY2hhbmdlIHRvIVwiLCBtZXNzYWdlOiBzdXBwbGllck5hbWUsIHN0YXR1czogVE9BU1RfU1RBVFVTLldBUk5JTkcsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci5jbGVhckxvYWRlZCgpO1xuICAgICAgICAgICAgICAgICAgICBPcmRlcj1uZXcgRGF0YU1vZGVsT3JkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgLy9PcmRlci5zZXREYXRhKHtzdXBwbGllcklkOnN1cHBsaWVySWR9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocm9vdC5TdGVwcGVyLmdldE9wdHMoKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0nKTtcblxuICAgICAgICAgICAgLy8kKCcuc3VwcGxpZXJOYW1lUGxhY2UnKS50ZXh0KHN1cHBsaWVyTmFtZSk7XG4gICAgICAgICAgICByb290LnNldFN1cHBsaWVyKHN1cHBsaWVyTmFtZSxzdXBwbGllcklkKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHN1cHBsaWVyTmFtZSlcbiAgICAgICAgICAgIC8vQHRvZG86aWRlIGtlbGwgZWd5IG1lbnRlcyFcbiAgICAgICAgICAgIC8vQHRvZG86bWVudGVzIGVyZWRlbWVueWVrZXBwZW4gbGVoZXQgdmFsdGFuaVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyTG9hZDpyb290LnNldFN1cHBsaWVyQ29tcGxldGVkfSlcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5zZXRFbmFibGVkKCdwYXJhbWV0ZXInKTtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5hZGRDb21wbGV0ZWQoJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnNldENvbXBsZXRlZCgncGFyYW1ldGVyJyk7XG4gICAgICAgICAgICByb290LlN0ZXBwZXIuc2V0QWN0aXZlKCdwYXJhbWV0ZXInKTtcblxuXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2hlY2tDb250YWN0TmFtZUZpZWxkPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IENTU1NlbGVjdG9yRm9ybT0nLm9yZGVyUGFyYW1ldGVyRm9ybSc7XG4gICAgICAgIGxldCBub2RlPSQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1jb250YWN0TmFtZV0nKTtcbiAgICAgICAgaWYobm9kZS52YWwoKS5sZW5ndGg8Mil7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUNsYXNzKCdpcy12YWxpZCcpO1xuICAgICAgICAgICAgbm9kZS5hZGRDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2lzLXZhbGlkJyk7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUNsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICB0aGlzLnNlbmRPcmRlckRhdGFUb1NlcnZlcj1mdW5jdGlvbiAodXBkYXRlVHlwZSxjYWxsYmFjayxlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBhamF4RGF0YT0ge307XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLnN0b3JlO1xuICAgICAgICBsZXQgYWpheE1ldGhvZD1cIlBPU1RcIjtcbiAgICAgICAgaWYoT3JkZXIuaWQpe1xuICAgICAgICAgICAgYWpheFVybD1PcHRzLlVSTC51cGRhdGUucmVwbGFjZSgnJWlkJScsT3JkZXIuaWQpO1xuICAgICAgICAgICAgLy9hamF4TWV0aG9kPVwiUFVUXCI7XG4gICAgICAgICAgICAvL2FqYXhEYXRhPW5ldyBGb3JtRGF0YSgkKENTU1NlbGVjdG9yRm9ybSlbMF0pO1xuICAgICAgICAgICAgYWpheERhdGEuX21ldGhvZD0nUFVUJztcbiAgICAgICAgfVxuICAgICAgICBhamF4RGF0YS5fdG9rZW49T3B0cy50b2tlbjtcbiAgICAgICAgYWpheERhdGEudXBkYXRlVHlwZT11cGRhdGVUeXBlO1xuICAgICAgICAkLmV4dGVuZChhamF4RGF0YSxPcmRlcik7XG4gICAgICAgIGRlYnVnKE9yZGVyKTtcbiAgICAgICAgZGVidWcoYWpheERhdGEpO1xuICAgICAgICBkZWJ1ZygnYWpheFVybDonK2FqYXhVcmwpO1xuICAgICAgICBhamF4RGF0YT1qc29uVG9Gb3JtRGF0YShhamF4RGF0YSk7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6YWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICB0eXBlOmFqYXhNZXRob2QsXG4gICAgICAgICAgICBjb250ZW50VHlwZTpmYWxzZSxcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnYWpheCByZXR1cm5lZCBkYXRhJyk7XG4gICAgICAgICAgICAgICAgZGVidWcoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzKXtcbiAgICAgICAgICAgICAgICAgICAgLy9yb290LmFmdGVyT3JkZXJTZXRTdXBwbGllck9rKGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgYWpheE9wdGlvbnMsIHRocm93bkVycm9yKSB7XG4gICAgICAgICAgICAgICAgYWpheEVycm9ySGFuZGxlcih4aHIsIGFqYXhPcHRpb25zLCB0aHJvd25FcnJvcik7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIGVycm9yQ2FsbGJhY2shPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayh4aHIucmVzcG9uc2VKU09OKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgIH0pO1xuXG4gICAgfVxuICAgIHRoaXMuYWZ0ZXJPcmRlclNldFBhcmFtZXRlck9rPWZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGRlYnVnKCdjYWxsZWQgYWZ0ZXJPcmRlclNldFBhcmFtZXRlck9rJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHsnVXJsRGF0YSc6eydzdXBwbGllcklkJzpPcmRlci5zdXBwbGllcklkLCdpZCc6T3JkZXIuaWR9fSk7XG4gICAgICAgIC8vcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOnJvb3Quc2V0UGFyYW1ldGVyQ29tcGxldGVkfSlcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldEVuYWJsZWQoJ3Byb2R1Y3RTZWxlY3QnKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLmFkZENvbXBsZXRlZCgncHJvZHVjdFNlbGVjdCcpO1xuICAgICAgICByb290LlN0ZXBwZXIuc2V0Q29tcGxldGVkKCdwcm9kdWN0U2VsZWN0Jyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRBY3RpdmUoJ3Byb2R1Y3RTZWxlY3QnKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RDdXJyZW50V2VlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdzZWxlY3RDdXJyZW50V2VlaycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCQoJy51aS1kYXRlcGlja2VyJykuZmluZCgnLnVpLWRhdGVwaWNrZXItY3VycmVudC1kYXkgYScpKTtcbiAgICAgICAgJCgnLnVpLWRhdGVwaWNrZXInKS5maW5kKCcudWktZGF0ZXBpY2tlci1jdXJyZW50LXNlbGVjdGVkLXdlZWtkYXkgYScpLmFkZENsYXNzKCd1aS1zdGF0ZS1hY3RpdmUnKVxuICAgIH1cbiAgICB0aGlzLndlZWtIb3ZlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdob3ZlciBBY3RpdmUnKTtcbiAgICAgICAgJCgnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdHInKS5vZmYoJ21vdXNlbW92ZScpO1xuICAgICAgICAkKCcudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0cicpLm9mZignbW91c2VsZWF2ZScpO1xuXG4gICAgICAgICQoJy51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRyJykub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmZpbmQoJ3RkIGEnKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKTsgfSk7XG4gICAgICAgICQoJy51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRyJykub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHsgJCh0aGlzKS5maW5kKCd0ZCBhJykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyk7IH0pO1xuXG4gICAgfVxuICAgIHRoaXMud2Vla0hvdmVyU2xvdyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd3ZWVrSG92ZXJTbG93Jyk7XG4gICAgICAgIGlmKCQoJy51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRyJykubGVuZ3RoPDEpe1xuICAgICAgICAgICAgc2V0VGltZW91dChyb290LndlZWtIb3ZlclNsb3csIDEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJvb3Qud2Vla0hvdmVyKCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdERhdGVQaWNrZXI9ZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignYXNkYXNkYWRhZCcpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlwdXMnICsgdHlwZSk7XG4gICAgICAgIGxldCBDU1NTZWxlY3RvckZvcm0gPSAnLm9yZGVyUGFyYW1ldGVyRm9ybSc7XG4gICAgICAgIGxldCBzdGFydERhdGU9bmV3IERhdGUoJzE5MDAtMDEtMDEnKTtcbiAgICAgICAgbGV0IGVuZERhdGU9bmV3IERhdGUoJzE5MDAtMDEtMDInKTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSArICcgLmRhdGVQaWNrZXInKS5kYXRlcGlja2VyKFwiZGVzdHJveVwiKTtcblxuICAgICAgICBpZiAodHlwZSA9PSAnd2Vla2x5Jykge1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0gKyAnIC5kYXRlUGlja2VyJykuZGF0ZXBpY2tlcih7XG4gICAgICAgICAgICAgICAgc2hvd090aGVyTW9udGhzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdE90aGVyTW9udGhzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dXZWVrOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ6ICd5eS1tbS1kZCcsXG4gICAgICAgICAgICAgICAgZmlyc3REYXk6IDEsXG4gICAgICAgICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBhZnRlclNob3c6IGZ1bmN0aW9uIChkYXRlVGV4dCwgaW5zdCkge1xuICAgICAgICAgICAgICAgICAgcm9vdC53ZWVrSG92ZXIoKTtcbiAgICAgICAgICAgICAgICAgIHJvb3Quc2VsZWN0Q3VycmVudFdlZWsoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0ZVRleHQsIGluc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSAkKHRoaXMpLmRhdGVwaWNrZXIoJ2dldERhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlID0gbmV3IGdldE1vbmRheShkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSAtIGRhdGUuZ2V0RGF5KCkgKyA3KTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUoJC5kYXRlcGlja2VyLmZvcm1hdERhdGUoICd5eS1tbS1kZCcsc3RhcnREYXRlKSwkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSggJ3l5LW1tLWRkJyxlbmREYXRlKSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJlZm9yZVNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cCgnYmVmb3JlU2hvdycpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVuZERhdGUpO1xuICAgICAgICAgICAgICAgICAgICAvL3Jvb3Qud2Vla0hvdmVyU2xvdygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoJ2JlZm9yZVNob3dEYXknKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2h1LUh1JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3NzQ2xhc3MgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZSA+PSBzdGFydERhdGUgJiYgZGF0ZSA8PSBlbmREYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2h1LUh1JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3MgPSAndWktZGF0ZXBpY2tlci1jdXJyZW50LXNlbGVjdGVkLXdlZWtkYXknO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jc3NDbGFzcyA9ICd1aS1zdGF0ZS1hY3RpdmUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgY3NzQ2xhc3NdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VNb250aFllYXI6IGZ1bmN0aW9uKHllYXIsIG1vbnRoLCBpbnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vcm9vdC5zZWxlY3RDdXJyZW50V2VlaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTesOhbGzDrXTDoXNpIGtvcmzDoXRvesOhcyBhZGF0b2sgYmV0w7ZsdMOpc2UgKGNzYWsgaGEgaGFzRGVsaXZlcnlDb25zdHJhaW50ID0gdHJ1ZSlcbiAgICAgICAgICAgIGxldCBhdmFpbGFibGVEYXRlcyA9IFtdO1xuICAgICAgICAgICAgbGV0IG5leHREZWxpdmVyeURhdGUgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGhhc0RlbGl2ZXJ5Q29uc3RyYWludCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGhvbGlkYXlzID0gW107XG4gICAgICAgICAgICBsZXQgd29ya2luZ0RheXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBkYXRlcGlja2VySW5wdXQgPSAkKENTU1NlbGVjdG9yRm9ybSArICcgLmRhdGVQaWNrZXInKTtcbiAgICAgICAgICAgIGxldCBjYWxlbmRhclVybCA9IGRhdGVwaWNrZXJJbnB1dC5kYXRhKCdkZWxpdmVyeS1jYWxlbmRhci11cmwnKTtcbiAgICAgICAgICAgIGxldCBzdXBwbGllcklkID0gZGF0ZXBpY2tlcklucHV0LmRhdGEoJ3N1cHBsaWVyLWlkJyk7XG4gICAgICAgICAgICBsZXQgcHJvZml0Q2VudGVySWQgPSBkYXRlcGlja2VySW5wdXQuZGF0YSgncHJvZml0LWNlbnRlci1pZCcpO1xuXG4gICAgICAgICAgICBpZiAoY2FsZW5kYXJVcmwgJiYgc3VwcGxpZXJJZCAmJiBwcm9maXRDZW50ZXJJZCkge1xuICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogY2FsZW5kYXJVcmwsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVySWQ6IHN1cHBsaWVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9maXRDZW50ZXJJZDogcHJvZml0Q2VudGVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlckRhdGVUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RlbGl2ZXJ5Q29uc3RyYWludCA9IGRhdGEuaGFzRGVsaXZlcnlDb25zdHJhaW50IHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gw5xubmVwbmFwb2sgw6lzIMOhdGhlbHllemV0dCBtdW5rYW5hcG9rIOKAkyBtaW5kaWcgYmV0w7ZsdGrDvGtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGlkYXlzID0gKGRhdGEuaG9saWRheXMgfHwgW10pLm1hcChmdW5jdGlvbihoKSB7IHJldHVybiB7IGRhdGU6IGguZGF0ZSwgZGVzY3JpcHRpb246IGguZGVzY3JpcHRpb24gfTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nRGF5cyA9IChkYXRhLndvcmtpbmdEYXlzIHx8IFtdKS5tYXAoZnVuY3Rpb24odykgeyByZXR1cm4geyBkYXRlOiB3LmRhdGUsIGRlc2NyaXB0aW9uOiB3LmRlc2NyaXB0aW9uIH07IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRGVsaXZlcnlDb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGF0ZXMgPSBkYXRhLmF2YWlsYWJsZURhdGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHREZWxpdmVyeURhdGUgPSBkYXRhLm5leHREZWxpdmVyeURhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhIG5pbmNzIHN6w6FsbMOtdMOhc2kga29ybMOhdG96w6FzLCBheiBhdmFpbGFibGVEYXRlcyDDqXMgbmV4dERlbGl2ZXJ5RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gw7xyZXMgbWFyYWQg4oCTIGEgZGF0ZXBpY2tlciBheiBlcmVkZXRpIG3Ds2RvbiB2aXNlbGtlZGlrXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChoYXNEZWxpdmVyeUNvbnN0cmFpbnQgJiYgbmV4dERlbGl2ZXJ5RGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIEvDtnZldGtlesWRIHN6w6FsbMOtdMOhc2kgbmFwIGJlw6FsbMOtdMOhc2EgYWxhcMOpcnRlbG1lemV0dGvDqW50XG4gICAgICAgICAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUobmV4dERlbGl2ZXJ5RGF0ZSk7XG4gICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0gKyAnIC5zZWxlY3RlZERhdGVUZXh0JykudGV4dChuZXh0RGVsaXZlcnlEYXRlKTtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSArICcgaW5wdXRbbmFtZT1cImRlbGl2ZXJ5RGF0ZVwiXScpLnZhbChuZXh0RGVsaXZlcnlEYXRlKTtcbiAgICAgICAgICAgICAgICAkKCcuZGVsaXZlcnlEYXRlUGxhY2UnKS50ZXh0KG5leHREZWxpdmVyeURhdGUucmVwbGFjZUFsbCgnLScsICcuJykgKyAnLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTesOtbiBqZWxtYWd5YXLDoXphdCBtZWdqZWxlbsOtdMOpc2UgY3NhayBzesOhbGzDrXTDoXNpIGtvcmzDoXRvesOhcyBlc2V0w6luXG4gICAgICAgICAgICBpZiAoaGFzRGVsaXZlcnlDb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgJCgnI2RlbGl2ZXJ5RGF0ZUxlZ2VuZCcpLnNob3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJPcHRzID0ge1xuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ6ICd5eS1tbS1kZCcsXG4gICAgICAgICAgICAgICAgbWluRGF0ZTogKGhhc0RlbGl2ZXJ5Q29uc3RyYWludCAmJiBuZXh0RGVsaXZlcnlEYXRlKSA/IG5ldyBEYXRlKG5leHREZWxpdmVyeURhdGUpIDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKGRhdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtICsgJyAuc2VsZWN0ZWREYXRlVGV4dCcpLnRleHQoZGF0ZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKCcuZGVsaXZlcnlEYXRlUGxhY2UnKS50ZXh0KGRhdGVUZXh0LnJlcGxhY2VBbGwoJy0nLCAnLicpICsgJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0gKyAnIGlucHV0W25hbWU9XCJkZWxpdmVyeURhdGVcIl0nKS52YWwoZGF0ZVRleHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBiZWZvcmVTaG93RGF5OiBtaW5kaWcgYWt0w612IGhhIHZhbiBtdW5rYW5hcHTDoXIgYWRhdCB2YWd5IGhhc0RlbGl2ZXJ5Q29uc3RyYWludFxuICAgICAgICAgICAgZGF0ZXBpY2tlck9wdHMuYmVmb3JlU2hvd0RheSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGVTdHIgPSAkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSgneXktbW0tZGQnLCBkYXRlKTtcblxuICAgICAgICAgICAgICAgIGxldCBob2xpZGF5RW50cnkgPSBob2xpZGF5cy5maW5kKGZ1bmN0aW9uKGgpIHsgcmV0dXJuIGguZGF0ZSA9PT0gZGF0ZVN0cjsgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHdvcmtpbmdEYXlFbnRyeSA9IHdvcmtpbmdEYXlzLmZpbmQoZnVuY3Rpb24odykgeyByZXR1cm4gdy5kYXRlID09PSBkYXRlU3RyOyB9KTtcblxuICAgICAgICAgICAgICAgIGxldCBpc0RlbGl2ZXJ5ID0gaGFzRGVsaXZlcnlDb25zdHJhaW50ICYmIGF2YWlsYWJsZURhdGVzLmluY2x1ZGVzKGRhdGVTdHIpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNzc0NsYXNzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcCA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RhYmxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChob2xpZGF5RW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcy5wdXNoKCd3b3JrLWNhbGVuZGFyLWhvbGlkYXknKTtcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9ICfDnG5uZXBuYXAnICsgKGhvbGlkYXlFbnRyeS5kZXNjcmlwdGlvbiA/ICc6ICcgKyBob2xpZGF5RW50cnkuZGVzY3JpcHRpb24gOiAnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3b3JraW5nRGF5RW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcy5wdXNoKCd3b3JrLWNhbGVuZGFyLXdvcmtpbmctZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSAnw4F0aGVseWV6ZXR0IG11bmthbmFwJyArICh3b3JraW5nRGF5RW50cnkuZGVzY3JpcHRpb24gPyAnOiAnICsgd29ya2luZ0RheUVudHJ5LmRlc2NyaXB0aW9uIDogJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoYXNEZWxpdmVyeUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVsaXZlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXMucHVzaCgnZGVsaXZlcnktZGF5LWF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b29sdGlwKSB0b29sdGlwID0gJ1N6w6FsbMOtdMOhc2kgbmFwJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXMucHVzaCgnZGVsaXZlcnktZGF5LXVuYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvb2x0aXApIHRvb2x0aXAgPSAnTmVtIHN6w6FsbMOtdMOhc2kgbmFwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBIYSDDvG5uZXBuYXAgw6lzIGhhc0RlbGl2ZXJ5Q29uc3RyYWludCBuaW5jcyBiZWthcGNzb2x2YSwgYXogw7xubmVwbmFwIGlzIGxldGlsdGFuZMOzXG4gICAgICAgICAgICAgICAgaWYgKGhvbGlkYXlFbnRyeSAmJiAhaGFzRGVsaXZlcnlDb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NlbGVjdGFibGUsIGNzc0NsYXNzZXMuam9pbignICcpLCB0b29sdGlwXTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtICsgJyAuZGF0ZVBpY2tlcicpLmRhdGVwaWNrZXIoZGF0ZXBpY2tlck9wdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FsbENoYW5nZU9yZGVyVHlwZT1mdW5jdGlvbigpe1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy52YWx1ZSk7XG4gICAgICAgIHJvb3QuaW5pdERhdGVQaWNrZXIodGhpcy52YWx1ZSk7XG4gICAgICAgIC8vZW51bSgnZGFpbHknLCAnd2Vla2x5JylcbiAgICAgICAgLypsZXQgQ1NTU2VsZWN0b3JGb3JtPScub3JkZXJQYXJhbWV0ZXJGb3JtJztcbiAgICAgICAgbGV0IG5vZGU9JChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpO1xuICAgICAgICBpZihub2RlLnZhbCgpLmxlbmd0aDwyKXtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ2lzLXZhbGlkJyk7XG4gICAgICAgICAgICBub2RlLmFkZENsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbm9kZS5hZGRDbGFzcygnaXMtdmFsaWQnKTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgICovXG4gICAgfVxuXG4gICAgdGhpcy5pbml0Vmlld1BhcmFtZXRlcj1mdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdjYWxsIGluaXRWaWV3UGFyYW1ldGVyJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyTG9hZDpmdW5jdGlvbiAoKXt9fSk7XG4gICAgICAgIGxldCBDU1NTZWxlY3RvckZvcm09Jy5vcmRlclBhcmFtZXRlckZvcm0nO1xuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5kYXRlUGlja2VyQ2xpY2snKS5jbGljayhmdW5jdGlvbigpe1xuICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAuZGF0ZVBpY2tlcicpLmRhdGVwaWNrZXIoJ3Nob3cnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAub3JkZXJQYXJhbWV0ZXJEZWxpdmVyeUFkZHJlc3MnKS5zZWxlY3QyKHt9KS5zaG93KCk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1jb250YWN0TmFtZV0nKS5vZmYoJ2JsdXInKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpLm9mZigna2V5dXAnKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dFtuYW1lPWNvbnRhY3ROYW1lXScpLm9uKCdibHVyJyxyb290LmNoZWNrQ29udGFjdE5hbWVGaWVsZCk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1jb250YWN0TmFtZV0nKS5vbigna2V5dXAnLHJvb3QuY2hlY2tDb250YWN0TmFtZUZpZWxkKTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9b3JkZXJUeXBlXScpLm9mZignY2hhbmdlJyk7XG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1vcmRlclR5cGVdJykub24oJ2NoYW5nZScscm9vdC5jYWxsQ2hhbmdlT3JkZXJUeXBlKTtcblxuXG4gICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgLm9yZGVyUGFyYW1ldGVyTmV4dEJ1dHRvbicpLm9mZignY2xpY2snKTtcbiAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydpZCddPjApe1xuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydvcmRlclR5cGUnXT09J3dlZWtseScpe1xuICAgICAgICAgICAgICAgIHJvb3QuaW5pdERhdGVQaWNrZXIoT3JkZXIuZ2V0RGF0YSgpWydvcmRlclR5cGUnXSk7XG4gICAgICAgICAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rXCIgaW5wdXRbbmFtZT1vcmRlclR5cGVdW3ZhbHVlPVwiICsgT3JkZXIuZ2V0RGF0YSgpWydvcmRlclR5cGUnXSArIFwiXVwiKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlID0gbmV3IERhdGUoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeURhdGUnXSk7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZS5zZXREYXRlKGVuZERhdGUuZ2V0RGF0ZSgpICsgNik7XG4gICAgICAgICAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeURhdGUnXSwkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSggJ3l5LW1tLWRkJyxlbmREYXRlKSk7XG4gICAgICAgICAgICAgICAgcm9vdC5pbml0RGF0ZVBpY2tlcignd2Vla2x5Jyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5RGF0ZSddKXtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5zZXREZWxpdmVyeURhdGUoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeURhdGUnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJvb3QuaW5pdERhdGVQaWNrZXIoJ2RhaWx5Jyk7XG4gICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICBpZihPcmRlci5nZXREYXRhKClbJ2NvbnRhY3ROYW1lJ10pe1xuICAgICAgICAgICAgICAgICQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1jb250YWN0TmFtZV0nKS52YWwoT3JkZXIuZ2V0RGF0YSgpWydjb250YWN0TmFtZSddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnbm90ZSddKXtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIHRleHRhcmVhW25hbWU9bm90ZV0nKS52YWwoT3JkZXIuZ2V0RGF0YSgpWydub3RlJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydkZWxpdmVyeUFkZHJlc3NJZCddKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygkKENTU1NlbGVjdG9yRm9ybSsnIHNlbGVjdFtuYW1lPWRlbGl2ZXJ5QWRkcmVzc0lkXScpKTtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIHNlbGVjdFtuYW1lPWRlbGl2ZXJ5QWRkcmVzc0lkXScpLnZhbChPcmRlci5nZXREYXRhKClbJ2RlbGl2ZXJ5QWRkcmVzc0lkJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpWydjdXN0b21Ob3RpZmljYXRpb25FbWFpbCddKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygkKENTU1NlbGVjdG9yRm9ybSsnIHNlbGVjdFtuYW1lPWN1c3RvbU5vdGlmaWNhdGlvbkVtYWlsXScpKTtcbiAgICAgICAgICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIHNlbGVjdFtuYW1lPWN1c3RvbU5vdGlmaWNhdGlvbkVtYWlsXScpLnZhbChPcmRlci5nZXREYXRhKClbJ2N1c3RvbU5vdGlmaWNhdGlvbkVtYWlsJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJvb3QuaW5pdERhdGVQaWNrZXIoJ2RhaWx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSsnIC5vcmRlclBhcmFtZXRlckRlbGl2ZXJ5QWRkcmVzcycpLnNlbGVjdDIoe30pLnNob3coKTtcbiAgICAgICAgJChDU1NTZWxlY3RvckZvcm0rJyAub3JkZXJQYXJhbWV0ZXJDdXN0b21Ob3RpZmljYXRpb25FbWFpbCcpLnNlbGVjdDIoe30pLnNob3coKTtcblxuICAgICAgICAkKENTU1NlbGVjdG9yRm9ybSkuc3VibWl0KGZ1bmN0aW9uKGV2ZW50KXtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICgkKENTU1NlbGVjdG9yRm9ybSlbMF0uY2hlY2tWYWxpZGl0eSgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCd2YWxpZGF0b24gZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgZGVidWcoJ3ZhbGlkYXRvbiBvaycpO1xuICAgICAgICAgICAgICAgIC8vZG8geW91ciBhamF4IHN1Ym1pdGlvbiBoZXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcuZGVsaXZlcnlEYXRlUGxhY2UnKS50ZXh0KCQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1kZWxpdmVyeURhdGVdJykudmFsKCkucmVwbGFjZUFsbCgnLScsJy4nKSsnLicpO1xuXG4gICAgICAgICAgICBPcmRlci5zZXREYXRhKHtcbiAgICAgICAgICAgICAgICBjb250YWN0TmFtZTokKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9Y29udGFjdE5hbWVdJykudmFsKCksXG4gICAgICAgICAgICAgICAgbm90ZTokKENTU1NlbGVjdG9yRm9ybSsnIHRleHRhcmVhW25hbWU9bm90ZV0nKS52YWwoKSxcbiAgICAgICAgICAgICAgICBvcmRlclR5cGU6JChDU1NTZWxlY3RvckZvcm0rJyBpbnB1dDpjaGVja2VkW25hbWU9b3JkZXJUeXBlXScpLnZhbCgpLFxuICAgICAgICAgICAgICAgIGRlbGl2ZXJ5RGF0ZTokKENTU1NlbGVjdG9yRm9ybSsnIGlucHV0W25hbWU9ZGVsaXZlcnlEYXRlXScpLnZhbCgpLFxuICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QWRkcmVzc0lkOiQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9ZGVsaXZlcnlBZGRyZXNzSWRdJykudmFsKCksXG4gICAgICAgICAgICAgICAgZGVsaXZlcnlBZGRyZXNzOiQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9ZGVsaXZlcnlBZGRyZXNzXScpLnZhbCgpLFxuICAgICAgICAgICAgICAgIGN1c3RvbU5vdGlmaWNhdGlvbkVtYWlsOiQoQ1NTU2VsZWN0b3JGb3JtKycgc2VsZWN0W25hbWU9Y3VzdG9tTm90aWZpY2F0aW9uRW1haWxdJykudmFsKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoJ3BhcmFtZXRlciBmb3JtIHN1Ym1pdCcpXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXQ6Y2hlY2tlZFtuYW1lPW9yZGVyVHlwZV0nKS52YWwoKSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCQoQ1NTU2VsZWN0b3JGb3JtKycgaW5wdXRbbmFtZT1kZWxpdmVyeURhdGVdJykudmFsKCkpO1xuICAgICAgICAgICAgZGVidWcoT3JkZXIuZ2V0RGF0YSgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIHJvb3Quc2VuZE9yZGVyRGF0YVRvU2VydmVyKCdwYXJhbWV0ZXInLHJvb3QuYWZ0ZXJPcmRlclNldFBhcmFtZXRlck9rKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG4gICAgdGhpcy5ibGFuaz1mdW5jdGlvbiAoKXt9O1xuICAgIHRoaXMuc2V0UGFyYW1ldGVyQ29tcGxldGVkPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFBhcmFtZXRlckNvbXBsZXRlZCBjYWxsZWQnKTtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOmZ1bmN0aW9uICgpe319KTtcbiAgICAgICAgLy9yb290LmluaXRWaWV3UHJvZHVjdFNlbGVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5iaW5kUm93RmF2b3JpdGVzQWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkKCcuYnV0dG9uSXRlbUZhdm9yaXRlcycpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnLmJ1dHRvbkl0ZW1GYXZvcml0ZXMnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdElkID0gJCh0aGlzKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdElkKTtcblxuICAgICAgICAgICAgbGV0IGFqYXhVcmw9T3B0cy5VUkwudG9nZ2xlRmF2b3JpdGVzLnJlcGxhY2UoJyVpZCUnLHByb2R1Y3RJZCk7XG4gICAgICAgICAgICBsZXQgYWpheERhdGE9e307XG4gICAgICAgICAgICBhamF4RGF0YS5fdG9rZW49T3B0cy50b2tlbjtcbiAgICAgICAgICAgIGxldCBidXR0b249dGhpcztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFqYXhVcmwpO1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IGFqYXhVcmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOidQT1NUJyxcbiAgICAgICAgICAgICAgICBkYXRhOmFqYXhEYXRhLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN1Y2Nlc3Mpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYnV0dG9uKS5hZGRDbGFzcygnYnRuLXdhcm5pbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJ1dHRvbikucmVtb3ZlQ2xhc3MoJ2J0bi1saWdodCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChidXR0b24pLnJlbW92ZUNsYXNzKCdidG4td2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYnV0dG9uKS5hZGRDbGFzcygnYnRuLWxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZhbHNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2J0bi13YXJuaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2J0bi1saWdodCcpO1xuICAgICAgICAgICAgKi9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kUm93RGVzY3JpcHRpb25BY3Rpb249ZnVuY3Rpb24gKCl7XG4gICAgICAgICQoJ3RleHRhcmVhLm9yZGVySXRlbUNvbW1lbnQnKS5vbignY2hhbmdlJyxmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIGxldCBjb21tZW50PSQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdElkPSQodGhpcykuZGF0YSgnaWQnKTtcbiAgICAgICAgICAgIGxldCBwcm9kdWN0Q29tbWVudD1PcmRlci5nZXREYXRhKCdwcm9kdWN0Q29tbWVudCcpO1xuICAgICAgICAgICAgaWYocHJvZHVjdENvbW1lbnQhPT1udWxsKXtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvZHVjdENvbW1lbnRbcHJvZHVjdElkXT09J3VuZGVmaW5lZCcgJiYgY29tbWVudC5sZW5ndGg9PT0wKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZihwcm9kdWN0Q29tbWVudFtwcm9kdWN0SWRdPT09Y29tbWVudCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9kdWN0Q29tbWVudFtwcm9kdWN0SWRdPWNvbW1lbnQ7XG4gICAgICAgICAgICBpZihjb21tZW50Lmxlbmd0aD09PTApe1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBPcmRlci5wcm9kdWN0Q29tbWVudFtwcm9kdWN0SWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT3JkZXIucHJvZHVjdENvbW1lbnQ9cHJvZHVjdENvbW1lbnQ7XG4gICAgICAgICAgICBxdWV1ZUFqYXgucHVzaChEYXRlLm5vdygpKTtcbiAgICAgICAgICAgIHJvb3Quc3luY09yZGVyRGF0YVRvU2VydmVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucHJvZHVjdFNlbGVjdERhdGF0YWJsZXNSb3dGb3JtYXR0ZXI9ZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgLy8gYGRgIGlzIHRoZSBvcmlnaW5hbCBkYXRhIG9iamVjdCBmb3IgdGhlIHJvd1xuICAgICAgICAvKipcbiAgICAgICAgQHRvZG86IGZlbHN6ZWRuaSBlcyB1cGRhdGVsbmkgYXogYWRvdHQgdGVybWVrIG1lbW9qYXQgYXogb3JkZXJiYW5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnNvbGUuZ3JvdXAoJ3Byb2R1Y3RTZWxlY3REYXRhdGFibGVzUm93Rm9ybWF0dGVyJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGQpO1xuICAgICAgICBsZXQgdGVtcGxhdGVEYXRhPWQ7XG4gICAgICAgIHRlbXBsYXRlRGF0YS5jb21tZW50PScnO1xuLy8gICAgICAgIGRlYnVnKE9yZGVyKTtcbiAgICAgICAgaWYoT3JkZXIucHJvZHVjdENvbW1lbnQgJiYgT3JkZXIucHJvZHVjdENvbW1lbnQhPT1udWxsKXtcbiAgICAgICAgICAgIGRlYnVnKHR5cGVvZiBPcmRlci5wcm9kdWN0Q29tbWVudFtkLmlkXSk7XG4gICAgICAgICAgICBpZih0eXBlb2YgT3JkZXIucHJvZHVjdENvbW1lbnRbZC5pZF0hPSd1bmRlZmluZWQnICYmIE9yZGVyLnByb2R1Y3RDb21tZW50W2QuaWRdLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGEuY29tbWVudD1PcmRlci5wcm9kdWN0Q29tbWVudFtkLmlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQHR5cGVkZWYge2Jvb2xlYW59IGQuZmF2b3JpdGVzICovXG4gICAgICAgIGlmKGQuZmF2b3JpdGVzPT09dHJ1ZSl7XG4gICAgICAgICAgICB0ZW1wbGF0ZURhdGEuYnRuRmF2b3JpdGVzQ2xhc3M9J2J0bi13YXJuaW5nJztcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0ZW1wbGF0ZURhdGEuYnRuRmF2b3JpdGVzQ2xhc3M9J2J0bi1saWdodCc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRlbXBsYXRlPSQoJ3RlbXBsYXRlW2RhdGEtbmFtZT1cIm9yZGVyUHJvZHVjdFNlbGVjdERldGFpbHNcIl0nKS5odG1sKClcbiAgICAgICAgdGVtcGxhdGVEYXRhLndlZWtseT1mYWxzZTtcbiAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpLm9yZGVyVHlwZT09PSd3ZWVrbHknKXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS53ZWVrbHk9dHJ1ZTtcbi8qXG5cbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS53ZWVrbHlEYXk9W1xuICAgICAgICAgICAgICAgIHtcImluZGV4XCI6MSxcIm5hbWVcIjpcIkjDqXRmxZFcIn0sXG4gICAgICAgICAgICB7XCJpbmRleFwiOjIsXCJuYW1lXCI6XCJLZWRkXCJ9LFxuICAgICAgICAgICAge1wiaW5kZXhcIjozLFwibmFtZVwiOlwiU3plcmRhXCJ9LFxuICAgICAgICAgICAge1wiaW5kZXhcIjo0LFwibmFtZVwiOlwiQ3PDvHTDtnJ0w7ZrXCJ9LFxuICAgICAgICAgICAge1wiaW5kZXhcIjo1LFwibmFtZVwiOlwiUMOpbnRla1wifSxcbiAgICAgICAgICAgIHtcImluZGV4XCI6NixcIm5hbWVcIjpcIlN6b21iYXRcIn0sXG4gICAgICAgICAgICB7XCJpbmRleFwiOjcsXCJuYW1lXCI6XCJWYXPDoXJuYXBcIn0sXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICB0ZW1wbGF0ZURhdGEud2Vla2x5RGF5PVtcbiAgICAgICAgICAgICAgICB7XCJpbmRleFwiOjIsXCJuYW1lXCI6XCJIw6l0ZsWRXCIgfSxcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6XCJLZWRkXCJ9LFxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjpcIlN6ZXJkYVwifSxcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6XCJDc8O8dMO2cnTDtmtcIn0sXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOlwiUMOpbnRla1wifSxcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6XCJTem9tYmF0XCJ9LFxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjpcIlZhc8Ohcm5hcFwifVxuICAgICAgICAgICAgXTtcbiovXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByb2R1Y3RTZWxlY3RlZD1PcmRlci5nZXREYXRhKCdwcm9kdWN0U2VsZWN0ZWQnKTtcbiAgICAgICAgaWYodHlwZW9mIHByb2R1Y3RTZWxlY3RlZFtkLmlkXSE9J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgdGVtcGxhdGVEYXRhLml0ZW1RdWFudGl0eT1wcm9kdWN0U2VsZWN0ZWRbZC5pZF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coWyd0ZW1wbGF0ZURhdGEnLHRlbXBsYXRlRGF0YV0pO1xuICAgICAgICBsZXQgb2xkVGFncz1NdXN0YWNoZS50YWdzO1xuICAgICAgICBNdXN0YWNoZS50YWdzID0gW1wifiFcIiwgXCIhflwiXTtcbiAgICAgICAgaWYodGVtcGxhdGVEYXRhWydzcGVjaWZpY2F0aW9uJ109PSdmYWxzZScgfHwgdGVtcGxhdGVEYXRhWydzcGVjaWZpY2F0aW9uJ109PWZhbHNlKXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5zcGVjaWZpY2F0aW9uQ2xhc3M9J2Qtbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGVEYXRhLnBpY3R1cmVJbWc9Jyc7XG4gICAgICAgIGlmKHRlbXBsYXRlRGF0YVsncGljdHVyZSddPT0nZmFsc2UnIHx8IHRlbXBsYXRlRGF0YVsncGljdHVyZSddPT1mYWxzZSl7XG4gICAgICAgICAgICB0ZW1wbGF0ZURhdGEucGljdHVyZUNsYXNzPSdkLW5vbmUnO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRlbXBsYXRlRGF0YS5waWN0dXJlSW1nPSc8aW1nIHNyYz0gXCInK3RlbXBsYXRlRGF0YVsncGljdHVyZSddKydcIiBjbGFzcz1cInByb2R1Y3RQaWN0dXJlXCIgPjwvaW1nPic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3RlbXBsYXRlRGF0YScsdGVtcGxhdGVEYXRhKTtcbiAgICAgICAgLy90ZW1wbGF0ZURhdGFbJ2FhX3NwZWNpZmljYXRpb24nXT1mYWxzZTtcbiAgICAgICAgbGV0IHJlbmRlcj1NdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsdGVtcGxhdGVEYXRhKTtcbiAgICAgICAgTXVzdGFjaGUudGFncyA9b2xkVGFncztcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICByZXR1cm4gcmVuZGVyO1xuLypcbnNvbHV0aW9uIGJlZm9yZSB0ZW1wbGF0ZVxuICAgICAgICByZXR1cm4gJzx0YWJsZSBjZWxscGFkZGluZz1cIjVcIiBjZWxsc3BhY2luZz1cIjBcIiBib3JkZXI9XCIwXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6NTBweDtcIj4nK1xuICAgICAgICAgICAgJzx0cj4nK1xuICAgICAgICAgICAgJzx0ZD5JbmZvOjwvdGQ+JytcbiAgICAgICAgICAgICc8dGQ+JytkLm5vdGUrJzwvdGQ+JytcbiAgICAgICAgICAgICc8L3RyPicrXG4gICAgICAgICAgICAnPHRyPicrXG4gICAgICAgICAgICAnPHRkPmhvb3JleWNhIDo8L3RkPicrXG4gICAgICAgICAgICAnPHRkPjxzcGFuIHN0eWxlPVwicGFkZGluZy1yaWdodDogMmVtO1wiPicrZC5ob29yZXljYUlkKyc8L3NwYW4+JyArXG5cbiAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcbicgK1xuICAgICAgICAgICAgJyAgICAgICAgZGF0YS1pZD1cIicrZC5pZCsnXCJcXG4nICtcbiAgICAgICAgICAgICcgICAgICAgIGNsYXNzPVwiYnV0dG9uSXRlbUZhdm9yaXRlcyBidG4gJytidG5GYXZvcml0ZXNDbGFzcysnXCI+XFxuJyArXG4gICAgICAgICAgICAnICAgIDxpIGNsYXNzPVwiYmkgYmktc3Rhci1maWxsIHByLTJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XFxuJyArXG4gICAgICAgICAgICAnICAgIEtlZHZlbmNcXG4nICtcbiAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L3RkPicrXG4gICAgICAgICAgICAnPC90cj4nK1xuICAgICAgICAgICAgLyEqXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHRyPicrXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHRkPkV4dGVuc2lvbiBudW1iZXI6PC90ZD4nK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZD4nK2QuZXh0bisnPC90ZD4nK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvdHI+JytcbiAgICAgICAgICAgICohL1xuICAgICAgICAgICAgJzx0cj4nK1xuICAgICAgICAgICAgJzx0ZD5JbmZvOjwvdGQ+JytcbiAgICAgICAgICAgICc8dGQ+JytkLm5vdGUrJzwvdGQ+JytcbiAgICAgICAgICAgICc8L3RyPicrXG4gICAgICAgICAgICAnPHRyPicrXG4gICAgICAgICAgICAnPHRkPk1lZ2plZ3l6w6lzOjwvdGQ+JytcbiAgICAgICAgICAgICc8dGQ+PHRleHRhcmVhIGNsYXNzPVwib3JkZXJJdGVtQ29tbWVudFwiIGRhdGEtaWQ9XCInK2QuaWQrJ1wiPicrY29tbWVudCsnPC90ZXh0YXJlYT48L3RkPicrXG4gICAgICAgICAgICAnPC90cj4nK1xuICAgICAgICAgICAgLyEqXG4gICAgICAgICAgICAqIS9cbiAgICAgICAgICAgICc8L3RhYmxlPic7XG4qL1xuICAgIH1cblxuICAgIHRoaXMuc2V0RGF0YXRhYmxlSGVhZGVyVGV4dD1mdW5jdGlvbih0ZXh0KXtcbiAgICAgICAgJCgnLnRhYmxlSGVhZGVyVGV4dCcpLnRleHQodGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRUcmVlUGF0aE5hbWU9ZnVuY3Rpb24gKG5vZGUpe1xuICAgICAgICBsZXQgcmVzPScnO1xuICAgICAgICBsZXQgaXRlbXM9JChub2RlKS5wYXJlbnRzKCdsaScpLnRvQXJyYXkoKTtcbiAgICAgICAgaXRlbXMuc2hpZnQoKTtcbiAgICAgICAgaXRlbXMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCQoaXRlbXNbaXRlbV0pLmNoaWxkcmVuKCdhLmNhdGVnb3J5SXRlbScpKTtcbiAgICAgICAgICAgIGlmKCQoaXRlbXNbaXRlbV0pLmNoaWxkcmVuKCdhLmNhdGVnb3J5SXRlbScpLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICByZXMrPSQoaXRlbXNbaXRlbV0pLmNoaWxkcmVuKCdhLmNhdGVnb3J5SXRlbScpLnRleHQoKSsnLydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXMrPSQobm9kZSkudGV4dCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZFByb2R1Y3RHcm91cD1udWxsO1xuICAgIGxldCBkYXRhVGFibGVTZWFyY2hTdHI9bnVsbDtcbiAgICBsZXQgZGF0YVRhYmxlU2VhcmNoS3JlbD1mYWxzZTtcblxuICAgIHRoaXMuc2VhcmNoUHJvZHVjdEJ5U3RyaW5nPWZ1bmN0aW9uIChmaWx0ZXJTdHIpe1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJ1Rlcm3DqWtlayBzesWxcnZlOicrZmlsdGVyU3RyKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPWZpbHRlclN0cjtcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja1NlYXJjaFByb2R1Y3Q9ZnVuY3Rpb24gKCl7XG4gICAgICAgIGRlYnVnKHRoaXMpO1xuICAgICAgICBsZXQgZmlsdGVyU3RyPSQoJy5zaWRlYmFyLXNlYXJjaCBpbnB1dFtuYW1lPXNlYXJjaFZhbHVlXScpLnZhbCgpXG4gICAgICAgIGRlYnVnKGZpbHRlclN0cik7XG4gICAgICAgIHJvb3Quc2VhcmNoUHJvZHVjdEJ5U3RyaW5nKGZpbHRlclN0cik7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja0Zhdm9yaXRlc1Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdjbGlja0Zhdm9yaXRlc1Byb2R1Y3QnKTtcbiAgICAgICAgcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZToga2VkdmVuY2VrJyk7XG4gICAgICAgIGRhdGFUYWJsZVNlYXJjaFN0cj0nKipmYXZvcml0ZXMqKic7XG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgIH1cbiAgICB0aGlzLmNsaWNrT2Z0ZW5Qcm9kdWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygnY2xpY2tPZnRlblByb2R1Y3QnKTtcbiAgICAgICAgcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZTogZ3lha3JhbiB2w6Fzw6Fyb2x0Jyk7XG4gICAgICAgIGRhdGFUYWJsZVNlYXJjaFN0cj0nKipvZnRlbioqJztcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja1NwZWNpYWxPZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrU3BlY2lhbE9mZmVyJyk7XG4gICAgICAgIHJvb3Quc2V0RGF0YXRhYmxlSGVhZGVyVGV4dCgnVGVybcOpa2VrIHN6xbFydmU6IEFrY2nDs3MgdGVybcOpa2VrJyk7XG4gICAgICAgIGRhdGFUYWJsZVNlYXJjaFN0cj0nKipzcGVjaWFsT2ZmZXIqKic7XG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgIH1cblxuXG5cblxuICAgIHRoaXMuY2xpY2tMYXN0UHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVidWcoJ2NsaWNrTGFzdFByb2R1Y3QnKTtcbiAgICAgICAgcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZTogdXRvbGrDoXJhIHbDoXPDoXJvbHQnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPScqKmxhc3QqKic7XG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuXG4gICAgfVxuXG4gICAgdGhpcy5jbGlja1dlZWtseVByb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdjbGlja1dlZWtseVByb2R1Y3QnKTtcbiAgICAgICAgcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZTogSGV0aSB0ZXJtw6lrZWsnKTtcbiAgICAgICAgZGF0YVRhYmxlU2VhcmNoU3RyPScqKndlZWtseSoqJztcbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrS3JlbFByb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdjbGlja0tyZWxQcm9kdWN0Jyk7XG4gICAgICAgIC8vcm9vdC5zZXREYXRhdGFibGVIZWFkZXJUZXh0KCdUZXJtw6lrZWsgc3rFsXJ2ZTogSGV0aSB0ZXJtw6lrZWsnKTtcbiAgICAgICAgLy9kYXRhVGFibGVTZWFyY2hTdHI9Jyoqd2Vla2x5KionO1xuICAgICAgICAvLyQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdrcmVsQWN0aXZlJyk7XG4gICAgICAgIGRhdGFUYWJsZVNlYXJjaEtyZWw9IWRhdGFUYWJsZVNlYXJjaEtyZWw7XG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMucHJvZHVjdFNlbGVjdERhdGFUYWJsZUNvbHVtbkRlZnM9ZnVuY3Rpb24gKCl7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XCJ3aWR0aFwiOiBcIjEwcHhcIiwgXCJ0YXJnZXRzXCI6IDAgfSxcbiAgICAgICAgICAgIHsgXCJjbGFzc05hbWVcIjogXCJkdC1sZWZ0XCIsIFwidGFyZ2V0c1wiOiAxIH0sXG4vLyAgICAgICAgICAgICAgICB7IFwid2lkdGhcIjogXCIxMjBweFwiLCBcInRhcmdldHNcIjogMSB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiMjhweFwiLCBcInRhcmdldHNcIjogMiB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNDFweFwiLCBcInRhcmdldHNcIjogMyB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNzZweFwiLCBcInRhcmdldHNcIjogNCB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNTVweFwiLCBcInRhcmdldHNcIjogNSB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNzBweFwiLCBcInRhcmdldHNcIjogNiB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNTRweFwiLCBcInRhcmdldHNcIjogNyB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNTdweFwiLCBcInRhcmdldHNcIjogOCB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiNDJweFwiLCBcInRhcmdldHNcIjogOSB9LFxuICAgICAgICAgICAgeyBcIndpZHRoXCI6IFwiMTAwcHhcIiwgXCJ0YXJnZXRzXCI6IDEwfSxcbiAgICAgICAgICAgIHtcImNsYXNzTmFtZVwiOiBcImR0LWNlbnRlclwiLCBcInRhcmdldHNcIjogXCJfYWxsXCJ9LFxuICAgICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnByb2R1Y3RTZWxlY3REYXRhVGFibGVDb2x1bW49ZnVuY3Rpb24gKCl7XG4gICAgICAgIGxldCBjb2x1bW5EYXRhPVtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcImNsYXNzTmFtZVwiOiAgICAgICdkZXRhaWxzLWNvbnRyb2wnLFxuICAgICAgICAgICAgICAgIFwib3JkZXJhYmxlXCI6ICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6ICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIFwiZGVmYXVsdENvbnRlbnRcIjogJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IFwiZGF0YVwiOiBcIm5hbWVcIiB9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJrcmVsXCIgfSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwicGFja2luZ1wifSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwidW5pdFZhbHVlXCIgfSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwicHJvZHVjdFVuaXRcIn0sXG4gICAgICAgICAgICB7IFwiZGF0YVwiOiBcInNlbGxlclVuaXRcIiB9LFxuICAgICAgICAgICAgeyBcImRhdGFcIjogXCJ1bml0TXVsdGlwbGllclwifSxcbiAgICAgICAgICAgIHsgXCJkYXRhXCI6IFwiYW1vdW50VW5pdFwiIH0sXG4gICAgICAgICAgICB7IFwiZGF0YVwiOiBcInByaWNlXCIgfSxcblxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCBhY3Rpb25Db2x1bW49eyAgICAgICAgICAgICAgICBcImNsYXNzTmFtZVwiOiAgICAgICdkZXRhaWxzLWNvbnRyb2wyJyxcbiAgICAgICAgICAgIFwib3JkZXJhYmxlXCI6ICAgICAgZmFsc2UsXG4gICAgICAgICAgICBcImRhdGFcIjogICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBcIndpZHRoXCI6IFwiMTAwcHhcIixcbiAgICAgICAgICAgIFwiZGVmYXVsdENvbnRlbnRcIjonJ1xuICAgICAgICB9O1xuICAgICAgICBpZihPcmRlci5nZXREYXRhKCdvcmRlclR5cGUnKT09J2RhaWx5Jyl7XG4gICAgICAgICAgICBhY3Rpb25Db2x1bW4ucmVuZGVyID0gZnVuY3Rpb24gKGRhdGEsIHR5cGUsIHJvdykge1xuICAgICAgICAgICAgICAgIGlmIChyb3cuc3RvY2tfc3RhdHVzID09PSAnb3V0X29mX3N0b2NrJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxpbWcgc3JjPVwiL2ltYWdlcy9pY29ucy9kZXRhaWxzX2Nsb3NlLnBuZ1wiIHRpdGxlPVwiTmluY3MgcmFrdMOhcm9uXCIgc3R5bGU9XCJ3aWR0aDogMjRweDtcIj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJzxpbnB1dCB0eXBlPVwibnVtYmVyXCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjk5OTlcIiBzdGVwPVwiMVwiIGRhdGEtZGVjaW1hbHM9XCIxXCIgIGNsYXNzPVwiZm9ybS1jb250cm9sLXNtIGlucHV0TnVtYmVyU3Bpbm5lclwiIHN0eWxlPVwid2lkdGg6IDFlbTtcIi8+JztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uRGF0YS5wdXNoKGFjdGlvbkNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW5EYXRhO1xuICAgIH1cbiAgICB0aGlzLmdldERhdGF0YWJsZXM9ZnVuY3Rpb24gKG9yZGVyVHlwZSl7XG4gICAgICAgIGNvbnNvbGUuZXJyb3Iob3JkZXJUeXBlKTtcbiAgICAgICAgdmFyIHRhYmxlID0gJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgge1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgICAgICAgICB1cmw6ICcvL2Nkbi5kYXRhdGFibGVzLm5ldC9wbHVnLWlucy8xLjEwLjI0L2kxOG4vSHVuZ2FyaWFuLmpzb24nXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvL1wiYWpheFwiOiBcInt7YXNzZXQoJ2V4YXBtbGUyLmpzb24nKX19XCIsXG4gICAgICAgICAgICBcImFqYXhcIjoge1xuICAgICAgICAgICAgICAgIHVybDpPcHRzLlVSTC5nZXREYXRhVGFibGVDb250ZW50UHJvZHVjdExpc3QsXG4gICAgICAgICAgICAgICAgZGF0YTpmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnNlYXJjaFN0cj1kYXRhVGFibGVTZWFyY2hTdHI7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEua3JlbD1kYXRhVGFibGVTZWFyY2hLcmVsO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmdyb3VwSWQ9c2VsZWN0ZWRQcm9kdWN0R3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc3VwcGxpZXJJZD1PcmRlci5zdXBwbGllcklkO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmRlbGl2ZXJ5RGF0ZT1PcmRlci5kZWxpdmVyeURhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICAgICAgICBidXR0b25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY29sdW1uRGVmc1wiOiByb290LnByb2R1Y3RTZWxlY3REYXRhVGFibGVDb2x1bW5EZWZzKCksXG4gICAgICAgICAgICBcImNvbHVtbnNcIjogcm9vdC5wcm9kdWN0U2VsZWN0RGF0YVRhYmxlQ29sdW1uKCksXG4gICAgICAgICAgICBcIm9yZGVyXCI6IFtbMSwgJ2FzYyddXSxcbiAgICAgICAgfSApO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0U2VsZWN0RGF0YVRhYmxlRHJhd0RUPWZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vZGVidWcoICdUYWJsZSBkcmF3IGNvbXBsZXRlOiAnK25ldyBEYXRlKCkuZ2V0VGltZSgpICk7XG5cbiAgICAgICAgLy8kKCd0ZDpjb250YWlucyhcIipcIiknKS5odG1sKCc8aSBjbGFzcz1cImJpIGJpLWNoZWNrLWNpcmNsZS1maWxsXCI+PC9pPicpO1xuICAgICAgICAkKFwidGRcIikuZmlsdGVyKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzKS50ZXh0KCkgPT09ICcqJztcbiAgICAgICAgfSkuaHRtbCgnPGkgY2xhc3M9XCJiaSBiaS1jaGVjay1jaXJjbGUtZmlsbFwiPjwvaT4nKTtcbiAgICAgICAgaWYoT3JkZXIuZ2V0RGF0YSgpLm9yZGVyVHlwZT09J2RhaWx5Jyl7XG4gICAgICAgICAgICAkKFwiaW5wdXRbdHlwZT0nbnVtYmVyJ10uaW5wdXROdW1iZXJTcGlubmVyXCIpLmlucHV0U3Bpbm5lcih7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6XG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgJHtncm91cENsYXNzfVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBzdHlsZT1cIm1pbi13aWR0aDogJHtidXR0b25zV2lkdGh9XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWNyZW1lbnQgJHtidXR0b25zQ2xhc3N9XCIgdHlwZT1cImJ1dHRvblwiPiR7ZGVjcmVtZW50QnV0dG9ufTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAvLyc8aW5wdXQgdHlwZT1cInRleHRcIiBpbnB1dG1vZGU9XCJkZWNpbWFsXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiAke3RleHRBbGlnbn1cIiBjbGFzcz1cInByb2R1Y3RRdWFudGl0eSBmb3JtLWNvbnRyb2xcIi8+JyArXG4gICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBzdGVwPVwiMC4xXCIgZGF0YS1kZWNpbWFscz1cIjJcIiBzdHlsZT1cInRleHQtYWxpZ246ICR7dGV4dEFsaWdufVwiIGNsYXNzPVwicHJvZHVjdFF1YW50aXR5IGZvcm0tY29udHJvbFwiLz4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gc3R5bGU9XCJtaW4td2lkdGg6ICR7YnV0dG9uc1dpZHRofVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taW5jcmVtZW50ICR7YnV0dG9uc0NsYXNzfVwiIHR5cGU9XCJidXR0b25cIj4ke2luY3JlbWVudEJ1dHRvbn08L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicsXG4gICAgICAgICAgICAgICAgYnV0dG9uc1dpZHRoOiBcIjAuNXJlbVwiLFxuICAgICAgICAgICAgICAgIGdyb3VwQ2xhc3M6IFwiXCIsIC8vIGNzcyBjbGFzcyBvZiB0aGUgcmVzdWx0aW5nIGlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgYnV0dG9uc0NsYXNzOiBcImJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5iaW5kV2Vha1VzZXJIZWxwZXIoKTtcbiAgICAgICAgLypcbiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBjaGFuZ2Ugb3JkZXIgcXVhbnRpdHlcbiAgICAgICAgICovXG4gICAgICAgICQoXCIuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0IC5kZXRhaWxzLWNvbnRyb2wyIGlucHV0W3R5cGU9dGV4dF1cIikub2ZmKCdjaGFuZ2UnKTtcbiAgICAgICAgJChcIi5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgLmRldGFpbHMtY29udHJvbDIgaW5wdXRbdHlwZT10ZXh0XVwiKS5vbignY2hhbmdlJyxmdW5jdGlvbiAoZSl7XG4gICAgICAgICAgICBsZXQgcXVhbnRpdHk9JCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIHF1YW50aXR5PXF1YW50aXR5LnJlcGxhY2UoJywnLCcuJyk7XG4gICAgICAgICAgICBxdWFudGl0eT1wYXJzZUZsb2F0KHF1YW50aXR5KTtcbiAgICAgICAgICAgIGxldCByb3dEYXRhPSQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5yb3coJCh0aGlzKS5jbG9zZXN0KCd0cicpKS5kYXRhKCk7XG4gICAgICAgICAgICByb290Lm9yZGVySXRlbXNDaGFuZ2Uocm93RGF0YSxxdWFudGl0eSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJChcIi5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QgLmRldGFpbHMtY29udHJvbDIgaW5wdXRbdHlwZT10ZXh0XVwiKS5lYWNoKGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgLy9kZWJ1ZygnZXogYSBmdW5jdGlvbjInKVxuICAgICAgICAgICAgbGV0IHF1YW50aXR5PSQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBsZXQgcm93RGF0YT0kKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkucm93KCQodGhpcykuY2xvc2VzdCgndHInKSkuZGF0YSgpO1xuXG4gICAgICAgICAgICBpZihPcmRlci5wcm9kdWN0U2VsZWN0ZWRbcm93RGF0YS5pZF0pe1xuICAgICAgICAgICAgICAgIGRlYnVnKHJvd0RhdGEpO1xuICAgICAgICAgICAgICAgIGRlYnVnKCQoJCh0aGlzKS5jbG9zZXN0KCd0cicpLmZpbmQoJ2lucHV0W3R5cGU9bnVtYmVyXScpWzBdKSk7XG4gICAgICAgICAgICAgICAgZGVidWcoT3JkZXIucHJvZHVjdFNlbGVjdGVkW3Jvd0RhdGEuaWRdKTtcbiAgICAgICAgICAgICAgICBsZXQgcXVhbnRpdHlDdXJyZW50PU9yZGVyLnByb2R1Y3RTZWxlY3RlZFtyb3dEYXRhLmlkXTtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgcXVhbnRpdHlDdXJyZW50IT0nc3RyaW5nJyl7XG4gICAgICAgICAgICAgICAgICAgIHF1YW50aXR5Q3VycmVudCs9Jyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQoJCh0aGlzKS5jbG9zZXN0KCd0cicpLmZpbmQoJ2lucHV0W3R5cGU9bnVtYmVyXScpWzBdKS52YWwocXVhbnRpdHlDdXJyZW50LnJlcGxhY2UoJywnLCcuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgICQoXCIuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0IC5kZXRhaWxzLWNvbnRyb2wyIGJ1dHRvblwiKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoXCIuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0IC5kZXRhaWxzLWNvbnRyb2wyIGJ1dHRvblwiKS5vbignY2xpY2snLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGRlYnVnKCcuZGV0YWlscy1jb250cm9sMiBidXR0b24gY2xpY2sgJylcbiAgICAgICAgICAgIC8vIGRlYnVnKHRoaXMpO1xuICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5maW5kKCdpbnB1dFt0eXBlPXRleHRdJykudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdGhpcy5pbml0Vmlld1Byb2R1Y3RTZWxlY3Q9ZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZnVuY3Rpb25OYW1lPSdpbml0Vmlld1Byb2R1Y3RTZWxlY3QnO1xuICAgICAgICBjb25zb2xlLmxvZyhmdW5jdGlvbk5hbWUrJyBjYWxsZWQnKTtcbiAgICAgICAgaWYodmlld0luaWNpYWxpemVkLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZSkpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vZGVidWcoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocm9vdCkpO1xuICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQoJycpO1xuICAgICAgICByb290LlN0ZXBwZXIuc2V0T3B0cyh7b25BZnRlckFjdGl2YXRlOmZ1bmN0aW9uICgpe319KTtcbiAgICAgICAgLy9Abm90ZTogYmUga2VsbCBrYXBjc29sbmkgYXogZWxvbmV6ZXRldFxuICAgICAgICByb290LlN0ZXBwZXIuYWRkQ29tcGxldGVkKCdpbnZvaWNlJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5hZGRFbmFibGVkKCdpbnZvaWNlJyk7XG4gICAgICAgIGxldCBDU1NTZWxlY3RvckZvcm09Jy5vcmRlclBhcmFtZXRlckZvcm0nO1xuICAgICAgICAvL2NvbnNvbGUubG9nKE9wdHMuVVJMLmdldERhdGFUYWJsZUNvbnRlbnRQcm9kdWN0TGlzdCk7Y2hhbmdlXG4gICAgICAgIGRlYnVnKChDU1NTZWxlY3RvckZvcm0rJyAuZmEtc2VhcmNoJykpO1xuXG4gICAgICAgICQoJy5zaWRlYmFyLXNlYXJjaCAuZmEtc2VhcmNoJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCcuc2lkZWJhci1zZWFyY2ggLmZhLXNlYXJjaCcpLm9uKCdjbGljaycscm9vdC5jbGlja1NlYXJjaFByb2R1Y3QpO1xuXG4gICAgICAgICQoJ2Euc2lkZWJhci5mYXZvcml0ZXMnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ2Euc2lkZWJhci5mYXZvcml0ZXMnKS5vbignY2xpY2snLHJvb3QuY2xpY2tGYXZvcml0ZXNQcm9kdWN0KTtcblxuICAgICAgICAkKCdhLnNpZGViYXIub2Z0ZW4nKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ2Euc2lkZWJhci5vZnRlbicpLm9uKCdjbGljaycscm9vdC5jbGlja09mdGVuUHJvZHVjdCk7XG5cbiAgICAgICAgJCgnYS5zaWRlYmFyLmxhc3QnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ2Euc2lkZWJhci5sYXN0Jykub24oJ2NsaWNrJyxyb290LmNsaWNrTGFzdFByb2R1Y3QpO1xuXG4gICAgICAgICQoJ2Euc2lkZWJhci53ZWVrbHknKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJ2Euc2lkZWJhci53ZWVrbHknKS5vbignY2xpY2snLHJvb3QuY2xpY2tXZWVrbHlQcm9kdWN0KTtcblxuICAgICAgICAkKCdhLnNpZGViYXIua3JlbCcpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLmtyZWwnKS5vbignY2xpY2snLHJvb3QuY2xpY2tLcmVsUHJvZHVjdCk7XG5cbiAgICAgICAgJCgnYS5zaWRlYmFyLnNwZWNpYWxPZmZlcicpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnYS5zaWRlYmFyLnNwZWNpYWxPZmZlcicpLm9uKCdjbGljaycscm9vdC5jbGlja1NwZWNpYWxPZmZlcik7XG5cblxuICAgICAgICAkKCcuc2lkZWJhci1zZWFyY2ggaW5wdXRbbmFtZT1zZWFyY2hWYWx1ZV0nKS5vZmYoJ2tleXByZXNzJyk7XG4gICAgICAgICQoJy5zaWRlYmFyLXNlYXJjaCBpbnB1dFtuYW1lPXNlYXJjaFZhbHVlXScpLm9uKCdrZXlwcmVzcycsZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIGV2ZW50LndoaWNoID09IDEzICkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZigkKHRoaXMpLnZhbCgpLmxlbmd0aD49Mil7XG4gICAgICAgICAgICAgICAgcm9vdC5zZWFyY2hQcm9kdWN0QnlTdHJpbmcoJCh0aGlzKS52YWwoKStldmVudC5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgJCgnLnNpZGViYXItd3JhcHBlciAuc2lkZWJhci1tZW51IC5zaWRlYmFyLWRyb3Bkb3duIC5zaWRlYmFyLXN1Ym1lbnUgbGkgYS5jYXRlZ29yeUl0ZW0uY2xpY2thYmxlJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCcuc2lkZWJhci13cmFwcGVyIC5zaWRlYmFyLW1lbnUgLnNpZGViYXItZHJvcGRvd24gLnNpZGViYXItc3VibWVudSBsaSBhLmNhdGVnb3J5SXRlbS5jbGlja2FibGUnKS5vbignY2xpY2snLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBncm91cElkPSQodGhpcykuZGF0YSgnaWQnKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RHcm91cD1ncm91cElkO1xuICAgICAgICAgICAgICAgIGRhdGFUYWJsZVNlYXJjaFN0cj1udWxsO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGdyb3VwSWQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJvb3QuZ2V0VHJlZVBhdGhOYW1lKHRoaXMpKTtcbiAgICAgICAgICAgICAgICByb290LnNldERhdGF0YWJsZUhlYWRlclRleHQocm9vdC5nZXRUcmVlUGF0aE5hbWUodGhpcykpO1xuLypcbiAgICAgICAgICAgICAgICBsZXQgYWpheERhdGE9e1xuICAgICAgICAgICAgICAgICAgICAnZ3JvdXBJZCc6Z3JvdXBJZCxcbiAgICAgICAgICAgICAgICAgICAgJ3N1cHBsaWVyX2lkJzpPcmRlci5zdXBwbGllcklkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8kKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0JykuRGF0YVRhYmxlKCkuYWpheC5kYXRhKGFqYXhEYXRhKS5sb2FkKCk7XG5cbiovXG4vKlxuICAgICAgICAgICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmdldERhdGFUYWJsZUNvbnRlbnRQcm9kdWN0TGlzdCsnP2dyb3VwSWQ9Jytncm91cElkKycmc3VwcGxpZXJfaWQ9JytPcmRlci5zdXBwbGllcklkO1xuICAgICAgICAgICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnVybChhamF4VXJsKS5sb2FkKCk7XG4qL1xuICAgICAgICAgICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICBsZXQgdGFibGUgPSByb290LmdldERhdGF0YWJsZXMoT3JkZXIuZ2V0RGF0YSgnb3JkZXJUeXBlJykpO1xuXG4gICAgICAgICQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5vbiggJ2luaXQuZHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyggJ1RhYmxlIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlOiAnK25ldyBEYXRlKCkuZ2V0VGltZSgpICk7XG4gICAgICAgIH0gKS5kYXRhVGFibGUoKTtcblxuXG5cbiAgICAgICAgJCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLm9uKCAnZHJhdy5kdCcscm9vdC5wcm9kdWN0U2VsZWN0RGF0YVRhYmxlRHJhd0RUKS5kYXRhVGFibGUoKTtcblxuICAgICAgICAvLyQoJy5kYXRhVGFibGVPcmRlclByb2R1Y3RTZWxlY3QnKS5vbiggJ2RyYXcuZHQnLCAgKS5kYXRhVGFibGUoKTtcblxuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0Jykub24oICd4aHIuZHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkZWJ1ZyggJ1RhYmxlIHhociBjb21wbGV0ZTogJytuZXcgRGF0ZSgpLmdldFRpbWUoKSApO1xuICAgICAgICB9ICkuZGF0YVRhYmxlKCk7XG5cbiAgICAgICAgLy8kKFwiaW5wdXRbdHlwZT0nbnVtYmVyJ10uaW5wdXROdW1iZXJTcGlubmVyXCIpLmlucHV0U3Bpbm5lcigpO1xuXG4vKlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIEFkZCBldmVudCBsaXN0ZW5lciBmb3Igb3BlbmluZyBhbmQgY2xvc2luZyBkZXRhaWxzXG4gKi9cblxuICAgICAgICAkKCcuZGF0YVRhYmxlT3JkZXJQcm9kdWN0U2VsZWN0IHRib2R5Jykub24oJ2NsaWNrJywgJ3RkLmRldGFpbHMtY29udHJvbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ciA9ICQodGhpcykuY2xvc2VzdCgndHInKTtcbiAgICAgICAgICAgIGxldCByb3cgPSB0YWJsZS5yb3coIHRyICk7XG5cbiAgICAgICAgICAgIGlmICggcm93LmNoaWxkLmlzU2hvd24oKSApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJvdyBpcyBhbHJlYWR5IG9wZW4gLSBjbG9zZSBpdFxuICAgICAgICAgICAgICAgIHJvdy5jaGlsZC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgdHIucmVtb3ZlQ2xhc3MoJ3Nob3duJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPcGVuIHRoaXMgcm93XG4gICAgICAgICAgICAgICAgcm93LmNoaWxkKCByb290LnByb2R1Y3RTZWxlY3REYXRhdGFibGVzUm93Rm9ybWF0dGVyKHJvdy5kYXRhKCkpICkuc2hvdygpO1xuICAgICAgICAgICAgICAgIHRyLmFkZENsYXNzKCdzaG93bicpO1xuICAgICAgICAgICAgICAgIHJvb3QuYmluZFByb2R1Y3REZXRhaWxzQWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gKTtcbiAgICAgICAgdmlld0luaWNpYWxpemVkLnB1c2goZnVuY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRQcm9kdWN0RGV0YWlsc0FjdGlvbj1mdW5jdGlvbiAoKXtcbiAgICAgICAgcm9vdC5iaW5kUm93RGVzY3JpcHRpb25BY3Rpb24oKTtcbiAgICAgICAgcm9vdC5iaW5kUm93RmF2b3JpdGVzQWN0aW9uKCk7XG4gICAgICAgIGlmKE9yZGVyLmdldERhdGEoKVsnb3JkZXJUeXBlJ109PSd3ZWVrbHknKXtcbiAgICAgICAgICAgIHJvb3QuYmluZE9yZGVySXRlbVdlZWtRdWFudGl0eSgpO1xuICAgICAgICB9XG4gICB9XG5cbiAgICB0aGlzLmJpbmRXZWFrVXNlckhlbHBlcj1mdW5jdGlvbiAoKXtcbiAgICAgICAgJCggXCJpbnB1dC5pbnB1dE51bWJlclNwaW5uZXJcIiApLm9mZiggXCJmb2N1c1wiKTtcbiAgICAgICAgJCggXCJpbnB1dC5pbnB1dE51bWJlclNwaW5uZXJcIiApLm9uKCBcImZvY3VzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbGV0IHF1YW50aXR5PSQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBxdWFudGl0eT1xdWFudGl0eS5yZXBsYWNlKCcsJywnLicpO1xuICAgICAgICAgICAgcXVhbnRpdHk9cGFyc2VGbG9hdChxdWFudGl0eSk7XG4gICAgICAgICAgICBpZihxdWFudGl0eT09PTApe1xuICAgICAgICAgICAgICAgICQodGhpcykudmFsKCcnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgJCggXCJpbnB1dFt0eXBlPXRleHRdLmlucHV0TnVtYmVyU3Bpbm5lclwiICkub2ZmKCBcImtleXByZXNzXCIpO1xuICAgICAgICAkKCBcImlucHV0W3R5cGU9dGV4dF0uaW5wdXROdW1iZXJTcGlubmVyXCIgKS5vbiggXCJrZXlwcmVzc1wiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKCBldmVudC53aGljaCA9PSAxMyApIHtcbi8vICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2VudGVyIHByZXNzZWQnKTtcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsSXRlbT10aGlzO1xuICAgICAgICAgICAgICAgIGxldCBpdGVtcz0kKCBcImlucHV0W3R5cGU9dGV4dF0uaW5wdXROdW1iZXJTcGlubmVyXCIgKTtcbiAgICAgICAgICAgICAgICBpdGVtcy5lYWNoKGZ1bmN0aW9uIChpdGVtKXtcbi8vICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcz09YWN0dWFsSXRlbSl7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtKzE8PWl0ZW1zLmxlbmd0aCl7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGl0ZW1zW2l0ZW0rMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbXNbaXRlbSsxXSkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRPcmRlckl0ZW1XZWVrUXVhbnRpdHk9ZnVuY3Rpb24gKCl7XG4gICAgICAgICQoXCJpbnB1dC5wcm9kdWN0U2VsZWN0RGF5UXVhbnRpdHlcIikub2ZmKCdjaGFuZ2UnKTtcbiAgICAgICAgJChcImlucHV0LnByb2R1Y3RTZWxlY3REYXlRdWFudGl0eVwiKS5vbignY2hhbmdlJyxmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygkKHRoaXMpLmRhdGEoJ2RheWluZGV4JykpO1xuXG4gICAgICAgICAgICBsZXQgcm93RGF0YT1udWxsO1xuICAgICAgICAgICAgbGV0IHJvd05vZGU9JCgkKHRoaXMpLmNsb3Nlc3QoJ3RhYmxlLm9yZGVyUHJvZHVjdFNlbGVjdFJvd0RldGFpbHNUYWJsZScpLmNsb3Nlc3QoJ3RyJykpLnByZXYoKTtcbiAgICAgICAgICAgIHJvd0RhdGE9JCgnLmRhdGFUYWJsZU9yZGVyUHJvZHVjdFNlbGVjdCcpLkRhdGFUYWJsZSgpLnJvdyhyb3dOb2RlKS5kYXRhKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyb3dEYXRhKTtcbiAgICAgICAgICAgIGxldCBxdWFudGl0eT0kKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgcXVhbnRpdHk9cXVhbnRpdHkucmVwbGFjZSgnLCcsJy4nKTtcbiAgICAgICAgICAgIHF1YW50aXR5PXBhcnNlRmxvYXQocXVhbnRpdHkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocm93RGF0YS5pZCk7XG4gICAgICAgICAgICByb290Lm9yZGVySXRlbXNDaGFuZ2Uocm93RGF0YSxxdWFudGl0eSwkKHRoaXMpLmRhdGEoJ2RheWluZGV4JykpO1xuLy8gICAgICAgICAgICByb290Lm9yZGVySXRlbXNDaGFuZ2VcbiAgICAgICAgICAgIC8vb3JkZXJJdGVtc0NoYW5nZVxuICAgICAgICAgICAgLy9xdWFudGl0eVsxNjgzXVsxXVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMuYWZ0ZXJTeW5jT3JkZXJEYXRhVG9TZXJ2ZXI9ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgLy9yb290LnRvZ2dsZUVuYWJsZVNlbmQoKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbW9zdCB2ZWd6ZXR0LiBlbm55aXQga2lzemVkJytiYXRjaE51bSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDxxdWV1ZUFqYXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzaGlmdGVsJylcbiAgICAgICAgICAgIHF1ZXVlQWpheC5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlbWFpbmluZyBsZWZ0ICcrcXVldWVBamF4Lmxlbmd0aCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHN5bmNEb2luZz1mYWxzZTtcbiAgICAgICAgICAgIHJvb3Quc3luY09yZGVyRGF0YVRvU2VydmVyKCk7XG4gICAgICAgIH0sIE9wdHMuZGF0YVN5bmNQYXVzZVRpbWUpO1xuICAgIH1cbiAgICBsZXQgcXVldWVBamF4PVtdO1xuICAgIGxldCBzeW5jRG9pbmc9ZmFsc2U7XG5cbiAgICB0aGlzLnN5bmNPcmRlckRhdGFUb1NlcnZlcj1mdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vZGVidWcocXVldWVBamF4KTtcbiAgICAgICAgaWYoc3luY0RvaW5nKXtcbiAgICAgICAgICAgIC8vZGVidWcoJ3N5bmMgaW4gcHJvZ3Jlc3MuLi4uJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYocXVldWVBamF4Lmxlbmd0aDwxKXtcbiAgICAgICAgICAgIHJldHVybiA7XG4gICAgICAgIH1cbiAgICAgICAgc3luY0RvaW5nPXRydWU7XG5cbiAgICAgICAgcm9vdC5zZW5kT3JkZXJEYXRhVG9TZXJ2ZXIoJ3Byb2R1Y3RTZWxlY3QnLHJvb3QuYWZ0ZXJTeW5jT3JkZXJEYXRhVG9TZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIHRoaXMub3JkZXJJdGVtc0NoYW5nZT1mdW5jdGlvbihJdGVtRGF0YSxxdWFudGl0eSxkYXlJbmRleCl7XG5cbi8qXG4gICAgICAgIGRlYnVnKCctLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICBkZWJ1ZyhJdGVtRGF0YSk7XG4gICAgICAgIGRlYnVnKHF1YW50aXR5KTtcbiAgICAgICAgZGVidWcoT3JkZXIuZ2V0RGF0YSgncHJvZHVjdFNlbGVjdGVkJykpO1xuICAgICAgICBkZWJ1ZygnLS0tLS0tLS0tLS0tLS0tLS0nKTtcblxuKi9cbiAgICAgICAgaWYoaXNOYU4ocXVhbnRpdHkpKXtcbiAgICAgICAgICAgIHF1YW50aXR5PTA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByb2R1Y3RTZWxlY3RlZD1PcmRlci5nZXREYXRhKCdwcm9kdWN0U2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc29sZS5ncm91cCgnb3JkZXJJdGVtc0NoYW5nZScpO1xuICAgICAgICBjb25zb2xlLmxvZyhbJ3Byb2R1Y3RTZWxlY3RlZCcscHJvZHVjdFNlbGVjdGVkXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFsnSXRlbURhdGEnLEl0ZW1EYXRhXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFsnSXRlbURhdGEuaWQnLEl0ZW1EYXRhLmlkXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFsncXVhbnRpdHknLHF1YW50aXR5XSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFsnZGF5SW5kZXgnLGRheUluZGV4XSk7XG4gICAgICAgIGNvbnNvbGUubG9nKHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF0pO1xuXG4gICAgICAgIGxldCBwcm9kdWN0U2VsZWN0ZWRJdGVtPXByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF07XG4gICAgICAgIC8qXG4gICAgICAgIGhhIDAgZXJ0ZWsgam9uIGVzIG5lbSBpcyB2b2x0IGFra29yIGhhbWFyIGtpdWdyYXRqdWtcbiAgICAgICAgICovXG4gICAgICAgIGlmKHF1YW50aXR5PT0wKXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3F1YW50aXR5PT0wJyk7XG4gICAgICAgICAgICBpZih0eXBlb2YgcHJvZHVjdFNlbGVjdGVkSXRlbT09J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaXR0IGxlcDEnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihkYXlJbmRleCl7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZhbiBkYXlJbmRleCcpXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF1bZGF5SW5kZXhdPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFsncHJvZHVjdFNlbGVjdGVkSXRlbScscHJvZHVjdFNlbGVjdGVkSXRlbV0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdpdHQgbGVwMicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgaGEgYXpvbm9zIGF6IGVydGVrIGtpdWdydW5rXG4gICAgICAgICAqL1xuICAgICAgICBpZihkYXlJbmRleCl7XG4gICAgICAgICAgICBpZih0eXBlb2YgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXSE9J3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXVtkYXlJbmRleF0hPSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICBpZihwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdW2RheUluZGV4XT09cXVhbnRpdHkpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdhem9ub3MgbmFwaScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYocHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXT09cXVhbnRpdHkpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2F6b25vcycpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihxdWFudGl0eT09MCl7XG4gICAgICAgICAgICBpZihkYXlJbmRleCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9yZGVyLnByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF1bZGF5SW5kZXhdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdW2RheUluZGV4XTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBPcmRlci5wcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICBoYSB2YW4gZXJ0ZWsgZXJ0ZWtldCBhZHVuayFcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYoZGF5SW5kZXgpe1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF09W107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXQgcXVhbnRpdHkgcHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXVtkYXlJbmRleF0nLHF1YW50aXR5KTtcbiAgICAgICAgICAgICAgICBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdW2RheUluZGV4XT1xdWFudGl0eTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF09cXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NldCBxdWFudGl0eSBwcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdJyxxdWFudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coWydwcm9kdWN0U2VsZWN0ZWQnLHByb2R1Y3RTZWxlY3RlZF0pO1xuICAgICAgICBPcmRlci5wcm9kdWN0U2VsZWN0ZWQ9cHJvZHVjdFNlbGVjdGVkO1xuXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgcXVldWVBamF4LnB1c2goRGF0ZS5ub3coKSk7XG4gICAgICAgIHJvb3Quc3luY09yZGVyRGF0YVRvU2VydmVyKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuXG5cbiAgICAgICAgaWYocHJvZHVjdFNlbGVjdGVkW0l0ZW1EYXRhLmlkXT09cXVhbnRpdHkpe1xuICAgICAgICAgICAgZGVidWcoJ2l0dCBsZXAxMicpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHByb2R1Y3RTZWxlY3RlZFtJdGVtRGF0YS5pZF09cXVhbnRpdHk7XG4gICAgICAgIGlmKHF1YW50aXR5PT0wKXtcbiAgICAgICAgICAgIGRlbGV0ZSBPcmRlci5wcm9kdWN0U2VsZWN0ZWRbSXRlbURhdGEuaWRdO1xuICAgICAgICB9XG4gICAgICAgIE9yZGVyLnByb2R1Y3RTZWxlY3RlZD1wcm9kdWN0U2VsZWN0ZWQ7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHF1ZXVlQWpheC5wdXNoKERhdGUubm93KCkpO1xuICAgICAgICByb290LnN5bmNPcmRlckRhdGFUb1NlcnZlcigpO1xuXG4gICAgICAgIC8qXG4gICAgICAgIGRlYnVnKE9yZGVyLmdldERhdGEoJ3Byb2R1Y3RTZWxlY3RlZCcpKTtcbiAgICAgICAgZGVidWcoJyoqKioqKioqKioqKioqKioqKionKTtcbiovXG4gICAgfVxuICAgIHRoaXMuaW5pdFZpZXdJbnZvaWNlPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgcm9vdC5TdGVwcGVyLnNldE9wdHMoe29uQWZ0ZXJMb2FkOmZ1bmN0aW9uICgpe319KTtcblxuICAgICAgICBpZihPYmplY3Qua2V5cyhPcmRlci5wcm9kdWN0U2VsZWN0ZWQpLmxlbmd0aD4wKXtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5hZGRDb21wbGV0ZWQoJ3NlbmQnKTtcbiAgICAgICAgICAgIHJvb3QuU3RlcHBlci5hZGRFbmFibGVkKCdzZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0eWxlU3RyPSc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIicrT3B0cy5VUkwucm9vdCsnL2Nzcy9pbnZvaWNlLmNzc1wiPic7XG4gICAgICAgICQoJ3RhYmxlLmludm9pY2UgYnV0dG9uLnByaW50QnV0dG9uJykub2ZmKCdjbGljaycpO1xuICAgICAgICAkKCd0YWJsZS5pbnZvaWNlIGJ1dHRvbi5wcmludEJ1dHRvbicpLm9uKCdjbGljaycsZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2luZG93LnByaW50KCk7XG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCBuZXdXaW49IHdpbmRvdy5vcGVuKFwiXCIpO1xuICAgICAgICAgICAgbmV3V2luLmRvY3VtZW50LndyaXRlKHN0eWxlU3RyKTtcbiAgICAgICAgICAgIGxldCBwcmludD0kKCd0YWJsZS5pbnZvaWNlJykuY2xvbmUoKTtcbiAgICAgICAgICAgIHByaW50LmZpbmQoJ2J1dHRvbi5wcmludEJ1dHRvbicpLnJlbW92ZSgpO1xuLy8gICAgICAgICAgICBuZXdXaW4uZG9jdW1lbnQud3JpdGUoJCgndGFibGUuaW52b2ljZScpLnByb3AoJ291dGVySFRNTCcpKTtcbiAgICAgICAgICAgIG5ld1dpbi5kb2N1bWVudC53cml0ZShwcmludC5wcm9wKCdvdXRlckhUTUwnKSk7XG4gICAgICAgICAgICBuZXdXaW4ucHJpbnQoKTtcbiAgICAgICAgICAgbmV3V2luLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRPcmRlcj1mdW5jdGlvbiAoKSB7XG4gICAgICAgIHJvb3QuaW5pdCgpO1xuICAgICAgICByb290LnNldERlbGl2ZXJ5RGF0ZSgnLScpO1xuICAgICAgICByb290LnNldFN1cHBsaWVyKCctJyk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmFmdGVyT3JkZXJTZW5kT2s9ZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgVG9hc3QuY3JlYXRlKHsgdGl0bGU6IFwiU2VudCFcIiwgbWVzc2FnZTogJ09yZGVyIFNlbnQnICwgc3RhdHVzOiBUT0FTVF9TVEFUVVMuSU5GTywgdGltZW91dDogNTAwMCB9KTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZCcpLm9mZignY2xpY2snKTtcbiAgICAgICAgJCgnLmJ1dHRvbk9yZGVyU2VuZCcpLnByb3AoJ2Rpc2FibGVkJyx0cnVlKTtcbiAgICAgICAgJCgnLnN0YXR1c05hbWVQbGFjZScpLnJlbW92ZUNsYXNzKCdzdGF0dXNCbGluaycpO1xuICAgICAgICAkKCcuc3RhdHVzTmFtZVBsYWNlJykudGV4dCgnZWxrw7xsZHZlJyk7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmRpbmcnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmRPaycpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgJCgnZGl2Lmludm9pY2VDb250YWluZXInKS5odG1sKGRhdGEucmV0SFRNTCk7XG4gICAgICAgIC8vcm9vdC5yZXNldE9yZGVyKCk7XG4gICAgfVxuICAgIHRoaXMuYWZ0ZXJPcmRlclNlbmRFcnJvcj1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAkKCcuYnV0dG9uT3JkZXJTZW5kJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAkKCcuYnV0dG9uT3JkZXJTZW5kaW5nJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAkLmVhY2goQVBQLk9yZGVyTW9kdWxlLlN0ZXBwZXIuZ2V0T3B0cygpLmF2YWlsYWJsZSxmdW5jdGlvbiAoaW5kZXgsdmFsdWUpIHtcbiAgICAgICAgICAgIEFQUC5PcmRlck1vZHVsZS5TdGVwcGVyLnNldEVuYWJsZWQodmFsdWUpO1xuICAgICAgICAgICAgQVBQLk9yZGVyTW9kdWxlLlN0ZXBwZXIuc2V0Q29tcGxldGVkKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0Vmlld1NlbmQ9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnaW5pdFZpZXdTZW5kIGNhbGxlZCAyJyk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHtvbkFmdGVyTG9hZDpmdW5jdGlvbiAoKXt9fSk7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmQnKS5vZmYoJ2NsaWNrJyk7XG4gICAgICAgICQoJy5idXR0b25PcmRlclNlbmQnKS5vbignY2xpY2snLGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZW5kIGJ1dG9uIGNsaWNrZWQnKTtcbiAgICAgICAgICAgIC8vQHRvZG86IGRhdGFzeW5jaGVyZSBhbmQgY2FsbGJhY2tcbiAgICAgICAgICAgICQoJy5idXR0b25PcmRlclNlbmQnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAkKCcuYnV0dG9uT3JkZXJTZW5kaW5nJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBQTTE1OFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAkLmVhY2goQVBQLk9yZGVyTW9kdWxlLlN0ZXBwZXIuZ2V0T3B0cygpLmF2YWlsYWJsZSxmdW5jdGlvbiAoaW5kZXgsdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIudW5zZXRFbmFibGVkKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIudW5zZXRDb21wbGV0ZWQodmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcblxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICByb290LnNlbmRPcmRlckRhdGFUb1NlcnZlcignc2VuZCcscm9vdC5hZnRlck9yZGVyU2VuZE9rLHJvb3QuYWZ0ZXJPcmRlclNlbmRFcnJvcik7XG5cbi8qICAgICAgICAgICAgbGV0IGFqYXhEYXRhPXt9O1xuICAgICAgICAgICAgYWpheERhdGEuX3Rva2VuPU9wdHMudG9rZW47XG4gICAgICAgICAgICBhamF4RGF0YS5zZW5kPXRydWU7XG4gICAgICAgICAgICAkLmV4dGVuZChhamF4RGF0YSxPcmRlcik7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgdXJsOiBPcHRzLlVSTC5zdG9yZSxcbiAgICAgICAgICAgICAgICBtZXRob2Q6J1BPU1QnLFxuICAgICAgICAgICAgICAgIGRhdGE6YWpheERhdGEsXG4gICAgICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnN1Y2Nlc3Mpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5hZnRlck9yZGVyU2VuZE9rKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7Ki9cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLnRlc3RNb2RlU2VuZD1mdW5jdGlvbiAoKSB7XG5cbiAgICB9XG5cblxuICAgIHRoaXMudGVzdE1vZGU9ZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygndGVzdE1vZGUgY2FsbGVkICcpXG4gICAgICAgIE9yZGVyLnNldERhdGEoe1xuICAgICAgICAgICAgaWQ6MjM0LFxuICAgICAgICAgICAgc3VwcGxpZXJJZDo3LFxuICAgICAgICAgICAgcHJvZHVjdFNlbGVjdGVkOntcbiAgICAgICAgICAgICAgICAxMTYgOiAzLFxuICAgICAgICAgICAgICAgIDI5MyA6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFjdE5hbWU6J0NvbnRhY3QgTmFtZScsXG4gICAgICAgICAgICBub3RlOidOb3RlJyxcbiAgICAgICAgICAgIHR5cGU6J2RhaWx5JyxcbiAgICAgICAgICAgIGRlbGl2ZXJ5RGF0ZTpPcHRzLmRlZmF1bHREZWxpdmVyeURhdGUsXG4gICAgICAgICAgICBkZWxpdmVyeUFkZHJlc3M6MTIsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhPcmRlci5nZXREYXRhKCkpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIC8vcm9vdC5TdGVwcGVyLnNldE9wdHMoeydVcmxEYXRhJzp7J3N1cHBsaWVySWQnOnN1cHBsaWVySWR9fSk7XG4gICAgICAgIHJvb3QuU3RlcHBlci5zZXRPcHRzKHsnVXJsRGF0YSc6eydzdXBwbGllcklkJzpPcmRlci5zdXBwbGllcklkLGlkOk9yZGVyLmlkfX0pO1xuICAgICAgICB0aGlzLlN0ZXBwZXIuaW5pdCh7XG4gICAgICAgICAgICBVUkw6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGU6IE9wdHMuVVJMLmNyZWF0ZSxcbiAgICAgICAgICAgIH0sXG4vKlxuY3N1cGFzeiBheiBlbGVqZXJvbFxuICAgICAgICAgICAgY29tcGxldGU6WydzdXBwbGllciddLFxuICAgICAgICAgICAgZW5hYmxlOiBbJ3N1cHBsaWVyJ10sXG4gICAgICAgICAgICBhY3RpdmU6ICdzdXBwbGllcicsXG4gICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6dGhpcy5pbml0Vmlld1N1cHBsaWVyLFxuXG5wcm9kdWN0IHNlbGVjdFxuICAgICAgICAgICAgY29tcGxldGU6WydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnXSxcbiAgICAgICAgICAgIGVuYWJsZTogWydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnXSxcbiAgICAgICAgICAgIGFjdGl2ZTogJ3Byb2R1Y3RTZWxlY3QnLFxuICAgICAgICAgICAgb25BZnRlckFjdGl2YXRlOnRoaXMuaW5pdFZpZXdQcm9kdWN0U2VsZWN0LFxuXG5mdWxsb3NcbiAgICAgICAgICAgIGNvbXBsZXRlOlsnc3VwcGxpZXInLCdwYXJhbWV0ZXInLCdwcm9kdWN0U2VsZWN0JywnaW52b2ljZSddLFxuICAgICAgICAgICAgZW5hYmxlOiBbJ3N1cHBsaWVyJywncGFyYW1ldGVyJywncHJvZHVjdFNlbGVjdCcsJ2ludm9pY2UnLCdzZW5kJ10sXG4gICAgICAgICAgICBhY3RpdmU6ICdwcm9kdWN0U2VsZWN0JyxcbiAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTp0aGlzLmluaXRWaWV3UHJvZHVjdFNlbGVjdCxcblxuc2VuZFxuICAgICAgICAgICAgY29tcGxldGU6WydzdXBwbGllcicsJ3BhcmFtZXRlcicsJ3Byb2R1Y3RTZWxlY3QnLCdpbnZvaWNlJywnc2VuZCddLFxuICAgICAgICAgICAgZW5hYmxlOiBbJ3N1cHBsaWVyJywncGFyYW1ldGVyJywncHJvZHVjdFNlbGVjdCcsJ2ludm9pY2UnLCdzZW5kJ10sXG4gICAgICAgICAgICBhY3RpdmU6ICdzZW5kJyxcbiAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTp0aGlzLmluaXRWaWV3UHJvZHVjdFNlbGVjdCxcblxuKi9cbiAgICAgICAgICAgIGNvbXBsZXRlOlsnc3VwcGxpZXInLCdwYXJhbWV0ZXInLCdwcm9kdWN0U2VsZWN0J10sXG4gICAgICAgICAgICBlbmFibGU6IFsnc3VwcGxpZXInLCdwYXJhbWV0ZXInLCdwcm9kdWN0U2VsZWN0J10sXG4gICAgICAgICAgICBhY3RpdmU6ICdwcm9kdWN0U2VsZWN0JyxcbiAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTp0aGlzLmluaXRWaWV3UHJvZHVjdFNlbGVjdCxcblxuXG4gICAgICAgICAgICBhdXRvQ2FsbGJhY2s6IHtcbiAgICAgICAgICAgICAgICBpbnZvaWNlOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQWZ0ZXJBY3RpdmF0ZTpyb290LmluaXRWaWV3SW52b2ljZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VuZDoge1xuICAgICAgICAgICAgICAgICAgICBvbkFmdGVyQWN0aXZhdGU6cm9vdC5pbml0Vmlld1NlbmRcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcqKioqKioqKioqKioqKioqKioqJyk7XG5cbiAgICB9XG4gICAgdGhpcy50b2dnbGVFbmFibGVTZW5kPWZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3RvZ2dsZUVuYWJsZVNlbmQgY2FsbGVkJyk7XG4gICAgICAgIGxldCBhamF4VXJsPU9wdHMuVVJMLmNoZWNrUmVhZHlUb1NlbmQucmVwbGFjZSgnJWlkJScsT3JkZXIuaWQpO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOmFqYXhVcmwsXG4gICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5zdWNjZXNzKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5yZWFkeVRvU2VuZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIuYWRkQ29tcGxldGVkKCdzZW5kJyk7XG4vKlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmFkZENvbXBsZXRlZCgnaW52b2ljZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLmFkZEVuYWJsZWQoJ2ludm9pY2UnKTtcbiovXG4gICAgICAgICAgICAgICAgICAgICAgICByb290LlN0ZXBwZXIuYWRkRW5hYmxlZCgnc2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldENvbXBsZXRlZCgnc2VuZCcpO1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldENvbXBsZXRlZCgnaW52b2ljZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5TdGVwcGVyLnVuc2V0RW5hYmxlZCgnaW52b2ljZScpO1xuKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuU3RlcHBlci51bnNldEVuYWJsZWQoJ3NlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iXSwibmFtZXMiOlsid2luZG93IiwiT3JkZXJNb2R1bERlZmF1bHQiLCJhY3Rpb25GdW5jdGlvbiIsIkRhdGFNb2RlbE9yZGVyIiwiX0RhdGFNb2RlbCIsImRhdGEiLCJvcHRpb25zIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY2FsbFN1cGVyIiwicHJvZHVjdFNlbGVjdGVkIiwicHJvZHVjdENvbW1lbnQiLCJjb25zb2xlIiwibG9nIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwiRGF0YU1vZGVsIiwiU3RlcHBlciIsIk9wdHMiLCJjb21wbGV0ZSIsImF2YWlsYWJsZSIsImVuYWJsZSIsImxvYWQiLCJleGNsdWRlTG9hZGVkIiwibG9hZGVkIiwiYWN0aXZlIiwiVVJMIiwiY3JlYXRlIiwiVXJsRGF0YSIsIm9uQWZ0ZXJMb2FkIiwib25BZnRlckFjdGl2YXRlIiwiYXV0b0NhbGxiYWNrIiwibm93TG9hZGVkIiwicm9vdCIsImNvbnN0cnVjdCIsIiQiLCJleHRlbmQiLCJnZXRPcHRzIiwic2V0T3B0cyIsImluaXQiLCJkZWJ1ZyIsImVhY2giLCJzdGVwTmFtZSIsImluY2x1ZGVzIiwic2V0Q29tcGxldGVkIiwic2V0RW5hYmxlZCIsImxvYWRTdGVwQ29udGVudCIsInNldEFjdGl2ZSIsImJpbmRDbGlja0FjdGlvbiIsInN0ZXBDbGlja0J1dHRvbnMiLCJvZmYiLCJvbiIsInN0ZXBDbGljayIsImFkZENsYXNzIiwidW5zZXRDb21wbGV0ZWQiLCJyZW1vdmVDbGFzcyIsImFycmF5UmVtb3ZlIiwidW5zZXRFbmFibGVkIiwiY29udGVudHMiLCJ1bndyYXAiLCJzdGVwSXRlbSIsImh0bWwiLCJhZGRFbmFibGVkIiwicHVzaCIsImFkZENvbXBsZXRlZCIsImFqYXgiLCJhc3luYyIsInR5cGUiLCJ1cmwiLCJjYWNoZSIsInN1Y2Nlc3MiLCJyZXN1bHQiLCJjb250YWluZXIiLCJjYXBpdGFsaXplIiwiaW5BcnJheSIsImNsZWFyTG9hZGVkIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJzZXRBY3RpdmVGaW5pc2giLCJzaG93IiwiaGlkZSIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJjdXJyZW50VGFyZ2V0IiwiT3JkZXJNb2R1bGUiLCJ0ZXN0TW9kZSIsIm5lZWRTdGVwcGVyIiwiQ1NTU2VsZWN0b3JGb3JtIiwiZGVmYXVsdERlbGl2ZXJ5RGF0ZSIsImRhdGFTeW5jUGF1c2VUaW1lIiwidG9rZW4iLCJnZXREYXRhVGFibGVDb250ZW50UHJvZHVjdExpc3QiLCJjaGVja1JlYWR5VG9TZW5kIiwiaW5kZXgiLCJlZGl0Iiwic3RvcmUiLCJ1cGRhdGUiLCJkZXN0cm95IiwidG9nZ2xlRmF2b3JpdGVzIiwiUHVibGljVmFyIiwiUHVibGljVmFyMiIsIkFwaVRva2VuIiwiT3JkZXIiLCJ2aWV3SW5pY2lhbGl6ZWQiLCJjbGlja09yZGVyRWRpdCIsImFqYXhVcmwiLCJyZXBsYWNlIiwiaWQiLCJBUFAiLCJsb2FkTWFpbkNvbnRlbnQiLCJhZnRlck9yZGVyRGVsZXRlZCIsIlRvYXN0IiwidGl0bGUiLCJtZXNzYWdlIiwic3RhdHVzIiwiVE9BU1RfU1RBVFVTIiwiREFOR0VSIiwidGltZW91dCIsImNsaWNrT3JkZXJEZWxldGVDb25maXJtZWQiLCJtb2RhbCIsImFqYXhEYXRhIiwiX3Rva2VuIiwibWV0aG9kIiwiaW5pdFZpZXdPcmRlclNlbGVjdCIsImFjdGlvbiIsIm9yZGVySWQiLCJjbG9zZXN0IiwiZmluZCIsInRleHQiLCJpbml0U3RlcHBlciIsImdldERhdGEiLCJzZXREZWxpdmVyeURhdGUiLCJzZXRTdXBwbGllciIsInVuRW5hYmxlZCIsInZhbHVlIiwic3RlcEFjdGl2ZSIsInN0ZXBDb21wbGV0ZSIsInN0ZXBFbmFibGUiLCJzdGVwT25BZnRlckFjdGl2YXRlIiwiYXZhbGFpYmxlU3RlcHMiLCJzdGVwVXJsRGF0YSIsInN0ZXBBdXRvQ2FsbGJhY2siLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiaXRlbSIsImVyciIsImUiLCJmIiwic3VwcGxpZXJJZCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJpbml0T3JkZXIiLCJzdXBwbGllck5hbWUiLCJzZXREYXRhIiwiZGF0ZVRleHQiLCJkYXRlVGV4dFRvIiwiZGF0ZVRleHRIdW1hbiIsInJlcGxhY2VBbGwiLCJsZW5ndGgiLCJ2YWwiLCJzZXRTdXBwbGllckNvbXBsZXRlZCIsImluaXRWaWV3UGFyYW1ldGVyIiwiYWZ0ZXJPcmRlclNldFN1cHBsaWVyT2siLCJzdXBwbGllciIsIklORk8iLCJpbml0Vmlld1N1cHBsaWVyIiwic3RvcmVUeXBlIiwiV0FSTklORyIsImNoZWNrQ29udGFjdE5hbWVGaWVsZCIsIm5vZGUiLCJzZW5kT3JkZXJEYXRhVG9TZXJ2ZXIiLCJ1cGRhdGVUeXBlIiwiY2FsbGJhY2siLCJlcnJvckNhbGxiYWNrIiwiYWpheE1ldGhvZCIsIl9tZXRob2QiLCJqc29uVG9Gb3JtRGF0YSIsImNvbnRlbnRUeXBlIiwicHJvY2Vzc0RhdGEiLCJlcnJvciIsInhociIsImFqYXhPcHRpb25zIiwidGhyb3duRXJyb3IiLCJhamF4RXJyb3JIYW5kbGVyIiwicmVzcG9uc2VKU09OIiwiYWZ0ZXJPcmRlclNldFBhcmFtZXRlck9rIiwic2VsZWN0Q3VycmVudFdlZWsiLCJ3ZWVrSG92ZXIiLCJ3ZWVrSG92ZXJTbG93Iiwic2V0VGltZW91dCIsImluaXREYXRlUGlja2VyIiwic3RhcnREYXRlIiwiRGF0ZSIsImVuZERhdGUiLCJkYXRlcGlja2VyIiwic2hvd090aGVyTW9udGhzIiwic2VsZWN0T3RoZXJNb250aHMiLCJzaG93V2VlayIsImRhdGVGb3JtYXQiLCJmaXJzdERheSIsIm1pbkRhdGUiLCJhZnRlclNob3ciLCJpbnN0Iiwib25TZWxlY3QiLCJkYXRlIiwiZ2V0TW9uZGF5IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXREYXkiLCJmb3JtYXREYXRlIiwiYmVmb3JlU2hvdyIsImdyb3VwIiwiZ3JvdXBFbmQiLCJiZWZvcmVTaG93RGF5IiwidG9Mb2NhbGVEYXRlU3RyaW5nIiwiY3NzQ2xhc3MiLCJvbkNoYW5nZU1vbnRoWWVhciIsInllYXIiLCJtb250aCIsImF2YWlsYWJsZURhdGVzIiwibmV4dERlbGl2ZXJ5RGF0ZSIsImhhc0RlbGl2ZXJ5Q29uc3RyYWludCIsImhvbGlkYXlzIiwid29ya2luZ0RheXMiLCJkYXRlcGlja2VySW5wdXQiLCJjYWxlbmRhclVybCIsInByb2ZpdENlbnRlcklkIiwib3JkZXJEYXRlVGltZSIsInRvSVNPU3RyaW5nIiwibWFwIiwiaCIsImRlc2NyaXB0aW9uIiwidyIsImRhdGVwaWNrZXJPcHRzIiwiZGF0ZVN0ciIsImhvbGlkYXlFbnRyeSIsIndvcmtpbmdEYXlFbnRyeSIsImlzRGVsaXZlcnkiLCJjc3NDbGFzc2VzIiwidG9vbHRpcCIsInNlbGVjdGFibGUiLCJqb2luIiwiY2FsbENoYW5nZU9yZGVyVHlwZSIsImNsaWNrIiwic2VsZWN0MiIsInByb3AiLCJzZXREYXRlIiwic3VibWl0IiwiY2hlY2tWYWxpZGl0eSIsInN0b3BQcm9wYWdhdGlvbiIsImNvbnRhY3ROYW1lIiwibm90ZSIsIm9yZGVyVHlwZSIsImRlbGl2ZXJ5RGF0ZSIsImRlbGl2ZXJ5QWRkcmVzc0lkIiwiZGVsaXZlcnlBZGRyZXNzIiwiY3VzdG9tTm90aWZpY2F0aW9uRW1haWwiLCJibGFuayIsInNldFBhcmFtZXRlckNvbXBsZXRlZCIsImJpbmRSb3dGYXZvcml0ZXNBY3Rpb24iLCJwcm9kdWN0SWQiLCJidXR0b24iLCJyZXNwb25zZSIsImJpbmRSb3dEZXNjcmlwdGlvbkFjdGlvbiIsImNvbW1lbnQiLCJxdWV1ZUFqYXgiLCJub3ciLCJzeW5jT3JkZXJEYXRhVG9TZXJ2ZXIiLCJwcm9kdWN0U2VsZWN0RGF0YXRhYmxlc1Jvd0Zvcm1hdHRlciIsImQiLCJ0ZW1wbGF0ZURhdGEiLCJfdHlwZW9mIiwiZmF2b3JpdGVzIiwiYnRuRmF2b3JpdGVzQ2xhc3MiLCJ0ZW1wbGF0ZSIsIndlZWtseSIsIml0ZW1RdWFudGl0eSIsIm9sZFRhZ3MiLCJNdXN0YWNoZSIsInRhZ3MiLCJzcGVjaWZpY2F0aW9uQ2xhc3MiLCJwaWN0dXJlSW1nIiwicGljdHVyZUNsYXNzIiwicmVuZGVyIiwic2V0RGF0YXRhYmxlSGVhZGVyVGV4dCIsImdldFRyZWVQYXRoTmFtZSIsInJlcyIsIml0ZW1zIiwicGFyZW50cyIsInRvQXJyYXkiLCJzaGlmdCIsInJldmVyc2UiLCJjaGlsZHJlbiIsInNlbGVjdGVkUHJvZHVjdEdyb3VwIiwiZGF0YVRhYmxlU2VhcmNoU3RyIiwiZGF0YVRhYmxlU2VhcmNoS3JlbCIsInNlYXJjaFByb2R1Y3RCeVN0cmluZyIsImZpbHRlclN0ciIsIkRhdGFUYWJsZSIsInJlbG9hZCIsImNsaWNrU2VhcmNoUHJvZHVjdCIsImNsaWNrRmF2b3JpdGVzUHJvZHVjdCIsImNsaWNrT2Z0ZW5Qcm9kdWN0IiwiY2xpY2tTcGVjaWFsT2ZmZXIiLCJjbGlja0xhc3RQcm9kdWN0IiwiY2xpY2tXZWVrbHlQcm9kdWN0IiwiY2xpY2tLcmVsUHJvZHVjdCIsInBhcmVudCIsInRvZ2dsZUNsYXNzIiwicHJvZHVjdFNlbGVjdERhdGFUYWJsZUNvbHVtbkRlZnMiLCJwcm9kdWN0U2VsZWN0RGF0YVRhYmxlQ29sdW1uIiwiY29sdW1uRGF0YSIsImFjdGlvbkNvbHVtbiIsInJvdyIsInN0b2NrX3N0YXR1cyIsImdldERhdGF0YWJsZXMiLCJ0YWJsZSIsImxhbmd1YWdlIiwic2VhcmNoU3RyIiwia3JlbCIsImdyb3VwSWQiLCJidXR0b25zIiwicHJvZHVjdFNlbGVjdERhdGFUYWJsZURyYXdEVCIsImZpbHRlciIsImlucHV0U3Bpbm5lciIsImJ1dHRvbnNXaWR0aCIsImdyb3VwQ2xhc3MiLCJidXR0b25zQ2xhc3MiLCJiaW5kV2Vha1VzZXJIZWxwZXIiLCJxdWFudGl0eSIsInBhcnNlRmxvYXQiLCJyb3dEYXRhIiwib3JkZXJJdGVtc0NoYW5nZSIsInF1YW50aXR5Q3VycmVudCIsInRyaWdnZXIiLCJpbml0Vmlld1Byb2R1Y3RTZWxlY3QiLCJmdW5jdGlvbk5hbWUiLCJ3aGljaCIsImtleSIsImdldFRpbWUiLCJkYXRhVGFibGUiLCJ0ciIsImNoaWxkIiwiaXNTaG93biIsImJpbmRQcm9kdWN0RGV0YWlsc0FjdGlvbiIsImJpbmRPcmRlckl0ZW1XZWVrUXVhbnRpdHkiLCJhY3R1YWxJdGVtIiwiZm9jdXMiLCJyb3dOb2RlIiwicHJldiIsImFmdGVyU3luY09yZGVyRGF0YVRvU2VydmVyIiwiaSIsInN5bmNEb2luZyIsIkl0ZW1EYXRhIiwiZGF5SW5kZXgiLCJpc05hTiIsInByb2R1Y3RTZWxlY3RlZEl0ZW0iLCJpbml0Vmlld0ludm9pY2UiLCJPYmplY3QiLCJrZXlzIiwic3R5bGVTdHIiLCJwcmludCIsIm5ld1dpbiIsIm9wZW4iLCJkb2N1bWVudCIsIndyaXRlIiwiY2xvbmUiLCJyZW1vdmUiLCJjbG9zZSIsInJlc2V0T3JkZXIiLCJhZnRlck9yZGVyU2VuZE9rIiwicmV0SFRNTCIsImFmdGVyT3JkZXJTZW5kRXJyb3IiLCJpbml0Vmlld1NlbmQiLCJ0ZXN0TW9kZVNlbmQiLCJpbnZvaWNlIiwic2VuZCIsInRvZ2dsZUVuYWJsZVNlbmQiLCJyZWFkeVRvU2VuZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/moduleJs/order.js\n\n}"); /***/ }, diff --git a/public/mix-manifest.json b/public/mix-manifest.json index b449d89..bbd8558 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,9 +1,9 @@ { "/js/app.js": "/js/app.js?id=8eebbb7cc03522e40f2a774f36c0d6b0", - "/js/admin.js": "/js/admin.js?id=bfc5c5377ba371e3a1775e3447fd6768", - "/js/module.js": "/js/module.js?id=97451660206244bb75c4d7c859d0e8bf", + "/js/admin.js": "/js/admin.js?id=ba79095db4031ff8fcb2db67804629a7", + "/js/module.js": "/js/module.js?id=67c3aa137dd61f211d1157b3ae1c5578", "/js/components.js": "/js/components.js?id=34668cee8ac371c98657beffcff579b8", - "/css/app.css": "/css/app.css?id=11474616a7ef31af1acf43a25d65f4b6", + "/css/app.css": "/css/app.css?id=883a2d68194f1a6064f55eaedb17e768", "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff2?92ea18a81d737146ff044ddb52010366": "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff2?92ea18a81d737146ff044ddb52010366?id=9ad5aa740d7d5e6a0191b309b9b1986c", "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff?1295669cd4e305c97f2cfc16d56614b8": "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff?1295669cd4e305c97f2cfc16d56614b8?id=d1af9af6052c51b169be6c628ae99bb5", "/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?23f19bb08961f37aaf692ff943823453": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?23f19bb08961f37aaf692ff943823453?id=0868992b7c56298026b76b22c534eab9", diff --git a/resources/css/speedButtonNavBar.css b/resources/css/speedButtonNavBar.css index f57fcd7..3d10f0d 100644 --- a/resources/css/speedButtonNavBar.css +++ b/resources/css/speedButtonNavBar.css @@ -9,8 +9,14 @@ .speedButtonNavBar img{ max-width: 64px; } .speedButtonNavBar ul{ - overflow: hidden; margin-bottom: 1px; + list-style: none; + padding-left: 0; +} +.speedButtonNavBar ul::after { + content: ""; + clear: both; + display: table; } .speedButtonNavBar ul li{ text-align: center; @@ -20,9 +26,40 @@ .speedButtonNavBar ul li{ float: left; /*margin: 10px;*/ font-size: 11px; - overflow: hidden; line-height: 1.2; - + position: relative; +} +.speedButtonDropdown { + display: none; + position: absolute; + top: 105px; + left: 0; + width: 200px; + background-color: #343a40; + border: 1px solid #453821; + z-index: 1000; + text-align: left; + border-radius: 0 0 5px 5px; + box-shadow: 0 4px 6px rgba(0,0,0,0.3); +} +.speedButtonNavBar ul li:hover .speedButtonDropdown { + display: block; +} +.speedButtonDropdown a { + padding: 10px 15px; + color: white !important; + text-decoration: none; + display: block !important; + height: auto !important; + border-bottom: 1px solid #454545; + font-weight: bold; +} +.speedButtonDropdown a:hover { + background-color: #453821; + text-decoration: none; +} +.speedButtonDropdown a:last-child { + border-bottom: none; } .speedButtonNavBar ul li.selected{ background-color: rgba(200,200,200,0.5); diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 9572d75..73ea5f2 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,5 +1,6 @@ @php $showChangelog=!auth()->user()->hasRole('profit-center'); + $showChangelog=false; $ProfitCenter=auth()->user()->hasRole('profit-center'); debug($showChangelog); @endphp diff --git a/resources/views/layout/speedButtonNavBar.blade.php b/resources/views/layout/speedButtonNavBar.blade.php index 5883e46..3ccbbdb 100644 --- a/resources/views/layout/speedButtonNavBar.blade.php +++ b/resources/views/layout/speedButtonNavBar.blade.php @@ -120,6 +120,28 @@ 'icon' => 'price_list', 'link' => '/admin/pricelist-files', 'noAjax' => true, + 'roles' => ['developer'], + ], + 'delivery' => [ + 'name' => 'delivery', + 'DisplayName' => 'Szállítás', + 'icon' => 'timetable3', + 'link' => '#', + 'roles' => ['root', 'admin', 'developer'], + 'noAjax' => true, + 'children' => [ + ['DisplayName' => 'Szállítási sablonok', 'link' => '/admin/delivery-schedules'], + ['DisplayName' => 'Beszállítói felülbírálások', 'link' => '/admin/delivery-calendar-overrides'], + ['DisplayName' => 'Profitcenter ütemezés', 'link' => '/admin/profit-center-supplier-schedules'], + ['DisplayName' => 'Munkanaptárak', 'link' => '/admin/work-calendars'], + ], + ], + 'calendarTest' => [ + 'name' => 'calendarTest', + 'DisplayName' => 'Naptár Teszt', + 'icon' => 'idopontok', + 'link' => '/admin/calendar-test', + 'noAjax' => true, 'roles' => ['root', 'developer', 'admin'], ], @@ -128,7 +150,7 @@ 'DisplayName' => 'Legacy teszt', 'icon' => 'lombic128128', 'link' => route('legacy.test.form'), - 'roles' => ['root', 'developer', 'admin'], + 'roles' => ['root', 'developer'], ], /* */ @@ -169,7 +191,17 @@ @endisset > {{ $data->DisplayName }} - + + @isset($data->children) +
+ @foreach($data->children as $child) + + {{ $child->DisplayName }} + + @endforeach +
+ @endisset + @endrole