"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["reports-payroll_export-PayrollExportReportViewController"],{5613:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PayrollExportReportViewController\": () => (/* binding */ PayrollExportReportViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass PayrollExportReportViewController extends ReportBaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\n\t\t\texport_type_array: null,\n\n\t\t\texport_policy_array: null,\n\n\t\t\texport_setup_ui_dic: null,\n\n\t\t\texport_setup_data: null,\n\n\t\t\texport_grid: null,\n\n\t\t\tselect_grid_last_row: null,\n\n\t\t\tsave_export_setup_data: {}\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinitReport( options ) {\n\t\tthis.script_name = 'PayrollExportReport';\n\t\tthis.viewId = 'PayrollExportReport';\n\t\tthis.context_menu_name = $.i18n._( 'Payroll Export' );\n\t\tthis.navigation_label = $.i18n._( 'Saved Report' );\n\t\tthis.view_file = 'PayrollExportReportView.html';\n\t\tthis.api = TTAPI.APIPayrollExportReport;\n\t\tthis.include_form_setup = true;\n\t\tthis.export_setup_data = {};\n\t}\n\n\tinitOptions( callBack ) {\n\t\tvar $this = this;\n\t\tvar options = [\n\t\t\t{ option_name: 'page_orientation' },\n\t\t\t{ option_name: 'font_size' },\n\t\t\t{ option_name: 'chart_display_mode' },\n\t\t\t{ option_name: 'chart_type' },\n\t\t\t{ option_name: 'templates' },\n\t\t\t{ option_name: 'setup_fields' },\n\t\t\t{ option_name: 'export_type' },\n\t\t\t{ option_name: 'auto_refresh' }\n\t\t];\n\n\t\tthis.initDropDownOptions( options, function( result ) {\n\n\t\t\tcallBack( result ); // First to initialize drop down options, and then to initialize edit view UI.\n\n\t\t} );\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\tgroups: {\n\t\t\t\tform: {\n\t\t\t\t\tlabel: $.i18n._( 'Export' ), // Export is deliberate (rather than Form) due to export setup tab\n\t\t\t\t\tid: this.viewId + 'Form'\n\t\t\t\t}\n\t\t\t},\n\t\t\texclude: [],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Export' ),\n\t\t\t\t\tid: 'export_export',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-file_upload_black_24dp',\n\t\t\t\t\tmenu_align: 'right'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Save Setup' ),\n\t\t\t\t\tid: 'save_setup',\n\t\t\t\t\tgroup: 'form',\n\t\t\t\t\tvue_icon: 'tticon tticon-settings_black_24dp',\n\t\t\t\t\tmenu_align: 'right'\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tonTabIndexChange() {\n\n\t\t// Don't do anything in this sub class\n\t}\n\n\tsetEditMenuViewIcon() {\n\t\t// Don't do anything in this sub class\n\t}\n\n\t/* jshint ignore:start */\n\tonContextMenuClick( context_btn, menu_name ) {\n\t\tvar id;\n\t\tif ( Global.isSet( menu_name ) ) {\n\t\t\tid = menu_name;\n\t\t} else {\n\n\t\t\tif ( context_btn.disabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.select_grid_last_row ) {\n\t\t\tthis.export_grid.grid.jqGrid( 'saveRow', this.select_grid_last_row );\n\t\t\tthis.select_grid_last_row = null;\n\t\t}\n\n\t\tvar message_override = $.i18n._( 'Setup data for this report has not been configured yet. Please click on the Export Setup tab to do so now.' );\n\n\t\tswitch ( id ) {\n\t\t\tcase 'view':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick( null, false, message_override );\n\t\t\t\tbreak;\n\t\t\tcase 'view_html':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick( 'html', false, message_override );\n\t\t\t\tbreak;\n\t\t\tcase 'view_html_new_window':\n\t\t\t\tthis.onViewClick( 'html', false, message_override );\n\t\t\t\tbreak;\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onViewExcelClick( message_override );\n\t\t\t\tbreak;\n\t\t\tcase 'export_export':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick( 'payroll_export', false, message_override );\n\t\t\t\tbreak;\n\t\t\tcase 'cancel':\n\t\t\t\tthis.onCancelClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_existed_report': //All report view\n\t\t\t\tthis.onSaveExistedReportClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_new_report': //All report view\n\t\t\t\tthis.onSaveNewReportClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_setup': //All report view\n\t\t\t\tthis.onSaveSetup( $.i18n._( 'Export setup' ) );\n\t\t\t\tbreak;\n\t\t}\n\t\tGlobal.triggerAnalyticsContextMenuClick( context_btn, menu_name );\n\t}\n\n\t/* jshint ignore:end */\n\tbuildFormSetupUI() {\n\n\t\tvar $this = this;\n\n\t\tvar tab3 = this.edit_view_tab.find( '#tab_form_setup' );\n\n\t\tvar tab3_column1 = tab3.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[3] = [];\n\n\t\tthis.edit_view_tabs[3].push( tab3_column1 );\n\n\t\t//Export Format\n\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'export_type', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.export_type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Export Format' ), form_item_input, tab3_column1, '' );\n\n\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t$this.onExportChange( target.getValue() );\n\t\t} );\n\t}\n\n\tonExportChange( type ) {\n\n\t\tvar $this = this;\n\n\t\tthis.removeCurrentExportUI();\n\n\t\tProgressBar.showOverlay(); //End when set grid data complete\n\n\t\tthis.api.getOptions( 'export_policy', {\n\t\t\tnoCache: true, onResult: function( result ) {\n\t\t\t\t$this.export_policy_array = result.getResult();\n\n\t\t\t\tswitch ( type ) {\n\t\t\t\t\tcase 'adp':\n\t\t\t\t\tcase 'adp_advanced':\n\t\t\t\t\t\t$this.api.getOptions( 'adp_hour_column_options', {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t\t\t$this.buildGrid( type, result.getResult() );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'adp_resource':\n\t\t\t\t\t\t$this.api.getOptions( 'adp_resource_hour_column_options', {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t\t\t$this.buildGrid( type, result.getResult() );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'accero':\n\t\t\t\t\t\t$this.api.getOptions( 'accero_hour_column_options', {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t\t\t$this.buildGrid( type, result.getResult() );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'va_munis':\n\t\t\t\t\t\t$this.api.getOptions( 'export_columns', true, {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\t\t\tif ( !result_data.hasOwnProperty( '0' ) ) {\n\t\t\t\t\t\t\t\t\tresult_data[0] = '-- Custom --';\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t\t\t$this.buildGrid( type, result_data );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ceridian_insync':\n\t\t\t\t\tcase 'chris21':\n\t\t\t\t\tcase 'paychex_preview_advanced_job':\n\t\t\t\t\tcase 'paychex_preview':\n\t\t\t\t\tcase 'quickbooks':\n\t\t\t\t\tcase 'quickbooks_advanced':\n\t\t\t\t\tcase 'csv':\n\t\t\t\t\tcase 'csv_advanced':\n\t\t\t\t\tcase 'sage_50':\n\t\t\t\t\tcase 'meditech':\n\t\t\t\t\tcase 'vensure':\n\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t$this.buildGrid( type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cms_pbj':\n\t\t\t\t\t\t$this.api.getOptions( 'cms_pbj_hour_column_options', {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\t$this.buildAdditionalInputBox( type );\n\t\t\t\t\t\t\t\t$this.buildGrid( type, result.getResult() );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$this.buildGrid( type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\t/* jshint ignore:start */\n\tbuildGrid( type, columnOptions ) {\n\t\tif ( typeof type == 'undefined' || type == 0 ) { //on first load and when user selects \"choose one\" we want to drop the grid\n\t\t\tif ( this.export_grid ) {\n\t\t\t\tvar new_grid = $( '
' );\n\t\t\t\tthis.export_grid.grid.jqGrid( 'GridUnload' );\n\t\t\t\tthis.export_grid.grid.replaceWith( new_grid );\n\t\t\t\tthis.export_grid = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tvar $this = this;\n\t\tvar column_info_array = [];\n\t\tvar column_options_string = '';\n\n\t\tvar column_info = {\n\t\t\tname: 'column_id',\n\t\t\tindex: 'column_id',\n\t\t\tlabel: $.i18n._( 'Hours' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumn_info_array.push( column_info );\n\n\t\tvar hour_code_label = '';\n\n\t\tswitch ( type ) {\n\t\t\tcase 'adp':\n\t\t\tcase 'adp_advanced':\n\n\t\t\t\tcolumnOptions = Global.buildRecordArray( columnOptions.adp_hour_column_options );\n\t\t\t\tfor ( var i = 0; i < columnOptions.length; i++ ) {\n\t\t\t\t\tif ( i !== columnOptions.length - 1 ) {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label + ';';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'hour_column',\n\t\t\t\t\tindex: 'hour_column',\n\t\t\t\t\tlabel: $.i18n._( 'ADP Hours' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: 'select',\n\t\t\t\t\teditable: true,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tedittype: 'select',\n\t\t\t\t\teditoptions: { value: column_options_string }\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\thour_code_label = $.i18n._( 'ADP Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'adp_resource':\n\t\t\t\tcolumnOptions = Global.buildRecordArray( columnOptions.adp_resource_hour_column_options );\n\t\t\t\tfor ( var i = 0; i < columnOptions.length; i++ ) {\n\t\t\t\t\tif ( i !== columnOptions.length - 1 ) {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label + ';';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'hour_column',\n\t\t\t\t\tindex: 'hour_column',\n\t\t\t\t\tlabel: $.i18n._( 'ADP Hours' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: 'select',\n\t\t\t\t\teditable: true,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tedittype: 'select',\n\t\t\t\t\teditoptions: { value: column_options_string }\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\thour_code_label = $.i18n._( 'ADP Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'accero':\n\t\t\t\tcolumnOptions = Global.buildRecordArray( columnOptions.accero_hour_column_options );\n\t\t\t\tfor ( var i = 0; i < columnOptions.length; i++ ) {\n\t\t\t\t\tif ( i !== columnOptions.length - 1 ) {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label + ';';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'hour_column',\n\t\t\t\t\tindex: 'hour_column',\n\t\t\t\t\tlabel: $.i18n._( 'Hour Type' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: 'select',\n\t\t\t\t\teditable: true,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tedittype: 'select',\n\t\t\t\t\teditoptions: { value: column_options_string }\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\thour_code_label = $.i18n._( 'HED Override #' ); //Hours Code\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_preview_advanced_job':\n\t\t\tcase 'paychex_preview':\n\t\t\t\thour_code_label = $.i18n._( 'Paychex Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_online':\n\t\t\t\thour_code_label = $.i18n._( 'Earning Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'ceridian_insync':\n\t\t\t\thour_code_label = $.i18n._( 'Ceridian Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'millenium':\n\t\t\t\thour_code_label = $.i18n._( 'Millenium Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'quickbooks_advanced':\n\t\t\tcase 'quickbooks':\n\t\t\t\thour_code_label = $.i18n._( 'Quickbooks Payroll Item Name' );\n\t\t\t\tbreak;\n\t\t\tcase 'surepayroll':\n\t\t\t\thour_code_label = $.i18n._( 'Payroll Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'chris21':\n\t\t\t\thour_code_label = $.i18n._( 'Chris21 Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'va_munis':\n\t\t\t\tcolumnOptions = Global.buildRecordArray( columnOptions );\n\t\t\t\tfor ( var i = 0; i < columnOptions.length; i++ ) {\n\t\t\t\t\tif ( i !== columnOptions.length - 1 ) {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label + ';';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'hour_column',\n\t\t\t\t\tindex: 'hour_column',\n\t\t\t\t\tlabel: $.i18n._( 'Columns' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: 'select',\n\t\t\t\t\teditable: true,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tedittype: 'select',\n\t\t\t\t\teditoptions: { value: column_options_string }\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\thour_code_label = $.i18n._( 'Hours Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'compupay':\n\t\t\t\thour_code_label = $.i18n._( 'DET Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'sage_50':\n\t\t\t\thour_code_label = $.i18n._( 'Item Number' );\n\t\t\t\tbreak;\n\t\t\tcase 'cms_pbj':\n\t\t\t\tcolumnOptions = Global.buildRecordArray( columnOptions.cms_pbj_hour_column_options );\n\t\t\t\tfor ( var i = 0; i < columnOptions.length; i++ ) {\n\t\t\t\t\tif ( i !== columnOptions.length - 1 ) {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label + ';';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_options_string += columnOptions[i].fullValue + ':' + columnOptions[i].label;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'hour_column',\n\t\t\t\t\tindex: 'hour_column',\n\t\t\t\t\tlabel: $.i18n._( 'Export' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: 'select',\n\t\t\t\t\teditable: true,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tedittype: 'select',\n\t\t\t\t\teditoptions: { value: column_options_string }\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\thour_code_label = false;\n\t\t\t\tbreak;\n\t\t\tcase 'meditech':\n\t\t\t\thour_code_label = $.i18n._( 'Earning Number' );\n\t\t\t\tbreak;\n\t\t\tcase 'vensure':\n\t\t\t\thour_code_label = $.i18n._( 'Pay Code' );\n\t\t\t\tbreak;\n\t\t\tcase 'csv':\n\t\t\tcase 'csv_advanced':\n\t\t\t\thour_code_label = $.i18n._( 'Hours Code' );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( hour_code_label !== false ) {\n\t\t\tcolumn_info = {\n\t\t\t\tname: 'hour_code',\n\t\t\t\tindex: 'hour_code',\n\t\t\t\tlabel: hour_code_label,\n\t\t\t\twidth: 100,\n\t\t\t\tsortable: false,\n\t\t\t\ttitle: false,\n\t\t\t\teditable: true,\n\t\t\t\tedittype: 'text'\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\t\t}\n\n\t\tif ( this.export_grid ) {\n\t\t\tthis.export_grid.grid.jqGrid( 'GridUnload' );\n\t\t\tthis.export_grid = null;\n\n\t\t}\n\n\t\tthis.export_grid = new TTGrid( 'export_grid', {\n\t\t\tcontainer_selector: '.inside-editor-div .grid-div',\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\tsortable: false,\n\t\t\tediturl: 'clientArray',\n\t\t\tonSelectRow: function( id ) {\n\t\t\t\tif ( id ) {\n\t\t\t\t\tif ( $this.select_grid_last_row ) {\n\t\t\t\t\t\t$this.export_grid.grid.jqGrid( 'saveRow', $this.select_grid_last_row );\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.export_grid.grid.jqGrid( 'editRow', id, true );\n\t\t\t\t\t$this.select_grid_last_row = id;\n\n\t\t\t\t\t$this.export_grid.setGridColumnsWidth(); //When inline editing, it might change the width of each row, so resize the columns immediately after activating this.\n\t\t\t\t}\n\t\t\t},\n\t\t\tonResizeGrid: false\n\n\t\t}, column_info_array );\n\n\t\t$this.setExportGridData( type ); //Set Grid size at final\n\t}\n\n\t/* jshint ignore:end */\n\tsetExportGridData( type ) {\n\t\tvar $this = this;\n\n\t\tvar grid_data = Global.buildRecordArray( this.export_policy_array );\n\t\tvar export_columns = null;\n\t\tvar len = grid_data.length;\n\t\tvar grid_source = [];\n\n\t\tthis.api.getOptions( 'default_hour_codes', {\n\t\t\tnoCache: true,\n\t\t\tonResult: function( result ) {\n\n\t\t\t\tvar res_data = result.getResult();\n\t\t\t\tvar default_columns = [];\n\t\t\t\tif ( res_data[type] && res_data[type].columns ) {\n\t\t\t\t\tdefault_columns = res_data[type].columns;\n\t\t\t\t}\n\n\t\t\t\tif ( $this.save_export_setup_data && $this.save_export_setup_data[type] && $this.save_export_setup_data[type].columns ) {\n\t\t\t\t\texport_columns = $this.save_export_setup_data[type].columns;\n\t\t\t\t\tdoNext( export_columns, default_columns );\n\t\t\t\t} else if ( $this.export_setup_data && $this.export_setup_data[type] && $this.export_setup_data[type].columns ) {\n\t\t\t\t\texport_columns = $this.export_setup_data[type].columns;\n\t\t\t\t\tdoNext( export_columns, default_columns );\n\t\t\t\t} else if ( res_data[type] && res_data[type].columns ) {\n\t\t\t\t\tdoNext( default_columns );\n\t\t\t\t}\n\n\t\t\t\t$this.setExportGridSize();\n\t\t\t}\n\t\t} );\n\n\t\tfunction doNext( export_columns, default_columns ) {\n\t\t\tvar hour_code;\n\t\t\tvar hour_column;\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar row = grid_data[i];\n\t\t\t\tvar column_id = row.label;\n\t\t\t\tvar export_column_value = export_columns[row.value];\n\t\t\t\t// Error: Uncaught TypeError: Cannot read property 'hour_column' of undefined in /interface/html5/#!m=Exception&sm=PayrollExportReport&sid=1726 line 523\n\t\t\t\tif ( Global.isSet( export_column_value ) == false ) {\n\t\t\t\t\tif ( default_columns && row.value && default_columns[row.value] ) {\n\t\t\t\t\t\texport_column_value = default_columns[row.value];\n\t\t\t\t\t} else {\n\t\t\t\t\t\texport_column_value = {};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thour_column = export_column_value.hour_column;\n\t\t\t\thour_code = export_column_value.hour_code;\n\n\t\t\t\tswitch ( type ) {\n\t\t\t\t\tcase 'adp':\n\t\t\t\t\tcase 'adp_advanced':\n\t\t\t\t\tcase 'adp_resource':\n\t\t\t\t\tcase 'accero':\n\t\t\t\t\tcase 'va_munis':\n\t\t\t\t\tcase 'sage_50':\n\t\t\t\t\tcase 'cms_pbj':\n\t\t\t\t\t\tif ( !hour_column ) {\n\t\t\t\t\t\t\thour_column = '0';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar row_data = {\n\t\t\t\t\t\t\tid: i + 200,\n\t\t\t\t\t\t\tcolumn_id: column_id,\n\t\t\t\t\t\t\thour_column: hour_column,\n\t\t\t\t\t\t\thour_code: hour_code,\n\t\t\t\t\t\t\tcolumn_id_key: row.value\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\trow_data = {\n\t\t\t\t\t\t\tid: i + 200,\n\t\t\t\t\t\t\tcolumn_id: column_id,\n\t\t\t\t\t\t\thour_code: hour_code,\n\t\t\t\t\t\t\tcolumn_id_key: row.value\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tgrid_source.push( row_data );\n\t\t\t}\n\n\t\t\t$this.export_grid.setData( grid_source );\n\t\t\tProgressBar.closeOverlay();\n\n\t\t}\n\t}\n\n\t/* jshint ignore:start */\n\tsetExportGridSize() {\n\t\tif ( !this.export_grid || !this.export_grid.grid.is( ':visible' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tab3 = this.edit_view.find( '#form_setup_content_div' );\n\t\tvar first_row = this.edit_view.find( '.first-row' );\n\t\tthis.export_grid.grid.setGridWidth( this.edit_view.find( '.inside-editor-div ' ).width() + 14 );\n\t\t$( '#gbox_export_grid' ).css( 'overflow', 'hidden' );\n\t\tthis.export_grid.grid.setGridHeight( tab3.height() - first_row.height() );\n\t}\n\n\t/* jshint ignore:end */\n\tonTabShow( e, ui ) {\n\t\tvar key = $( e.target ).tabs( 'option', 'active' );\n\n\t\t$( '.edit-view-form-item-label' ).css( 'width', 'auto' );\n\t\tthis.editFieldResize( key );\n\n\t\tif ( !this.current_edit_record ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar last_index = this.getEditViewTabIndex();\n\n\t\tif ( ( last_index === 1 || this.need_refresh_display_columns ) && key === 0 ) {\n\t\t\tthis.buildReportUIBaseOnSetupFields();\n\t\t\tthis.buildContextMenu( true );\n\t\t\tthis.setEditMenu();\n\t\t} else if ( key === 1 ) {\n\t\t\tthis.edit_view_ui_dic.setup_field.setValue( this.current_edit_record.setup_field );\n\t\t\tif ( Global.getProductEdition() == 10 ) {\n\t\t\t\tthis.edit_view_ui_dic.auto_refresh.parent().parent().css( 'display', 'none' );\n\t\t\t}\n\t\t\tthis.buildContextMenu( true );\n\t\t\tthis.setEditMenu();\n\t\t} else if ( key === 2 ) {\n\t\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'block' );\n\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t} else {\n\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'none' );\n\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\tthis.edit_view.find( '.permission-message' ).html( Global.getUpgradeMessage() );\n\t\t\t}\n\t\t} else if ( key === 3 ) {\n\t\t\tthis.setExportGridSize();\n\t\t\tthis.buildContextMenu( true );\n\t\t\tthis.setEditMenu();\n\t\t} else if ( key === 4 ) {\n\t\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\t\tthis.edit_view_tab.find( '#tab4' ).find( '.first-column-sub-view' ).css( 'display', 'block' );\n\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t\tthis.initSubCustomColumnView();\n\t\t\t} else {\n\t\t\t\tthis.edit_view_tab.find( '#tab4' ).find( '.first-column-sub-view' ).css( 'display', 'none' );\n\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\tthis.edit_view.find( '.permission-message' ).html( Global.getUpgradeMessage() );\n\n\t\t\t}\n\t\t} else if ( key === 5 ) {\n\t\t\tthis.initSubSavedReportView();\n\t\t} else {\n\t\t\tthis.buildContextMenu( true );\n\t\t\tthis.setEditMenu();\n\t\t}\n\n\t\tthis.checkFormSetupSaved( last_index, $.i18n._( 'Export Setup' ) );\n\t}\n\n\tbuildAdditionalInputBox( type ) {\n\t\tif ( this.save_export_setup_data[type] ) {\n\t\t\tthis.export_setup_data = this.save_export_setup_data[type];\n\n\t\t\tif ( !this.export_setup_data.columns && this.export_setup_data[type] ) {\n\t\t\t\tthis.export_setup_data = this.export_setup_data[type];\n\t\t\t\tthis.export_setup_data.export_type = type;\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis.export_setup_data = {};\n\t\t}\n\n\t\tvar $this = this;\n\n\t\tthis.export_setup_ui_dic = {};\n\n\t\tvar tab3 = this.edit_view_tab.find( '#tab_form_setup' );\n\n\t\tvar tab3_column1 = tab3.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[3] = [];\n\n\t\tthis.edit_view_tabs[3].push( tab3_column1 );\n\n\t\tswitch ( type ) {\n\t\t\tcase 'adp':\n\t\t\t\t//Company code\n\t\t\t\tvar code = 'company_code';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Code' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_company_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Batch ID\n\t\t\t\tvar code1 = 'batch_id';\n\t\t\t\tvar form_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Batch ID' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_batch_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t// Temp Department\n\n\t\t\t\tvar code2 = 'temp_dept';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Temp Department' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_temp_dept_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\tbreak;\n\t\t\tcase 'adp_advanced':\n\t\t\tcase 'adp_resource': //ADP Resource/Pay Expert\n\t\t\t\t//Company code\n\t\t\t\tvar code = 'company_code';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Code' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_company_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Batch ID\n\t\t\t\tvar code1 = 'batch_id';\n\t\t\t\tvar form_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Batch ID' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_batch_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t// Temp Department\n\n\t\t\t\tvar code2 = 'temp_dept';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Temp Department' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_temp_dept_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\t// Job Cost #\n\t\t\t\tvar code3 = 'job_cost';\n\t\t\t\tvar form_item_input3 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input3.TComboBox( { field: code3 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box3 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box3.css( 'margin-left', '10px' );\n\t\t\t\ttext_box3.TTextInput( { field: code3 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input3 );\n\t\t\t\th_box.append( text_box3 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job Cost #' ), [form_item_input3, text_box3], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input3, text_box3] );\n\t\t\t\tform_item_input3.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box3.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box3.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_job_cost_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input3.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t\tform_item_input3.trigger( 'formItemChange', [form_item_input3, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.export_setup_ui_dic[code3] = $this.edit_view_form_item_dic[code3];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code3];\n\n\t\t\t\t// Work Class\n\t\t\t\tvar code4 = 'work_class';\n\t\t\t\tvar form_item_input4 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input4.TComboBox( { field: code4 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box4 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box4.css( 'margin-left', '10px' );\n\t\t\t\ttext_box4.TTextInput( { field: code4 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input4 );\n\t\t\t\th_box.append( text_box4 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Work Class' ), [form_item_input4, text_box4], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input4, text_box4] );\n\t\t\t\tform_item_input4.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box4.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box4.setValue( $this.export_setup_data[code4] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box4.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'adp_work_class_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input4.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input4.setValue( $this.export_setup_data[code4] );\n\t\t\t\t\t\tform_item_input4.trigger( 'formItemChange', [form_item_input4, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.export_setup_ui_dic[code4] = $this.edit_view_form_item_dic[code4];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code4];\n\n\t\t\t\t//State\n\t\t\t\tvar code7 = 'state_columns';\n\t\t\t\tvar form_item_input7 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input7.TComboBox( {\n\t\t\t\t\tfield: code7,\n\t\t\t\t\tset_empty: true\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'State' ), form_item_input7, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input7] );\n\t\t\t\tTTAPI.APIJobDetailReport.getOptions( 'static_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input7.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input7.setValue( $this.export_setup_data[code7] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code7] = $this.edit_view_form_item_dic[code7];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code7];\n\n\t\t\t\tbreak;\n\t\t\tcase 'accero':\n\t\t\t\t// Temp Department\n\t\t\t\tvar code2 = 'temp_dept';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department Override Code' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'accero_temp_dept_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\tbreak;\n\t\t\tcase 'va_munis':\n\t\t\t\t//Department\n\t\t\t\tcode = 'department';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\ttext_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'export_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tif ( !result_data.hasOwnProperty( '0' ) ) {\n\t\t\t\t\t\t\tresult_data[0] = '-- Custom --';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Employee Number\n\t\t\t\tcode1 = 'employee_number';\n\t\t\t\tform_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\ttext_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee Number' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'export_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tif ( !result_data.hasOwnProperty( '0' ) ) {\n\t\t\t\t\t\t\tresult_data[0] = '-- Custom --';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t// Long GL Account\n\n\t\t\t\tcode2 = 'gl_account';\n\t\t\t\tform_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\ttext_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Long GL Account' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'export_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tif ( !result_data.hasOwnProperty( '0' ) ) {\n\t\t\t\t\t\t\tresult_data[0] = '-- Custom --';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\tbreak;\n\t\t\tcase 'ceridian_insync':\n\t\t\t\t// Employer Number\n\t\t\t\tcode = 'employer_number';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employer Number' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_preview':\n\t\t\t\t// Client Number\n\t\t\t\tcode = 'client_number';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Client Number' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_preview_advanced_job':\n\t\t\t\t// Client Number\n\t\t\t\tcode = 'client_number_adv';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Client Number' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data['client_number'] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Job\n\t\t\t\tcode1 = 'job_columns';\n\t\t\t\tform_item_input1 = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\t\tform_item_input1.AComboBox( {\n\t\t\t\t\tfield: code1,\n\t\t\t\t\tallow_multiple_selection: true,\n\t\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\t\tkey: 'value',\n\t\t\t\t\tset_empty: true\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), form_item_input1, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1] );\n\t\t\t\tTTAPI.APIJobDetailReport.getOptions( 'static_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t//State\n\t\t\t\tcode2 = 'state_columns';\n\t\t\t\tform_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( {\n\t\t\t\t\tfield: code2,\n\t\t\t\t\tset_empty: true\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'State' ), form_item_input2, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2] );\n\t\t\t\tTTAPI.APIJobDetailReport.getOptions( 'static_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\t// Include Override Rates\n\t\t\t\tcode = 'include_hourly_rate';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\t\tform_item_input.TCheckbox( { field: code } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Include Override Rates' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\tbreak;\n\t\t\tcase 'quickbooks':\n\t\t\tcase 'quickbooks_advanced':\n\t\t\t\t// Company Name\n\t\t\t\tcode = 'company_name';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code } );\n\n\t\t\t\tvar containerWithTextTip = this.buildWidgetContainerWithTextTip( form_item_input, $.i18n._( '(Exactly as shown in Quickbooks)' ) );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Name' ), form_item_input, tab3_column1, '', containerWithTextTip, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t// Company Created Time\n\t\t\t\tcode = 'company_created_date';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code } );\n\n\t\t\t\tcontainerWithTextTip = this.buildWidgetContainerWithTextTip( form_item_input, $.i18n._( '(Exactly as shown in exported timer list)' ) );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Created Time' ), form_item_input, tab3_column1, '', containerWithTextTip, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Map PROJ Field To\n\t\t\t\tcode1 = 'proj';\n\t\t\t\tform_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( {\n\t\t\t\t\tfield: code1\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Map PROJ Field To' ), form_item_input1, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1] );\n\t\t\t\tthis.api.getOptions( 'quickbooks_proj_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t//Map ITEM Field To\n\t\t\t\tcode2 = 'item';\n\t\t\t\tform_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( {\n\t\t\t\t\tfield: code2\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Map ITEM Field To' ), form_item_input2, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2] );\n\t\t\t\tthis.api.getOptions( 'quickbooks_proj_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\t//Map ITEM Field To\n\t\t\t\tvar code3 = 'job';\n\t\t\t\tvar form_item_input3 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input3.TComboBox( {\n\t\t\t\t\tfield: code3\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Map JOB Field To' ), form_item_input3, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input3] );\n\t\t\t\tthis.api.getOptions( 'quickbooks_proj_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input3.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code3] = $this.edit_view_form_item_dic[code3];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code3];\n\n\t\t\t\tbreak;\n\t\t\tcase 'sage_50':\n\t\t\t\t//Company code\n\t\t\t\tvar code = 'customer_name';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Customer Name' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'sage_50_customer_name_options', {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\tbreak;\n\t\t\tcase 'chris21': //Chris21\n\t\t\t\t//Job\n\t\t\t\tvar code1 = 'job';\n\t\t\t\tvar form_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job Number' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'chris21_job_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\n\t\t\t\t//Cost Center\n\t\t\t\tvar code2 = 'cost_center';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Cost Center Code' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'chris21_cost_center_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\tbreak;\n\t\t\tcase 'cms_pbj':\n\t\t\t\t//Facility ID\n\t\t\t\tvar code = 'facility_code';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Facility ID' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'cms_pbj_facility_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//State\n\t\t\t\tvar code1 = 'state_code';\n\t\t\t\tvar form_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\t\t\t\tvar text_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'State' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'cms_obj_state_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\t\t\t\t// Pay Type Code\n\t\t\t\tvar code2 = 'pay_type_code';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Type Code' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'cms_pbj_pay_type_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\t// Job Title Code\n\t\t\t\tvar code3 = 'job_title_code';\n\t\t\t\tvar form_item_input3 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input3.TComboBox( { field: code3 } );\n\n\t\t\t\th_box = $( '' );\n\t\t\t\tvar text_box3 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box3.css( 'margin-left', '10px' );\n\t\t\t\ttext_box3.TTextInput( { field: code3 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input3 );\n\t\t\t\th_box.append( text_box3 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job Title Code' ), [form_item_input3, text_box3], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input3, text_box3] );\n\t\t\t\tform_item_input3.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box3.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box3.css( 'display', 'none' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'cms_pbj_job_title_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input3.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t\tform_item_input3.trigger( 'formItemChange', [form_item_input3, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.export_setup_ui_dic[code3] = $this.edit_view_form_item_dic[code3];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code3];\n\n\t\t\t\tbreak;\n\t\t\tcase 'meditech': //Meditech\n\t\t\t\t//Payroll dictionary value\n\t\t\t\tcode4 = 'payroll';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: code4 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Payroll' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tform_item_input.setValue( $this.export_setup_data[code4] );\n\n\t\t\t\t$this.export_setup_ui_dic[code4] = $this.edit_view_form_item_dic[code4];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code4];\n\n\t\t\t\t//Employee Number\n\t\t\t\tvar code = 'employee_number';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee Number' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'export_columns', 'meditech', {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\t//Department\n\t\t\t\tvar code2 = 'department';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'meditech_department_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\t\t\t\t// Job Code\n\t\t\t\tvar code3 = 'job_code';\n\t\t\t\tvar form_item_input3 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input3.TComboBox( { field: code3 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box3 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box3.css( 'margin-left', '10px' );\n\t\t\t\ttext_box3.TTextInput( { field: code3 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input3 );\n\t\t\t\th_box.append( text_box3 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job Code' ), [form_item_input3, text_box3], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input3, text_box3] );\n\t\t\t\tform_item_input3.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box3.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box3.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'meditech_job_code_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input3.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t\tform_item_input3.trigger( 'formItemChange', [form_item_input3, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.export_setup_ui_dic[code3] = $this.edit_view_form_item_dic[code3];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code3];\n\n\t\t\t\tbreak;\n\t\t\tcase 'vensure': //Vensure\n\t\t\t\t//Employee Number\n\t\t\t\tvar code = 'employee_number';\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: code } );\n\n\t\t\t\tvar h_box = $( '' );\n\n\t\t\t\tvar text_box = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box.css( 'margin-left', '10px' );\n\t\t\t\ttext_box.TTextInput( { field: code + '_text' } );\n\n\t\t\t\th_box.append( form_item_input );\n\t\t\t\th_box.append( text_box );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee Number' ), [form_item_input, text_box], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input, text_box] );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'export_columns', 'vensure', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t\tform_item_input.trigger( 'formItemChange', [form_item_input, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\n\t\t\t\t//Location\n\t\t\t\tvar code1 = 'location';\n\t\t\t\tvar form_item_input1 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input1.TComboBox( { field: code1 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box1 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box1.css( 'margin-left', '10px' );\n\t\t\t\ttext_box1.TTextInput( { field: code1 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input1 );\n\t\t\t\th_box.append( text_box1 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Location Code' ), [form_item_input1, text_box1], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input1, text_box1] );\n\t\t\t\tform_item_input1.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box1.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box1.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'vensure_location_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input1.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input1.setValue( $this.export_setup_data[code1] );\n\t\t\t\t\t\tform_item_input1.trigger( 'formItemChange', [form_item_input1, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code1] = $this.edit_view_form_item_dic[code1];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code1];\n\n\n\t\t\t\t//Department\n\t\t\t\tvar code2 = 'department';\n\t\t\t\tvar form_item_input2 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input2.TComboBox( { field: code2 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box2 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box2.css( 'margin-left', '10px' );\n\t\t\t\ttext_box2.TTextInput( { field: code2 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input2 );\n\t\t\t\th_box.append( text_box2 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department Code' ), [form_item_input2, text_box2], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input2, text_box2] );\n\t\t\t\tform_item_input2.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box2.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box2.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'vensure_department_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input2.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input2.setValue( $this.export_setup_data[code2] );\n\t\t\t\t\t\tform_item_input2.trigger( 'formItemChange', [form_item_input2, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code2] = $this.edit_view_form_item_dic[code2];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code2];\n\n\n\t\t\t\t//Division\n\t\t\t\tvar code3 = 'division';\n\t\t\t\tvar form_item_input3 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input3.TComboBox( { field: code3 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box3 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box3.css( 'margin-left', '10px' );\n\t\t\t\ttext_box3.TTextInput( { field: code3 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input3 );\n\t\t\t\th_box.append( text_box3 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Division Code' ), [form_item_input3, text_box3], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input3, text_box3] );\n\t\t\t\tform_item_input3.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box3.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box3.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'vensure_division_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input3.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input3.setValue( $this.export_setup_data[code3] );\n\t\t\t\t\t\tform_item_input3.trigger( 'formItemChange', [form_item_input3, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code3] = $this.edit_view_form_item_dic[code3];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code3];\n\n\n\t\t\t\t// Job Code\n\t\t\t\tvar code4 = 'job';\n\t\t\t\tvar form_item_input4 = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input4.TComboBox( { field: code4 } );\n\n\t\t\t\th_box = $( '' );\n\n\t\t\t\tvar text_box4 = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\ttext_box4.css( 'margin-left', '10px' );\n\t\t\t\ttext_box4.TTextInput( { field: code4 + '_text' } );\n\n\t\t\t\th_box.append( form_item_input4 );\n\t\t\t\th_box.append( text_box4 );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job Code' ), [form_item_input4, text_box4], tab3_column1, '', h_box, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input4, text_box4] );\n\t\t\t\tform_item_input4.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\tif ( target.getValue() === 0 ) {\n\t\t\t\t\t\ttext_box4.css( 'display', 'inline' );\n\t\t\t\t\t\ttext_box4.setValue( $this.export_setup_data[code4] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext_box4.css( 'display', 'none' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t$this.api.getOptions( 'vensure_job_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input4.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input4.setValue( $this.export_setup_data[code4] );\n\t\t\t\t\t\tform_item_input4.trigger( 'formItemChange', [form_item_input4, true] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.export_setup_ui_dic[code4] = $this.edit_view_form_item_dic[code4];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code4];\n\n\t\t\t\tbreak;\n\t\t\tcase 'csv_advanced':\n\t\t\t\t//Export Columns\n\t\t\t\tcode = 'csv_export_columns';\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tfield: code,\n\t\t\t\t\tallow_multiple_selection: true,\n\t\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\t\tkey: 'value',\n\t\t\t\t\tset_empty: true\n\t\t\t\t} );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Export Columns' ), form_item_input, tab3_column1, '', null, true );\n\t\t\t\tthis.setWidgetVisible( [form_item_input] );\n\t\t\t\tthis.api.getOptions( 'export_columns', 'csv_advanced', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tform_item_input.setSourceData( Global.buildRecordArray( result_data ) );\n\t\t\t\t\t\tform_item_input.setValue( $this.export_setup_data[code] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.export_setup_ui_dic[code] = $this.edit_view_form_item_dic[code];\n\t\t\t\tdelete $this.edit_view_form_item_dic[code];\n\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.editFieldResize( 3 );\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar tab_3_label = this.edit_view.find( 'a[ref=tab_form_setup]' );\n\t\ttab_3_label.text( $.i18n._( 'Export Setup' ) );\n\t}\n\n\tremoveCurrentExportUI() {\n\n\t\tfor ( var key in this.export_setup_ui_dic ) {\n\t\t\tvar html_item = this.export_setup_ui_dic[key];\n\t\t\thtml_item.remove();\n\t\t}\n\n\t\t//Error: Unable to get property 'find' of undefined or null reference in /interface/html5/ line 1033\n\t\tif ( !this.edit_view_tab ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tab3 = this.edit_view_tab.find( '#tab_form_setup' );\n\t\tvar tab3_column1 = tab3.find( '.first-column' );\n\t\tvar clear_both_div = tab3_column1.find( '.clear-both-div' );\n\n\t\tclear_both_div.remove();\n\t}\n\n\tgetExportColumns( type ) {\n\t\tvar columns = {};\n\n\t\tif ( this.export_grid ) { //#2490 - can't return export columns if there's no export grid.\n\t\t\tvar source = this.export_grid.getData();\n\t\t\tvar len = source.length;\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar item = source[i];\n\t\t\t\tcolumns[item.column_id_key] = {};\n\t\t\t\tcolumns[item.column_id_key].hour_code = item.hour_code;\n\n\t\t\t\tif ( type === 'adp' || type === 'adp_advanced' || type === 'adp_resource' || type === 'accero' || type === 'va_munis' || type === 'cms_pbj' ) {\n\t\t\t\t\tcolumns[item.column_id_key].hour_column = item.hour_column;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\treturn columns;\n\t}\n\n\t/**\n\t * Gets array of properly configured values for the export setup form.\n\t *\n\t * @param field_list Array\n\t * @returns {{}|*}\n\t */\n\tgetFormSetupFieldValues( field_list ) {\n\t\tvar ret_arr = {};\n\n\t\tfor ( var i = 0; i < field_list.length; i++ ) {\n\t\t\tif ( this.edit_view_ui_dic[field_list[i]] && !this.edit_view_ui_dic[field_list[i]].getValue() ) {\n\t\t\t\tret_arr[field_list[i]] = this.edit_view_ui_dic[field_list[i] + '_text'].getValue();\n\t\t\t\tret_arr[field_list[i] + '_value'] = this.edit_view_ui_dic[field_list[i] + '_text'].getValue();\n\t\t\t} else {\n\t\t\t\tif ( !this.edit_view_ui_dic[field_list[i]] ) {\n\t\t\t\t\tret_arr[field_list[i]] = '';\n\t\t\t\t} else {\n\t\t\t\t\tret_arr[field_list[i]] = this.edit_view_ui_dic[field_list[i]].getValue();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ret_arr;\n\t}\n\n\tgetFormData( other, for_display ) {\n\t\tif ( !other || !other.export_type ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch ( other.export_type ) {\n\t\t\tcase 'adp':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['company_code', 'batch_id', 'temp_dept'] );\n\t\t\t\tbreak;\n\t\t\tcase 'adp_advanced':\n\t\t\tcase 'adp_resource':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['company_code', 'batch_id', 'temp_dept', 'job_cost', 'work_class'] );\n\t\t\t\tother[other.export_type].state_columns = this.edit_view_ui_dic.state_columns.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'accero':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['temp_dept'] );\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_preview':\n\t\t\t\tother[other.export_type].client_number = this.edit_view_ui_dic.client_number.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'paychex_preview_advanced_job':\n\t\t\t\tother[other.export_type].client_number = this.edit_view_ui_dic.client_number_adv.getValue();\n\t\t\t\tother[other.export_type].job_columns = this.edit_view_ui_dic.job_columns.getValue();\n\t\t\t\tother[other.export_type].state_columns = this.edit_view_ui_dic.state_columns.getValue();\n\t\t\t\tother[other.export_type].include_hourly_rate = this.edit_view_ui_dic.include_hourly_rate.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'chris21':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['job', 'cost_center'] );\n\t\t\t\tbreak;\n\t\t\tcase 'ceridian_insync':\n\t\t\t\tother[other.export_type].employer_number = this.edit_view_ui_dic.employer_number.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'quickbooks':\n\t\t\tcase 'quickbooks_advanced':\n\t\t\t\tother[other.export_type].company_name = this.edit_view_ui_dic.company_name.getValue();\n\t\t\t\tother[other.export_type].company_created_date = this.edit_view_ui_dic.company_created_date.getValue();\n\t\t\t\tother[other.export_type].proj = this.edit_view_ui_dic.proj.getValue();\n\t\t\t\tother[other.export_type].item = this.edit_view_ui_dic.item.getValue();\n\t\t\t\tother[other.export_type].job = this.edit_view_ui_dic.job.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'sage_50':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['customer_name'] );\n\t\t\t\tbreak;\n\t\t\tcase 'va_munis':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['department', 'employee_number', 'gl_account', 'customer_name', 'facility_code', 'state_code', 'pay_type_code', 'job_title_code', ''] );\n\t\t\t\tbreak;\n\t\t\tcase 'meditech':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['employee_number', 'department', 'job_code'] );\n\t\t\t\tother[other.export_type].payroll = this.edit_view_ui_dic.payroll.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'vensure':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['employee_number', 'location', 'department', 'division', 'job'] );\n\t\t\t\tbreak;\n\t\t\tcase 'csv_advanced':\n\t\t\t\tother[other.export_type].export_columns = this.edit_view_ui_dic.csv_export_columns.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'cms_pbj':\n\t\t\t\tother[other.export_type] = this.getFormSetupFieldValues( ['facility_code', 'state_code', 'pay_type_code', 'job_title_code'] );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( !this.save_export_setup_data ) {\n\t\t\tthis.save_export_setup_data = {};\n\t\t}\n\t\tthis.save_export_setup_data[other.export_type] = other[other.export_type];\n\t\tthis.save_export_setup_data[other.export_type]['columns'] = this.getExportColumns( other.export_type ); //This is needed for the api to build reports properly.\n\t\tthis.save_export_setup_data['export_type'] = other.export_type;\n\n\t\tif ( for_display ) {\n\t\t\tfor ( var key in this.save_export_setup_data ) {\n\t\t\t\tif ( key !== false && typeof ( this.save_export_setup_data[key] ) !== 'string' ) {\n\t\t\t\t\tthis.save_export_setup_data[key] = this.convertExportSetupValues( this.save_export_setup_data[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn other;\n\t}\n\n\t/* jshint ignore:start */\n\tgetFormSetupData( for_view ) {\n\t\tvar other = {};\n\t\tother.export_type = this.edit_view_ui_dic.export_type.getValue();\n\n\t\tother[other.export_type] = {};\n\t\tother[other.export_type].columns = this.getExportColumns( other.export_type );\n\n\t\tother = this.getFormData( other, true );\n\n\t\tif ( !for_view && other.export_type ) {\n\t\t\tvar export_type = other.export_type;\n\t\t\tother = other[export_type];\n\t\t\tother.export_type = export_type;\n\t\t\tother[export_type] = {};\n\t\t\tother[export_type].columns = this.getExportColumns( other.export_type );\n\t\t}\n\n\t\treturn other;\n\t}\n\n\t/* jshint ignore:end */\n\n\t/**\n\t * Backwards compatible function for custom data to be moved from the way the api stores it to the way the form needs it.\n\t *\n\t * the old custom field data was stored in obj[key]\n\t * new custom field data is stored in obj[key+'_value']\n\t *\n\t * ie. obj[company_code] is now obj[company_code_value]\n\t *\n\t * @param data\n\t * @returns {*}\n\t */\n\tconvertExportSetupValues( data ) {\n\t\tfor ( var api_data_key in data ) {\n\t\t\tvar form_data_key = api_data_key.substr( 0, api_data_key.indexOf( '_value' ) );\n\t\t\tif ( api_data_key.search( '_value' ) > 0 ) {\n\t\t\t\tdata[form_data_key] = data[api_data_key];\n\t\t\t}\n\t\t}\n\t\t//conversion for lower export grid data from old format\n\t\tif ( data.export_columns && !data.columns && data.export_type != 0 && data.export_columns[data.export_type] ) {\n\t\t\tdata.columns = {};\n\t\t\tdata.columns = data.export_columns[data.export_type].columns;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\t/**\n\t * Get the form setup data from the api\n\t * @param res_Data\n\t */\n\tsetFormSetupData( res_Data ) {\n\t\t//this if is for backwards compatibility\n\n\t\tif ( this.edit_view_ui_dic.export_type && this.edit_view_ui_dic.export_type.getValue() ) {\n\t\t\tres_Data.export_type = this.edit_view_ui_dic.export_type.getValue();\n\t\t}\n\n\t\tif ( !res_Data.export_columns ) {\n\t\t\tfor ( var key in res_Data ) {\n\t\t\t\tif ( key !== false && typeof ( res_Data[key] ) !== 'string' ) {\n\t\t\t\t\tres_Data[key] = this.convertExportSetupValues( res_Data[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.save_export_setup_data = res_Data;\n\t\t} else {\n\t\t\tres_Data = this.convertExportSetupValues( res_Data );\n\t\t\tthis.save_export_setup_data[res_Data.export_type] = res_Data;\n\t\t\tthis.save_export_setup_data['export_type'] = res_Data.export_type;\n\t\t}\n\n\t\tif ( !res_Data ) {\n\t\t\tthis.show_empty_message = true;\n\t\t}\n\n\t\tif ( res_Data ) {\n\n\t\t\tif ( res_Data.export_type ) {\n\t\t\t\tthis.edit_view_ui_dic.export_type.setValue( res_Data.export_type );\n\t\t\t\tthis.current_edit_record.export_type = res_Data.export_type;\n\t\t\t}\n\t\t}\n\n\t\t//for backwards compatibility with old csv_advanced format\n\t\tif ( this.save_export_setup_data['csv_advanced'] ) {\n\t\t\tif ( this.save_export_setup_data['csv_advanced'].csv_export_columns ) {\n\t\t\t\tthis.save_export_setup_data['csv_advanced'].export_columns = this.save_export_setup_data['csv_advanced'].csv_export_columns;\n\t\t\t} else {\n\t\t\t\tthis.save_export_setup_data['csv_advanced'].csv_export_columns = this.save_export_setup_data['csv_advanced'].export_columns;\n\t\t\t}\n\t\t}\n\n\t\tthis.onExportChange( res_Data.export_type );\n\t}\n\n\t/**\n\t * Overridden to allow stateful export formats. This ensures your changes are put into memory..\n\t *\n\t * @param target\n\t * @param doNotDoValidate\n\t */\n\tonFormItemChange( target, doNotValidate ) {\n\t\t//If the edit grid has left any rows in edit mode, we need to finalize them now before the data is swept into memory.\n\t\tvar selRowId = $( '#export_grid' ).getGridParam( 'selrow' );\n\t\t$( '#export_grid' ).saveRow( selRowId );\n\n\t\tif ( target && target.getField && target.getField() == 'export_type' ) { // cannot read property getField of undefined\n\t\t\tvar other = {};\n\t\t\tother.export_type = this.current_edit_record.export_type;\n\t\t\tother[other.export_type] = {};\n\t\t\tother[other.export_type].export_columns = { columns: this.getExportColumns( other.export_type ) };\n\n\t\t\tif ( !this.export_setup_data.export_columns || Global.isObject( this.export_setup_data.export_columns ) == false ) {\n\t\t\t\tthis.export_setup_data.export_columns = {};\n\t\t\t\tthis.export_setup_data.export_columns[other.export_type] = {};\n\t\t\t}\n\n\t\t\tthis.export_setup_data.export_columns[other.export_type] = { columns: this.getExportColumns( other.export_type ) };\n\t\t\t// this.save_export_setup_data[other.export_type] = this.getFormSetupData( other );\n\t\t\tthis.form_setup_changed = true;\n\t\t\treturn; //make room for the custom event above\n\t\t}\n\t\tsuper.onFormItemChange( target, doNotValidate );\n\t}\n\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7O0FBRUE7QUFDQSxvQkFBb0IsQ0FBQztBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEdBQTBHO0FBQzFHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixDQUFDO0FBQ2xCLEVBQUUsQ0FBQzs7QUFFSCwyRUFBMkU7QUFDM0U7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3MvcmVwb3J0cy9wYXlyb2xsX2V4cG9ydC9QYXlyb2xsRXhwb3J0UmVwb3J0Vmlld0NvbnRyb2xsZXIuanM/MWQ3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgUGF5cm9sbEV4cG9ydFJlcG9ydFZpZXdDb250cm9sbGVyIGV4dGVuZHMgUmVwb3J0QmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cblx0XHRcdGV4cG9ydF90eXBlX2FycmF5OiBudWxsLFxuXG5cdFx0XHRleHBvcnRfcG9saWN5X2FycmF5OiBudWxsLFxuXG5cdFx0XHRleHBvcnRfc2V0dXBfdWlfZGljOiBudWxsLFxuXG5cdFx0XHRleHBvcnRfc2V0dXBfZGF0YTogbnVsbCxcblxuXHRcdFx0ZXhwb3J0X2dyaWQ6IG51bGwsXG5cblx0XHRcdHNlbGVjdF9ncmlkX2xhc3Rfcm93OiBudWxsLFxuXG5cdFx0XHRzYXZlX2V4cG9ydF9zZXR1cF9kYXRhOiB7fVxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0UmVwb3J0KCBvcHRpb25zICkge1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnUGF5cm9sbEV4cG9ydFJlcG9ydCc7XG5cdFx0dGhpcy52aWV3SWQgPSAnUGF5cm9sbEV4cG9ydFJlcG9ydCc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnUGF5cm9sbCBFeHBvcnQnICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdTYXZlZCBSZXBvcnQnICk7XG5cdFx0dGhpcy52aWV3X2ZpbGUgPSAnUGF5cm9sbEV4cG9ydFJlcG9ydFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElQYXlyb2xsRXhwb3J0UmVwb3J0O1xuXHRcdHRoaXMuaW5jbHVkZV9mb3JtX3NldHVwID0gdHJ1ZTtcblx0XHR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhID0ge307XG5cdH1cblxuXHRpbml0T3B0aW9ucyggY2FsbEJhY2sgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgb3B0aW9ucyA9IFtcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdwYWdlX29yaWVudGF0aW9uJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2ZvbnRfc2l6ZScgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdjaGFydF9kaXNwbGF5X21vZGUnIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnY2hhcnRfdHlwZScgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICd0ZW1wbGF0ZXMnIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc2V0dXBfZmllbGRzJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2V4cG9ydF90eXBlJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2F1dG9fcmVmcmVzaCcgfVxuXHRcdF07XG5cblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbnMoIG9wdGlvbnMsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdGNhbGxCYWNrKCByZXN1bHQgKTsgLy8gRmlyc3QgdG8gaW5pdGlhbGl6ZSBkcm9wIGRvd24gb3B0aW9ucywgYW5kIHRoZW4gdG8gaW5pdGlhbGl6ZSBlZGl0IHZpZXcgVUkuXG5cblx0XHR9ICk7XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRncm91cHM6IHtcblx0XHRcdFx0Zm9ybToge1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0V4cG9ydCcgKSwgLy8gRXhwb3J0IGlzIGRlbGliZXJhdGUgKHJhdGhlciB0aGFuIEZvcm0pIGR1ZSB0byBleHBvcnQgc2V0dXAgdGFiXG5cdFx0XHRcdFx0aWQ6IHRoaXMudmlld0lkICsgJ0Zvcm0nXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRleGNsdWRlOiBbXSxcblx0XHRcdGluY2x1ZGU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0V4cG9ydCcgKSxcblx0XHRcdFx0XHRpZDogJ2V4cG9ydF9leHBvcnQnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tZmlsZV91cGxvYWRfYmxhY2tfMjRkcCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU2F2ZSBTZXR1cCcgKSxcblx0XHRcdFx0XHRpZDogJ3NhdmVfc2V0dXAnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZm9ybScsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXNldHRpbmdzX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCdcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0b25UYWJJbmRleENoYW5nZSgpIHtcblxuXHRcdC8vIERvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgc3ViIGNsYXNzXG5cdH1cblxuXHRzZXRFZGl0TWVudVZpZXdJY29uKCkge1xuXHRcdC8vIERvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgc3ViIGNsYXNzXG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdG9uQ29udGV4dE1lbnVDbGljayggY29udGV4dF9idG4sIG1lbnVfbmFtZSApIHtcblx0XHR2YXIgaWQ7XG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIG1lbnVfbmFtZSApICkge1xuXHRcdFx0aWQgPSBtZW51X25hbWU7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBjb250ZXh0X2J0bi5kaXNhYmxlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyApIHtcblx0XHRcdHRoaXMuZXhwb3J0X2dyaWQuZ3JpZC5qcUdyaWQoICdzYXZlUm93JywgdGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyApO1xuXHRcdFx0dGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dmFyIG1lc3NhZ2Vfb3ZlcnJpZGUgPSAkLmkxOG4uXyggJ1NldHVwIGRhdGEgZm9yIHRoaXMgcmVwb3J0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIHlldC4gUGxlYXNlIGNsaWNrIG9uIHRoZSBFeHBvcnQgU2V0dXAgdGFiIHRvIGRvIHNvIG5vdy4nICk7XG5cblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3ZpZXcnOlxuXHRcdFx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdFx0XHR0aGlzLm9uVmlld0NsaWNrKCBudWxsLCBmYWxzZSwgbWVzc2FnZV9vdmVycmlkZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3ZpZXdfaHRtbCc6XG5cdFx0XHRcdFByb2dyZXNzQmFyLnNob3dPdmVybGF5KCk7XG5cdFx0XHRcdHRoaXMub25WaWV3Q2xpY2soICdodG1sJywgZmFsc2UsIG1lc3NhZ2Vfb3ZlcnJpZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd2aWV3X2h0bWxfbmV3X3dpbmRvdyc6XG5cdFx0XHRcdHRoaXMub25WaWV3Q2xpY2soICdodG1sJywgZmFsc2UsIG1lc3NhZ2Vfb3ZlcnJpZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdleHBvcnRfZXhjZWwnOlxuXHRcdFx0XHR0aGlzLm9uVmlld0V4Y2VsQ2xpY2soIG1lc3NhZ2Vfb3ZlcnJpZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdleHBvcnRfZXhwb3J0Jzpcblx0XHRcdFx0UHJvZ3Jlc3NCYXIuc2hvd092ZXJsYXkoKTtcblx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggJ3BheXJvbGxfZXhwb3J0JywgZmFsc2UsIG1lc3NhZ2Vfb3ZlcnJpZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjYW5jZWwnOlxuXHRcdFx0XHR0aGlzLm9uQ2FuY2VsQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzYXZlX2V4aXN0ZWRfcmVwb3J0JzogLy9BbGwgcmVwb3J0IHZpZXdcblx0XHRcdFx0dGhpcy5vblNhdmVFeGlzdGVkUmVwb3J0Q2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzYXZlX25ld19yZXBvcnQnOiAvL0FsbCByZXBvcnQgdmlld1xuXHRcdFx0XHR0aGlzLm9uU2F2ZU5ld1JlcG9ydENsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2F2ZV9zZXR1cCc6IC8vQWxsIHJlcG9ydCB2aWV3XG5cdFx0XHRcdHRoaXMub25TYXZlU2V0dXAoICQuaTE4bi5fKCAnRXhwb3J0IHNldHVwJyApICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRHbG9iYWwudHJpZ2dlckFuYWx5dGljc0NvbnRleHRNZW51Q2xpY2soIGNvbnRleHRfYnRuLCBtZW51X25hbWUgKTtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdGJ1aWxkRm9ybVNldHVwVUkoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHRhYjMgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfZm9ybV9zZXR1cCcgKTtcblxuXHRcdHZhciB0YWIzX2NvbHVtbjEgPSB0YWIzLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1szXSA9IFtdO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1szXS5wdXNoKCB0YWIzX2NvbHVtbjEgKTtcblxuXHRcdC8vRXhwb3J0IEZvcm1hdFxuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2V4cG9ydF90eXBlJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmV4cG9ydF90eXBlX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFeHBvcnQgRm9ybWF0JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjNfY29sdW1uMSwgJycgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0JHRoaXMub25FeHBvcnRDaGFuZ2UoIHRhcmdldC5nZXRWYWx1ZSgpICk7XG5cdFx0fSApO1xuXHR9XG5cblx0b25FeHBvcnRDaGFuZ2UoIHR5cGUgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5yZW1vdmVDdXJyZW50RXhwb3J0VUkoKTtcblxuXHRcdFByb2dyZXNzQmFyLnNob3dPdmVybGF5KCk7IC8vRW5kIHdoZW4gc2V0IGdyaWQgZGF0YSBjb21wbGV0ZVxuXG5cdFx0dGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2V4cG9ydF9wb2xpY3knLCB7XG5cdFx0XHRub0NhY2hlOiB0cnVlLCBvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0JHRoaXMuZXhwb3J0X3BvbGljeV9hcnJheSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdFx0XHRcdGNhc2UgJ2FkcCc6XG5cdFx0XHRcdFx0Y2FzZSAnYWRwX2FkdmFuY2VkJzpcblx0XHRcdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnYWRwX2hvdXJfY29sdW1uX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJ1aWxkQWRkaXRpb25hbElucHV0Qm94KCB0eXBlICk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuYnVpbGRHcmlkKCB0eXBlLCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWRwX3Jlc291cmNlJzpcblx0XHRcdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnYWRwX3Jlc291cmNlX2hvdXJfY29sdW1uX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJ1aWxkQWRkaXRpb25hbElucHV0Qm94KCB0eXBlICk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuYnVpbGRHcmlkKCB0eXBlLCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWNjZXJvJzpcblx0XHRcdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnYWNjZXJvX2hvdXJfY29sdW1uX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJ1aWxkQWRkaXRpb25hbElucHV0Qm94KCB0eXBlICk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuYnVpbGRHcmlkKCB0eXBlLCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFfbXVuaXMnOlxuXHRcdFx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdleHBvcnRfY29sdW1ucycsIHRydWUsIHtcblx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhcmVzdWx0X2RhdGEuaGFzT3duUHJvcGVydHkoICcwJyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0X2RhdGFbMF0gPSAnLS0gQ3VzdG9tIC0tJztcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5idWlsZEFkZGl0aW9uYWxJbnB1dEJveCggdHlwZSApO1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJ1aWxkR3JpZCggdHlwZSwgcmVzdWx0X2RhdGEgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2VyaWRpYW5faW5zeW5jJzpcblx0XHRcdFx0XHRjYXNlICdjaHJpczIxJzpcblx0XHRcdFx0XHRjYXNlICdwYXljaGV4X3ByZXZpZXdfYWR2YW5jZWRfam9iJzpcblx0XHRcdFx0XHRjYXNlICdwYXljaGV4X3ByZXZpZXcnOlxuXHRcdFx0XHRcdGNhc2UgJ3F1aWNrYm9va3MnOlxuXHRcdFx0XHRcdGNhc2UgJ3F1aWNrYm9va3NfYWR2YW5jZWQnOlxuXHRcdFx0XHRcdGNhc2UgJ2Nzdic6XG5cdFx0XHRcdFx0Y2FzZSAnY3N2X2FkdmFuY2VkJzpcblx0XHRcdFx0XHRjYXNlICdzYWdlXzUwJzpcblx0XHRcdFx0XHRjYXNlICdtZWRpdGVjaCc6XG5cdFx0XHRcdFx0Y2FzZSAndmVuc3VyZSc6XG5cdFx0XHRcdFx0XHQkdGhpcy5idWlsZEFkZGl0aW9uYWxJbnB1dEJveCggdHlwZSApO1xuXHRcdFx0XHRcdFx0JHRoaXMuYnVpbGRHcmlkKCB0eXBlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjbXNfcGJqJzpcblx0XHRcdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnY21zX3Bial9ob3VyX2NvbHVtbl9vcHRpb25zJywge1xuXHRcdFx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5idWlsZEFkZGl0aW9uYWxJbnB1dEJveCggdHlwZSApO1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJ1aWxkR3JpZCggdHlwZSwgcmVzdWx0LmdldFJlc3VsdCgpICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHQkdGhpcy5idWlsZEdyaWQoIHR5cGUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdGJ1aWxkR3JpZCggdHlwZSwgY29sdW1uT3B0aW9ucyApIHtcblx0XHRpZiAoIHR5cGVvZiB0eXBlID09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT0gMCApIHsgLy9vbiBmaXJzdCBsb2FkIGFuZCB3aGVuIHVzZXIgc2VsZWN0cyBcImNob29zZSBvbmVcIiB3ZSB3YW50IHRvIGRyb3AgdGhlIGdyaWRcblx0XHRcdGlmICggdGhpcy5leHBvcnRfZ3JpZCApIHtcblx0XHRcdFx0dmFyIG5ld19ncmlkID0gJCggJzx0YWJsZSBpZD1cXCdleHBvcnRfZ3JpZFxcJz4nICk7XG5cdFx0XHRcdHRoaXMuZXhwb3J0X2dyaWQuZ3JpZC5qcUdyaWQoICdHcmlkVW5sb2FkJyApO1xuXHRcdFx0XHR0aGlzLmV4cG9ydF9ncmlkLmdyaWQucmVwbGFjZVdpdGgoIG5ld19ncmlkICk7XG5cdFx0XHRcdHRoaXMuZXhwb3J0X2dyaWQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGNvbHVtbl9pbmZvX2FycmF5ID0gW107XG5cdFx0dmFyIGNvbHVtbl9vcHRpb25zX3N0cmluZyA9ICcnO1xuXG5cdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0bmFtZTogJ2NvbHVtbl9pZCcsXG5cdFx0XHRpbmRleDogJ2NvbHVtbl9pZCcsXG5cdFx0XHRsYWJlbDogJC5pMThuLl8oICdIb3VycycgKSxcblx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHR0aXRsZTogZmFsc2Vcblx0XHR9O1xuXHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cblx0XHR2YXIgaG91cl9jb2RlX2xhYmVsID0gJyc7XG5cblx0XHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdFx0Y2FzZSAnYWRwJzpcblx0XHRcdGNhc2UgJ2FkcF9hZHZhbmNlZCc6XG5cblx0XHRcdFx0Y29sdW1uT3B0aW9ucyA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCBjb2x1bW5PcHRpb25zLmFkcF9ob3VyX2NvbHVtbl9vcHRpb25zICk7XG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbHVtbk9wdGlvbnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBpICE9PSBjb2x1bW5PcHRpb25zLmxlbmd0aCAtIDEgKSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5fb3B0aW9uc19zdHJpbmcgKz0gY29sdW1uT3B0aW9uc1tpXS5mdWxsVmFsdWUgKyAnOicgKyBjb2x1bW5PcHRpb25zW2ldLmxhYmVsICsgJzsnO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5fb3B0aW9uc19zdHJpbmcgKz0gY29sdW1uT3B0aW9uc1tpXS5mdWxsVmFsdWUgKyAnOicgKyBjb2x1bW5PcHRpb25zW2ldLmxhYmVsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdG5hbWU6ICdob3VyX2NvbHVtbicsXG5cdFx0XHRcdFx0aW5kZXg6ICdob3VyX2NvbHVtbicsXG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQURQIEhvdXJzJyApLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGVkaXR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRlZGl0b3B0aW9uczogeyB2YWx1ZTogY29sdW1uX29wdGlvbnNfc3RyaW5nIH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0FEUCBIb3VycyBDb2RlJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2FkcF9yZXNvdXJjZSc6XG5cdFx0XHRcdGNvbHVtbk9wdGlvbnMgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggY29sdW1uT3B0aW9ucy5hZHBfcmVzb3VyY2VfaG91cl9jb2x1bW5fb3B0aW9ucyApO1xuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb2x1bW5PcHRpb25zLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggaSAhPT0gY29sdW1uT3B0aW9ucy5sZW5ndGggLSAxICkge1xuXHRcdFx0XHRcdFx0Y29sdW1uX29wdGlvbnNfc3RyaW5nICs9IGNvbHVtbk9wdGlvbnNbaV0uZnVsbFZhbHVlICsgJzonICsgY29sdW1uT3B0aW9uc1tpXS5sYWJlbCArICc7Jztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29sdW1uX29wdGlvbnNfc3RyaW5nICs9IGNvbHVtbk9wdGlvbnNbaV0uZnVsbFZhbHVlICsgJzonICsgY29sdW1uT3B0aW9uc1tpXS5sYWJlbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2x1bW5faW5mbyA9IHtcblx0XHRcdFx0XHRuYW1lOiAnaG91cl9jb2x1bW4nLFxuXHRcdFx0XHRcdGluZGV4OiAnaG91cl9jb2x1bW4nLFxuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0FEUCBIb3VycycgKSxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0XHRmb3JtYXR0ZXI6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHRpdGxlOiBmYWxzZSxcblx0XHRcdFx0XHRlZGl0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0ZWRpdG9wdGlvbnM6IHsgdmFsdWU6IGNvbHVtbl9vcHRpb25zX3N0cmluZyB9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cblx0XHRcdFx0aG91cl9jb2RlX2xhYmVsID0gJC5pMThuLl8oICdBRFAgSG91cnMgQ29kZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhY2Nlcm8nOlxuXHRcdFx0XHRjb2x1bW5PcHRpb25zID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGNvbHVtbk9wdGlvbnMuYWNjZXJvX2hvdXJfY29sdW1uX29wdGlvbnMgKTtcblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29sdW1uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGkgIT09IGNvbHVtbk9wdGlvbnMubGVuZ3RoIC0gMSApIHtcblx0XHRcdFx0XHRcdGNvbHVtbl9vcHRpb25zX3N0cmluZyArPSBjb2x1bW5PcHRpb25zW2ldLmZ1bGxWYWx1ZSArICc6JyArIGNvbHVtbk9wdGlvbnNbaV0ubGFiZWwgKyAnOyc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbHVtbl9vcHRpb25zX3N0cmluZyArPSBjb2x1bW5PcHRpb25zW2ldLmZ1bGxWYWx1ZSArICc6JyArIGNvbHVtbk9wdGlvbnNbaV0ubGFiZWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRcdFx0bmFtZTogJ2hvdXJfY29sdW1uJyxcblx0XHRcdFx0XHRpbmRleDogJ2hvdXJfY29sdW1uJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdIb3VyIFR5cGUnICksXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0Zm9ybWF0dGVyOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR0aXRsZTogZmFsc2UsXG5cdFx0XHRcdFx0ZWRpdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdGVkaXRvcHRpb25zOiB7IHZhbHVlOiBjb2x1bW5fb3B0aW9uc19zdHJpbmcgfVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0XHRcdGhvdXJfY29kZV9sYWJlbCA9ICQuaTE4bi5fKCAnSEVEIE92ZXJyaWRlICMnICk7IC8vSG91cnMgQ29kZVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BheWNoZXhfcHJldmlld19hZHZhbmNlZF9qb2InOlxuXHRcdFx0Y2FzZSAncGF5Y2hleF9wcmV2aWV3Jzpcblx0XHRcdFx0aG91cl9jb2RlX2xhYmVsID0gJC5pMThuLl8oICdQYXljaGV4IEhvdXJzIENvZGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGF5Y2hleF9vbmxpbmUnOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0Vhcm5pbmcgQ29kZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjZXJpZGlhbl9pbnN5bmMnOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0NlcmlkaWFuIEhvdXJzIENvZGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWlsbGVuaXVtJzpcblx0XHRcdFx0aG91cl9jb2RlX2xhYmVsID0gJC5pMThuLl8oICdNaWxsZW5pdW0gSG91cnMgQ29kZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdxdWlja2Jvb2tzX2FkdmFuY2VkJzpcblx0XHRcdGNhc2UgJ3F1aWNrYm9va3MnOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ1F1aWNrYm9va3MgUGF5cm9sbCBJdGVtIE5hbWUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3VyZXBheXJvbGwnOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ1BheXJvbGwgQ29kZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjaHJpczIxJzpcblx0XHRcdFx0aG91cl9jb2RlX2xhYmVsID0gJC5pMThuLl8oICdDaHJpczIxIEhvdXJzIENvZGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmFfbXVuaXMnOlxuXHRcdFx0XHRjb2x1bW5PcHRpb25zID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGNvbHVtbk9wdGlvbnMgKTtcblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29sdW1uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGkgIT09IGNvbHVtbk9wdGlvbnMubGVuZ3RoIC0gMSApIHtcblx0XHRcdFx0XHRcdGNvbHVtbl9vcHRpb25zX3N0cmluZyArPSBjb2x1bW5PcHRpb25zW2ldLmZ1bGxWYWx1ZSArICc6JyArIGNvbHVtbk9wdGlvbnNbaV0ubGFiZWwgKyAnOyc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbHVtbl9vcHRpb25zX3N0cmluZyArPSBjb2x1bW5PcHRpb25zW2ldLmZ1bGxWYWx1ZSArICc6JyArIGNvbHVtbk9wdGlvbnNbaV0ubGFiZWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRcdFx0bmFtZTogJ2hvdXJfY29sdW1uJyxcblx0XHRcdFx0XHRpbmRleDogJ2hvdXJfY29sdW1uJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDb2x1bW5zJyApLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGVkaXR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRlZGl0b3B0aW9uczogeyB2YWx1ZTogY29sdW1uX29wdGlvbnNfc3RyaW5nIH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0hvdXJzIENvZGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY29tcHVwYXknOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0RFVCBDb2RlJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NhZ2VfNTAnOlxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSAkLmkxOG4uXyggJ0l0ZW0gTnVtYmVyJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2Ntc19wYmonOlxuXHRcdFx0XHRjb2x1bW5PcHRpb25zID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGNvbHVtbk9wdGlvbnMuY21zX3Bial9ob3VyX2NvbHVtbl9vcHRpb25zICk7XG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbHVtbk9wdGlvbnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBpICE9PSBjb2x1bW5PcHRpb25zLmxlbmd0aCAtIDEgKSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5fb3B0aW9uc19zdHJpbmcgKz0gY29sdW1uT3B0aW9uc1tpXS5mdWxsVmFsdWUgKyAnOicgKyBjb2x1bW5PcHRpb25zW2ldLmxhYmVsICsgJzsnO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb2x1bW5fb3B0aW9uc19zdHJpbmcgKz0gY29sdW1uT3B0aW9uc1tpXS5mdWxsVmFsdWUgKyAnOicgKyBjb2x1bW5PcHRpb25zW2ldLmxhYmVsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdG5hbWU6ICdob3VyX2NvbHVtbicsXG5cdFx0XHRcdFx0aW5kZXg6ICdob3VyX2NvbHVtbicsXG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRXhwb3J0JyApLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGVkaXR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRlZGl0b3B0aW9uczogeyB2YWx1ZTogY29sdW1uX29wdGlvbnNfc3RyaW5nIH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblxuXHRcdFx0XHRob3VyX2NvZGVfbGFiZWwgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtZWRpdGVjaCc6XG5cdFx0XHRcdGhvdXJfY29kZV9sYWJlbCA9ICQuaTE4bi5fKCAnRWFybmluZyBOdW1iZXInICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmVuc3VyZSc6XG5cdFx0XHRcdGhvdXJfY29kZV9sYWJlbCA9ICQuaTE4bi5fKCAnUGF5IENvZGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY3N2Jzpcblx0XHRcdGNhc2UgJ2Nzdl9hZHZhbmNlZCc6XG5cdFx0XHRcdGhvdXJfY29kZV9sYWJlbCA9ICQuaTE4bi5fKCAnSG91cnMgQ29kZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0aWYgKCBob3VyX2NvZGVfbGFiZWwgIT09IGZhbHNlICkge1xuXHRcdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRcdG5hbWU6ICdob3VyX2NvZGUnLFxuXHRcdFx0XHRpbmRleDogJ2hvdXJfY29kZScsXG5cdFx0XHRcdGxhYmVsOiBob3VyX2NvZGVfbGFiZWwsXG5cdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0ZWRpdHR5cGU6ICd0ZXh0J1xuXHRcdFx0fTtcblx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmV4cG9ydF9ncmlkICkge1xuXHRcdFx0dGhpcy5leHBvcnRfZ3JpZC5ncmlkLmpxR3JpZCggJ0dyaWRVbmxvYWQnICk7XG5cdFx0XHR0aGlzLmV4cG9ydF9ncmlkID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuZXhwb3J0X2dyaWQgPSBuZXcgVFRHcmlkKCAnZXhwb3J0X2dyaWQnLCB7XG5cdFx0XHRjb250YWluZXJfc2VsZWN0b3I6ICcuaW5zaWRlLWVkaXRvci1kaXYgLmdyaWQtZGl2Jyxcblx0XHRcdG11bHRpc2VsZWN0OiBmYWxzZSxcblx0XHRcdHdpbk11bHRpU2VsZWN0OiBmYWxzZSxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdGVkaXR1cmw6ICdjbGllbnRBcnJheScsXG5cdFx0XHRvblNlbGVjdFJvdzogZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0XHRpZiAoIGlkICkge1xuXHRcdFx0XHRcdGlmICggJHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5leHBvcnRfZ3JpZC5ncmlkLmpxR3JpZCggJ3NhdmVSb3cnLCAkdGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCR0aGlzLmV4cG9ydF9ncmlkLmdyaWQuanFHcmlkKCAnZWRpdFJvdycsIGlkLCB0cnVlICk7XG5cdFx0XHRcdFx0JHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgPSBpZDtcblxuXHRcdFx0XHRcdCR0aGlzLmV4cG9ydF9ncmlkLnNldEdyaWRDb2x1bW5zV2lkdGgoKTsgLy9XaGVuIGlubGluZSBlZGl0aW5nLCBpdCBtaWdodCBjaGFuZ2UgdGhlIHdpZHRoIG9mIGVhY2ggcm93LCBzbyByZXNpemUgdGhlIGNvbHVtbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYWN0aXZhdGluZyB0aGlzLlxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0b25SZXNpemVHcmlkOiBmYWxzZVxuXG5cdFx0fSwgY29sdW1uX2luZm9fYXJyYXkgKTtcblxuXHRcdCR0aGlzLnNldEV4cG9ydEdyaWREYXRhKCB0eXBlICk7IC8vU2V0IEdyaWQgc2l6ZSBhdCBmaW5hbFxuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblx0c2V0RXhwb3J0R3JpZERhdGEoIHR5cGUgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBncmlkX2RhdGEgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggdGhpcy5leHBvcnRfcG9saWN5X2FycmF5ICk7XG5cdFx0dmFyIGV4cG9ydF9jb2x1bW5zID0gbnVsbDtcblx0XHR2YXIgbGVuID0gZ3JpZF9kYXRhLmxlbmd0aDtcblx0XHR2YXIgZ3JpZF9zb3VyY2UgPSBbXTtcblxuXHRcdHRoaXMuYXBpLmdldE9wdGlvbnMoICdkZWZhdWx0X2hvdXJfY29kZXMnLCB7XG5cdFx0XHRub0NhY2hlOiB0cnVlLFxuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc19kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHR2YXIgZGVmYXVsdF9jb2x1bW5zID0gW107XG5cdFx0XHRcdGlmICggcmVzX2RhdGFbdHlwZV0gJiYgcmVzX2RhdGFbdHlwZV0uY29sdW1ucyApIHtcblx0XHRcdFx0XHRkZWZhdWx0X2NvbHVtbnMgPSByZXNfZGF0YVt0eXBlXS5jb2x1bW5zO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAkdGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhICYmICR0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFbdHlwZV0gJiYgJHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YVt0eXBlXS5jb2x1bW5zICkge1xuXHRcdFx0XHRcdGV4cG9ydF9jb2x1bW5zID0gJHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YVt0eXBlXS5jb2x1bW5zO1xuXHRcdFx0XHRcdGRvTmV4dCggZXhwb3J0X2NvbHVtbnMsIGRlZmF1bHRfY29sdW1ucyApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YSAmJiAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVt0eXBlXSAmJiAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVt0eXBlXS5jb2x1bW5zICkge1xuXHRcdFx0XHRcdGV4cG9ydF9jb2x1bW5zID0gJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbdHlwZV0uY29sdW1ucztcblx0XHRcdFx0XHRkb05leHQoIGV4cG9ydF9jb2x1bW5zLCBkZWZhdWx0X2NvbHVtbnMgKTtcblx0XHRcdFx0fSBlbHNlIGlmICggcmVzX2RhdGFbdHlwZV0gJiYgcmVzX2RhdGFbdHlwZV0uY29sdW1ucyApIHtcblx0XHRcdFx0XHRkb05leHQoIGRlZmF1bHRfY29sdW1ucyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMuc2V0RXhwb3J0R3JpZFNpemUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRmdW5jdGlvbiBkb05leHQoIGV4cG9ydF9jb2x1bW5zLCBkZWZhdWx0X2NvbHVtbnMgKSB7XG5cdFx0XHR2YXIgaG91cl9jb2RlO1xuXHRcdFx0dmFyIGhvdXJfY29sdW1uO1xuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdHZhciByb3cgPSBncmlkX2RhdGFbaV07XG5cdFx0XHRcdHZhciBjb2x1bW5faWQgPSByb3cubGFiZWw7XG5cdFx0XHRcdHZhciBleHBvcnRfY29sdW1uX3ZhbHVlID0gZXhwb3J0X2NvbHVtbnNbcm93LnZhbHVlXTtcblx0XHRcdFx0Ly8gRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydHkgJ2hvdXJfY29sdW1uJyBvZiB1bmRlZmluZWQgaW4gL2ludGVyZmFjZS9odG1sNS8jIW09RXhjZXB0aW9uJnNtPVBheXJvbGxFeHBvcnRSZXBvcnQmc2lkPTE3MjYgbGluZSA1MjNcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGV4cG9ydF9jb2x1bW5fdmFsdWUgKSA9PSBmYWxzZSApIHtcblx0XHRcdFx0XHRpZiAoIGRlZmF1bHRfY29sdW1ucyAmJiByb3cudmFsdWUgJiYgZGVmYXVsdF9jb2x1bW5zW3Jvdy52YWx1ZV0gKSB7XG5cdFx0XHRcdFx0XHRleHBvcnRfY29sdW1uX3ZhbHVlID0gZGVmYXVsdF9jb2x1bW5zW3Jvdy52YWx1ZV07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGV4cG9ydF9jb2x1bW5fdmFsdWUgPSB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aG91cl9jb2x1bW4gPSBleHBvcnRfY29sdW1uX3ZhbHVlLmhvdXJfY29sdW1uO1xuXHRcdFx0XHRob3VyX2NvZGUgPSBleHBvcnRfY29sdW1uX3ZhbHVlLmhvdXJfY29kZTtcblxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdFx0XHRcdGNhc2UgJ2FkcCc6XG5cdFx0XHRcdFx0Y2FzZSAnYWRwX2FkdmFuY2VkJzpcblx0XHRcdFx0XHRjYXNlICdhZHBfcmVzb3VyY2UnOlxuXHRcdFx0XHRcdGNhc2UgJ2FjY2Vybyc6XG5cdFx0XHRcdFx0Y2FzZSAndmFfbXVuaXMnOlxuXHRcdFx0XHRcdGNhc2UgJ3NhZ2VfNTAnOlxuXHRcdFx0XHRcdGNhc2UgJ2Ntc19wYmonOlxuXHRcdFx0XHRcdFx0aWYgKCAhaG91cl9jb2x1bW4gKSB7XG5cdFx0XHRcdFx0XHRcdGhvdXJfY29sdW1uID0gJzAnO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgcm93X2RhdGEgPSB7XG5cdFx0XHRcdFx0XHRcdGlkOiBpICsgMjAwLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5faWQ6IGNvbHVtbl9pZCxcblx0XHRcdFx0XHRcdFx0aG91cl9jb2x1bW46IGhvdXJfY29sdW1uLFxuXHRcdFx0XHRcdFx0XHRob3VyX2NvZGU6IGhvdXJfY29kZSxcblx0XHRcdFx0XHRcdFx0Y29sdW1uX2lkX2tleTogcm93LnZhbHVlXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJvd19kYXRhID0ge1xuXHRcdFx0XHRcdFx0XHRpZDogaSArIDIwMCxcblx0XHRcdFx0XHRcdFx0Y29sdW1uX2lkOiBjb2x1bW5faWQsXG5cdFx0XHRcdFx0XHRcdGhvdXJfY29kZTogaG91cl9jb2RlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5faWRfa2V5OiByb3cudmFsdWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyaWRfc291cmNlLnB1c2goIHJvd19kYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdCR0aGlzLmV4cG9ydF9ncmlkLnNldERhdGEoIGdyaWRfc291cmNlICk7XG5cdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTtcblxuXHRcdH1cblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0c2V0RXhwb3J0R3JpZFNpemUoKSB7XG5cdFx0aWYgKCAhdGhpcy5leHBvcnRfZ3JpZCB8fCAhdGhpcy5leHBvcnRfZ3JpZC5ncmlkLmlzKCAnOnZpc2libGUnICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHRhYjMgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnI2Zvcm1fc2V0dXBfY29udGVudF9kaXYnICk7XG5cdFx0dmFyIGZpcnN0X3JvdyA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcuZmlyc3Qtcm93JyApO1xuXHRcdHRoaXMuZXhwb3J0X2dyaWQuZ3JpZC5zZXRHcmlkV2lkdGgoIHRoaXMuZWRpdF92aWV3LmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYgJyApLndpZHRoKCkgKyAxNCApO1xuXHRcdCQoICcjZ2JveF9leHBvcnRfZ3JpZCcgKS5jc3MoICdvdmVyZmxvdycsICdoaWRkZW4nICk7XG5cdFx0dGhpcy5leHBvcnRfZ3JpZC5ncmlkLnNldEdyaWRIZWlnaHQoIHRhYjMuaGVpZ2h0KCkgLSBmaXJzdF9yb3cuaGVpZ2h0KCkgKTtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdG9uVGFiU2hvdyggZSwgdWkgKSB7XG5cdFx0dmFyIGtleSA9ICQoIGUudGFyZ2V0ICkudGFicyggJ29wdGlvbicsICdhY3RpdmUnICk7XG5cblx0XHQkKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwnICkuY3NzKCAnd2lkdGgnLCAnYXV0bycgKTtcblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSgga2V5ICk7XG5cblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxhc3RfaW5kZXggPSB0aGlzLmdldEVkaXRWaWV3VGFiSW5kZXgoKTtcblxuXHRcdGlmICggKCBsYXN0X2luZGV4ID09PSAxIHx8IHRoaXMubmVlZF9yZWZyZXNoX2Rpc3BsYXlfY29sdW1ucyApICYmIGtleSA9PT0gMCApIHtcblx0XHRcdHRoaXMuYnVpbGRSZXBvcnRVSUJhc2VPblNldHVwRmllbGRzKCk7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1lbnUoKTtcblx0XHR9IGVsc2UgaWYgKCBrZXkgPT09IDEgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuc2V0dXBfZmllbGQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zZXR1cF9maWVsZCApO1xuXHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA9PSAxMCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmF1dG9fcmVmcmVzaC5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1lbnUoKTtcblx0XHR9IGVsc2UgaWYgKCBrZXkgPT09IDIgKSB7XG5cdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY2hhcnQnICkuZmluZCggJy5maXJzdC1jb2x1bW4nICkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9jaGFydCcgKS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tbWVzc2FnZScgKS5odG1sKCBHbG9iYWwuZ2V0VXBncmFkZU1lc3NhZ2UoKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gMyApIHtcblx0XHRcdHRoaXMuc2V0RXhwb3J0R3JpZFNpemUoKTtcblx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gNCApIHtcblx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYjQnICkuZmluZCggJy5maXJzdC1jb2x1bW4tc3ViLXZpZXcnICkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0dGhpcy5pbml0U3ViQ3VzdG9tQ29sdW1uVmlldygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiNCcgKS5maW5kKCAnLmZpcnN0LWNvbHVtbi1zdWItdmlldycgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tbWVzc2FnZScgKS5odG1sKCBHbG9iYWwuZ2V0VXBncmFkZU1lc3NhZ2UoKSApO1xuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgga2V5ID09PSA1ICkge1xuXHRcdFx0dGhpcy5pbml0U3ViU2F2ZWRSZXBvcnRWaWV3KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuY2hlY2tGb3JtU2V0dXBTYXZlZCggbGFzdF9pbmRleCwgJC5pMThuLl8oICdFeHBvcnQgU2V0dXAnICkgKTtcblx0fVxuXG5cdGJ1aWxkQWRkaXRpb25hbElucHV0Qm94KCB0eXBlICkge1xuXHRcdGlmICggdGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhW3R5cGVdICkge1xuXHRcdFx0dGhpcy5leHBvcnRfc2V0dXBfZGF0YSA9IHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YVt0eXBlXTtcblxuXHRcdFx0aWYgKCAhdGhpcy5leHBvcnRfc2V0dXBfZGF0YS5jb2x1bW5zICYmIHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbdHlwZV0gKSB7XG5cdFx0XHRcdHRoaXMuZXhwb3J0X3NldHVwX2RhdGEgPSB0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW3R5cGVdO1xuXHRcdFx0XHR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhLmV4cG9ydF90eXBlID0gdHlwZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhID0ge307XG5cdFx0fVxuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpYyA9IHt9O1xuXG5cdFx0dmFyIHRhYjMgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfZm9ybV9zZXR1cCcgKTtcblxuXHRcdHZhciB0YWIzX2NvbHVtbjEgPSB0YWIzLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1szXSA9IFtdO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1szXS5wdXNoKCB0YWIzX2NvbHVtbjEgKTtcblxuXHRcdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0XHRjYXNlICdhZHAnOlxuXHRcdFx0XHQvL0NvbXBhbnkgY29kZVxuXHRcdFx0XHR2YXIgY29kZSA9ICdjb21wYW55X2NvZGUnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogY29kZSB9ICk7XG5cblx0XHRcdFx0dmFyIGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciB0ZXh0X2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveC5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveCApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ29tcGFueSBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dCwgdGV4dF9ib3hdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveC5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2FkcF9jb21wYW55X2NvZGVfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQsIHRydWVdICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvL0JhdGNoIElEXG5cdFx0XHRcdHZhciBjb2RlMSA9ICdiYXRjaF9pZCc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUxIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94MS5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDEuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTEgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDEgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDEgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0JhdGNoIElEJyApLCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdhZHBfYmF0Y2hfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MSwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUxXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblxuXHRcdFx0XHQvLyBUZW1wIERlcGFydG1lbnRcblxuXHRcdFx0XHR2YXIgY29kZTIgPSAndGVtcF9kZXB0Jztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLlRDb21ib0JveCggeyBmaWVsZDogY29kZTIgfSApO1xuXG5cdFx0XHRcdGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciB0ZXh0X2JveDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94Mi5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMiArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0MiApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94MiApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1RlbXAgRGVwYXJ0bWVudCcgKSwgW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUyXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdhZHBfdGVtcF9kZXB0X29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDIsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMl0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhZHBfYWR2YW5jZWQnOlxuXHRcdFx0Y2FzZSAnYWRwX3Jlc291cmNlJzogLy9BRFAgUmVzb3VyY2UvUGF5IEV4cGVydFxuXHRcdFx0XHQvL0NvbXBhbnkgY29kZVxuXHRcdFx0XHR2YXIgY29kZSA9ICdjb21wYW55X2NvZGUnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogY29kZSB9ICk7XG5cblx0XHRcdFx0dmFyIGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciB0ZXh0X2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveC5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveCApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ29tcGFueSBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dCwgdGV4dF9ib3hdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveC5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2FkcF9jb21wYW55X2NvZGVfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQsIHRydWVdICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvL0JhdGNoIElEXG5cdFx0XHRcdHZhciBjb2RlMSA9ICdiYXRjaF9pZCc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUxIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94MS5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDEuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTEgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDEgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDEgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0JhdGNoIElEJyApLCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdhZHBfYmF0Y2hfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MSwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUxXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblxuXHRcdFx0XHQvLyBUZW1wIERlcGFydG1lbnRcblxuXHRcdFx0XHR2YXIgY29kZTIgPSAndGVtcF9kZXB0Jztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLlRDb21ib0JveCggeyBmaWVsZDogY29kZTIgfSApO1xuXG5cdFx0XHRcdGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciB0ZXh0X2JveDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94Mi5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMiArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0MiApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94MiApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1RlbXAgRGVwYXJ0bWVudCcgKSwgW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUyXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdhZHBfdGVtcF9kZXB0X29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDIsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMl0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cblx0XHRcdFx0Ly8gSm9iIENvc3QgI1xuXHRcdFx0XHR2YXIgY29kZTMgPSAnam9iX2Nvc3QnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0MyA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMyB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHRleHRfYm94MyA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveDMuY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3gzLlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGUzICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQzICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3gzICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iIENvc3QgIycgKSwgW2Zvcm1faXRlbV9pbnB1dDMsIHRleHRfYm94M10sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDMsIHRleHRfYm94M10gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUzXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdhZHBfam9iX2Nvc3Rfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUzXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MywgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlM10gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlM107XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlM107XG5cblx0XHRcdFx0Ly8gV29yayBDbGFzc1xuXHRcdFx0XHR2YXIgY29kZTQgPSAnd29ya19jbGFzcyc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0NC5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGU0IH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3g0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94NC5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDQuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTQgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDQgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDQgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdXb3JrIENsYXNzJyApLCBbZm9ybV9pdGVtX2lucHV0NCwgdGV4dF9ib3g0XSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0NCwgdGV4dF9ib3g0XSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQ0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94NC5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94NC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTRdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94NC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2FkcF93b3JrX2NsYXNzX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQ0LnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQ0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlNF0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDQudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDQsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTRdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTRdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTRdO1xuXG5cdFx0XHRcdC8vU3RhdGVcblx0XHRcdFx0dmFyIGNvZGU3ID0gJ3N0YXRlX2NvbHVtbnMnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0NyA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDcuVENvbWJvQm94KCB7XG5cdFx0XHRcdFx0ZmllbGQ6IGNvZGU3LFxuXHRcdFx0XHRcdHNldF9lbXB0eTogdHJ1ZVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0NywgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQ3XSApO1xuXHRcdFx0XHRUVEFQSS5BUElKb2JEZXRhaWxSZXBvcnQuZ2V0T3B0aW9ucyggJ3N0YXRpY19jb2x1bW5zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Ny5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Ny5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTddICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlN10gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlN107XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlN107XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhY2Nlcm8nOlxuXHRcdFx0XHQvLyBUZW1wIERlcGFydG1lbnRcblx0XHRcdFx0dmFyIGNvZGUyID0gJ3RlbXBfZGVwdCc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUyIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94Mi5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDIuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTIgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDIgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDIgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEZXBhcnRtZW50IE92ZXJyaWRlIENvZGUnICksIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnYWNjZXJvX3RlbXBfZGVwdF9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTJdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQyLCB0cnVlXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTJdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmFfbXVuaXMnOlxuXHRcdFx0XHQvL0RlcGFydG1lbnRcblx0XHRcdFx0Y29kZSA9ICdkZXBhcnRtZW50Jztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogY29kZSB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dGV4dF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3guY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3guVFRleHRJbnB1dCggeyBmaWVsZDogY29kZSArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3ggKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RlcGFydG1lbnQnICksIFtmb3JtX2l0ZW1faW5wdXQsIHRleHRfYm94XSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2V4cG9ydF9jb2x1bW5zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRpZiAoICFyZXN1bHRfZGF0YS5oYXNPd25Qcm9wZXJ0eSggJzAnICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdF9kYXRhWzBdID0gJy0tIEN1c3RvbSAtLSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQsIHRydWVdICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvL0VtcGxveWVlIE51bWJlclxuXHRcdFx0XHRjb2RlMSA9ICdlbXBsb3llZV9udW1iZXInO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUxIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR0ZXh0X2JveDEgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gxLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94MS5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMSArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0MSApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94MSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUgTnVtYmVyJyApLCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdleHBvcnRfY29sdW1ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGlmICggIXJlc3VsdF9kYXRhLmhhc093blByb3BlcnR5KCAnMCcgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0X2RhdGFbMF0gPSAnLS0gQ3VzdG9tIC0tJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MSwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUxXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblxuXHRcdFx0XHQvLyBMb25nIEdMIEFjY291bnRcblxuXHRcdFx0XHRjb2RlMiA9ICdnbF9hY2NvdW50Jztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MiA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMiB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dGV4dF9ib3gyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94Mi5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDIuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTIgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDIgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDIgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdMb25nIEdMIEFjY291bnQnICksIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnZXhwb3J0X2NvbHVtbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdGlmICggIXJlc3VsdF9kYXRhLmhhc093blByb3BlcnR5KCAnMCcgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0X2RhdGFbMF0gPSAnLS0gQ3VzdG9tIC0tJztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTJdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQyLCB0cnVlXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTJdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2VyaWRpYW5faW5zeW5jJzpcblx0XHRcdFx0Ly8gRW1wbG95ZXIgTnVtYmVyXG5cdFx0XHRcdGNvZGUgPSAnZW1wbG95ZXJfbnVtYmVyJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llciBOdW1iZXInICksIGZvcm1faXRlbV9pbnB1dCwgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXRdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BheWNoZXhfcHJldmlldyc6XG5cdFx0XHRcdC8vIENsaWVudCBOdW1iZXJcblx0XHRcdFx0Y29kZSA9ICdjbGllbnRfbnVtYmVyJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDbGllbnQgTnVtYmVyJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0XSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGVdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXljaGV4X3ByZXZpZXdfYWR2YW5jZWRfam9iJzpcblx0XHRcdFx0Ly8gQ2xpZW50IE51bWJlclxuXHRcdFx0XHRjb2RlID0gJ2NsaWVudF9udW1iZXJfYWR2Jztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDbGllbnQgTnVtYmVyJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0XSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhWydjbGllbnRfbnVtYmVyJ10gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvL0pvYlxuXHRcdFx0XHRjb2RlMSA9ICdqb2JfY29sdW1ucyc7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0ZmllbGQ6IGNvZGUxLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0XHRrZXk6ICd2YWx1ZScsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0pvYicgKSwgZm9ybV9pdGVtX2lucHV0MSwgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQxXSApO1xuXHRcdFx0XHRUVEFQSS5BUElKb2JEZXRhaWxSZXBvcnQuZ2V0T3B0aW9ucyggJ3N0YXRpY19jb2x1bW5zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMV0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMV07XG5cblx0XHRcdFx0Ly9TdGF0ZVxuXHRcdFx0XHRjb2RlMiA9ICdzdGF0ZV9jb2x1bW5zJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MiA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuVENvbWJvQm94KCB7XG5cdFx0XHRcdFx0ZmllbGQ6IGNvZGUyLFxuXHRcdFx0XHRcdHNldF9lbXB0eTogdHJ1ZVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0MiwgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQyXSApO1xuXHRcdFx0XHRUVEFQSS5BUElKb2JEZXRhaWxSZXBvcnQuZ2V0T3B0aW9ucyggJ3N0YXRpY19jb2x1bW5zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTJdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMl0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cblx0XHRcdFx0Ly8gSW5jbHVkZSBPdmVycmlkZSBSYXRlc1xuXHRcdFx0XHRjb2RlID0gJ2luY2x1ZGVfaG91cmx5X3JhdGUnO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6IGNvZGUgfSApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0luY2x1ZGUgT3ZlcnJpZGUgUmF0ZXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXRdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3F1aWNrYm9va3MnOlxuXHRcdFx0Y2FzZSAncXVpY2tib29rc19hZHZhbmNlZCc6XG5cdFx0XHRcdC8vIENvbXBhbnkgTmFtZVxuXHRcdFx0XHRjb2RlID0gJ2NvbXBhbnlfbmFtZSc7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZSB9ICk7XG5cblx0XHRcdFx0dmFyIGNvbnRhaW5lcldpdGhUZXh0VGlwID0gdGhpcy5idWlsZFdpZGdldENvbnRhaW5lcldpdGhUZXh0VGlwKCBmb3JtX2l0ZW1faW5wdXQsICQuaTE4bi5fKCAnKEV4YWN0bHkgYXMgc2hvd24gaW4gUXVpY2tib29rcyknICkgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NvbXBhbnkgTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIzX2NvbHVtbjEsICcnLCBjb250YWluZXJXaXRoVGV4dFRpcCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXRdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvLyBDb21wYW55IENyZWF0ZWQgVGltZVxuXHRcdFx0XHRjb2RlID0gJ2NvbXBhbnlfY3JlYXRlZF9kYXRlJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlIH0gKTtcblxuXHRcdFx0XHRjb250YWluZXJXaXRoVGV4dFRpcCA9IHRoaXMuYnVpbGRXaWRnZXRDb250YWluZXJXaXRoVGV4dFRpcCggZm9ybV9pdGVtX2lucHV0LCAkLmkxOG4uXyggJyhFeGFjdGx5IGFzIHNob3duIGluIGV4cG9ydGVkIHRpbWVyIGxpc3QpJyApICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDb21wYW55IENyZWF0ZWQgVGltZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIzX2NvbHVtbjEsICcnLCBjb250YWluZXJXaXRoVGV4dFRpcCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXRdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHQvL01hcCBQUk9KIEZpZWxkIFRvXG5cdFx0XHRcdGNvZGUxID0gJ3Byb2onO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5UQ29tYm9Cb3goIHtcblx0XHRcdFx0XHRmaWVsZDogY29kZTFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWFwIFBST0ogRmllbGQgVG8nICksIGZvcm1faXRlbV9pbnB1dDEsIHRhYjNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MV0gKTtcblx0XHRcdFx0dGhpcy5hcGkuZ2V0T3B0aW9ucyggJ3F1aWNrYm9va3NfcHJval9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMV0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMV07XG5cblx0XHRcdFx0Ly9NYXAgSVRFTSBGaWVsZCBUb1xuXHRcdFx0XHRjb2RlMiA9ICdpdGVtJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MiA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuVENvbWJvQm94KCB7XG5cdFx0XHRcdFx0ZmllbGQ6IGNvZGUyXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01hcCBJVEVNIEZpZWxkIFRvJyApLCBmb3JtX2l0ZW1faW5wdXQyLCB0YWIzX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDJdICk7XG5cdFx0XHRcdHRoaXMuYXBpLmdldE9wdGlvbnMoICdxdWlja2Jvb2tzX3Byb2pfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUyXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTJdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXG5cdFx0XHRcdC8vTWFwIElURU0gRmllbGQgVG9cblx0XHRcdFx0dmFyIGNvZGUzID0gJ2pvYic7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQzID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5UQ29tYm9Cb3goIHtcblx0XHRcdFx0XHRmaWVsZDogY29kZTNcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWFwIEpPQiBGaWVsZCBUbycgKSwgZm9ybV9pdGVtX2lucHV0MywgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQzXSApO1xuXHRcdFx0XHR0aGlzLmFwaS5nZXRPcHRpb25zKCAncXVpY2tib29rc19wcm9qX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlM10gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUzXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NhZ2VfNTAnOlxuXHRcdFx0XHQvL0NvbXBhbnkgY29kZVxuXHRcdFx0XHR2YXIgY29kZSA9ICdjdXN0b21lcl9uYW1lJztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUgfSApO1xuXG5cdFx0XHRcdHZhciBoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3guY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3guVFRleHRJbnB1dCggeyBmaWVsZDogY29kZSArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3ggKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0N1c3RvbWVyIE5hbWUnICksIFtmb3JtX2l0ZW1faW5wdXQsIHRleHRfYm94XSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnc2FnZV81MF9jdXN0b21lcl9uYW1lX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0LCB0cnVlXSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGVdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjaHJpczIxJzogLy9DaHJpczIxXG5cdFx0XHRcdC8vSm9iXG5cdFx0XHRcdHZhciBjb2RlMSA9ICdqb2InO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0MSA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMSB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHRleHRfYm94MSA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveDEuY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3gxLlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGUxICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQxICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3gxICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iIE51bWJlcicgKSwgW2Zvcm1faXRlbV9pbnB1dDEsIHRleHRfYm94MV0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDEsIHRleHRfYm94MV0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDEuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDEuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjaHJpczIxX2pvYl9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQxLCB0cnVlXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTFdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTFdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTFdO1xuXG5cblx0XHRcdFx0Ly9Db3N0IENlbnRlclxuXHRcdFx0XHR2YXIgY29kZTIgPSAnY29zdF9jZW50ZXInO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0MiA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMiB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHRleHRfYm94MiA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3gyLlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGUyICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQyICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3gyICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ29zdCBDZW50ZXIgQ29kZScgKSwgW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDIsIHRleHRfYm94Ml0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUyXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjaHJpczIxX2Nvc3RfY2VudGVyX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDIsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMl0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjbXNfcGJqJzpcblx0XHRcdFx0Ly9GYWNpbGl0eSBJRFxuXHRcdFx0XHR2YXIgY29kZSA9ICdmYWNpbGl0eV9jb2RlJztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUgfSApO1xuXG5cdFx0XHRcdHZhciBoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIHRleHRfYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94LmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94LlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGUgKyAnX3RleHQnIH0gKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveCApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRmFjaWxpdHkgSUQnICksIFtmb3JtX2l0ZW1faW5wdXQsIHRleHRfYm94XSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2Ntc19wYmpfZmFjaWxpdHlfY29kZV9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dCwgdHJ1ZV0gKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZV0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGVdO1xuXG5cdFx0XHRcdC8vU3RhdGVcblx0XHRcdFx0dmFyIGNvZGUxID0gJ3N0YXRlX2NvZGUnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0MSA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMSB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHRcdHZhciB0ZXh0X2JveDEgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gxLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94MS5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMSArICdfdGV4dCcgfSApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDEgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDEgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N0YXRlJyApLCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjbXNfb2JqX3N0YXRlX2NvZGVfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MSwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUxXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblxuXHRcdFx0XHQvLyBQYXkgVHlwZSBDb2RlXG5cdFx0XHRcdHZhciBjb2RlMiA9ICdwYXlfdHlwZV9jb2RlJztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLlRDb21ib0JveCggeyBmaWVsZDogY29kZTIgfSApO1xuXG5cdFx0XHRcdGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdFx0XHR2YXIgdGV4dF9ib3gyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94Mi5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDIuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTIgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDIgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDIgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXkgVHlwZSBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0MiwgdGV4dF9ib3gyXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MiwgdGV4dF9ib3gyXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94Mi5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94Mi5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTJdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94Mi5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjbXNfcGJqX3BheV90eXBlX2NvZGVfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUyXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MiwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUyXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUyXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUyXTtcblxuXHRcdFx0XHQvLyBKb2IgVGl0bGUgQ29kZVxuXHRcdFx0XHR2YXIgY29kZTMgPSAnam9iX3RpdGxlX2NvZGUnO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0MyA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlMyB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHRcdHZhciB0ZXh0X2JveDMgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gzLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94My5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMyArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0MyApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94MyApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0pvYiBUaXRsZSBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0MywgdGV4dF9ib3gzXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MywgdGV4dF9ib3gzXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94My5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94My5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTNdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94My5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjbXNfcGJqX2pvYl90aXRsZV9jb2RlX29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlM10gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDMsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTNdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTNdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTNdO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWVkaXRlY2gnOiAvL01lZGl0ZWNoXG5cdFx0XHRcdC8vUGF5cm9sbCBkaWN0aW9uYXJ5IHZhbHVlXG5cdFx0XHRcdGNvZGU0ID0gJ3BheXJvbGwnO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGU0IH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXlyb2xsJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0XSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGU0XSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTRdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTRdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTRdO1xuXG5cdFx0XHRcdC8vRW1wbG95ZWUgTnVtYmVyXG5cdFx0XHRcdHZhciBjb2RlID0gJ2VtcGxveWVlX251bWJlcic7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlIH0gKTtcblxuXHRcdFx0XHR2YXIgaF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHRleHRfYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94LmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94LlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGUgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94ICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llZSBOdW1iZXInICksIFtmb3JtX2l0ZW1faW5wdXQsIHRleHRfYm94XSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0LCB0ZXh0X2JveF0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGVdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnZXhwb3J0X2NvbHVtbnMnLCAnbWVkaXRlY2gnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0LCB0cnVlXSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGVdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cblx0XHRcdFx0Ly9EZXBhcnRtZW50XG5cdFx0XHRcdHZhciBjb2RlMiA9ICdkZXBhcnRtZW50Jztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLlRDb21ib0JveCggeyBmaWVsZDogY29kZTIgfSApO1xuXG5cdFx0XHRcdGhfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwnaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciB0ZXh0X2JveDIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ21hcmdpbi1sZWZ0JywgJzEwcHgnICk7XG5cdFx0XHRcdHRleHRfYm94Mi5UVGV4dElucHV0KCB7IGZpZWxkOiBjb2RlMiArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0MiApO1xuXHRcdFx0XHRoX2JveC5hcHBlbmQoIHRleHRfYm94MiApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RlcGFydG1lbnQnICksIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAnbWVkaXRlY2hfZGVwYXJ0bWVudF9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTJdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQyLCB0cnVlXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNbY29kZTJdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZTJdO1xuXG5cdFx0XHRcdC8vIEpvYiBDb2RlXG5cdFx0XHRcdHZhciBjb2RlMyA9ICdqb2JfY29kZSc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQzID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUzIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gzID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94My5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDMuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTMgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDMgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDMgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdKb2IgQ29kZScgKSwgW2Zvcm1faXRlbV9pbnB1dDMsIHRleHRfYm94M10sIHRhYjNfY29sdW1uMSwgJycsIGhfYm94LCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0VmlzaWJsZSggW2Zvcm1faXRlbV9pbnB1dDMsIHRleHRfYm94M10gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUzXSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveDMuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdtZWRpdGVjaF9qb2JfY29kZV9vcHRpb25zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzdWx0X2RhdGEgKSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTNdICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQzLCB0cnVlXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUzXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3ZlbnN1cmUnOiAvL1ZlbnN1cmVcblx0XHRcdFx0Ly9FbXBsb3llZSBOdW1iZXJcblx0XHRcdFx0dmFyIGNvZGUgPSAnZW1wbG95ZWVfbnVtYmVyJztcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUgfSApO1xuXG5cdFx0XHRcdHZhciBoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0dGV4dF9ib3guY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3guVFRleHRJbnB1dCggeyBmaWVsZDogY29kZSArICdfdGV4dCcgfSApO1xuXG5cdFx0XHRcdGhfYm94LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3ggKTtcblxuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VtcGxveWVlIE51bWJlcicgKSwgW2Zvcm1faXRlbV9pbnB1dCwgdGV4dF9ib3hdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQsIHRleHRfYm94XSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guY3NzKCAnZGlzcGxheScsICdpbmxpbmUnICk7XG5cdFx0XHRcdFx0XHR0ZXh0X2JveC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3guY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdleHBvcnRfY29sdW1ucycsICd2ZW5zdXJlJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFtmb3JtX2l0ZW1faW5wdXQsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGVdO1xuXHRcdFx0XHRkZWxldGUgJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cblxuXHRcdFx0XHQvL0xvY2F0aW9uXG5cdFx0XHRcdHZhciBjb2RlMSA9ICdsb2NhdGlvbic7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUxIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gxID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94MS5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDEuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTEgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDEgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDEgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdMb2NhdGlvbiBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MSwgdGV4dF9ib3gxXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQxLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTFdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94MS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ3ZlbnN1cmVfbG9jYXRpb25fb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDEuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUxXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0MS50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MSwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUxXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUxXTtcblxuXG5cdFx0XHRcdC8vRGVwYXJ0bWVudFxuXHRcdFx0XHR2YXIgY29kZTIgPSAnZGVwYXJ0bWVudCc7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0Mi5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUyIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94Mi5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDIuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTIgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDIgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDIgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEZXBhcnRtZW50IENvZGUnICksIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQyLCB0ZXh0X2JveDJdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3gyLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAndmVuc3VyZV9kZXBhcnRtZW50X29wdGlvbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHRfZGF0YSApICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQyLnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlMl0gKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDIudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgW2Zvcm1faXRlbV9pbnB1dDIsIHRydWVdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlMl0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlMl07XG5cblxuXHRcdFx0XHQvL0RpdmlzaW9uXG5cdFx0XHRcdHZhciBjb2RlMyA9ICdkaXZpc2lvbic7XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQzID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My5UQ29tYm9Cb3goIHsgZmllbGQ6IGNvZGUzIH0gKTtcblxuXHRcdFx0XHRoX2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ2gtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgdGV4dF9ib3gzID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHRleHRfYm94My5jc3MoICdtYXJnaW4tbGVmdCcsICcxMHB4JyApO1xuXHRcdFx0XHR0ZXh0X2JveDMuVFRleHRJbnB1dCggeyBmaWVsZDogY29kZTMgKyAnX3RleHQnIH0gKTtcblxuXHRcdFx0XHRoX2JveC5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dDMgKTtcblx0XHRcdFx0aF9ib3guYXBwZW5kKCB0ZXh0X2JveDMgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEaXZpc2lvbiBDb2RlJyApLCBbZm9ybV9pdGVtX2lucHV0MywgdGV4dF9ib3gzXSwgdGFiM19jb2x1bW4xLCAnJywgaF9ib3gsIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRWaXNpYmxlKCBbZm9ybV9pdGVtX2lucHV0MywgdGV4dF9ib3gzXSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQzLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdHRleHRfYm94My5jc3MoICdkaXNwbGF5JywgJ2lubGluZScgKTtcblx0XHRcdFx0XHRcdHRleHRfYm94My5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZTNdICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHRfYm94My5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ3ZlbnN1cmVfZGl2aXNpb25fb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDMuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGUzXSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0My50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0MywgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGUzXSA9ICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblx0XHRcdFx0ZGVsZXRlICR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2NvZGUzXTtcblxuXG5cdFx0XHRcdC8vIEpvYiBDb2RlXG5cdFx0XHRcdHZhciBjb2RlNCA9ICdqb2InO1xuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0NCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDQuVENvbWJvQm94KCB7IGZpZWxkOiBjb2RlNCB9ICk7XG5cblx0XHRcdFx0aF9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCdoLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHRleHRfYm94NCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHR0ZXh0X2JveDQuY3NzKCAnbWFyZ2luLWxlZnQnLCAnMTBweCcgKTtcblx0XHRcdFx0dGV4dF9ib3g0LlRUZXh0SW5wdXQoIHsgZmllbGQ6IGNvZGU0ICsgJ190ZXh0JyB9ICk7XG5cblx0XHRcdFx0aF9ib3guYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQ0ICk7XG5cdFx0XHRcdGhfYm94LmFwcGVuZCggdGV4dF9ib3g0ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iIENvZGUnICksIFtmb3JtX2l0ZW1faW5wdXQ0LCB0ZXh0X2JveDRdLCB0YWIzX2NvbHVtbjEsICcnLCBoX2JveCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXQ0LCB0ZXh0X2JveDRdICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dDQuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09PSAwICkge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3g0LmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRcdFx0dGV4dF9ib3g0LnNldFZhbHVlKCAkdGhpcy5leHBvcnRfc2V0dXBfZGF0YVtjb2RlNF0gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGV4dF9ib3g0LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdCR0aGlzLmFwaS5nZXRPcHRpb25zKCAndmVuc3VyZV9qb2Jfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dDQuc2V0VmFsdWUoICR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhW2NvZGU0XSApO1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0NC50cmlnZ2VyKCAnZm9ybUl0ZW1DaGFuZ2UnLCBbZm9ybV9pdGVtX2lucHV0NCwgdHJ1ZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0JHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpY1tjb2RlNF0gPSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlNF07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlNF07XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjc3ZfYWR2YW5jZWQnOlxuXHRcdFx0XHQvL0V4cG9ydCBDb2x1bW5zXG5cdFx0XHRcdGNvZGUgPSAnY3N2X2V4cG9ydF9jb2x1bW5zJztcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0ZmllbGQ6IGNvZGUsXG5cdFx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRcdGtleTogJ3ZhbHVlJyxcblx0XHRcdFx0XHRzZXRfZW1wdHk6IHRydWVcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRXhwb3J0IENvbHVtbnMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiM19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldFZpc2libGUoIFtmb3JtX2l0ZW1faW5wdXRdICk7XG5cdFx0XHRcdHRoaXMuYXBpLmdldE9wdGlvbnMoICdleHBvcnRfY29sdW1ucycsICdjc3ZfYWR2YW5jZWQnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMuZXhwb3J0X3NldHVwX2RhdGFbY29kZV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5leHBvcnRfc2V0dXBfdWlfZGljW2NvZGVdID0gJHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbY29kZV07XG5cdFx0XHRcdGRlbGV0ZSAkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1tjb2RlXTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHRoaXMuZWRpdEZpZWxkUmVzaXplKCAzICk7XG5cdH1cblxuXHRidWlsZEVkaXRWaWV3VUkoKSB7XG5cdFx0c3VwZXIuYnVpbGRFZGl0Vmlld1VJKCk7XG5cblx0XHR2YXIgdGFiXzNfbGFiZWwgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnYVtyZWY9dGFiX2Zvcm1fc2V0dXBdJyApO1xuXHRcdHRhYl8zX2xhYmVsLnRleHQoICQuaTE4bi5fKCAnRXhwb3J0IFNldHVwJyApICk7XG5cdH1cblxuXHRyZW1vdmVDdXJyZW50RXhwb3J0VUkoKSB7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuZXhwb3J0X3NldHVwX3VpX2RpYyApIHtcblx0XHRcdHZhciBodG1sX2l0ZW0gPSB0aGlzLmV4cG9ydF9zZXR1cF91aV9kaWNba2V5XTtcblx0XHRcdGh0bWxfaXRlbS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHQvL0Vycm9yOiBVbmFibGUgdG8gZ2V0IHByb3BlcnR5ICdmaW5kJyBvZiB1bmRlZmluZWQgb3IgbnVsbCByZWZlcmVuY2UgaW4gL2ludGVyZmFjZS9odG1sNS8gbGluZSAxMDMzXG5cdFx0aWYgKCAhdGhpcy5lZGl0X3ZpZXdfdGFiICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0YWIzID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2Zvcm1fc2V0dXAnICk7XG5cdFx0dmFyIHRhYjNfY29sdW1uMSA9IHRhYjMuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cdFx0dmFyIGNsZWFyX2JvdGhfZGl2ID0gdGFiM19jb2x1bW4xLmZpbmQoICcuY2xlYXItYm90aC1kaXYnICk7XG5cblx0XHRjbGVhcl9ib3RoX2Rpdi5yZW1vdmUoKTtcblx0fVxuXG5cdGdldEV4cG9ydENvbHVtbnMoIHR5cGUgKSB7XG5cdFx0dmFyIGNvbHVtbnMgPSB7fTtcblxuXHRcdGlmICggdGhpcy5leHBvcnRfZ3JpZCApIHsgLy8jMjQ5MCAtIGNhbid0IHJldHVybiBleHBvcnQgY29sdW1ucyBpZiB0aGVyZSdzIG5vIGV4cG9ydCBncmlkLlxuXHRcdFx0dmFyIHNvdXJjZSA9IHRoaXMuZXhwb3J0X2dyaWQuZ2V0RGF0YSgpO1xuXHRcdFx0dmFyIGxlbiA9IHNvdXJjZS5sZW5ndGg7XG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBzb3VyY2VbaV07XG5cdFx0XHRcdGNvbHVtbnNbaXRlbS5jb2x1bW5faWRfa2V5XSA9IHt9O1xuXHRcdFx0XHRjb2x1bW5zW2l0ZW0uY29sdW1uX2lkX2tleV0uaG91cl9jb2RlID0gaXRlbS5ob3VyX2NvZGU7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSAnYWRwJyB8fCB0eXBlID09PSAnYWRwX2FkdmFuY2VkJyB8fCB0eXBlID09PSAnYWRwX3Jlc291cmNlJyB8fCB0eXBlID09PSAnYWNjZXJvJyB8fCB0eXBlID09PSAndmFfbXVuaXMnIHx8IHR5cGUgPT09ICdjbXNfcGJqJyApIHtcblx0XHRcdFx0XHRjb2x1bW5zW2l0ZW0uY29sdW1uX2lkX2tleV0uaG91cl9jb2x1bW4gPSBpdGVtLmhvdXJfY29sdW1uO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sdW1ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFycmF5IG9mIHByb3Blcmx5IGNvbmZpZ3VyZWQgdmFsdWVzIGZvciB0aGUgZXhwb3J0IHNldHVwIGZvcm0uXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZF9saXN0IEFycmF5XG5cdCAqIEByZXR1cm5zIHt7fXwqfVxuXHQgKi9cblx0Z2V0Rm9ybVNldHVwRmllbGRWYWx1ZXMoIGZpZWxkX2xpc3QgKSB7XG5cdFx0dmFyIHJldF9hcnIgPSB7fTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZpZWxkX2xpc3QubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpY1tmaWVsZF9saXN0W2ldXSAmJiAhdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2ZpZWxkX2xpc3RbaV1dLmdldFZhbHVlKCkgKSB7XG5cdFx0XHRcdHJldF9hcnJbZmllbGRfbGlzdFtpXV0gPSB0aGlzLmVkaXRfdmlld191aV9kaWNbZmllbGRfbGlzdFtpXSArICdfdGV4dCddLmdldFZhbHVlKCk7XG5cdFx0XHRcdHJldF9hcnJbZmllbGRfbGlzdFtpXSArICdfdmFsdWUnXSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1tmaWVsZF9saXN0W2ldICsgJ190ZXh0J10uZ2V0VmFsdWUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICggIXRoaXMuZWRpdF92aWV3X3VpX2RpY1tmaWVsZF9saXN0W2ldXSApIHtcblx0XHRcdFx0XHRyZXRfYXJyW2ZpZWxkX2xpc3RbaV1dID0gJyc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0X2FycltmaWVsZF9saXN0W2ldXSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1tmaWVsZF9saXN0W2ldXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXRfYXJyO1xuXHR9XG5cblx0Z2V0Rm9ybURhdGEoIG90aGVyLCBmb3JfZGlzcGxheSApIHtcblx0XHRpZiAoICFvdGhlciB8fCAhb3RoZXIuZXhwb3J0X3R5cGUgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICggb3RoZXIuZXhwb3J0X3R5cGUgKSB7XG5cdFx0XHRjYXNlICdhZHAnOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ2NvbXBhbnlfY29kZScsICdiYXRjaF9pZCcsICd0ZW1wX2RlcHQnXSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2FkcF9hZHZhbmNlZCc6XG5cdFx0XHRjYXNlICdhZHBfcmVzb3VyY2UnOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ2NvbXBhbnlfY29kZScsICdiYXRjaF9pZCcsICd0ZW1wX2RlcHQnLCAnam9iX2Nvc3QnLCAnd29ya19jbGFzcyddICk7XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXS5zdGF0ZV9jb2x1bW5zID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnN0YXRlX2NvbHVtbnMuZ2V0VmFsdWUoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhY2Nlcm8nOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ3RlbXBfZGVwdCddICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGF5Y2hleF9wcmV2aWV3Jzpcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLmNsaWVudF9udW1iZXIgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuY2xpZW50X251bWJlci5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BheWNoZXhfcHJldmlld19hZHZhbmNlZF9qb2InOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0uY2xpZW50X251bWJlciA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5jbGllbnRfbnVtYmVyX2Fkdi5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0uam9iX2NvbHVtbnMgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuam9iX2NvbHVtbnMuZ2V0VmFsdWUoKTtcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLnN0YXRlX2NvbHVtbnMgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuc3RhdGVfY29sdW1ucy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0uaW5jbHVkZV9ob3VybHlfcmF0ZSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5pbmNsdWRlX2hvdXJseV9yYXRlLmdldFZhbHVlKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2hyaXMyMSc6XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXSA9IHRoaXMuZ2V0Rm9ybVNldHVwRmllbGRWYWx1ZXMoIFsnam9iJywgJ2Nvc3RfY2VudGVyJ10gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjZXJpZGlhbl9pbnN5bmMnOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0uZW1wbG95ZXJfbnVtYmVyID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmVtcGxveWVyX251bWJlci5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3F1aWNrYm9va3MnOlxuXHRcdFx0Y2FzZSAncXVpY2tib29rc19hZHZhbmNlZCc6XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXS5jb21wYW55X25hbWUgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuY29tcGFueV9uYW1lLmdldFZhbHVlKCk7XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXS5jb21wYW55X2NyZWF0ZWRfZGF0ZSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5jb21wYW55X2NyZWF0ZWRfZGF0ZS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0ucHJvaiA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5wcm9qLmdldFZhbHVlKCk7XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXS5pdGVtID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLml0ZW0uZ2V0VmFsdWUoKTtcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLmpvYiA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5qb2IuZ2V0VmFsdWUoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzYWdlXzUwJzpcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdID0gdGhpcy5nZXRGb3JtU2V0dXBGaWVsZFZhbHVlcyggWydjdXN0b21lcl9uYW1lJ10gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd2YV9tdW5pcyc6XG5cdFx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXSA9IHRoaXMuZ2V0Rm9ybVNldHVwRmllbGRWYWx1ZXMoIFsnZGVwYXJ0bWVudCcsICdlbXBsb3llZV9udW1iZXInLCAnZ2xfYWNjb3VudCcsICdjdXN0b21lcl9uYW1lJywgJ2ZhY2lsaXR5X2NvZGUnLCAnc3RhdGVfY29kZScsICdwYXlfdHlwZV9jb2RlJywgJ2pvYl90aXRsZV9jb2RlJywgJyddICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWVkaXRlY2gnOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ2VtcGxveWVlX251bWJlcicsICdkZXBhcnRtZW50JywgJ2pvYl9jb2RlJ10gKTtcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLnBheXJvbGwgPSB0aGlzLmVkaXRfdmlld191aV9kaWMucGF5cm9sbC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3ZlbnN1cmUnOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ2VtcGxveWVlX251bWJlcicsICdsb2NhdGlvbicsICdkZXBhcnRtZW50JywgJ2RpdmlzaW9uJywgJ2pvYiddICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY3N2X2FkdmFuY2VkJzpcblx0XHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLmV4cG9ydF9jb2x1bW5zID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNzdl9leHBvcnRfY29sdW1ucy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2Ntc19wYmonOlxuXHRcdFx0XHRvdGhlcltvdGhlci5leHBvcnRfdHlwZV0gPSB0aGlzLmdldEZvcm1TZXR1cEZpZWxkVmFsdWVzKCBbJ2ZhY2lsaXR5X2NvZGUnLCAnc3RhdGVfY29kZScsICdwYXlfdHlwZV9jb2RlJywgJ2pvYl90aXRsZV9jb2RlJ10gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0aWYgKCAhdGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhICkge1xuXHRcdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhID0ge307XG5cdFx0fVxuXHRcdHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YVtvdGhlci5leHBvcnRfdHlwZV0gPSBvdGhlcltvdGhlci5leHBvcnRfdHlwZV07XG5cdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhW290aGVyLmV4cG9ydF90eXBlXVsnY29sdW1ucyddID0gdGhpcy5nZXRFeHBvcnRDb2x1bW5zKCBvdGhlci5leHBvcnRfdHlwZSApOyAvL1RoaXMgaXMgbmVlZGVkIGZvciB0aGUgYXBpIHRvIGJ1aWxkIHJlcG9ydHMgcHJvcGVybHkuXG5cdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhWydleHBvcnRfdHlwZSddID0gb3RoZXIuZXhwb3J0X3R5cGU7XG5cblx0XHRpZiAoIGZvcl9kaXNwbGF5ICkge1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGEgKSB7XG5cdFx0XHRcdGlmICgga2V5ICE9PSBmYWxzZSAmJiB0eXBlb2YgKCB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFba2V5XSApICE9PSAnc3RyaW5nJyApIHtcblx0XHRcdFx0XHR0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFba2V5XSA9IHRoaXMuY29udmVydEV4cG9ydFNldHVwVmFsdWVzKCB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFba2V5XSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG90aGVyO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHRnZXRGb3JtU2V0dXBEYXRhKCBmb3JfdmlldyApIHtcblx0XHR2YXIgb3RoZXIgPSB7fTtcblx0XHRvdGhlci5leHBvcnRfdHlwZSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5leHBvcnRfdHlwZS5nZXRWYWx1ZSgpO1xuXG5cdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdID0ge307XG5cdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLmNvbHVtbnMgPSB0aGlzLmdldEV4cG9ydENvbHVtbnMoIG90aGVyLmV4cG9ydF90eXBlICk7XG5cblx0XHRvdGhlciA9IHRoaXMuZ2V0Rm9ybURhdGEoIG90aGVyLCB0cnVlICk7XG5cblx0XHRpZiAoICFmb3JfdmlldyAmJiBvdGhlci5leHBvcnRfdHlwZSApIHtcblx0XHRcdHZhciBleHBvcnRfdHlwZSA9IG90aGVyLmV4cG9ydF90eXBlO1xuXHRcdFx0b3RoZXIgPSBvdGhlcltleHBvcnRfdHlwZV07XG5cdFx0XHRvdGhlci5leHBvcnRfdHlwZSA9IGV4cG9ydF90eXBlO1xuXHRcdFx0b3RoZXJbZXhwb3J0X3R5cGVdID0ge307XG5cdFx0XHRvdGhlcltleHBvcnRfdHlwZV0uY29sdW1ucyA9IHRoaXMuZ2V0RXhwb3J0Q29sdW1ucyggb3RoZXIuZXhwb3J0X3R5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3RoZXI7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdC8qKlxuXHQgKiBCYWNrd2FyZHMgY29tcGF0aWJsZSBmdW5jdGlvbiBmb3IgY3VzdG9tIGRhdGEgdG8gYmUgbW92ZWQgZnJvbSB0aGUgd2F5IHRoZSBhcGkgc3RvcmVzIGl0IHRvIHRoZSB3YXkgdGhlIGZvcm0gbmVlZHMgaXQuXG5cdCAqXG5cdCAqIHRoZSBvbGQgY3VzdG9tIGZpZWxkIGRhdGEgd2FzIHN0b3JlZCBpbiBvYmpba2V5XVxuXHQgKiBuZXcgY3VzdG9tIGZpZWxkIGRhdGEgaXMgc3RvcmVkIGluIG9ialtrZXkrJ192YWx1ZSddXG5cdCAqXG5cdCAqIGllLiBvYmpbY29tcGFueV9jb2RlXSBpcyBub3cgb2JqW2NvbXBhbnlfY29kZV92YWx1ZV1cblx0ICpcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgeyp9XG5cdCAqL1xuXHRjb252ZXJ0RXhwb3J0U2V0dXBWYWx1ZXMoIGRhdGEgKSB7XG5cdFx0Zm9yICggdmFyIGFwaV9kYXRhX2tleSBpbiBkYXRhICkge1xuXHRcdFx0dmFyIGZvcm1fZGF0YV9rZXkgPSBhcGlfZGF0YV9rZXkuc3Vic3RyKCAwLCBhcGlfZGF0YV9rZXkuaW5kZXhPZiggJ192YWx1ZScgKSApO1xuXHRcdFx0aWYgKCBhcGlfZGF0YV9rZXkuc2VhcmNoKCAnX3ZhbHVlJyApID4gMCApIHtcblx0XHRcdFx0ZGF0YVtmb3JtX2RhdGFfa2V5XSA9IGRhdGFbYXBpX2RhdGFfa2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9jb252ZXJzaW9uIGZvciBsb3dlciBleHBvcnQgZ3JpZCBkYXRhIGZyb20gb2xkIGZvcm1hdFxuXHRcdGlmICggZGF0YS5leHBvcnRfY29sdW1ucyAmJiAhZGF0YS5jb2x1bW5zICYmIGRhdGEuZXhwb3J0X3R5cGUgIT0gMCAmJiBkYXRhLmV4cG9ydF9jb2x1bW5zW2RhdGEuZXhwb3J0X3R5cGVdICkge1xuXHRcdFx0ZGF0YS5jb2x1bW5zID0ge307XG5cdFx0XHRkYXRhLmNvbHVtbnMgPSBkYXRhLmV4cG9ydF9jb2x1bW5zW2RhdGEuZXhwb3J0X3R5cGVdLmNvbHVtbnM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmb3JtIHNldHVwIGRhdGEgZnJvbSB0aGUgYXBpXG5cdCAqIEBwYXJhbSByZXNfRGF0YVxuXHQgKi9cblx0c2V0Rm9ybVNldHVwRGF0YSggcmVzX0RhdGEgKSB7XG5cdFx0Ly90aGlzIGlmIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuZXhwb3J0X3R5cGUgJiYgdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmV4cG9ydF90eXBlLmdldFZhbHVlKCkgKSB7XG5cdFx0XHRyZXNfRGF0YS5leHBvcnRfdHlwZSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5leHBvcnRfdHlwZS5nZXRWYWx1ZSgpO1xuXHRcdH1cblxuXHRcdGlmICggIXJlc19EYXRhLmV4cG9ydF9jb2x1bW5zICkge1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiByZXNfRGF0YSApIHtcblx0XHRcdFx0aWYgKCBrZXkgIT09IGZhbHNlICYmIHR5cGVvZiAoIHJlc19EYXRhW2tleV0gKSAhPT0gJ3N0cmluZycgKSB7XG5cdFx0XHRcdFx0cmVzX0RhdGFba2V5XSA9IHRoaXMuY29udmVydEV4cG9ydFNldHVwVmFsdWVzKCByZXNfRGF0YVtrZXldICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YSA9IHJlc19EYXRhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXNfRGF0YSA9IHRoaXMuY29udmVydEV4cG9ydFNldHVwVmFsdWVzKCByZXNfRGF0YSApO1xuXHRcdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhW3Jlc19EYXRhLmV4cG9ydF90eXBlXSA9IHJlc19EYXRhO1xuXHRcdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhWydleHBvcnRfdHlwZSddID0gcmVzX0RhdGEuZXhwb3J0X3R5cGU7XG5cdFx0fVxuXG5cdFx0aWYgKCAhcmVzX0RhdGEgKSB7XG5cdFx0XHR0aGlzLnNob3dfZW1wdHlfbWVzc2FnZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCByZXNfRGF0YSApIHtcblxuXHRcdFx0aWYgKCByZXNfRGF0YS5leHBvcnRfdHlwZSApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmV4cG9ydF90eXBlLnNldFZhbHVlKCByZXNfRGF0YS5leHBvcnRfdHlwZSApO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZXhwb3J0X3R5cGUgPSByZXNfRGF0YS5leHBvcnRfdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvL2ZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjc3ZfYWR2YW5jZWQgZm9ybWF0XG5cdFx0aWYgKCB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFbJ2Nzdl9hZHZhbmNlZCddICkge1xuXHRcdFx0aWYgKCB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFbJ2Nzdl9hZHZhbmNlZCddLmNzdl9leHBvcnRfY29sdW1ucyApIHtcblx0XHRcdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhWydjc3ZfYWR2YW5jZWQnXS5leHBvcnRfY29sdW1ucyA9IHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YVsnY3N2X2FkdmFuY2VkJ10uY3N2X2V4cG9ydF9jb2x1bW5zO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhWydjc3ZfYWR2YW5jZWQnXS5jc3ZfZXhwb3J0X2NvbHVtbnMgPSB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFbJ2Nzdl9hZHZhbmNlZCddLmV4cG9ydF9jb2x1bW5zO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMub25FeHBvcnRDaGFuZ2UoIHJlc19EYXRhLmV4cG9ydF90eXBlICk7XG5cdH1cblxuXHQvKipcblx0ICogT3ZlcnJpZGRlbiB0byBhbGxvdyBzdGF0ZWZ1bCBleHBvcnQgZm9ybWF0cy4gVGhpcyBlbnN1cmVzIHlvdXIgY2hhbmdlcyBhcmUgcHV0IGludG8gbWVtb3J5Li5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFxuXHQgKiBAcGFyYW0gZG9Ob3REb1ZhbGlkYXRlXG5cdCAqL1xuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0Ly9JZiB0aGUgZWRpdCBncmlkIGhhcyBsZWZ0IGFueSByb3dzIGluIGVkaXQgbW9kZSwgd2UgbmVlZCB0byBmaW5hbGl6ZSB0aGVtIG5vdyBiZWZvcmUgdGhlIGRhdGEgaXMgc3dlcHQgaW50byBtZW1vcnkuXG5cdFx0dmFyIHNlbFJvd0lkID0gJCggJyNleHBvcnRfZ3JpZCcgKS5nZXRHcmlkUGFyYW0oICdzZWxyb3cnICk7XG5cdFx0JCggJyNleHBvcnRfZ3JpZCcgKS5zYXZlUm93KCBzZWxSb3dJZCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgJiYgdGFyZ2V0LmdldEZpZWxkICYmIHRhcmdldC5nZXRGaWVsZCgpID09ICdleHBvcnRfdHlwZScgKSB7IC8vIGNhbm5vdCByZWFkIHByb3BlcnR5IGdldEZpZWxkIG9mIHVuZGVmaW5lZFxuXHRcdFx0dmFyIG90aGVyID0ge307XG5cdFx0XHRvdGhlci5leHBvcnRfdHlwZSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5leHBvcnRfdHlwZTtcblx0XHRcdG90aGVyW290aGVyLmV4cG9ydF90eXBlXSA9IHt9O1xuXHRcdFx0b3RoZXJbb3RoZXIuZXhwb3J0X3R5cGVdLmV4cG9ydF9jb2x1bW5zID0geyBjb2x1bW5zOiB0aGlzLmdldEV4cG9ydENvbHVtbnMoIG90aGVyLmV4cG9ydF90eXBlICkgfTtcblxuXHRcdFx0aWYgKCAhdGhpcy5leHBvcnRfc2V0dXBfZGF0YS5leHBvcnRfY29sdW1ucyB8fCBHbG9iYWwuaXNPYmplY3QoIHRoaXMuZXhwb3J0X3NldHVwX2RhdGEuZXhwb3J0X2NvbHVtbnMgKSA9PSBmYWxzZSApIHtcblx0XHRcdFx0dGhpcy5leHBvcnRfc2V0dXBfZGF0YS5leHBvcnRfY29sdW1ucyA9IHt9O1xuXHRcdFx0XHR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhLmV4cG9ydF9jb2x1bW5zW290aGVyLmV4cG9ydF90eXBlXSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cG9ydF9zZXR1cF9kYXRhLmV4cG9ydF9jb2x1bW5zW290aGVyLmV4cG9ydF90eXBlXSA9IHsgY29sdW1uczogdGhpcy5nZXRFeHBvcnRDb2x1bW5zKCBvdGhlci5leHBvcnRfdHlwZSApIH07XG5cdFx0XHQvLyB0aGlzLnNhdmVfZXhwb3J0X3NldHVwX2RhdGFbb3RoZXIuZXhwb3J0X3R5cGVdID0gdGhpcy5nZXRGb3JtU2V0dXBEYXRhKCBvdGhlciApO1xuXHRcdFx0dGhpcy5mb3JtX3NldHVwX2NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuOyAvL21ha2Ugcm9vbSBmb3IgdGhlIGN1c3RvbSBldmVudCBhYm92ZVxuXHRcdH1cblx0XHRzdXBlci5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKTtcblx0fVxuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5613\n")}}]);