\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\r\n '' +\r\n '
';\r\n\r\n $.each(colArray, function (index: any, value: any) {\r\n columns.every(function (i: any) {\r\n if (value === i) {\r\n var column = this, \r\n content = '';//'
';\r\n var columnName = $(this.header()).text().replace(/\\s+/g, \"_\");\r\n var distinctArray: any[] = [];\r\n column.data().each(function (d: string, j: any) {\r\n if (distinctArray.indexOf(d) == -1) {\r\n var id = tableName + \"_\" + columnName + \"_\" + j; // onchange=\"formatValues(this,' + value + ');\r\n content += '
';\r\n distinctArray.push(d);\r\n }\r\n }); \r\n var newTemplate = $(template.replace('{0}', content).replace('{1}', value).replace('{1}', value).replace('{2}', tableName).replace('{2}', tableName));\r\n $('body').append(newTemplate);\r\n _this.modalFilterArray[tableName + \"_\" + value] = newTemplate;\r\n content = '';\r\n }\r\n });\r\n });\r\n }, 50);\r\n\r\n }\r\n\r\n\r\n //User to show the filter modal\r\n showFilter(e: any, index: any) {\r\n $('.modalFilter').hide();\r\n $(this.modalFilterArray[index]).css({ left: 0, top: 0 });\r\n var th = $(e.target).parent();\r\n var pos = th.offset();\r\n let arrayItem = this.modalFilterArray[index];\r\n //$(this.modalFilterArray[index]).width(th.width() * 0.75);\r\n $(arrayItem).css({ 'left': pos.left, 'top': pos.top, 'min-width':(th.width() * 0.75) });\r\n $(arrayItem).show();\r\n e.stopPropagation();\r\n }\r\n\r\n updateTableHeaderStatus(tableId:string,columnId:string,activeFilter:boolean){\r\n let _colFilterId = columnId+\"-filter\";\r\n let _colFilter = $(tableId).find(_colFilterId)[0];\r\n let _colFilterAtr = _colFilter.getAttribute(\"class\");\r\n if(activeFilter){\r\n _colFilterAtr.replace(\"saop-img-filter\", \"saop-img-filter saop-cl-blue\");\r\n } else {\r\n _colFilterAtr.replace(\"saop-img-filter saop-cl-blue\", \"saop-img-filter\");\r\n \r\n }\r\n }\r\n\r\n //This function is to use the searchbox to filter the checkbox\r\n filterValues(node: any) {\r\n var searchString = $(node).val().toString().toUpperCase().trim();\r\n var rootNode = $(node).parent();\r\n if (searchString == '') {\r\n rootNode.find('div').show();\r\n } else {\r\n rootNode.find(\"div\").hide();\r\n rootNode.find(\"div:contains('\" + searchString + \"')\").show();\r\n }\r\n }\r\n\r\n //Execute the filter on the table for a given column\r\n performFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n var searchString = '', counter = 0;\r\n\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n if (checkbox.checked) {\r\n searchString += (counter == 0) ? checkbox.value : '|' + checkbox.value;\r\n counter++;\r\n }\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n if(counter > 0){\r\n this.updateTableHeaderStatus('#' +tableId,_colId,true);\r\n } else {\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n }\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n searchString,\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n //Removes the filter from the table for a given column\r\n clearFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n rootNode.find(\".filterSearchText\").val('');\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n checkbox.checked = false;\r\n $(checkbox).parent().show();\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n '',\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n hideFilter(node: any, i: any, tableId: any) {\r\n $('.modalFilter').hide();\r\n }\r\n\r\n setResizeEvent(gridId:string){\r\n var _tableDiv = $(\"table\"+gridId+\" th\") as any;\r\n\t var thHeight = $(\"table\"+gridId+\" th:first\").height();\r\n\t _tableDiv.resizable({\r\n\t\t handles: \"e\",\r\n\t\t minHeight: thHeight,\r\n\t\t maxHeight: thHeight,\r\n\t\t minWidth: 40,\r\n\t\t resize: function (event:any, ui:any) {\r\n console.log(\"resize...\");\r\n var sizerid = \"#\" + $(event.target).attr(\"id\") + \"-sizer\";\r\n $(sizerid).width(ui.size.width);\r\n\t\t }\r\n\t }); \r\n }\r\n\r\n setSortElementEvent(gridId: string):void{\r\n let _this = this;\r\n $(gridId).on('click', 'th', function () {\r\n _this.setSortElement(gridId);\r\n });\r\n }\r\n \r\n setSortElement(gridId: string):void {\r\n $(\"\" + gridId + \" thead:first th\").each(function (i, th) {\r\n let _col = $(th);\r\n let _colId = \"#\"+_col.attr('id');\r\n //let _sortType = _col.attr(\"column-sort\");\r\n let _colIconIdUp = _colId+\"-icon-up\";\r\n let _colIconId = _colId+\"-icon\";\r\n let _colIconUpElement = $(gridId+' '+_colIconIdUp);\r\n let _colIconElement = $(gridId+' '+_colIconId);\r\n let cls = $(th).attr('class');\r\n\r\n //if (_sortType != null) {\r\n if (cls != null && cls.indexOf(\"no-sort\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n } \r\n else if (cls != null && cls.indexOf(\"sorting_asc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.addClass(\"saop-img-arrow-up saop-cl-blue\");\r\n } else if (cls != null && cls.indexOf(\"sorting_desc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.addClass(\"saop-img-arrow-down saop-cl-blue\"); \r\n } else {\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n _colIconElement.addClass(\"saop-img-arrow-up\");\r\n _colIconUpElement.addClass(\"saop-img-arrow-down\");\r\n }\r\n //}\r\n });\r\n } \r\n\r\n configSimpleFilter(dataTable: any):void {\r\n let _this = this;\r\n let tableId = \"#\"+dataTable[0].id;\r\n let _iCount = 0;\r\n var _filterEnable = false;\r\n let _th_columns = $(tableId).find('th');\r\n _th_columns.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n let _filterType = _element.attr(\"column-filter\"); \r\n let _nosort = _element.hasClass(\"no-sort\");\r\n let _actionColumn = _element.hasClass(\"saop-table-th-last\");\r\n _element.attr(\"id\",\"column-header-\"+ _iCount +\"\");\r\n _element.css(\"outline\",\"none\");\r\n let col_title = _element.text();\r\n //let col_max_width = col_title.length * 7;\r\n _element.text(\"\");\r\n\r\n //_element.append(\"
\"+col_title+\"
\");\r\n _element.append(\"
\"+col_title+\"
\");\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n _filterEnable = true;\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n _filterEnable = true;\r\n }\r\n\r\n if (_actionColumn != null && _actionColumn == true){\r\n _nosort = true;\r\n }\r\n\r\n if (_nosort == null ||_nosort == false){\r\n _element.append(\"
\");\r\n _element.append(\"
\"); \r\n }\r\n _element.append(\"
\");\r\n }\r\n );\r\n\r\n if (_filterEnable) {\r\n $(tableId+' thead tr')\r\n .clone(true)\r\n .addClass('filters')\r\n .appendTo(tableId+' thead');\r\n\r\n // Setup - add a text input to each footer cell\r\n let _filters = $(tableId).find('.filters');\r\n let _filters_th = _filters.find('th');\r\n _iCount = 0;\r\n _filters_th.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n _element.off();\r\n\r\n _element.html(\"\");\r\n\r\n let _filterType = _element.attr(\"column-filter\");\r\n\r\n while(_element[0].attributes.length > 0)\r\n _element[0].removeAttribute(_element[0].attributes[0].name);\r\n\r\n let _colId = \"col_\"+_iCount.toString(); \r\n _element.attr(\"id\",_colId);\r\n let _inputId = _colId+\"_filter\"; \r\n let title = _element.text();\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n let _inputE = new SaopInputWFL({id:_inputId,caption:title,placeholder:title}).getInnerHtml();\r\n _element.html(_inputE);\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n let _selectId = _colId+\"_select\"; \r\n let selectHtml = new SaopselectWFL({id:_selectId,caption:\"\",placeholder:\"\"}).getInnerHtml();\r\n let select = $(selectHtml); \r\n //\r\n\r\n let _index = _iCount;\r\n _index = _index - 1;\r\n\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .data()\r\n .unique()\r\n .sort()\r\n .each(function (d:any, j:any) {\r\n if (d.length > 0){\r\n let _content = d;\r\n let _firstChar = _content[0];\r\n if (_firstChar.charCodeAt(0) > 1000) {_content = _content.replace(_firstChar+\" \",\"\");}\r\n select.find('select').last().append('
');\r\n }\r\n });\r\n\r\n _element.append(select);\r\n } \r\n } \r\n );\r\n\r\n // Apply the filter\r\n $(tableId+\" thead input\").on( 'keyup change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search( target.value )\r\n .draw();\r\n\r\n //var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n //dataTable.DataTable().search(val ? '^' + val + '$' : '', true, false).draw();\r\n\r\n } ); \r\n \r\n // Apply the dropdown filter\r\n $(tableId+\" thead select\").on( 'change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search(val ? '^' + val + '$' : '', true, false)\r\n .draw();\r\n } ); \r\n\r\n //\r\n }\r\n\r\n\r\n }\r\n\r\n configSimpleSort(gridId: string):void {\r\n this.setSortElement(gridId);\r\n this.setSortElementEvent(gridId);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","///
\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopWebGridFilter } from \"../Components/saop-grid-filter\";\r\nimport { DataTables } from \"../@types/data-tables/types\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopWebGridEdit } from \"../Components/saop-grid-edit\";\r\n\r\n\r\n// function statusFormatter(row: number, cell: number, value: any, columnDef: Slick.Column
, dataContext: Slick.SlickData) {\r\n// if (value == null || value === \"\") {\r\n// return \"-\";\r\n// } else if (value < 50) {\r\n// return \"\" + value + \"%\";\r\n// } else {\r\n// return \"\" + value + \"%\";\r\n// }\r\n// }\r\n\r\nexport interface SaopWebGridToolbar {\r\n id?:string,\r\n caption:string,\r\n buttons?:SaopWebGridToolbarButton[]\r\n itemsTemplateId?: string;\r\n} \r\n\r\nexport interface SaopWebGridToolbarButton {\r\n id:string,\r\n caption :string, \r\n class? :string,\r\n attributes?:string,\r\n onClickEvent?:string,\r\n template?: string;\r\n} \r\n\r\nexport interface SaopWebGridTogglePanel {\r\n enabled:boolean\r\n} \r\n\r\nexport interface SaopWebGridProperties {\r\n gridId:string\r\n ,css?:string\r\n ,togglePanel?:SaopWebGridTogglePanel\r\n ,toolbar?:SaopWebGridToolbar \r\n ,dataTable?:SaopWebDataTable\r\n}\r\n\r\nexport interface SaopWebDataTable {\r\n enabled:boolean\r\n ,columnDefsSettings?: DataTables.ColumnDefsSettings[]\r\n ,ordering?:boolean\r\n ,columns?:any[]\r\n ,data?: any\r\n ,order?: Array<(number | string)> | Array>\r\n ,editable?:boolean\r\n}\r\n\r\nexport class SaopWebGrid {\r\n private _properties:SaopWebGridProperties\r\n private _tableDiv:HTMLTableElement;\r\n private _translationService: SaopTranslationService;\r\n private _saopWebGridEdit: SaopWebGridEdit;\r\n //\r\n public libName: string; \r\n public webGridFilter:SaopWebGridFilter;\r\n public dataTable: DataTables.Api;\r\n public markedColumnCheckbox: JQuery;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this.webGridFilter = new SaopWebGridFilter();\r\n this._translationService = new SaopTranslationService();\r\n this._saopWebGridEdit = new SaopWebGridEdit(\"_saopWebGridEdit\"); \r\n this._saopWebGridEdit.onWriteValueToTDElementComplete = this.onWriteValueToTDElementComplete.bind(this);\r\n } \r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['Ni podatkov za prikaz.'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n //\r\n init(gridProp:SaopWebGridProperties) {\r\n this._properties = gridProp;\r\n this._tableDiv = document.querySelector(gridProp.gridId) as HTMLTableElement;\r\n //\r\n let _togglePanelDefault = {enabled:true};\r\n gridProp.togglePanel = {..._togglePanelDefault, ...gridProp.togglePanel}\r\n if (global.isUnDefined(gridProp.togglePanel)){\r\n gridProp.togglePanel = _togglePanelDefault;\r\n } \r\n //\r\n\r\n this.webGridFilter.id = gridProp.gridId+\"filter\";\r\n this.generateHtmlTable();\r\n this.addGridToolbar();\r\n // det defaults\r\n let _Msg_emptyTable = this._translationService.translate(\"Ni podatkov za prikaz.\")\r\n\r\n let _dataTableDef = {enabled:true,ordering:true};\r\n gridProp.dataTable = {..._dataTableDef, ...gridProp.dataTable}\r\n\r\n if (global.isUnDefined(gridProp.dataTable)){\r\n gridProp.dataTable = gridProp.dataTable;\r\n } \r\n\r\n let _columnDefsSettingsDef = [{orderable: true, targets: \"no-sort\"}];\r\n gridProp.dataTable.columnDefsSettings = {..._columnDefsSettingsDef,...gridProp.dataTable.columnDefsSettings}\r\n\r\n if (global.isUnDefined(gridProp.dataTable.columnDefsSettings)){\r\n gridProp.dataTable.columnDefsSettings = _columnDefsSettingsDef;\r\n }\r\n //\r\n if (!global.isUnDefined(this._properties.dataTable) \r\n && this._properties.dataTable.enabled\r\n ){\r\n let _this = this;\r\n this.dataTable = \r\n $(gridProp.gridId).DataTable(\r\n {\r\n \"paging\": false\r\n , \"searching\": true\r\n ,\"autoWidth\": true\r\n ,orderCellsTop: true\r\n //, \"dom\": \"Rlfrtip\"\r\n , initComplete: function () {\r\n if (gridProp.dataTable.ordering){\r\n _this.webGridFilter.configSimpleFilter(this); \r\n _this.webGridFilter.configSimpleSort(_this._properties.gridId); \r\n }\r\n //if(!isUnDefined(_this._properties.dataTable.filters)) {\r\n // _this.webGridFilter.configFilter(_this.libName,this, _this._properties.dataTable.filters);\r\n //}\r\n }\r\n ,order: _this._properties.dataTable.order\r\n // ,ajax: function (data, callback, settings) {\r\n // callback({ data: data }) //reloads data \r\n // } \r\n ,columnDefs: _this._properties.dataTable.columnDefsSettings \r\n ,ordering : gridProp.dataTable.ordering \r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable}\r\n }\r\n ); \r\n //\r\n $(gridProp.gridId+\"_filter\").remove();\r\n $(gridProp.gridId+\"_info\").remove(); \r\n this.webGridFilter.setResizeEvent(this._properties.gridId);\r\n //\r\n }\r\n \r\n //\r\n if (this._properties.dataTable.editable) {\r\n this.initWebGridEditableColumnClickEvents();\r\n }\r\n }\r\n\r\n addToolbarButtons(gridPanel: JQuery,buttons:SaopWebGridToolbarButton[]){\r\n if(global.isUnDefined(buttons) == false){\r\n buttons.forEach(_button => {\r\n var buttonTemplate = \r\n `\r\n \r\n \r\n
\r\n `;\r\n\r\n if (_button.template != null) {\r\n buttonTemplate = _button.template;\r\n }\r\n\r\n gridPanel.find(\"#toolbarButtons\").append(buttonTemplate); \r\n });\r\n }\r\n }\r\n\r\n generateHtmlTable() {\r\n this.generateTableBody(); \r\n this.generateTableHead();\r\n }\r\n\r\n generateTableHead() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if(!global.isUnDefined(this._properties.dataTable.columns)){\r\n let thead = this._tableDiv.createTHead();\r\n let row = thead.insertRow();\r\n for (let key of this._properties.dataTable.columns) {\r\n let th = document.createElement(\"th\");\r\n let text = document.createTextNode(key.name);\r\n th.appendChild(text);\r\n row.appendChild(th);\r\n }\r\n }\r\n }\r\n }\r\n \r\n generateTableBody() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if (!global.isUnDefined(this._properties.dataTable.data)){\r\n for (let element of this._properties.dataTable.data) {\r\n let row = this._tableDiv.insertRow();\r\n for (let key in element) {\r\n let cell = row.insertCell();\r\n let text = document.createTextNode(element[key]);\r\n cell.appendChild(text);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n addGridToolbar() {\r\n let gridPanel: JQuery;\r\n let _css = global.isUnDefined(this._properties.css) == false ? this._properties.css :\"\";\r\n\r\n let gridPanelTemplate = `\r\n \r\n `;\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n if (global.isUnDefined(this._properties.toolbar.id)) {\r\n this._properties.toolbar.id = this._properties.gridId+\"TB\";\r\n }\r\n let gridTogglePanel = ``;\r\n let gridTogglePanelClass = \"\";\r\n let gridBorderBottom = \"\";\r\n if(this._properties.togglePanel.enabled) {\r\n gridTogglePanelClass = \"collapse show\";\r\n gridBorderBottom = \"saop-border-bottom\";\r\n\r\n gridTogglePanel = \r\n `\r\n \r\n `; \r\n }\r\n\r\n let _toolbarItems = ``;\r\n if (!global.isUnDefined(this._properties.toolbar.itemsTemplateId)){\r\n let _toolbarItemsTemplate = $(this._properties.toolbar.itemsTemplateId);\r\n if (_toolbarItemsTemplate.length > 0){\r\n _toolbarItems = _toolbarItemsTemplate.html();\r\n _toolbarItemsTemplate.remove();\r\n }\r\n }\r\n\r\n gridPanelTemplate = `\r\n \r\n `;\r\n }\r\n gridPanelTemplate = gridPanelTemplate.replace(\"#slickGrid#\",this._properties.gridId.replace(\"#\",\"\"));\r\n gridPanel = $(gridPanelTemplate);\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n this.addToolbarButtons(gridPanel,this._properties.toolbar.buttons);\r\n }\r\n\r\n let _tableHtml = this._tableDiv;\r\n\r\n $(this._properties.gridId).replaceWith(gridPanel);\r\n\r\n $(this._properties.gridId).replaceWith(_tableHtml);\r\n }\r\n\r\n refreshData(data:any) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n data.each(function( index:any, tr:string ) {\r\n _this.dataTable.row.add($(tr));\r\n });\r\n this.dataTable.draw(); \r\n }\r\n\r\n replaceGridRows(htmlContent:string) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n $(this._properties.gridId+\" > tbody > tr\", $(htmlContent)).each(\r\n function(index:any,tr:any) {\r\n _this.dataTable.row.add($(tr));\r\n }\r\n );\r\n this.dataTable.draw(); \r\n } \r\n\r\n setTabelFoother():void {\r\n $(this._properties.gridId+' body') \r\n }\r\n\r\n initWebGridColumnCheckboxBindClickEvent() {\r\n let _this = this;\r\n this.markedColumnCheckbox = null;\r\n\r\n if (global.isUnDefined(this._tableDiv)) {\r\n return;\r\n }\r\n\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").off(\"change\");\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").on('change', function (row) {\r\n _this.markedColumnCheckbox = $(\"#\" + _this._tableDiv.id + \" #\" + row.currentTarget.id);\r\n\r\n // odznacimo vse ostale checkboxe\r\n $(\"#\" + _this._tableDiv.id + \" input.saop-td-input-checkbox:not(#\" + row.currentTarget.id + \")\").each(\r\n function () {\r\n $(\"#\" + _this._tableDiv.id + \" #\" + this.id).prop(\"checked\", false);\r\n }\r\n );\r\n\r\n _this.afterColumnCheckboxChanged();\r\n });\r\n }\r\n\r\n afterColumnCheckboxChanged(): void {\r\n\r\n }\r\n\r\n initWebGridEditableColumnClickEvents(): void {\r\n let _this = this;\r\n\r\n $(this._properties.gridId).off(\"click\", \"tbody td[data-editable='true']\");\r\n $(this._properties.gridId).on(\"click\", \"tbody td[data-editable='true']\", function (e) {\r\n _this._saopWebGridEdit.showWebGridEditableColumnEditControl(this);\r\n });\r\n }\r\n \r\n private onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n this.onEditTdCellWriteValueToTDElementComplete(tdElement);\r\n }\r\n\r\n onEditTdCellWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n // metoda za externo uporabo\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopInputWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n `; \r\n // this._inputTemplate = \r\n // `\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n/// \r\n/// \r\n\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopSelectizeSelect } from \"./saop-selectize-select\";\r\n\r\nexport class SaopInputMask {\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopInputMask.init...\");\r\n var inputDivs = document.querySelectorAll('input[data-inputmask-alias]');\r\n Inputmask().mask(inputDivs);\r\n\r\n $(\".saop-decimal-2\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 2,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,00'\r\n });\r\n\r\n $(\".saop-decimal-3\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 3,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,000'\r\n }); \r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv:any;\r\n let elementAtrr = $(element).attr(\"data-inputmask-alias\");\r\n if (global.isEmpty(elementAtrr)) {return;};\r\n global.ConsoleLogDegug(elementAtrr);\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return;};\r\n if (spanDiv.hasClass(\"has-float-label\")===false) { return;};\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" :languageAtrr;\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n\r\n if (elementAtrr === \"hh:mm:ss\") {\r\n let iconBtn = $(spanDiv).find(\"#timeIcon\");\r\n global.ConsoleLogDegug(\"clock...\");\r\n\r\n global.ConsoleLogDegug(\"clock.blur.init:\" + element.id);\r\n $(element).blur(function (event: any) {\r\n global.ConsoleLogDegug(\"call.clock.blur:\" + event.target.id);\r\n var controlValue = event.target.value;\r\n if (controlValue.includes(\"h\")) {\r\n event.target.value = \"\";\r\n return;\r\n }\r\n controlValue = controlValue.replace(\"mm\", \"00\");\r\n controlValue = controlValue.replace(\"m\", \"0\");\r\n controlValue = controlValue.replace(\"ss\", \"00\");\r\n controlValue = controlValue.replace(\"s\", \"0\");\r\n event.target.value = controlValue;\r\n // prozimo input even, ker smo vpisali novo vrednost \r\n const e = new Event(\"input\");\r\n event.target.dispatchEvent(e);\r\n });\r\n\r\n global.ConsoleLogDegug(\"clock.click.init:\" + element.id);\r\n $(iconBtn).click(function (event: any) {\r\n global.ConsoleLogDegug(\"clockIcon.clicked:\" + element.id);\r\n var ctrlInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var ctrlInputCtrlStrLength = ctrlInputCtrl.value.length * 2;\r\n ctrlInputCtrl.focus();\r\n ctrlInputCtrl.setSelectionRange(ctrlInputCtrlStrLength, ctrlInputCtrlStrLength);\r\n });\r\n } else if (elementAtrr === \"dd.mm.yyyy\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm:ss\"\r\n ) {\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\"); \r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\",\r\n showOnFocus:false\r\n //forceParse:false,\r\n }); \r\n\r\n $(iconBtn).click(function() \r\n {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n //datepickerInputCtrl.focus();\r\n $(element).datepicker(\"show\");\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n\r\n $(iconBtn).click(function() \r\n {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm:ss\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm:ss ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm:ss',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n //$(element).off(\"keydown\");\r\n // .on('dp.hide', function(e){\r\n // console.log('dp.hide');\r\n // }) \r\n // .on('dp.show', function(e){\r\n // console.log('dp.show');\r\n // }); \r\n //\r\n $(iconBtn).click(function() \r\n {\r\n // global.ConsoleLogDegug(\"calendar...click\");\r\n // if ($(document).find(\".datepicker-dropdown\").is(\":visible\")) {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n // $(element).focus(function (event: any) {\r\n // $(element).data(\"DateTimePicker\").hide(); \r\n // }); \r\n } else {\r\n console.log(\"not implemented...\");\r\n }\r\n\r\n });\r\n\r\n this.initMultiDateSelectDatepicker();\r\n\r\n this.initSelectizeSelect();\r\n\r\n this.initSelectizeMultiselectSelect();\r\n\r\n global.ConsoleLogDegug(\"initInputs...done\");\r\n }\r\n\r\n private initMultiDateSelectDatepicker(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...\");\r\n\r\n var inputDivs = document.querySelectorAll('input[data-izbor-vec-dni]');\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv: any;\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return; };\r\n if (spanDiv.hasClass(\"has-float-label\") === false) { return; };\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" : languageAtrr;\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\");\r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: false,\r\n multidate: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\"\r\n });\r\n\r\n $(iconBtn).click(function () {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n datepickerInputCtrl.focus();\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n });\r\n\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...done\");\r\n }\r\n\r\n private initSelectizeSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...\");\r\n\r\n $('.selectizeSelect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselectSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...\");\r\n\r\n $('.selectizeMultiselect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initMultiselectControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...done\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport class MenuSidebar {\r\n\r\n protected _collElement: HTMLElement;\r\n protected _expElement: HTMLElement;\r\n private _menuSidebarPopover: SaopPopover;\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.init...\");\r\n\r\n this._collElement = document.getElementById(\"collapse-icon-coll\");\r\n this._expElement = document.getElementById(\"collapse-icon-exp\");\r\n if (this._collElement != null) this._collElement.style.display = \"none\";\r\n if (this._expElement != null) this._expElement.style.display = \"block\";\r\n\r\n let _this = this;\r\n\r\n // Expand icon click\r\n $(\"#collapse-icon-exp\").off(\"click\");\r\n $(\"#collapse-icon-exp\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-exp.click\");\r\n\r\n _this._menuSidebarPopover.enablePopover();\r\n });\r\n\r\n // Collapse icon click\r\n $(\"#collapse-icon-coll\").off(\"click\");\r\n $(\"#collapse-icon-coll\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-coll.click\");\r\n\r\n _this._menuSidebarPopover.disablePopover();\r\n });\r\n\r\n // Collapse click\r\n $('[data-toggle=sidebar-colapse]').click(\r\n function () {\r\n _this.sidebarCollapse();\r\n }\r\n );\r\n\r\n //menu item click\r\n $(\".saop-bg-item\").click(\r\n function () {\r\n //sessionStorage.setItem(\"saop-menu-previous-item-id\", sessionStorage.getItem(\"saop-menu-item-id\"));\r\n //sessionStorage.setItem(\"saop-menu-item-id\", this.id);\r\n //sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n }\r\n )\r\n\r\n //menu sub-item click\r\n //$(\".saop-bg-subitem\").click(\r\n // function(){\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", this.id);\r\n // }\r\n //)\r\n\r\n if (document.getElementById(\"menu-sidebar\") != null)\r\n this.GetSessionStorageValues();\r\n else\r\n this.DeleteSessionStorageValues();\r\n\r\n this.initMenuSidebarPopover();\r\n }\r\n\r\n protected sidebarCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.sidebarCollapse\");\r\n $('#menuTopIconLarge').toggleClass('d-none');\r\n $('#menuTopIconSmall').toggleClass('d-none');\r\n $('.sidebar-menu-caption').toggleClass('d-none');\r\n $('#sidebar-container').toggleClass('sidebar-expanded sidebar-collapsed');\r\n $('.saop-bg-subitems').toggleClass('d-none');\r\n $('#menuCloseButton').toggleClass('d-none');\r\n var SeparatorTitle = $('#sidebar-container');\r\n if (SeparatorTitle.hasClass('sidebar-collapsed')) {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"true\")\r\n this._collElement.style.display = \"block\";\r\n this._expElement.style.display = \"none\";\r\n } else {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"false\")\r\n this._collElement.style.display = \"none\";\r\n this._expElement.style.display = \"block\";\r\n }\r\n }\r\n\r\n protected menuItemCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.menuItemCollapse\");\r\n //var previousItemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var itemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var subitemsID = itemID+\"-collapse\";\r\n //var subitemID = sessionStorage.getItem(\"saop-menu-subitem-id\");\r\n\r\n //var previous = $(\"#\" + previousItemID);\r\n //var item = $('#'+itemID);\r\n //var subitems = $(\"#\" + subitemsID);\r\n //var subitem = $(\"#\"+subitemsID+\">#\"+subitemID);\r\n\r\n //previous.removeClass(\"saop-bg-item-selected\");//'un-color' previous item\r\n //previous[0].setAttribute(\"aria-expanded\", \"false\");\r\n //item[0].setAttribute(\"aria-expanded\", \"true\");\r\n //item.addClass(\"saop-bg-item-selected\");//color item\r\n //subitems.addClass('show');//expand collapse\r\n //subitem.addClass(\"saop-bg-subitem-selected\");//color subitem\r\n }\r\n\r\n protected GetSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.GetSessionStorageValues\");\r\n //defaults\r\n //if (sessionStorage.getItem(\"saop-menu-item-id\") == null) {\r\n //sessionStorage.setItem(\"saop-menu-sidebar-expanded\", null);\r\n // sessionStorage.setItem(\"saop-menu-previous-item-id\", null);\r\n // sessionStorage.setItem(\"saop-menu-item-id\", \"namizje\");\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n //}\r\n\r\n //sidebar expanded/contracted\r\n if (sessionStorage.getItem(\"saop-menu-sidebar-expanded\") == \"true\") {\r\n this.sidebarCollapse();\r\n }\r\n\r\n //selected-menu item\r\n this.menuItemCollapse()\r\n }\r\n\r\n protected DeleteSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.DeleteSessionStorageValues\");\r\n\r\n sessionStorage.removeItem(\"saop-menu-sidebar-expanded\");\r\n //sessionStorage.removeItem(\"saop-menu-previous-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-subitem-id\");\r\n }\r\n\r\n initMenuSidebarPopover() {\r\n global.ConsoleLogDegug(\"MenuSidebar.initMenuSidebarPopover\");\r\n\r\n this._menuSidebarPopover = new SaopPopover(\".menu-popup\");\r\n this._menuSidebarPopover.initSelfContainerPopover();\r\n this._menuSidebarPopover.disablePopover();\r\n\r\n var elementVisible = $(\"#collapse-icon-coll\").is(':visible');\r\n if (elementVisible) {\r\n this._menuSidebarPopover.enablePopover();\r\n } else {\r\n this._menuSidebarPopover.disablePopover();\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport enum SaopMsgDlgType {\r\n mtInformation = 1\r\n ,mtWarning = 2\r\n ,mtError = 3\r\n //, mtConfirmation, mtCustom\r\n}\r\n\r\nexport enum SaopMsgDlgButton {\r\n mbNone = 0\r\n ,mbOK = 1\r\n ,mbCancel = 2\r\n ,mbYes = 3\r\n ,mbNo = 4\r\n}\r\n\r\nexport interface SaopMsgDlgEvent {\r\n parent:any;\r\n data:any;\r\n}\r\n\r\ntype SaopMsgDlgButtons = Array;\r\n\r\n\r\n\r\nexport class SaopMessageDlg {\r\n private _sender:SaopMsgDlgEvent;\r\n public onOk: (sender:any) => any = null;\r\n public onCancel: (sender:any) => any = null;\r\n public onYes: (sender:any) => any = null;\r\n public onNo: (sender:any) => any = null;\r\n\r\n constructor(sender:SaopMsgDlgEvent){\r\n this._sender = sender;\r\n }\r\n\r\n Show(Msg:string,Title:string,DlgType:SaopMsgDlgType = SaopMsgDlgType.mtInformation,Buttons:SaopMsgDlgButtons = [SaopMsgDlgButton.mbOK]):SaopMsgDlgButton{\r\n console.log(\"message:\"+Msg);\r\n console.log(\"title:\"+Title);\r\n let _this = this;\r\n\r\n let titleDiv = $('#alert-modal-title-div');\r\n let bodyTag = $('#alert-modal-body');\r\n\r\n if (DlgType == SaopMsgDlgType.mtInformation){\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"white\");\r\n } else if (DlgType == SaopMsgDlgType.mtError) {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"#D82C25\");\r\n } else {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"silver\"); \r\n }\r\n\r\n if (!global.isEmpty(Title)){\r\n titleDiv.html(Title);\r\n }\r\n \r\n bodyTag.html(Msg);\r\n\r\n if (Buttons !== null) {\r\n let _element_mbOK = Buttons.find(element => element === SaopMsgDlgButton.mbOK);\r\n if (global.isUnDefined(_element_mbOK)) {\r\n $(\"#btnAlertOK\").remove();\r\n } else {\r\n $(\"#btnAlertOK\").off(\"click\");\r\n $(\"#btnAlertOK\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onOk)){\r\n _this.onOk(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbOK;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbCancel = Buttons.find(element => element === SaopMsgDlgButton.mbCancel);\r\n if (global.isUnDefined(_element_mbCancel)) {\r\n $(\"#btnAlertCancel\").remove();\r\n } else {\r\n $(\"#btnAlertCancel\").off(\"click\");\r\n $(\"#btnAlertCancel\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onCancel)){\r\n _this.onCancel(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbCancel;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbYes = Buttons.find(element => element === SaopMsgDlgButton.mbYes);\r\n if (global.isUnDefined(_element_mbYes)) {\r\n $(\"#btnAlertYes\").remove();\r\n } else {\r\n $(\"#btnAlertYes\").off(\"click\");\r\n $(\"#btnAlertYes\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onYes)){\r\n _this.onYes(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbYes;\r\n }\r\n ); \r\n } \r\n //\r\n let _element_mbNo = Buttons.find(element => element === SaopMsgDlgButton.mbNo);\r\n if (global.isUnDefined(_element_mbNo)) {\r\n $(\"#btnAlertNo\").remove();\r\n } else {\r\n $(\"#btnAlertNo\").off(\"click\");\r\n $(\"#btnAlertNo\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onNo)){\r\n _this.onNo(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbNo;\r\n }\r\n ); \r\n } \r\n } else {\r\n $(\"#btnAlertOK\").remove();\r\n $(\"#btnAlertCancel\").remove();\r\n $(\"#btnAlertYes\").remove();\r\n $(\"#btnAlertNo\").remove();\r\n return SaopMsgDlgButton.mbNone;\r\n }\r\n\r\n $('#alert-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#alert-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n \r\n $('#alert-modal').modal('show');\r\n global.setModalFormZIndex('#alert-modal'); \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport interface SaopMultiselectParams {\r\n target:string,\r\n selectAll?:boolean\r\n}\r\n\r\nexport interface SaopMultiselectOptions {\r\n templatesButton?: string\r\n}\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nexport class SaopMultiselect {\r\n private _libName:string;\r\n private _translationService: SaopTranslationService;\r\n private _caption: string = \"Skupina\";\r\n private _multiSelectObject: any;\r\n private _options: SaopMultiselectOptions;\r\n //\r\n public msContainer:JQuery;\r\n public msButton: JQuery;\r\n public msPopupContainer: JQuery;\r\n public msContainerLabel:JQuery;\r\n public selectedCB:any;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"SaopMultiselect\");\r\n this._translationService = new SaopTranslationService();\r\n this.setOptions(options);\r\n } \r\n\r\n setOptions(options: SaopMultiselectOptions): void {\r\n // first set default options\r\n this._options = {\r\n templatesButton: ''\r\n }\r\n\r\n if (options != null) {\r\n this._options = options;\r\n if (options.templatesButton != null) {\r\n this._options.templatesButton = options.templatesButton;\r\n }\r\n }\r\n }\r\n\r\n setTerminologyList() {\r\n let _terminology: string[] = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih'];\r\n if (!global.isEmpty(this._caption)) {\r\n _terminology = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih', this._caption];\r\n } \r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n bindDiv(elemet:any){\r\n this.msContainer = $(elemet.$container);\r\n this.msButton = $(elemet.$button);\r\n this.msContainerLabel = this.msContainer.find(\"#containerLabel\");\r\n this.msPopupContainer = $(elemet.$popupContainer);\r\n //this.selectedCB = elemet.$select;\r\n\r\n if (this.selectedCB.val().length){\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n } \r\n }\r\n\r\n setMsFloatingLabel(isEmpry:boolean){\r\n if (isEmpry){\r\n this.msContainerLabel.addClass('ms-float-label-empty');\r\n this.msContainerLabel.removeClass('ms-float-label-selected');\r\n } else {\r\n this.msContainerLabel.removeClass('ms-float-label-empty');\r\n this.msContainerLabel.addClass('ms-float-label-selected'); \r\n } \r\n }\r\n\r\n onInitializedControl(element: any) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.onInitializedControl\");\r\n\r\n if (this.selectedCB.hasClass(\"input-validation-error\")) {\r\n this.msButton.addClass(\"saop-error-input\");\r\n this.msContainerLabel.addClass(\"saop-error-input-text\");\r\n }\r\n\r\n // dodamo sticky css za prvi element\r\n this.addStickyClass();\r\n\r\n this.afterInitializedControl(element);\r\n }\r\n\r\n addStickyClass(): void {\r\n global.ConsoleLogDegug(\"SaopMultiselect.addStickyClass\");\r\n\r\n let seznam = this.msContainer.find(\"button.multiselect-option.dropdown-item\").each(function (index: number, elem: any) {\r\n let selectItem = $(elem);\r\n if (selectItem.text() === \"\") {\r\n selectItem.addClass(\"saop-multiselect-item-sticky\");\r\n }\r\n });\r\n }\r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n global.ConsoleLogDegug(\"SaopMultiselect.init\");\r\n\r\n this._caption = caption;\r\n\r\n // poiscemo prevode (tudi za this._caption)\r\n this.setTerminologyList();\r\n\r\n if (global.isEmpty(target)) {target = \".saop-multiselect\";}\r\n\r\n this.selectedCB = $(target);\r\n\r\n // ali ima selectedCB data-caption\r\n let selectCaption = \"\";\r\n if (!global.isEmpty(this._caption)) {\r\n selectCaption = this._translationService.translate(this._caption);\r\n }\r\n let dataCaption = this.selectedCB.attr(\"data-caption\");\r\n if (!global.isEmpty(dataCaption)) {\r\n selectCaption = dataCaption;\r\n }\r\n\r\n let _this = this;\r\n\r\n $(target).multiselect({\r\n maxHeight: 350, \r\n enableFiltering: true,\r\n includeSelectAllOption: true,\r\n enableCaseInsensitiveFiltering: true,\r\n enableFullValueFiltering: false,\r\n filterPlaceholder: this._translationService.translate(\"Išči\"),\r\n nonSelectedText: '',\r\n allSelectedText:this._translationService.translate(\"Vsi\"),\r\n selectAllText:this._translationService.translate(\"Izberi prikazane\"),\r\n nSelectedText:this._translationService.translate(\"izbranih\"),\r\n includeFilterClearBtn: true,\r\n disableIfEmpty: false,\r\n numberDisplayed: 2,\r\n buttonWidth: '200px',\r\n buttonClass :'saop-control form-control shadow-none ms-image-down pr-0',\r\n buttonContainer: '',\r\n onSelectAll: function (selectedOptions: JQuery) {\r\n _this.bindDiv(this);\r\n _this.afterSelectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onDeselectAll: function(selectedOptions:JQuery){\r\n _this.bindDiv(this);\r\n _this.afterDeselectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onChange: function(option: JQuery, checked: boolean){\r\n _this.bindDiv(this);\r\n _this.afterChange(option, checked);\r\n _this.afterChangeCommonEvent(this.$select);\r\n },\r\n onInitialized: function ($select, $container) {\r\n _this._multiSelectObject = this;\r\n _this.bindDiv(this);\r\n _this.onInitializedControl(this);\r\n },\r\n templates: {\r\n button: this._options.templatesButton,\r\n filter: '',\r\n } \r\n })\r\n .multiselect('selectAll', false, true)\r\n .multiselect('updateButtonText');\r\n ; \r\n }\r\n\r\n rebuild(): void {\r\n this.selectedCB.multiselect('rebuild');\r\n }\r\n\r\n afterSelectAll(selectedOptions: JQuery) {\r\n\r\n }\r\n\r\n afterDeselectAll(selectedOptions:JQuery){\r\n\r\n }\r\n\r\n afterChange(option: JQuery, checked: boolean){\r\n\r\n }\r\n\r\n afterChangeCommonEvent(element:any){\r\n\r\n }\r\n\r\n afterInitializedControl(element: any){\r\n global.ConsoleLogDegug(\"SaopMultiselect.afterInitializedControl\");\r\n }\r\n\r\n // selectValues vrednosti\r\n setSelectValues(selectValues: string[]): void {\r\n // odznacimo vse zaposlene\r\n this.selectedCB.multiselect('deselectAll');\r\n\r\n if (selectValues != null) {\r\n // oznacimo izbrane\r\n this.selectedCB.multiselect('select', selectValues);\r\n }\r\n this.selectedCB.multiselect('refresh');\r\n\r\n if (this._multiSelectObject != null) {\r\n this.bindDiv(this._multiSelectObject);\r\n this.afterChangeCommonEvent(this._multiSelectObject.$select);\r\n } \r\n }\r\n\r\n clearHtmlOptions(): void {\r\n this.selectedCB\r\n .find('option')\r\n .remove()\r\n .end();\r\n }\r\n\r\n refreshHtmlOptions(optionList: SelectOption[], selectAll: boolean = false): void {\r\n let _this = this;\r\n\r\n this.clearHtmlOptions();\r\n if (optionList.length > 0) {\r\n optionList.forEach(element => _this.selectedCB.append(''));\r\n }\r\n this.rebuild();\r\n this.addStickyClass();\r\n\r\n if (selectAll) {\r\n this.selectedCB.multiselect('selectAll');\r\n\r\n if (this.selectedCB.val().length) {\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n }\r\n }\r\n }\r\n \r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopPinchZoom } from \"../Components/saop-pinch-and-zoom\";\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPdfPreview {\r\n private _pdfjsLib:any;\r\n private _canvas:any;\r\n private _viewer:any;\r\n private _pdf:any;\r\n private _scale = 1;\r\n //\r\n private _documentId:string;\r\n private _url:string;\r\n private _fileName:string;\r\n private _base64:string;\r\n private _type:string;\r\n private _saopPinchZoom:SaopPinchZoom;\r\n\r\n loadpdfjsLib(pdfjsLib:any):void{\r\n this._pdfjsLib = pdfjsLib;\r\n this._saopPinchZoom = new SaopPinchZoom();\r\n }\r\n\r\n renderPage(pageNumber:any, canvas:any):void {\r\n let _this = this;\r\n this._pdf.getPage(pageNumber).then(function(page:any) {\r\n _this._viewer = page.getViewport({ scale: _this._scale });\r\n\r\n // let _viewerOffset = $('.pdf-viewer-inner').offset();\r\n // let _w = Math.max(document.documentElement.clientWidth - _viewerOffset.left, window.innerWidth - _viewerOffset.left -272 || 0)\r\n\r\n // let _w = $('#pdf-viewer').width();\r\n // canvas.height = _this._viewer.height;\r\n // canvas.width = _w - 10;\r\n let _w = (_this._viewer.width as string)+'px'\r\n $('.saop-col-view').css('min-width', _w);\r\n\r\n canvas.height = _this._viewer.height - 10;\r\n canvas.width = _this._viewer.width - 10; \r\n\r\n page.render({canvasContext: canvas.getContext('2d'), viewport: _this._viewer}).promise.then(function() {\r\n console.log('Page rendering complete.');\r\n _this._saopPinchZoom.init(\"pdf-viewer\");\r\n });\r\n });\r\n } \r\n\r\n setDefaultScale(scale:number):void{\r\n this._saopPinchZoom.setDefaultScale(scale);\r\n }\r\n\r\n base64ToUint8Array(base64:string):any{\r\n var raw = atob(base64);\r\n var uint8Array = new Uint8Array(raw.length);\r\n for (var i = 0; i < raw.length; i++) {\r\n uint8Array[i] = raw.charCodeAt(i);\r\n }\r\n return uint8Array;\r\n } \r\n\r\n loadingPdfTask(loadingTask:any):void{\r\n let _this = this;\r\n loadingTask.promise.then(function(pdf:any) {\r\n _this._pdf = pdf;\r\n _this._viewer = document.getElementById('pdf-viewer');\r\n \r\n for(let page = 1; page <= pdf.numPages; page++) {\r\n \r\n \r\n _this._canvas = document.createElement(\"canvas\"); \r\n _this._canvas.className = 'pdf-page-canvas'; \r\n \r\n let _row = document.createElement(\"div\");\r\n _row.className = 'row m-0 p-0'; \r\n\r\n let _col = document.createElement(\"div\");\r\n _col.className = 'col m-0 p-0 saop-col-view'; \r\n\r\n _col.appendChild(_this._canvas); \r\n\r\n _row.appendChild(_col); \r\n\r\n _this._viewer.appendChild(_row);\r\n _this.renderPage(page, _this._canvas);\r\n //\r\n //new SaopPinchZoom().init(\"pdf-viewer\");\r\n \r\n }\r\n\r\n // _this._saopPinchZoom.init(\"pdf-viewer\");\r\n // $('.pdf-page-canvas').attr(\"onload\",\"saopPdfPreview.setDefaultScale(0.6);\");\r\n // $('div[onload]').trigger('onload');\r\n }); \r\n }\r\n\r\n getFileNameByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"HEAD\",\r\n url: url, \r\n success: function(message, text, response){\r\n _this._type = response.getResponseHeader('Content-Type');\r\n _this.documentRender();\r\n },\r\n }); \r\n }\r\n\r\n getFileContentByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"GET\",\r\n url: url, \r\n success: function(message, text, response){\r\n let _container = $('');\r\n _container.html(response.responseText);\r\n _container.append(_container);\r\n $('#pdf-viewer').append(_container);\r\n },\r\n }); \r\n }\r\n\r\n private renderErrorDiv():void{\r\n //$('#pdf-viewer').html('Ni dokumentov za prikaz
');\r\n }\r\n\r\n documentPreview():void {\r\n let _this = this;\r\n this.renderErrorDiv();\r\n this._documentId = $(\"#myModel_DocumentId\").val() as string;\r\n this._url = $(\"#myModel_FileUrl\").val() as string;\r\n this._fileName = $(\"#myModel_FileName\").val() as string;\r\n this._base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n let _w = screen.width;\r\n\r\n if (this._url.length > 0 && this._fileName.length == 0) {\r\n this.getFileNameByUrl(this._url);\r\n }\r\n\r\n if (this._base64.length == 0) {return;}\r\n\r\n let _fileExtension = this._fileName.split('.').pop().toLocaleLowerCase();\r\n\r\n if (_fileExtension.length == 0) {return;}\r\n\r\n this._type = \"image/png\";\r\n if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n this._type = \"application/pdf\";\r\n } else {\r\n this._type = \"image/\"+_fileExtension;\r\n }\r\n\r\n this.documentRender();\r\n\r\n } \r\n\r\n documentRender():void {\r\n let _w = screen.width;\r\n\r\n if(_w <= 800 && this._type.includes(\"pdf\") == true){\r\n //\r\n this.preparePdfNodes();\r\n let loadingTask:any;\r\n if (this._base64.length > 0) {\r\n let _array = this.base64ToUint8Array(this._base64);\r\n loadingTask = this._pdfjsLib.getDocument(_array); \r\n } else {\r\n loadingTask = this._pdfjsLib.getDocument(this._url); \r\n }\r\n this.loadingPdfTask(loadingTask);\r\n } else if (this._type.includes(\"text/html\")) { \r\n this.getFileContentByUrl(this._url)\r\n } else {\r\n if (this._base64.length > 0) {\r\n $('#pdf-viewer').html('');\r\n } else {\r\n $('#pdf-viewer').html(''); \r\n } \r\n }\r\n } \r\n\r\n private preparePdfNodes():void{\r\n let _parent = $('#pdf-viewer').parent();\r\n\r\n let _main = document.createElement(\"div\");\r\n _main.className = 'pdf-viewer-main'; \r\n\r\n let _inner = document.createElement(\"div\");\r\n _inner.className = 'pdf-viewer-inner';\r\n\r\n let _viewer = document.createElement(\"div\");\r\n _viewer.id = 'pdf-viewer'; \r\n\r\n _inner.appendChild(_viewer);\r\n\r\n _main.appendChild(_inner);\r\n\r\n _parent.html(_main); \r\n }\r\n\r\n // loadBase64Pdf():void{\r\n // let _base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n // if (_base64.length > 0) {\r\n // let _fileName = $(\"#myModel_FileName\").val() as string;\r\n // let _fileExtension = _fileName.split('.').pop().toLocaleLowerCase();\r\n // let _w = screen.width;\r\n\r\n // if(_w <= 800 && _fileExtension.toLocaleLowerCase() == \"pdf\"){\r\n // //\r\n // this.preparePdfNodes();\r\n // let _array = this.base64ToUint8Array(_base64);\r\n // var loadingTask = this._pdfjsLib.getDocument(_array); \r\n // this.loadingPdfTask(loadingTask);\r\n // } else {\r\n // let _type = \"image/png\";\r\n // if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n // _type = \"application/pdf\";\r\n // } else {\r\n // _type = \"image/\"+_fileExtension;\r\n // }\r\n\r\n // $('#pdf-viewer').html('');\r\n // }\r\n // }\r\n // }\r\n\r\n //\r\n \r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPinchZoom {\r\n\tprivate _initialized:boolean = false;\r\n\t// private _defaultSet = {x: -60, y: -53,z: 0.6};\r\n\tprivate _defaultSet = {x: 0, y: 0,z: 0.6};\r\n\tprivate _element :any;\r\n\tprivate _hammertime :any;\r\n\r\n\tprivate _fixHammerjsDeltaIssue :any;\r\n\tprivate _pinchStart :any;\r\n\tprivate _lastEvent :any;\r\n\t\r\n\tprivate _originalSize :any;\t\r\n\tprivate _current :any;\r\n\tprivate _last :any;\t\r\n\tprivate _pinchZoomOrigin :any;\r\n\t\r\n\t//\r\n\t\r\n\tsleep(milliseconds:number):void {\r\n\t\tconst date = Date.now();\r\n\t\tlet currentDate = null;\r\n\t\tdo {\r\n\t\t\tcurrentDate = Date.now();\r\n\t\t} while (currentDate - date < milliseconds);\r\n\t}\r\n\r\n\tinit(id:string){\r\n\t\tconsole.log(\"init...\");\r\n\t\tthis._element = document.getElementById(id);\r\n\r\n\t\t// let _w = $( window ).width();//this._element.offsetWidth;\r\n\t\t// //let _pdfW = parseInt($(\".pdf-page-canvas\").width())) * 0.6;\r\n\t\t// let _pdfW = $(\".pdf-page-canvas\").width() * 0.6;\r\n\t\t// this._defaultSet.x = ( _w - _pdfW) / 2;\r\n\t\t//\r\n\r\n\t\tthis._hammertime = new Hammer(this._element, {});\t\t\r\n\t\t\r\n\t\tthis._hammertime.get('pinch').set({ enable: true });\r\n\t\tthis._hammertime.get('pan').set({ threshold: 0 });\r\n\r\n \tthis._pinchStart = { x: 0, y: 0 };\r\n\r\n\t\tthis._originalSize = {width: 200, height: 300};\t\r\n\t\tthis._current = {x: 0, y: 0, z: 0, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis._last = {x: this._current.x, y:this._current.y, z:this._current.z}\t\t\r\n\r\n\t\tthis.initEvents();\r\n\r\n\t\tthis._initialized = true;\r\n\t\t\r\n\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\t}\r\n\r\n\tsetDefaultScale(scale:number) {\r\n\t\tconsole.log(\"scale:\"+scale.toString());\r\n\t\tif (this._initialized == false) {return; };\r\n\t\t//this.sleep(500);\r\n\r\n\t\tlet _this = this;\r\n\t\t//\r\n\t\tthis._defaultSet.z = scale;\r\n\t\t//\r\n\t\tthis._current = {x: 0, y: 0, z: this._defaultSet.z, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis.update();\r\n\t\t//\r\n\t\tlet _screenWidth = $( window ).width();\r\n \tlet _pdfWidth = parseInt($(\".pdf-page-canvas\").attr(\"width\"));\r\n\t\t_pdfWidth = _pdfWidth * this._defaultSet.z;\r\n\t\tlet _leftCanvas = (_screenWidth - (_screenWidth * this._defaultSet.z)) / 2;\r\n\t\tlet _diffLeft = (_screenWidth - _pdfWidth) / 2;\r\n\t\tthis._defaultSet.x = (_leftCanvas - _diffLeft + 5) * (-1);\r\n\t\t// //\r\n\t\tlet _pdfDocHeight = $(\"#document-preview\").height();\r\n\t\tif (_pdfDocHeight <= 0 ) {\r\n\t\t\t_pdfDocHeight = 280;\r\n\t\t}\r\n\t\tthis._defaultSet.y = ((_pdfDocHeight - (_pdfDocHeight * this._defaultSet.z))/2) * (-1);\t\t\r\n\t\t//\r\n\t\t\r\n\t\tthis._current.x = this._defaultSet.x\r\n\t\tthis._current.y = this._defaultSet.y;\r\n\t\tthis._current.z = this._defaultSet.z;\r\n\r\n\t\tthis._last.x = this._defaultSet.x\r\n\t\tthis._last.y = this._defaultSet.y;\r\n\t\tthis._last.z = this._defaultSet.z;\r\n\r\n\t\tthis.update();\r\n\t}\r\n\r\n\tupdate():void {\r\n\t this._current.height = this._originalSize.height * this._current.z;\r\n\t this._current.width = this._originalSize.width * this._current.z;\r\n\t this._element.style.transform = \"translate3d(\" + this._current.x + \"px, \" + this._current.y + \"px, 0) scale(\" + this._current.z + \")\";\r\n\t}\r\n\r\n\tgetCoords(elem:any):any { // crossbrowser version\r\n\t var box = elem.getBoundingClientRect();\r\n\r\n\t var body = document.body;\r\n\t var docEl = document.documentElement;\r\n\r\n\t var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n\t var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n\r\n\t var clientTop = docEl.clientTop || body.clientTop || 0;\r\n\t var clientLeft = docEl.clientLeft || body.clientLeft || 0;\r\n\r\n\t var top = box.top + scrollTop - clientTop;\r\n\t var left = box.left + scrollLeft - clientLeft;\r\n\r\n\t return { x: Math.round(left), y: Math.round(top) };\r\n\t}\r\n\r\n\r\n\tgetCoordinateShiftDueToScale(size:any, scale:any):any{\r\n\t var newWidth = scale * size.width;\r\n\t var newHeight = scale * size.height;\r\n\t var dx = (newWidth - size.width) / 2;\r\n\t var dy = (newHeight - size.height) / 2;\r\n\t return {\r\n\t\tx: dx,\r\n\t\ty: dy\r\n\t };\r\n\t}\r\n\r\n\tscaleFrom(zoomOrigin:any, currentScale:any, newScale:any):any {\r\n\t var currentShift = this.getCoordinateShiftDueToScale(this._originalSize, currentScale);\r\n\t var newShift = this.getCoordinateShiftDueToScale(this._originalSize, newScale);\r\n\r\n\t var zoomDistance = newScale - currentScale\r\n\t \r\n\t var shift = {\r\n\t\tx: currentShift.x - newShift.x,\r\n\t\ty: currentShift.y - newShift.y,\r\n\t }\r\n\r\n\t var output = {\r\n\t\tx: zoomOrigin.x * shift.x,\r\n\t\ty: zoomOrigin.y * shift.y,\r\n\t\tz: zoomDistance\r\n\t }\r\n\t return output;\r\n\t}\r\n\r\n\tgetRelativePosition(element:any, point:any, originalSize:any, scale:any):any {\r\n\t var domCoords = this.getCoords(element);\r\n\r\n\t var elementX = point.x - domCoords.x;\r\n\t var elementY = point.y - domCoords.y;\r\n\r\n\t var relativeX = elementX / (originalSize.width * scale / 2) - 1;\r\n\t var relativeY = elementY / (originalSize.height * scale / 2) - 1;\r\n\t return { x: relativeX, y: relativeY }\r\n\t}\r\n\r\n\tinitEvents():void {\r\n\t\tlet _this = this;\r\n\r\n\t\tthis._hammertime.on('panend', (function(e:any) {\r\n\t\t\tconsole.log(\"panend\");\r\n\t\t if (this._current.scale != this._last.scale) {\r\n\t\t \tthis._last.x = this._current.x;\r\n\t\t }\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._lastEvent = 'panend';\r\n\t\t}).bind(this));\r\n\r\n\t\tthis._hammertime.on('pinchend', (function(e:any) {\r\n\t\t\tconsole.log(\"pinchend\");\r\n\t\t this._last.x = this._current.x;\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._last.z = this._current.z;\r\n\t\t this._lastEvent = 'pinchend';\r\n\t\t}).bind(this));\t\r\n\r\n\t\tthis._hammertime.on('pinchstart', (function(e:any) {\r\n\t\t this._pinchStart.x = e.center.x;\r\n\t\t this._pinchStart.y = e.center.y;\r\n\t\t this._pinchZoomOrigin = this.getRelativePosition(this._element, { x: this._pinchStart.x, y: this._pinchStart.y }, this._originalSize, this._current.z);\r\n\t\t this._lastEvent = 'pinchstart';\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('pinch', (function(e:any) {\r\n\t\t console.log(\"pinch\");\r\n\t\t var d = this.scaleFrom(this._pinchZoomOrigin, this._last.z, this._last.z * e.scale)\r\n\t this._current.x = d.x + this._last.x + e.deltaX;\r\n\t\t this._current.y = d.y + this._last.y + e.deltaY;\r\n\t\t this._current.z = d.z + this._last.z;\r\n\t\t this._lastEvent = 'pinch';\r\n\t\t this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('doubletap', (function(e:any) {\r\n\t\t\tconsole.log(\"doubletap\");\r\n\t\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\r\n\t\t// var _this = this; \r\n\t\t// var scaleFactor = 1;\r\n\t\t// if (this._current.zooming === false) {\r\n\t\t// \tthis._current.zooming = true;\r\n\t\t// } else {\r\n\t\t// \tthis._current.zooming = false;\r\n\t\t// \tscaleFactor = -scaleFactor;\r\n\t\t// }\r\n\r\n\t\t// this._element.style.transition = \"0.3s\";\r\n\t\t// setTimeout(function() {\r\n\t\t// \t_this._element.style.transition = \"none\";\r\n\t\t// }, 300)\r\n\r\n\t\t// var zoomOrigin = this.getRelativePosition(this._element, { x: e.center.x, y: e.center.y }, this._originalSize, this._current.z);\r\n\t\t// var d = this.scaleFrom(zoomOrigin, this._current.z, this._current.z + scaleFactor)\r\n\t\t// this._current.x += d.x;\r\n\t\t// this._current.y += d.y;\r\n\t\t// this._current.z += d.z;\r\n\r\n\t\t// this._last.x = this._current.x;\r\n\t\t// this._last.y = this._current.y;\r\n\t\t// this._last.z = this._current.z;\r\n\r\n\t\t// this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\t\r\n\t\tthis._hammertime.on('pan', (function(e:any) {\r\n\t\t console.log(\"pan\");\r\n\t\t if (this._lastEvent !== 'pan') {\r\n\t\t\tthis._fixHammerjsDeltaIssue = {\r\n\t\t\t x: e.deltaX,\r\n\t\t\t y: e.deltaY\r\n\t\t\t};\r\n\t\t };\r\n\r\n\t\t if (this._current.z != this._defaultSet.z){\r\n\t\t\tthis._current.x = this._last.x + e.deltaX - this._fixHammerjsDeltaIssue.x;\r\n\t\t }\r\n\t\t \r\n\t\t this._current.y = this._last.y + e.deltaY - this._fixHammerjsDeltaIssue.y;\r\n\t\t this._lastEvent = 'pan';\r\n\t\t this.update();\r\n\t\t}).bind(this)); \r\n\t\t\r\n // $(window).resize(function () {\r\n\t// \t\tProgressEvent;\r\n // _this.setDefaultScale();\r\n // }).resize();\t\t\r\n\r\n\t}\r\n\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopover {\r\n private _querySelector: string;\r\n\r\n constructor(querySelector: string = \"[data-toggle=popover]\") {\r\n this._querySelector = querySelector;\r\n }\r\n\r\n bindPopoverEvents() {\r\n global.ConsoleLogDegug(\"SaopPopover.bindPopoverEvents\");\r\n let _this = this;\r\n\r\n $(\"[data-toggle=popover]\").popover({\r\n html: true,\r\n sanitize: false,\r\n trigger: 'click',\r\n content: function () {\r\n var content = $(this).attr(\"data-popover-content\");\r\n return $(content).children(\".popover-body\").html();\r\n }\r\n });\r\n\r\n $('html').on('mouseup', function (e) {\r\n global.ConsoleLogDegug(\"mouseup!\");\r\n if (!$(e.target).closest('.popover').length) {\r\n global.ConsoleLogDegug(\"mouseup.popover!\");\r\n $('.popover').each(function () {\r\n global.ConsoleLogDegug(\"mouseup.popover.hide!\");\r\n //$(this.previousSibling).popover('hide');\r\n $(_this._querySelector).popover('hide');\r\n });\r\n }\r\n });\r\n\r\n // when popover's content is shown\r\n $(\"[data-toggle=popover]\").on('shown.bs.popover', function (e: any) {\r\n // set what happens when user clicks on the button\r\n global.ConsoleLogDegug(\"set!\");\r\n\r\n _this.afterPopoverShow(this);\r\n\r\n $(\".popoverLink\").off('click');\r\n $(\".popoverLink\").on('click', function () {\r\n global.ConsoleLogDegug(\"popoverLink clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n\r\n $(\".popoverClose\").off('click');\r\n $(\".popoverClose\").on('click', function () {\r\n global.ConsoleLogDegug(\"Close popover clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n });\r\n\r\n }\r\n\r\n afterPopoverShow(element: HTMLElement) {\r\n global.ConsoleLogDegug(\"SaopPopover.afterPopoverShow\");\r\n }\r\n\r\n initSelfContainerPopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.initSelfContainerPopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n let elem = this;\r\n $elem.popover({\r\n container: elem,\r\n sanitize: false\r\n });\r\n });\r\n }\r\n\r\n enablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.enablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('enable');\r\n });\r\n }\r\n\r\n disablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.disablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('disable');\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopupDialogOptions {\r\n title: string;\r\n body: string;\r\n showCancelButton: boolean;\r\n confirmButtonCaption: string;\r\n cancelButtonCaption: string;\r\n confirmAction: string;\r\n confirmActiondata: object;\r\n onSuccess: (params:any) => any;\r\n constructor() {\r\n this.title = \"\";\r\n this.body = \"body text\";\r\n this.showCancelButton = true;\r\n this.confirmButtonCaption = \"Ok\";\r\n this.cancelButtonCaption = \"Cancel\";\r\n this.confirmAction = \"\";\r\n this.confirmActiondata = {};\r\n this.onSuccess = null;\r\n }\r\n}\r\n\r\nexport class SaopPopupDialog {\r\n private _options:SaopPopupDialogOptions;\r\n\r\n\r\n constructor(options:SaopPopupDialogOptions) {\r\n this._options = options;\r\n } \r\n \r\n save(callback: (n: number) => any) : void {\r\n callback(42);\r\n }\r\n\r\n ShowLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.show();\r\n }\r\n\r\n HideLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.hide();\r\n } \r\n\r\n ShowPopupDialog():void {\r\n let _this = this;\r\n // Display info message to the user in a modal\r\n let titleDiv = $('#info-modal-title-div');\r\n let titleH = $('#info-modal-title');\r\n let confirmButton = $('#info-modal-btn-ok');\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n\r\n // show or hide header div based on title property\r\n titleDiv.css(\"display\", \"\");\r\n if (this._options.title) {\r\n titleH.html(this._options.title);\r\n }\r\n else {\r\n titleDiv.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.confirmButtonCaption){\r\n confirmButton.html(this._options.confirmButtonCaption);\r\n confirmButton.css(\"display\", \"\"); \r\n } else {\r\n confirmButton.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.showCancelButton) {\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n cancelButton.css(\"display\", \"\"); \r\n } else {\r\n cancelButton.css(\"display\", \"none\");\r\n }\r\n\r\n $('#info-modal-body').html(this._options.body);\r\n\r\n $(\"#info-modal-btn-ok\").click(\r\n function () {\r\n _this.popupDialogConfirm();\r\n }\r\n );\r\n\r\n $('#info-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#info-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n\r\n $('#info-modal').modal('show');\r\n global.setModalFormZIndex('#info-modal');\r\n } \r\n\r\n popupDialogConfirm() {\r\n let _this = this;\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n if (this._options.confirmAction !== \"\") {\r\n $.ajax({\r\n url: this._options.confirmAction,\r\n type: \"POST\",\r\n data: this._options.confirmActiondata,\r\n beforeSend: function () { _this.ShowLoadingSaop(); },\r\n complete: function () { _this.HideLoadingSaop(); },\r\n success: function (result) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if(_this._options.onSuccess !== null){\r\n _this._options.onSuccess(result);\r\n }\r\n \r\n },\r\n error: function (response) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n alert(response.responseJSON.message);\r\n }\r\n });\r\n }\r\n else {\r\n //close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if (this._options.onSuccess != null) {\r\n this._options.onSuccess(null);\r\n }\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport enum SaopRightSidebarView {\r\n Dashboard = 0\r\n ,Absence = 1\r\n ,AttendanceDay = 2\r\n ,AttendanceMonth = 3 \r\n ,TravelOrders = 4\r\n ,InternalOrders = 5\r\n}\r\n\r\nexport class SaopRightSidebar {\r\n private _saopServicesCore :SaopServicesCore;\r\n\r\n constructor() {\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n\r\n bindCarouselDiv(contentId:string,view:SaopRightSidebarView){\r\n global.ConsoleLogDegug(\"SaopRightSidebar.bindDiv\"); \r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/GetCarouselView?view=\"+view.toString()\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n ,async:false\r\n }); \r\n }\r\n\r\n refreshDopustZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshDopustZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/DopustZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n }); \r\n }\r\n\r\n refreshUreZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshUreZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/UreZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n refreshRegUraDogodkiSummary(contentId: string, selectedPeriod:string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegUraDogodkiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/RegUraDogodkiSummaryPartial?selectedPeriod=\"+selectedPeriod\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshRegOPNPotniNalogiSummary(contentId: string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegOPNPotniNalogiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/TravelOrdersSummary\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshNdkInternalOrdersSummary(contentId: string, spinnerDivId: string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshNdkInternalOrdersSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/InternalOrdersSummary\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopselectWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n \r\n `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","// knjiznica: https://selectize.dev/\r\n\r\n/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SelectOption } from \"./saop-multiselect\";\r\n\r\nexport class SaopSelectizeSelect {\r\n private libName: string;\r\n private _viewId: string;\r\n private _id: string;\r\n private _selectizeControl: HTMLElement;\r\n\r\n constructor(viewId: string = \"\", id: string = \"\", libName: string = \"\") {\r\n this.libName = libName;\r\n this._viewId = viewId;\r\n this._id = id;\r\n\r\n if (this._id != \"\") {\r\n this._selectizeControl = $(this._viewId + \" \" + this._id)[0];\r\n }\r\n }\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.init\");\r\n\r\n this.inicializeBindEvents();\r\n }\r\n\r\n initControlByJQuery(element: JQuery): void {\r\n this.initSelectizeSelect(element);\r\n }\r\n\r\n initControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeSelect($(element));\r\n }\r\n\r\n initMultiselectControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeMultiselect($(element));\r\n }\r\n\r\n getValue(): string {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getValue\");\r\n\r\n return $(this._viewId + \" \" + this._id).attr(\"data-chosen\");\r\n }\r\n\r\n getMultiselectValues(): string[] {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getMultiselectValues\");\r\n\r\n let retValue: string[] = []; \r\n\r\n $(this._viewId + \" \" + this._id + \" option:selected\").each(function (val) {\r\n retValue.push($(this).val().toString());\r\n });\r\n\r\n return retValue;\r\n }\r\n\r\n private initSelectizeSelect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...\");\r\n\r\n element.selectize({\r\n sortField: 'text',\r\n allowEmptyOption: true,\r\n render: {\r\n option: function (item: any, escape: any) {\r\n var label = item.text;\r\n var caption = item.value;\r\n return \"\" + '' + escape(label) + \"\" + \"
\";\r\n },\r\n },\r\n onFocus: function () {\r\n if (this.$input.val() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n },\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeMultiselect...\");\r\n\r\n let _this = this;\r\n\r\n element.selectize({\r\n delimiter: \"|\",\r\n persist: false,\r\n maxItems: null,\r\n create: function (input: any) {\r\n return {\r\n value: input,\r\n text: input,\r\n };\r\n },\r\n onFocus: function () {\r\n let selValues = this.items;\r\n\r\n // ce je samo en element in ta \"?\", zbrisemo seznam, da se floating label umakne iz vvnosne kontrole\r\n if (selValues.length == 1 && selValues[0].trim() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n } \r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private inicializeBindEvents(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.inicializeBindEvents\");\r\n\r\n let _this = this; \r\n\r\n $(this._viewId + \" \" + this._id).change(function () {\r\n var data = $(this).val().toString();\r\n _this.valueChanged(data);\r\n });\r\n }\r\n\r\n valueChanged(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.valueChanged\");\r\n }\r\n\r\n setValue(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValue\");\r\n this._selectizeControl.selectize.setValue(value);\r\n }\r\n\r\n setValues(values: string[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValues\");\r\n this._selectizeControl.selectize.setValue(values);\r\n }\r\n\r\n clearValue(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.clearValue\");\r\n this._selectizeControl.selectize.clear();\r\n }\r\n\r\n refreshOptions(optionList: SelectOption[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.refreshOptions\");\r\n\r\n let _this = this;\r\n\r\n // zbrisemo izbrano opcijo, drugace ostane notri kot opcija\r\n this._selectizeControl.selectize.clear();\r\n\r\n this._selectizeControl.selectize.clearOptions();\r\n\r\n if (optionList.length > 0) {\r\n optionList.forEach(element =>\r\n _this._selectizeControl.selectize.addOption({ value: element.value, text: element.text })\r\n );\r\n }\r\n }\r\n\r\n disable(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.disable\");\r\n this._selectizeControl.selectize.disable();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopTogglePanel {\r\n\r\n init():void{\r\n global.ConsoleLogDegug(\"SaopTogglePanel.init...\");\r\n this.setClickEventOnFrame(\"body\");\r\n }\r\n\r\n setClickEventOnFrame(frameName:string = \"body\"):void {\r\n global.ConsoleLogDegug(\"SaopTogglePanel.setClickEventOnFrame...\");\r\n\r\n let _frame = $(\"\"+frameName+\" *> .saop-toggle-panel\");\r\n _frame.off(\"click\");\r\n _frame.click(function () {\r\n //na klik se puščica obrne gor / dol\r\n var arrowDiv = $(this).find(\".saop-toggle-arrow\");\r\n\r\n for (var i = 0; i < arrowDiv.length; i++) {\r\n if (arrowDiv[i].classList.contains(\"saop-img-down\")) {\r\n arrowDiv[i].classList.remove(\"saop-img-down\");\r\n arrowDiv[i].classList.add(\"saop-img-up\");\r\n } else {\r\n arrowDiv[i].classList.remove(\"saop-img-up\");\r\n arrowDiv[i].classList.add(\"saop-img-down\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from \"./saop-message-dlg\";\r\n\r\nexport class SaopTreeview {\r\n private _viewId: string;\r\n private libName: string; \r\n private _translationService: SaopTranslationService;\r\n\r\n constructor(viewId: string, libName: string) {\r\n this._viewId = viewId;\r\n this.libName = libName;\r\n\r\n this._translationService = new SaopTranslationService();\r\n } \r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopTreeview.init\");\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n this.initEventListners();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n global.ConsoleLogDegug(\"SaopTreeview.setFormTerminologyList\");\r\n\r\n let terminology = [\"Ni podatkov za prikaz.\", \"Brisanje\", \"Ali ste prepričani, da želite izbrisati element?\"];\r\n this._translationService.setTranslationsList(terminology);\r\n }\r\n\r\n private initEventListners() {\r\n global.ConsoleLogDegug(\"SaopTreeview.initEventListners\");\r\n\r\n let _this = this;\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-expand-colapse\"); \r\n $(this._viewId).on(\"click\", \".saop-treeview-expand-colapse\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-expand-colapse.click\");\r\n\r\n event.stopPropagation();\r\n _this.treeviewExpandColapse(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-delete\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-delete\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-delete.click\");\r\n\r\n event.stopPropagation();\r\n _this.deleteTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-addSubItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-addSubItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-addSubItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewSubItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-insertItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-insertItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-insertItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.insertItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-edit\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-edit\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-edit.click\");\r\n\r\n event.stopPropagation();\r\n _this.editTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-add-item-btn\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-add-item-btn\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-add-item-btn.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewItem(this);\r\n });\r\n }\r\n\r\n private treeviewExpandColapse(elem: any): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.treeviewExpandColapse\");\r\n\r\n let id = $(elem).attr(\"data-toogleelementsid\");\r\n let collapseItems = $(elem).hasClass(\"saop-img-down\");\r\n\r\n $(elem).toggleClass(\"saop-img-down\");\r\n $(elem).toggleClass(\"saop-img-right\");\r\n\r\n // show/hide\r\n $(this._viewId + \" div.saop-treeview-item-container[data-parentid='\" + id + \"']\").each(function (index: number, childElem: any) {\r\n if (collapseItems) {\r\n $(childElem).hide(\"fast\");\r\n }\r\n else {\r\n $(childElem).show(\"fast\");\r\n }\r\n }); \r\n }\r\n\r\n private deleteTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.deleteTreeviewItem\");\r\n\r\n let _this = this;\r\n let deleteTitle = this._translationService.translate(\"Brisanje\");\r\n let deleteMessage = this._translationService.translate(\"Ali ste prepričani, da želite izbrisati element?\");\r\n\r\n let saopMessageDlg = new SaopMessageDlg(null);\r\n saopMessageDlg.onYes = function () {\r\n // poiscemo parent z klasom saop-treeview-item-container in ga odstranimo ter vse childreen\r\n let tempElement = elem;\r\n let parentid = 0;\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-treeview-item-container\")) {\r\n parentid = global.convertString2Number(tempElement.getAttribute(\"data-parentid\"));\r\n // odstranimo element\r\n tempElement.innerHTML = \"\"; \r\n tempElement.remove();\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n if (parentid != null && parentid > 0) {\r\n // ali je se kaj ostalih child elementov z istim parentId?\r\n let childreenCount = $(_this._viewId + ' div.saop-treeview-item-container[data-parentid=\"' + parentid + '\"]').length;\r\n if (childreenCount == 0) {\r\n // zbrisali zadnjega child element, skrijemo expand/collapse ikono parent elementa\r\n let parentElement = $(_this._viewId + ' div.saop-treeview-item[data-id=\"' + parentid + '\"]');\r\n if (parentElement != null) {\r\n let expandCollapseElem = $(parentElement).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.hide();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n saopMessageDlg.Show(deleteMessage, deleteTitle, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n private addTreeviewSubItem(addSubItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItem\");\r\n\r\n // prikazemo expand/collapse ikono:\r\n // poiscemo parent, ki ima klas saop-treeview-item-info,\r\n let parentElem = addSubItemButtonElement.parentElement;\r\n for (var i = 0; i < 10; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-info\")) {\r\n // poiscemo njegov child, ki ima klas saop-treeview-expand-colapse\r\n let expandCollapseElem = $(parentElem).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.show();\r\n }\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newSubItemId = this.getMaxTreeviewId() + 1;\r\n // parent Id\r\n let newSubItemParentId = global.convertString2Number($(addSubItemButtonElement).attr(\"data-parentid\"));\r\n\r\n this.addTreeviewSubItemExternal(addSubItemButtonElement, newSubItemId, newSubItemParentId);\r\n }\r\n\r\n private getMaxTreeviewId(): number {\r\n global.ConsoleLogDegug(\"SaopTreeview.getMaxTreeviewId\");\r\n\r\n let maxId = 0\r\n\r\n $(this._viewId + \" .saop-treeview-item\").each(function (index, htmlTreeviewItem) {\r\n let id = global.convertString2Number(htmlTreeviewItem.getAttribute(\"data-id\"));\r\n if (id != null && id > maxId) {\r\n maxId = id;\r\n }\r\n });\r\n\r\n return maxId;\r\n }\r\n\r\n public addTreeviewSubItemExternal(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewSubItemContent(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemContent\");\r\n\r\n let elemParent = $(this._viewId + ' div.saop-treeview-item[data-id=\"' + newSubItemParentId + '\"]');\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private addTreeviewItem(addItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItem\");\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n\r\n this.addTreeviewItemExternal(addItemButtonElement, newItemId, null);\r\n }\r\n\r\n public addTreeviewItemExternal(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewItemContent(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemContent\");\r\n\r\n // odstranimo add item html, ker ga bo ze dodal htmlContent\r\n $(this._viewId + \" .saop-treeview-add-item-container\").each(function (index, htmlTreeviewAddItem) {\r\n htmlTreeviewAddItem.remove();\r\n });\r\n\r\n let elemParent = $(this._viewId);\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private editTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItem\");\r\n\r\n // odstranimo css klas za obrobo vsem elementom in jo dodamo izbranemu\r\n this.clearTreeviewItemsSelectedCss();\r\n $(elem).addClass(\"saop-treeview-item-selected\");\r\n\r\n this.editTreeviewItemExternal(elem);\r\n }\r\n\r\n // za externo uporabo\r\n public editTreeviewItemExternal(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItemExternal\");\r\n }\r\n\r\n public clearTreeviewItemsSelectedCss(): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.clearTreeviewItemsSelectedCss\");\r\n\r\n $(this._viewId + \" .saop-treeview-item-info\").removeClass(\"saop-treeview-item-selected\");\r\n }\r\n\r\n // elem je isti kot ga ponuja editTreeviewItem oz. editTreeviewItemExternal\r\n public refreshTreeviewItemHeader(elem: HTMLElement, header: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.refreshTreeviewItemHeader\");\r\n\r\n $(elem).find(\".saop-treeview-item-header\").text(header);\r\n }\r\n\r\n private insertItem(insertItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertItem\");\r\n\r\n // poiscemo parent, ki ima klas saop-treeview-item-container,\r\n let parentFound = false\r\n let parentElem = insertItemButtonElement.parentElement;\r\n for (var i = 0; i < 20; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-container\")) {\r\n parentFound = true;\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n if (parentFound) {\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n // parentId\r\n let newItemParentId = global.convertString2Number($(parentElem).attr(\"data-parentid\"));\r\n\r\n this.insertTreeviewItemExternal(parentElem, newItemId, newItemParentId);\r\n } \r\n }\r\n\r\n public insertTreeviewItemExternal(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemExternal\");\r\n }\r\n\r\n public insertTreeviewItemContent(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemContent\");\r\n\r\n $(itemToAppendTo).after(htmlContent);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopViewSpinner {\r\n\r\n generateSpinnerDiv(spinnerId: string = '#saopLoading'): string {\r\n global.ConsoleLogDegug(\"generateSpinnerDiv \" + spinnerId);\r\n let spinnrDiv =\r\n ' '\r\n + '\t
'\r\n + '\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t\t
'\r\n + '\t
'\r\n + '
';\r\n\r\n return spinnrDiv;\r\n }\r\n\r\n showLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length) {\r\n global.ConsoleLogDegug(\"Show... \");\r\n obj.show();\r\n //setModalFormZIndex(elementId);\r\n }\r\n }\r\n\r\n hideLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length)\r\n obj.hide();\r\n }\r\n\r\n // showLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // spinnerID = spinnerID.replace(\"#\",\"\");\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // let _div = this.generateSpinnerDiv(spinnerID);\r\n // elementDiv.append(_div);\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.show();\r\n // }\r\n // }\r\n // }\r\n\r\n // hideLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // elementDiv.append(this.generateSpinnerDiv(spinnerID));\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.hide();\r\n // }\r\n // }\r\n // }\r\n // //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewSpinner } from '../Components/saop-view-spinner'\r\n\r\nexport interface SaopServicesCoreParams {\r\n action:string;\r\n async?:boolean\r\n type?:string;\r\n data?:any;\r\n spinnerDivId?:string;\r\n // contentType?: string | false | undefined;\r\n // dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string | undefined;\r\n // processData?: boolean | undefined;\r\n}\r\n\r\nexport enum SaopServicesCoreResult {\r\n success = 1\r\n , error = 2\r\n}\r\n\r\nexport enum SaopServicesCoreHTTPResultStatusCode {\r\n ok = 200,\r\n unauthorized = 401,\r\n internalServerError = 500\r\n}\r\n\r\nexport interface SaopServicesCoreResponse {\r\n response: SaopServicesCoreResult;\r\n data: any;\r\n};\r\n\r\n// function syncDelay(milliseconds:any){\r\n// var start = new Date().getTime();\r\n// var end=0;\r\n// while( (end-start) < milliseconds){\r\n// end = new Date().getTime();\r\n// }\r\n// }\r\n\r\nexport class SaopServicesCore {\r\n private _saopViewSpinner:SaopViewSpinner = new SaopViewSpinner();\r\n private _params:SaopServicesCoreParams;\r\n private _defaultParams:SaopServicesCoreParams;\r\n // \r\n //public _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n\r\n constructor(){\r\n this._defaultParams = {\r\n action:\"\"\r\n ,type:\"GET\"\r\n ,async:true\r\n ,data:null\r\n ,spinnerDivId:\"\"\r\n };\r\n }\r\n\r\n private onDone(result:any){\r\n global.ConsoleLogDegug(\"SaopServicesCore.onDone\");\r\n this.afterDone(result);\r\n //this._saopViewSpinner.hideLoadingSaop(this._params.spinnerDivId); \r\n }\r\n\r\n afterDone(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterDone\");\r\n } \r\n\r\n private onSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.success\");\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n if (typeof result.success === \"undefined\" || result.success === null) {\r\n _result.response = SaopServicesCoreResult.success;\r\n } else {\r\n _result.response = result.success == true ? SaopServicesCoreResult.success : SaopServicesCoreResult.error;\r\n }\r\n \r\n _result.data = result;\r\n this.afterSuccess(_result);\r\n }\r\n\r\n afterSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n private onError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.error\");\r\n \r\n if (result.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n // redirect to login\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n if (result.status = SaopServicesCoreHTTPResultStatusCode.internalServerError && !global.isUnDefined(result.responseText)) {\r\n alert(\"Internal error!\");\r\n }\r\n\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n _result.response = SaopServicesCoreResult.error;\r\n _result.data = result;\r\n this.afterError(_result);\r\n }\r\n\r\n afterError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n ExecuteAction(params:SaopServicesCoreParams):void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n //@Url.Action(\"crearCampManual\", \"DPS\")\r\n\r\n try {\r\n $.ajax({\r\n async: params.async,\r\n url: _ajaxAction,\r\n type: !global.isEmpty(params.type) ? params.type : \"POST\",\r\n data: params.data,\r\n // contentType: params.contentType == null ? 'application/x-www-form-urlencoded; charset=UTF-8' : params.contentType,\r\n // dataType: params.type == null ? 'Intelligent Guess (xml, json, script, or html)' : params.type, \r\n // processData : params.processData == null ? true : params.processData, \r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: this.onSuccess.bind(_this),\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch(err) {\r\n alert(\"Internal error!\");\r\n } \r\n\r\n \r\n }\r\n\r\n ExecuteBlobAction(params: SaopServicesCoreParams): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteBlobAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n try {\r\n $.ajax({\r\n type: \"POST\",\r\n url: _ajaxAction,\r\n data: params.data,\r\n xhrFields: {\r\n responseType: 'blob' // to avoid binary data being mangled on charset conversion\r\n },\r\n success: function (blob, status, xhr) {\r\n // check for a filename\r\n var filename = \"\";\r\n var disposition = xhr.getResponseHeader('Content-Disposition');\r\n if (disposition && disposition.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n\r\n //if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n // // IE workaround for \"HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed.\"\r\n // window.navigator.msSaveBlob(blob, filename);\r\n //} else\r\n //{\r\n var URL = window.URL || window.webkitURL;\r\n var downloadUrl = URL.createObjectURL(blob);\r\n\r\n if (filename) {\r\n // use HTML5 a[download] attribute to specify filename\r\n var a = document.createElement(\"a\");\r\n // safari doesn't support this yet\r\n if (typeof a.download === 'undefined') {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n }\r\n } else {\r\n window.location.href = downloadUrl;\r\n }\r\n\r\n setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup\r\n //}\r\n },\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch (err) {\r\n alert(\"Internal error!\");\r\n }\r\n }\r\n \r\n public handleSubmitError(response: any): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.HandleSubmitError\");\r\n\r\n if (response.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n // display error\r\n console.log(\"response\", response);\r\n alert(response.statusText);\r\n }\r\n\r\n public unAuthorizedRedirectToLoginPage(): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.redirectToLoginPage\");\r\n\r\n window.location.reload();\r\n }\r\n \r\n //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class SaopTranslation {\r\n public key: string = \"#\";\r\n public translation: string = null;\r\n}\r\n\r\nexport class SaopTranslations {\r\n public translationsList:[SaopTranslation?] = [];\r\n}\r\n\r\n\r\nexport interface SaopTranslationServiceParams {\r\n controller:string,\r\n action:string,\r\n}\r\n\r\n\r\nexport class SaopTranslationService {\r\n private _params:SaopTranslationServiceParams;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public _terminology:SaopTranslations;\r\n\r\n\r\n constructor(params:SaopTranslationServiceParams = null){\r\n if(!global.isUnDefined(params)){\r\n this._params = params;\r\n } else {\r\n this._params = {controller:\"Translation\",action:\"GetTranslations\"};\r\n }\r\n \r\n this._saopServicesCore = new SaopServicesCore();\r\n this._terminology = new SaopTranslations();\r\n }\r\n \r\n setTranslationsList(translations:string[]):any{\r\n let _this = this;\r\n translations.forEach(function (value) {\r\n _this._terminology.translationsList.push({key:value,translation:value}); \r\n }); \r\n return this.getTranslations(this._terminology);\r\n }\r\n\r\n getTranslations(translations:SaopTranslations):any{\r\n let jsonData = JSON.stringify(translations);\r\n let _data = {jsonInput:jsonData};\r\n let _response:any;\r\n this._saopServicesCore.afterDone = function (response) {\r\n _response = response;\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: this._params.controller+\"/\"+this._params.action+\"\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n this._terminology.translationsList = _response.translationsList;\r\n return _response;\r\n }\r\n\r\n translate(key:string):string{\r\n let _tr = this._terminology.translationsList.find(e => e.key == key) as any;\r\n if (global.isUnDefined(_tr)) { \r\n return key;\r\n } else {\r\n return _tr.translation;\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","///
\r\n\r\nexport class SaopUtils {\r\n checkCompatibility():boolean {\r\n return SaopCommon.checkCompatibility();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","///
\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore,SaopServicesCoreParams, SaopServicesCoreResponse, SaopServicesCoreResult } from './saop-services-core'\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport {SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class Error {\r\n public Code: string;\r\n public Message: string;\r\n}\r\n\r\nexport enum SaopWfAction {\r\n wfaNone = 0\r\n ,wfaAddRecord = 1\r\n ,wfaEditRecord = 2\r\n ,wfaDeleteRecord = 3\r\n ,wfaRecordDestails = 4\r\n}\r\n\r\nexport interface SaopWfSubmitResult {\r\n success:boolean;\r\n viewContent:string;\r\n redirectTo:string;\r\n alertMessage:string;\r\n}\r\n\r\nexport class SaopViewForm {\r\n private _viewModalFrame:JQuery
;\r\n private _viewModalBody:JQuery;\r\n private _view_title:JQuery;\r\n private _view_btnOk:JQuery;\r\n private _view_btnCancel:JQuery;\r\n private _servicesParams:SaopServicesCoreParams = {action:null,data:null,type:\"POST\"};\r\n private _terminology: string[];\r\n //\r\n public _libName:string;\r\n public saopServicesCore:SaopServicesCore = new SaopServicesCore();\r\n public translationService:SaopTranslationService;\r\n public contentElementId = \".saop-modal-body-element\";\r\n public addRecordEndpoint: string = \"\";\r\n public editRecordEndpoint: string = \"\";\r\n public deleteRecordEndpoint: string = \"\";\r\n public manuallySubmitEndpoint: string = \"\";\r\n public saopFloatingLabel: SaopFloatingLabel;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\";\r\n // \r\n public id:string;\r\n public title:string;\r\n public fullScreen:boolean = false;\r\n //\r\n public onClose: (params:any) => any = null;\r\n public onSubmit: (params:any) => any = null;\r\n public onError: (params:any) => any = null;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewForm...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\";\r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\";\r\n this.translationService = new SaopTranslationService();\r\n this.saopFloatingLabel = new SaopFloatingLabel();\r\n // \r\n }\r\n\r\n public setTerminologyList(dictionary: string[] = null) {\r\n this._terminology = [\"Uredi\",\"Nov vnos\",\"Podrobnosti\",\"Brisanje\"];\r\n if (dictionary != null) {\r\n this._terminology = this._terminology.concat(dictionary);\r\n }\r\n this.translationService.setTranslationsList(this._terminology);\r\n }\r\n\r\n public onBtnOkClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnOkClick...\");\r\n }\r\n\r\n public onBtnCancel(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnCancel...\");\r\n }\r\n\r\n public beforeViewShow(sender:any):void{\r\n global.ConsoleLogDegug(this.id+\".beforeViewShow()\");\r\n\r\n this._viewModalFrame = $(this.id);\r\n if (this._viewModalFrame == null) { console.log(this.id+\" not found!\");};\r\n //\r\n var contentSel = this.id + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel);\r\n }\r\n\r\n public afterViewShow(sender:any,wfAction:SaopWfAction):void{\r\n global.ConsoleLogDegug(this.id+\".afterViewShow()\");\r\n let _this = this;\r\n this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\");\r\n //\r\n\r\n global.ConsoleLogDegug(\"afterViewShow title:\"+ this.title);\r\n\r\n if (!global.isEmpty(this.title)){\r\n let _title = \"\";\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n _title = this.translationService.translate(\"Nov vnos\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaEditRecord){\r\n _title = this.translationService.translate(\"Uredi\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails){\r\n _title = this.translationService.translate(\"Podrobnosti\")+\": \"+this.title;\r\n }\r\n\r\n global.ConsoleLogDegug(\"afterViewShow _title:\"+ _title);\r\n\r\n this._view_title.html(_title);\r\n } else {\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n let defaultTitleAdd = $(\"\"+this.id+\" *> #addTitle\").val().toString();\r\n this._view_title.html(defaultTitleAdd);\r\n } else {\r\n let defaultTitleEdit = $(\"\"+this.id+\" *> #editTitle\").val().toString();\r\n this._view_title.html(defaultTitleEdit);\r\n }\r\n }\r\n\r\n this.viewShowComplete(sender, wfAction);\r\n\r\n //\r\n this.bindButtons(sender);\r\n\r\n this.bindViewEvents();\r\n\r\n this._viewModalFrame.modal('show');\r\n global.setModalFormZIndex(this.id);\r\n global.setFirstFormControlToFocus(this.id);\r\n //\r\n this.afterViewShowSuccess(sender);\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n }\r\n\r\n public viewShowComplete(sender: any, wfAction: SaopWfAction): void {\r\n global.ConsoleLogDegug(this.id + \".viewShowComplete()\");\r\n }\r\n\r\n private bindButtons(sender: any): void {\r\n global.ConsoleLogDegug(\"bindButtons\");\r\n let _this = this;\r\n\r\n this._view_btnOk = $(\"\" + this.id + \" *> #btnOk\");\r\n this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel = $(\"\" + this.id + \" *> #btnCancel\");\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n );\r\n }\r\n\r\n public bindViewEvents(): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n\r\n if (this.onSucccessCallback !== null) {\r\n divForm.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n divForm.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n divForm.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n \r\n this.saopFloatingLabel.init(); \r\n }\r\n\r\n private renderErrorsBanner(errors:Error[]):SaopServicesCoreResponse {\r\n let result:SaopServicesCoreResponse;\r\n result = {response:SaopServicesCoreResult.error,data:null}; \r\n //\r\n let jsonData = JSON.stringify(errors);\r\n let _data = {jsonInput:jsonData}; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n result = response;\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Errors/RenderErrorsBanner\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public renderError(errMessage:string):void{\r\n try {\r\n global.ConsoleLogDegug(\"ajax.afterError\");\r\n let _errors:Error[];\r\n _errors = [{Code:\"\",Message:errMessage}];\r\n \r\n let _parentView = $(this.id).parent();\r\n\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n //let _view_banner = this._viewModalBody.find(_errorBannerId);\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( global.isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _view_banner = _parentView.append(\"\");\r\n }\r\n let _bannerResult = this.renderErrorsBanner(_errors);\r\n _view_banner.html(_bannerResult.data.viewContent); \r\n }\r\n catch(err) {\r\n alert(err.message);\r\n } \r\n }\r\n //public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):SaopServicesCoreResult{\r\n public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):void{\r\n global.ConsoleLogDegug(\"loadViewBody\");\r\n let _this = this;\r\n this.beforeViewShow(sender);\r\n\r\n let _ajaxAction = wfAction == SaopWfAction.wfaAddRecord ? this.addRecordEndpoint : this.editRecordEndpoint;\r\n //_ajaxAction = getSiteAbsoluteURL(_ajaxAction);\r\n\r\n this._servicesParams = {action:_ajaxAction,data:data,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n global.ConsoleLogDegug(\"ajax.success\");\r\n _this._viewModalBody.html(_ajaxResult.data);\r\n _this.afterViewShow(sender,wfAction);\r\n } else {\r\n global.ConsoleLogDegug(\"ajax.error\");\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else if (_ajaxResult.data.responseJSON && _ajaxResult.data.responseJSON.message){\r\n alertify.error(_ajaxResult.data.responseJSON.message);\r\n } \r\n }\r\n \r\n };\r\n\r\n this.saopServicesCore.afterError = function(_ajaxResult){\r\n//###\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else {\r\n alert(\"Internal error!\");\r\n }\r\n };\r\n\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n }\r\n\r\n public onSubmitSuccessComplete(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitSuccessComplete\");\r\n }\r\n\r\n public onSubmitError(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitError\");\r\n }\r\n\r\n public onSubmitFailure(result: any): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitFailure\");\r\n var saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.handleSubmitError(result);\r\n }\r\n \r\n public onSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onExecuteSuccess\");\r\n if (result.success) {\r\n global.ConsoleLogDegug(\"submit.success\");\r\n\r\n this._viewModalFrame.modal('hide');\r\n\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\");\r\n\r\n if (result.alertMessage) {\r\n alertify.message(result.alertMessage);\r\n } \r\n\r\n if (!global.isUnDefined(this.refreshData)){\r\n this.refreshData(result);\r\n }\r\n\r\n this.onSubmitSuccessComplete(result);\r\n } else {\r\n global.ConsoleLogDegug(\"submit.error\");\r\n global.ConsoleLogDegug(\"reload view form\");\r\n this.refreshContent(result.viewContent);\r\n }\r\n this.afterSubmitSuccess(result);\r\n } \r\n\r\n public refreshContent(viewContent: string): void {\r\n this._viewModalBody.html(viewContent);\r\n this.bindButtons(null);\r\n this.bindViewEvents();\r\n\r\n this.onAfterRefreshContent();\r\n }\r\n\r\n public onAfterRefreshContent(): void {\r\n global.ConsoleLogDegug(\"onAfterRefreshContent\");\r\n }\r\n\r\n public onDeleteRecord(deleteData:any):void {\r\n global.ConsoleLogDegug(\"onDeleteRecord\");\r\n let _this = this;\r\n this._servicesParams = {action:this.deleteRecordEndpoint,data:deleteData,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n alertify.message(_ajaxResult.data.alertMessage);\r\n if (!global.isUnDefined(_this.refreshData)){\r\n _this.refreshData(deleteData);\r\n }\r\n } else {\r\n alertify.error(_ajaxResult.data.alertMessage);\r\n }\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n\r\n // let _ajaxResult = this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n // if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n // alertify.message(_ajaxResult.data.alertMessage);\r\n // if (!global.isUnDefined(this.refreshData)){\r\n // this.refreshData(deleteData);\r\n // }\r\n // } else {\r\n // alertify.error(_ajaxResult.data.alertMessage);\r\n // }\r\n // return _ajaxResult.response;\r\n }\r\n \r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"refreshData\");\r\n }\r\n\r\n public deleteRecord(title:string,message:string,deleteData:any):void{\r\n global.ConsoleLogDegug(\"deleteRecord.begin\");\r\n let saopMessageDlg = new SaopMessageDlg(deleteData) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n global.ConsoleLogDegug(\"deleteRecord.end\");\r\n }\r\n\r\n public addRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"addRecord\");\r\n let _result = this.loadViewBody(SaopWfAction.wfaAddRecord,data,sender);\r\n }\r\n\r\n public editRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaEditRecord,data,sender);\r\n }\r\n\r\n public recordDetails(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public manuallySubmit(submitData: any, spinnerDivId: string = null): void {\r\n global.ConsoleLogDegug(\"manuallySubmit\");\r\n\r\n let _this = this;\r\n\r\n if (global.isEmpty(spinnerDivId)) {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\" };\r\n }\r\n else {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\", spinnerDivId: spinnerDivId };\r\n }\r\n\r\n this.saopServicesCore.afterSuccess = function (_ajaxResult) {\r\n _this.onSubmitSuccess(_ajaxResult.data);\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n }\r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public SetToFullScreen(){\r\n if (this.fullScreen ){\r\n this._viewModalFrame.addClass(\"saop-modal-fullscreen-form\");\r\n let _dialogDiv = this._viewModalFrame.find(\".modal-dialog\");\r\n _dialogDiv.removeClass('modal-dialog-centered');\r\n _dialogDiv.addClass('modal-fullscreen');\r\n _dialogDiv.removeAttr('style');\r\n \r\n let _content = this._viewModalFrame.find(\".modal-content\");\r\n _content.removeAttr('class');\r\n _content.addClass('modal-content');\r\n }\r\n }\r\n\r\n public refreshElementData(htmlContent:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"refreshElementData\");\r\n let _document = $(htmlContent);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n // \r\n}\r\n","import { global } from \"./Common/saop-common\";\r\nimport { SaopUtils } from \"./Core/saop-utils\";\r\nimport { SaopTogglePanel } from \"./Components/saop-toggle-panel\";\r\nimport { SaopInputMask } from \"./Components/saop-inputmask\";\r\nimport { SaopCheckboxSwitch } from \"./Components/saop-checkbox-switch\";\r\nimport { SaopMultiselect } from \"./Components/saop-multiselect\";\r\nimport { SaopViewSpinner } from './Components/saop-view-spinner';\r\nimport { SaopRightSidebar } from './Components/saop-right-sidebar';\r\nimport { MenuSidebar } from \"./Components/saop-menu-sidebar\";\r\nimport { SaopMessageDlg } from \"./Components/saop-message-dlg\";\r\nimport { SaopPopupDialog } from './Components/saop-popup-dialog'\r\nimport { SaopFloatingLabel } from \"./Components/saop-floating-label\";\r\nimport { SaopServicesCore } from './Core/saop-services-core';\r\nimport { SaopTranslationService } from './Core/saop-translate';\r\nimport { SaopWebGrid } from './Components/saop-grid';\r\nimport { SaopViewForm } from './Core/saop-view-form';\r\nimport { SaopTreeview } from './Components/saop-treeview';\r\nimport { SaopSelectizeSelect } from './Components/saop-selectize-select';\r\nimport { SaopPdfPreview } from \"./Components/saop-pdf-preview\";\r\nimport { SaopPinchZoom } from \"./Components/saop-pinch-and-zoom\";\r\n\r\nexport function echoTest(msg:string): void {\r\n console.log(\"echo: \"+msg);\r\n}\r\n\r\nexport function checkCompatibility(): boolean {\r\n global.ConsoleLogDegug(\"checkCompatibility\");\r\n let utils = new SaopUtils();\r\n return utils.checkCompatibility();\r\n}\r\n\r\nexport function initClientLogModeValue() {\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n}\r\n\r\nexport function initSiteBaseUrlValue() {\r\n global.siteBaseUrl = global.getSiteBaseUrl()\r\n}\r\n\r\nexport function initializeSiteJS() {\r\n global.ConsoleLogDegug(\"initializeSiteJS\");\r\n new MenuSidebar().init();\r\n new SaopTogglePanel().init();\r\n\r\n document.addEventListener('keydown', function (e) {\r\n if (e.ctrlKey && e.altKey && e.keyCode == 79) {\r\n // CTRL + ALT + O\r\n global.SetClientLogModeStorageValue();\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n }\r\n });\r\n\r\n global.setHelpLink();\r\n}\r\n\r\nexport function setFirstControlToFocus(formId: string) {\r\n global.setFirstFormControlToFocus(formId);\r\n}\r\n\r\nexport {global};\r\n\r\n\r\n\r\nexport class SaopTogglePanelEx extends SaopTogglePanel{};\r\n\r\nexport class SaopInputMaskEx extends SaopInputMask{};\r\n\r\nexport class SaopCheckboxSwitchEx extends SaopCheckboxSwitch{};\r\n\r\nexport class SaopMultiselectEx extends SaopMultiselect{};\r\n\r\nexport class SaopMessageDlgEx extends SaopMessageDlg{};\r\n\r\nexport class SaopPopupDialogEx extends SaopPopupDialog{};\r\n\r\nexport class SaopViewSpinnerEX extends SaopViewSpinner { };\r\n\r\nexport class SaopRightSidebarEx extends SaopRightSidebar { };\r\n\r\nexport class SaopFloatingLabelEx extends SaopFloatingLabel { };\r\n\r\nexport class SaopServicesCoreEx extends SaopServicesCore { };\r\n\r\nexport class SaopTranslationServiceEx extends SaopTranslationService { };\r\n\r\nexport class SaopWebGridEx extends SaopWebGrid { };\r\n\r\nexport class SaopViewFormEx extends SaopViewForm { };\r\n\r\nexport class SaopUtilsEx extends SaopUtils { };\r\n\r\nexport class SaopTreeviewEx extends SaopTreeview { };\r\n\r\nexport class SaopSelectizeSelectEx extends SaopSelectizeSelect { };\r\n\r\nexport class SaopPdfPreviewEx extends SaopPdfPreview {};\r\n\r\nexport class SaopPinchZoomEx extends SaopPinchZoom {};\r\n//\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJUeXBlU2NyaXB0cy9Db21tb24vc2FvcC1jb21tb24udHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtY2hlY2tib3gtc3dpdGNoLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWdyaWQtZWRpdC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWlucHV0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2sudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbWVudS1zaWRlYmFyLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBkZi1wcmV2aWV3LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBvcG92ZXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC10cmVldmlldy50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC12aWV3LXNwaW5uZXIudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atc2VydmljZXMtY29yZS50cyIsIlR5cGVTY3JpcHRzL0NvcmUvc2FvcC10cmFuc2xhdGUudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3AtdXRpbHMudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atdmlldy1mb3JtLnRzIiwiVHlwZVNjcmlwdHMvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQzs7Ozs7Ozs7O0lBRXFCLE07Ozs7Ozs7d0NBSVksTyxFQUFZO0FBQ3RDLGdCQUFJLEtBQUssU0FBVCxFQUFvQixRQUFRLEdBQVIsQ0FBWSxPQUFaO0FBQ3ZCOzs7MERBRTRDO0FBQ3pDLG1CQUFPLG9DQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksd0JBQXdCLEtBQTVCO0FBRUEsZ0JBQUkscUJBQXFCLEtBQUssdUJBQUwsQ0FBNkIsT0FBTywrQkFBUCxFQUE3QixDQUF6QjtBQUVBLGdCQUFJLGVBQWUscUJBQW5CO0FBQ0EsZ0JBQUksa0JBQUosRUFBd0I7QUFDcEIsK0JBQWUsdUJBQXVCLE1BQXZCLEdBQWdDLElBQWhDLEdBQXVDLEtBQXREO0FBQ0g7QUFFRCxtQkFBTyxZQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksVUFBVSxLQUFLLDRCQUFMLEVBQWQ7QUFDQSxpQkFBSyxzQkFBTCxDQUE0QixPQUFPLCtCQUFQLEVBQTVCLEVBQXNFLENBQUMsT0FBdkU7QUFFQSxxQkFBUyxPQUFULENBQWlCLDhCQUE4QixDQUFDLE9BQWhEO0FBQ0g7Ozt5Q0FFMkI7QUFDeEIsbUJBQU8sRUFBRSxjQUFGLEVBQWtCLEdBQWxCLEVBQVA7QUFDSDs7O3NDQUV3QjtBQUNyQjtBQUNBLGdCQUFJLFFBQVEsSUFBWjtBQUNBLGdCQUFJLFVBQWUsU0FBUyxjQUFULENB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LFFBQUEsV0FBQSxHQUFBLFdBQUE7QUFBOEM7O0lBRWpDLGM7Ozs7Ozs7Ozs7RUFBdUIsZ0JBQUEsWTs7QUFBcEMsUUFBQSxjQUFBLEdBQUEsY0FBQTtBQUFvRDs7SUFFdkMscUI7Ozs7Ozs7Ozs7RUFBOEIsd0JBQUEsbUI7O0FBQTNDLFFBQUEscUJBQUEsR0FBQSxxQkFBQTtBQUFrRTs7SUFFckQsZ0I7Ozs7Ozs7Ozs7RUFBeUIsbUJBQUEsYzs7QUFBdEMsUUFBQSxnQkFBQSxHQUFBLGdCQUFBO0FBQXVEOztJQUUxQyxlOzs7Ozs7Ozs7O0VBQXdCLHNCQUFBLGE7O0FBQXJDLFFBQUEsZUFBQSxHQUFBLGVBQUE7QUFBcUQ7QUFDckQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIGdsb2JhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnTW9kZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBzdGF0aWMgc2l0ZUJhc2VVcmw6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnNvbGVMb2dEZWd1ZyhtZXNzYWdlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUpIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIlNhb3BNb2pJbmZvLmdsb2JhbENsaWVudExvZ01vZGVWYWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgZGVidWdNb2RlU3RyaW5nVmFsID0gdGhpcy5SZWFkVmFyaWFibGVGcm9tU3RvcmFnZShnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZURlZmF1bHRWYWx1ZTtcclxuICAgICAgICBpZiAoZGVidWdNb2RlU3RyaW5nVmFsKSB7XHJcbiAgICAgICAgICAgIGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZVN0cmluZ1ZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVidWdNb2RlVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgbG9nTW9kZSA9IHRoaXMuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuV3JpdGVWYXJpYWJsZVRvU3RvcmFnZShnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpLCAhbG9nTW9kZSk7XHJcblxyXG4gICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoXCJDbGllbnQgbG9nIG1vZGUgZW5hYmxlZDogXCIgKyAhbG9nTW9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXRlQmFzZVVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAkKFwiI3NpdGVCYXNlVXJsXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEhlbHBMaW5rKCk6IHZvaWQge1xyXG4gICAgICAgIC8vbmFzdGF2aSBoZWxwIGxpbmssIHYgb2R2aXNub3N0aSBvZCBsb2thbGl6YWNpamVcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzdmdIZWxwOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2FvcC1oZWxwJyk7XHJcblxyXG4gICAgICAgIGlmKHN2Z0hlbHAgIT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZSA9IHN2Z0hlbHAuZ2V0QXR0cmlidXRlKFwiZGF0YS1sYW5ndWFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vcG/EjWFrYW1vIGRhIHNlIGduZXN6ZGVuaSBvYmpla3QgbmFsb8W+aVxyXG4gICAgICAgICAgICBzdmdIZWxwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzdmdIZWxwTGluayA9IHN2Z0hlbHAuY29udGVudERvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2FvcC1oZWxwLWxpbmtcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNVbkRlZmluZWQoc3ZnSGVscExpbmspID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09IFwiaHJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmdIZWxwTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIFwiaHR0cDovL2hlbHAuc2FvcC5oci9oci9tb2ppbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYW5ndWFnZSA9PSBcInNyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHA6Ly93d3cuc2FvcC5ycy9pY2VudGVyLzEwMC91cHV0c3R2YS16YS11cG90cmVidS9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdmdIZWxwTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIFwiaHR0cHM6Ly9zaS1pY2VudGVyLmtub3dsZWRnZW93bC5jb20vaGVscC9tb2ppbmZvLW5hdm9kaWxhLXphLXVwb3JhYm8tcHJlbm92bGplbmVnYS1wb3J0YWxhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL3phcmFkaSBicmFza2FsbmlrIC0gbW96aWxsYSBmaXJlZm94IC0gaXpnbGVkYSwgZGEgamUgb2JqZWN0ICcnbG9hZGVkJycgcHJlZGVuIG11IGRvZGFtbyBvbiBsb2FkZWRcclxuICAgICAgICAgICAgaWYoJCgnI3Nhb3AtaGVscC1saW5rJykgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2xvYWQnKTtcclxuICAgICAgICAgICAgICAgIHN2Z0hlbHAuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBmb3JtYXREYXRlKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0bzIgPSAobjogbnVtYmVyKTogc3RyaW5nID0+ICgoTWF0aC5hYnMobikgPCAxMCA/ICcwJyA6ICcnKSArIE1hdGguYWJzKG4pKTtcclxuICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL1t5ZG1oXSsvZ2ksIChtYXRjaDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAneXl5eSc6IHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiByZXR1cm4gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzogcmV0dXJuIHRvMihkYXRlLmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdtJzogcmV0dXJuIChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOiByZXR1cm4gdG8yKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnSCc6IHJldHVybiBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0hIJzogcmV0dXJuIHRvMihkYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOiByZXR1cm4gdG8yKGRhdGUuZ2V0TWludXRlcygpKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nMkRhdGUoc3RyaW5nRGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IERhdGUge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjb252ZXJ0U3RyaW5nMkRhdGVcIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZC5tbS55eXl5XCI6XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF5ID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbW9udGggPSBzdHJpbmdEYXRlLnN1YnN0cmluZygzLCA1KTtcclxuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoNiwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgreWVhciwgK21vbnRoIC0gMSwgK2RheSk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZzJOdW1iZXIoc3RyaW5nVmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjb252ZXJ0U3RyaW5nMk51bWJlclwiKTtcclxuXHJcbiAgICAgICAgbGV0IG51bWJlclZhbCA9IHBhcnNlSW50KHN0cmluZ1ZhbClcclxuXHJcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlclZhbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0TW9kYWxGb3JtWkluZGV4KG1vZGFsRm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0TW9kYWxGb3JtWkluZGV4XCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb2RhbEZvcm1JZDpcIiArIG1vZGFsRm9ybUlkKTtcclxuICAgICAgICB2YXIgekluZGV4ID0gMTA1MCArICgxMCAqICQoJy5tb2RhbDp2aXNpYmxlJykubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgJChtb2RhbEZvcm1JZCkuY3NzKCd6LWluZGV4JywgekluZGV4KTtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCgnLm1vZGFsLWJhY2tkcm9wJykubm90KCcubW9kYWwtc3RhY2snKS5jc3MoJ3otaW5kZXgnLCB6SW5kZXggLSAxKS5hZGRDbGFzcygnbW9kYWwtc3RhY2snKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzRW1wdHkoc3RyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKCFzdHIgfHwgc3RyLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc1VuRGVmaW5lZChfb2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gKCFfb2JqIHx8IF9vYmogPT09IG51bGwgfHwgdHlwZW9mIF9vYmogPT09IFwidW5kZWZpbmVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh2YXJpYWJsZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgV3JpdGVWYXJpYWJsZVRvU3RvcmFnZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbDogc3RyaW5nLCBpZFRhYmxlRWxlbWVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImZpbHRlclRhYmxlUm93c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHZhbCA9ICQudHJpbShmaWx0ZXJWYWwpLnJlcGxhY2UoLyArL2csICcgJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBsZXQgcm93cyA9ICQoaWRUYWJsZUVsZW1lbnQgKyBcIiB0cjpoYXModGQpXCIpO1xyXG5cclxuICAgICAgICByb3dzLnNob3coKS5maWx0ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdGV4dCA9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gIX50ZXh0LmluZGV4T2YodmFsKTtcclxuICAgICAgICB9KS5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1c1wiKTtcclxuXHJcbiAgICAgICAgLy8gYnJleiB0aW1lb3V0IGZ1bmtjaWplIGZvY3VzIG5lIGRlbGEgOihcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGZpcnN0Rm9ybUNvbnRyb2wgPSAkKGZvcm1JZCArIFwiIC5mb3JtLWNvbnRyb2w6dmlzaWJsZTpub3QoOmRpc2FibGVkKTpmaXJzdFwiKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Rm9ybUNvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWxhdGl2ZVNpdGVVUkwoY29udHJvbGxlcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIGxldCBpQyA9IF91cmwuaW5kZXhPZihjb250cm9sbGVyKTtcclxuICAgICAgICBpZiAoaUMgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdXJsLnN1YnN0cmluZygwLCBpQykgKyBjb250cm9sbGVyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXRlQWJzb2x1dGVVUkwocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjb250cm9sbGVyID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKVswXTtcclxuICAgICAgICBsZXQgbWV0aG9kID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoY29udHJvbGxlciwgXCJcIikucmVwbGFjZShcIi8vXCIsIFwiXCIpO1xyXG5cclxuICAgICAgICAvLyDEjWUgcmVsYXRpdmUgcGF0aCDFvmUgdnNlYnVqZSBodHRwLCBnYSBuZSBkb2RhbW9cclxuICAgICAgICBpZiAocmVsYXRpdmVQYXRoLmluZGV4T2YoXCJodHRwXCIpID49IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBnbG9iYWwuZ2V0U2l0ZUJhc2VVcmwoKSArIFwiL1wiICsgY29udHJvbGxlciArIG1ldGhvZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbG9kZUN1cnJlbnRQYWdlKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEh0bWxJbnB1dFN0cmluZ1ZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgZWxlbWVudFNlbGVjdG9yID0gcGFyZW50SWQgPT09IG51bGwgPyBlbGVtZW50SWQgOiBwYXJlbnRJZCArIFwiIFwiICsgZWxlbWVudElkO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudCA9ICQoZWxlbWVudFNlbGVjdG9yKVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXROdW1lcmljVmFsdWUocGFyZW50SWQ6IHN0cmluZywgZWxlbWVudElkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZCwgZWxlbWVudElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXRCb29sZWFuVmFsdWUocGFyZW50SWQ6IHN0cmluZywgZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZCwgZWxlbWVudElkKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5SW5wdXRTdHJpbmdWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlJbnB1dE51bWVyaWNWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdHJWYWwgPSB0aGlzLmdldEpRdWVyeUlucHV0U3RyaW5nVmFsdWUoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKHN0clZhbCA9PSBudWxsIHx8IHRoaXMuaXNFbXB0eShzdHJWYWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHN0clZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlUZXh0QXJlYVN0cmluZ1ZhbHVlKGVsZW1lbnQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQudmFsKCkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEpRdWVyeVNlbGVjdFZhbHVlKGVsZW1lbnQ6IEpRdWVyeTxIVE1MU2VsZWN0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZ1ZhbHVlSW5TdHJpbmdWYWx1ZUxpc3Qoc3RyaW5nVmFsdWU6IHN0cmluZywgc3RyaW5nVmFsdWVMaXN0OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgc3RyaW5nVmFsdWVMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHN0cmluZ1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXRWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlTZWxlY3RUZXh0KGVsZW1lbnQ6IEpRdWVyeTxIVE1MU2VsZWN0RWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmZpbmQoXCJvcHRpb246c2VsZWN0ZWRcIikudGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb3B5VG9DbGlwYm9hcmQoY29weVRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvcHlUZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGVja2JveFN3aXRjaCB7XHJcblxyXG4gICAgaW5pdChwYXJlbnRFbGVtZW50OiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja2JveFN3aXRjaE9uQ2xpY2socGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2hMYWJlbE9uQ2xpY2socGFyZW50RWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tib3hTd2l0Y2hPbkNsaWNrKHBhcmVudEVsZW1lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1jaGVja2JveC4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtY2hlY2tib3ggcGFyZW50RWxlbWVudDogXCIgKyBwYXJlbnRFbGVtZW50KTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPi5zYW9wLXN3aXRjaC1jaGVja2JveFwiKTtcclxuICAgICAgICBfZnJhbWUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2ZyYW1lLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBfY2hlY2tCb3ggPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBfYXRyUGFyZW50ID0gXCIjXCIrJChfY2hlY2tCb3gpLmF0dHIoXCJmb3JcIik7XHJcbiAgICAgICAgICAgIGxldCBfY2hlY2tCb3hQID0gJChcIlwiICsgcGFyZW50RWxlbWVudCArIFwiICo+XCIgKyBfYXRyUGFyZW50KTtcclxuICAgICAgICAgICAgbGV0IF9sYWJlbDEgPSBfY2hlY2tCb3hQLmZpbmQoXCIjc2FvcC1zd2l0Y2gtbGFiZWwxXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2xhYmVsMiA9IF9jaGVja0JveFAuZmluZChcIiNzYW9wLXN3aXRjaC1sYWJlbDJcIik7XHJcbiAgICAgICAgICAgIGlmIChfY2hlY2tCb3guY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNoZWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInVuY2hlY2tlZFwiKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hMYWJlbE9uQ2xpY2socGFyZW50RWxlbWVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWxhYmVsLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1sYWJlbCBwYXJlbnRFbGVtZW50OiBcIiArIHBhcmVudEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgX2ZyYW1lID0gJChcIlwiICsgcGFyZW50RWxlbWVudCArIFwiICo+LnNhb3Atc3dpdGNoLWxhYmVsXCIpO1xyXG4gICAgICAgIF9mcmFtZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICBfZnJhbWUuY2xpY2soZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IF9zd2l0Y2hMYWJlbCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IF9hdHJDaGVja0JveCA9IFwiI1wiKyQoX3N3aXRjaExhYmVsKS5hdHRyKFwiZm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94ID0gJChfYXRyQ2hlY2tCb3gpO1xyXG4gICAgICAgICAgICAkKF9jaGVja0JveCkucHJvcCggJ2NoZWNrZWQnLCAnZmxhc2UnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbCB7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiZm9jdXNcIixfdGhpcy5zYW9wSW5wdXRPbkZvY3VzKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9uKFwiZm9jdXNcIixfdGhpcy5zYW9wSW5wdXRPbkZvY3VzKTtcclxuXHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vZmYoXCJibHVyXCIsX3RoaXMuc2FvcElucHV0T25CbHVyKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9uKFwiYmx1clwiLF90aGlzLnNhb3BJbnB1dE9uQmx1cik7XHJcbiAgICBcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9mZihcImZvY3Vzb3V0XCIsX3RoaXMuc2FvcElucHV0T25DaGFuZ2UpO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub24oXCJmb2N1c291dFwiLF90aGlzLnNhb3BJbnB1dE9uQ2hhbmdlKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2FvcElucHV0T25DaGFuZ2UoZTphbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1mbG9hdGluZy1sYWJlbC4uLnNhb3BJbnB1dE9uQ2hhbmdlXCIpO1xyXG4gICAgICAgIGxldCBodG1sRWxlbWVudCA9IGUudGFyZ2V0O1xyXG4gICAgICAgIGxldCBfbm9kZSA9ICQoXCIjXCIraHRtbEVsZW1lbnQuaWQpO1xyXG4gICAgICAgIGlmIChfbm9kZS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgbGV0IF9wYXJlbnROID0gX25vZGUucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChfcGFyZW50Ti5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIF9wYXJlbnROLnJlbW92ZUNsYXNzKFwic2FvcC1lcnJvci1pbnB1dFwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfbGFiZWwgPSBfcGFyZW50Ti5maW5kKFwiLnRleHQtZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9sYWJlbC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICBfbGFiZWwucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHNhb3BJbnB1dE9uRm9jdXMoZTphbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1mbG9hdGluZy1sYWJlbC4uLlwiKTtcclxuICAgICAgICAvL2JhcnZhbmplIFwiZmxvYXRpbmcgbGFiZWxcIlxyXG4gICAgICAgIGxldCBodG1sRWxlbWVudCA9IGUudGFyZ2V0O1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNhb3AtZmxvYXRpbmctbGFiZWwnKS5jbGFzc0xpc3QuYWRkKFwic2FvcC10eHQtcHJpbWFyeVwiKTtcclxuICAgIH1cclxuICAgICAgICBcclxuICAgIHNhb3BJbnB1dE9uQmx1cihlOmFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLWZsb2F0aW5nLWxhYmVsLi4uXCIpO1xyXG4gICAgICAgIC8vYmFydmFuamUgXCJmbG9hdGluZyBsYWJlbFwiIG9uIGlucHV0IGJsdXIgKGZvY3VzIGxvc3QpIG5hemFqIHYgc2l2byAocmVtb3ZlIHJhenJlZCBcInNhb3AtdHh0LXByaW1hcnlcIilcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBodG1sRWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zYW9wLWZsb2F0aW5nLWxhYmVsJykuY2xhc3NMaXN0LnJlbW92ZShcInNhb3AtdHh0LXByaW1hcnlcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNldENhcHRpb25Bc1JlcXVpcmVkKGxhYmVsSWQ6c3RyaW5nLHJlcXVpcmVkOmJvb2xlYW4pOnZvaWR7XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJChsYWJlbElkKTtcclxuICAgICAgICBsZXQgX2VsZW1lbnRWYWwgPSBfZWxlbWVudC50ZXh0KCkudG9TdHJpbmcoKTtcclxuICAgICAgICBfZWxlbWVudFZhbCA9IF9lbGVtZW50VmFsLnJlcGxhY2UoXCIqXCIsXCJcIik7XHJcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIF9lbGVtZW50LnRleHQoX2VsZW1lbnRWYWwrXCIqXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF9lbGVtZW50LnRleHQoX2VsZW1lbnRWYWwpO1xyXG4gICAgICAgIH1cclxuICAgIH0gIFxyXG5cclxuICAgIC8vXHJcbn0iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzLmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5jbGFzcyBzZWxlY3RJdGVtIHtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNsYXNzIEVkaXRhYmxlQ29sdW1uRGF0YSB7XHJcbiAgICB0aXA6IHN0cmluZztcclxuICAgIHNlbGVjdEl0ZW1zOiBzZWxlY3RJdGVtW107XHJcbiAgICBudW1lcmljTWluVmFsdWU6IG51bWJlcjtcclxuICAgIG51bWVyaWNNYXhWYWx1ZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWRFZGl0IHtcclxuICAgIHB1YmxpYyBsaWJOYW1lOiBzdHJpbmc7ICBcclxuXHJcbiAgICBwcml2YXRlIF9FZGl0YWJsZUNvbHVtbkRhdGE6IEVkaXRhYmxlQ29sdW1uRGF0YTtcclxuICAgIHByaXZhdGUgX3RkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuICAgIH0gIFxyXG5cclxuICAgIHNob3dXZWJHcmlkRWRpdGFibGVDb2x1bW5FZGl0Q29udHJvbCh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5zaG93V2ViR3JpZEVkaXRhYmxlQ29sdW1uRWRpdENvbnRyb2xcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3RkRWxlbWVudCA9IHRkRWxlbWVudDtcclxuICAgICAgICBsZXQgdGRFbGVtZW50SHRtbCA9IHRoaXMuX3RkRWxlbWVudC5pbm5lckhUTUw7XHJcblxyXG4gICAgICAgIGlmICh0ZEVsZW1lbnRIdG1sLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXJcIikgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBlZGl0IGtvbnRyb2xhIHplIG9ic3RhamFcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhID0gdGhpcy5nZXREYXRhQXR0cmlidXRlKHRoaXMuX3RkRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuQWRkRWRpdGFibGVDb2x1bW5FZGl0SHRtbCh0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEudGlwKTtcclxuICAgIH1cclxuXHJcbiAgICBvbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0Lm9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXREYXRhQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRWRpdGFibGVDb2x1bW5EYXRhIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdldERhdGFBdHRyaWJ1dGVcIik7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gbmV3IEVkaXRhYmxlQ29sdW1uRGF0YSgpO1xyXG5cclxuICAgICAgICBkYXRhLnRpcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lZGl0LXR5cGVcIik7XHJcbiAgICAgICAgZGF0YS5zZWxlY3RJdGVtcyA9ICQucGFyc2VKU09OKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lZGl0LXNlbGVjdC1pdGVtc1wiKSk7XHJcbiAgICAgICAgZGF0YS5udW1lcmljTWluVmFsdWUgPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC1udW1iZXItbWluXCIpKTtcclxuICAgICAgICBkYXRhLm51bWVyaWNNYXhWYWx1ZSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lZGl0LW51bWJlci1tYXhcIikpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEFkZEVkaXRhYmxlQ29sdW1uRWRpdEh0bWwodGlwOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LkFkZEVkaXRhYmxlQ29sdW1uRWRpdEh0bWxcIik7XHJcblxyXG4gICAgICAgIGxldCB0ZEVsZW1lbnRUZXh0ID0gdGhpcy5fdGRFbGVtZW50LmlubmVyVGV4dDtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5nZXRJbnB1dEVsZW1lbnQodGlwLCB0ZEVsZW1lbnRUZXh0KTtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckNlbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb250YWluZXJDZWxsRGl2LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGxcIik7XHJcbiAgICAgICAgY29udGFpbmVyQ2VsbERpdi5hcHBlbmRDaGlsZChpbnB1dCk7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXJcIik7XHJcbiAgICAgICAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGNvbnRhaW5lckNlbGxEaXYpO1xyXG5cclxuICAgICAgICB0aGlzLl90ZEVsZW1lbnQuaW5uZXJIVE1MID0gY29udGFpbmVyRGl2Lm91dGVySFRNTDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRBZnRlckluaXQodGlwLCB0ZEVsZW1lbnRUZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElucHV0RWxlbWVudCh0aXA6IHN0cmluZywgaW5wdXRWYWx1ZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2V0SW5wdXRFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHRpcCkge1xyXG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlVGV4dEh0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZVRleHRhcmVhSHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZVNlbGVjdEh0bWwoaW5wdXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlTnVtYmVySHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVUZXh0SHRtbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVUZXh0SHRtbCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZW5lcmF0ZVRleHRIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVUZXh0YXJlYUh0bWwoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVUZXh0YXJlYUh0bWxcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTFRleHRBcmVhRWxlbWVudDtcclxuXHJcbiAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dC10ZXh0YXJlYVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfSBcclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlU2VsZWN0SHRtbChzZWxlY3RWYWx1ZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVTZWxlY3RIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxTZWxlY3RFbGVtZW50O1xyXG5cclxuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLnNlbGVjdEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaW5wdXQub3B0aW9ucy5hZGQobmV3IE9wdGlvbihpdGVtLnRleHQsIGl0ZW0udmFsdWUsIHNlbGVjdFZhbHVlID09PSBpdGVtLnZhbHVlKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlTnVtYmVySHRtbCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZW5lcmF0ZU51bWJlckh0bWxcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIGlucHV0LnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgIGlmICh0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01pblZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlucHV0Lm1pbiA9IHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5udW1lcmljTWluVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5udW1lcmljTWF4VmFsdWUpIHtcclxuICAgICAgICAgICAgaW5wdXQubWF4ID0gdGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLm51bWVyaWNNYXhWYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRJbnB1dEVsZW1lbnRBZnRlckluaXQodGlwOiBzdHJpbmcsIHRkRWxlbWVudFRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuc2V0SW5wdXRFbGVtZW50QWZ0ZXJJbml0XCIpO1xyXG5cclxuICAgICAgICBpZiAodGlwID09PSBcInRleHRcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlSW5wdXRWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpcCA9PT0gXCJ0ZXh0YXJlYVwiKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZEVsZW1lbnRJbnB1dCA9IHRoaXMuX3RkRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRleHRhcmVhXCIpWzBdO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC52YWx1ZSA9IHRkRWxlbWVudFRleHQ7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVUZXh0QXJlYVZhbHVlVG9UREVsZW1lbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGlwID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZEVsZW1lbnRJbnB1dCA9IHRoaXMuX3RkRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNlbGVjdFwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZVNlbGVjdFZhbHVlVG9UREVsZW1lbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGlwID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZEVsZW1lbnRJbnB1dCA9IHRoaXMuX3RkRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC52YWx1ZSA9IHRkRWxlbWVudFRleHQ7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVOdW1iZXJWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlSW5wdXRWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVWYWx1ZVRvVERFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpbnB1dFZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZVZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0ZW1wRWxlbWVudCA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCBlbGVtZW50LCBraSBpbWEgY2xhc3Mgc2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci4gTmplZ292IHBhcmVudCBqZSBURCBlbGVtZW50LlxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGVtcEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lclwiKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRkRWxlbWVudCA9IHRlbXBFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB0ZEVsZW1lbnQuaW5uZXJIVE1MID0gaW5wdXRWYWw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRoaXMuX3RkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ZW1wRWxlbWVudCA9IHRlbXBFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVJbnB1dFZhbHVlVG9UREVsZW1lbnQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlSW5wdXRWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyaHRtbCB2cGlzZW1vIHRleHQgdmFsdWVcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9UREVsZW1lbnQocGFyZW50LCBpbnB1dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3cml0ZVRleHRBcmVhVmFsdWVUb1RERWxlbWVudChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVUZXh0QXJlYVZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSBzZW5kZXIudGFyZ2V0O1xyXG4gICAgICAgIGxldCBpbnB1dFZhbCA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBqZSBURCBlbGVtZW50IGluIHYgaW5uZXIgaHRtbCB2cGlzZW1vIHRleHQgdmFsdWVcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9UREVsZW1lbnQocGFyZW50LCBpbnB1dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3cml0ZVNlbGVjdFZhbHVlVG9UREVsZW1lbnQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlU2VsZWN0VmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTFNlbGVjdEVsZW1lbnQgPSBzZW5kZXIudGFyZ2V0O1xyXG4gICAgICAgIGxldCBpbnB1dFZhbCA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBqZSBURCBlbGVtZW50IGluIHYgaW5uZXIgaHRtbCB2cGlzZW1vIHRleHQgdmFsdWVcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9UREVsZW1lbnQocGFyZW50LCBpbnB1dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3cml0ZU51bWJlclZhbHVlVG9UREVsZW1lbnQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlTnVtYmVyVmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudCA9IHNlbmRlci50YXJnZXQ7XHJcbiAgICAgICAgbGV0IGlucHV0VmFsID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGplIFREIGVsZW1lbnQgaW4gdiBpbm5lciBodG1sIHZwaXNlbW8gdGV4dCB2YWx1ZVxyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWVUb1RERWxlbWVudChwYXJlbnQsIGlucHV0VmFsKTtcclxuICAgIH1cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IFNhb3BJbnB1dFdGTCxTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zYW9wLWlucHV0LXdmbCdcclxuaW1wb3J0IHsgU2FvcHNlbGVjdFdGTCB9IGZyb20gJy4vc2FvcC1zZWxlY3Qtd2ZsJ1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkRmlsdGVyIHtcclxuICBwdWJsaWMgaWQ6c3RyaW5nID0gXCJ3Z2YxXCI7XHJcbiAgcHVibGljIG1vZGFsRmlsdGVyQXJyYXk6IGFueSA9IFtdO1xyXG4gIC8vVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgY29udGVudCBpbnNpZGUgdGhlIGZpbHRlciBtb2RhbFxyXG4gIGNvbmZpZ0ZpbHRlcihsaWJOYW1lOnN0cmluZyxodG1sVGFibGU6IGFueSwgY29sQXJyYXk6IGFueSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgdGFibGVOYW1lID0gaHRtbFRhYmxlWzBdLmlkO1xyXG4gICAgICB2YXIgY29sdW1ucyA9IGh0bWxUYWJsZS5hcGkoKS5jb2x1bW5zKCk7XHJcbiAgICAgICQuZWFjaChjb2xBcnJheSwgZnVuY3Rpb24gKGksIGFyZykge1xyXG4gICAgICAgIGxldCBfY29sTm8gPSBhcmcudG9TdHJpbmcoKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXR0cihcImlkXCIsXCJjb2x1bW4taGVhZGVyLVwiKyBfY29sTm8gK1wiXCIpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hcHBlbmQoJzxzcGFuIGlkPVwiY29sdW1uLWhlYWRlci0nKyBfY29sTm8gKyctZmlsdGVyXCIgY2xhc3M9XCJzYW9wLWltZy1maWx0ZXIgc2kteHNcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5zaG93RmlsdGVyKGV2ZW50LFxcJycgKyB0YWJsZU5hbWUgKyAnXycgKyBfY29sTm8gKyAnXFwnKTtcIj48L3NwYW4+Jyk7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmFwcGVuZChcIjxzcGFuIGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfY29sTm8gK1wiLXNvcnQnIGNsYXNzPScnPiZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5cIik7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9jb2xObyArXCItc2l6ZXInPlwiKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdGVtcGxhdGUgPVxyXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWxGaWx0ZXJcIj4nICtcclxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj4nICtcclxuICAgICAgICAnezB9PC9kaXY+JyArXHJcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj4nICtcclxuICAgICAgICAnPGEgaHJlZj1cIiMhXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIucGVyZm9ybUZpbHRlcih0aGlzLCB7MX0sIFxcJ3syfVxcJyk7XCIgIGNsYXNzPVwiIGJ0biByaWdodCB3YXZlcy1lZmZlY3Qgd2F2ZXMtbGlnaHRcIj5WIHJlZHU8L2E+JyArICAgICAgICBcclxuICAgICAgICAnPGEgaHJlZj1cIiMhXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIuY2xlYXJGaWx0ZXIodGhpcywgezF9LCBcXCd7Mn1cXCcpO1wiICBjbGFzcz1cIiBidG4gbGVmdCB3YXZlcy1lZmZlY3Qgd2F2ZXMtbGlnaHRcIj5aYnJpxaFpPC9hPicgK1xyXG4gICAgICAgICc8YSBocmVmPVwiIyFcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5oaWRlRmlsdGVyKCk7XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBjbGFzcz1cIiBidG4gbGVmdCB3YXZlcy1lZmZlY3Qgd2F2ZXMtbGlnaHRcIj5QcmVrbGnEjWk8L2E+JyArXHJcbiAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgJC5lYWNoKGNvbEFycmF5LCBmdW5jdGlvbiAoaW5kZXg6IGFueSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbHVtbnMuZXZlcnkoZnVuY3Rpb24gKGk6IGFueSkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBpKSB7XHJcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLCBcclxuICAgICAgICAgICAgY29udGVudCA9ICcnOy8vJzxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZmlsdGVyU2VhcmNoVGV4dFwiIG9ua2V5dXA9XCJmaWx0ZXJWYWx1ZXModGhpcylcIiAvPiA8YnIvPic7XHJcbiAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lID0gJCh0aGlzLmhlYWRlcigpKS50ZXh0KCkucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XHJcbiAgICAgICAgICAgIHZhciBkaXN0aW5jdEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb2x1bW4uZGF0YSgpLmVhY2goZnVuY3Rpb24gKGQ6IHN0cmluZywgajogYW55KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRpc3RpbmN0QXJyYXkuaW5kZXhPZihkKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lICsgXCJfXCIgKyBqOyAvLyBvbmNoYW5nZT1cImZvcm1hdFZhbHVlcyh0aGlzLCcgKyB2YWx1ZSArICcpO1xyXG4gICAgICAgICAgICAgICAgY29udGVudCArPSAnPGRpdj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCInICsgZCArICdcIiAgaWQ9XCInICsgaWQgKyAnXCIvPjxsYWJlbCBmb3I9XCInICsgaWQgKyAnXCI+ICcgKyBkICsgJzwvbGFiZWw+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgIGRpc3RpbmN0QXJyYXkucHVzaChkKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pOyBcclxuICAgICAgICAgICAgdmFyIG5ld1RlbXBsYXRlID0gJCh0ZW1wbGF0ZS5yZXBsYWNlKCd7MH0nLCBjb250ZW50KS5yZXBsYWNlKCd7MX0nLCB2YWx1ZSkucmVwbGFjZSgnezF9JywgdmFsdWUpLnJlcGxhY2UoJ3syfScsIHRhYmxlTmFtZSkucmVwbGFjZSgnezJ9JywgdGFibGVOYW1lKSk7XHJcbiAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQobmV3VGVtcGxhdGUpO1xyXG4gICAgICAgICAgICBfdGhpcy5tb2RhbEZpbHRlckFycmF5W3RhYmxlTmFtZSArIFwiX1wiICsgdmFsdWVdID0gbmV3VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9LCA1MCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vVXNlciB0byBzaG93IHRoZSBmaWx0ZXIgbW9kYWxcclxuICBzaG93RmlsdGVyKGU6IGFueSwgaW5kZXg6IGFueSkge1xyXG4gICAgJCgnLm1vZGFsRmlsdGVyJykuaGlkZSgpO1xyXG4gICAgJCh0aGlzLm1vZGFsRmlsdGVyQXJyYXlbaW5kZXhdKS5jc3MoeyBsZWZ0OiAwLCB0b3A6IDAgfSk7XHJcbiAgICB2YXIgdGggPSAkKGUudGFyZ2V0KS5wYXJlbnQoKTtcclxuICAgIHZhciBwb3MgPSB0aC5vZmZzZXQoKTtcclxuICAgIGxldCBhcnJheUl0ZW0gPSB0aGlzLm1vZGFsRmlsdGVyQXJyYXlbaW5kZXhdO1xyXG4gICAgLy8kKHRoaXMubW9kYWxGaWx0ZXJBcnJheVtpbmRleF0pLndpZHRoKHRoLndpZHRoKCkgKiAwLjc1KTtcclxuICAgICQoYXJyYXlJdGVtKS5jc3MoeyAnbGVmdCc6IHBvcy5sZWZ0LCAndG9wJzogcG9zLnRvcCwgJ21pbi13aWR0aCc6KHRoLndpZHRoKCkgKiAwLjc1KSB9KTtcclxuICAgICQoYXJyYXlJdGVtKS5zaG93KCk7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGFibGVIZWFkZXJTdGF0dXModGFibGVJZDpzdHJpbmcsY29sdW1uSWQ6c3RyaW5nLGFjdGl2ZUZpbHRlcjpib29sZWFuKXtcclxuICAgIGxldCBfY29sRmlsdGVySWQgPSBjb2x1bW5JZCtcIi1maWx0ZXJcIjtcclxuICAgIGxldCBfY29sRmlsdGVyID0gJCh0YWJsZUlkKS5maW5kKF9jb2xGaWx0ZXJJZClbMF07XHJcbiAgICBsZXQgX2NvbEZpbHRlckF0ciA9IF9jb2xGaWx0ZXIuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XHJcbiAgICBpZihhY3RpdmVGaWx0ZXIpe1xyXG4gICAgICAgIF9jb2xGaWx0ZXJBdHIucmVwbGFjZShcInNhb3AtaW1nLWZpbHRlclwiLCBcInNhb3AtaW1nLWZpbHRlciBzYW9wLWNsLWJsdWVcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIF9jb2xGaWx0ZXJBdHIucmVwbGFjZShcInNhb3AtaW1nLWZpbHRlciBzYW9wLWNsLWJsdWVcIiwgXCJzYW9wLWltZy1maWx0ZXJcIik7XHJcbiAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9UaGlzIGZ1bmN0aW9uIGlzIHRvIHVzZSB0aGUgc2VhcmNoYm94IHRvIGZpbHRlciB0aGUgY2hlY2tib3hcclxuICBmaWx0ZXJWYWx1ZXMobm9kZTogYW55KSB7XHJcbiAgICB2YXIgc2VhcmNoU3RyaW5nID0gJChub2RlKS52YWwoKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgdmFyIHJvb3ROb2RlID0gJChub2RlKS5wYXJlbnQoKTtcclxuICAgIGlmIChzZWFyY2hTdHJpbmcgPT0gJycpIHtcclxuICAgICAgcm9vdE5vZGUuZmluZCgnZGl2Jykuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcm9vdE5vZGUuZmluZChcImRpdlwiKS5oaWRlKCk7XHJcbiAgICAgIHJvb3ROb2RlLmZpbmQoXCJkaXY6Y29udGFpbnMoJ1wiICsgc2VhcmNoU3RyaW5nICsgXCInKVwiKS5zaG93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0V4ZWN1dGUgdGhlIGZpbHRlciBvbiB0aGUgdGFibGUgZm9yIGEgZ2l2ZW4gY29sdW1uXHJcbiAgcGVyZm9ybUZpbHRlcihub2RlOiBhbnksIGk6IGFueSwgdGFibGVJZDogYW55KSB7XHJcbiAgICB2YXIgcm9vdE5vZGUgPSAkKG5vZGUpLnBhcmVudCgpLnBhcmVudCgpO1xyXG4gICAgdmFyIHNlYXJjaFN0cmluZyA9ICcnLCBjb3VudGVyID0gMDtcclxuXHJcbiAgICByb290Tm9kZS5maW5kKCdpbnB1dDpjaGVja2JveCcpLmVhY2goZnVuY3Rpb24gKGluZGV4OiBhbnksIGNoZWNrYm94OiBhbnkpIHtcclxuICAgICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgICAgICBzZWFyY2hTdHJpbmcgKz0gKGNvdW50ZXIgPT0gMCkgPyBjaGVja2JveC52YWx1ZSA6ICd8JyArIGNoZWNrYm94LnZhbHVlO1xyXG4gICAgICAgIGNvdW50ZXIrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IF9jb2xJZCA9IFwiI2NvbHVtbi1oZWFkZXItXCIraS50b1N0cmluZygpO1xyXG4gICAgaWYoY291bnRlciA+IDApe1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlSGVhZGVyU3RhdHVzKCcjJyArdGFibGVJZCxfY29sSWQsdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlSGVhZGVyU3RhdHVzKCcjJyArdGFibGVJZCxfY29sSWQsZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgICQoJyMnICsgdGFibGVJZCkuRGF0YVRhYmxlKCkuY29sdW1uKGkpLnNlYXJjaChcclxuICAgICAgc2VhcmNoU3RyaW5nLFxyXG4gICAgICB0cnVlLCBmYWxzZVxyXG4gICAgKS5kcmF3KCk7XHJcbiAgICByb290Tm9kZS5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICAvL1JlbW92ZXMgdGhlIGZpbHRlciBmcm9tIHRoZSB0YWJsZSBmb3IgYSBnaXZlbiBjb2x1bW5cclxuICBjbGVhckZpbHRlcihub2RlOiBhbnksIGk6IGFueSwgdGFibGVJZDogYW55KSB7XHJcbiAgICB2YXIgcm9vdE5vZGUgPSAkKG5vZGUpLnBhcmVudCgpLnBhcmVudCgpO1xyXG4gICAgcm9vdE5vZGUuZmluZChcIi5maWx0ZXJTZWFyY2hUZXh0XCIpLnZhbCgnJyk7XHJcbiAgICByb290Tm9kZS5maW5kKCdpbnB1dDpjaGVja2JveCcpLmVhY2goZnVuY3Rpb24gKGluZGV4OiBhbnksIGNoZWNrYm94OiBhbnkpIHtcclxuICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAkKGNoZWNrYm94KS5wYXJlbnQoKS5zaG93KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgX2NvbElkID0gXCIjY29sdW1uLWhlYWRlci1cIitpLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlSGVhZGVyU3RhdHVzKCcjJyArdGFibGVJZCxfY29sSWQsZmFsc2UpO1xyXG5cclxuICAgICQoJyMnICsgdGFibGVJZCkuRGF0YVRhYmxlKCkuY29sdW1uKGkpLnNlYXJjaChcclxuICAgICAgJycsXHJcbiAgICAgIHRydWUsIGZhbHNlXHJcbiAgICApLmRyYXcoKTtcclxuICAgIHJvb3ROb2RlLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIGhpZGVGaWx0ZXIobm9kZTogYW55LCBpOiBhbnksIHRhYmxlSWQ6IGFueSkge1xyXG4gICAgJCgnLm1vZGFsRmlsdGVyJykuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVzaXplRXZlbnQoZ3JpZElkOnN0cmluZyl7XHJcbiAgICB2YXIgX3RhYmxlRGl2ID0gJChcInRhYmxlXCIrZ3JpZElkK1wiIHRoXCIpIGFzIGFueTtcclxuXHQgIHZhciB0aEhlaWdodCA9ICQoXCJ0YWJsZVwiK2dyaWRJZCtcIiB0aDpmaXJzdFwiKS5oZWlnaHQoKTtcclxuXHQgIF90YWJsZURpdi5yZXNpemFibGUoe1xyXG5cdFx0ICBoYW5kbGVzOiBcImVcIixcclxuXHRcdCAgbWluSGVpZ2h0OiB0aEhlaWdodCxcclxuXHRcdCAgbWF4SGVpZ2h0OiB0aEhlaWdodCxcclxuXHRcdCAgbWluV2lkdGg6IDQwLFxyXG5cdFx0ICByZXNpemU6IGZ1bmN0aW9uIChldmVudDphbnksIHVpOmFueSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzaXplLi4uXCIpO1xyXG4gICAgICAgIHZhciBzaXplcmlkID0gXCIjXCIgKyAkKGV2ZW50LnRhcmdldCkuYXR0cihcImlkXCIpICsgXCItc2l6ZXJcIjtcclxuICAgICAgICAkKHNpemVyaWQpLndpZHRoKHVpLnNpemUud2lkdGgpO1xyXG5cdFx0ICB9XHJcblx0ICB9KTsgICAgXHJcbiAgfVxyXG5cclxuICBzZXRTb3J0RWxlbWVudEV2ZW50KGdyaWRJZDogc3RyaW5nKTp2b2lke1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICQoZ3JpZElkKS5vbignY2xpY2snLCAndGgnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIF90aGlzLnNldFNvcnRFbGVtZW50KGdyaWRJZCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgc2V0U29ydEVsZW1lbnQoZ3JpZElkOiBzdHJpbmcpOnZvaWQge1xyXG4gICAgICAkKFwiXCIgKyBncmlkSWQgKyBcIiB0aGVhZDpmaXJzdCB0aFwiKS5lYWNoKGZ1bmN0aW9uIChpLCB0aCkge1xyXG4gICAgICAgIGxldCBfY29sID0gJCh0aCk7XHJcbiAgICAgICAgbGV0IF9jb2xJZCA9IFwiI1wiK19jb2wuYXR0cignaWQnKTtcclxuICAgICAgICAvL2xldCBfc29ydFR5cGUgPSBfY29sLmF0dHIoXCJjb2x1bW4tc29ydFwiKTtcclxuICAgICAgICBsZXQgX2NvbEljb25JZFVwID0gX2NvbElkK1wiLWljb24tdXBcIjtcclxuICAgICAgICBsZXQgX2NvbEljb25JZCA9IF9jb2xJZCtcIi1pY29uXCI7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uVXBFbGVtZW50ID0gJChncmlkSWQrJyAnK19jb2xJY29uSWRVcCk7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uRWxlbWVudCA9ICQoZ3JpZElkKycgJytfY29sSWNvbklkKTtcclxuICAgICAgICBsZXQgY2xzID0gJCh0aCkuYXR0cignY2xhc3MnKTtcclxuXHJcbiAgICAgICAgLy9pZiAoX3NvcnRUeXBlICE9IG51bGwpIHtcclxuICAgICAgICAgIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMuaW5kZXhPZihcIm5vLXNvcnRcIikgPj0gMCkge1xyXG4gICAgICAgICAgICBfY29sSWNvblVwRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LXVwXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpOyAgICAgICAgIFxyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWNsLWJsdWVcIik7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgfSAgICAgICAgICBcclxuICAgICAgICAgIGVsc2UgaWYgKGNscyAhPSBudWxsICYmIGNscy5pbmRleE9mKFwic29ydGluZ19hc2NcIikgPj0gMCkge1xyXG4gICAgICAgICAgICBfY29sSWNvblVwRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5hZGRDbGFzcyhcInNhb3AtaW1nLWFycm93LXVwIHNhb3AtY2wtYmx1ZVwiKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmluZGV4T2YoXCJzb3J0aW5nX2Rlc2NcIikgPj0gMCkge1xyXG4gICAgICAgICAgICBfY29sSWNvblVwRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LXVwXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duIHNhb3AtY2wtYmx1ZVwiKTsgICAgICAgICAgICBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LXVwXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpOyAgICAgICAgIFxyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWNsLWJsdWVcIik7ICAgXHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5hZGRDbGFzcyhcInNhb3AtaW1nLWFycm93LXVwXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvblVwRWxlbWVudC5hZGRDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH0pO1xyXG4gIH0gXHJcblxyXG4gIGNvbmZpZ1NpbXBsZUZpbHRlcihkYXRhVGFibGU6IGFueSk6dm9pZCB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHRhYmxlSWQgPSBcIiNcIitkYXRhVGFibGVbMF0uaWQ7XHJcbiAgICBsZXQgX2lDb3VudCA9IDA7XHJcbiAgICB2YXIgX2ZpbHRlckVuYWJsZSA9IGZhbHNlO1xyXG4gICAgbGV0IF90aF9jb2x1bW5zID0gJCh0YWJsZUlkKS5maW5kKCd0aCcpO1xyXG4gICAgX3RoX2NvbHVtbnMuZWFjaCggXHJcbiAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfaUNvdW50ID0gX2lDb3VudCArIDE7XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzKTtcclxuICAgICAgICBsZXQgX2ZpbHRlclR5cGUgPSBfZWxlbWVudC5hdHRyKFwiY29sdW1uLWZpbHRlclwiKTsgICBcclxuICAgICAgICBsZXQgX25vc29ydCA9IF9lbGVtZW50Lmhhc0NsYXNzKFwibm8tc29ydFwiKTtcclxuICAgICAgICBsZXQgX2FjdGlvbkNvbHVtbiA9IF9lbGVtZW50Lmhhc0NsYXNzKFwic2FvcC10YWJsZS10aC1sYXN0XCIpO1xyXG4gICAgICAgIF9lbGVtZW50LmF0dHIoXCJpZFwiLFwiY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCJcIik7XHJcbiAgICAgICAgX2VsZW1lbnQuY3NzKFwib3V0bGluZVwiLFwibm9uZVwiKTtcclxuICAgICAgICBsZXQgY29sX3RpdGxlID0gX2VsZW1lbnQudGV4dCgpO1xyXG4gICAgICAgIC8vbGV0IGNvbF9tYXhfd2lkdGggPSBjb2xfdGl0bGUubGVuZ3RoICogNztcclxuICAgICAgICBfZWxlbWVudC50ZXh0KFwiXCIpO1xyXG5cclxuICAgICAgICAvL19lbGVtZW50LmFwcGVuZChcIjxkaXYgY2xhc3M9J3Nhb3AtdGFibGUtaGVhZGVyLWNhcHRpb24gc2FvcC10YWJsZS10ZXh0LXRydW5jYXRlJyBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItY2FwdGlvbicgc3R5bGU9J21heC13aWR0aDpcIitjb2xfbWF4X3dpZHRoLnRvU3RyaW5nKCkrXCJweCAhaW1wb3J0YW50Oyc+XCIrY29sX3RpdGxlK1wiPC9kaXY+XCIpO1xyXG4gICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgY2xhc3M9J3Nhb3AtdGFibGUtaGVhZGVyLWNhcHRpb24gc2FvcC10YWJsZS10ZXh0LXRydW5jYXRlJyBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItY2FwdGlvbic+XCIrY29sX3RpdGxlK1wiPC9kaXY+XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgX2ZpbHRlckVuYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJkcm9wZG93blwiKXtcclxuICAgICAgICAgIF9maWx0ZXJFbmFibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF9hY3Rpb25Db2x1bW4gIT0gbnVsbCAmJiBfYWN0aW9uQ29sdW1uID09IHRydWUpe1xyXG4gICAgICAgICAgX25vc29ydCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX25vc29ydCA9PSBudWxsIHx8X25vc29ydCA9PSBmYWxzZSl7XHJcbiAgICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1pY29uJyBzdHlsZT0nZmxvYXQ6IHJpZ2h0O2hlaWdodDogMjBweDt3aWR0aDogMjBweDtkaXNwbGF5OiBpbmxpbmUtZmxleDthbGlnbi1pdGVtczogY2VudGVyOyc+XCIpO1xyXG4gICAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItaWNvbi11cCcgc3R5bGU9J2Zsb2F0OiByaWdodDtoZWlnaHQ6IDIwcHg7d2lkdGg6IDVweDtkaXNwbGF5OiBpbmxpbmUtZmxleDthbGlnbi1pdGVtczogY2VudGVyOyc+XCIpOyAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLXNpemVyJz5cIik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKF9maWx0ZXJFbmFibGUpIHtcclxuICAgICAgJCh0YWJsZUlkKycgdGhlYWQgdHInKVxyXG4gICAgICAuY2xvbmUodHJ1ZSlcclxuICAgICAgLmFkZENsYXNzKCdmaWx0ZXJzJylcclxuICAgICAgLmFwcGVuZFRvKHRhYmxlSWQrJyB0aGVhZCcpO1xyXG5cclxuICAgICAgLy8gU2V0dXAgLSBhZGQgYSB0ZXh0IGlucHV0IHRvIGVhY2ggZm9vdGVyIGNlbGxcclxuICAgICAgbGV0IF9maWx0ZXJzID0gJCh0YWJsZUlkKS5maW5kKCcuZmlsdGVycycpO1xyXG4gICAgICBsZXQgX2ZpbHRlcnNfdGggPSBfZmlsdGVycy5maW5kKCd0aCcpO1xyXG4gICAgICBfaUNvdW50ID0gMDtcclxuICAgICAgX2ZpbHRlcnNfdGguZWFjaCggXHJcbiAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgX2lDb3VudCA9IF9pQ291bnQgKyAxO1xyXG4gICAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzKTtcclxuICAgICAgICAgIF9lbGVtZW50Lm9mZigpO1xyXG5cclxuICAgICAgICAgIF9lbGVtZW50Lmh0bWwoXCJcIik7XHJcblxyXG4gICAgICAgICAgbGV0IF9maWx0ZXJUeXBlID0gX2VsZW1lbnQuYXR0cihcImNvbHVtbi1maWx0ZXJcIik7XHJcblxyXG4gICAgICAgICAgd2hpbGUoX2VsZW1lbnRbMF0uYXR0cmlidXRlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgX2VsZW1lbnRbMF0ucmVtb3ZlQXR0cmlidXRlKF9lbGVtZW50WzBdLmF0dHJpYnV0ZXNbMF0ubmFtZSk7XHJcblxyXG4gICAgICAgICAgbGV0IF9jb2xJZCA9IFwiY29sX1wiK19pQ291bnQudG9TdHJpbmcoKTsgICAgICAgIFxyXG4gICAgICAgICAgX2VsZW1lbnQuYXR0cihcImlkXCIsX2NvbElkKTtcclxuICAgICAgICAgIGxldCBfaW5wdXRJZCA9IF9jb2xJZCtcIl9maWx0ZXJcIjsgICAgICAgIFxyXG4gICAgICAgICAgbGV0IHRpdGxlID0gX2VsZW1lbnQudGV4dCgpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgbGV0IF9pbnB1dEUgPSBuZXcgU2FvcElucHV0V0ZMKHtpZDpfaW5wdXRJZCxjYXB0aW9uOnRpdGxlLHBsYWNlaG9sZGVyOnRpdGxlfSkuZ2V0SW5uZXJIdG1sKCk7XHJcbiAgICAgICAgICAgIF9lbGVtZW50Lmh0bWwoX2lucHV0RSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcImRyb3Bkb3duXCIpe1xyXG4gICAgICAgICAgICBsZXQgX3NlbGVjdElkID0gX2NvbElkK1wiX3NlbGVjdFwiOyAgIFxyXG4gICAgICAgICAgICBsZXQgc2VsZWN0SHRtbCA9IG5ldyBTYW9wc2VsZWN0V0ZMKHtpZDpfc2VsZWN0SWQsY2FwdGlvbjpcIlwiLHBsYWNlaG9sZGVyOlwiXCJ9KS5nZXRJbm5lckh0bWwoKTtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdCA9ICQoc2VsZWN0SHRtbCk7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vXHJcblxyXG4gICAgICAgICAgICBsZXQgX2luZGV4ID0gX2lDb3VudDtcclxuICAgICAgICAgICAgX2luZGV4ID0gX2luZGV4IC0gMTtcclxuXHJcbiAgICAgICAgICAgIGRhdGFUYWJsZS5EYXRhVGFibGUoKVxyXG4gICAgICAgICAgICAuY29sdW1uKF9pbmRleCsnOnZpc2libGUnKVxyXG4gICAgICAgICAgICAuZGF0YSgpXHJcbiAgICAgICAgICAgIC51bmlxdWUoKVxyXG4gICAgICAgICAgICAuc29ydCgpXHJcbiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkOmFueSwgajphbnkpIHtcclxuICAgICAgICAgICAgICBpZiAoZC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGxldCBfY29udGVudCA9IGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2ZpcnN0Q2hhciA9IF9jb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9maXJzdENoYXIuY2hhckNvZGVBdCgwKSA+IDEwMDApIHtfY29udGVudCA9IF9jb250ZW50LnJlcGxhY2UoX2ZpcnN0Q2hhcitcIiBcIixcIlwiKTt9XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QuZmluZCgnc2VsZWN0JykubGFzdCgpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIicgKyBkICsgJ1wiPicgKyBfY29udGVudCArICc8L29wdGlvbj4nKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgX2VsZW1lbnQuYXBwZW5kKHNlbGVjdCk7XHJcbiAgICAgICAgICB9ICAgIFxyXG4gICAgICAgIH0gXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBBcHBseSB0aGUgZmlsdGVyXHJcbiAgICAgICQodGFibGVJZCtcIiB0aGVhZCBpbnB1dFwiKS5vbiggJ2tleXVwIGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBsZXQgX2luZGV4ID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpO1xyXG4gICAgICAgIGRhdGFUYWJsZS5EYXRhVGFibGUoKVxyXG4gICAgICAgICAgICAuY29sdW1uKF9pbmRleCsnOnZpc2libGUnKVxyXG4gICAgICAgICAgICAuc2VhcmNoKCB0YXJnZXQudmFsdWUgKVxyXG4gICAgICAgICAgICAuZHJhdygpO1xyXG5cclxuICAgICAgICAvL3ZhciB2YWwgPSAkLmZuLmRhdGFUYWJsZS51dGlsLmVzY2FwZVJlZ2V4KHRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgLy9kYXRhVGFibGUuRGF0YVRhYmxlKCkuc2VhcmNoKHZhbCA/ICdeJyArIHZhbCArICckJyA6ICcnLCB0cnVlLCBmYWxzZSkuZHJhdygpO1xyXG5cclxuICAgICAgfSApOyAgICBcclxuIFxyXG4gICAgICAvLyBBcHBseSB0aGUgZHJvcGRvd24gZmlsdGVyXHJcbiAgICAgICQodGFibGVJZCtcIiB0aGVhZCBzZWxlY3RcIikub24oICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IF9pbmRleCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuaW5kZXgoKTtcclxuICAgICAgICB2YXIgdmFsID0gJC5mbi5kYXRhVGFibGUudXRpbC5lc2NhcGVSZWdleCh0YXJnZXQudmFsdWUpO1xyXG4gICAgICAgIGRhdGFUYWJsZS5EYXRhVGFibGUoKVxyXG4gICAgICAgICAgICAuY29sdW1uKF9pbmRleCsnOnZpc2libGUnKVxyXG4gICAgICAgICAgICAuc2VhcmNoKHZhbCA/ICdeJyArIHZhbCArICckJyA6ICcnLCB0cnVlLCBmYWxzZSlcclxuICAgICAgICAgICAgLmRyYXcoKTtcclxuICAgICAgfSApOyAgXHJcblxyXG4gICAgICAvL1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBjb25maWdTaW1wbGVTb3J0KGdyaWRJZDogc3RyaW5nKTp2b2lkIHtcclxuICAgIHRoaXMuc2V0U29ydEVsZW1lbnQoZ3JpZElkKTtcclxuICAgIHRoaXMuc2V0U29ydEVsZW1lbnRFdmVudChncmlkSWQpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzLmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlclwiO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVzIH0gZnJvbSBcIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlc1wiO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkRWRpdCB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZC1lZGl0XCI7XHJcblxyXG5cclxuLy8gZnVuY3Rpb24gc3RhdHVzRm9ybWF0dGVyKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIHZhbHVlOiBhbnksIGNvbHVtbkRlZjogU2xpY2suQ29sdW1uPFNsaWNrLlNsaWNrRGF0YT4sIGRhdGFDb250ZXh0OiBTbGljay5TbGlja0RhdGEpIHtcclxuLy8gICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xyXG4vLyAgICAgcmV0dXJuIFwiLVwiO1xyXG4vLyAgIH0gZWxzZSBpZiAodmFsdWUgPCA1MCkge1xyXG4vLyAgICAgcmV0dXJuIFwiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDtmb250LXdlaWdodDpib2xkOyc+XCIgKyB2YWx1ZSArIFwiJTwvc3Bhbj5cIjtcclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgcmV0dXJuIFwiPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz5cIiArIHZhbHVlICsgXCIlPC9zcGFuPlwiO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFRvb2xiYXIge1xyXG4gIGlkPzpzdHJpbmcsXHJcbiAgY2FwdGlvbjpzdHJpbmcsXHJcbiAgYnV0dG9ucz86U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW11cclxuICBpdGVtc1RlbXBsYXRlSWQ/OiBzdHJpbmc7XHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbiB7XHJcbiAgaWQ6c3RyaW5nLFxyXG4gIGNhcHRpb24gOnN0cmluZywgIFxyXG4gIGNsYXNzPyA6c3RyaW5nLFxyXG4gIGF0dHJpYnV0ZXM/OnN0cmluZyxcclxuICBvbkNsaWNrRXZlbnQ/OnN0cmluZyxcclxuICB0ZW1wbGF0ZT86IHN0cmluZztcclxufSBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRUb2dnbGVQYW5lbCB7XHJcbiAgZW5hYmxlZDpib29sZWFuXHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkUHJvcGVydGllcyB7XHJcbiAgZ3JpZElkOnN0cmluZ1xyXG4gICxjc3M/OnN0cmluZ1xyXG4gICx0b2dnbGVQYW5lbD86U2FvcFdlYkdyaWRUb2dnbGVQYW5lbFxyXG4gICx0b29sYmFyPzpTYW9wV2ViR3JpZFRvb2xiYXIgIFxyXG4gICxkYXRhVGFibGU/OlNhb3BXZWJEYXRhVGFibGVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViRGF0YVRhYmxlIHtcclxuICBlbmFibGVkOmJvb2xlYW5cclxuICAsY29sdW1uRGVmc1NldHRpbmdzPzogRGF0YVRhYmxlcy5Db2x1bW5EZWZzU2V0dGluZ3NbXVxyXG4gICxvcmRlcmluZz86Ym9vbGVhblxyXG4gICxjb2x1bW5zPzphbnlbXVxyXG4gICxkYXRhPzogYW55XHJcbiAgLG9yZGVyPzogQXJyYXk8KG51bWJlciB8IHN0cmluZyk+IHwgQXJyYXk8QXJyYXk8KG51bWJlciB8IHN0cmluZyk+PlxyXG4gICxlZGl0YWJsZT86Ym9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWQge1xyXG4gIHByaXZhdGUgX3Byb3BlcnRpZXM6U2FvcFdlYkdyaWRQcm9wZXJ0aWVzXHJcbiAgcHJpdmF0ZSBfdGFibGVEaXY6SFRNTFRhYmxlRWxlbWVudDtcclxuICBwcml2YXRlIF90cmFuc2xhdGlvblNlcnZpY2U6IFNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfc2FvcFdlYkdyaWRFZGl0OiBTYW9wV2ViR3JpZEVkaXQ7XHJcbiAgLy9cclxuICBwdWJsaWMgbGliTmFtZTogc3RyaW5nOyAgXHJcbiAgcHVibGljIHdlYkdyaWRGaWx0ZXI6U2FvcFdlYkdyaWRGaWx0ZXI7XHJcbiAgcHVibGljIGRhdGFUYWJsZTogRGF0YVRhYmxlcy5BcGk8YW55PjtcclxuICBwdWJsaWMgbWFya2VkQ29sdW1uQ2hlY2tib3g6IEpRdWVyeTxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgdGhpcy53ZWJHcmlkRmlsdGVyID0gbmV3IFNhb3BXZWJHcmlkRmlsdGVyKCk7XHJcbiAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgdGhpcy5fc2FvcFdlYkdyaWRFZGl0ID0gbmV3IFNhb3BXZWJHcmlkRWRpdChcIl9zYW9wV2ViR3JpZEVkaXRcIik7ICAgIFxyXG4gICAgdGhpcy5fc2FvcFdlYkdyaWRFZGl0Lm9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUgPSB0aGlzLm9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUuYmluZCh0aGlzKTtcclxuICB9ICBcclxuXHJcbiAgc2V0VGVybWlub2xvZ3lMaXN0KCl7XHJcbiAgICBsZXQgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXSA9IFsnTmkgcG9kYXRrb3YgemEgcHJpa2F6LiddO1xyXG4gICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QoX3Rlcm1pbm9sb2d5KTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgaW5pdChncmlkUHJvcDpTYW9wV2ViR3JpZFByb3BlcnRpZXMpIHtcclxuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBncmlkUHJvcDtcclxuICAgIHRoaXMuX3RhYmxlRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihncmlkUHJvcC5ncmlkSWQpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAvL1xyXG4gICAgbGV0IF90b2dnbGVQYW5lbERlZmF1bHQgPSB7ZW5hYmxlZDp0cnVlfTtcclxuICAgIGdyaWRQcm9wLnRvZ2dsZVBhbmVsID0gey4uLl90b2dnbGVQYW5lbERlZmF1bHQsIC4uLmdyaWRQcm9wLnRvZ2dsZVBhbmVsfVxyXG4gICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChncmlkUHJvcC50b2dnbGVQYW5lbCkpe1xyXG4gICAgICBncmlkUHJvcC50b2dnbGVQYW5lbCA9IF90b2dnbGVQYW5lbERlZmF1bHQ7XHJcbiAgICB9ICAgICAgXHJcbiAgICAvL1xyXG5cclxuICAgIHRoaXMud2ViR3JpZEZpbHRlci5pZCA9IGdyaWRQcm9wLmdyaWRJZCtcImZpbHRlclwiO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUh0bWxUYWJsZSgpO1xyXG4gICAgdGhpcy5hZGRHcmlkVG9vbGJhcigpO1xyXG4gICAgLy8gZGV0IGRlZmF1bHRzXHJcbiAgICBsZXQgX01zZ19lbXB0eVRhYmxlID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIk5pIHBvZGF0a292IHphIHByaWthei5cIilcclxuXHJcbiAgICBsZXQgX2RhdGFUYWJsZURlZiA9IHtlbmFibGVkOnRydWUsb3JkZXJpbmc6dHJ1ZX07XHJcbiAgICBncmlkUHJvcC5kYXRhVGFibGUgPSB7Li4uX2RhdGFUYWJsZURlZiwgLi4uZ3JpZFByb3AuZGF0YVRhYmxlfVxyXG5cclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoZ3JpZFByb3AuZGF0YVRhYmxlKSl7XHJcbiAgICAgIGdyaWRQcm9wLmRhdGFUYWJsZSA9IGdyaWRQcm9wLmRhdGFUYWJsZTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgbGV0IF9jb2x1bW5EZWZzU2V0dGluZ3NEZWYgPSBbe29yZGVyYWJsZTogdHJ1ZSwgdGFyZ2V0czogIFwibm8tc29ydFwifV07XHJcbiAgICBncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzID0gey4uLl9jb2x1bW5EZWZzU2V0dGluZ3NEZWYsLi4uZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5nc31cclxuXHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKGdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MpKXtcclxuICAgICAgZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyA9IF9jb2x1bW5EZWZzU2V0dGluZ3NEZWY7XHJcbiAgICB9XHJcbiAgICAvL1xyXG4gICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUpIFxyXG4gICAgICAmJiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5lbmFibGVkXHJcbiAgICAgICl7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gXHJcbiAgICAgICAgJChncmlkUHJvcC5ncmlkSWQpLkRhdGFUYWJsZShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcInBhZ2luZ1wiOiBmYWxzZVxyXG4gICAgICAgICAgICAgICwgXCJzZWFyY2hpbmdcIjogdHJ1ZVxyXG4gICAgICAgICAgICAgICxcImF1dG9XaWR0aFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgLG9yZGVyQ2VsbHNUb3A6IHRydWVcclxuICAgICAgICAgICAgICAvLywgXCJkb21cIjogXCJSbGZydGlwXCJcclxuICAgICAgICAgICAgICAsIGluaXRDb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyaWRQcm9wLmRhdGFUYWJsZS5vcmRlcmluZyl7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLndlYkdyaWRGaWx0ZXIuY29uZmlnU2ltcGxlRmlsdGVyKHRoaXMpOyAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBfdGhpcy53ZWJHcmlkRmlsdGVyLmNvbmZpZ1NpbXBsZVNvcnQoX3RoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKTsgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vaWYoIWlzVW5EZWZpbmVkKF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5maWx0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gICBfdGhpcy53ZWJHcmlkRmlsdGVyLmNvbmZpZ0ZpbHRlcihfdGhpcy5saWJOYW1lLHRoaXMsIF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5maWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAsb3JkZXI6IF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5vcmRlclxyXG4gICAgICAgICAgICAgIC8vICxhamF4OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2ssIHNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjYWxsYmFjayh7IGRhdGE6IGRhdGEgfSkgLy9yZWxvYWRzIGRhdGEgXHJcbiAgICAgICAgICAgICAgLy8gfSBcclxuICAgICAgICAgICAgICAsY29sdW1uRGVmczogX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyBcclxuICAgICAgICAgICAgICAsb3JkZXJpbmcgOiBncmlkUHJvcC5kYXRhVGFibGUub3JkZXJpbmcgXHJcbiAgICAgICAgICAgICAgLGxhbmd1YWdlIDoge2VtcHR5VGFibGU6X01zZ19lbXB0eVRhYmxlLHplcm9SZWNvcmRzOl9Nc2dfZW1wdHlUYWJsZX1cclxuICAgICAgICAgIH1cclxuICAgICAgICApOyAgICBcclxuICAgICAgLy9cclxuICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfZmlsdGVyXCIpLnJlbW92ZSgpO1xyXG4gICAgICAkKGdyaWRQcm9wLmdyaWRJZCtcIl9pbmZvXCIpLnJlbW92ZSgpOyBcclxuICAgICAgdGhpcy53ZWJHcmlkRmlsdGVyLnNldFJlc2l6ZUV2ZW50KHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKTtcclxuICAgICAgLy9cclxuICAgIH1cclxuICAgXHJcbiAgICAvL1xyXG4gICAgaWYgKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmVkaXRhYmxlKSB7XHJcbiAgICAgIHRoaXMuaW5pdFdlYkdyaWRFZGl0YWJsZUNvbHVtbkNsaWNrRXZlbnRzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUb29sYmFyQnV0dG9ucyhncmlkUGFuZWw6IEpRdWVyeTxIVE1MRWxlbWVudD4sYnV0dG9uczpTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b25bXSl7XHJcbiAgICBpZihnbG9iYWwuaXNVbkRlZmluZWQoYnV0dG9ucykgPT0gZmFsc2Upe1xyXG4gICAgICBidXR0b25zLmZvckVhY2goX2J1dHRvbiA9PiB7XHJcbiAgICAgICAgdmFyIGJ1dHRvblRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBteS1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjFweDtcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc2FvcC1idXR0b24tcHJpbWFyeSBteC1hdXRvIGQtYmxvY2tcIiBpZD1cIiR7X2J1dHRvbi5pZH1cIiB0eXBlPVwic3VibWl0XCIgb25jbGljaz1cIiR7X2J1dHRvbi5vbkNsaWNrRXZlbnR9XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MTBweDtcIj48c3BhbiBjbGFzcz1cInNhb3AtaW1nLXBsdXNcIj48L3NwYW4+JHtfYnV0dG9uLmNhcHRpb259PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+ICAgIFxyXG4gICAgICAgIGA7XHJcblxyXG4gICAgICAgIGlmIChfYnV0dG9uLnRlbXBsYXRlICE9IG51bGwpIHtcclxuICAgICAgICAgIGJ1dHRvblRlbXBsYXRlID0gX2J1dHRvbi50ZW1wbGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdyaWRQYW5lbC5maW5kKFwiI3Rvb2xiYXJCdXR0b25zXCIpLmFwcGVuZChidXR0b25UZW1wbGF0ZSk7ICAgICAgXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVIdG1sVGFibGUoKSB7XHJcbiAgICB0aGlzLmdlbmVyYXRlVGFibGVCb2R5KCk7ICAgICAgICBcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWJsZUhlYWQoKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVGFibGVIZWFkKCkge1xyXG4gICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUpKXtcclxuICAgICAgaWYoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5zKSl7XHJcbiAgICAgICAgbGV0IHRoZWFkID0gdGhpcy5fdGFibGVEaXYuY3JlYXRlVEhlYWQoKTtcclxuICAgICAgICBsZXQgcm93ID0gdGhlYWQuaW5zZXJ0Um93KCk7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbHVtbnMpIHtcclxuICAgICAgICAgIGxldCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiKTtcclxuICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5Lm5hbWUpO1xyXG4gICAgICAgICAgdGguYXBwZW5kQ2hpbGQodGV4dCk7XHJcbiAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQodGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBnZW5lcmF0ZVRhYmxlQm9keSgpIHtcclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSl7XHJcbiAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmRhdGEpKXtcclxuICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmRhdGEpIHtcclxuICAgICAgICAgIGxldCByb3cgPSB0aGlzLl90YWJsZURpdi5pbnNlcnRSb3coKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBjZWxsID0gcm93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbGVtZW50W2tleV0pO1xyXG4gICAgICAgICAgICBjZWxsLmFwcGVuZENoaWxkKHRleHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkR3JpZFRvb2xiYXIoKSB7XHJcbiAgICBsZXQgZ3JpZFBhbmVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgbGV0IF9jc3MgPSBnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5jc3MpID09IGZhbHNlID8gdGhpcy5fcHJvcGVydGllcy5jc3MgOlwiXCI7XHJcblxyXG4gICAgbGV0IGdyaWRQYW5lbFRlbXBsYXRlID0gYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYW9wLXRhYmxlLWZpeGhlYWQgJHtfY3NzfVwiPlxyXG4gICAgICAgICAgPHRhYmxlIGlkPVwiI3NsaWNrR3JpZCNcIj48L3RhYmxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgYDtcclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhcikpIHtcclxuICAgICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWQpKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkID0gdGhpcy5fcHJvcGVydGllcy5ncmlkSWQrXCJUQlwiO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBncmlkVG9nZ2xlUGFuZWwgPSBgYDtcclxuICAgICAgbGV0IGdyaWRUb2dnbGVQYW5lbENsYXNzID0gXCJcIjtcclxuICAgICAgbGV0IGdyaWRCb3JkZXJCb3R0b20gPSBcIlwiO1xyXG4gICAgICBpZih0aGlzLl9wcm9wZXJ0aWVzLnRvZ2dsZVBhbmVsLmVuYWJsZWQpIHtcclxuICAgICAgICBncmlkVG9nZ2xlUGFuZWxDbGFzcyA9IFwiY29sbGFwc2Ugc2hvd1wiO1xyXG4gICAgICAgIGdyaWRCb3JkZXJCb3R0b20gPSBcInNhb3AtYm9yZGVyLWJvdHRvbVwiO1xyXG5cclxuICAgICAgICBncmlkVG9nZ2xlUGFuZWwgPSBcclxuICAgICAgICAgIGBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYW9wLWZvcm0tcGFuZWwtaGVhZGluZyBzYW9wLXRvZ2dsZS1wYW5lbFwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInNhb3AtdHh0LTMgbS0wXCIgZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCIgZGF0YS10YXJnZXQ9XCIjY29sbGFwc2Uke3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZH1cIj5cclxuICAgICAgICAgICAgJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuY2FwdGlvbn0gPHNwYW4gY2xhc3M9XCJzYW9wLWltZy1kb3duIHNpLW0gc2FvcC10b2dnbGUtYXJyb3cgcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgYDsgICAgICBcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90b29sYmFySXRlbXMgPSBgYDtcclxuICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyLml0ZW1zVGVtcGxhdGVJZCkpe1xyXG4gICAgICAgIGxldCBfdG9vbGJhckl0ZW1zVGVtcGxhdGUgPSAkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pdGVtc1RlbXBsYXRlSWQpO1xyXG4gICAgICAgIGlmIChfdG9vbGJhckl0ZW1zVGVtcGxhdGUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICBfdG9vbGJhckl0ZW1zID0gX3Rvb2xiYXJJdGVtc1RlbXBsYXRlLmh0bWwoKTtcclxuICAgICAgICAgIF90b29sYmFySXRlbXNUZW1wbGF0ZS5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdyaWRQYW5lbFRlbXBsYXRlID0gYFxyXG4gICAgICAgIDxkaXYgaWQ9XCIke3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZH1cIiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgJHtncmlkQm9yZGVyQm90dG9tfVwiPlxyXG4gICAgICAgICAgJHtncmlkVG9nZ2xlUGFuZWx9XHJcbiAgICAgICAgICA8ZGl2IGlkPVwiY29sbGFwc2Uke3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZH1cIiBjbGFzcz1cInNhb3AtZm9ybS1wYW5lbC1ib2R5ICR7Z3JpZFRvZ2dsZVBhbmVsQ2xhc3N9XCI+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJncmlkLXRvb2xiYXJcIiBjbGFzcz1cInNhb3AtdGFibGUtdG9vbGJhclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0b29sYmFyQnV0dG9uc1wiIGNsYXNzPVwicm93IG1yLTAgbWwtMCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIiBzdHlsZT1cImhlaWdodDoxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICR7X3Rvb2xiYXJJdGVtc31cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYW9wLXRhYmxlLWZpeGhlYWQgJHtfY3NzfVwiPlxyXG4gICAgICAgICAgICAgIDx0YWJsZSBpZD1cIiNzbGlja0dyaWQjXCI+PC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYDtcclxuICAgIH1cclxuICAgIGdyaWRQYW5lbFRlbXBsYXRlID0gZ3JpZFBhbmVsVGVtcGxhdGUucmVwbGFjZShcIiNzbGlja0dyaWQjXCIsdGhpcy5fcHJvcGVydGllcy5ncmlkSWQucmVwbGFjZShcIiNcIixcIlwiKSk7XHJcbiAgICBncmlkUGFuZWwgPSAkKGdyaWRQYW5lbFRlbXBsYXRlKTtcclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhcikpIHtcclxuICAgICAgdGhpcy5hZGRUb29sYmFyQnV0dG9ucyhncmlkUGFuZWwsdGhpcy5fcHJvcGVydGllcy50b29sYmFyLmJ1dHRvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBfdGFibGVIdG1sID0gdGhpcy5fdGFibGVEaXY7XHJcblxyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkucmVwbGFjZVdpdGgoZ3JpZFBhbmVsKTtcclxuXHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKS5yZXBsYWNlV2l0aChfdGFibGVIdG1sKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hEYXRhKGRhdGE6YW55KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuY2xlYXIoKTtcclxuICAgIGRhdGEuZWFjaChmdW5jdGlvbiggaW5kZXg6YW55LCB0cjpzdHJpbmcgKSB7XHJcbiAgICAgIF90aGlzLmRhdGFUYWJsZS5yb3cuYWRkKCQodHIpKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpOyAgICBcclxuICB9XHJcblxyXG4gIHJlcGxhY2VHcmlkUm93cyhodG1sQ29udGVudDpzdHJpbmcpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpO1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCtcIiA+IHRib2R5ID4gdHJcIiwgJChodG1sQ29udGVudCkpLmVhY2goXHJcbiAgICAgIGZ1bmN0aW9uKGluZGV4OmFueSx0cjphbnkpIHtcclxuICAgICAgICBfdGhpcy5kYXRhVGFibGUucm93LmFkZCgkKHRyKSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7ICAgIFxyXG4gIH0gIFxyXG5cclxuICBzZXRUYWJlbEZvb3RoZXIoKTp2b2lkIHtcclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQrJyBib2R5JykgIFxyXG4gIH1cclxuXHJcbiAgaW5pdFdlYkdyaWRDb2x1bW5DaGVja2JveEJpbmRDbGlja0V2ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHRoaXMubWFya2VkQ29sdW1uQ2hlY2tib3ggPSBudWxsO1xyXG5cclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fdGFibGVEaXYpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAkKFwiI1wiICsgdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAuc2FvcC10ZC1pbnB1dC1jaGVja2JveFwiKS5vZmYoXCJjaGFuZ2VcIik7XHJcbiAgICAkKFwiI1wiICsgdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAuc2FvcC10ZC1pbnB1dC1jaGVja2JveFwiKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICBfdGhpcy5tYXJrZWRDb2x1bW5DaGVja2JveCA9ICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAjXCIgKyByb3cuY3VycmVudFRhcmdldC5pZCk7XHJcblxyXG4gICAgICAvLyBvZHpuYWNpbW8gdnNlIG9zdGFsZSBjaGVja2JveGVcclxuICAgICAgJChcIiNcIiArIF90aGlzLl90YWJsZURpdi5pZCArIFwiIGlucHV0LnNhb3AtdGQtaW5wdXQtY2hlY2tib3g6bm90KCNcIiArIHJvdy5jdXJyZW50VGFyZ2V0LmlkICsgXCIpXCIpLmVhY2goXHJcbiAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJChcIiNcIiArIF90aGlzLl90YWJsZURpdi5pZCArIFwiICNcIiArIHRoaXMuaWQpLnByb3AoXCJjaGVja2VkXCIsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgIF90aGlzLmFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIGluaXRXZWJHcmlkRWRpdGFibGVDb2x1bW5DbGlja0V2ZW50cygpOiB2b2lkIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkub2ZmKFwiY2xpY2tcIiwgXCJ0Ym9keSB0ZFtkYXRhLWVkaXRhYmxlPSd0cnVlJ11cIik7XHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKS5vbihcImNsaWNrXCIsIFwidGJvZHkgdGRbZGF0YS1lZGl0YWJsZT0ndHJ1ZSddXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIF90aGlzLl9zYW9wV2ViR3JpZEVkaXQuc2hvd1dlYkdyaWRFZGl0YWJsZUNvbHVtbkVkaXRDb250cm9sKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gICAgXHJcbiAgcHJpdmF0ZSBvbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5vbkVkaXRUZENlbGxXcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0VGRDZWxsV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gbWV0b2RhIHphIGV4dGVybm8gdXBvcmFib1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzIHtcclxuICAgIGlkOnN0cmluZztcclxuICAgIHBsYWNlaG9sZGVyOnN0cmluZztcclxuICAgIGNhcHRpb246c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcElucHV0V0ZMIHtcclxuICAgIHByaXZhdGUgX2lucHV0VGVtcGxhdGU6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczpTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIGBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNhb3AtY29sLWZpbHRlci1ncm91cFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgc2FvcC1jb250cm9sIHNhb3AtY29udHJvbC1saXN0Qm94IHNhb3AtY29sLWZpbHRlci1pbnB1dFwiIHN0eWxlPVwid2lkdGg6OTUlICFpbXBvcnRhbnQ7XCIgaWQ9XCIke3Byb3BlcnRpZXMuaWR9XCIgbmFtZT1cIiR7cHJvcGVydGllcy5pZH1cIiBwbGFjZWhvbGRlcj1cIiR7cHJvcGVydGllcy5wbGFjZWhvbGRlcn1cIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCI+XHJcbiAgICAgICAgICAgIDxpIGlkPVwic2VhcmNoSWNvblwiIGNsYXNzPVwic2FvcC1pbWctc2VhcmNoIHNpLXMgZm9ybS1jb250cm9sLWZlZWRiYWNrXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjt0b3A6NXB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6IGNhbGMoMTAwJSAtIDQwcHgpICFpbXBvcnRhbnQ7XCIvPlxyXG4gICAgICAgIDwvc3Bhbj4gICAgICAgIFxyXG4gICAgICAgIGA7ICAgICAgICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLl9pbnB1dFRlbXBsYXRlID0gXHJcbiAgICAgICAgLy8gYFxyXG4gICAgICAgIC8vIDxzcGFuIGNsYXNzPVwiaGFzLWZsb2F0LWxhYmVsXCI+XHJcbiAgICAgICAgLy8gICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBzYW9wLWNvbnRyb2wgc2FvcC1jb250cm9sLWxpc3RCb3hcIiBkYXRhLWlucHV0bWFzay1hbGlhcz1cImRkLm1tLnl5eXkgaGg6bW1cIiBpZD1cIiR7cHJvcGVydGllcy5pZH1cIiBuYW1lPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIHBsYWNlaG9sZGVyPVwiJHtwcm9wZXJ0aWVzLnBsYWNlaG9sZGVyfVwiIHRhYmluZGV4PVwiMFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIiBkaXNhYmxlZD1cIlwiPlxyXG4gICAgICAgIC8vICAgICA8bGFiZWwgY2xhc3M9XCJzYW9wLWZsb2F0aW5nLWxhYmVsIHNhb3AtdHh0LTdcIiBmb3I9XCIke3Byb3BlcnRpZXMuaWR9XCI+JHtwcm9wZXJ0aWVzLmNhcHRpb259PC9sYWJlbD5cclxuICAgICAgICAvLyAgICAgPGkgaWQ9XCJjYWxlbmRhckljb25cIiBjbGFzcz1cInNhb3AtaW1nLWNhbGVuZGFyIHNpLXMgZm9ybS1jb250cm9sLWZlZWRiYWNrXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjtsZWZ0OjIzMHB4O3RvcDo1cHg7cG9zaXRpb246YWJzb2x1dGU7XCIvPlxyXG4gICAgICAgIC8vIDwvc3Bhbj4gICAgICAgIFxyXG4gICAgICAgIC8vIGA7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbGVtZW50KCk6SlF1ZXJ5PEhUTUxFbGVtZW50PntcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKHRoaXMuX2lucHV0VGVtcGxhdGUpO1xyXG4gICAgICAgIHJldHVybiBfZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbm5lckh0bWwoKTpzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2luZGV4LmQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29tcG9uZW50cy9zYW9wLXNlbGVjdGl6ZS1zZWxlY3QudHNcIiAvPlxyXG5cclxuaW1wb3J0IHsgIGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlbGVjdGl6ZVNlbGVjdCB9IGZyb20gXCIuL3Nhb3Atc2VsZWN0aXplLXNlbGVjdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BJbnB1dE1hc2sge1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdC4uLlwiKTtcclxuICAgICAgICB2YXIgaW5wdXREaXZzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2lucHV0W2RhdGEtaW5wdXRtYXNrLWFsaWFzXScpO1xyXG4gICAgICAgIElucHV0bWFzaygpLm1hc2soaW5wdXREaXZzKTtcclxuXHJcbiAgICAgICAgJChcIi5zYW9wLWRlY2ltYWwtMlwiKS5pbnB1dG1hc2soe1xyXG4gICAgICAgICAgICAnYWxpYXMnOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICdyYWRpeFBvaW50JzogJywnLFxyXG4gICAgICAgICAgICAnZGlnaXRzJzogMixcclxuICAgICAgICAgICAgJ2RpZ2l0c09wdGlvbmFsJzogZmFsc2UsXHJcbiAgICAgICAgICAgICdwbGFjZWhvbGRlcic6ICcwLDAwJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLnNhb3AtZGVjaW1hbC0zXCIpLmlucHV0bWFzayh7XHJcbiAgICAgICAgICAgICdhbGlhcyc6ICdkZWNpbWFsJyxcclxuICAgICAgICAgICAgJ3JhZGl4UG9pbnQnOiAnLCcsXHJcbiAgICAgICAgICAgICdkaWdpdHMnOiAzLFxyXG4gICAgICAgICAgICAnZGlnaXRzT3B0aW9uYWwnOiBmYWxzZSxcclxuICAgICAgICAgICAgJ3BsYWNlaG9sZGVyJzogJzAsMDAwJ1xyXG4gICAgICAgIH0pOyAgXHJcblxyXG4gICAgICAgIGlucHV0RGl2cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWxlbWVudC5pbml0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiICsgZWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3BhbkRpdjphbnk7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50QXRyciA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtaW5wdXRtYXNrLWFsaWFzXCIpO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzRW1wdHkoZWxlbWVudEF0cnIpKSB7cmV0dXJuO307XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoZWxlbWVudEF0cnIpO1xyXG4gICAgICAgICAgICBzcGFuRGl2ID0gJChlbGVtZW50KS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYgPT09IG51bGwpIHsgcmV0dXJuO307XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2Lmhhc0NsYXNzKFwiaGFzLWZsb2F0LWxhYmVsXCIpPT09ZmFsc2UpIHsgcmV0dXJuO307XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoc3BhbkRpdi5nZXQoMCkuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxhbmd1YWdlQXRyciA9IChTdHJpbmcpKCQoXCIjc2l0ZUxhbmd1YWdlXCIpLnZhbCgpKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiK2xhbmd1YWdlQXRycik7XHJcbiAgICAgICAgICAgIGxhbmd1YWdlQXRyciA9IGdsb2JhbC5pc0VtcHR5KGxhbmd1YWdlQXRycikgPyBcInNsXCIgOmxhbmd1YWdlQXRycjtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiK2xhbmd1YWdlQXRycik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudEF0cnIgPT09IFwiaGg6bW06c3NcIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjdGltZUljb25cIik7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLmJsdXIuaW5pdDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5ibHVyKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGwuY2xvY2suYmx1cjpcIiArIGV2ZW50LnRhcmdldC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluY2x1ZGVzKFwiaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwibW1cIiwgXCIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcIm1cIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwic3NcIiwgXCIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcInNcIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGNvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBwcm96aW1vIGlucHV0IGV2ZW4sIGtlciBzbW8gdnBpc2FsaSBub3ZvIHZyZWRub3N0IFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgRXZlbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay5jbGljay5pbml0OlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrSWNvbi5jbGlja2VkOlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0cmxJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdHJsSW5wdXRDdHJsU3RyTGVuZ3RoID0gY3RybElucHV0Q3RybC52YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0cmxJbnB1dEN0cmwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdHJsSW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKGN0cmxJbnB1dEN0cmxTdHJMZW5ndGgsIGN0cmxJbnB1dEN0cmxTdHJMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eVwiIFxyXG4gICAgICAgICAgICAgICAgLy8gfHwgZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbVwiIFxyXG4gICAgICAgICAgICAgICAgLy8gfHwgZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbTpzc1wiXHJcbiAgICAgICAgICAgICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJTdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpKS50b0xvd2VyQ2FzZSgpID09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJTdGFydERhdGUxID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyU3RhcnREYXRlMSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkYXRlcGlja2VyRW5kRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKTsgICBcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlckVuZERhdGUsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZGF0ZXBpY2tlclN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBkYXRlcGlja2VyRW5kRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBhdXRvY2xvc2U6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB3ZWVrU3RhcnQ6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcImRkLm1tLnl5eXlcIixcclxuICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSByaWdodFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dPbkZvY3VzOmZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9mb3JjZVBhcnNlOmZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgXHJcblxyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbigpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsID0gJChlbGVtZW50KS5nZXQoMCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCA9IGRhdGVwaWNrZXJJbnB1dEN0cmwudmFsdWUubGVuZ3RoICogMjtcclxuICAgICAgICAgICAgICAgICAgICAvL2RhdGVwaWNrZXJJbnB1dEN0cmwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGVwaWNrZXIoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCwgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aClcclxuICAgICAgICAgICAgICAgIH0pOyAgXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tXCIpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkYXRldGltZXBpY2tlciBoaDptbSAuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAuYmluZCgna2V5ZG93bicsZnVuY3Rpb24oZSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnREQuTU0uWVlZWSBIOm1tJyxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBzaG93VG9kYXlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLm9mZihcImZvY3VzXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgIFxyXG4gIFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW06c3NcIikge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRhdGV0aW1lcGlja2VyIGhoOm1tOnNzIC4uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudClcclxuICAgICAgICAgICAgICAgIC5iaW5kKCdrZXlkb3duJyxmdW5jdGlvbihlKXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLmRhdGV0aW1lcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdERC5NTS5ZWVlZIEg6bW06c3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dUb2RheUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkub2ZmKFwiZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICAvLyQoZWxlbWVudCkub2ZmKFwia2V5ZG93blwiKTtcclxuICAgICAgICAgICAgICAgIC8vIC5vbignZHAuaGlkZScsIGZ1bmN0aW9uKGUpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCdkcC5oaWRlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0pICAgXHJcbiAgICAgICAgICAgICAgICAvLyAub24oJ2RwLnNob3cnLCBmdW5jdGlvbihlKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnZHAuc2hvdycpO1xyXG4gICAgICAgICAgICAgICAgLy8gfSk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoJChkb2N1bWVudCkuZmluZChcIi5kYXRlcGlja2VyLWRyb3Bkb3duXCIpLmlzKFwiOnZpc2libGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vICQoZWxlbWVudCkuZm9jdXMoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5oaWRlKCk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIH0pOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibm90IGltcGxlbWVudGVkLi4uXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdGl6ZVNlbGVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdFNlbGVjdCgpO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdElucHV0cy4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlcigpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlci4uLlwiKTtcclxuXHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLWl6Ym9yLXZlYy1kbmldJyk7XHJcblxyXG4gICAgICAgIGlucHV0RGl2cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWxlbWVudC5pbml0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiICsgZWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3BhbkRpdjogYW55O1xyXG4gICAgICAgICAgICBzcGFuRGl2ID0gJChlbGVtZW50KS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYgPT09IG51bGwpIHsgcmV0dXJuOyB9O1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdi5oYXNDbGFzcyhcImhhcy1mbG9hdC1sYWJlbFwiKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHNwYW5EaXYuZ2V0KDApLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZUF0cnIgPSAoU3RyaW5nKSgkKFwiI3NpdGVMYW5ndWFnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIiArIGxhbmd1YWdlQXRycik7XHJcbiAgICAgICAgICAgIGxhbmd1YWdlQXRyciA9IGdsb2JhbC5pc0VtcHR5KGxhbmd1YWdlQXRycikgPyBcInNsXCIgOiBsYW5ndWFnZUF0cnI7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIiArIGxhbmd1YWdlQXRycik7XHJcblxyXG4gICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5cIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpKS50b0xvd2VyQ2FzZSgpID09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VyU3RhcnREYXRlMSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyU3RhcnREYXRlMSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZXBpY2tlckVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSBnbG9iYWwuY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJFbmREYXRlLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IGRhdGVwaWNrZXJTdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlOiBkYXRlcGlja2VyRW5kRGF0ZSxcclxuICAgICAgICAgICAgICAgIGF1dG9jbG9zZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtdWx0aWRhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgd2Vla1N0YXJ0OiAxLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRkLm1tLnl5eXlcIixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJib3R0b20gcmlnaHRcIlxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCA9IGRhdGVwaWNrZXJJbnB1dEN0cmwudmFsdWUubGVuZ3RoICogMjtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCwgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aClcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlci4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VsZWN0aXplU2VsZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRTZWxlY3RpemVTZWxlY3QuLi5cIik7XHJcblxyXG4gICAgICAgICQoJy5zZWxlY3RpemVTZWxlY3QnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNhb3BTZWxlY3RlbGVtZW50ID0gbmV3IFNhb3BTZWxlY3RpemVTZWxlY3QoKTtcclxuICAgICAgICAgICAgc2FvcFNlbGVjdGVsZW1lbnQuaW5pdENvbnRyb2xCeUh0bWwodGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRTZWxlY3RpemVTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0U2VsZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdFNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgJCgnLnNlbGVjdGl6ZU11bHRpc2VsZWN0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzYW9wU2VsZWN0ZWxlbWVudCA9IG5ldyBTYW9wU2VsZWN0aXplU2VsZWN0KCk7XHJcbiAgICAgICAgICAgIHNhb3BTZWxlY3RlbGVtZW50LmluaXRNdWx0aXNlbGVjdENvbnRyb2xCeUh0bWwodGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdFNlbGVjdC4uLmRvbmVcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BQb3BvdmVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1wb3BvdmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVudVNpZGViYXIge1xyXG5cclxuICAgIHByb3RlY3RlZCBfY29sbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJvdGVjdGVkIF9leHBFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX21lbnVTaWRlYmFyUG9wb3ZlcjogU2FvcFBvcG92ZXI7XHJcblxyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuaW5pdC4uLlwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29sbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbGxhcHNlLWljb24tY29sbFwiKTtcclxuICAgICAgICB0aGlzLl9leHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2xsYXBzZS1pY29uLWV4cFwiKTtcclxuICAgICAgICBpZiAodGhpcy5fY29sbEVsZW1lbnQgIT0gbnVsbCkgdGhpcy5fY29sbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmICh0aGlzLl9leHBFbGVtZW50ICE9IG51bGwpIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gRXhwYW5kIGljb24gY2xpY2tcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tZXhwXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1leHBcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuY29sbGFwc2UtaWNvbi1leHAuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmVuYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ29sbGFwc2UgaWNvbiBjbGlja1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1jb2xsXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1jb2xsXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmNvbGxhcHNlLWljb24tY29sbC5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ29sbGFwc2UgY2xpY2tcclxuICAgICAgICAkKCdbZGF0YS10b2dnbGU9c2lkZWJhci1jb2xhcHNlXScpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zaWRlYmFyQ29sbGFwc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vbWVudSBpdGVtIGNsaWNrXHJcbiAgICAgICAgJChcIi5zYW9wLWJnLWl0ZW1cIikuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIsIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKSk7XHJcbiAgICAgICAgICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiLCB0aGlzLmlkKTtcclxuICAgICAgICAgICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgLy9tZW51IHN1Yi1pdGVtIGNsaWNrXHJcbiAgICAgICAgLy8kKFwiLnNhb3AtYmctc3ViaXRlbVwiKS5jbGljayhcclxuICAgICAgICAvLyAgICBmdW5jdGlvbigpe1xyXG4gICAgICAgIC8vICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIiwgdGhpcy5pZCk7XHJcbiAgICAgICAgLy8gICAgfVxyXG4gICAgICAgIC8vKVxyXG5cclxuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZW51LXNpZGViYXJcIikgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5HZXRTZXNzaW9uU3RvcmFnZVZhbHVlcygpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5EZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlcygpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRNZW51U2lkZWJhclBvcG92ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2lkZWJhckNvbGxhcHNlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5zaWRlYmFyQ29sbGFwc2VcIik7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uTGFyZ2UnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uU21hbGwnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXItbWVudS1jYXB0aW9uJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJyNzaWRlYmFyLWNvbnRhaW5lcicpLnRvZ2dsZUNsYXNzKCdzaWRlYmFyLWV4cGFuZGVkIHNpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgJCgnLnNhb3AtYmctc3ViaXRlbXMnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVDbG9zZUJ1dHRvbicpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICB2YXIgU2VwYXJhdG9yVGl0bGUgPSAkKCcjc2lkZWJhci1jb250YWluZXInKTtcclxuICAgICAgICBpZiAoU2VwYXJhdG9yVGl0bGUuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIsIFwidHJ1ZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgICAgICB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgXCJmYWxzZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1lbnVJdGVtQ29sbGFwc2UoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLm1lbnVJdGVtQ29sbGFwc2VcIik7XHJcbiAgICAgICAgLy92YXIgcHJldmlvdXNJdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgLy92YXIgaXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vdmFyIHN1Yml0ZW1zSUQgPSBpdGVtSUQrXCItY29sbGFwc2VcIjtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIik7XHJcblxyXG4gICAgICAgIC8vdmFyIHByZXZpb3VzID0gJChcIiNcIiArIHByZXZpb3VzSXRlbUlEKTtcclxuICAgICAgICAvL3ZhciBpdGVtID0gJCgnIycraXRlbUlEKTtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtcyA9ICQoXCIjXCIgKyBzdWJpdGVtc0lEKTtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtID0gJChcIiNcIitzdWJpdGVtc0lEK1wiPiNcIitzdWJpdGVtSUQpO1xyXG5cclxuICAgICAgICAvL3ByZXZpb3VzLnJlbW92ZUNsYXNzKFwic2FvcC1iZy1pdGVtLXNlbGVjdGVkXCIpOy8vJ3VuLWNvbG9yJyBwcmV2aW91cyBpdGVtXHJcbiAgICAgICAgLy9wcmV2aW91c1swXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFwiZmFsc2VcIik7XHJcbiAgICAgICAgLy9pdGVtWzBdLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIC8vaXRlbS5hZGRDbGFzcyhcInNhb3AtYmctaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIGl0ZW1cclxuICAgICAgICAvL3N1Yml0ZW1zLmFkZENsYXNzKCdzaG93Jyk7Ly9leHBhbmQgY29sbGFwc2VcclxuICAgICAgICAvL3N1Yml0ZW0uYWRkQ2xhc3MoXCJzYW9wLWJnLXN1Yml0ZW0tc2VsZWN0ZWRcIik7Ly9jb2xvciBzdWJpdGVtXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIEdldFNlc3Npb25TdG9yYWdlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5HZXRTZXNzaW9uU3RvcmFnZVZhbHVlc1wiKTtcclxuICAgICAgICAvL2RlZmF1bHRzXHJcbiAgICAgICAgLy9pZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpID09IG51bGwpIHtcclxuICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiLCBudWxsKTtcclxuICAgICAgICAvLyAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXByZXZpb3VzLWl0ZW0taWRcIiwgbnVsbCk7XHJcbiAgICAgICAgLy8gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIsIFwibmFtaXpqZVwiKTtcclxuICAgICAgICAvLyAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIiwgXCIwXCIpO1xyXG4gICAgICAgIC8vfVxyXG5cclxuICAgICAgICAvL3NpZGViYXIgZXhwYW5kZWQvY29udHJhY3RlZFxyXG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIikgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWRlYmFyQ29sbGFwc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2VsZWN0ZWQtbWVudSBpdGVtXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbUNvbGxhcHNlKClcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgRGVsZXRlU2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLkRlbGV0ZVNlc3Npb25TdG9yYWdlVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIik7XHJcbiAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwic2FvcC1tZW51LXByZXZpb3VzLWl0ZW0taWRcIik7XHJcbiAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdE1lbnVTaWRlYmFyUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuaW5pdE1lbnVTaWRlYmFyUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyID0gbmV3IFNhb3BQb3BvdmVyKFwiLm1lbnUtcG9wdXBcIik7XHJcbiAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmluaXRTZWxmQ29udGFpbmVyUG9wb3ZlcigpO1xyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5kaXNhYmxlUG9wb3ZlcigpO1xyXG5cclxuICAgICAgICB2YXIgZWxlbWVudFZpc2libGUgPSAkKFwiI2NvbGxhcHNlLWljb24tY29sbFwiKS5pcygnOnZpc2libGUnKTtcclxuICAgICAgICBpZiAoZWxlbWVudFZpc2libGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmVuYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BNc2dEbGdUeXBlIHtcclxuICAgIG10SW5mb3JtYXRpb24gPSAxXHJcbiAgICAsbXRXYXJuaW5nID0gMlxyXG4gICAgLG10RXJyb3IgPSAzXHJcbiAgICAvLywgbXRDb25maXJtYXRpb24sIG10Q3VzdG9tXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BNc2dEbGdCdXR0b24ge1xyXG4gICAgbWJOb25lID0gMFxyXG4gICAgLG1iT0sgPSAxXHJcbiAgICAsbWJDYW5jZWwgPSAyXHJcbiAgICAsbWJZZXMgPSAzXHJcbiAgICAsbWJObyA9IDRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wTXNnRGxnRXZlbnQge1xyXG4gICAgcGFyZW50OmFueTtcclxuICAgIGRhdGE6YW55O1xyXG59XHJcblxyXG50eXBlIFNhb3BNc2dEbGdCdXR0b25zID0gQXJyYXk8U2FvcE1zZ0RsZ0J1dHRvbj47XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTWVzc2FnZURsZyB7XHJcbiAgICBwcml2YXRlIF9zZW5kZXI6U2FvcE1zZ0RsZ0V2ZW50O1xyXG4gICAgcHVibGljIG9uT2s6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uQ2FuY2VsOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvblllczogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25ObzogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2VuZGVyOlNhb3BNc2dEbGdFdmVudCl7XHJcbiAgICAgICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIFNob3coTXNnOnN0cmluZyxUaXRsZTpzdHJpbmcsRGxnVHlwZTpTYW9wTXNnRGxnVHlwZSA9IFNhb3BNc2dEbGdUeXBlLm10SW5mb3JtYXRpb24sQnV0dG9uczpTYW9wTXNnRGxnQnV0dG9ucyA9IFtTYW9wTXNnRGxnQnV0dG9uLm1iT0tdKTpTYW9wTXNnRGxnQnV0dG9ue1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibWVzc2FnZTpcIitNc2cpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidGl0bGU6XCIrVGl0bGUpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCB0aXRsZURpdiA9ICQoJyNhbGVydC1tb2RhbC10aXRsZS1kaXYnKTtcclxuICAgICAgICBsZXQgYm9keVRhZyA9ICQoJyNhbGVydC1tb2RhbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgIGlmIChEbGdUeXBlID09IFNhb3BNc2dEbGdUeXBlLm10SW5mb3JtYXRpb24pe1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJ3aGl0ZVwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKERsZ1R5cGUgPT0gU2FvcE1zZ0RsZ1R5cGUubXRFcnJvcikge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCIjRDgyQzI1XCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcInNpbHZlclwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkoVGl0bGUpKXtcclxuICAgICAgICAgICAgdGl0bGVEaXYuaHRtbChUaXRsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGJvZHlUYWcuaHRtbChNc2cpO1xyXG5cclxuICAgICAgICBpZiAoQnV0dG9ucyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJPSyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJPSyk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJPSykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKF90aGlzLm9uT2spKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uT2soX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJPSztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJDYW5jZWwgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iQ2FuY2VsKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChfZWxlbWVudF9tYkNhbmNlbCkpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKF90aGlzLm9uQ2FuY2VsKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbkNhbmNlbChfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYkNhbmNlbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iWWVzID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcyk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJZZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vblllcykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25ZZXMoX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJZZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYk5vID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChfZWxlbWVudF9tYk5vKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMub25Obykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25ObyhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJOb25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnI2FsZXJ0LW1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtYnRuLW9rXCIpLnVuYmluZChcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLm1vZGFsKCdkaXNwb3NlJyk7XHJcbiAgICAgICAgfSlcclxuICAgIFxyXG4gICAgICAgICQoJyNhbGVydC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgZ2xvYmFsLnNldE1vZGFsRm9ybVpJbmRleCgnI2FsZXJ0LW1vZGFsJyk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdC9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wTXVsdGlzZWxlY3RQYXJhbXMge1xyXG4gICAgdGFyZ2V0OnN0cmluZyxcclxuICAgIHNlbGVjdEFsbD86Ym9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMge1xyXG4gICAgdGVtcGxhdGVzQnV0dG9uPzogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTXVsdGlzZWxlY3Qge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGlvblNlcnZpY2U6IFNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcgPSBcIlNrdXBpbmFcIjtcclxuICAgIHByaXZhdGUgX211bHRpU2VsZWN0T2JqZWN0OiBhbnk7XHJcbiAgICBwcml2YXRlIF9vcHRpb25zOiBTYW9wTXVsdGlzZWxlY3RPcHRpb25zO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBtc0NvbnRhaW5lcjpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHVibGljIG1zQnV0dG9uOiBKUXVlcnk8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xyXG4gICAgcHVibGljIG1zUG9wdXBDb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwdWJsaWMgbXNDb250YWluZXJMYWJlbDpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHVibGljIHNlbGVjdGVkQ0I6YW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6c3RyaW5nID0gXCJcIiwgb3B0aW9uczpTYW9wTXVsdGlzZWxlY3RPcHRpb25zID0gbnVsbCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3RcIik7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICB9IFxyXG5cclxuICAgIHNldE9wdGlvbnMob3B0aW9uczogU2FvcE11bHRpc2VsZWN0T3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIC8vIGZpcnN0IHNldCBkZWZhdWx0IG9wdGlvbnNcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0ge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZXNCdXR0b246ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm11bHRpc2VsZWN0IGRyb3Bkb3duLXRvZ2dsZSBwci0wXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiPjxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3Qtc2VsZWN0ZWQtdGV4dFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNhb3AtaW1nLWRvd24gc2ktcyBmbG9hdC1yaWdodFwiPjwvc3Bhbj48L2J1dHRvbj4nXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24gPSBvcHRpb25zLnRlbXBsYXRlc0J1dHRvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IF90ZXJtaW5vbG9neTogc3RyaW5nW10gPSBbJ0nFocSNaScsICdWc2knLCAnSXpiZXJpIHByaWthemFuZScsICdpemJyYW5paCddO1xyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkodGhpcy5fY2FwdGlvbikpIHtcclxuICAgICAgICAgICAgX3Rlcm1pbm9sb2d5ID0gWydJxaHEjWknLCAnVnNpJywgJ0l6YmVyaSBwcmlrYXphbmUnLCAnaXpicmFuaWgnLCB0aGlzLl9jYXB0aW9uXTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KF90ZXJtaW5vbG9neSk7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZERpdihlbGVtZXQ6YW55KXtcclxuICAgICAgICB0aGlzLm1zQ29udGFpbmVyID0gJChlbGVtZXQuJGNvbnRhaW5lcik7XHJcbiAgICAgICAgdGhpcy5tc0J1dHRvbiA9ICQoZWxlbWV0LiRidXR0b24pO1xyXG4gICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbCA9IHRoaXMubXNDb250YWluZXIuZmluZChcIiNjb250YWluZXJMYWJlbFwiKTtcclxuICAgICAgICB0aGlzLm1zUG9wdXBDb250YWluZXIgPSAkKGVsZW1ldC4kcG9wdXBDb250YWluZXIpO1xyXG4gICAgICAgIC8vdGhpcy5zZWxlY3RlZENCID0gZWxlbWV0LiRzZWxlY3Q7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ0IudmFsKCkubGVuZ3RoKXtcclxuICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKHRydWUpO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHNldE1zRmxvYXRpbmdMYWJlbChpc0VtcHJ5OmJvb2xlYW4pe1xyXG4gICAgICAgIGlmIChpc0VtcHJ5KXtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLmFkZENsYXNzKCdtcy1mbG9hdC1sYWJlbC1lbXB0eScpO1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwucmVtb3ZlQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLnJlbW92ZUNsYXNzKCdtcy1mbG9hdC1sYWJlbC1lbXB0eScpO1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwuYWRkQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLXNlbGVjdGVkJyk7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgb25Jbml0aWFsaXplZENvbnRyb2woZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5vbkluaXRpYWxpemVkQ29udHJvbFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDQi5oYXNDbGFzcyhcImlucHV0LXZhbGlkYXRpb24tZXJyb3JcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5tc0J1dHRvbi5hZGRDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXRcIik7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5hZGRDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXQtdGV4dFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRvZGFtbyBzdGlja3kgY3NzIHphIHBydmkgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuYWRkU3RpY2t5Q2xhc3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZnRlckluaXRpYWxpemVkQ29udHJvbChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTdGlja3lDbGFzcygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0LmFkZFN0aWNreUNsYXNzXCIpO1xyXG5cclxuICAgICAgICBsZXQgc2V6bmFtID0gdGhpcy5tc0NvbnRhaW5lci5maW5kKFwiYnV0dG9uLm11bHRpc2VsZWN0LW9wdGlvbi5kcm9wZG93bi1pdGVtXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4OiBudW1iZXIsIGVsZW06IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0SXRlbSA9ICQoZWxlbSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RJdGVtLnRleHQoKSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0SXRlbS5hZGRDbGFzcyhcInNhb3AtbXVsdGlzZWxlY3QtaXRlbS1zdGlja3lcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KHRhcmdldDogc3RyaW5nID0gXCJcIiwgY2FwdGlvbiA9IFwiXCIgKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0LmluaXRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwcmV2b2RlICh0dWRpIHphIHRoaXMuX2NhcHRpb24pXHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuXHJcbiAgICAgICAgaWYgKGdsb2JhbC5pc0VtcHR5KHRhcmdldCkpIHt0YXJnZXQgPSBcIi5zYW9wLW11bHRpc2VsZWN0XCI7fVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IgPSAkKHRhcmdldCk7XHJcblxyXG4gICAgICAgIC8vIGFsaSBpbWEgc2VsZWN0ZWRDQiBkYXRhLWNhcHRpb25cclxuICAgICAgICBsZXQgc2VsZWN0Q2FwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eSh0aGlzLl9jYXB0aW9uKSkge1xyXG4gICAgICAgICAgICBzZWxlY3RDYXB0aW9uID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSh0aGlzLl9jYXB0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGFDYXB0aW9uID0gdGhpcy5zZWxlY3RlZENCLmF0dHIoXCJkYXRhLWNhcHRpb25cIik7XHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eShkYXRhQ2FwdGlvbikpIHtcclxuICAgICAgICAgICAgc2VsZWN0Q2FwdGlvbiA9IGRhdGFDYXB0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0YXJnZXQpLm11bHRpc2VsZWN0KHtcclxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAzNTAsICBcclxuICAgICAgICAgICAgZW5hYmxlRmlsdGVyaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBpbmNsdWRlU2VsZWN0QWxsT3B0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBlbmFibGVDYXNlSW5zZW5zaXRpdmVGaWx0ZXJpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIGVuYWJsZUZ1bGxWYWx1ZUZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGZpbHRlclBsYWNlaG9sZGVyOiB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiScWhxI1pXCIpLFxyXG4gICAgICAgICAgICBub25TZWxlY3RlZFRleHQ6ICcnLFxyXG4gICAgICAgICAgICBhbGxTZWxlY3RlZFRleHQ6dGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlZzaVwiKSxcclxuICAgICAgICAgICAgc2VsZWN0QWxsVGV4dDp0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiSXpiZXJpIHByaWthemFuZVwiKSxcclxuICAgICAgICAgICAgblNlbGVjdGVkVGV4dDp0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiaXpicmFuaWhcIiksXHJcbiAgICAgICAgICAgIGluY2x1ZGVGaWx0ZXJDbGVhckJ0bjogdHJ1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZUlmRW1wdHk6IGZhbHNlLFxyXG4gICAgICAgICAgICBudW1iZXJEaXNwbGF5ZWQ6IDIsXHJcbiAgICAgICAgICAgIGJ1dHRvbldpZHRoOiAnMjAwcHgnLFxyXG4gICAgICAgICAgICBidXR0b25DbGFzcyA6J3Nhb3AtY29udHJvbCBmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgbXMtaW1hZ2UtZG93biBwci0wJyxcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyOiAnPGRpdiBpZD1cInNlbGVjdGVkLXBhcmVudHMtY29udGFpbmVyXCI+PGxhYmVsIGlkID1cImNvbnRhaW5lckxhYmVsXCIgY2xhc3M9XCJtcy1mbG9hdC1sYWJlbCBtcy1mbG9hdC1sYWJlbC1zZWxlY3RlZCBzYW9wLXR4dC03XCIgZm9yPVwiTmFtZVwiPicrc2VsZWN0Q2FwdGlvbisnPC9sYWJlbD48L2Rpdj4nLFxyXG4gICAgICAgICAgICBvblNlbGVjdEFsbDogZnVuY3Rpb24gKHNlbGVjdGVkT3B0aW9uczogSlF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJTZWxlY3RBbGwoc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQodGhpcy4kc2VsZWN0KTtcclxuICAgICAgICAgICAgfSwgICAgICAgIFxyXG4gICAgICAgICAgICBvbkRlc2VsZWN0QWxsOiBmdW5jdGlvbihzZWxlY3RlZE9wdGlvbnM6SlF1ZXJ5KXtcclxuICAgICAgICAgICAgICAgIF90aGlzLmJpbmREaXYodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckRlc2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihvcHRpb246IEpRdWVyeSwgY2hlY2tlZDogYm9vbGVhbil7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2Uob3B0aW9uLCBjaGVja2VkKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQodGhpcy4kc2VsZWN0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25Jbml0aWFsaXplZDogZnVuY3Rpb24gKCRzZWxlY3QsICRjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9tdWx0aVNlbGVjdE9iamVjdCA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25Jbml0aWFsaXplZENvbnRyb2wodGhpcyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlczoge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uOiB0aGlzLl9vcHRpb25zLnRlbXBsYXRlc0J1dHRvbixcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogJzxsaSBjbGFzcz1cIm11bHRpc2VsZWN0LWl0ZW0gbXVsdGlzZWxlY3QtZmlsdGVyXCI+PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIG1iLTNcIj48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXVsdGlzZWxlY3Qtc2VhcmNoXCIgdHlwZT1cInRleHRcIiAvPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCI+PHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0IHNhb3AtaW1nLXNlYXJjaCBzaS14c1wiPjwvc3Bhbj48L2Rpdj48L2Rpdj48L2xpPicsXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5tdWx0aXNlbGVjdCgnc2VsZWN0QWxsJywgZmFsc2UsIHRydWUpXHJcbiAgICAgICAgLm11bHRpc2VsZWN0KCd1cGRhdGVCdXR0b25UZXh0Jyk7XHJcbiAgICAgICAgOyAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVidWlsZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3JlYnVpbGQnKTtcclxuICAgIH1cclxuXHJcbiAgICBhZnRlclNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnM6IEpRdWVyeSkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckRlc2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9uczpKUXVlcnkpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckNoYW5nZShvcHRpb246IEpRdWVyeSwgY2hlY2tlZDogYm9vbGVhbil7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQoZWxlbWVudDphbnkpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckluaXRpYWxpemVkQ29udHJvbChlbGVtZW50OiBhbnkpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VsZWN0VmFsdWVzIHZyZWRub3N0aVxyXG4gICAgc2V0U2VsZWN0VmFsdWVzKHNlbGVjdFZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICAvLyBvZHpuYWNpbW8gdnNlIHphcG9zbGVuZVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnZGVzZWxlY3RBbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdFZhbHVlcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIG96bmFjaW1vIGl6YnJhbmVcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdzZWxlY3QnLCBzZWxlY3RWYWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3JlZnJlc2gnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX211bHRpU2VsZWN0T2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5iaW5kRGl2KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0LiRzZWxlY3QpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJIdG1sT3B0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0JcclxuICAgICAgICAgICAgLmZpbmQoJ29wdGlvbicpXHJcbiAgICAgICAgICAgIC5yZW1vdmUoKVxyXG4gICAgICAgICAgICAuZW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEh0bWxPcHRpb25zKG9wdGlvbkxpc3Q6IFNlbGVjdE9wdGlvbltdLCBzZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJIdG1sT3B0aW9ucygpO1xyXG4gICAgICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb3B0aW9uTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4gX3RoaXMuc2VsZWN0ZWRDQi5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCInICsgZWxlbWVudC52YWx1ZSArICdcIj4nICsgZWxlbWVudC50ZXh0ICsgJzwvb3B0aW9uPicpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkKCk7XHJcbiAgICAgICAgdGhpcy5hZGRTdGlja3lDbGFzcygpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnc2VsZWN0QWxsJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLnZhbCgpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgU2FvcFBpbmNoWm9vbSB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcGluY2gtYW5kLXpvb21cIjtcclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQZGZQcmV2aWV3IHtcclxuICAgIHByaXZhdGUgX3BkZmpzTGliOmFueTtcclxuICAgIHByaXZhdGUgX2NhbnZhczphbnk7XHJcbiAgICBwcml2YXRlIF92aWV3ZXI6YW55O1xyXG4gICAgcHJpdmF0ZSBfcGRmOmFueTtcclxuICAgIHByaXZhdGUgX3NjYWxlID0gMTtcclxuICAgIC8vXHJcbiAgICBwcml2YXRlIF9kb2N1bWVudElkOnN0cmluZztcclxuICAgIHByaXZhdGUgX3VybDpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9maWxlTmFtZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9iYXNlNjQ6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdHlwZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zYW9wUGluY2hab29tOlNhb3BQaW5jaFpvb207XHJcblxyXG4gICAgbG9hZHBkZmpzTGliKHBkZmpzTGliOmFueSk6dm9pZHtcclxuICAgICAgICB0aGlzLl9wZGZqc0xpYiA9IHBkZmpzTGliO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BQaW5jaFpvb20gPSAgbmV3IFNhb3BQaW5jaFpvb20oKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJQYWdlKHBhZ2VOdW1iZXI6YW55LCBjYW52YXM6YW55KTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3BkZi5nZXRQYWdlKHBhZ2VOdW1iZXIpLnRoZW4oZnVuY3Rpb24ocGFnZTphbnkpIHtcclxuICAgICAgICBfdGhpcy5fdmlld2VyID0gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiBfdGhpcy5fc2NhbGUgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgIGxldCBfdmlld2VyT2Zmc2V0ID0gJCgnLnBkZi12aWV3ZXItaW5uZXInKS5vZmZzZXQoKTtcclxuICAgICAgICAgICAgLy8gICBsZXQgX3cgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSBfdmlld2VyT2Zmc2V0LmxlZnQsIHdpbmRvdy5pbm5lcldpZHRoIC0gX3ZpZXdlck9mZnNldC5sZWZ0IC0yNzIgfHwgMClcclxuXHJcbiAgICAgICAgICAgIC8vIGxldCBfdyA9ICQoJyNwZGYtdmlld2VyJykud2lkdGgoKTtcclxuICAgICAgICAgICAgLy8gY2FudmFzLmhlaWdodCA9IF90aGlzLl92aWV3ZXIuaGVpZ2h0O1xyXG4gICAgICAgICAgICAvLyBjYW52YXMud2lkdGggPSBfdyAtIDEwO1xyXG4gICAgICAgICAgICBsZXQgX3cgPSAoX3RoaXMuX3ZpZXdlci53aWR0aCBhcyBzdHJpbmcpKydweCdcclxuICAgICAgICAgICAgJCgnLnNhb3AtY29sLXZpZXcnKS5jc3MoJ21pbi13aWR0aCcsIF93KTtcclxuXHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBfdGhpcy5fdmlld2VyLmhlaWdodCAtIDEwO1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBfdGhpcy5fdmlld2VyLndpZHRoIC0gMTA7ICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgcGFnZS5yZW5kZXIoe2NhbnZhc0NvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLCB2aWV3cG9ydDogX3RoaXMuX3ZpZXdlcn0pLnByb21pc2UudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQYWdlIHJlbmRlcmluZyBjb21wbGV0ZS4nKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9zYW9wUGluY2hab29tLmluaXQoXCJwZGYtdmlld2VyXCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgc2V0RGVmYXVsdFNjYWxlKHNjYWxlOm51bWJlcik6dm9pZHtcclxuICAgICAgICB0aGlzLl9zYW9wUGluY2hab29tLnNldERlZmF1bHRTY2FsZShzY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NDpzdHJpbmcpOmFueXtcclxuICAgICAgICB2YXIgcmF3ID0gYXRvYihiYXNlNjQpO1xyXG4gICAgICAgIHZhciB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkocmF3Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdWludDhBcnJheVtpXSA9IHJhdy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdWludDhBcnJheTtcclxuICAgIH0gICBcclxuXHJcbiAgICBsb2FkaW5nUGRmVGFzayhsb2FkaW5nVGFzazphbnkpOnZvaWR7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocGRmOmFueSkge1xyXG4gICAgICAgICAgICBfdGhpcy5fcGRmID0gcGRmO1xyXG4gICAgICAgICAgICBfdGhpcy5fdmlld2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BkZi12aWV3ZXInKTtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yKGxldCBwYWdlID0gMTsgcGFnZSA8PSBwZGYubnVtUGFnZXM7IHBhZ2UrKykge1xyXG4gICAgICAgICAgICAgICAgXHJcbiBcclxuICAgICAgICAgICAgICBfdGhpcy5fY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTsgICAgXHJcbiAgICAgICAgICAgICAgX3RoaXMuX2NhbnZhcy5jbGFzc05hbWUgPSAncGRmLXBhZ2UtY2FudmFzJzsgXHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgbGV0IF9yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgIF9yb3cuY2xhc3NOYW1lID0gJ3JvdyBtLTAgcC0wJzsgXHJcblxyXG4gICAgICAgICAgICAgIGxldCBfY29sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICBfY29sLmNsYXNzTmFtZSA9ICdjb2wgbS0wIHAtMCBzYW9wLWNvbC12aWV3JzsgXHJcblxyXG4gICAgICAgICAgICAgIF9jb2wuYXBwZW5kQ2hpbGQoX3RoaXMuX2NhbnZhcyk7IFxyXG5cclxuICAgICAgICAgICAgICBfcm93LmFwcGVuZENoaWxkKF9jb2wpOyBcclxuXHJcbiAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdlci5hcHBlbmRDaGlsZChfcm93KTtcclxuICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJQYWdlKHBhZ2UsIF90aGlzLl9jYW52YXMpO1xyXG4gICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgLy9uZXcgU2FvcFBpbmNoWm9vbSgpLmluaXQoXCJwZGYtdmlld2VyXCIpO1xyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBfdGhpcy5fc2FvcFBpbmNoWm9vbS5pbml0KFwicGRmLXZpZXdlclwiKTtcclxuICAgICAgICAgICAgLy8gJCgnLnBkZi1wYWdlLWNhbnZhcycpLmF0dHIoXCJvbmxvYWRcIixcInNhb3BQZGZQcmV2aWV3LnNldERlZmF1bHRTY2FsZSgwLjYpO1wiKTtcclxuICAgICAgICAgICAgLy8gJCgnZGl2W29ubG9hZF0nKS50cmlnZ2VyKCdvbmxvYWQnKTtcclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGVOYW1lQnlVcmwodXJsOnN0cmluZyk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiBcIkhFQURcIixcclxuICAgICAgICAgICAgdXJsOiB1cmwsICAgICAgICAgXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG1lc3NhZ2UsIHRleHQsIHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgICAgIF90aGlzLl90eXBlID0gcmVzcG9uc2UuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZG9jdW1lbnRSZW5kZXIoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTsgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWxlQ29udGVudEJ5VXJsKHVybDpzdHJpbmcpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogXCJHRVRcIixcclxuICAgICAgICAgICAgdXJsOiB1cmwsICAgICAgICAgXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG1lc3NhZ2UsIHRleHQsIHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgICAgIGxldCBfY29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cInBkZi12aWV3LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoxMDAlO292ZXJmbG93LXk6IGF1dG87XCI+PC9kaXY+Jyk7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyLmh0bWwocmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXIuYXBwZW5kKF9jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgJCgnI3BkZi12aWV3ZXInKS5hcHBlbmQoX2NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7ICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJFcnJvckRpdigpOnZvaWR7XHJcbiAgICAgICAgLy8kKCcjcGRmLXZpZXdlcicpLmh0bWwoJzxkaXY+TmkgZG9rdW1lbnRvdiB6YSBwcmlrYXo8L2Rpdj4nKTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudFByZXZpZXcoKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRXJyb3JEaXYoKTtcclxuICAgICAgICB0aGlzLl9kb2N1bWVudElkID0gJChcIiNteU1vZGVsX0RvY3VtZW50SWRcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuX3VybCA9ICQoXCIjbXlNb2RlbF9GaWxlVXJsXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLl9maWxlTmFtZSA9ICQoXCIjbXlNb2RlbF9GaWxlTmFtZVwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5fYmFzZTY0ID0gJChcIiNteU1vZGVsX0Jhc2U2NFN0cmluZ1wiKS52YWwoKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgIGxldCBfdyA9IHNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3VybC5sZW5ndGggPiAwICYmIHRoaXMuX2ZpbGVOYW1lLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RmlsZU5hbWVCeVVybCh0aGlzLl91cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2Jhc2U2NC5sZW5ndGggPT0gMCkge3JldHVybjt9XHJcblxyXG4gICAgICAgIGxldCBfZmlsZUV4dGVuc2lvbiA9IHRoaXMuX2ZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLmxlbmd0aCA9PSAwKSB7cmV0dXJuO31cclxuXHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IFwiaW1hZ2UvcG5nXCI7XHJcbiAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3BkZicpe1xyXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gXCJhcHBsaWNhdGlvbi9wZGZcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gXCJpbWFnZS9cIitfZmlsZUV4dGVuc2lvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZW5kZXIoKTtcclxuXHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGRvY3VtZW50UmVuZGVyKCk6dm9pZCB7XHJcbiAgICAgICBsZXQgX3cgPSBzY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgICAgIGlmKF93IDw9IDgwMCAmJiB0aGlzLl90eXBlLmluY2x1ZGVzKFwicGRmXCIpID09IHRydWUpe1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVQZGZOb2RlcygpO1xyXG4gICAgICAgICAgICBsZXQgbG9hZGluZ1Rhc2s6YW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBfYXJyYXkgPSB0aGlzLmJhc2U2NFRvVWludDhBcnJheSh0aGlzLl9iYXNlNjQpO1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudChfYXJyYXkpOyAgIFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudCh0aGlzLl91cmwpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdQZGZUYXNrKGxvYWRpbmdUYXNrKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUuaW5jbHVkZXMoXCJ0ZXh0L2h0bWxcIikpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5nZXRGaWxlQ29udGVudEJ5VXJsKHRoaXMuX3VybClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cImRhdGE6Jyt0aGlzLl90eXBlKyc7YmFzZTY0LCcrdGhpcy5fYmFzZTY0KydcIiBjbGFzcz1cIm14LWF1dG8gZC1mbGV4IGgtMTAwIHctMTAwXCIgdHlwZT1cIicrdGhpcy5fdHlwZSsnXCI+PC9lbWJlZD4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cIicrdGhpcy5fdXJsKydcIiBjbGFzcz1cIm14LWF1dG8gZC1mbGV4IGgtMTAwIHctMTAwXCIgdHlwZT1cIicrdGhpcy5fdHlwZSsnXCJcIj48L2VtYmVkPicpOyAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBwcml2YXRlIHByZXBhcmVQZGZOb2RlcygpOnZvaWR7XHJcbiAgICAgICAgbGV0IF9wYXJlbnQgPSAkKCcjcGRmLXZpZXdlcicpLnBhcmVudCgpO1xyXG5cclxuICAgICAgICBsZXQgX21haW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIF9tYWluLmNsYXNzTmFtZSA9ICdwZGYtdmlld2VyLW1haW4nOyBcclxuXHJcbiAgICAgICAgbGV0IF9pbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgX2lubmVyLmNsYXNzTmFtZSA9ICdwZGYtdmlld2VyLWlubmVyJztcclxuXHJcbiAgICAgICAgbGV0IF92aWV3ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIF92aWV3ZXIuaWQgPSAncGRmLXZpZXdlcic7ICAgICAgICAgICAgXHJcblxyXG4gICAgICAgIF9pbm5lci5hcHBlbmRDaGlsZChfdmlld2VyKTtcclxuXHJcbiAgICAgICAgX21haW4uYXBwZW5kQ2hpbGQoX2lubmVyKTtcclxuXHJcbiAgICAgICAgX3BhcmVudC5odG1sKF9tYWluKTsgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvYWRCYXNlNjRQZGYoKTp2b2lke1xyXG4gICAgLy8gICAgIGxldCBfYmFzZTY0ID0gJChcIiNteU1vZGVsX0Jhc2U2NFN0cmluZ1wiKS52YWwoKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgLy8gICAgIGlmIChfYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgbGV0IF9maWxlTmFtZSA9ICQoXCIjbXlNb2RlbF9GaWxlTmFtZVwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAvLyAgICAgICAgIGxldCBfZmlsZUV4dGVuc2lvbiA9IF9maWxlTmFtZS5zcGxpdCgnLicpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAvLyAgICAgICAgIGxldCBfdyA9IHNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmKF93IDw9IDgwMCAmJiBfZmlsZUV4dGVuc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpID09IFwicGRmXCIpe1xyXG4gICAgLy8gICAgICAgICAgICAgLy9cclxuICAgIC8vICAgICAgICAgICAgIHRoaXMucHJlcGFyZVBkZk5vZGVzKCk7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgX2FycmF5ID0gdGhpcy5iYXNlNjRUb1VpbnQ4QXJyYXkoX2Jhc2U2NCk7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudChfYXJyYXkpOyAgIFxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5sb2FkaW5nUGRmVGFzayhsb2FkaW5nVGFzayk7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgX3R5cGUgPSBcImltYWdlL3BuZ1wiO1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3BkZicpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIF90eXBlID0gXCJhcHBsaWNhdGlvbi9wZGZcIjtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgX3R5cGUgPSBcImltYWdlL1wiK19maWxlRXh0ZW5zaW9uO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cImRhdGE6JytfdHlwZSsnO2Jhc2U2NCwnK19iYXNlNjQrJ1wiIGNsYXNzPVwibXgtYXV0byBkLWZsZXggaC0xMDAgdy0xMDBcIiB0eXBlPVwiJytfdHlwZSsnXCI+PC9lbWJlZD4nKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvL1xyXG4gIFxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvaGFtbWVyanMvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGluY2hab29tIHtcclxuXHRwcml2YXRlIF9pbml0aWFsaXplZDpib29sZWFuID0gZmFsc2U7XHJcblx0Ly8gcHJpdmF0ZSBfZGVmYXVsdFNldCA9IHt4OiAtNjAsIHk6IC01Myx6OiAwLjZ9O1xyXG5cdHByaXZhdGUgX2RlZmF1bHRTZXQgPSB7eDogMCwgeTogMCx6OiAwLjZ9O1xyXG5cdHByaXZhdGUgX2VsZW1lbnQgOmFueTtcclxuXHRwcml2YXRlIF9oYW1tZXJ0aW1lIDphbnk7XHJcblxyXG5cdHByaXZhdGUgX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZSA6YW55O1xyXG5cdHByaXZhdGUgX3BpbmNoU3RhcnQgOmFueTtcclxuXHRwcml2YXRlIF9sYXN0RXZlbnQgOmFueTtcclxuXHRcclxuXHRwcml2YXRlIF9vcmlnaW5hbFNpemUgOmFueTtcdFxyXG5cdHByaXZhdGUgX2N1cnJlbnQgOmFueTtcclxuXHRwcml2YXRlIF9sYXN0IDphbnk7XHRcclxuXHRwcml2YXRlIF9waW5jaFpvb21PcmlnaW4gOmFueTtcclxuXHRcclxuXHQvL1xyXG5cdFxyXG5cdHNsZWVwKG1pbGxpc2Vjb25kczpudW1iZXIpOnZvaWQge1xyXG5cdFx0Y29uc3QgZGF0ZSA9IERhdGUubm93KCk7XHJcblx0XHRsZXQgY3VycmVudERhdGUgPSBudWxsO1xyXG5cdFx0ZG8ge1xyXG5cdFx0XHRjdXJyZW50RGF0ZSA9IERhdGUubm93KCk7XHJcblx0XHR9IHdoaWxlIChjdXJyZW50RGF0ZSAtIGRhdGUgPCBtaWxsaXNlY29uZHMpO1xyXG5cdH1cclxuXHJcblx0aW5pdChpZDpzdHJpbmcpe1xyXG5cdFx0Y29uc29sZS5sb2coXCJpbml0Li4uXCIpO1xyXG5cdFx0dGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHJcblx0XHQvLyBsZXQgX3cgPSAkKCB3aW5kb3cgKS53aWR0aCgpOy8vdGhpcy5fZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHRcdC8vIC8vbGV0IF9wZGZXID0gcGFyc2VJbnQoJChcIi5wZGYtcGFnZS1jYW52YXNcIikud2lkdGgoKSkpICogMC42O1xyXG5cdFx0Ly8gbGV0IF9wZGZXID0gJChcIi5wZGYtcGFnZS1jYW52YXNcIikud2lkdGgoKSAqIDAuNjtcclxuXHRcdC8vIHRoaXMuX2RlZmF1bHRTZXQueCA9ICggX3cgLSBfcGRmVykgLyAyO1xyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lID0gbmV3IEhhbW1lcih0aGlzLl9lbGVtZW50LCB7fSk7XHRcdFxyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLmdldCgncGFuJykuc2V0KHsgdGhyZXNob2xkOiAwIH0pO1xyXG5cclxuICAgIFx0dGhpcy5fcGluY2hTdGFydCA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuXHRcdHRoaXMuX29yaWdpbmFsU2l6ZSA9IHt3aWR0aDogMjAwLCBoZWlnaHQ6IDMwMH07XHRcclxuXHRcdHRoaXMuX2N1cnJlbnQgPSB7eDogMCwgeTogMCwgejogMCwgem9vbWluZzogZmFsc2UsIHdpZHRoOiB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGggKiAxLCBoZWlnaHQ6IHRoaXMuX29yaWdpbmFsU2l6ZS5oZWlnaHQgKiAxfTtcdFxyXG5cdFx0dGhpcy5fbGFzdCA9IHt4OiB0aGlzLl9jdXJyZW50LngsIHk6dGhpcy5fY3VycmVudC55LCB6OnRoaXMuX2N1cnJlbnQuen1cdFx0XHJcblxyXG5cdFx0dGhpcy5pbml0RXZlbnRzKCk7XHJcblxyXG5cdFx0dGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cdFx0XHJcblx0XHR0aGlzLnNldERlZmF1bHRTY2FsZSh0aGlzLl9kZWZhdWx0U2V0LnopO1xyXG5cdH1cclxuXHJcblx0c2V0RGVmYXVsdFNjYWxlKHNjYWxlOm51bWJlcikge1xyXG5cdFx0Y29uc29sZS5sb2coXCJzY2FsZTpcIitzY2FsZS50b1N0cmluZygpKTtcclxuXHRcdGlmICh0aGlzLl9pbml0aWFsaXplZCA9PSBmYWxzZSkge3JldHVybjsgfTtcclxuXHRcdC8vdGhpcy5zbGVlcCg1MDApO1xyXG5cclxuXHRcdGxldCBfdGhpcyA9IHRoaXM7XHJcblx0XHQvL1xyXG5cdFx0dGhpcy5fZGVmYXVsdFNldC56ID0gc2NhbGU7XHJcblx0XHQvL1xyXG5cdFx0dGhpcy5fY3VycmVudCA9IHt4OiAwLCB5OiAwLCB6OiB0aGlzLl9kZWZhdWx0U2V0LnosIHpvb21pbmc6IGZhbHNlLCB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoICogMSwgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0ICogMX07XHRcclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblx0XHQvL1xyXG5cdFx0bGV0IF9zY3JlZW5XaWR0aCA9ICQoIHdpbmRvdyApLndpZHRoKCk7XHJcbiAgICBcdGxldCBfcGRmV2lkdGggPSBwYXJzZUludCgkKFwiLnBkZi1wYWdlLWNhbnZhc1wiKS5hdHRyKFwid2lkdGhcIikpO1xyXG5cdFx0X3BkZldpZHRoID0gX3BkZldpZHRoICogdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cdFx0bGV0IF9sZWZ0Q2FudmFzID0gKF9zY3JlZW5XaWR0aCAtIChfc2NyZWVuV2lkdGggKiB0aGlzLl9kZWZhdWx0U2V0LnopKSAvIDI7XHJcblx0XHRsZXQgX2RpZmZMZWZ0ID0gKF9zY3JlZW5XaWR0aCAtIF9wZGZXaWR0aCkgLyAyO1xyXG5cdFx0dGhpcy5fZGVmYXVsdFNldC54ID0gKF9sZWZ0Q2FudmFzIC0gX2RpZmZMZWZ0ICsgNSkgKiAoLTEpO1xyXG5cdFx0Ly8gLy9cclxuXHRcdGxldCBfcGRmRG9jSGVpZ2h0ID0gJChcIiNkb2N1bWVudC1wcmV2aWV3XCIpLmhlaWdodCgpO1xyXG5cdFx0aWYgKF9wZGZEb2NIZWlnaHQgPD0gMCApIHtcclxuXHRcdFx0X3BkZkRvY0hlaWdodCA9IDI4MDtcclxuXHRcdH1cclxuXHRcdHRoaXMuX2RlZmF1bHRTZXQueSA9ICgoX3BkZkRvY0hlaWdodCAtIChfcGRmRG9jSGVpZ2h0ICogdGhpcy5fZGVmYXVsdFNldC56KSkvMikgKiAoLTEpO1x0XHRcclxuXHRcdC8vXHJcblx0XHRcclxuXHRcdHRoaXMuX2N1cnJlbnQueCA9IHRoaXMuX2RlZmF1bHRTZXQueFxyXG5cdFx0dGhpcy5fY3VycmVudC55ID0gdGhpcy5fZGVmYXVsdFNldC55O1xyXG5cdFx0dGhpcy5fY3VycmVudC56ID0gdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cclxuXHRcdHRoaXMuX2xhc3QueCA9IHRoaXMuX2RlZmF1bHRTZXQueFxyXG5cdFx0dGhpcy5fbGFzdC55ID0gdGhpcy5fZGVmYXVsdFNldC55O1xyXG5cdFx0dGhpcy5fbGFzdC56ID0gdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGUoKTp2b2lkIHtcclxuXHQgIHRoaXMuX2N1cnJlbnQuaGVpZ2h0ID0gdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodCAqIHRoaXMuX2N1cnJlbnQuejtcclxuXHQgIHRoaXMuX2N1cnJlbnQud2lkdGggPSB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGggKiB0aGlzLl9jdXJyZW50Lno7XHJcblx0ICB0aGlzLl9lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlM2QoXCIgKyB0aGlzLl9jdXJyZW50LnggKyBcInB4LCBcIiArIHRoaXMuX2N1cnJlbnQueSArIFwicHgsIDApIHNjYWxlKFwiICsgdGhpcy5fY3VycmVudC56ICsgXCIpXCI7XHJcblx0fVxyXG5cclxuXHRnZXRDb29yZHMoZWxlbTphbnkpOmFueSB7IC8vIGNyb3NzYnJvd3NlciB2ZXJzaW9uXHJcblx0ICB2YXIgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0ICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XHJcblx0ICB2YXIgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcblxyXG5cdCAgdmFyIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3A7XHJcblx0ICB2YXIgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2NFbC5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcblx0ICB2YXIgY2xpZW50VG9wID0gZG9jRWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XHJcblx0ICB2YXIgY2xpZW50TGVmdCA9IGRvY0VsLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7XHJcblxyXG5cdCAgdmFyIHRvcCAgPSBib3gudG9wICsgIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcclxuXHQgIHZhciBsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDtcclxuXHJcblx0ICByZXR1cm4geyB4OiBNYXRoLnJvdW5kKGxlZnQpLCB5OiBNYXRoLnJvdW5kKHRvcCkgfTtcclxuXHR9XHJcblxyXG5cclxuXHRnZXRDb29yZGluYXRlU2hpZnREdWVUb1NjYWxlKHNpemU6YW55LCBzY2FsZTphbnkpOmFueXtcclxuXHQgIHZhciBuZXdXaWR0aCA9IHNjYWxlICogc2l6ZS53aWR0aDtcclxuXHQgIHZhciBuZXdIZWlnaHQgPSBzY2FsZSAqIHNpemUuaGVpZ2h0O1xyXG5cdCAgdmFyIGR4ID0gKG5ld1dpZHRoIC0gc2l6ZS53aWR0aCkgLyAyO1xyXG5cdCAgdmFyIGR5ID0gKG5ld0hlaWdodCAtIHNpemUuaGVpZ2h0KSAvIDI7XHJcblx0ICByZXR1cm4ge1xyXG5cdFx0eDogZHgsXHJcblx0XHR5OiBkeVxyXG5cdCAgfTtcclxuXHR9XHJcblxyXG5cdHNjYWxlRnJvbSh6b29tT3JpZ2luOmFueSwgY3VycmVudFNjYWxlOmFueSwgbmV3U2NhbGU6YW55KTphbnkge1xyXG5cdCAgdmFyIGN1cnJlbnRTaGlmdCA9IHRoaXMuZ2V0Q29vcmRpbmF0ZVNoaWZ0RHVlVG9TY2FsZSh0aGlzLl9vcmlnaW5hbFNpemUsIGN1cnJlbnRTY2FsZSk7XHJcblx0ICB2YXIgbmV3U2hpZnQgPSB0aGlzLmdldENvb3JkaW5hdGVTaGlmdER1ZVRvU2NhbGUodGhpcy5fb3JpZ2luYWxTaXplLCBuZXdTY2FsZSk7XHJcblxyXG5cdCAgdmFyIHpvb21EaXN0YW5jZSA9IG5ld1NjYWxlIC0gY3VycmVudFNjYWxlXHJcblx0ICBcclxuXHQgIHZhciBzaGlmdCA9IHtcclxuXHRcdHg6IGN1cnJlbnRTaGlmdC54IC0gbmV3U2hpZnQueCxcclxuXHRcdHk6IGN1cnJlbnRTaGlmdC55IC0gbmV3U2hpZnQueSxcclxuXHQgIH1cclxuXHJcblx0ICB2YXIgb3V0cHV0ID0ge1xyXG5cdFx0eDogem9vbU9yaWdpbi54ICogc2hpZnQueCxcclxuXHRcdHk6IHpvb21PcmlnaW4ueSAqIHNoaWZ0LnksXHJcblx0XHR6OiB6b29tRGlzdGFuY2VcclxuXHQgIH1cclxuXHQgIHJldHVybiBvdXRwdXQ7XHJcblx0fVxyXG5cclxuXHRnZXRSZWxhdGl2ZVBvc2l0aW9uKGVsZW1lbnQ6YW55LCBwb2ludDphbnksIG9yaWdpbmFsU2l6ZTphbnksIHNjYWxlOmFueSk6YW55IHtcclxuXHQgIHZhciBkb21Db29yZHMgPSB0aGlzLmdldENvb3JkcyhlbGVtZW50KTtcclxuXHJcblx0ICB2YXIgZWxlbWVudFggPSBwb2ludC54IC0gZG9tQ29vcmRzLng7XHJcblx0ICB2YXIgZWxlbWVudFkgPSBwb2ludC55IC0gZG9tQ29vcmRzLnk7XHJcblxyXG5cdCAgdmFyIHJlbGF0aXZlWCA9IGVsZW1lbnRYIC8gKG9yaWdpbmFsU2l6ZS53aWR0aCAqIHNjYWxlIC8gMikgLSAxO1xyXG5cdCAgdmFyIHJlbGF0aXZlWSA9IGVsZW1lbnRZIC8gKG9yaWdpbmFsU2l6ZS5oZWlnaHQgKiBzY2FsZSAvIDIpIC0gMTtcclxuXHQgIHJldHVybiB7IHg6IHJlbGF0aXZlWCwgeTogcmVsYXRpdmVZIH1cclxuXHR9XHJcblxyXG5cdGluaXRFdmVudHMoKTp2b2lkIHtcclxuXHRcdGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGFuZW5kJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwicGFuZW5kXCIpO1xyXG5cdFx0ICBpZiAodGhpcy5fY3VycmVudC5zY2FsZSAhPSB0aGlzLl9sYXN0LnNjYWxlKSB7XHJcblx0XHQgIFx0dGhpcy5fbGFzdC54ID0gdGhpcy5fY3VycmVudC54O1xyXG5cdFx0ICB9XHJcblx0XHQgIHRoaXMuX2xhc3QueSA9IHRoaXMuX2N1cnJlbnQueTtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BhbmVuZCc7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwaW5jaGVuZCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcInBpbmNoZW5kXCIpO1xyXG5cdFx0ICB0aGlzLl9sYXN0LnggPSB0aGlzLl9jdXJyZW50Lng7XHJcblx0XHQgIHRoaXMuX2xhc3QueSA9IHRoaXMuX2N1cnJlbnQueTtcclxuXHRcdCAgdGhpcy5fbGFzdC56ID0gdGhpcy5fY3VycmVudC56O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGluY2hlbmQnO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHRcclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwaW5jaHN0YXJ0JywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHQgIHRoaXMuX3BpbmNoU3RhcnQueCA9IGUuY2VudGVyLng7XHJcblx0XHQgIHRoaXMuX3BpbmNoU3RhcnQueSA9IGUuY2VudGVyLnk7XHJcblx0XHQgIHRoaXMuX3BpbmNoWm9vbU9yaWdpbiA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbih0aGlzLl9lbGVtZW50LCB7IHg6IHRoaXMuX3BpbmNoU3RhcnQueCwgeTogdGhpcy5fcGluY2hTdGFydC55IH0sIHRoaXMuX29yaWdpbmFsU2l6ZSwgdGhpcy5fY3VycmVudC56KTtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BpbmNoc3RhcnQnO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHJcblx0XHRcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BpbmNoJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHQgIGNvbnNvbGUubG9nKFwicGluY2hcIik7XHJcblx0XHQgIHZhciBkID0gdGhpcy5zY2FsZUZyb20odGhpcy5fcGluY2hab29tT3JpZ2luLCB0aGlzLl9sYXN0LnosIHRoaXMuX2xhc3QueiAqIGUuc2NhbGUpXHJcblx0ICAgICAgdGhpcy5fY3VycmVudC54ID0gZC54ICsgdGhpcy5fbGFzdC54ICsgZS5kZWx0YVg7XHJcblx0XHQgIHRoaXMuX2N1cnJlbnQueSA9IGQueSArIHRoaXMuX2xhc3QueSArIGUuZGVsdGFZO1xyXG5cdFx0ICB0aGlzLl9jdXJyZW50LnogPSBkLnogKyB0aGlzLl9sYXN0Lno7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwaW5jaCc7XHJcblx0XHQgIHRoaXMudXBkYXRlKCk7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbignZG91YmxldGFwJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiZG91YmxldGFwXCIpO1xyXG5cdFx0XHR0aGlzLnNldERlZmF1bHRTY2FsZSh0aGlzLl9kZWZhdWx0U2V0LnopO1xyXG5cclxuXHRcdC8vICAgdmFyIF90aGlzID0gdGhpczsgXHJcblx0XHQvLyAgIHZhciBzY2FsZUZhY3RvciA9IDE7XHJcblx0XHQvLyAgIGlmICh0aGlzLl9jdXJyZW50Lnpvb21pbmcgPT09IGZhbHNlKSB7XHJcblx0XHQvLyBcdHRoaXMuX2N1cnJlbnQuem9vbWluZyA9IHRydWU7XHJcblx0XHQvLyAgIH0gZWxzZSB7XHJcblx0XHQvLyBcdHRoaXMuX2N1cnJlbnQuem9vbWluZyA9IGZhbHNlO1xyXG5cdFx0Ly8gXHRzY2FsZUZhY3RvciA9IC1zY2FsZUZhY3RvcjtcclxuXHRcdC8vICAgfVxyXG5cclxuXHRcdC8vICAgdGhpcy5fZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gXCIwLjNzXCI7XHJcblx0XHQvLyAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHQvLyBcdF90aGlzLl9lbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSBcIm5vbmVcIjtcclxuXHRcdC8vICAgfSwgMzAwKVxyXG5cclxuXHRcdC8vICAgdmFyIHpvb21PcmlnaW4gPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24odGhpcy5fZWxlbWVudCwgeyB4OiBlLmNlbnRlci54LCB5OiBlLmNlbnRlci55IH0sIHRoaXMuX29yaWdpbmFsU2l6ZSwgdGhpcy5fY3VycmVudC56KTtcclxuXHRcdC8vICAgdmFyIGQgPSB0aGlzLnNjYWxlRnJvbSh6b29tT3JpZ2luLCB0aGlzLl9jdXJyZW50LnosIHRoaXMuX2N1cnJlbnQueiArIHNjYWxlRmFjdG9yKVxyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnggKz0gZC54O1xyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnkgKz0gZC55O1xyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnogKz0gZC56O1xyXG5cclxuXHRcdC8vICAgdGhpcy5fbGFzdC54ID0gdGhpcy5fY3VycmVudC54O1xyXG5cdFx0Ly8gICB0aGlzLl9sYXN0LnkgPSB0aGlzLl9jdXJyZW50Lnk7XHJcblx0XHQvLyAgIHRoaXMuX2xhc3QueiA9IHRoaXMuX2N1cnJlbnQuejtcclxuXHJcblx0XHQvLyAgIHRoaXMudXBkYXRlKCk7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwYW4nLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdCAgY29uc29sZS5sb2coXCJwYW5cIik7XHJcblx0XHQgIGlmICh0aGlzLl9sYXN0RXZlbnQgIT09ICdwYW4nKSB7XHJcblx0XHRcdHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZSA9IHtcclxuXHRcdFx0ICB4OiBlLmRlbHRhWCxcclxuXHRcdFx0ICB5OiBlLmRlbHRhWVxyXG5cdFx0XHR9O1xyXG5cdFx0ICB9O1xyXG5cclxuXHRcdCAgaWYgKHRoaXMuX2N1cnJlbnQueiAhPSB0aGlzLl9kZWZhdWx0U2V0Lnope1xyXG5cdFx0XHR0aGlzLl9jdXJyZW50LnggPSB0aGlzLl9sYXN0LnggKyBlLmRlbHRhWCAtIHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZS54O1xyXG5cdFx0ICB9XHJcblx0XHQgIFxyXG5cdFx0ICB0aGlzLl9jdXJyZW50LnkgPSB0aGlzLl9sYXN0LnkgKyBlLmRlbHRhWSAtIHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZS55O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGFuJztcclxuXHRcdCAgdGhpcy51cGRhdGUoKTtcclxuXHRcdH0pLmJpbmQodGhpcykpOyBcclxuXHRcdFxyXG4gICAgLy8gICAgJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0Ly8gXHRcdFByb2dyZXNzRXZlbnQ7XHJcbiAgICAvLyAgICAgICAgX3RoaXMuc2V0RGVmYXVsdFNjYWxlKCk7XHJcbiAgICAvLyAgICB9KS5yZXNpemUoKTtcdFx0XHJcblxyXG5cdH1cclxuXHJcblx0XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBvcG92ZXIge1xyXG4gICAgcHJpdmF0ZSBfcXVlcnlTZWxlY3Rvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZyA9IFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpIHtcclxuICAgICAgICB0aGlzLl9xdWVyeVNlbGVjdG9yID0gcXVlcnlTZWxlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kUG9wb3ZlckV2ZW50cygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5wb3BvdmVyKHtcclxuICAgICAgICAgICAgaHRtbDogdHJ1ZSxcclxuICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxyXG4gICAgICAgICAgICB0cmlnZ2VyOiAnY2xpY2snLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9ICQodGhpcykuYXR0cihcImRhdGEtcG9wb3Zlci1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY29udGVudCkuY2hpbGRyZW4oXCIucG9wb3Zlci1ib2R5XCIpLmh0bWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCdodG1sJykub24oJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cCFcIik7XHJcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuY2xvc2VzdCgnLnBvcG92ZXInKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb3VzZXVwLnBvcG92ZXIhXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnLnBvcG92ZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cC5wb3BvdmVyLmhpZGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzLnByZXZpb3VzU2libGluZykucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoX3RoaXMuX3F1ZXJ5U2VsZWN0b3IpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHdoZW4gcG9wb3ZlcidzIGNvbnRlbnQgaXMgc2hvd25cclxuICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLm9uKCdzaG93bi5icy5wb3BvdmVyJywgZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBzZXQgd2hhdCBoYXBwZW5zIHdoZW4gdXNlciBjbGlja3Mgb24gdGhlIGJ1dHRvblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0IVwiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmFmdGVyUG9wb3ZlclNob3codGhpcyk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJMaW5rXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyTGlua1wiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicG9wb3ZlckxpbmsgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckNsb3NlXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyQ2xvc2VcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkNsb3NlIHBvcG92ZXIgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJQb3BvdmVyU2hvdyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5hZnRlclBvcG92ZXJTaG93XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZWxmQ29udGFpbmVyUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuaW5pdFNlbGZDb250YWluZXJQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3F1ZXJ5U2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgJGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXM7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBlbGVtLFxyXG4gICAgICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmVuYWJsZVBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcXVlcnlTZWxlY3RvcikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCAkZWxlbSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoJ2VuYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5kaXNhYmxlUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9xdWVyeVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0ICRlbGVtID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgJGVsZW0ucG9wb3ZlcignZGlzYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2dPcHRpb25zIHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBib2R5OiBzdHJpbmc7XHJcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuO1xyXG4gICAgY29uZmlybUJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNhbmNlbEJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb25kYXRhOiBvYmplY3Q7XHJcbiAgICBvblN1Y2Nlc3M6IChwYXJhbXM6YW55KSA9PiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmJvZHkgPSBcImJvZHkgdGV4dFwiO1xyXG4gICAgICAgIHRoaXMuc2hvd0NhbmNlbEJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQnV0dG9uQ2FwdGlvbiA9IFwiT2tcIjtcclxuICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkNhcHRpb24gPSBcIkNhbmNlbFwiO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQWN0aW9uZGF0YSA9IHt9O1xyXG4gICAgICAgIHRoaXMub25TdWNjZXNzID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZyB7XHJcbiAgICBwcml2YXRlIF9vcHRpb25zOlNhb3BQb3B1cERpYWxvZ09wdGlvbnM7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6U2FvcFBvcHVwRGlhbG9nT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfSAgICBcclxuICAgIFxyXG4gICAgc2F2ZShjYWxsYmFjazogKG46IG51bWJlcikgPT4gYW55KSA6IHZvaWQge1xyXG4gICAgICAgIGNhbGxiYWNrKDQyKTtcclxuICAgIH1cclxuXHJcbiAgICBTaG93TG9hZGluZ1Nhb3AoKSB7XHJcbiAgICAgICAgdmFyIG9iaiA9ICQoXCIjc2FvcExvYWRpbmdcIik7XHJcbiAgICAgICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgICAgICAgIG9iai5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgSGlkZUxvYWRpbmdTYW9wKCkge1xyXG4gICAgICAgIHZhciBvYmogPSAkKFwiI3Nhb3BMb2FkaW5nXCIpO1xyXG4gICAgICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICAgICAgICBvYmouaGlkZSgpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBTaG93UG9wdXBEaWFsb2coKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vIERpc3BsYXkgaW5mbyBtZXNzYWdlIHRvIHRoZSB1c2VyIGluIGEgbW9kYWxcclxuICAgICAgICBsZXQgdGl0bGVEaXYgPSAkKCcjaW5mby1tb2RhbC10aXRsZS1kaXYnKTtcclxuICAgICAgICBsZXQgdGl0bGVIID0gJCgnI2luZm8tbW9kYWwtdGl0bGUnKTtcclxuICAgICAgICBsZXQgY29uZmlybUJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1vaycpO1xyXG4gICAgICAgIGxldCBjYW5jZWxCdXR0b24gPSAkKCcjaW5mby1tb2RhbC1idG4tY2FuY2VsJyk7XHJcblxyXG4gICAgICAgIGNhbmNlbEJ1dHRvbi5odG1sKHRoaXMuX29wdGlvbnMuY2FuY2VsQnV0dG9uQ2FwdGlvbik7XHJcblxyXG4gICAgICAgIC8vIHNob3cgb3IgaGlkZSBoZWFkZXIgZGl2IGJhc2VkIG9uIHRpdGxlIHByb3BlcnR5XHJcbiAgICAgICAgdGl0bGVEaXYuY3NzKFwiZGlzcGxheVwiLCBcIlwiKTtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgICAgICB0aXRsZUguaHRtbCh0aGlzLl9vcHRpb25zLnRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2LmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29uZmlybUJ1dHRvbkNhcHRpb24pe1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmh0bWwodGhpcy5fb3B0aW9ucy5jb25maXJtQnV0dG9uQ2FwdGlvbik7XHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc2hvd0NhbmNlbEJ1dHRvbikge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uaHRtbCh0aGlzLl9vcHRpb25zLmNhbmNlbEJ1dHRvbkNhcHRpb24pO1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbC1ib2R5JykuaHRtbCh0aGlzLl9vcHRpb25zLmJvZHkpO1xyXG5cclxuICAgICAgICAkKFwiI2luZm8tbW9kYWwtYnRuLW9rXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wb3B1cERpYWxvZ0NvbmZpcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICQoJyNpbmZvLW1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICQoXCIjaW5mby1tb2RhbC1idG4tb2tcIikudW5iaW5kKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcykubW9kYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgZ2xvYmFsLnNldE1vZGFsRm9ybVpJbmRleCgnI2luZm8tbW9kYWwnKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcG9wdXBEaWFsb2dDb25maXJtKCkge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGNhbmNlbEJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1jYW5jZWwnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbiAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLl9vcHRpb25zLmNvbmZpcm1BY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbmRhdGEsXHJcbiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7IF90aGlzLlNob3dMb2FkaW5nU2FvcCgpOyB9LFxyXG4gICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHsgX3RoaXMuSGlkZUxvYWRpbmdTYW9wKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoX3RoaXMuX29wdGlvbnMub25TdWNjZXNzICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29wdGlvbnMub25TdWNjZXNzKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9jbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9uU3VjY2VzcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uU3VjY2VzcyhudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wUmlnaHRTaWRlYmFyVmlldyB7XHJcbiAgICBEYXNoYm9hcmQgPSAwXHJcbiAgICAsQWJzZW5jZSA9IDFcclxuICAgICxBdHRlbmRhbmNlRGF5ID0gMlxyXG4gICAgLEF0dGVuZGFuY2VNb250aCA9IDMgICAgXHJcbiAgICAsVHJhdmVsT3JkZXJzID0gNFxyXG4gICAgLEludGVybmFsT3JkZXJzID0gNVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJpZ2h0U2lkZWJhciB7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlIDpTYW9wU2VydmljZXNDb3JlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBiaW5kQ2Fyb3VzZWxEaXYoY29udGVudElkOnN0cmluZyx2aWV3OlNhb3BSaWdodFNpZGViYXJWaWV3KXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5iaW5kRGl2XCIpOyBcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL0dldENhcm91c2VsVmlldz92aWV3PVwiK3ZpZXcudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICAgICAgLGFzeW5jOmZhbHNlXHJcbiAgICAgICAgfSk7ICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9Eb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5UGFydGlhbFwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWRcclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hVcmVaYUtvcmlzY2VuamVTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hVcmVaYUtvcmlzY2VuamVTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL1VyZVphS29yaXNjZW5qZVN1bW1hcnlQYXJ0aWFsXCJcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRQZXJpb2Q6c3RyaW5nLCBzcGlubmVyRGl2SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaFJlZ1VyYURvZ29ka2lTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL1JlZ1VyYURvZ29ka2lTdW1tYXJ5UGFydGlhbD9zZWxlY3RlZFBlcmlvZD1cIitzZWxlY3RlZFBlcmlvZFxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpzcGlubmVyRGl2SWRcclxuICAgICAgICAgICAgLy8sc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoUmVnT1BOUG90bmlOYWxvZ2lTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiVHJhdmVsT3JkZXIvVHJhdmVsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOnNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoTmRrSW50ZXJuYWxPcmRlcnNTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUmlnaHRTaWRlQmFyL0ludGVybmFsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogbnVsbFxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcElucHV0V0ZMUHJvcGVydGllcyB7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcjpzdHJpbmc7XHJcbiAgICBjYXB0aW9uOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BzZWxlY3RXRkwge1xyXG4gICAgcHJpdmF0ZSBfaW5wdXRUZW1wbGF0ZTpzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOlNhb3BJbnB1dFdGTFByb3BlcnRpZXMpIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLWZsb2F0LWxhYmVsIHNhb3AtZHJvcGRvd24gc2VsZWN0RWxlbWVudFwiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIHNhb3AtY29udHJvbCBzYW9wLWNoaWxkLXNlbGVjdFwiIGRhdGEtY2hvc2VuPVwiVFwiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgdGFiaW5kZXg9XCIwXCIgc3R5bGU9XCJoZWlnaHQ6IDMwcHg7cGFkZGluZzogMC4wNzVyZW0gMC43NXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIi8+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzYW9wLWZsb2F0aW5nLWxhYmVsXCIgZm9yPVwiJHtwcm9wZXJ0aWVzLmlkfVwiPiR7cHJvcGVydGllcy5jYXB0aW9ufTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwic2VsZWN0LWRyb3Bkb3duIHNhb3AtaW1nLWRvd24gc2ktc1wiLz5cclxuICAgICAgICA8L3NwYW4+ICAgICBcclxuICAgICAgICBgOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudCgpOkpRdWVyeTxIVE1MRWxlbWVudD57XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzLl9pbnB1dFRlbXBsYXRlKTtcclxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5uZXJIdG1sKCk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vIGtuaml6bmljYTogaHR0cHM6Ly9zZWxlY3RpemUuZGV2L1xyXG5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9zZWxlY3RpemUtc2VsZWN0L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyAgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTZWxlY3RPcHRpb24gfSBmcm9tIFwiLi9zYW9wLW11bHRpc2VsZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdCB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NlbGVjdGl6ZUNvbnRyb2w6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nID0gXCJcIiwgaWQ6IHN0cmluZyA9IFwiXCIsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9pZCA9IGlkO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faWQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkKVswXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmluaWNpYWxpemVCaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdENvbnRyb2xCeUpRdWVyeShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplU2VsZWN0KGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sQnlIdG1sKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplU2VsZWN0KCQoZWxlbWVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRNdWx0aXNlbGVjdENvbnRyb2xCeUh0bWwoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdCgkKGVsZW1lbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmdldFZhbHVlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkKS5hdHRyKFwiZGF0YS1jaG9zZW5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TXVsdGlzZWxlY3RWYWx1ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmdldE11bHRpc2VsZWN0VmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgcmV0VmFsdWU6IHN0cmluZ1tdID0gW107IFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQgKyBcIiBvcHRpb246c2VsZWN0ZWRcIikuZWFjaChmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHJldFZhbHVlLnB1c2goJCh0aGlzKS52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZVNlbGVjdChlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5zZWxlY3RpemUoe1xyXG4gICAgICAgICAgICBzb3J0RmllbGQ6ICd0ZXh0JyxcclxuICAgICAgICAgICAgYWxsb3dFbXB0eU9wdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgcmVuZGVyOiB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb246IGZ1bmN0aW9uIChpdGVtOiBhbnksIGVzY2FwZTogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gaXRlbS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXB0aW9uID0gaXRlbS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCI8ZGl2PlwiICsgJzxzcGFuIGNsYXNzPVwibGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDoxM3B4XCI+JyArIGVzY2FwZShsYWJlbCkgKyBcIjwvc3Bhbj5cIiArIFwiPC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kaW5wdXQudmFsKCkgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VsZWN0aXplTXVsdGlzZWxlY3QoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgZWxlbWVudC5zZWxlY3RpemUoe1xyXG4gICAgICAgICAgICBkZWxpbWl0ZXI6IFwifFwiLFxyXG4gICAgICAgICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgbWF4SXRlbXM6IG51bGwsXHJcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGlucHV0OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGlucHV0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25Gb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbHVlcyA9IHRoaXMuaXRlbXM7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2UgamUgc2FtbyBlbiBlbGVtZW50IGluIHRhIFwiP1wiLCB6YnJpc2VtbyBzZXpuYW0sIGRhIHNlIGZsb2F0aW5nIGxhYmVsIHVtYWtuZSBpeiB2dm5vc25lIGtvbnRyb2xlXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsVmFsdWVzLmxlbmd0aCA9PSAxICYmIHNlbFZhbHVlc1swXS50cmltKCkgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSAgICAgICAgICAgXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pY2lhbGl6ZUJpbmRFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pY2lhbGl6ZUJpbmRFdmVudHNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7IFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQpLmNoYW5nZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBfdGhpcy52YWx1ZUNoYW5nZWQoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsdWVDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC52YWx1ZUNoYW5nZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnNldFZhbHVlXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZXModmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnNldFZhbHVlc1wiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyVmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuY2xlYXJWYWx1ZVwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hPcHRpb25zKG9wdGlvbkxpc3Q6IFNlbGVjdE9wdGlvbltdKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QucmVmcmVzaE9wdGlvbnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHpicmlzZW1vIGl6YnJhbm8gb3BjaWpvLCBkcnVnYWNlIG9zdGFuZSBub3RyaSBrb3Qgb3BjaWphXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuY2xlYXJPcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb3B0aW9uTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT5cclxuICAgICAgICAgICAgICAgIF90aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5hZGRPcHRpb24oeyB2YWx1ZTogZWxlbWVudC52YWx1ZSwgdGV4dDogZWxlbWVudC50ZXh0IH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuZGlzYWJsZVwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRvZ2dsZVBhbmVsIHtcclxuXHJcbiAgICBpbml0KCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRvZ2dsZVBhbmVsLmluaXQuLi5cIik7XHJcbiAgICAgICAgdGhpcy5zZXRDbGlja0V2ZW50T25GcmFtZShcImJvZHlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q2xpY2tFdmVudE9uRnJhbWUoZnJhbWVOYW1lOnN0cmluZyA9IFwiYm9keVwiKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRvZ2dsZVBhbmVsLnNldENsaWNrRXZlbnRPbkZyYW1lLi4uXCIpO1xyXG5cclxuICAgICAgICBsZXQgX2ZyYW1lID0gJChcIlwiK2ZyYW1lTmFtZStcIiAqPiAuc2FvcC10b2dnbGUtcGFuZWxcIik7XHJcbiAgICAgICAgX2ZyYW1lLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9mcmFtZS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vbmEga2xpayBzZSBwdcWhxI1pY2Egb2JybmUgZ29yIC8gZG9sXHJcbiAgICAgICAgICAgIHZhciBhcnJvd0RpdiA9ICQodGhpcykuZmluZChcIi5zYW9wLXRvZ2dsZS1hcnJvd1wiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyb3dEaXYubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcnJvd0RpdltpXS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLWltZy1kb3duXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LnJlbW92ZShcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmFkZChcInNhb3AtaW1nLXVwXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd0RpdltpXS5jbGFzc0xpc3QucmVtb3ZlKFwic2FvcC1pbWctdXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmFkZChcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gXCIuL3Nhb3AtbWVzc2FnZS1kbGdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJlZXZpZXcge1xyXG4gICAgcHJpdmF0ZSBfdmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZzsgIFxyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbml0XCIpO1xyXG5cclxuICAgICAgICAvLyBwcmV2YWphbmplXHJcbiAgICAgICAgdGhpcy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50TGlzdG5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEZvcm1UZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGVybWlub2xvZ3kgPSBbXCJOaSBwb2RhdGtvdiB6YSBwcmlrYXouXCIsIFwiQnJpc2FuamVcIiwgXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBlbGVtZW50P1wiXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0ZXJtaW5vbG9neSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnRMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmluaXRFdmVudExpc3RuZXJzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTsgXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnRyZWV2aWV3RXhwYW5kQ29sYXBzZSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1kZWxldGVcIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWRlbGV0ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0tZGVsZXRlLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmRlbGV0ZVRyZWV2aWV3SXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmFkZFRyZWV2aWV3U3ViSXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmluc2VydEl0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdFwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdC5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5lZGl0VHJlZXZpZXdJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG5cIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG5cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG4uY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuYWRkVHJlZXZpZXdJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHJlZXZpZXdFeHBhbmRDb2xhcHNlKGVsZW06IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcudHJlZXZpZXdFeHBhbmRDb2xhcHNlXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAkKGVsZW0pLmF0dHIoXCJkYXRhLXRvb2dsZWVsZW1lbnRzaWRcIik7XHJcbiAgICAgICAgbGV0IGNvbGxhcHNlSXRlbXMgPSAkKGVsZW0pLmhhc0NsYXNzKFwic2FvcC1pbWctZG93blwiKTtcclxuXHJcbiAgICAgICAgJChlbGVtKS50b2dnbGVDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgJChlbGVtKS50b2dnbGVDbGFzcyhcInNhb3AtaW1nLXJpZ2h0XCIpO1xyXG5cclxuICAgICAgICAvLyBzaG93L2hpZGVcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyW2RhdGEtcGFyZW50aWQ9J1wiICsgaWQgKyBcIiddXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4OiBudW1iZXIsIGNoaWxkRWxlbTogYW55KSB7XHJcbiAgICAgICAgICAgIGlmIChjb2xsYXBzZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAkKGNoaWxkRWxlbSkuaGlkZShcImZhc3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKGNoaWxkRWxlbSkuc2hvdyhcImZhc3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWxldGVUcmVldmlld0l0ZW0oZWxlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmRlbGV0ZVRyZWV2aWV3SXRlbVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgZGVsZXRlVGl0bGUgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQnJpc2FuamVcIik7XHJcbiAgICAgICAgbGV0IGRlbGV0ZU1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgZWxlbWVudD9cIik7XHJcblxyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyhudWxsKTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5vblllcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50IHoga2xhc29tIHNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXIgaW4gZ2Egb2RzdHJhbmltbyB0ZXIgdnNlIGNoaWxkcmVlblxyXG4gICAgICAgICAgICBsZXQgdGVtcEVsZW1lbnQgPSBlbGVtO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50aWQgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50aWQgPSBnbG9iYWwuY29udmVydFN0cmluZzJOdW1iZXIodGVtcEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYXJlbnRpZFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2RzdHJhbmltbyBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcEVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjsgXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0ZW1wRWxlbWVudCA9IHRlbXBFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmVudGlkICE9IG51bGwgJiYgcGFyZW50aWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbGkgamUgc2Uga2FqIG9zdGFsaWggY2hpbGQgZWxlbWVudG92IHogaXN0aW0gcGFyZW50SWQ/XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZWVuQ291bnQgPSAkKF90aGlzLl92aWV3SWQgKyAnIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyW2RhdGEtcGFyZW50aWQ9XCInICsgcGFyZW50aWQgKyAnXCJdJykubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVlbkNvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB6YnJpc2FsaSB6YWRuamVnYSBjaGlsZCBlbGVtZW50LCBza3JpamVtbyBleHBhbmQvY29sbGFwc2UgaWtvbm8gcGFyZW50IGVsZW1lbnRhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSAkKF90aGlzLl92aWV3SWQgKyAnIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW1bZGF0YS1pZD1cIicgKyBwYXJlbnRpZCArICdcIl0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRDb2xsYXBzZUVsZW0gPSAkKHBhcmVudEVsZW1lbnQpLmZpbmQoXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZENvbGxhcHNlRWxlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRDb2xsYXBzZUVsZW0uaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5TaG93KGRlbGV0ZU1lc3NhZ2UsIGRlbGV0ZVRpdGxlLCAxLCBbU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcywgU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRUcmVldmlld1N1Ykl0ZW0oYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld1N1Ykl0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIHByaWthemVtbyBleHBhbmQvY29sbGFwc2UgaWtvbm86XHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBpbWEga2xhcyBzYW9wLXRyZWV2aWV3LWl0ZW0taW5mbyxcclxuICAgICAgICBsZXQgcGFyZW50RWxlbSA9IGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtLmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdHJlZXZpZXctaXRlbS1pbmZvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwb2lzY2VtbyBuamVnb3YgY2hpbGQsIGtpIGltYSBrbGFzIHNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcclxuICAgICAgICAgICAgICAgIGxldCBleHBhbmRDb2xsYXBzZUVsZW0gPSAkKHBhcmVudEVsZW0pLmZpbmQoXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChleHBhbmRDb2xsYXBzZUVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlRWxlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtID0gcGFyZW50RWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9pc2NpIG1heCBJZCBUcmVldmlld3MgaW4gZ2EgcG92ZWNhbW8gemEgMVxyXG4gICAgICAgIGxldCBuZXdTdWJJdGVtSWQgPSB0aGlzLmdldE1heFRyZWV2aWV3SWQoKSArIDE7XHJcbiAgICAgICAgLy8gcGFyZW50IElkXHJcbiAgICAgICAgbGV0IG5ld1N1Ykl0ZW1QYXJlbnRJZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcigkKGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50KS5hdHRyKFwiZGF0YS1wYXJlbnRpZFwiKSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkVHJlZXZpZXdTdWJJdGVtRXh0ZXJuYWwoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQsIG5ld1N1Ykl0ZW1JZCwgbmV3U3ViSXRlbVBhcmVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1heFRyZWV2aWV3SWQoKTogbnVtYmVyIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmdldE1heFRyZWV2aWV3SWRcIik7XHJcblxyXG4gICAgICAgIGxldCBtYXhJZCA9IDBcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAuc2FvcC10cmVldmlldy1pdGVtXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBodG1sVHJlZXZpZXdJdGVtKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcihodG1sVHJlZXZpZXdJdGVtLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikpO1xyXG4gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCA+IG1heElkKSB7XHJcbiAgICAgICAgICAgICAgICBtYXhJZCA9IGlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXhJZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdTdWJJdGVtRXh0ZXJuYWwoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBuZXdTdWJJdGVtSWQ6IG51bWJlciwgbmV3U3ViSXRlbVBhcmVudElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3U3ViSXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG1ldG9kbyB1cG9yYWJsamEgY2xpZW50LCB2cm5lIGNvbnRlbnQsIGtpIGpvIGRvZGFtbyB2IHRyZWV2aWV3XHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdTdWJJdGVtQ29udGVudChhZGRTdWJJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld1N1Ykl0ZW1JZDogbnVtYmVyLCBuZXdTdWJJdGVtUGFyZW50SWQ6IG51bWJlciwgaHRtbENvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdTdWJJdGVtQ29udGVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1QYXJlbnQgPSAkKHRoaXMuX3ZpZXdJZCArICcgZGl2LnNhb3AtdHJlZXZpZXctaXRlbVtkYXRhLWlkPVwiJyArIG5ld1N1Ykl0ZW1QYXJlbnRJZCArICdcIl0nKTtcclxuICAgICAgICBlbGVtUGFyZW50LmFwcGVuZChodG1sQ29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRUcmVldmlld0l0ZW0oYWRkSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld0l0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjaSBtYXggSWQgVHJlZXZpZXdzIGluIGdhIHBvdmVjYW1vIHphIDFcclxuICAgICAgICBsZXQgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXhUcmVldmlld0lkKCkgKyAxO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFRyZWV2aWV3SXRlbUV4dGVybmFsKGFkZEl0ZW1CdXR0b25FbGVtZW50LCBuZXdJdGVtSWQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRUcmVldmlld0l0ZW1FeHRlcm5hbChhZGRJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld0l0ZW1JZDogbnVtYmVyLCBuZXdJdGVtUGFyZW50SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWV0b2RvIHVwb3JhYmxqYSBjbGllbnQsIHZybmUgY29udGVudCwga2kgam8gZG9kYW1vIHYgdHJlZXZpZXdcclxuICAgIHB1YmxpYyBhZGRUcmVldmlld0l0ZW1Db250ZW50KGFkZEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyLCBodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld0l0ZW1Db250ZW50XCIpO1xyXG5cclxuICAgICAgICAvLyBvZHN0cmFuaW1vIGFkZCBpdGVtIGh0bWwsIGtlciBnYSBibyB6ZSBkb2RhbCBodG1sQ29udGVudFxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtdHJlZXZpZXctYWRkLWl0ZW0tY29udGFpbmVyXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBodG1sVHJlZXZpZXdBZGRJdGVtKSB7XHJcbiAgICAgICAgICAgIGh0bWxUcmVldmlld0FkZEl0ZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBlbGVtUGFyZW50ID0gJCh0aGlzLl92aWV3SWQpO1xyXG4gICAgICAgIGVsZW1QYXJlbnQuYXBwZW5kKGh0bWxDb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVkaXRUcmVldmlld0l0ZW0oZWxlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmVkaXRUcmVldmlld0l0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIG9kc3RyYW5pbW8gY3NzIGtsYXMgemEgb2Jyb2JvIHZzZW0gZWxlbWVudG9tIGluIGpvIGRvZGFtbyBpemJyYW5lbXVcclxuICAgICAgICB0aGlzLmNsZWFyVHJlZXZpZXdJdGVtc1NlbGVjdGVkQ3NzKCk7XHJcbiAgICAgICAgJChlbGVtKS5hZGRDbGFzcyhcInNhb3AtdHJlZXZpZXctaXRlbS1zZWxlY3RlZFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWwoZWxlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gemEgZXh0ZXJubyB1cG9yYWJvXHJcbiAgICBwdWJsaWMgZWRpdFRyZWV2aWV3SXRlbUV4dGVybmFsKGVsZW06IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5lZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyVHJlZXZpZXdJdGVtc1NlbGVjdGVkQ3NzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuY2xlYXJUcmVldmlld0l0ZW1zU2VsZWN0ZWRDc3NcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtdHJlZXZpZXctaXRlbS1pbmZvXCIpLnJlbW92ZUNsYXNzKFwic2FvcC10cmVldmlldy1pdGVtLXNlbGVjdGVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVsZW0gamUgaXN0aSBrb3QgZ2EgcG9udWphIGVkaXRUcmVldmlld0l0ZW0gb3ouIGVkaXRUcmVldmlld0l0ZW1FeHRlcm5hbFxyXG4gICAgcHVibGljIHJlZnJlc2hUcmVldmlld0l0ZW1IZWFkZXIoZWxlbTogSFRNTEVsZW1lbnQsIGhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5yZWZyZXNoVHJlZXZpZXdJdGVtSGVhZGVyXCIpO1xyXG5cclxuICAgICAgICAkKGVsZW0pLmZpbmQoXCIuc2FvcC10cmVldmlldy1pdGVtLWhlYWRlclwiKS50ZXh0KGhlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbnNlcnRJdGVtKGluc2VydEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5zZXJ0SXRlbVwiKTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBpbWEga2xhcyBzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyLFxyXG4gICAgICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgbGV0IHBhcmVudEVsZW0gPSBpbnNlcnRJdGVtQnV0dG9uRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtID0gcGFyZW50RWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudEZvdW5kKSB7XHJcbiAgICAgICAgICAgIC8vIHBvaXNjaSBtYXggSWQgVHJlZXZpZXdzIGluIGdhIHBvdmVjYW1vIHphIDFcclxuICAgICAgICAgICAgbGV0IG5ld0l0ZW1JZCA9IHRoaXMuZ2V0TWF4VHJlZXZpZXdJZCgpICsgMTtcclxuICAgICAgICAgICAgLy8gcGFyZW50SWRcclxuICAgICAgICAgICAgbGV0IG5ld0l0ZW1QYXJlbnRJZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcigkKHBhcmVudEVsZW0pLmF0dHIoXCJkYXRhLXBhcmVudGlkXCIpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VHJlZXZpZXdJdGVtRXh0ZXJuYWwocGFyZW50RWxlbSwgbmV3SXRlbUlkLCBuZXdJdGVtUGFyZW50SWQpO1xyXG4gICAgICAgIH0gICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5zZXJ0VHJlZXZpZXdJdGVtRXh0ZXJuYWwoaXRlbVRvQXBwZW5kVG86IEhUTUxFbGVtZW50LCBuZXdJdGVtSWQ6IG51bWJlciwgbmV3SXRlbVBhcmVudElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3Lmluc2VydFRyZWV2aWV3SXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbnNlcnRUcmVldmlld0l0ZW1Db250ZW50KGl0ZW1Ub0FwcGVuZFRvOiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyLCBodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbnNlcnRUcmVldmlld0l0ZW1Db250ZW50XCIpO1xyXG5cclxuICAgICAgICAkKGl0ZW1Ub0FwcGVuZFRvKS5hZnRlcihodG1sQ29udGVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld1NwaW5uZXIge1xyXG5cclxuICBnZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklkOiBzdHJpbmcgPSAnI3Nhb3BMb2FkaW5nJyk6IHN0cmluZyB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZ2VuZXJhdGVTcGlubmVyRGl2IFwiICsgc3Bpbm5lcklkKTtcclxuICAgIGxldCBzcGlubnJEaXYgPVxyXG4gICAgICAnPGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwiXCI+ICdcclxuICAgICAgKyAnXHQ8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdTcGlubmVyQmFja2dyb3VuZ1wiIGNsYXNzPVwic3Bpbm5lci1iYWNrZ3JvdW5kIFwiLz4gJ1xyXG4gICAgICArICdcdDxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1NwaW5uZXJcIiBjbGFzcz1cInNwaW5uZXIgc3Bpbm5lci1jZW50ZXItZGFzaGJvYXJkU2lkZWJhcnJcIj4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdDwvZGl2PiAnXHJcbiAgICAgICsgJzwvZGl2PiAnO1xyXG5cclxuICAgIHJldHVybiBzcGlubnJEaXY7XHJcbiAgfVxyXG5cclxuICBzaG93TG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1wiKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd0xvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAgIHZhciBvYmogPSAkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAob2JqLmxlbmd0aCkge1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2hvdy4uLiBcIik7XHJcbiAgICAgIG9iai5zaG93KCk7XHJcbiAgICAgIC8vc2V0TW9kYWxGb3JtWkluZGV4KGVsZW1lbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoaWRlTG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1wiKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaGlkZUxvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAgIHZhciBvYmogPSAkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAob2JqLmxlbmd0aClcclxuICAgICAgb2JqLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIC8vIHNob3dMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAvLyAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93TG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gIC8vICAgaWYgKCFpc0VtcHR5KGVsZW1lbnRJZCkpIHtcclxuICAvLyAgICAgbGV0IGVsZW1lbnREaXYgPSAkKGVsZW1lbnRJZCk7XHJcbiAgLy8gICAgIGlmIChlbGVtZW50RGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVySUQgPSBlbGVtZW50SWQgKyBcIkxvYWRpbmdcIjtcclxuICAvLyAgICAgICBzcGlubmVySUQgPSBzcGlubmVySUQucmVwbGFjZShcIiNcIixcIlwiKTtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICBpZiAoIXNwaW5uZXJEaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICBsZXQgX2RpdiA9IHRoaXMuZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgICBlbGVtZW50RGl2LmFwcGVuZChfZGl2KTtcclxuICAvLyAgICAgICAgIHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHNwaW5uZXJEaXYuc2hvdygpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBoaWRlTG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaGlkZUxvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAvLyAgIGlmICghaXNFbXB0eShlbGVtZW50SWQpKSB7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50RGl2ID0gJChlbGVtZW50SWQpO1xyXG4gIC8vICAgICBpZiAoZWxlbWVudERpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lcklEID0gZWxlbWVudElkICsgXCJMb2FkaW5nXCI7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgaWYgKCFzcGlubmVyRGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgZWxlbWVudERpdi5hcHBlbmQodGhpcy5nZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklEKSk7XHJcbiAgLy8gICAgICAgICBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBzcGlubmVyRGl2LmhpZGUoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvLyAvL1xyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcidcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyB7XHJcbiAgYWN0aW9uOnN0cmluZztcclxuICBhc3luYz86Ym9vbGVhblxyXG4gIHR5cGU/OnN0cmluZztcclxuICBkYXRhPzphbnk7XHJcbiAgc3Bpbm5lckRpdklkPzpzdHJpbmc7XHJcbiAgLy8gY29udGVudFR5cGU/OiBzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZDtcclxuICAvLyBkYXRhVHlwZT86ICd4bWwnIHwgJ2h0bWwnIHwgJ3NjcmlwdCcgfCAnanNvbicgfCAnanNvbnAnIHwgJ3RleHQnIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHByb2Nlc3NEYXRhPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB7XHJcbiAgc3VjY2VzcyA9IDFcclxuICAsIGVycm9yID0gMlxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUge1xyXG4gIG9rID0gMjAwLFxyXG4gIHVuYXV0aG9yaXplZCA9IDQwMSxcclxuICBpbnRlcm5hbFNlcnZlckVycm9yID0gNTAwXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICByZXNwb25zZTogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdDtcclxuICBkYXRhOiBhbnk7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBzeW5jRGVsYXkobWlsbGlzZWNvbmRzOmFueSl7XHJcbi8vICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgdmFyIGVuZD0wO1xyXG4vLyAgIHdoaWxlKCAoZW5kLXN0YXJ0KSA8IG1pbGxpc2Vjb25kcyl7XHJcbi8vICAgICAgIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4vLyAgIH1cclxuLy8gIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VydmljZXNDb3JlIHtcclxuICBwcml2YXRlIF9zYW9wVmlld1NwaW5uZXI6U2FvcFZpZXdTcGlubmVyID0gbmV3IFNhb3BWaWV3U3Bpbm5lcigpO1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcztcclxuICAvLyAgXHJcbiAgLy9wdWJsaWMgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgICB0aGlzLl9kZWZhdWx0UGFyYW1zID0ge1xyXG4gICAgICBhY3Rpb246XCJcIlxyXG4gICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICxhc3luYzp0cnVlXHJcbiAgICAgICxkYXRhOm51bGxcclxuICAgICAgLHNwaW5uZXJEaXZJZDpcIlwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRvbmUocmVzdWx0OmFueSl7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5vbkRvbmVcIik7XHJcbiAgICB0aGlzLmFmdGVyRG9uZShyZXN1bHQpO1xyXG4gICAgLy90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHRoaXMuX3BhcmFtcy5zcGlubmVyRGl2SWQpOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJEb25lKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmVcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25TdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5zdWNjZXNzXCIpO1xyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWNjZXNzID09PSBcInVuZGVmaW5lZFwiIHx8IHJlc3VsdC5zdWNjZXNzID09PSBudWxsKSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfcmVzdWx0LnJlc3BvbnNlID0gcmVzdWx0LnN1Y2Nlc3MgPT0gdHJ1ZSA/IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcyA6IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJTdWNjZXNzKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJTdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25FcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuZXJyb3JcIik7XHJcbiAgICBcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgLy8gcmVkaXJlY3QgdG8gbG9naW5cclxuICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS5pbnRlcm5hbFNlcnZlckVycm9yICYmICFnbG9iYWwuaXNVbkRlZmluZWQocmVzdWx0LnJlc3BvbnNlVGV4dCkpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBfcmVzdWx0LnJlc3BvbnNlID0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcjtcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJFcnJvcihfcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIGFmdGVyRXJyb3IocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2Vzc1wiKTtcclxuICB9IFxyXG5cclxuICBFeGVjdXRlQWN0aW9uKHBhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zKTp2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb25cIik7XHJcbiAgICBsZXQgb3B0aW9ucyA9IHsgLi4udGhpcy5fZGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XHJcbiAgICBwYXJhbXMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBfYWpheEFjdGlvbiA9IGdsb2JhbC5nZXRTaXRlQWJzb2x1dGVVUkwocGFyYW1zLmFjdGlvbik7XHJcblxyXG4gICAgLy9AVXJsLkFjdGlvbihcImNyZWFyQ2FtcE1hbnVhbFwiLCBcIkRQU1wiKVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcclxuICAgICAgICB1cmw6IF9hamF4QWN0aW9uLFxyXG4gICAgICAgIHR5cGU6ICFnbG9iYWwuaXNFbXB0eShwYXJhbXMudHlwZSkgPyBwYXJhbXMudHlwZSA6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIC8vIGNvbnRlbnRUeXBlOiBwYXJhbXMuY29udGVudFR5cGUgPT0gbnVsbCA/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIDogcGFyYW1zLmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIC8vIGRhdGFUeXBlOiBwYXJhbXMudHlwZSA9PSBudWxsID8gJ0ludGVsbGlnZW50IEd1ZXNzICh4bWwsIGpzb24sIHNjcmlwdCwgb3IgaHRtbCknIDogcGFyYW1zLnR5cGUsICBcclxuICAgICAgICAvLyBwcm9jZXNzRGF0YSA6IHBhcmFtcy5wcm9jZXNzRGF0YSA9PSBudWxsID8gdHJ1ZSA6IHBhcmFtcy5wcm9jZXNzRGF0YSwgXHJcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLnNob3dMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLmhpZGVMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBzdWNjZXNzOiB0aGlzLm9uU3VjY2Vzcy5iaW5kKF90aGlzKSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH0gICAgXHJcblxyXG4gIFxyXG4gIH1cclxuXHJcbiAgRXhlY3V0ZUJsb2JBY3Rpb24ocGFyYW1zOiBTYW9wU2VydmljZXNDb3JlUGFyYW1zKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQmxvYkFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2xvYmFsLmdldFNpdGVBYnNvbHV0ZVVSTChwYXJhbXMuYWN0aW9uKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgIHVybDogX2FqYXhBY3Rpb24sXHJcbiAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXHJcbiAgICAgICAgeGhyRmllbGRzOiB7XHJcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyAvLyB0byBhdm9pZCBiaW5hcnkgZGF0YSBiZWluZyBtYW5nbGVkIG9uIGNoYXJzZXQgY29udmVyc2lvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGJsb2IsIHN0YXR1cywgeGhyKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIGZpbGVuYW1lXHJcbiAgICAgICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciBkaXNwb3NpdGlvbiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoZGlzcG9zaXRpb24gJiYgZGlzcG9zaXRpb24uaW5kZXhPZignYXR0YWNobWVudCcpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gZmlsZW5hbWVSZWdleC5leGVjKGRpc3Bvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9pZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy8gICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxyXG4gICAgICAgICAgICAvLyAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAvL30gZWxzZVxyXG4gICAgICAgICAgICAvL3tcclxuICAgICAgICAgICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcclxuICAgICAgICAgICAgdmFyIGRvd25sb2FkVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXHJcbiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhLmRvd25sb2FkID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKGRvd25sb2FkVXJsKTsgfSwgMTAwKTsgLy8gY2xlYW51cFxyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiB0aGlzLm9uRXJyb3IuYmluZChfdGhpcylcclxuICAgICAgICB9KS5kb25lKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgICAgX3RoaXMub25Eb25lKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgcHVibGljIGhhbmRsZVN1Ym1pdEVycm9yKHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkhhbmRsZVN1Ym1pdEVycm9yXCIpO1xyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLnVuYXV0aG9yaXplZCkge1xyXG4gICAgICAgIHRoaXMudW5BdXRob3JpemVkUmVkaXJlY3RUb0xvZ2luUGFnZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXNwbGF5IGVycm9yXHJcbiAgICBjb25zb2xlLmxvZyhcInJlc3BvbnNlXCIsIHJlc3BvbnNlKTtcclxuICAgIGFsZXJ0KHJlc3BvbnNlLnN0YXR1c1RleHQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5yZWRpcmVjdFRvTG9naW5QYWdlXCIpO1xyXG5cclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICB9XHJcbiBcclxuICAvL1xyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvbiB7XHJcbiAgcHVibGljIGtleTogc3RyaW5nID0gXCIjXCI7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uOiBzdHJpbmcgPSBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9ucyB7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uc0xpc3Q6W1Nhb3BUcmFuc2xhdGlvbj9dID0gW107XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXMge1xyXG4gIGNvbnRyb2xsZXI6c3RyaW5nLFxyXG4gIGFjdGlvbjpzdHJpbmcsXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfcGFyYW1zOlNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXM7XHJcbiAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAvL1xyXG4gIHB1YmxpYyBfdGVybWlub2xvZ3k6U2FvcFRyYW5zbGF0aW9ucztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zID0gbnVsbCl7XHJcbiAgICBpZighZ2xvYmFsLmlzVW5EZWZpbmVkKHBhcmFtcykpe1xyXG4gICAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wYXJhbXMgPSB7Y29udHJvbGxlcjpcIlRyYW5zbGF0aW9uXCIsYWN0aW9uOlwiR2V0VHJhbnNsYXRpb25zXCJ9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gbmV3IFNhb3BUcmFuc2xhdGlvbnMoKTtcclxuICB9XHJcbiAgXHJcbiAgc2V0VHJhbnNsYXRpb25zTGlzdCh0cmFuc2xhdGlvbnM6c3RyaW5nW10pOmFueXtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0cmFuc2xhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgX3RoaXMuX3Rlcm1pbm9sb2d5LnRyYW5zbGF0aW9uc0xpc3QucHVzaCh7a2V5OnZhbHVlLHRyYW5zbGF0aW9uOnZhbHVlfSk7ICBcclxuICAgIH0pOyAgIFxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25zKHRoaXMuX3Rlcm1pbm9sb2d5KTtcclxuICB9XHJcblxyXG4gIGdldFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6U2FvcFRyYW5zbGF0aW9ucyk6YW55e1xyXG4gICAgbGV0IGpzb25EYXRhID0gSlNPTi5zdHJpbmdpZnkodHJhbnNsYXRpb25zKTtcclxuICAgIGxldCBfZGF0YSA9IHtqc29uSW5wdXQ6anNvbkRhdGF9O1xyXG4gICAgbGV0IF9yZXNwb25zZTphbnk7XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICBfcmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgIH07XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgIGFjdGlvbjogdGhpcy5fcGFyYW1zLmNvbnRyb2xsZXIrXCIvXCIrdGhpcy5fcGFyYW1zLmFjdGlvbitcIlwiXHJcbiAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAsIGFzeW5jOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0ID0gX3Jlc3BvbnNlLnRyYW5zbGF0aW9uc0xpc3Q7XHJcbiAgICByZXR1cm4gX3Jlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlKGtleTpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCBfdHIgPSB0aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0LmZpbmQoZSA9PiBlLmtleSA9PSBrZXkpIGFzIGFueTtcclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX3RyKSkgeyBcclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBfdHIudHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvdHlwaW5ncy5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVXRpbHMge1xyXG4gICAgY2hlY2tDb21wYXRpYmlsaXR5KCk6Ym9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIFNhb3BDb21tb24uY2hlY2tDb21wYXRpYmlsaXR5KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUsU2FvcFNlcnZpY2VzQ29yZVBhcmFtcywgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlLCBTYW9wU2VydmljZXNDb3JlUmVzdWx0IH0gZnJvbSAnLi9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnJztcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQge1Nhb3BGbG9hdGluZ0xhYmVsIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFcnJvciB7XHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFdmQWN0aW9uIHtcclxuICAgIHdmYU5vbmUgPSAwXHJcbiAgICAsd2ZhQWRkUmVjb3JkID0gMVxyXG4gICAgLHdmYUVkaXRSZWNvcmQgPSAyXHJcbiAgICAsd2ZhRGVsZXRlUmVjb3JkID0gM1xyXG4gICAgLHdmYVJlY29yZERlc3RhaWxzID0gNFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZlN1Ym1pdFJlc3VsdCB7XHJcbiAgICBzdWNjZXNzOmJvb2xlYW47XHJcbiAgICB2aWV3Q29udGVudDpzdHJpbmc7XHJcbiAgICByZWRpcmVjdFRvOnN0cmluZztcclxuICAgIGFsZXJ0TWVzc2FnZTpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsRnJhbWU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RhbEJvZHk6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfdGl0bGU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuT2s6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuQ2FuY2VsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlc1BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zID0ge2FjdGlvbjpudWxsLGRhdGE6bnVsbCx0eXBlOlwiUE9TVFwifTtcclxuICAgIHByaXZhdGUgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIHNhb3BTZXJ2aWNlc0NvcmU6U2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TZXJ2aWNlOlNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwdWJsaWMgY29udGVudEVsZW1lbnRJZCA9IFwiLnNhb3AtbW9kYWwtYm9keS1lbGVtZW50XCI7XHJcbiAgICBwdWJsaWMgYWRkUmVjb3JkRW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgZWRpdFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGRlbGV0ZVJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG1hbnVhbGx5U3VibWl0RW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgc2FvcEZsb2F0aW5nTGFiZWw6IFNhb3BGbG9hdGluZ0xhYmVsO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBvblN1Y2NjZXNzQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgb25FcnJvckNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRmFpbHVyZUNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLy8gICAgXHJcbiAgICBwdWJsaWMgaWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIHRpdGxlOnN0cmluZztcclxuICAgIHB1YmxpYyBmdWxsU2NyZWVuOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25DbG9zZTogKHBhcmFtczphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25TdWJtaXQ6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uRXJyb3I6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFZpZXdGb3JtLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ2aWV3SWQ6XCIrdmlld0lkKTtcclxuICAgICAgICB0aGlzLmlkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrID0gbGliTmFtZStcIi5vblN1Ym1pdFN1Y2Nlc3MoZGF0YSxcIitsaWJOYW1lK1wiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRXJyb3JDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEVycm9yKGRhdGEsXCIgKyBsaWJOYW1lICsgXCIpO1wiO1xyXG4gICAgICAgIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRGYWlsdXJlKHhocixcIiArIGxpYk5hbWUgKyBcIik7XCI7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwgPSBuZXcgU2FvcEZsb2F0aW5nTGFiZWwoKTtcclxuICAgICAgICAvLyAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5OiBzdHJpbmdbXSA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXJtaW5vbG9neSA9IFtcIlVyZWRpXCIsXCJOb3Ygdm5vc1wiLFwiUG9kcm9ibm9zdGlcIixcIkJyaXNhbmplXCJdO1xyXG4gICAgICAgIGlmIChkaWN0aW9uYXJ5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGVybWlub2xvZ3kgPSB0aGlzLl90ZXJtaW5vbG9neS5jb25jYXQoZGljdGlvbmFyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGhpcy5fdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJ0bk9rQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5Pa0NsaWNrLi4uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJ0bkNhbmNlbChzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkJ0bkNhbmNlbC4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmVmb3JlVmlld1Nob3coc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQrXCIuYmVmb3JlVmlld1Nob3coKVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUgPSAkKHRoaXMuaWQpO1xyXG4gICAgICAgIGlmICh0aGlzLl92aWV3TW9kYWxGcmFtZSA9PSBudWxsKSB7IGNvbnNvbGUubG9nKHRoaXMuaWQrXCIgbm90IGZvdW5kIVwiKTt9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdmFyIGNvbnRlbnRTZWwgPSB0aGlzLmlkICsgXCIgXCIgKyB0aGlzLmNvbnRlbnRFbGVtZW50SWQ7XHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsQm9keSA9ICQoY29udGVudFNlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyVmlld1Nob3coc2VuZGVyOmFueSx3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24pOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkK1wiLmFmdGVyVmlld1Nob3coKVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2sgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYnRuT2tcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld19idG5DYW5jZWwgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYnRuQ2FuY2VsXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjZXhhbXBsZU1vZGFsTG9uZ1RpdGxlXCIpO1xyXG4gICAgICAgIC8vXHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlclZpZXdTaG93IHRpdGxlOlwiKyB0aGlzLnRpdGxlKTtcclxuXHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eSh0aGlzLnRpdGxlKSl7XHJcbiAgICAgICAgICAgIGxldCBfdGl0bGUgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOb3Ygdm5vc1wiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJVcmVkaVwiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG9kcm9ibm9zdGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlclZpZXdTaG93IF90aXRsZTpcIisgX3RpdGxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChfdGl0bGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkKXtcclxuICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0VGl0bGVBZGQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYWRkVGl0bGVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChkZWZhdWx0VGl0bGVBZGQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRUaXRsZUVkaXQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjZWRpdFRpdGxlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoZGVmYXVsdFRpdGxlRWRpdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmlld1Nob3dDb21wbGV0ZShzZW5kZXIsIHdmQWN0aW9uKTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmJpbmRCdXR0b25zKHNlbmRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICBnbG9iYWwuc2V0TW9kYWxGb3JtWkluZGV4KHRoaXMuaWQpO1xyXG4gICAgICAgIGdsb2JhbC5zZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyh0aGlzLmlkKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd0NvbXBsZXRlKHNlbmRlcjogYW55LCB3ZkFjdGlvbjogU2FvcFdmQWN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIudmlld1Nob3dDb21wbGV0ZSgpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZEJ1dHRvbnMoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYmluZEJ1dHRvbnNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5PayA9ICQoXCJcIiArIHRoaXMuaWQgKyBcIiAqPiAjYnRuT2tcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld19idG5Pay5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5Pa0NsaWNrKHNlbmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbCA9ICQoXCJcIiArIHRoaXMuaWQgKyBcIiAqPiAjYnRuQ2FuY2VsXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bkNhbmNlbChzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmluZFZpZXdFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRWaWV3RXZlbnRzXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGl2Rm9ybSA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCJmb3JtXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LXN1Y2Nlc3NcIiwgdGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vbkVycm9yQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWVycm9yXCIsIHRoaXMub25FcnJvckNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWZhaWx1cmVcIiwgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuaW5pdCgpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJFcnJvcnNCYW5uZXIoZXJyb3JzOkVycm9yW10pOlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2U7XHJcbiAgICAgICAgcmVzdWx0ID0ge3Jlc3BvbnNlOlNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3IsZGF0YTpudWxsfTsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShlcnJvcnMpO1xyXG4gICAgICAgIGxldCBfZGF0YSA9IHtqc29uSW5wdXQ6anNvbkRhdGF9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkVycm9ycy9SZW5kZXJFcnJvcnNCYW5uZXJcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVuZGVyRXJyb3IoZXJyTWVzc2FnZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFqYXguYWZ0ZXJFcnJvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9lcnJvcnM6RXJyb3JbXTtcclxuICAgICAgICAgICAgX2Vycm9ycyA9IFt7Q29kZTpcIlwiLE1lc3NhZ2U6ZXJyTWVzc2FnZX1dO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IF9wYXJlbnRWaWV3ID0gJCh0aGlzLmlkKS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBfZXJyb3JCYW5uZXJJZCA9IHRoaXMuaWQrXCJFcnJvckJhbm5lclwiO1xyXG4gICAgICAgICAgICAvL2xldCBfdmlld19iYW5uZXIgPSB0aGlzLl92aWV3TW9kYWxCb2R5LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBsZXQgX3ZpZXdfYmFubmVyID0gX3BhcmVudFZpZXcuZmluZChfZXJyb3JCYW5uZXJJZCk7XHJcbiAgICAgICAgICAgIGlmICggZ2xvYmFsLmlzVW5EZWZpbmVkKF92aWV3X2Jhbm5lcikgfHwgX3ZpZXdfYmFubmVyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBfdmlld19iYW5uZXIgPSBfcGFyZW50Vmlldy5hcHBlbmQoXCI8ZGl2IGlkPVwiK19lcnJvckJhbm5lcklkK1wiPjwvZGl2PlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgX2Jhbm5lclJlc3VsdCA9IHRoaXMucmVuZGVyRXJyb3JzQmFubmVyKF9lcnJvcnMpO1xyXG4gICAgICAgICAgICBfdmlld19iYW5uZXIuaHRtbChfYmFubmVyUmVzdWx0LmRhdGEudmlld0NvbnRlbnQpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2goZXJyKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICB9ICBcclxuICAgIH1cclxuICAgIC8vcHVibGljIGxvYWRWaWV3Qm9keSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSk6U2FvcFNlcnZpY2VzQ29yZVJlc3VsdHtcclxuICAgIHB1YmxpYyBsb2FkVmlld0JvZHkod2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxvYWRWaWV3Qm9keVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuYmVmb3JlVmlld1Nob3coc2VuZGVyKTtcclxuXHJcbiAgICAgICAgbGV0IF9hamF4QWN0aW9uID0gd2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCA/IHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgOiB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludDtcclxuICAgICAgICAvL19hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKF9hamF4QWN0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOl9hamF4QWN0aW9uLGRhdGE6ZGF0YSx0eXBlOlwiUE9TVFwifTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgICAgICAgICAgaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5zdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChfYWpheFJlc3VsdC5kYXRhKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyVmlld1Nob3coc2VuZGVyLHdmQWN0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKChnbG9iYWwuaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YSkgJiYgZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKSkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04gJiYgX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04ubWVzc2FnZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyRXJyb3IgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbi8vIyMjXHJcbiAgICAgICAgICAgIGlmICgoZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSkpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRTdWNjZXNzQ29tcGxldGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RXJyb3IocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RXJyb3JcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RmFpbHVyZShyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRGYWlsdXJlXCIpO1xyXG4gICAgICAgIHZhciBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmhhbmRsZVN1Ym1pdEVycm9yKHJlc3VsdCk7XHJcbiAgICB9XHJcbiBcclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3MocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uRXhlY3V0ZVN1Y2Nlc3NcIik7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuc3VjY2Vzc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdoaWRlJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3VsdC5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5vblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWxvYWQgdmlldyBmb3JtXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb250ZW50KHJlc3VsdC52aWV3Q29udGVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdCk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoQ29udGVudCh2aWV3Q29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsQm9keS5odG1sKHZpZXdDb250ZW50KTtcclxuICAgICAgICB0aGlzLmJpbmRCdXR0b25zKG51bGwpO1xyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFmdGVyUmVmcmVzaENvbnRlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25BZnRlclJlZnJlc2hDb250ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkFmdGVyUmVmcmVzaENvbnRlbnRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRGVsZXRlUmVjb3JkKGRlbGV0ZURhdGE6YW55KTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25EZWxldGVSZWNvcmRcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHthY3Rpb246dGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCxkYXRhOmRlbGV0ZURhdGEsdHlwZTpcIlBPU1RcIn07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIGxldCBfYWpheFJlc3VsdCA9IHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgICAgICAvLyBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoZGVsZXRlRGF0YSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBhbGVydGlmeS5lcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHJldHVybiBfYWpheFJlc3VsdC5yZXNwb25zZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoRGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVjb3JkKHRpdGxlOnN0cmluZyxtZXNzYWdlOnN0cmluZyxkZWxldGVEYXRhOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlUmVjb3JkLmJlZ2luXCIpO1xyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyhkZWxldGVEYXRhKSAgXHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSB0aGlzLm9uRGVsZXRlUmVjb3JkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhtZXNzYWdlLHRpdGxlLDEsW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vXSk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRlbGV0ZVJlY29yZC5lbmRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJlY29yZChkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFkZFJlY29yZFwiKTtcclxuICAgICAgICBsZXQgX3Jlc3VsdCA9IHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0UmVjb3JkKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY29yZERldGFpbHMoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscyxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hbnVhbGx5U3VibWl0KHN1Ym1pdERhdGE6IGFueSwgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm1hbnVhbGx5U3VibWl0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoZ2xvYmFsLmlzRW1wdHkoc3Bpbm5lckRpdklkKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHsgYWN0aW9uOiB0aGlzLm1hbnVhbGx5U3VibWl0RW5kcG9pbnQsIGRhdGE6IHN1Ym1pdERhdGEsIHR5cGU6IFwiUE9TVFwiIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHsgYWN0aW9uOiB0aGlzLm1hbnVhbGx5U3VibWl0RW5kcG9pbnQsIGRhdGE6IHN1Ym1pdERhdGEsIHR5cGU6IFwiUE9TVFwiLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChfYWpheFJlc3VsdCkge1xyXG4gICAgICAgICAgICBfdGhpcy5vblN1Ym1pdFN1Y2Nlc3MoX2FqYXhSZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dWaWV3Rm9ybSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dWaWV3Rm9ybVwiKTtcclxuICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlY29yZChkYXRhLHNlbmRlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKSB7ICBcclxuICAgICAgICAgICAgdGhpcy5yZWNvcmREZXRhaWxzKGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSAgIFxyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7ICAgICAgXHJcbiAgICB9ICBcclxuXHJcbiAgICBwdWJsaWMgU2V0VG9GdWxsU2NyZWVuKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbFNjcmVlbiApe1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5hZGRDbGFzcyhcInNhb3AtbW9kYWwtZnVsbHNjcmVlbi1mb3JtXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2RpYWxvZ0RpdiA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCIubW9kYWwtZGlhbG9nXCIpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUNsYXNzKCdtb2RhbC1kaWFsb2ctY2VudGVyZWQnKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5hZGRDbGFzcygnbW9kYWwtZnVsbHNjcmVlbicpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IF9jb250ZW50ID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcIi5tb2RhbC1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICBfY29udGVudC5yZW1vdmVBdHRyKCdjbGFzcycpO1xyXG4gICAgICAgICAgICBfY29udGVudC5hZGRDbGFzcygnbW9kYWwtY29udGVudCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaEVsZW1lbnREYXRhKGh0bWxDb250ZW50OnN0cmluZyxlbGVtZW50SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hFbGVtZW50RGF0YVwiKTtcclxuICAgICAgICBsZXQgX2RvY3VtZW50ID0gJChodG1sQ29udGVudCk7XHJcbiAgICAgICAgbGV0IF9jZWxsID0gX2RvY3VtZW50LmZpbmQoZWxlbWVudElkKTtcclxuICAgICAgICAkKGVsZW1lbnRJZCkucmVwbGFjZVdpdGgoX2NlbGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgLy8gIFxyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVXRpbHMgfSBmcm9tIFwiLi9Db3JlL3Nhb3AtdXRpbHNcIjtcclxuaW1wb3J0IHsgU2FvcFRvZ2dsZVBhbmVsIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbFwiO1xyXG5pbXBvcnQgeyBTYW9wSW5wdXRNYXNrIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWlucHV0bWFza1wiO1xyXG5pbXBvcnQgeyBTYW9wQ2hlY2tib3hTd2l0Y2ggfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtY2hlY2tib3gtc3dpdGNoXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCAgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyJztcclxuaW1wb3J0IHsgU2FvcFJpZ2h0U2lkZWJhciB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBNZW51U2lkZWJhciB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1tZW51LXNpZGViYXJcIjtcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGdcIjtcclxuaW1wb3J0IHsgU2FvcFBvcHVwRGlhbG9nIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nJ1xyXG5pbXBvcnQgeyBTYW9wRmxvYXRpbmdMYWJlbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1mbG9hdGluZy1sYWJlbFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSAnLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZSc7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZCB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLWdyaWQnO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tICcuL0NvcmUvc2FvcC12aWV3LWZvcm0nO1xyXG5pbXBvcnQgeyBTYW9wVHJlZXZpZXcgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC10cmVldmlldyc7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RpemVTZWxlY3QgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0JztcclxuaW1wb3J0IHsgU2FvcFBkZlByZXZpZXcgIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXBkZi1wcmV2aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BQaW5jaFpvb20gIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZWNob1Rlc3QobXNnOnN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJlY2hvOiBcIittc2cpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb21wYXRpYmlsaXR5KCk6IGJvb2xlYW4ge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNoZWNrQ29tcGF0aWJpbGl0eVwiKTtcclxuICAgIGxldCB1dGlscyA9IG5ldyBTYW9wVXRpbHMoKTtcclxuICAgIHJldHVybiB1dGlscy5jaGVja0NvbXBhdGliaWxpdHkoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDbGllbnRMb2dNb2RlVmFsdWUoKSB7XHJcbiAgICBnbG9iYWwuZGVidWdNb2RlID0gZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaXRlQmFzZVVybFZhbHVlKCkge1xyXG4gICAgZ2xvYmFsLnNpdGVCYXNlVXJsID0gZ2xvYmFsLmdldFNpdGVCYXNlVXJsKClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVTaXRlSlMoKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdGlhbGl6ZVNpdGVKU1wiKTtcclxuICAgIG5ldyBNZW51U2lkZWJhcigpLmluaXQoKTtcclxuICAgIG5ldyBTYW9wVG9nZ2xlUGFuZWwoKS5pbml0KCk7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmFsdEtleSAmJiBlLmtleUNvZGUgPT0gNzkpIHtcclxuICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIE9cclxuICAgICAgICAgICAgZ2xvYmFsLlNldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLmRlYnVnTW9kZSA9IGdsb2JhbC5HZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZ2xvYmFsLnNldEhlbHBMaW5rKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGaXJzdENvbnRyb2xUb0ZvY3VzKGZvcm1JZDogc3RyaW5nKSB7XHJcbiAgICBnbG9iYWwuc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkKTtcclxufVxyXG5cclxuZXhwb3J0IHtnbG9iYWx9O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRvZ2dsZVBhbmVsRXggZXh0ZW5kcyBTYW9wVG9nZ2xlUGFuZWx7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRNYXNrRXggZXh0ZW5kcyBTYW9wSW5wdXRNYXNre307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoZWNrYm94U3dpdGNoRXggZXh0ZW5kcyBTYW9wQ2hlY2tib3hTd2l0Y2h7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTXVsdGlzZWxlY3RFeCBleHRlbmRzIFNhb3BNdWx0aXNlbGVjdHt9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNZXNzYWdlRGxnRXggZXh0ZW5kcyBTYW9wTWVzc2FnZURsZ3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZ0V4IGV4dGVuZHMgU2FvcFBvcHVwRGlhbG9ne307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdTcGlubmVyRVggZXh0ZW5kcyBTYW9wVmlld1NwaW5uZXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSaWdodFNpZGViYXJFeCBleHRlbmRzIFNhb3BSaWdodFNpZGViYXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BGbG9hdGluZ0xhYmVsRXggZXh0ZW5kcyBTYW9wRmxvYXRpbmdMYWJlbCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlcnZpY2VzQ29yZUV4IGV4dGVuZHMgU2FvcFNlcnZpY2VzQ29yZSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uU2VydmljZUV4IGV4dGVuZHMgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWRFeCBleHRlbmRzIFNhb3BXZWJHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm1FeCBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFV0aWxzRXggZXh0ZW5kcyBTYW9wVXRpbHMgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmVldmlld0V4IGV4dGVuZHMgU2FvcFRyZWV2aWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VsZWN0aXplU2VsZWN0RXggZXh0ZW5kcyBTYW9wU2VsZWN0aXplU2VsZWN0IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGRmUHJldmlld0V4IGV4dGVuZHMgU2FvcFBkZlByZXZpZXcge307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBpbmNoWm9vbUV4IGV4dGVuZHMgU2FvcFBpbmNoWm9vbSB7fTtcclxuLy9cclxuIl19"}