"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["core-log-LogViewController"],{7590:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LogViewController\": () => (/* binding */ LogViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass LogViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#log_view_container',\n\t\t\ttables: {\n\t\t\t\t'product': ['product', 'product_price'],\n\t\t\t\t'user_contact': ['user_contact'],\n\t\t\t\t'users': ['users', 'user_preference', 'user_wage', 'authentication'],\n\t\t\t\t'user_wage': ['user_wage'],\n\t\t\t\t'user_title': ['user_title'],\n\t\t\t\t'user_preference': ['user_preference'],\n\t\t\t\t'user_preference_notification': ['user_preference_notification'],\n\t\t\t\t'ui_kit': ['ui_kit'],\n\t\t\t\t'ui_kit_child': ['ui_kit_child'],\n\t\t\t\t'bank_account': ['bank_account'],\n\t\t\t\t'user_default': ['user_default'],\n\t\t\t\t'user_group': ['user_group'],\n\t\t\t\t'company': ['company'],\n\t\t\t\t'pay_period_schedule': ['pay_period_schedule', 'pay_period', 'pay_period_schedule_user'],\n\t\t\t\t'pay_period': ['pay_period'],\n\t\t\t\t'branch': ['branch'],\n\t\t\t\t'department': ['department'],\n\t\t\t\t'hierarchy_control': ['hierarchy_control', 'hierarchy_object_type', 'hierarchy_user', 'hierarchy_level'],\n\t\t\t\t'wage_group': ['wage_group'],\n\t\t\t\t'ethnic_group': ['ethnic_group'],\n\t\t\t\t'currency': ['currency'],\n\t\t\t\t'currency_rate': ['currency_rate'],\n\t\t\t\t'permission_control': ['permission_control', 'permission_user'],\n\t\t\t\t'custom_field': ['custom_field'],\n\t\t\t\t'station': ['station', 'station_user_group', 'station_branch', 'station_department', 'station_include_user', 'station_exclude_user'],\n\t\t\t\t'pay_stub_amendment': ['pay_stub_amendment'],\n\t\t\t\t'recurring_ps_amendment': ['recurring_ps_amendment', 'recurring_ps_amendment_user'],\n\t\t\t\t'pay_stub_entry_account': ['pay_stub_entry_account'],\n\t\t\t\t'company_deduction': ['company_deduction', 'user_deduction', 'company_deduction_pay_stub_entry_account'],\n\t\t\t\t'user_expense': ['user_expense'],\n\t\t\t\t'round_interval_policy': ['round_interval_policy'],\n\t\t\t\t'meal_policy': ['meal_policy'],\n\t\t\t\t'break_policy': ['break_policy'],\n\t\t\t\t'over_time_policy': ['over_time_policy'],\n\t\t\t\t'absence_policy': ['absence_policy'],\n\t\t\t\t'recurring_holiday': ['recurring_holiday'],\n\t\t\t\t'holiday_policy': ['holiday_policy', 'holiday_policy_recurring_holiday'],\n\t\t\t\t'holidays': ['holidays'],\n\t\t\t\t'premium_policy': ['premium_policy'],\n\t\t\t\t'policy_group': ['policy_group', 'policy_group_user'],\n\t\t\t\t'document': ['document', 'document_revision'],\n\t\t\t\t'document_group': ['document_group'],\n\t\t\t\t'document_revision': ['document_revision'],\n\t\t\t\t'schedule_policy': ['schedule_policy'],\n\t\t\t\t'accrual_policy': ['accrual_policy', 'accrual_policy_milestone', 'accrual_policy_user_modifier'],\n\t\t\t\t'client': ['client', 'client_contact', 'client_payment'],\n\t\t\t\t'report_custom_column': ['report_custom_column'],\n\t\t\t\t'client_contact': ['client_contact'],\n\t\t\t\t'client_payment': ['client_payment'],\n\t\t\t\t'invoice_transaction': ['invoice_transaction'],\n\t\t\t\t'invoice': ['invoice'],\n\t\t\t\t'job': ['job', 'job_exclude_job_item', 'job_exclude_user', 'job_include_job_item', 'job_include_user', 'job_job_item_group', 'job_user_branch', 'job_user_group', 'job_user_department'],\n\t\t\t\t'client_group': ['client_group'],\n\t\t\t\t'product_group': ['product_group'],\n\t\t\t\t'job_item': ['job_item'],\n\t\t\t\t'job_group': ['job_group'],\n\t\t\t\t'job_item_group': ['job_item_group'],\n\t\t\t\t'report_schedule': ['report_schedule'],\n\t\t\t\t'accrual_policy_account': ['accrual_policy_account'],\n\t\t\t\t'accrual': ['accrual'],\n\t\t\t\t'accrual_balance': ['accrual_balance'],\n\t\t\t\t'schedule': ['schedule'],\n\t\t\t\t'recurring_schedule_control': ['recurring_schedule_control'], //, 'recurring_schedule_user'\n\t\t\t\t'recurring_schedule_template_control': ['recurring_schedule_template_control', 'recurring_schedule_template'],\n\t\t\t\t'punch': ['punch', 'punch_control'],\n\t\t\t\t'kpi': ['kpi'],\n\t\t\t\t'kpi_group': ['kpi_group'],\n\t\t\t\t'qualification': ['qualification'],\n\t\t\t\t'qualification_group': ['qualification_group'],\n\t\t\t\t'user_skill': ['user_skill'],\n\t\t\t\t'user_education': ['user_education'],\n\t\t\t\t'user_membership': ['user_membership'],\n\t\t\t\t'user_license': ['user_license'],\n\t\t\t\t'user_language': ['user_language'],\n\t\t\t\t'job_vacancy': ['job_vacancy'],\n\t\t\t\t'job_application': ['job_application'],\n\t\t\t\t'job_applicant': ['job_applicant'],\n\t\t\t\t'invoice_district': ['invoice_district'],\n\t\t\t\t'job_applicant_employment': ['job_applicant_employment'],\n\t\t\t\t'job_applicant_reference': ['job_applicant_reference'],\n\t\t\t\t'job_applicant_location': ['job_applicant_location'],\n\t\t\t\t'job_applicant_skill': ['job_applicant_skill'],\n\t\t\t\t'job_applicant_education': ['job_applicant_education'],\n\t\t\t\t'job_applicant_license': ['job_applicant_license'],\n\t\t\t\t'job_applicant_membership': ['job_applicant_membership'],\n\t\t\t\t'job_applicant_language': ['job_applicant_language'],\n\t\t\t\t'tax_policy': ['tax_policy'],\n\t\t\t\t'area_policy': ['area_policy'],\n\t\t\t\t'shipping_policy': ['shipping_policy'],\n\t\t\t\t'payment_gateway': ['payment_gateway'],\n\t\t\t\t'request': ['request'],\n\t\t\t\t'exception_policy_control': ['exception_policy_control', 'exception_policy'],\n\t\t\t\t'user_review_control': ['user_review_control', 'user_review'],\n\t\t\t\t'roe': ['roe'],\n\t\t\t\t'expense_policy': ['expense_policy'],\n\t\t\t\t'user_report_data': ['user_report_data'],\n\t\t\t\t'regular_time_policy': ['regular_time_policy'],\n\t\t\t\t'pay_code': ['pay_code'],\n\t\t\t\t'pay_formula_policy': ['pay_formula_policy'],\n\t\t\t\t'contributing_pay_code_policy': ['contributing_pay_code_policy'],\n\t\t\t\t'contributing_shift_policy': ['contributing_shift_policy'],\n\t\t\t\t'accrual_policy_user_modifier': ['accrual_policy_user_modifier'],\n\t\t\t\t'job_item_amendment': ['job_item_amendment'],\n\t\t\t\t'user_date_total': ['user_date_total'],\n\t\t\t\t'pay_stub': ['pay_stub', 'pay_stub_entry'],\n\t\t\t\t'legal_entity': ['legal_entity'],\n\t\t\t\t'payroll_remittance_agency': ['payroll_remittance_agency'],\n\t\t\t\t'payroll_remittance_agency_event': ['payroll_remittance_agency_event'],\n\t\t\t\t'remittance_source_account': ['remittance_source_account'],\n\t\t\t\t'remittance_destination_account': ['remittance_destination_account'],\n\t\t\t\t'geo_fence': ['geo_fence']\n\t\t\t},\n\t\t\tlog_detail_grid: null,\n\t\t\tlog_detail_script_name: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'LogEditView.html';\n\t\tthis.context_menu_name = $.i18n._( 'Audit' );\n\t\tthis.navigation_label = $.i18n._( 'Audit' );\n\t\tthis.viewId = 'Log';\n\t\tthis.script_name = 'LogView';\n\t\tthis.log_detail_script_name = 'LogDetailView';\n\t\tthis.api = TTAPI.APILog;\n\t\tthis.noticeDiv = $( '.audit-info' );\n\n\t\tthis.render();\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\tthis.buildContextMenu( true );\n\t\t} else {\n\t\t\tthis.buildContextMenu();\n\t\t}\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar tab_model = {\n\t\t\t'tab_audit_details': {\n\t\t\t\t'label': $.i18n._( 'Audit Details' ),\n\t\t\t\t'html_template': this.getAuditLogTabHtml()\n\t\t\t},\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APILog,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_log',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\tvar tab_audit_details = this.edit_view_tab.find( '#tab_audit_details' );\n\t\tvar tab_audit_details_column1 = tab_audit_details.find( '.first-row' );\n\t\t// tab_audit_details column1\n\n\t\t// Date\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( {\n\t\t\tfield: 'date'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_audit_details_column1, '' );\n\n\t\t// Action\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( {\n\t\t\tfield: 'action'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Action' ), form_item_input, tab_audit_details_column1 );\n\n\t\t// Employee\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\n\t\tform_item_input.TText( {\n\t\t\tfield: 'user_name'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_audit_details_column1 );\n\n\t\t// Description\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( {\n\t\t\tfield: 'description'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_audit_details_column1, '' );\n\n\t\t// set the log details information.\n\t\tthis.initLogDetailsView();\n\t}\n\n\tsearch( set_default_menu, page_action, page_number, callBack ) {\n\n\t\tif ( !Global.isSet( set_default_menu ) ) {\n\t\t\tset_default_menu = true;\n\t\t}\n\n\t\tvar $this = this;\n\t\tvar filter = {};\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_sort = {};\n\t\tfilter.filter_columns = this.getFilterColumnsFromDisplayColumns();\n\t\tfilter.filter_items_per_page = 0; // Default to 0 to load user preference defined\n\n\t\tif ( this.pager_data ) {\n\n\t\t\tif ( LocalCacheData.paging_type === 0 ) {\n\t\t\t\tif ( page_action === 'next' ) {\n\t\t\t\t\tfilter.filter_page = this.pager_data.next_page;\n\t\t\t\t} else {\n\t\t\t\t\tfilter.filter_page = 1;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tswitch ( page_action ) {\n\t\t\t\t\tcase 'next':\n\t\t\t\t\t\tfilter.filter_page = this.pager_data.next_page;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'last':\n\t\t\t\t\t\tfilter.filter_page = this.pager_data.previous_page;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'start':\n\t\t\t\t\t\tfilter.filter_page = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'end':\n\t\t\t\t\t\tfilter.filter_page = this.pager_data.last_page_number;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'go_to':\n\t\t\t\t\t\tfilter.filter_page = page_number;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tfilter.filter_page = this.pager_data.current_page;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tfilter.filter_page = 1;\n\t\t}\n\n\t\tif ( this.select_layout && this.select_layout.data ) {\n\t\t\tif ( this.sub_view_mode && this.parent_key ) {\n\t\t\t\tthis.select_layout.data.filter_data[this.parent_key] = this.parent_value;\n\t\t\t}\n\n\t\t\t//If sub view controller set custom filters, get it\n\t\t\tif ( Global.isSet( this.getSubViewFilter ) ) {\n\t\t\t\tthis.select_layout.data.filter_data = this.getSubViewFilter( this.select_layout.data.filter_data );\n\t\t\t}\n\n\t\t\t//select_layout will not be null, it's set in setSelectLayout function\n\t\t\tfilter.filter_data = Global.convertLayoutFilterToAPIFilter( this.select_layout );\n\t\t\tfilter.filter_sort = this.select_layout.data.filter_sort;\n\t\t}\n\n\t\tif ( TTUUID.isUUID( this.refresh_id ) ) {\n\t\t\tfilter.filter_data = {};\n\t\t\tfilter.filter_data.id = [this.refresh_id];\n\n\t\t\tthis.last_select_ids = filter.filter_data.id;\n\t\t} else {\n\t\t\tthis.last_select_ids = this.getGridSelectIdArray();\n\t\t}\n\n\t\tthis.api['get' + this.api.key_name]( filter, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\t\t\t\tvar len;\n\n\t\t\t\tif ( !Global.isArray( result_data ) ) {\n\t\t\t\t\t$this.showNoResultCover();\n\t\t\t\t} else {\n\t\t\t\t\t$this.removeNoResultCover();\n\t\t\t\t\tif ( Global.isSet( $this.__createRowId ) ) {\n\t\t\t\t\t\tresult_data = $this.__createRowId( result_data );\n\t\t\t\t\t}\n\n\t\t\t\t\tresult_data = Global.formatGridData( result_data, $this.api.key_name );\n\n\t\t\t\t\tlen = result_data.length;\n\t\t\t\t}\n\t\t\t\t$this.setAuditInfo();\n\t\t\t\tif ( TTUUID.isUUID( $this.refresh_id ) ) {\n\t\t\t\t\t$this.refresh_id = null;\n\t\t\t\t\tvar grid_source_data = $this.grid.grid.getGridParam( 'data' );\n\t\t\t\t\tlen = grid_source_data.length;\n\n\t\t\t\t\tif ( $.type( grid_source_data ) !== 'array' ) {\n\t\t\t\t\t\tgrid_source_data = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tvar found = false;\n\t\t\t\t\tvar new_record = result_data[0];\n\n\t\t\t\t\t//Error: Uncaught TypeError: Cannot read property 'id' of undefined in /interface/html5/views/BaseViewController.js?v=7.4.3-20140924-084605 line 4851\n\t\t\t\t\tif ( new_record ) {\n\t\t\t\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\t\t\t\tvar record = grid_source_data[i];\n\n\t\t\t\t\t\t\t//Fixed === issue. The id set by jQGrid is string type.\n\t\t\t\t\t\t\t// if ( !isNaN( parseInt( record.id ) ) ) {\n\t\t\t\t\t\t\t// \trecord.id = parseInt( record.id );\n\t\t\t\t\t\t\t// }\n\n\t\t\t\t\t\t\tif ( record.id == new_record.id ) {\n\t\t\t\t\t\t\t\t$this.grid.grid.setRowData( new_record.id, new_record );\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( !found ) {\n\t\t\t\t\t\t\tgrid_source_data.push( new_record );\n\t\t\t\t\t\t\t$this.grid.setData( grid_source_data );\n\n\t\t\t\t\t\t\t// if ( $this.sub_view_mode && Global.isSet( $this.resizeSubGrid ) ) {\n\t\t\t\t\t\t\t// \tlen = Global.isSet( len ) ? len : 0;\n\t\t\t\t\t\t\t// \t$this.resizeSubGrid( len + 1 );\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\t//Set Page data to widget, next show display info when setDefault Menu\n\t\t\t\t\t$this.pager_data = result.getPagerData();\n\n\t\t\t\t\t//CLick to show more mode no need this step\n\t\t\t\t\tif ( LocalCacheData.paging_type !== 0 ) {\n\t\t\t\t\t\t$this.paging_widget.setPagerData( $this.pager_data );\n\t\t\t\t\t\t$this.paging_widget_2.setPagerData( $this.pager_data );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( LocalCacheData.paging_type === 0 && page_action === 'next' ) {\n\t\t\t\t\t\tvar current_data = $this.grid.getGridParam( 'data' );\n\t\t\t\t\t\tresult_data = current_data.concat( result_data );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process result_data if necessary, this always needs override.\n\t\t\t\t\tresult_data = $this.processResultData( result_data );\n\n\t\t\t\t\tif ( $this.grid ) {\n\t\t\t\t\t\tif ( LocalCacheData.paging_type === 0 ) {\n\t\t\t\t\t\t\tif ( !$this.pager_data || $this.pager_data.is_last_page ) {\n\t\t\t\t\t\t\t\t$this.paging_widget.css( 'display', 'none' );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$this.paging_widget.css( 'display', 'block' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this.grid.setData( result_data );\n\t\t\t\t\t\t$this.setGridColumnsWidth();\n\t\t\t\t\t\tif ( $this.sub_view_mode && Global.isSet( $this.baseViewSubTabGridResize ) ) {\n\t\t\t\t\t\t\t$this.baseViewSubTabGridResize( 'tab_audit' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.reSelectLastSelectItems();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this.setGridCellBackGround(); //Set cell background for some views\n\n\t\t\t\tProgressBar.closeOverlay(); //Add this in initData\n\n\t\t\t\tif ( set_default_menu ) {\n\t\t\t\t\t$this.setDefaultMenu( true );\n\t\t\t\t}\n\n\t\t\t\tif ( LocalCacheData.paging_type === 0 ) {\n\t\t\t\t\tif ( !$this.pager_data || $this.pager_data.is_last_page ) {\n\t\t\t\t\t\t$this.paging_widget.css( 'display', 'none' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.paging_widget.css( 'display', 'block' );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( callBack ) {\n\t\t\t\t\tcallBack( result );\n\t\t\t\t}\n\n\t\t\t\t// when call this from save and new result, we don't call auto open, because this will call onAddClick twice\n\t\t\t\tif ( set_default_menu ) {\n\t\t\t\t\t$this.autoOpenEditViewIfNecessary();\n\t\t\t\t}\n\n\t\t\t\t$this.searchDone();\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetGridSetup() {\n\t\tvar $this = this;\n\t\treturn {\n\t\t\tcontainer_selector: this.sub_view_mode ? '.edit-view-tab-bar' : 'body',\n\t\t\tsub_grid_mode: this.sub_view_mode,\n\t\t\tonResizeGrid: true,\n\t\t\tmultiselect: false,\n\t\t\tonSelectRow: function() {\n\t\t\t\t$this.onGridSelectRow();\n\t\t\t},\n\t\t\tonCellSelect: function() {\n\t\t\t\t$this.onGridSelectRow();\n\t\t\t},\n\t\t\tonSelectAll: function() {\n\t\t\t\t$this.onGridSelectAll();\n\t\t\t},\n\t\t\tondblClickRow: function( e ) {\n\t\t\t\t$this.onGridDblClickRow( e );\n\t\t\t},\n\t\t\tonRightClickRow: function( rowId ) {\n\t\t\t\tvar id_array = $this.getGridSelectIdArray();\n\t\t\t\tif ( id_array.indexOf( rowId ) < 0 ) {\n\t\t\t\t\t$this.grid.grid.resetSelection();\n\t\t\t\t\t$this.grid.grid.setSelection( rowId );\n\t\t\t\t\t$this.onGridSelectRow();\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetGridSize: function() {\n\t\t\t\t$this.baseViewSubTabGridResize( 'tab_audit' ); //Works for Edit Employee -> Audit tab\n\t\t\t}\n\t\t};\n\t}\n\n\t_setGridSizeGridHeight( header_size ) {\n\t\t// if ( !this.sub_view_mode ) {\n\t\t// \tthis.grid.setGridHeight( ($( this.el ).height() - (this.search_panel && this.search_panel.is( ':visible' ) ? this.search_panel.height() : 0) - 68 - header_size) );\n\t\t// } else if ( !Global.isSet( this.resizeSubGrid ) ) {\n\t\tif ( this.pager_data && this.pager_data.last_page_number > 1 ) {\n\t\t\tthis.grid.setGridHeight( $( this.el ).parent().parent().parent().height() - 101 - header_size );\n\t\t} else {\n\t\t\tthis.grid.setGridHeight( $( this.el ).parent().parent().parent().height() - 78 - header_size );\n\t\t}\n\n\t\t// }\n\t}\n\n\tsetAuditInfo() {\n\t\tvar updated_info = ( this.parent_edit_record['updated_date'] || $.i18n._( 'N/A' ) ) + ' ' + $.i18n._( 'by' ) + ' ' + ( this.parent_edit_record['updated_by'] || $.i18n._( 'N/A' ) ) + ' ';\n\t\tvar created_info = ( this.parent_edit_record['created_date'] || $.i18n._( 'N/A' ) ) + ' ' + $.i18n._( 'by' ) + ' ' + ( this.parent_edit_record['created_by'] || $.i18n._( 'N/A' ) ) + ' ';\n\t\tthis.noticeDiv.find( '.left > .info' ).text( updated_info );\n\t\tthis.noticeDiv.find( '.right > .info' ).text( created_info );\n\t}\n\n\tautoOpenEditViewIfNecessary() {\n\t\t//Auto open edit view. Should set in IndexController\n\t\tswitch ( LocalCacheData.current_doing_context_action ) {\n\t\t\tcase 'view':\n\t\t\t\tif ( LocalCacheData.edit_id_for_next_open_view ) {\n\t\t\t\t\tthis.onViewClick( LocalCacheData.edit_id_for_next_open_view );\n\t\t\t\t\tLocalCacheData.edit_id_for_next_open_view = null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.autoOpenEditOnlyViewIfNecessary();\n\t}\n\n\tinitLogDetailsView( column_start_from ) {\n\n\t\tvar grid = this.edit_view.find( '#grid' );\n\n\t\tif ( grid ) {\n\t\t\tgrid.attr( 'id', this.log_detail_script_name + '_grid' ); //Grid's id is ScriptName + _grid\n\t\t}\n\n\t\t//grid = this.edit_view.find( '#' + this.log_detail_script_name + '_grid' );\n\n\t\tvar column_info_array = [];\n\t\tvar display_columns = [\n\t\t\t{ label: $.i18n._( 'Field' ), value: 'display_field' },\n\t\t\t{ label: $.i18n._( 'Before' ), value: 'old_value' },\n\t\t\t{ label: $.i18n._( 'After' ), value: 'new_value' }\n\t\t];\n\n\t\t//Set Data Grid on List view\n\t\tvar len = display_columns.length;\n\n\t\tvar start_from = 0;\n\n\t\tif ( Global.isSet( column_start_from ) && column_start_from > 0 ) {\n\t\t\tstart_from = column_start_from;\n\t\t}\n\n\t\tfor ( var i = start_from; i < len; i++ ) {\n\t\t\tvar view_column_data = display_columns[i];\n\n\t\t\tvar column_info = {\n\t\t\t\tname: view_column_data.value,\n\t\t\t\tindex: view_column_data.value,\n\t\t\t\tlabel: view_column_data.label,\n\t\t\t\twidth: 100,\n\t\t\t\tsortable: false,\n\t\t\t\ttitle: false\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\t\t}\n\n\t\tvar grid_setup = {\n\t\t\tcontainer_selector: this.sub_view_mode ? '.edit-view-tab-bar' : 'body',\n\t\t\tsub_grid_mode: this.sub_view_mode,\n\t\t\tonResizeGrid: true,\n\t\t\tmultiselect: false,\n\t\t};\n\n\t\tthis.log_detail_grid = new TTGrid( this.log_detail_script_name + '_grid', grid_setup, column_info_array );\n\t}\n\n\tinitEditViewData() {\n\t\tsuper.initEditViewData();\n\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\tthis.edit_view_tab.find( '#tab_audit_details' ).find( '.detail-grid-row' ).css( 'display', 'block' );\n\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t} else {\n\t\t\tthis.edit_view_tab.find( '#tab_audit_details' ).find( '.detail-grid-row' ).css( 'display', 'none' );\n\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\tthis.edit_view.find( '.permission-message' ).html( Global.getUpgradeMessage() );\n\t\t}\n\n\t\tthis.log_detail_grid.setGridColumnsWidth();\n\t}\n\n\tonGridDblClickRow() {\n\t\tthis.onViewDetailClick();\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'user_name':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record['first_name'] + ' ' + this.current_edit_record['last_name'] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'details':\n\t\t\t\t\t\tthis.setLogDetailsViewData( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetLogDetailsViewData( log_detail_data ) {\n\n\t\tvar $this = this;\n\n\t\tif ( !Global.isArray( log_detail_data ) ) {\n\t\t\t$this.showDetailNoResultCover();\n\t\t} else {\n\t\t\t$this.removeNoResultCover();\n\t\t}\n\n\t\tlog_detail_data = Global.formatGridData( log_detail_data );\n\n\t\t$this.log_detail_grid.setData( log_detail_data );\n\n\t\t$this.setLogDetailGridSize();\n\t}\n\n\tsetLogDetailGridSize() {\n\n\t\tif ( !this.log_detail_grid || !$( this.log_detail_grid.grid ).is( ':visible' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tab_audit_details = this.edit_view.find( '#tab_audit_details_content_div' );\n\t\tvar first_row = this.edit_view.find( '.first-row' );\n\t\tthis.log_detail_grid.grid.setGridWidth( tab_audit_details.width() );\n\t\tthis.log_detail_grid.grid.setGridHeight( tab_audit_details.height() - first_row.height() );\n\t}\n\n\tshowDetailNoResultCover() {\n\t\tthis.removeNoResultCover();\n\t\tthis.no_result_box = Global.loadWidgetByName( WidgetNamesDic.NO_RESULT_BOX );\n\t\tthis.no_result_box.NoResultBox( { related_view_controller: this, is_new: false } );\n\n\t\tvar grid_div = this.edit_view.find( '.grid-div' );\n\n\t\tgrid_div.append( this.no_result_box );\n\t}\n\n\tshowNoResultCover() {\n\t\tsuper.showNoResultCover( false );\n\t}\n\n\tonEditClick( editId, noRefreshUI ) {\n\n\t\tthis.onViewDetailClick( editId, noRefreshUI );\n\t}\n\n\tonViewDetailClick( editId ) {\n\n\t\tvar $this = this;\n\t\tthis.setCurrentEditViewState( 'view_detail' );\n\t\t$this.openEditView();\n\n\t\tvar filter = {};\n\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\tvar grid_selected_length = grid_selected_id_array.length;\n\t\tvar selectedId;\n\t\tif ( Global.isSet( editId ) ) {\n\t\t\tselectedId = editId;\n\t\t} else {\n\n\t\t\tif ( this.is_viewing ) {\n\t\t\t\tselectedId = this.current_edit_record.id;\n\t\t\t} else if ( grid_selected_length > 0 ) {\n\t\t\t\tselectedId = grid_selected_id_array[0];\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_data.id = [selectedId];\n\t\t//If sub view controller set custom filters, get it\n\t\tif ( Global.isSet( this.getSubViewFilter ) ) {\n\n\t\t\tfilter.filter_data = this.getSubViewFilter( filter.filter_data );\n\n\t\t}\n\t\tfilter.filter_columns = this.getFilterColumnsForViewDetails();\n\n\t\tthis.api['get' + this.api.key_name]( filter, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\tif ( !result_data ) {\n\t\t\t\t\tresult_data = [];\n\t\t\t\t}\n\n\t\t\t\tresult_data = result_data[0];\n\n\t\t\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t\t\t}\n\n\t\t\t\t$this.current_edit_record = result_data;\n\n\t\t\t\t$this.initEditView();\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\t\tvar column_filter = {};\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.table_name = true;\n\n\t\t// Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tvar display_columns = [];\n\t\tif ( this.grid ) {\n\t\t\tdisplay_columns = this.grid.getGridParam( 'colModel' );\n\t\t}\n\n\t\tif ( display_columns ) {\n\t\t\tvar len = display_columns.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar column_info = display_columns[i];\n\t\t\t\tcolumn_filter[column_info.name] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\tgetFilterColumnsForViewDetails() {\n\t\tvar display_columns = this.grid.getGridParam( 'colModel' );\n\n\t\tvar column_filter = {};\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.table_name = true;\n\t\tcolumn_filter.details = true;\n\n\t\tvar len = display_columns.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar column_info = display_columns[i];\n\t\t\tcolumn_filter[column_info.name] = true;\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'view_detail':\n\t\t\t\tif ( grid_selected_length === 1 ) {\n\t\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t\t\t} else {\n\t\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'view_detail':\n\t\t\t\tthis.onViewDetailClick();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'view_detail':\n\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['default'],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View Details' ),\n\t\t\t\t\tid: 'view_detail',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\t},\n\t\t\t\t'cancel'\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tgetSubViewFilter( filter ) {\n\t\tif ( Global.isSet( this.table_name_key ) ) {\n\t\t\tfilter['table_name'] = this.tables[this.table_name_key];\n\t\t}\n\n\t\treturn filter;\n\t}\n\n\tsearchDone() {\n\t\t$( 'window' ).trigger( 'resize' );\n\t\tTTPromise.resolve( 'initSubAudit', 'init' );\n\t\tsuper.searchDone();\n\n\t}\n\n\tgetAuditLogTabHtml() {\n\t\treturn `\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
`;\n\t}\n\n}\n\nLogViewController.loadSubView = function( container, beforeViewLoadedFun, afterViewLoadedFun ) {\n\n\tGlobal.loadViewSource( 'Log', 'LogView.html', function( result ) {\n\n\t\tvar args = {\n\t\t\tupdated: $.i18n._( 'Updated' ),\n\t\t\tcreated: $.i18n._( 'Created' )\n\t\t};\n\n\t\tvar template = _.template( result );\n\n\t\tif ( Global.isSet( beforeViewLoadedFun ) ) {\n\t\t\tbeforeViewLoadedFun();\n\t\t}\n\t\tif ( Global.isSet( container ) ) {\n\t\t\tcontainer.html( template( args ) );\n\t\t\tif ( Global.isSet( afterViewLoadedFun ) ) {\n\t\t\t\tafterViewLoadedFun( sub_log_view_controller );\n\t\t\t}\n\t\t}\n\t} );\n};\n\nLogViewController.html_template = `\n\t\n\t
\n\t\t
\n\t\t\t
<%= updated %>:
\n\t\t\t
\n\t\t
\n\t\t
\n\t\t\t
<%= created %>:
\n\t\t\t
\n\t\t
\n\t
\n\t\t
\n\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\t`;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixTQUFTO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxpQ0FBaUMsQ0FBQztBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLCtDQUErQzs7QUFFbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSxDQUFDO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0EsWUFBWSxDQUFDO0FBQ2IsWUFBWSxDQUFDO0FBQ2I7O0FBRUEsaUJBQWlCLENBQUM7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3MvY29yZS9sb2cvTG9nVmlld0NvbnRyb2xsZXIuanM/YTMwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTG9nVmlld0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlVmlld0NvbnRyb2xsZXIge1xuXHRjb25zdHJ1Y3Rvciggb3B0aW9ucyA9IHt9ICkge1xuXHRcdF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRcdGVsOiAnI2xvZ192aWV3X2NvbnRhaW5lcicsXG5cdFx0XHR0YWJsZXM6IHtcblx0XHRcdFx0J3Byb2R1Y3QnOiBbJ3Byb2R1Y3QnLCAncHJvZHVjdF9wcmljZSddLFxuXHRcdFx0XHQndXNlcl9jb250YWN0JzogWyd1c2VyX2NvbnRhY3QnXSxcblx0XHRcdFx0J3VzZXJzJzogWyd1c2VycycsICd1c2VyX3ByZWZlcmVuY2UnLCAndXNlcl93YWdlJywgJ2F1dGhlbnRpY2F0aW9uJ10sXG5cdFx0XHRcdCd1c2VyX3dhZ2UnOiBbJ3VzZXJfd2FnZSddLFxuXHRcdFx0XHQndXNlcl90aXRsZSc6IFsndXNlcl90aXRsZSddLFxuXHRcdFx0XHQndXNlcl9wcmVmZXJlbmNlJzogWyd1c2VyX3ByZWZlcmVuY2UnXSxcblx0XHRcdFx0J3VzZXJfcHJlZmVyZW5jZV9ub3RpZmljYXRpb24nOiBbJ3VzZXJfcHJlZmVyZW5jZV9ub3RpZmljYXRpb24nXSxcblx0XHRcdFx0J3VpX2tpdCc6IFsndWlfa2l0J10sXG5cdFx0XHRcdCd1aV9raXRfY2hpbGQnOiBbJ3VpX2tpdF9jaGlsZCddLFxuXHRcdFx0XHQnYmFua19hY2NvdW50JzogWydiYW5rX2FjY291bnQnXSxcblx0XHRcdFx0J3VzZXJfZGVmYXVsdCc6IFsndXNlcl9kZWZhdWx0J10sXG5cdFx0XHRcdCd1c2VyX2dyb3VwJzogWyd1c2VyX2dyb3VwJ10sXG5cdFx0XHRcdCdjb21wYW55JzogWydjb21wYW55J10sXG5cdFx0XHRcdCdwYXlfcGVyaW9kX3NjaGVkdWxlJzogWydwYXlfcGVyaW9kX3NjaGVkdWxlJywgJ3BheV9wZXJpb2QnLCAncGF5X3BlcmlvZF9zY2hlZHVsZV91c2VyJ10sXG5cdFx0XHRcdCdwYXlfcGVyaW9kJzogWydwYXlfcGVyaW9kJ10sXG5cdFx0XHRcdCdicmFuY2gnOiBbJ2JyYW5jaCddLFxuXHRcdFx0XHQnZGVwYXJ0bWVudCc6IFsnZGVwYXJ0bWVudCddLFxuXHRcdFx0XHQnaGllcmFyY2h5X2NvbnRyb2wnOiBbJ2hpZXJhcmNoeV9jb250cm9sJywgJ2hpZXJhcmNoeV9vYmplY3RfdHlwZScsICdoaWVyYXJjaHlfdXNlcicsICdoaWVyYXJjaHlfbGV2ZWwnXSxcblx0XHRcdFx0J3dhZ2VfZ3JvdXAnOiBbJ3dhZ2VfZ3JvdXAnXSxcblx0XHRcdFx0J2V0aG5pY19ncm91cCc6IFsnZXRobmljX2dyb3VwJ10sXG5cdFx0XHRcdCdjdXJyZW5jeSc6IFsnY3VycmVuY3knXSxcblx0XHRcdFx0J2N1cnJlbmN5X3JhdGUnOiBbJ2N1cnJlbmN5X3JhdGUnXSxcblx0XHRcdFx0J3Blcm1pc3Npb25fY29udHJvbCc6IFsncGVybWlzc2lvbl9jb250cm9sJywgJ3Blcm1pc3Npb25fdXNlciddLFxuXHRcdFx0XHQnY3VzdG9tX2ZpZWxkJzogWydjdXN0b21fZmllbGQnXSxcblx0XHRcdFx0J3N0YXRpb24nOiBbJ3N0YXRpb24nLCAnc3RhdGlvbl91c2VyX2dyb3VwJywgJ3N0YXRpb25fYnJhbmNoJywgJ3N0YXRpb25fZGVwYXJ0bWVudCcsICdzdGF0aW9uX2luY2x1ZGVfdXNlcicsICdzdGF0aW9uX2V4Y2x1ZGVfdXNlciddLFxuXHRcdFx0XHQncGF5X3N0dWJfYW1lbmRtZW50JzogWydwYXlfc3R1Yl9hbWVuZG1lbnQnXSxcblx0XHRcdFx0J3JlY3VycmluZ19wc19hbWVuZG1lbnQnOiBbJ3JlY3VycmluZ19wc19hbWVuZG1lbnQnLCAncmVjdXJyaW5nX3BzX2FtZW5kbWVudF91c2VyJ10sXG5cdFx0XHRcdCdwYXlfc3R1Yl9lbnRyeV9hY2NvdW50JzogWydwYXlfc3R1Yl9lbnRyeV9hY2NvdW50J10sXG5cdFx0XHRcdCdjb21wYW55X2RlZHVjdGlvbic6IFsnY29tcGFueV9kZWR1Y3Rpb24nLCAndXNlcl9kZWR1Y3Rpb24nLCAnY29tcGFueV9kZWR1Y3Rpb25fcGF5X3N0dWJfZW50cnlfYWNjb3VudCddLFxuXHRcdFx0XHQndXNlcl9leHBlbnNlJzogWyd1c2VyX2V4cGVuc2UnXSxcblx0XHRcdFx0J3JvdW5kX2ludGVydmFsX3BvbGljeSc6IFsncm91bmRfaW50ZXJ2YWxfcG9saWN5J10sXG5cdFx0XHRcdCdtZWFsX3BvbGljeSc6IFsnbWVhbF9wb2xpY3knXSxcblx0XHRcdFx0J2JyZWFrX3BvbGljeSc6IFsnYnJlYWtfcG9saWN5J10sXG5cdFx0XHRcdCdvdmVyX3RpbWVfcG9saWN5JzogWydvdmVyX3RpbWVfcG9saWN5J10sXG5cdFx0XHRcdCdhYnNlbmNlX3BvbGljeSc6IFsnYWJzZW5jZV9wb2xpY3knXSxcblx0XHRcdFx0J3JlY3VycmluZ19ob2xpZGF5JzogWydyZWN1cnJpbmdfaG9saWRheSddLFxuXHRcdFx0XHQnaG9saWRheV9wb2xpY3knOiBbJ2hvbGlkYXlfcG9saWN5JywgJ2hvbGlkYXlfcG9saWN5X3JlY3VycmluZ19ob2xpZGF5J10sXG5cdFx0XHRcdCdob2xpZGF5cyc6IFsnaG9saWRheXMnXSxcblx0XHRcdFx0J3ByZW1pdW1fcG9saWN5JzogWydwcmVtaXVtX3BvbGljeSddLFxuXHRcdFx0XHQncG9saWN5X2dyb3VwJzogWydwb2xpY3lfZ3JvdXAnLCAncG9saWN5X2dyb3VwX3VzZXInXSxcblx0XHRcdFx0J2RvY3VtZW50JzogWydkb2N1bWVudCcsICdkb2N1bWVudF9yZXZpc2lvbiddLFxuXHRcdFx0XHQnZG9jdW1lbnRfZ3JvdXAnOiBbJ2RvY3VtZW50X2dyb3VwJ10sXG5cdFx0XHRcdCdkb2N1bWVudF9yZXZpc2lvbic6IFsnZG9jdW1lbnRfcmV2aXNpb24nXSxcblx0XHRcdFx0J3NjaGVkdWxlX3BvbGljeSc6IFsnc2NoZWR1bGVfcG9saWN5J10sXG5cdFx0XHRcdCdhY2NydWFsX3BvbGljeSc6IFsnYWNjcnVhbF9wb2xpY3knLCAnYWNjcnVhbF9wb2xpY3lfbWlsZXN0b25lJywgJ2FjY3J1YWxfcG9saWN5X3VzZXJfbW9kaWZpZXInXSxcblx0XHRcdFx0J2NsaWVudCc6IFsnY2xpZW50JywgJ2NsaWVudF9jb250YWN0JywgJ2NsaWVudF9wYXltZW50J10sXG5cdFx0XHRcdCdyZXBvcnRfY3VzdG9tX2NvbHVtbic6IFsncmVwb3J0X2N1c3RvbV9jb2x1bW4nXSxcblx0XHRcdFx0J2NsaWVudF9jb250YWN0JzogWydjbGllbnRfY29udGFjdCddLFxuXHRcdFx0XHQnY2xpZW50X3BheW1lbnQnOiBbJ2NsaWVudF9wYXltZW50J10sXG5cdFx0XHRcdCdpbnZvaWNlX3RyYW5zYWN0aW9uJzogWydpbnZvaWNlX3RyYW5zYWN0aW9uJ10sXG5cdFx0XHRcdCdpbnZvaWNlJzogWydpbnZvaWNlJ10sXG5cdFx0XHRcdCdqb2InOiBbJ2pvYicsICdqb2JfZXhjbHVkZV9qb2JfaXRlbScsICdqb2JfZXhjbHVkZV91c2VyJywgJ2pvYl9pbmNsdWRlX2pvYl9pdGVtJywgJ2pvYl9pbmNsdWRlX3VzZXInLCAnam9iX2pvYl9pdGVtX2dyb3VwJywgJ2pvYl91c2VyX2JyYW5jaCcsICdqb2JfdXNlcl9ncm91cCcsICdqb2JfdXNlcl9kZXBhcnRtZW50J10sXG5cdFx0XHRcdCdjbGllbnRfZ3JvdXAnOiBbJ2NsaWVudF9ncm91cCddLFxuXHRcdFx0XHQncHJvZHVjdF9ncm91cCc6IFsncHJvZHVjdF9ncm91cCddLFxuXHRcdFx0XHQnam9iX2l0ZW0nOiBbJ2pvYl9pdGVtJ10sXG5cdFx0XHRcdCdqb2JfZ3JvdXAnOiBbJ2pvYl9ncm91cCddLFxuXHRcdFx0XHQnam9iX2l0ZW1fZ3JvdXAnOiBbJ2pvYl9pdGVtX2dyb3VwJ10sXG5cdFx0XHRcdCdyZXBvcnRfc2NoZWR1bGUnOiBbJ3JlcG9ydF9zY2hlZHVsZSddLFxuXHRcdFx0XHQnYWNjcnVhbF9wb2xpY3lfYWNjb3VudCc6IFsnYWNjcnVhbF9wb2xpY3lfYWNjb3VudCddLFxuXHRcdFx0XHQnYWNjcnVhbCc6IFsnYWNjcnVhbCddLFxuXHRcdFx0XHQnYWNjcnVhbF9iYWxhbmNlJzogWydhY2NydWFsX2JhbGFuY2UnXSxcblx0XHRcdFx0J3NjaGVkdWxlJzogWydzY2hlZHVsZSddLFxuXHRcdFx0XHQncmVjdXJyaW5nX3NjaGVkdWxlX2NvbnRyb2wnOiBbJ3JlY3VycmluZ19zY2hlZHVsZV9jb250cm9sJ10sIC8vLCAncmVjdXJyaW5nX3NjaGVkdWxlX3VzZXInXG5cdFx0XHRcdCdyZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfY29udHJvbCc6IFsncmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2wnLCAncmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlJ10sXG5cdFx0XHRcdCdwdW5jaCc6IFsncHVuY2gnLCAncHVuY2hfY29udHJvbCddLFxuXHRcdFx0XHQna3BpJzogWydrcGknXSxcblx0XHRcdFx0J2twaV9ncm91cCc6IFsna3BpX2dyb3VwJ10sXG5cdFx0XHRcdCdxdWFsaWZpY2F0aW9uJzogWydxdWFsaWZpY2F0aW9uJ10sXG5cdFx0XHRcdCdxdWFsaWZpY2F0aW9uX2dyb3VwJzogWydxdWFsaWZpY2F0aW9uX2dyb3VwJ10sXG5cdFx0XHRcdCd1c2VyX3NraWxsJzogWyd1c2VyX3NraWxsJ10sXG5cdFx0XHRcdCd1c2VyX2VkdWNhdGlvbic6IFsndXNlcl9lZHVjYXRpb24nXSxcblx0XHRcdFx0J3VzZXJfbWVtYmVyc2hpcCc6IFsndXNlcl9tZW1iZXJzaGlwJ10sXG5cdFx0XHRcdCd1c2VyX2xpY2Vuc2UnOiBbJ3VzZXJfbGljZW5zZSddLFxuXHRcdFx0XHQndXNlcl9sYW5ndWFnZSc6IFsndXNlcl9sYW5ndWFnZSddLFxuXHRcdFx0XHQnam9iX3ZhY2FuY3knOiBbJ2pvYl92YWNhbmN5J10sXG5cdFx0XHRcdCdqb2JfYXBwbGljYXRpb24nOiBbJ2pvYl9hcHBsaWNhdGlvbiddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudCc6IFsnam9iX2FwcGxpY2FudCddLFxuXHRcdFx0XHQnaW52b2ljZV9kaXN0cmljdCc6IFsnaW52b2ljZV9kaXN0cmljdCddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudF9lbXBsb3ltZW50JzogWydqb2JfYXBwbGljYW50X2VtcGxveW1lbnQnXSxcblx0XHRcdFx0J2pvYl9hcHBsaWNhbnRfcmVmZXJlbmNlJzogWydqb2JfYXBwbGljYW50X3JlZmVyZW5jZSddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudF9sb2NhdGlvbic6IFsnam9iX2FwcGxpY2FudF9sb2NhdGlvbiddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudF9za2lsbCc6IFsnam9iX2FwcGxpY2FudF9za2lsbCddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudF9lZHVjYXRpb24nOiBbJ2pvYl9hcHBsaWNhbnRfZWR1Y2F0aW9uJ10sXG5cdFx0XHRcdCdqb2JfYXBwbGljYW50X2xpY2Vuc2UnOiBbJ2pvYl9hcHBsaWNhbnRfbGljZW5zZSddLFxuXHRcdFx0XHQnam9iX2FwcGxpY2FudF9tZW1iZXJzaGlwJzogWydqb2JfYXBwbGljYW50X21lbWJlcnNoaXAnXSxcblx0XHRcdFx0J2pvYl9hcHBsaWNhbnRfbGFuZ3VhZ2UnOiBbJ2pvYl9hcHBsaWNhbnRfbGFuZ3VhZ2UnXSxcblx0XHRcdFx0J3RheF9wb2xpY3knOiBbJ3RheF9wb2xpY3knXSxcblx0XHRcdFx0J2FyZWFfcG9saWN5JzogWydhcmVhX3BvbGljeSddLFxuXHRcdFx0XHQnc2hpcHBpbmdfcG9saWN5JzogWydzaGlwcGluZ19wb2xpY3knXSxcblx0XHRcdFx0J3BheW1lbnRfZ2F0ZXdheSc6IFsncGF5bWVudF9nYXRld2F5J10sXG5cdFx0XHRcdCdyZXF1ZXN0JzogWydyZXF1ZXN0J10sXG5cdFx0XHRcdCdleGNlcHRpb25fcG9saWN5X2NvbnRyb2wnOiBbJ2V4Y2VwdGlvbl9wb2xpY3lfY29udHJvbCcsICdleGNlcHRpb25fcG9saWN5J10sXG5cdFx0XHRcdCd1c2VyX3Jldmlld19jb250cm9sJzogWyd1c2VyX3Jldmlld19jb250cm9sJywgJ3VzZXJfcmV2aWV3J10sXG5cdFx0XHRcdCdyb2UnOiBbJ3JvZSddLFxuXHRcdFx0XHQnZXhwZW5zZV9wb2xpY3knOiBbJ2V4cGVuc2VfcG9saWN5J10sXG5cdFx0XHRcdCd1c2VyX3JlcG9ydF9kYXRhJzogWyd1c2VyX3JlcG9ydF9kYXRhJ10sXG5cdFx0XHRcdCdyZWd1bGFyX3RpbWVfcG9saWN5JzogWydyZWd1bGFyX3RpbWVfcG9saWN5J10sXG5cdFx0XHRcdCdwYXlfY29kZSc6IFsncGF5X2NvZGUnXSxcblx0XHRcdFx0J3BheV9mb3JtdWxhX3BvbGljeSc6IFsncGF5X2Zvcm11bGFfcG9saWN5J10sXG5cdFx0XHRcdCdjb250cmlidXRpbmdfcGF5X2NvZGVfcG9saWN5JzogWydjb250cmlidXRpbmdfcGF5X2NvZGVfcG9saWN5J10sXG5cdFx0XHRcdCdjb250cmlidXRpbmdfc2hpZnRfcG9saWN5JzogWydjb250cmlidXRpbmdfc2hpZnRfcG9saWN5J10sXG5cdFx0XHRcdCdhY2NydWFsX3BvbGljeV91c2VyX21vZGlmaWVyJzogWydhY2NydWFsX3BvbGljeV91c2VyX21vZGlmaWVyJ10sXG5cdFx0XHRcdCdqb2JfaXRlbV9hbWVuZG1lbnQnOiBbJ2pvYl9pdGVtX2FtZW5kbWVudCddLFxuXHRcdFx0XHQndXNlcl9kYXRlX3RvdGFsJzogWyd1c2VyX2RhdGVfdG90YWwnXSxcblx0XHRcdFx0J3BheV9zdHViJzogWydwYXlfc3R1YicsICdwYXlfc3R1Yl9lbnRyeSddLFxuXHRcdFx0XHQnbGVnYWxfZW50aXR5JzogWydsZWdhbF9lbnRpdHknXSxcblx0XHRcdFx0J3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3knOiBbJ3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3knXSxcblx0XHRcdFx0J3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfZXZlbnQnOiBbJ3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfZXZlbnQnXSxcblx0XHRcdFx0J3JlbWl0dGFuY2Vfc291cmNlX2FjY291bnQnOiBbJ3JlbWl0dGFuY2Vfc291cmNlX2FjY291bnQnXSxcblx0XHRcdFx0J3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudCc6IFsncmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50J10sXG5cdFx0XHRcdCdnZW9fZmVuY2UnOiBbJ2dlb19mZW5jZSddXG5cdFx0XHR9LFxuXHRcdFx0bG9nX2RldGFpbF9ncmlkOiBudWxsLFxuXHRcdFx0bG9nX2RldGFpbF9zY3JpcHRfbmFtZTogbnVsbFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXG5cdFx0Ly90aGlzLl9zdXBlcignaW5pdGlhbGl6ZScsIG9wdGlvbnMgKTtcblx0XHR0aGlzLmVkaXRfdmlld190cGwgPSAnTG9nRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnQXVkaXQnICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdBdWRpdCcgKTtcblx0XHR0aGlzLnZpZXdJZCA9ICdMb2cnO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnTG9nVmlldyc7XG5cdFx0dGhpcy5sb2dfZGV0YWlsX3NjcmlwdF9uYW1lID0gJ0xvZ0RldGFpbFZpZXcnO1xuXHRcdHRoaXMuYXBpID0gVFRBUEkuQVBJTG9nO1xuXHRcdHRoaXMubm90aWNlRGl2ID0gJCggJy5hdWRpdC1pbmZvJyApO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblxuXHRcdGlmICggdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSgpO1xuXHRcdH1cblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX2F1ZGl0X2RldGFpbHMnOiB7XG5cdFx0XHRcdCdsYWJlbCc6ICQuaTE4bi5fKCAnQXVkaXQgRGV0YWlscycgKSxcblx0XHRcdFx0J2h0bWxfdGVtcGxhdGUnOiB0aGlzLmdldEF1ZGl0TG9nVGFiSHRtbCgpXG5cdFx0XHR9LFxuXHRcdH07XG5cdFx0dGhpcy5zZXRUYWJNb2RlbCggdGFiX21vZGVsICk7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUxvZyxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9sb2cnLFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5zZXROYXZpZ2F0aW9uKCk7XG5cblx0XHR2YXIgdGFiX2F1ZGl0X2RldGFpbHMgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfYXVkaXRfZGV0YWlscycgKTtcblx0XHR2YXIgdGFiX2F1ZGl0X2RldGFpbHNfY29sdW1uMSA9IHRhYl9hdWRpdF9kZXRhaWxzLmZpbmQoICcuZmlyc3Qtcm93JyApO1xuXHRcdC8vIHRhYl9hdWRpdF9kZXRhaWxzIGNvbHVtbjFcblxuXHRcdC8vIERhdGVcblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7XG5cdFx0XHRmaWVsZDogJ2RhdGUnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfYXVkaXRfZGV0YWlsc19jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly8gQWN0aW9uXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7XG5cdFx0XHRmaWVsZDogJ2FjdGlvbidcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBY3Rpb24nICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2F1ZGl0X2RldGFpbHNfY29sdW1uMSApO1xuXG5cdFx0Ly8gRW1wbG95ZWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCgge1xuXHRcdFx0ZmllbGQ6ICd1c2VyX25hbWUnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2F1ZGl0X2RldGFpbHNfY29sdW1uMSApO1xuXG5cdFx0Ly8gRGVzY3JpcHRpb25cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHtcblx0XHRcdGZpZWxkOiAnZGVzY3JpcHRpb24nXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVzY3JpcHRpb24nICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2F1ZGl0X2RldGFpbHNfY29sdW1uMSwgJycgKTtcblxuXHRcdC8vIHNldCB0aGUgbG9nIGRldGFpbHMgaW5mb3JtYXRpb24uXG5cdFx0dGhpcy5pbml0TG9nRGV0YWlsc1ZpZXcoKTtcblx0fVxuXG5cdHNlYXJjaCggc2V0X2RlZmF1bHRfbWVudSwgcGFnZV9hY3Rpb24sIHBhZ2VfbnVtYmVyLCBjYWxsQmFjayApIHtcblxuXHRcdGlmICggIUdsb2JhbC5pc1NldCggc2V0X2RlZmF1bHRfbWVudSApICkge1xuXHRcdFx0c2V0X2RlZmF1bHRfbWVudSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgZmlsdGVyID0ge307XG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0ZmlsdGVyLmZpbHRlcl9zb3J0ID0ge307XG5cdFx0ZmlsdGVyLmZpbHRlcl9jb2x1bW5zID0gdGhpcy5nZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCk7XG5cdFx0ZmlsdGVyLmZpbHRlcl9pdGVtc19wZXJfcGFnZSA9IDA7IC8vIERlZmF1bHQgdG8gMCB0byBsb2FkIHVzZXIgcHJlZmVyZW5jZSBkZWZpbmVkXG5cblx0XHRpZiAoIHRoaXMucGFnZXJfZGF0YSApIHtcblxuXHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5wYWdpbmdfdHlwZSA9PT0gMCApIHtcblx0XHRcdFx0aWYgKCBwYWdlX2FjdGlvbiA9PT0gJ25leHQnICkge1xuXHRcdFx0XHRcdGZpbHRlci5maWx0ZXJfcGFnZSA9IHRoaXMucGFnZXJfZGF0YS5uZXh0X3BhZ2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9wYWdlID0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzd2l0Y2ggKCBwYWdlX2FjdGlvbiApIHtcblx0XHRcdFx0XHRjYXNlICduZXh0Jzpcblx0XHRcdFx0XHRcdGZpbHRlci5maWx0ZXJfcGFnZSA9IHRoaXMucGFnZXJfZGF0YS5uZXh0X3BhZ2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYXN0Jzpcblx0XHRcdFx0XHRcdGZpbHRlci5maWx0ZXJfcGFnZSA9IHRoaXMucGFnZXJfZGF0YS5wcmV2aW91c19wYWdlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RhcnQnOlxuXHRcdFx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9wYWdlID0gMTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2VuZCc6XG5cdFx0XHRcdFx0XHRmaWx0ZXIuZmlsdGVyX3BhZ2UgPSB0aGlzLnBhZ2VyX2RhdGEubGFzdF9wYWdlX251bWJlcjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2dvX3RvJzpcblx0XHRcdFx0XHRcdGZpbHRlci5maWx0ZXJfcGFnZSA9IHBhZ2VfbnVtYmVyO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGZpbHRlci5maWx0ZXJfcGFnZSA9IHRoaXMucGFnZXJfZGF0YS5jdXJyZW50X3BhZ2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9wYWdlID0gMTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuc2VsZWN0X2xheW91dCAmJiB0aGlzLnNlbGVjdF9sYXlvdXQuZGF0YSApIHtcblx0XHRcdGlmICggdGhpcy5zdWJfdmlld19tb2RlICYmIHRoaXMucGFyZW50X2tleSApIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZmlsdGVyX2RhdGFbdGhpcy5wYXJlbnRfa2V5XSA9IHRoaXMucGFyZW50X3ZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvL0lmIHN1YiB2aWV3IGNvbnRyb2xsZXIgc2V0IGN1c3RvbSBmaWx0ZXJzLCBnZXQgaXRcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLmdldFN1YlZpZXdGaWx0ZXIgKSApIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZmlsdGVyX2RhdGEgPSB0aGlzLmdldFN1YlZpZXdGaWx0ZXIoIHRoaXMuc2VsZWN0X2xheW91dC5kYXRhLmZpbHRlcl9kYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vc2VsZWN0X2xheW91dCB3aWxsIG5vdCBiZSBudWxsLCBpdCdzIHNldCBpbiBzZXRTZWxlY3RMYXlvdXQgZnVuY3Rpb25cblx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IEdsb2JhbC5jb252ZXJ0TGF5b3V0RmlsdGVyVG9BUElGaWx0ZXIoIHRoaXMuc2VsZWN0X2xheW91dCApO1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9zb3J0ID0gdGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZmlsdGVyX3NvcnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBUVFVVSUQuaXNVVUlEKCB0aGlzLnJlZnJlc2hfaWQgKSApIHtcblx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLmlkID0gW3RoaXMucmVmcmVzaF9pZF07XG5cblx0XHRcdHRoaXMubGFzdF9zZWxlY3RfaWRzID0gZmlsdGVyLmZpbHRlcl9kYXRhLmlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxhc3Rfc2VsZWN0X2lkcyA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHR9XG5cblx0XHR0aGlzLmFwaVsnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggZmlsdGVyLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHR2YXIgbGVuO1xuXG5cdFx0XHRcdGlmICggIUdsb2JhbC5pc0FycmF5KCByZXN1bHRfZGF0YSApICkge1xuXHRcdFx0XHRcdCR0aGlzLnNob3dOb1Jlc3VsdENvdmVyKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMucmVtb3ZlTm9SZXN1bHRDb3ZlcigpO1xuXHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCAkdGhpcy5fX2NyZWF0ZVJvd0lkICkgKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRfZGF0YSA9ICR0aGlzLl9fY3JlYXRlUm93SWQoIHJlc3VsdF9kYXRhICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBHbG9iYWwuZm9ybWF0R3JpZERhdGEoIHJlc3VsdF9kYXRhLCAkdGhpcy5hcGkua2V5X25hbWUgKTtcblxuXHRcdFx0XHRcdGxlbiA9IHJlc3VsdF9kYXRhLmxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHQkdGhpcy5zZXRBdWRpdEluZm8oKTtcblx0XHRcdFx0aWYgKCBUVFVVSUQuaXNVVUlEKCAkdGhpcy5yZWZyZXNoX2lkICkgKSB7XG5cdFx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IG51bGw7XG5cdFx0XHRcdFx0dmFyIGdyaWRfc291cmNlX2RhdGEgPSAkdGhpcy5ncmlkLmdyaWQuZ2V0R3JpZFBhcmFtKCAnZGF0YScgKTtcblx0XHRcdFx0XHRsZW4gPSBncmlkX3NvdXJjZV9kYXRhLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggJC50eXBlKCBncmlkX3NvdXJjZV9kYXRhICkgIT09ICdhcnJheScgKSB7XG5cdFx0XHRcdFx0XHRncmlkX3NvdXJjZV9kYXRhID0gW107XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdFx0dmFyIG5ld19yZWNvcmQgPSByZXN1bHRfZGF0YVswXTtcblxuXHRcdFx0XHRcdC8vRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydHkgJ2lkJyBvZiB1bmRlZmluZWQgaW4gL2ludGVyZmFjZS9odG1sNS92aWV3cy9CYXNlVmlld0NvbnRyb2xsZXIuanM/dj03LjQuMy0yMDE0MDkyNC0wODQ2MDUgbGluZSA0ODUxXG5cdFx0XHRcdFx0aWYgKCBuZXdfcmVjb3JkICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciByZWNvcmQgPSBncmlkX3NvdXJjZV9kYXRhW2ldO1xuXG5cdFx0XHRcdFx0XHRcdC8vRml4ZWQgPT09IGlzc3VlLiBUaGUgaWQgc2V0IGJ5IGpRR3JpZCBpcyBzdHJpbmcgdHlwZS5cblx0XHRcdFx0XHRcdFx0Ly8gaWYgKCAhaXNOYU4oIHBhcnNlSW50KCByZWNvcmQuaWQgKSApICkge1xuXHRcdFx0XHRcdFx0XHQvLyBcdHJlY29yZC5pZCA9IHBhcnNlSW50KCByZWNvcmQuaWQgKTtcblx0XHRcdFx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdFx0XHRcdGlmICggcmVjb3JkLmlkID09IG5ld19yZWNvcmQuaWQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuZ3JpZC5ncmlkLnNldFJvd0RhdGEoIG5ld19yZWNvcmQuaWQsIG5ld19yZWNvcmQgKTtcblx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCAhZm91bmQgKSB7XG5cdFx0XHRcdFx0XHRcdGdyaWRfc291cmNlX2RhdGEucHVzaCggbmV3X3JlY29yZCApO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5ncmlkLnNldERhdGEoIGdyaWRfc291cmNlX2RhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBpZiAoICR0aGlzLnN1Yl92aWV3X21vZGUgJiYgR2xvYmFsLmlzU2V0KCAkdGhpcy5yZXNpemVTdWJHcmlkICkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFx0bGVuID0gR2xvYmFsLmlzU2V0KCBsZW4gKSA/IGxlbiA6IDA7XG5cdFx0XHRcdFx0XHRcdC8vIFx0JHRoaXMucmVzaXplU3ViR3JpZCggbGVuICsgMSApO1xuXHRcdFx0XHRcdFx0XHQvLyB9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9TZXQgUGFnZSBkYXRhIHRvIHdpZGdldCwgbmV4dCBzaG93IGRpc3BsYXkgaW5mbyB3aGVuIHNldERlZmF1bHQgTWVudVxuXHRcdFx0XHRcdCR0aGlzLnBhZ2VyX2RhdGEgPSByZXN1bHQuZ2V0UGFnZXJEYXRhKCk7XG5cblx0XHRcdFx0XHQvL0NMaWNrIHRvIHNob3cgbW9yZSBtb2RlIG5vIG5lZWQgdGhpcyBzdGVwXG5cdFx0XHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5wYWdpbmdfdHlwZSAhPT0gMCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnBhZ2luZ193aWRnZXQuc2V0UGFnZXJEYXRhKCAkdGhpcy5wYWdlcl9kYXRhICk7XG5cdFx0XHRcdFx0XHQkdGhpcy5wYWdpbmdfd2lkZ2V0XzIuc2V0UGFnZXJEYXRhKCAkdGhpcy5wYWdlcl9kYXRhICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5wYWdpbmdfdHlwZSA9PT0gMCAmJiBwYWdlX2FjdGlvbiA9PT0gJ25leHQnICkge1xuXHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRfZGF0YSA9ICR0aGlzLmdyaWQuZ2V0R3JpZFBhcmFtKCAnZGF0YScgKTtcblx0XHRcdFx0XHRcdHJlc3VsdF9kYXRhID0gY3VycmVudF9kYXRhLmNvbmNhdCggcmVzdWx0X2RhdGEgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcm9jZXNzIHJlc3VsdF9kYXRhIGlmIG5lY2Vzc2FyeSwgdGhpcyBhbHdheXMgbmVlZHMgb3ZlcnJpZGUuXG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSAkdGhpcy5wcm9jZXNzUmVzdWx0RGF0YSggcmVzdWx0X2RhdGEgKTtcblxuXHRcdFx0XHRcdGlmICggJHRoaXMuZ3JpZCApIHtcblx0XHRcdFx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEucGFnaW5nX3R5cGUgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISR0aGlzLnBhZ2VyX2RhdGEgfHwgJHRoaXMucGFnZXJfZGF0YS5pc19sYXN0X3BhZ2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMucGFnaW5nX3dpZGdldC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMucGFnaW5nX3dpZGdldC5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkdGhpcy5ncmlkLnNldERhdGEoIHJlc3VsdF9kYXRhICk7XG5cdFx0XHRcdFx0XHQkdGhpcy5zZXRHcmlkQ29sdW1uc1dpZHRoKCk7XG5cdFx0XHRcdFx0XHRpZiAoICR0aGlzLnN1Yl92aWV3X21vZGUgJiYgR2xvYmFsLmlzU2V0KCAkdGhpcy5iYXNlVmlld1N1YlRhYkdyaWRSZXNpemUgKSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuYmFzZVZpZXdTdWJUYWJHcmlkUmVzaXplKCAndGFiX2F1ZGl0JyApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQkdGhpcy5yZVNlbGVjdExhc3RTZWxlY3RJdGVtcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnNldEdyaWRDZWxsQmFja0dyb3VuZCgpOyAvL1NldCBjZWxsIGJhY2tncm91bmQgZm9yIHNvbWUgdmlld3NcblxuXHRcdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTsgLy9BZGQgdGhpcyBpbiBpbml0RGF0YVxuXG5cdFx0XHRcdGlmICggc2V0X2RlZmF1bHRfbWVudSApIHtcblx0XHRcdFx0XHQkdGhpcy5zZXREZWZhdWx0TWVudSggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5wYWdpbmdfdHlwZSA9PT0gMCApIHtcblx0XHRcdFx0XHRpZiAoICEkdGhpcy5wYWdlcl9kYXRhIHx8ICR0aGlzLnBhZ2VyX2RhdGEuaXNfbGFzdF9wYWdlICkge1xuXHRcdFx0XHRcdFx0JHRoaXMucGFnaW5nX3dpZGdldC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdCR0aGlzLnBhZ2luZ193aWRnZXQuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGNhbGxCYWNrICkge1xuXHRcdFx0XHRcdGNhbGxCYWNrKCByZXN1bHQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHdoZW4gY2FsbCB0aGlzIGZyb20gc2F2ZSBhbmQgbmV3IHJlc3VsdCwgd2UgZG9uJ3QgY2FsbCBhdXRvIG9wZW4sIGJlY2F1c2UgdGhpcyB3aWxsIGNhbGwgb25BZGRDbGljayB0d2ljZVxuXHRcdFx0XHRpZiAoIHNldF9kZWZhdWx0X21lbnUgKSB7XG5cdFx0XHRcdFx0JHRoaXMuYXV0b09wZW5FZGl0Vmlld0lmTmVjZXNzYXJ5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkdGhpcy5zZWFyY2hEb25lKCk7XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRnZXRHcmlkU2V0dXAoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRyZXR1cm4ge1xuXHRcdFx0Y29udGFpbmVyX3NlbGVjdG9yOiB0aGlzLnN1Yl92aWV3X21vZGUgPyAnLmVkaXQtdmlldy10YWItYmFyJyA6ICdib2R5Jyxcblx0XHRcdHN1Yl9ncmlkX21vZGU6IHRoaXMuc3ViX3ZpZXdfbW9kZSxcblx0XHRcdG9uUmVzaXplR3JpZDogdHJ1ZSxcblx0XHRcdG11bHRpc2VsZWN0OiBmYWxzZSxcblx0XHRcdG9uU2VsZWN0Um93OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMub25HcmlkU2VsZWN0Um93KCk7XG5cdFx0XHR9LFxuXHRcdFx0b25DZWxsU2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMub25HcmlkU2VsZWN0Um93KCk7XG5cdFx0XHR9LFxuXHRcdFx0b25TZWxlY3RBbGw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5vbkdyaWRTZWxlY3RBbGwoKTtcblx0XHRcdH0sXG5cdFx0XHRvbmRibENsaWNrUm93OiBmdW5jdGlvbiggZSApIHtcblx0XHRcdFx0JHRoaXMub25HcmlkRGJsQ2xpY2tSb3coIGUgKTtcblx0XHRcdH0sXG5cdFx0XHRvblJpZ2h0Q2xpY2tSb3c6IGZ1bmN0aW9uKCByb3dJZCApIHtcblx0XHRcdFx0dmFyIGlkX2FycmF5ID0gJHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHRcdFx0aWYgKCBpZF9hcnJheS5pbmRleE9mKCByb3dJZCApIDwgMCApIHtcblx0XHRcdFx0XHQkdGhpcy5ncmlkLmdyaWQucmVzZXRTZWxlY3Rpb24oKTtcblx0XHRcdFx0XHQkdGhpcy5ncmlkLmdyaWQuc2V0U2VsZWN0aW9uKCByb3dJZCApO1xuXHRcdFx0XHRcdCR0aGlzLm9uR3JpZFNlbGVjdFJvdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2V0R3JpZFNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5iYXNlVmlld1N1YlRhYkdyaWRSZXNpemUoICd0YWJfYXVkaXQnICk7IC8vV29ya3MgZm9yIEVkaXQgRW1wbG95ZWUgLT4gQXVkaXQgdGFiXG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdF9zZXRHcmlkU2l6ZUdyaWRIZWlnaHQoIGhlYWRlcl9zaXplICkge1xuXHRcdC8vIGlmICggIXRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHQvLyBcdHRoaXMuZ3JpZC5zZXRHcmlkSGVpZ2h0KCAoJCggdGhpcy5lbCApLmhlaWdodCgpIC0gKHRoaXMuc2VhcmNoX3BhbmVsICYmIHRoaXMuc2VhcmNoX3BhbmVsLmlzKCAnOnZpc2libGUnICkgPyB0aGlzLnNlYXJjaF9wYW5lbC5oZWlnaHQoKSA6IDApIC0gNjggLSBoZWFkZXJfc2l6ZSkgKTtcblx0XHQvLyB9IGVsc2UgaWYgKCAhR2xvYmFsLmlzU2V0KCB0aGlzLnJlc2l6ZVN1YkdyaWQgKSApIHtcblx0XHRpZiAoIHRoaXMucGFnZXJfZGF0YSAmJiB0aGlzLnBhZ2VyX2RhdGEubGFzdF9wYWdlX251bWJlciA+IDEgKSB7XG5cdFx0XHR0aGlzLmdyaWQuc2V0R3JpZEhlaWdodCggJCggdGhpcy5lbCApLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmhlaWdodCgpIC0gMTAxIC0gaGVhZGVyX3NpemUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5ncmlkLnNldEdyaWRIZWlnaHQoICQoIHRoaXMuZWwgKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5oZWlnaHQoKSAtIDc4IC0gaGVhZGVyX3NpemUgKTtcblx0XHR9XG5cblx0XHQvLyB9XG5cdH1cblxuXHRzZXRBdWRpdEluZm8oKSB7XG5cdFx0dmFyIHVwZGF0ZWRfaW5mbyA9ICggdGhpcy5wYXJlbnRfZWRpdF9yZWNvcmRbJ3VwZGF0ZWRfZGF0ZSddIHx8ICQuaTE4bi5fKCAnTi9BJyApICkgKyAnICcgKyAkLmkxOG4uXyggJ2J5JyApICsgJyAnICsgKCB0aGlzLnBhcmVudF9lZGl0X3JlY29yZFsndXBkYXRlZF9ieSddIHx8ICQuaTE4bi5fKCAnTi9BJyApICkgKyAnICc7XG5cdFx0dmFyIGNyZWF0ZWRfaW5mbyA9ICggdGhpcy5wYXJlbnRfZWRpdF9yZWNvcmRbJ2NyZWF0ZWRfZGF0ZSddIHx8ICQuaTE4bi5fKCAnTi9BJyApICkgKyAnICcgKyAkLmkxOG4uXyggJ2J5JyApICsgJyAnICsgKCB0aGlzLnBhcmVudF9lZGl0X3JlY29yZFsnY3JlYXRlZF9ieSddIHx8ICQuaTE4bi5fKCAnTi9BJyApICkgKyAnICc7XG5cdFx0dGhpcy5ub3RpY2VEaXYuZmluZCggJy5sZWZ0ID4gLmluZm8nICkudGV4dCggdXBkYXRlZF9pbmZvICk7XG5cdFx0dGhpcy5ub3RpY2VEaXYuZmluZCggJy5yaWdodCA+IC5pbmZvJyApLnRleHQoIGNyZWF0ZWRfaW5mbyApO1xuXHR9XG5cblx0YXV0b09wZW5FZGl0Vmlld0lmTmVjZXNzYXJ5KCkge1xuXHRcdC8vQXV0byBvcGVuIGVkaXQgdmlldy4gU2hvdWxkIHNldCBpbiBJbmRleENvbnRyb2xsZXJcblx0XHRzd2l0Y2ggKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uICkge1xuXHRcdFx0Y2FzZSAndmlldyc6XG5cdFx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuZWRpdF9pZF9mb3JfbmV4dF9vcGVuX3ZpZXcgKSB7XG5cdFx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggTG9jYWxDYWNoZURhdGEuZWRpdF9pZF9mb3JfbmV4dF9vcGVuX3ZpZXcgKTtcblx0XHRcdFx0XHRMb2NhbENhY2hlRGF0YS5lZGl0X2lkX2Zvcl9uZXh0X29wZW5fdmlldyA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy5hdXRvT3BlbkVkaXRPbmx5Vmlld0lmTmVjZXNzYXJ5KCk7XG5cdH1cblxuXHRpbml0TG9nRGV0YWlsc1ZpZXcoIGNvbHVtbl9zdGFydF9mcm9tICkge1xuXG5cdFx0dmFyIGdyaWQgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnI2dyaWQnICk7XG5cblx0XHRpZiAoIGdyaWQgKSB7XG5cdFx0XHRncmlkLmF0dHIoICdpZCcsIHRoaXMubG9nX2RldGFpbF9zY3JpcHRfbmFtZSArICdfZ3JpZCcgKTsgIC8vR3JpZCdzIGlkIGlzIFNjcmlwdE5hbWUgKyBfZ3JpZFxuXHRcdH1cblxuXHRcdC8vZ3JpZCA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcjJyArIHRoaXMubG9nX2RldGFpbF9zY3JpcHRfbmFtZSArICdfZ3JpZCcgKTtcblxuXHRcdHZhciBjb2x1bW5faW5mb19hcnJheSA9IFtdO1xuXHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSBbXG5cdFx0XHR7IGxhYmVsOiAkLmkxOG4uXyggJ0ZpZWxkJyApLCB2YWx1ZTogJ2Rpc3BsYXlfZmllbGQnIH0sXG5cdFx0XHR7IGxhYmVsOiAkLmkxOG4uXyggJ0JlZm9yZScgKSwgdmFsdWU6ICdvbGRfdmFsdWUnIH0sXG5cdFx0XHR7IGxhYmVsOiAkLmkxOG4uXyggJ0FmdGVyJyApLCB2YWx1ZTogJ25ld192YWx1ZScgfVxuXHRcdF07XG5cblx0XHQvL1NldCBEYXRhIEdyaWQgb24gTGlzdCB2aWV3XG5cdFx0dmFyIGxlbiA9IGRpc3BsYXlfY29sdW1ucy5sZW5ndGg7XG5cblx0XHR2YXIgc3RhcnRfZnJvbSA9IDA7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggY29sdW1uX3N0YXJ0X2Zyb20gKSAmJiBjb2x1bW5fc3RhcnRfZnJvbSA+IDAgKSB7XG5cdFx0XHRzdGFydF9mcm9tID0gY29sdW1uX3N0YXJ0X2Zyb207XG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSBzdGFydF9mcm9tOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgdmlld19jb2x1bW5fZGF0YSA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblxuXHRcdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRuYW1lOiB2aWV3X2NvbHVtbl9kYXRhLnZhbHVlLFxuXHRcdFx0XHRpbmRleDogdmlld19jb2x1bW5fZGF0YS52YWx1ZSxcblx0XHRcdFx0bGFiZWw6IHZpZXdfY29sdW1uX2RhdGEubGFiZWwsXG5cdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dGl0bGU6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblx0XHR9XG5cblx0XHR2YXIgZ3JpZF9zZXR1cCA9IHtcblx0XHRcdGNvbnRhaW5lcl9zZWxlY3RvcjogdGhpcy5zdWJfdmlld19tb2RlID8gJy5lZGl0LXZpZXctdGFiLWJhcicgOiAnYm9keScsXG5cdFx0XHRzdWJfZ3JpZF9tb2RlOiB0aGlzLnN1Yl92aWV3X21vZGUsXG5cdFx0XHRvblJlc2l6ZUdyaWQ6IHRydWUsXG5cdFx0XHRtdWx0aXNlbGVjdDogZmFsc2UsXG5cdFx0fTtcblxuXHRcdHRoaXMubG9nX2RldGFpbF9ncmlkID0gbmV3IFRUR3JpZCggdGhpcy5sb2dfZGV0YWlsX3NjcmlwdF9uYW1lICsgJ19ncmlkJywgZ3JpZF9zZXR1cCwgY29sdW1uX2luZm9fYXJyYXkgKTtcblx0fVxuXG5cdGluaXRFZGl0Vmlld0RhdGEoKSB7XG5cdFx0c3VwZXIuaW5pdEVkaXRWaWV3RGF0YSgpO1xuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfYXVkaXRfZGV0YWlscycgKS5maW5kKCAnLmRldGFpbC1ncmlkLXJvdycgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2F1ZGl0X2RldGFpbHMnICkuZmluZCggJy5kZXRhaWwtZ3JpZC1yb3cnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tbWVzc2FnZScgKS5odG1sKCBHbG9iYWwuZ2V0VXBncmFkZU1lc3NhZ2UoKSApO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nX2RldGFpbF9ncmlkLnNldEdyaWRDb2x1bW5zV2lkdGgoKTtcblx0fVxuXG5cdG9uR3JpZERibENsaWNrUm93KCkge1xuXHRcdHRoaXMub25WaWV3RGV0YWlsQ2xpY2soKTtcblx0fVxuXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblx0XHQvL1NldCBjdXJyZW50IGVkaXQgcmVjb3JkIGRhdGEgdG8gYWxsIHdpZGdldHNcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQgKSApIHtcblx0XHRcdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0XHRcdGNhc2UgJ3VzZXJfbmFtZSc6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZmlyc3RfbmFtZSddICsgJyAnICsgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydsYXN0X25hbWUnXSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICdkZXRhaWxzJzpcblx0XHRcdFx0XHRcdHRoaXMuc2V0TG9nRGV0YWlsc1ZpZXdEYXRhKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHR0aGlzLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0fVxuXG5cdHNldExvZ0RldGFpbHNWaWV3RGF0YSggbG9nX2RldGFpbF9kYXRhICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggIUdsb2JhbC5pc0FycmF5KCBsb2dfZGV0YWlsX2RhdGEgKSApIHtcblx0XHRcdCR0aGlzLnNob3dEZXRhaWxOb1Jlc3VsdENvdmVyKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnJlbW92ZU5vUmVzdWx0Q292ZXIoKTtcblx0XHR9XG5cblx0XHRsb2dfZGV0YWlsX2RhdGEgPSBHbG9iYWwuZm9ybWF0R3JpZERhdGEoIGxvZ19kZXRhaWxfZGF0YSApO1xuXG5cdFx0JHRoaXMubG9nX2RldGFpbF9ncmlkLnNldERhdGEoIGxvZ19kZXRhaWxfZGF0YSApO1xuXG5cdFx0JHRoaXMuc2V0TG9nRGV0YWlsR3JpZFNpemUoKTtcblx0fVxuXG5cdHNldExvZ0RldGFpbEdyaWRTaXplKCkge1xuXG5cdFx0aWYgKCAhdGhpcy5sb2dfZGV0YWlsX2dyaWQgfHwgISQoIHRoaXMubG9nX2RldGFpbF9ncmlkLmdyaWQgKS5pcyggJzp2aXNpYmxlJyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0YWJfYXVkaXRfZGV0YWlscyA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcjdGFiX2F1ZGl0X2RldGFpbHNfY29udGVudF9kaXYnICk7XG5cdFx0dmFyIGZpcnN0X3JvdyA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcuZmlyc3Qtcm93JyApO1xuXHRcdHRoaXMubG9nX2RldGFpbF9ncmlkLmdyaWQuc2V0R3JpZFdpZHRoKCB0YWJfYXVkaXRfZGV0YWlscy53aWR0aCgpICk7XG5cdFx0dGhpcy5sb2dfZGV0YWlsX2dyaWQuZ3JpZC5zZXRHcmlkSGVpZ2h0KCB0YWJfYXVkaXRfZGV0YWlscy5oZWlnaHQoKSAtIGZpcnN0X3Jvdy5oZWlnaHQoKSApO1xuXHR9XG5cblx0c2hvd0RldGFpbE5vUmVzdWx0Q292ZXIoKSB7XG5cdFx0dGhpcy5yZW1vdmVOb1Jlc3VsdENvdmVyKCk7XG5cdFx0dGhpcy5ub19yZXN1bHRfYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIFdpZGdldE5hbWVzRGljLk5PX1JFU1VMVF9CT1ggKTtcblx0XHR0aGlzLm5vX3Jlc3VsdF9ib3guTm9SZXN1bHRCb3goIHsgcmVsYXRlZF92aWV3X2NvbnRyb2xsZXI6IHRoaXMsIGlzX25ldzogZmFsc2UgfSApO1xuXG5cdFx0dmFyIGdyaWRfZGl2ID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJy5ncmlkLWRpdicgKTtcblxuXHRcdGdyaWRfZGl2LmFwcGVuZCggdGhpcy5ub19yZXN1bHRfYm94ICk7XG5cdH1cblxuXHRzaG93Tm9SZXN1bHRDb3ZlcigpIHtcblx0XHRzdXBlci5zaG93Tm9SZXN1bHRDb3ZlciggZmFsc2UgKTtcblx0fVxuXG5cdG9uRWRpdENsaWNrKCBlZGl0SWQsIG5vUmVmcmVzaFVJICkge1xuXG5cdFx0dGhpcy5vblZpZXdEZXRhaWxDbGljayggZWRpdElkLCBub1JlZnJlc2hVSSApO1xuXHR9XG5cblx0b25WaWV3RGV0YWlsQ2xpY2soIGVkaXRJZCApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5zZXRDdXJyZW50RWRpdFZpZXdTdGF0ZSggJ3ZpZXdfZGV0YWlsJyApO1xuXHRcdCR0aGlzLm9wZW5FZGl0VmlldygpO1xuXG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2xlbmd0aCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkubGVuZ3RoO1xuXHRcdHZhciBzZWxlY3RlZElkO1xuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBlZGl0SWQgKSApIHtcblx0XHRcdHNlbGVjdGVkSWQgPSBlZGl0SWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRcdHNlbGVjdGVkSWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdFx0XHR9IGVsc2UgaWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHNlbGVjdGVkSWQgPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5WzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfZGF0YS5pZCA9IFtzZWxlY3RlZElkXTtcblx0XHQvL0lmIHN1YiB2aWV3IGNvbnRyb2xsZXIgc2V0IGN1c3RvbSBmaWx0ZXJzLCBnZXQgaXRcblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5nZXRTdWJWaWV3RmlsdGVyICkgKSB7XG5cblx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHRoaXMuZ2V0U3ViVmlld0ZpbHRlciggZmlsdGVyLmZpbHRlcl9kYXRhICk7XG5cblx0XHR9XG5cdFx0ZmlsdGVyLmZpbHRlcl9jb2x1bW5zID0gdGhpcy5nZXRGaWx0ZXJDb2x1bW5zRm9yVmlld0RldGFpbHMoKTtcblxuXHRcdHRoaXMuYXBpWydnZXQnICsgdGhpcy5hcGkua2V5X25hbWVdKCBmaWx0ZXIsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0aWYgKCAhcmVzdWx0X2RhdGEgKSB7XG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFbMF07XG5cblx0XHRcdFx0aWYgKCAkdGhpcy5zdWJfdmlld19tb2RlICYmICR0aGlzLnBhcmVudF9rZXkgKSB7XG5cdFx0XHRcdFx0cmVzdWx0X2RhdGFbJHRoaXMucGFyZW50X2tleV0gPSAkdGhpcy5wYXJlbnRfdmFsdWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0gcmVzdWx0X2RhdGE7XG5cblx0XHRcdFx0JHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0Z2V0RmlsdGVyQ29sdW1uc0Zyb21EaXNwbGF5Q29sdW1ucygpIHtcblx0XHR2YXIgY29sdW1uX2ZpbHRlciA9IHt9O1xuXHRcdGNvbHVtbl9maWx0ZXIuaWQgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIudGFibGVfbmFtZSA9IHRydWU7XG5cblx0XHQvLyBFcnJvcjogVW5hYmxlIHRvIGdldCBwcm9wZXJ0eSAnZ2V0R3JpZFBhcmFtJyBvZiB1bmRlZmluZWQgb3IgbnVsbCByZWZlcmVuY2Vcblx0XHR2YXIgZGlzcGxheV9jb2x1bW5zID0gW107XG5cdFx0aWYgKCB0aGlzLmdyaWQgKSB7XG5cdFx0XHRkaXNwbGF5X2NvbHVtbnMgPSB0aGlzLmdyaWQuZ2V0R3JpZFBhcmFtKCAnY29sTW9kZWwnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBkaXNwbGF5X2NvbHVtbnMgKSB7XG5cdFx0XHR2YXIgbGVuID0gZGlzcGxheV9jb2x1bW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdHZhciBjb2x1bW5faW5mbyA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblx0XHRcdFx0Y29sdW1uX2ZpbHRlcltjb2x1bW5faW5mby5uYW1lXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbl9maWx0ZXI7XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRm9yVmlld0RldGFpbHMoKSB7XG5cdFx0dmFyIGRpc3BsYXlfY29sdW1ucyA9IHRoaXMuZ3JpZC5nZXRHcmlkUGFyYW0oICdjb2xNb2RlbCcgKTtcblxuXHRcdHZhciBjb2x1bW5fZmlsdGVyID0ge307XG5cdFx0Y29sdW1uX2ZpbHRlci5pZCA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci50YWJsZV9uYW1lID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmRldGFpbHMgPSB0cnVlO1xuXG5cdFx0dmFyIGxlbiA9IGRpc3BsYXlfY29sdW1ucy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciBjb2x1bW5faW5mbyA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblx0XHRcdGNvbHVtbl9maWx0ZXJbY29sdW1uX2luZm8ubmFtZV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5fZmlsdGVyO1xuXHR9XG5cblx0c2V0Q3VzdG9tRGVmYXVsdE1lbnVJY29uKCBpZCwgY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdHN3aXRjaCAoIGlkICkge1xuXHRcdFx0Y2FzZSAndmlld19kZXRhaWwnOlxuXHRcdFx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdG9uQ3VzdG9tQ29udGV4dENsaWNrKCBpZCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3ZpZXdfZGV0YWlsJzpcblx0XHRcdFx0dGhpcy5vblZpZXdEZXRhaWxDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRzZXRDdXN0b21FZGl0TWVudUljb24oIGlkLCBjb250ZXh0X2J0biApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3ZpZXdfZGV0YWlsJzpcblx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3VzdG9tQ29udGV4dE1lbnVNb2RlbCgpIHtcblx0XHR2YXIgY29udGV4dF9tZW51X21vZGVsID0ge1xuXHRcdFx0ZXhjbHVkZTogWydkZWZhdWx0J10sXG5cdFx0XHRpbmNsdWRlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3IERldGFpbHMnICksXG5cdFx0XHRcdFx0aWQ6ICd2aWV3X2RldGFpbCcsXG5cdFx0XHRcdFx0Z3JvdXA6ICdlZGl0b3InLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdCdjYW5jZWwnXG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRnZXRTdWJWaWV3RmlsdGVyKCBmaWx0ZXIgKSB7XG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMudGFibGVfbmFtZV9rZXkgKSApIHtcblx0XHRcdGZpbHRlclsndGFibGVfbmFtZSddID0gdGhpcy50YWJsZXNbdGhpcy50YWJsZV9uYW1lX2tleV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpbHRlcjtcblx0fVxuXG5cdHNlYXJjaERvbmUoKSB7XG5cdFx0JCggJ3dpbmRvdycgKS50cmlnZ2VyKCAncmVzaXplJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnaW5pdFN1YkF1ZGl0JywgJ2luaXQnICk7XG5cdFx0c3VwZXIuc2VhcmNoRG9uZSgpO1xuXG5cdH1cblxuXHRnZXRBdWRpdExvZ1RhYkh0bWwoKSB7XG5cdFx0cmV0dXJuIGBcblx0XHQ8ZGl2IGlkPVwidGFiX2F1ZGl0X2RldGFpbHNcIiBjbGFzcz1cImVkaXQtdmlldy10YWItb3V0c2lkZVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9hdWRpdF9kZXRhaWxzX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmaXJzdC1yb3cgZnVsbC13aWR0aC1jb2x1bW5cIj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJkZXRhaWwtZ3JpZC1yb3dcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC1kaXZcIj5cblx0XHRcdFx0XHRcdDx0YWJsZSBpZD1cImdyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInNhdmUtYW5kLWNvbnRpbnVlLWRpdiBwZXJtaXNzaW9uLWRlZmluZWQtZGl2XCIgc3R5bGU9XCJ0b3A6IDIwMHB4XCI+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtZXNzYWdlIHBlcm1pc3Npb24tbWVzc2FnZVwiPjwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5gO1xuXHR9XG5cbn1cblxuTG9nVmlld0NvbnRyb2xsZXIubG9hZFN1YlZpZXcgPSBmdW5jdGlvbiggY29udGFpbmVyLCBiZWZvcmVWaWV3TG9hZGVkRnVuLCBhZnRlclZpZXdMb2FkZWRGdW4gKSB7XG5cblx0R2xvYmFsLmxvYWRWaWV3U291cmNlKCAnTG9nJywgJ0xvZ1ZpZXcuaHRtbCcsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHR2YXIgYXJncyA9IHtcblx0XHRcdHVwZGF0ZWQ6ICQuaTE4bi5fKCAnVXBkYXRlZCcgKSxcblx0XHRcdGNyZWF0ZWQ6ICQuaTE4bi5fKCAnQ3JlYXRlZCcgKVxuXHRcdH07XG5cblx0XHR2YXIgdGVtcGxhdGUgPSBfLnRlbXBsYXRlKCByZXN1bHQgKTtcblxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBiZWZvcmVWaWV3TG9hZGVkRnVuICkgKSB7XG5cdFx0XHRiZWZvcmVWaWV3TG9hZGVkRnVuKCk7XG5cdFx0fVxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBjb250YWluZXIgKSApIHtcblx0XHRcdGNvbnRhaW5lci5odG1sKCB0ZW1wbGF0ZSggYXJncyApICk7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggYWZ0ZXJWaWV3TG9hZGVkRnVuICkgKSB7XG5cdFx0XHRcdGFmdGVyVmlld0xvYWRlZEZ1biggc3ViX2xvZ192aWV3X2NvbnRyb2xsZXIgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn07XG5cbkxvZ1ZpZXdDb250cm9sbGVyLmh0bWxfdGVtcGxhdGUgPSBgXG5cdDxkaXYgY2xhc3M9XCJ2aWV3IHN1Yi12aWV3IGxvZ1ZpZXdcIiBpZD1cImxvZ192aWV3X2NvbnRhaW5lclwiPlxuXHQ8ZGl2IGNsYXNzPVwiYXVkaXQtaW5mb1wiPlxuXHRcdDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGFiZWwtZGl2XCI+PHNwYW4gY2xhc3M9XCJsYWJlbFwiPjwlPSB1cGRhdGVkICU+Ojwvc3Bhbj48L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJpbmZvXCI+PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cInJpZ2h0XCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGFiZWwtZGl2XCI+PHNwYW4gY2xhc3M9XCJsYWJlbFwiPjwlPSBjcmVhdGVkICU+Ojwvc3Bhbj48L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJpbmZvXCI+PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJjbGVhci1ib3RoLWRpdlwiPjwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJncmlkLWRpdlwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtdG9wLWJvcmRlclwiPjwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cInN1Yi1ncmlkLXZpZXctZGl2XCI+XG5cdFx0XHRcdDx0YWJsZSBpZD1cImdyaWRcIj48L3RhYmxlPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdlwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC1ib3R0b20tYm9yZGVyXCI+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdGA7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7590\n")}}]);