{"version":3,"sources":["node_modules/browser-pack/_prelude.js","TypeScripts/Common/saop-common.ts","TypeScripts/Components/saop-checkbox-switch.ts","TypeScripts/Components/saop-floating-label.ts","TypeScripts/Components/saop-grid-edit.ts","TypeScripts/Components/saop-grid-filter.ts","TypeScripts/Components/saop-grid.ts","TypeScripts/Components/saop-input-wfl.ts","TypeScripts/Components/saop-inputmask.ts","TypeScripts/Components/saop-menu-sidebar.ts","TypeScripts/Components/saop-message-dlg.ts","TypeScripts/Components/saop-multiselect.ts","TypeScripts/Components/saop-pdf-preview.ts","TypeScripts/Components/saop-pinch-and-zoom.ts","TypeScripts/Components/saop-popover.ts","TypeScripts/Components/saop-popup-dialog.ts","TypeScripts/Components/saop-right-sidebar.ts","TypeScripts/Components/saop-select-wfl.ts","TypeScripts/Components/saop-selectize-select.ts","TypeScripts/Components/saop-toggle-panel.ts","TypeScripts/Components/saop-treeview.ts","TypeScripts/Components/saop-view-spinner.ts","TypeScripts/Core/saop-services-core.ts","TypeScripts/Core/saop-translate.ts","TypeScripts/Core/saop-utils.ts","TypeScripts/Core/saop-view-form.ts","TypeScripts/main.ts"],"names":[],"mappings":"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","file":"saop_core_bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i\r\n\r\nexport abstract class global {\r\n public static debugMode: boolean;\r\n public static siteBaseUrl: string;\r\n\r\n public static ConsoleLogDegug(message: any): void {\r\n if (this.debugMode) console.log(message);\r\n }\r\n\r\n public static GetClientLogModeStorageKeyValue(): string {\r\n return \"SaopMojInfo.globalClientLogModeVal\";\r\n }\r\n\r\n public static GetClientLogModeStorageValue(): boolean {\r\n let debugModeDefaultValue = false;\r\n\r\n var debugModeStringVal = this.ReadVariableFromStorage(global.GetClientLogModeStorageKeyValue());\r\n\r\n let debugModeVal = debugModeDefaultValue;\r\n if (debugModeStringVal) {\r\n debugModeVal = debugModeStringVal === \"true\" ? true : false;\r\n }\r\n\r\n return debugModeVal;\r\n }\r\n\r\n public static SetClientLogModeStorageValue(): void {\r\n let logMode = this.GetClientLogModeStorageValue();\r\n this.WriteVariableToStorage(global.GetClientLogModeStorageKeyValue(), !logMode);\r\n\r\n alertify.message(\"Client log mode enabled: \" + !logMode);\r\n }\r\n\r\n public static getSiteBaseUrl(): string {\r\n return $(\"#siteBaseUrl\").val() as string;\r\n }\r\n\r\n public static setHelpLink(): void {\r\n //nastavi help link, v odvisnosti od lokalizacije\r\n let _this = this;\r\n let svgHelp: any = document.getElementById('saop-help');\r\n\r\n if(svgHelp != null)\r\n {\r\n let language = svgHelp.getAttribute(\"data-language\");\r\n\r\n //počakamo da se gneszdeni objekt naloži\r\n svgHelp.addEventListener(\"load\", function () {\r\n let svgHelpLink = svgHelp.contentDocument.getElementById(\"saop-help-link\");\r\n if (_this.isUnDefined(svgHelpLink) == false) {\r\n if (language == \"hr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://help.saop.hr/hr/mojinfo\");\r\n }\r\n else if (language == \"sr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://www.saop.rs/icenter/100/uputstva-za-upotrebu/\");\r\n }\r\n else {\r\n svgHelpLink.setAttribute(\"href\", \"https://si-icenter.knowledgeowl.com/help/mojinfo-navodila-za-uporabo-prenovljenega-portala\");\r\n }\r\n }\r\n });\r\n\r\n //zaradi braskalnik - mozilla firefox - izgleda, da je object ''loaded'' preden mu dodamo on loaded\r\n if($('#saop-help-link') != null)\r\n {\r\n const event = new Event('load');\r\n svgHelp.dispatchEvent(event);\r\n }\r\n }\r\n }\r\n\r\n public static formatDate(date: Date, format: string): string {\r\n const to2 = (n: number): string => ((Math.abs(n) < 10 ? '0' : '') + Math.abs(n));\r\n return format.replace(/[ydmh]+/gi, (match: string): string => {\r\n switch (match) {\r\n case 'yyyy': return date.getFullYear().toString();\r\n case 'd': return date.getDate().toString();\r\n case 'dd': return to2(date.getDate());\r\n case 'm': return (date.getMonth() + 1).toString();\r\n case 'mm': return to2(date.getMonth() + 1);\r\n case 'H': return date.getHours().toString();\r\n case 'HH': return to2(date.getHours());\r\n case 'MM': return to2(date.getMinutes());\r\n default:\r\n return match;\r\n }\r\n });\r\n }\r\n\r\n public static convertString2Date(stringDate: string, format: string): Date {\r\n global.ConsoleLogDegug(\"convertString2Date\");\r\n\r\n switch (format) {\r\n case \"dd.mm.yyyy\":\r\n let day = stringDate.substring(0, 2);\r\n let month = stringDate.substring(3, 5);\r\n let year = stringDate.substring(6, 10);\r\n\r\n return new Date(+year, +month - 1, +day);\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n public static convertString2Number(stringVal: string): number {\r\n global.ConsoleLogDegug(\"convertString2Number\");\r\n\r\n let numberVal = parseInt(stringVal)\r\n\r\n if (isNaN(numberVal)) {\r\n return null;\r\n }\r\n\r\n return numberVal;\r\n }\r\n\r\n public static setModalFormZIndex(modalFormId: string): void {\r\n global.ConsoleLogDegug(\"setModalFormZIndex\");\r\n global.ConsoleLogDegug(\"modalFormId:\" + modalFormId);\r\n var zIndex = 1050 + (10 * $('.modal:visible').length);\r\n\r\n $(modalFormId).css('z-index', zIndex);\r\n setTimeout(function () {\r\n $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');\r\n }, 0);\r\n }\r\n\r\n public static isEmpty(str: string) {\r\n return (!str || str.length === 0);\r\n }\r\n\r\n public static isUnDefined(_obj: any) {\r\n return (!_obj || _obj === null || typeof _obj === \"undefined\");\r\n }\r\n\r\n public static ReadVariableFromStorage(variableName: string): string {\r\n return localStorage.getItem(variableName);\r\n }\r\n\r\n public static WriteVariableToStorage(variableName: string, value: any): void {\r\n localStorage.setItem(variableName, value);\r\n }\r\n\r\n public static filterTableRows(filterVal: string, idTableElement: string): void {\r\n global.ConsoleLogDegug(\"filterTableRows\");\r\n\r\n let val = $.trim(filterVal).replace(/ +/g, ' ').toLowerCase();\r\n let rows = $(idTableElement + \" tr:has(td)\");\r\n\r\n rows.show().filter(function () {\r\n var text = $(this).text().replace(/\\s+/g, ' ').toLowerCase();\r\n return !~text.indexOf(val);\r\n }).hide();\r\n }\r\n\r\n public static setFirstFormControlToFocus(formId: string): void {\r\n global.ConsoleLogDegug(\"setFirstFormControlToFocus\");\r\n\r\n // brez timeout funkcije focus ne dela :(\r\n setTimeout(function () {\r\n var firstFormControl = $(formId + \" .form-control:visible:not(:disabled):first\");\r\n if (firstFormControl) {\r\n firstFormControl.focus();\r\n }\r\n }, 500);\r\n }\r\n\r\n public static getRelativeSiteURL(controller: string): string {\r\n let _url = window.location.href;\r\n let iC = _url.indexOf(controller);\r\n if (iC > 0) {\r\n return _url.substring(0, iC) + controller;\r\n } else {\r\n return window.location.href;\r\n }\r\n }\r\n\r\n public static getSiteAbsoluteURL(relativePath: string): string {\r\n let controller = relativePath.split(\"/\")[0];\r\n let method = relativePath.replace(controller, \"\").replace(\"//\", \"\");\r\n\r\n // če relative path že vsebuje http, ga ne dodamo\r\n if (relativePath.indexOf(\"http\") >= 0) {\r\n return relativePath;\r\n }\r\n\r\n return global.getSiteBaseUrl() + \"/\" + controller + method;\r\n }\r\n\r\n public static relodeCurrentPage(): void {\r\n window.location.reload();\r\n }\r\n\r\n public static getHtmlInputStringValue(parentId: string, elementId: string): string {\r\n let elementSelector = parentId === null ? elementId : parentId + \" \" + elementId;\r\n\r\n let element = $(elementSelector)\r\n return element.val().toString();\r\n }\r\n\r\n public static getHtmlInputNumericValue(parentId: string, elementId: string): number {\r\n return Number(this.getHtmlInputStringValue(parentId, elementId));\r\n }\r\n\r\n public static getHtmlInputBooleanValue(parentId: string, elementId: string): boolean {\r\n return this.getHtmlInputStringValue(parentId, elementId).toLowerCase() == \"true\" ? true : false;\r\n }\r\n\r\n public static getJQueryInputStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQueryInputNumericValue(element: JQuery): number {\r\n let strVal = this.getJQueryInputStringValue(element);\r\n if (strVal == null || this.isEmpty(strVal)) {\r\n return null;\r\n }\r\n return Number(strVal);\r\n }\r\n\r\n public static getJQueryTextAreaStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQuerySelectValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static isStringValueInStringValueList(stringValue: string, stringValueList: string[]): boolean {\r\n let retVal = false;\r\n\r\n stringValueList.forEach((item) => {\r\n if (item === stringValue) {\r\n retVal = true;\r\n }\r\n });\r\n\r\n return retVal;\r\n }\r\n\r\n public static getJQuerySelectText(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.find(\"option:selected\").text();\r\n }\r\n\r\n static copyToClipboard(copyText: string): void {\r\n navigator.clipboard.writeText(copyText);\r\n }\r\n}\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopCheckboxSwitch {\r\n\r\n init(parentElement: string = \"\") {\r\n this.checkboxSwitchOnClick(parentElement);\r\n this.switchLabelOnClick(parentElement);\r\n }\r\n\r\n checkboxSwitchOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-checkbox...\");\r\n global.ConsoleLogDegug(\"saop-switch-checkbox parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-checkbox\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _checkBox = event.target;\r\n let _atrParent = \"#\"+$(_checkBox).attr(\"for\");\r\n let _checkBoxP = $(\"\" + parentElement + \" *>\" + _atrParent);\r\n let _label1 = _checkBoxP.find(\"#saop-switch-label1\");\r\n let _label2 = _checkBoxP.find(\"#saop-switch-label2\");\r\n if (_checkBox.checked) {\r\n global.ConsoleLogDegug(\"checked\");\r\n _label1.removeClass('switch-label-on');\r\n _label1.addClass('switch-label-off');\r\n _label2.removeClass('switch-label-off');\r\n _label2.addClass('switch-label-on');\r\n } else {\r\n global.ConsoleLogDegug(\"unchecked\");\r\n _label1.removeClass('switch-label-off');\r\n _label1.addClass('switch-label-on');\r\n _label2.removeClass('switch-label-on');\r\n _label2.addClass('switch-label-off');\r\n }\r\n });\r\n }\r\n\r\n switchLabelOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-label...\");\r\n global.ConsoleLogDegug(\"saop-switch-label parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-label\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _switchLabel = event.target;\r\n let _atrCheckBox = \"#\"+$(_switchLabel).attr(\"for\");\r\n let _checkBox = $(_atrCheckBox);\r\n $(_checkBox).prop( 'checked', 'flase');\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\n\r\nexport class SaopFloatingLabel {\r\n\r\n init() {\r\n let _this = this;\r\n $('.has-float-label > .form-control').off(\"focus\",_this.saopInputOnFocus);\r\n $('.has-float-label > .form-control').on(\"focus\",_this.saopInputOnFocus);\r\n\r\n $('.has-float-label > .form-control').off(\"blur\",_this.saopInputOnBlur);\r\n $('.has-float-label > .form-control').on(\"blur\",_this.saopInputOnBlur);\r\n \r\n $('.has-float-label > .form-control').off(\"focusout\",_this.saopInputOnChange);\r\n $('.has-float-label > .form-control').on(\"focusout\",_this.saopInputOnChange);\r\n\r\n }\r\n\r\n saopInputOnChange(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...saopInputOnChange\");\r\n let htmlElement = e.target;\r\n let _node = $(\"#\"+htmlElement.id);\r\n if (_node.length > 0){\r\n let _parentN = _node.parent();\r\n if (_parentN.length > 0){\r\n _parentN.removeClass(\"saop-error-input\");\r\n let _label = _parentN.find(\".text-danger\");\r\n if (_label.length > 0){\r\n _label.remove();\r\n }\r\n }\r\n }\r\n } \r\n\r\n saopInputOnFocus(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\"\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.add(\"saop-txt-primary\");\r\n }\r\n \r\n saopInputOnBlur(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\" on input blur (focus lost) nazaj v sivo (remove razred \"saop-txt-primary\")\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.remove(\"saop-txt-primary\");\r\n }\r\n\r\n\r\n setCaptionAsRequired(labelId:string,required:boolean):void{\r\n let _element = $(labelId);\r\n let _elementVal = _element.text().toString();\r\n _elementVal = _elementVal.replace(\"*\",\"\");\r\n if (required) {\r\n _element.text(_elementVal+\"*\");\r\n } else {\r\n _element.text(_elementVal);\r\n }\r\n } \r\n\r\n //\r\n}","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nclass selectItem {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nclass EditableColumnData {\r\n tip: string;\r\n selectItems: selectItem[];\r\n numericMinValue: number;\r\n numericMaxValue: number;\r\n}\r\n\r\nexport class SaopWebGridEdit {\r\n public libName: string; \r\n\r\n private _EditableColumnData: EditableColumnData;\r\n private _tdElement: HTMLTableCellElement;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n } \r\n\r\n showWebGridEditableColumnEditControl(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.showWebGridEditableColumnEditControl\");\r\n\r\n this._tdElement = tdElement;\r\n let tdElementHtml = this._tdElement.innerHTML;\r\n\r\n if (tdElementHtml.toLowerCase().indexOf(\"saop-table-edit-container\") >= 0) {\r\n // edit kontrola ze obstaja\r\n return;\r\n }\r\n\r\n this._EditableColumnData = this.getDataAttribute(this._tdElement);\r\n\r\n this.AddEditableColumnEditHtml(this._EditableColumnData.tip);\r\n }\r\n\r\n onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.onWriteValueToTDElementComplete\");\r\n }\r\n\r\n private getDataAttribute(element: HTMLElement): EditableColumnData {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getDataAttribute\");\r\n\r\n let data = new EditableColumnData();\r\n\r\n data.tip = element.getAttribute(\"data-edit-type\");\r\n data.selectItems = $.parseJSON(element.getAttribute(\"data-edit-select-items\"));\r\n data.numericMinValue = parseInt(element.getAttribute(\"data-edit-number-min\"));\r\n data.numericMaxValue = parseInt(element.getAttribute(\"data-edit-number-max\"));\r\n\r\n return data;\r\n }\r\n\r\n private AddEditableColumnEditHtml(tip: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.AddEditableColumnEditHtml\");\r\n\r\n let tdElementText = this._tdElement.innerText;\r\n\r\n let input = this.getInputElement(tip, tdElementText);\r\n\r\n let containerCellDiv = document.createElement('div');\r\n containerCellDiv.classList.add(\"saop-table-edit-container-cell\");\r\n containerCellDiv.appendChild(input);\r\n\r\n let containerDiv = document.createElement('div');\r\n containerDiv.classList.add(\"saop-table-edit-container\");\r\n containerDiv.appendChild(containerCellDiv);\r\n\r\n this._tdElement.innerHTML = containerDiv.outerHTML;\r\n\r\n this.setInputElementAfterInit(tip, tdElementText);\r\n }\r\n\r\n private getInputElement(tip: string, inputValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getInputElement\");\r\n\r\n let input: HTMLElement;\r\n\r\n switch (tip) {\r\n case \"text\":\r\n input = this.generateTextHtml();\r\n break;\r\n case \"textarea\":\r\n input = this.generateTextareaHtml();\r\n break;\r\n case \"select\":\r\n input = this.generateSelectHtml(inputValue);\r\n break;\r\n case \"number\":\r\n input = this.generateNumberHtml();\r\n break;\r\n default:\r\n input = this.generateTextHtml();\r\n }\r\n\r\n return input;\r\n }\r\n\r\n private generateTextHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"text\";\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private generateTextareaHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextareaHtml\");\r\n\r\n let input: HTMLTextAreaElement;\r\n\r\n input = document.createElement('textarea');\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n input.classList.add(\"saop-table-edit-container-cell-input-textarea\");\r\n\r\n return input;\r\n } \r\n\r\n private generateSelectHtml(selectValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateSelectHtml\");\r\n\r\n let input: HTMLSelectElement;\r\n\r\n input = document.createElement(\"select\");\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n this._EditableColumnData.selectItems.forEach((item) => {\r\n input.options.add(new Option(item.text, item.value, selectValue === item.value));\r\n });\r\n\r\n return input;\r\n }\r\n\r\n private generateNumberHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateNumberHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"number\";\r\n if (this._EditableColumnData.numericMinValue) {\r\n input.min = this._EditableColumnData.numericMinValue.toString();\r\n }\r\n if (this._EditableColumnData.numericMaxValue) {\r\n input.max = this._EditableColumnData.numericMaxValue.toString();\r\n }\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private setInputElementAfterInit(tip: string, tdElementText: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.setInputElementAfterInit\");\r\n\r\n if (tip === \"text\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"textarea\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"textarea\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeTextAreaValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"select\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"select\")[0];\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeSelectValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"number\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeNumberValueToTDElement.bind(this);\r\n }\r\n else {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n }\r\n\r\n private writeValueToTDElement(element: HTMLElement, inputVal: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeValueToTDElement\");\r\n\r\n let tempElement = element;\r\n\r\n // poiscemo parent element, ki ima class saop-table-edit-container. Njegov parent je TD element.\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-table-edit-container\")) {\r\n let tdElement = tempElement.parentElement;\r\n tdElement.innerHTML = inputVal;\r\n\r\n this.onWriteValueToTDElementComplete(this._tdElement);\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n }\r\n\r\n private writeInputValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeInputValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v innerhtml vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeTextAreaValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeTextAreaValueToTDElement\");\r\n\r\n let target: HTMLTextAreaElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeSelectValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeSelectValueToTDElement\");\r\n\r\n let target: HTMLSelectElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeNumberValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeNumberValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopInputWFL,SaopInputWFLProperties } from './saop-input-wfl'\r\nimport { SaopselectWFL } from './saop-select-wfl'\r\n\r\nexport class SaopWebGridFilter {\r\n public id:string = \"wgf1\";\r\n public modalFilterArray: any = [];\r\n //This function initializes the content inside the filter modal\r\n configFilter(libName:string,htmlTable: any, colArray: any) {\r\n let _this = this;\r\n setTimeout(function () {\r\n var tableName = htmlTable[0].id;\r\n var columns = htmlTable.api().columns();\r\n $.each(colArray, function (i, arg) {\r\n let _colNo = arg.toString();\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').attr(\"id\",\"column-header-\"+ _colNo +\"\");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append('');\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"   \");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"
\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\r\n '
' +\r\n 'V redu' + \r\n 'Zbriši' +\r\n 'Prekliči' +\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
\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 ${this._properties.toolbar.caption} \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 ${gridTogglePanel}\r\n
\r\n
\r\n
\r\n ${_toolbarItems}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\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"}