1 line
114 KiB
JavaScript
1 line
114 KiB
JavaScript
"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["attendance-schedule-ScheduleShiftViewController"],{2509:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ScheduleShiftViewController\": () => (/* binding */ ScheduleShiftViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass ScheduleShiftViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#schedule_shift_view_container',\n\n\n\t\t\tschedule_status_array: null,\n\n\t\t\tuser_status_array: null,\n\n\t\t\tuser_group_array: null,\n\n\t\t\tuser_api: null,\n\t\t\tuser_group_api: null,\n\t\t\tdate_api: null,\n\t\t\tabsence_policy_api: null,\n\n\t\t\tjob_api: null,\n\t\t\tjob_item_api: null,\n\t\t\tdepartment_api: null,\n\t\t\tdefault_punch_tag: [],\n\t\t\tprevious_punch_tag_selection: [],\n\n\t\t\ttotal_time: null,\n\t\t\tpre_total_time: 0,\n\n\t\t\tis_mass_adding: false\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'ScheduleShiftEditView.html';\n\t\tthis.permission_id = 'schedule';\n\t\tthis.viewId = 'ScheduleShift';\n\t\tthis.script_name = 'ScheduleShiftView';\n\t\tthis.table_name_key = 'schedule';\n\t\tthis.context_menu_name = $.i18n._( 'Schedule Shift' );\n\t\tthis.navigation_label = $.i18n._( 'Schedule' );\n\t\tthis.api = TTAPI.APISchedule;\n\t\tthis.absence_policy_api = TTAPI.APIAbsencePolicy;\n\t\tthis.user_api = TTAPI.APIUser;\n\t\tthis.user_group_api = TTAPI.APIUserGroup;\n\n\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\tthis.job_api = TTAPI.APIJob;\n\t\t\tthis.job_item_api = TTAPI.APIJobItem;\n\t\t\tthis.punch_tag_api = TTAPI.APIPunchTag;\n\t\t\tthis.department_api = TTAPI.APIDepartment;\n\t\t}\n\n\t\tthis.date_api = TTAPI.APITTDate;\n\n\t\tthis.initPermission();\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['copy'],\n\t\t\tinclude: []\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tonSaveClick( ignoreWarning ) {\n\t\t// this function will shortly be deprecated and replaced by BaseViewController.onViewClick(), but this intermediatiary step of reorganizing the code\n\t\t// is to help debug in future by seeing how the current function was updated to match baseview.\n\t\t// initially, the code looped over all the mass edit records, and then for each record, it would loop over the changed fields and set them on that record.\n\t\t// instead, we will now just loop over the changed fields once, and then loop over the mass edit records, cloning this changed set of fields.\n\t\t// The clone itself is probably yet another loop internally, but this at least makes it easier to read and also allows the merge to use the common base view controller function.\n\n\t\tvar $this = this;\n\t\tvar record;\n\t\tif ( this.is_mass_editing ) {\n\t\t\trecord = [];\n\n\t\t\t// loop over all fields on the form, and track the ones that have changed\n\t\t\tvar mass_record_shared = {};\n\t\t\tfor ( var key in this.edit_view_ui_dic ) {\n\n\t\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\t\tif ( Global.isSet( widget.isChecked ) ) {\n\t\t\t\t\tif ( widget.isChecked() && widget.getEnabled() ) {\n\t\t\t\t\t\tmass_record_shared[key] = widget.getValue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// loop over all the selected id's for the mass edit, and apply a copy of the changed fields to each\n\n\t\t\tfor ( var i = 0; i < this.mass_edit_record_ids.length; i++ ) {\n\t\t\t\t//create new copy of the fields that have changed.\n\t\t\t\tvar mass_record_single = Global.clone( mass_record_shared );\n\t\t\t\tmass_record_single['id'] = $this.mass_edit_record_ids[i];\n\n\t\t\t\t// push the single record into the array of mass edit records to be saved\n\t\t\t\trecord.push( mass_record_single );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collectUIDataToCurrentEditRecord();\n\t\t\trecord = this.uniformVariable( this.current_edit_record );\n\t\t}\n\n\t\tthis.api['set' + this.api.key_name]( record, false, ignoreWarning, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\t$this.onSaveResult( result );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\t//Make sure this.current_edit_record is updated before validate\n\tvalidate() {\n\t\tvar $this = this;\n\t\tvar record = {};\n\t\tif ( this.is_mass_editing ) {\n\t\t\tvar record = [];\n\t\t\tfor ( var i = 0; i < this.mass_edit_record_ids.length; i++ ) {\n\t\t\t\tvar mass_record = {};\n\t\t\t\tmass_record['id'] = $this.mass_edit_record_ids[i];\n\t\t\t\tfor ( var key in this.edit_view_ui_dic ) {\n\n\t\t\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\t\t\tif ( Global.isSet( widget.isChecked ) ) {\n\t\t\t\t\t\tif ( widget.isChecked() && widget.getEnabled() ) {\n\t\t\t\t\t\t\tmass_record[key] = widget.getValue();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trecord.push( mass_record );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collectUIDataToCurrentEditRecord();\n\t\t\trecord = this.uniformVariable( this.current_edit_record );\n\t\t}\n\n\t\tthis.api['validate' + this.api.key_name]( record, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t$this.validateResult( result );\n\t\t\t}\n\t\t} );\n\t}\n\n\tjobUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = this.permission_id;\n\t\t}\n\n\t\tif ( PermissionManager.validate( 'job', 'enabled' ) &&\n\t\t\tPermissionManager.validate( p_id, 'edit_job' ) &&\n\t\t\t( Global.getProductEdition() >= 20 ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tjobItemUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'schedule';\n\t\t}\n\n\t\tif ( PermissionManager.validate( 'job_item', 'enabled' ) &&\n\t\t\tPermissionManager.validate( p_id, 'edit_job_item' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpunchTagUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'schedule';\n\t\t}\n\n\t\tif ( PermissionManager.validate( 'punch_tag', 'enabled' ) &&\n\t\t\tPermissionManager.validate( p_id, 'edit_punch_tag' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbranchUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'schedule';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_branch' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdepartmentUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'schedule';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_department' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tinitPermission() {\n\t\tsuper.initPermission();\n\n\t\tif ( PermissionManager.validate( this.permission_id, 'view' ) || PermissionManager.validate( this.permission_id, 'view_child' ) ) {\n\t\t\tthis.show_search_tab = true;\n\t\t} else {\n\t\t\tthis.show_search_tab = false;\n\t\t}\n\n\t\tif ( this.jobUIValidate() ) {\n\t\t\tthis.show_job_ui = true;\n\t\t} else {\n\t\t\tthis.show_job_ui = false;\n\t\t}\n\n\t\tif ( this.jobItemUIValidate() ) {\n\t\t\tthis.show_job_item_ui = true;\n\t\t} else {\n\t\t\tthis.show_job_item_ui = false;\n\t\t}\n\n\t\tif ( this.punchTagUIValidate() ) {\n\t\t\tthis.show_punch_tag_ui = true;\n\t\t} else {\n\t\t\tthis.show_punch_tag_ui = false;\n\t\t}\n\n\t\tif ( this.branchUIValidate() ) {\n\t\t\tthis.show_branch_ui = true;\n\t\t} else {\n\t\t\tthis.show_branch_ui = false;\n\t\t}\n\n\t\tif ( this.departmentUIValidate() ) {\n\t\t\tthis.show_department_ui = true;\n\t\t} else {\n\t\t\tthis.show_department_ui = false;\n\t\t}\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tthis.initDropDownOption( 'status', 'status_id', this.api, function( res ) {\n\t\t\tres = res.getResult();\n\n\t\t\t$this.schedule_status_array = Global.buildRecordArray( res );\n\n\t\t} );\n\n\t\tthis.initDropDownOption( 'status', 'user_status_id', this.user_api, function( res ) {\n\t\t\tres = res.getResult();\n\n\t\t\t$this.user_status_array = Global.buildRecordArray( res );\n\t\t} );\n\n\t\tthis.user_group_api.getUserGroup( '', false, false, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\n\t\t\t\tres = Global.buildTreeRecord( res );\n\t\t\t\t$this.user_group_array = res;\n\n\t\t\t\t$this.adv_search_field_ui_dic['group_ids'].setSourceData( res );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tcheckOpenPermission() {\n\t\tif ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'schedule', 'view_open' ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetCustomFieldReferenceField() {\n\t\treturn 'note';\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_schedule': { 'label': $.i18n._( 'Schedule' ) },\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APISchedule,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_schedule_schedule',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//Tab 0 start\n\n\t\tvar tab_schedule = this.edit_view_tab.find( '#tab_schedule' );\n\n\t\tvar tab_schedule_column1 = tab_schedule.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_schedule_column1 );\n\n\t\t// Employee\n\t\t// Employees\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUser,\n\t\t\tallow_multiple_selection: true,\n\t\t\tlayout_name: 'global_user',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: !this.checkOpenPermission(),\n\t\t\tset_special_empty: true,\n\t\t\tfield: 'user_id',\n\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\treturn $this.onEmployeeSourceCreate( target, source_data );\n\t\t\t} )\n\n\t\t} );\n\t\tvar default_args = {};\n\t\tdefault_args.permission_section = 'schedule';\n\t\tform_item_input.setDefaultArgs( default_args );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_schedule_column1, '' );\n\n\t\t// Status\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'status_id' } );\n\t\tform_item_input.setSourceData( $this.schedule_status_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_schedule_column1 );\n\n\t\t//Absence Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIAbsencePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_absences',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'absence_policy_id'\n\t\t} );\n\n\t\tform_item_input.customSearchFilter = function( filter ) {\n\t\t\treturn $this.setAbsencePolicyFilter( filter );\n\t\t};\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Absence Policy' ), form_item_input, tab_schedule_column1, '', null, true );\n\n\t\t// Available Balance\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'available_balance' } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box available-balance-h-box\\'></div>' );\n\t\tthis.available_balance_info = $( '<span class=\"available-balance-info tticon tticon-info_black_24dp\"></span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( this.available_balance_info );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Available Balance' ), form_item_input, tab_schedule_column1, '', widgetContainer, true );\n\n\t\t// Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'start_date_stamp', validation_field: 'date_stamp' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_schedule_column1, '', null );\n\n\t\t//Mass Add Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TRangePicker( { field: 'start_date_stamps', validation_field: 'date_stamp' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_schedule_column1, '', null, true );\n\n\t\t// In\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\n\t\tform_item_input.TTimePicker( { field: 'start_time' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'In' ), form_item_input, tab_schedule_column1, '', null );\n\n\t\t// Out\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\n\t\tform_item_input.TTimePicker( { field: 'end_time' } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Out' ), form_item_input, tab_schedule_column1, '', null );\n\n\t\t// Total\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'total_time' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Total' ), form_item_input, tab_schedule_column1 );\n\n\t\t// Schedule Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_schedule',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'schedule_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Schedule Policy' ), form_item_input, tab_schedule_column1 );\n\n\t\t// Branch\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_branch',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'branch_id',\n\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\treturn $this.onSourceDataCreate( target, source_data );\n\t\t\t} ),\n\t\t\tadded_items: [\n\t\t\t\t{ value: TTUUID.not_exist_id, label: Global.default_item },\n\t\t\t]\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_schedule_column1, '', null, true );\n\n\t\tif ( !this.show_branch_ui ) {\n\t\t\tthis.detachElement( 'branch_id' );\n\n\t\t}\n\n\t\t// Department\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_department',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'department_id',\n\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\treturn $this.onSourceDataCreate( target, source_data );\n\t\t\t} ),\n\t\t\tadded_items: [\n\t\t\t\t{ value: TTUUID.not_exist_id, label: Global.default_item },\n\t\t\t]\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_schedule_column1, '', null, true );\n\n\t\tif ( !this.show_department_ui ) {\n\t\t\tthis.detachElement( 'department_id' );\n\t\t}\n\n\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t//Job\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_id',\n\t\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\t\treturn $this.onSourceDataCreate( target, source_data );\n\t\t\t\t} ),\n\t\t\t\tadded_items: [\n\t\t\t\t\t{ value: TTUUID.not_exist_id, label: Global.default_item },\n\t\t\t\t]\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_schedule_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_job_ui ) {\n\t\t\t\tthis.detachElement( 'job_id' );\n\t\t\t}\n\n\t\t\t// Task\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_item_id',\n\t\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\t\treturn $this.onSourceDataCreate( target, source_data );\n\t\t\t\t} ),\n\t\t\t\tadded_items: [\n\t\t\t\t\t{ value: TTUUID.not_exist_id, label: Global.default_item },\n\t\t\t\t]\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_item_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_schedule_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_job_item_ui ) {\n\t\t\t\tthis.detachElement( 'job_item_id' );\n\t\t\t}\n\n\t\t\t//Punch Tag\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tget_real_data_on_multi: true,\n\t\t\t\tsetRealValueCallBack: ( ( punch_tags, get_real_data ) => {\n\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags, get_real_data );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'punch_tag_id',\n\t\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\t\treturn $this.onSourceDataCreate( target, source_data );\n\t\t\t\t} ),\n\t\t\t\tadded_items: [\n\t\t\t\t\t{ value: TTUUID.not_exist_id, label: Global.default_item },\n\t\t\t\t]\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tpunch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );\n\t\t\tpunch_tag_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( punch_tag_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), [form_item_input, punch_tag_coder], tab_schedule_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_punch_tag_ui ) {\n\t\t\t\tthis.detachElement( 'punch_tag_id' );\n\t\t\t}\n\t\t}\n\n\t\t//Note\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'note', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Note' ), form_item_input, tab_schedule_column1, '', null, null, true );\n\t\tform_item_input.parent().width( '45%' );\n\n\t\tif ( Global.getProductEdition() >= 15 && this.is_viewing == false ) {\n\t\t\t//Notify Employee\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_input.TCheckbox( { field: 'notify_user_schedule_change' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Notify Employee' ), form_item_input, tab_schedule_column1, '', null, true );\n\t\t}\n\n\t\tif ( this.is_mass_editing ) {\n\t\t\tthis.detachElement( 'total_time' );\n\t\t} else {\n\t\t\tthis.attachElement( 'total_time' );\n\t\t}\n\t}\n\n\tonSourceDataCreate( target, source_data ) {\n\t\tvar display_columns = target.getDisplayColumns();\n\t\tvar first_item = {};\n\n\t\t$.each( display_columns, function( index, content ) {\n\t\t\tfirst_item.id = TTUUID.not_exist_id;\n\t\t\tfirst_item[content.name] = Global.default_item;\n\t\t\treturn false;\n\t\t} );\n\n\t\t//Error: Object doesn't support property or method 'unshift' in /interface/html5/line 6953\n\t\tif ( !source_data || $.type( source_data ) !== 'array' ) {\n\t\t\tsource_data = [];\n\t\t}\n\t\tsource_data.unshift( first_item );\n\n\t\treturn source_data;\n\t}\n\n\tsetEditViewWidgetsMode() {\n\t\tvar did_clean_dic = {};\n\t\tfor ( var key in this.edit_view_ui_dic ) {\n\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tvar widgetContainer = this.edit_view_form_item_dic[key];\n\t\t\tvar column = widget.parent().parent().parent();\n\t\t\tvar tab_id = column.parent().attr( 'id' );\n\t\t\tif ( !column.hasClass( 'v-box' ) ) {\n\t\t\t\tif ( !did_clean_dic[tab_id] ) {\n\t\t\t\t\tdid_clean_dic[tab_id] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch ( key ) {\n\t\t\t\tcase 'start_date_stamps':\n\t\t\t\t\tif ( ( !this.current_edit_record.id || this.current_edit_record.id == TTUUID.zero_id ) && !this.is_mass_editing && !this.is_edit ) {\n\t\t\t\t\t\tthis.attachElement( key );\n\t\t\t\t\t\twidget.parents( '.edit-view-form-item-div' ).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.detachElement( key );\n\t\t\t\t\t\twidget.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'start_date_stamp':\n\t\t\t\t\tif ( ( !this.current_edit_record.id || this.current_edit_record.id == TTUUID.zero_id ) && !this.is_mass_editing && !this.is_edit ) {\n\t\t\t\t\t\tthis.detachElement( key );\n\t\t\t\t\t\twidget.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.attachElement( key );\n\t\t\t\t\t\twidget.parents( '.edit-view-form-item-div' ).show();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\twidget.css( 'opacity', 1 );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// #2831 Must check is_viewing, otherwise all fields are editable in View mode. Bug originated in 886a33c71174c10c0699cbf869a3cf2ebd200591\n\t\t\tif ( this.is_viewing ) {\n\t\t\t\tif ( Global.isSet( widget.setEnabled ) ) {\n\t\t\t\t\twidget.setEnabled( false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( Global.isSet( widget.setEnabled ) ) {\n\t\t\t\t\twidget.setEnabled( true );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\texchangeBalance() {\n\n\t\tvar b_div = $( $( this ).next() );\n\t\tif ( b_div.css( 'display' ) === 'block' ) {\n\t\t\tb_div.css( 'display', 'none' );\n\t\t} else if ( b_div.css( 'display' ) === 'none' ) {\n\t\t\tb_div.css( 'display', 'block' );\n\n\t\t}\n\t}\n\n\tonAddResult( result ) {\n\t\tvar $this = this;\n\t\tvar result_data = result.getResult();\n\t\tif ( !result_data ) {\n\t\t\tresult_data = [];\n\t\t}\n\t\tresult_data.company = LocalCacheData.current_company.name;\n\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t}\n\t\t// Default to Open\n\t\tresult_data === true && ( result_data = { user_id: TTUUID.zero_id } );\n\t\t!result_data.user_id && ( result_data.user_id = TTUUID.zero_id );\n\t\t$this.current_edit_record = result_data;\n\t\t$this.initEditView();\n\t}\n\n\tsetAbsencePolicyFilter( filter ) {\n\t\tif ( !filter.filter_data ) {\n\t\t\tfilter.filter_data = {};\n\t\t}\n\n\t\tfilter.filter_data.user_id = this.current_edit_record.user_id;\n\t\tif ( filter.filter_columns ) {\n\t\t\tfilter.filter_columns.absence_policy = true;\n\t\t}\n\n\t\treturn filter;\n\t}\n\n\tonEmployeeSourceCreate( target, source_data ) {\n\n\t\tif ( !this.checkOpenPermission() ) {\n\t\t\treturn source_data;\n\t\t}\n\n\t\tvar display_columns = target.getDisplayColumns();\n\n\t\tvar first_item = {};\n\t\t$.each( display_columns, function( index, content ) {\n\n\t\t\tfirst_item.id = TTUUID.zero_id;\n\t\t\tfirst_item[content.name] = Global.open_item;\n\n\t\t\treturn false;\n\t\t} );\n\n\t\t//Error: Object doesn't support property or method 'unshift' in /interface/html5/line 6953\n\t\tif ( !source_data || $.type( source_data ) !== 'array' ) {\n\t\t\tsource_data = [];\n\t\t}\n\t\tsource_data.unshift( first_item );\n\n\t\treturn source_data;\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tvar $this = this;\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\taddition_source_function: ( function( target, source_data ) {\n\t\t\t\t\treturn $this.onEmployeeSourceCreate( target, source_data );\n\t\t\t\t} ),\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Period' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'pay_period_id',\n\t\t\t\tlayout_name: 'global_Pay_period',\n\t\t\t\tapi_class: TTAPI.APIPayPeriod,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Start Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'start_date',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'End Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'end_date',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Branch' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'default_branch_id',\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tscript_name: 'BranchView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Department' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'default_department_id',\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tscript_name: 'DepartmentView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Group' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tmultiple: true,\n\t\t\t\tfield: 'group_ids',\n\t\t\t\tlayout_name: 'global_tree_column',\n\t\t\t\ttree_mode: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Title' ),\n\t\t\t\tfield: 'title_id',\n\t\t\t\tin_column: 2,\n\t\t\t\tlayout_name: 'global_job_title',\n\t\t\t\tapi_class: TTAPI.APIUserTitle,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Job' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'job_id',\n\t\t\t\tlayout_name: 'global_job',\n\t\t\t\tapi_class: ( Global.getProductEdition() >= 20 ) ? TTAPI.APIJob : null,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: ( this.show_job_ui && ( Global.getProductEdition() >= 20 ) ),\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Task' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'job_item_id',\n\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\tapi_class: ( Global.getProductEdition() >= 20 ) ? TTAPI.APIJobItem : null,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: ( this.show_job_item_ui && ( Global.getProductEdition() >= 20 ) ),\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Schedule Branch' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'branch_id',\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tscript_name: 'BranchView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Schedule Department' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'department_id',\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tscript_name: 'DepartmentView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Schedule Policy' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'schedule_policy_id',\n\t\t\t\tlayout_name: 'global_schedule',\n\t\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\n\t\tthis.current_edit_record[key] = c_value;\n\n\t\tswitch ( key ) {\n\t\t\tcase 'job_id':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id', {\n\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\tjob_id: this.current_edit_record.job_id\n\t\t\t\t\t} );\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_id':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_id':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tif ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( target.getSelectItems() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );\n\t\t\t\t\t}\n\t\t\t\t\t$this.previous_punch_tag_selection = c_value;\n\t\t\t\t\t//Reset source data to make sure correct punch tags are always shown.\n\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_id'].setSourceData( null );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'branch_id':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\tthis.setJobValueWhenCriteriaChanged( 'job_id', {\n\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\tuser_id: this.current_edit_record.user_id,\n\t\t\t\t\t\tpunch_branch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\tpunch_department_id: this.current_edit_record.department_id\n\t\t\t\t\t} );\n\t\t\t\t\tthis.setDepartmentValueWhenBranchChanged( target.getValue( true ), 'department_id', {\n\t\t\t\t\t\tbranch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\tuser_id: this.current_edit_record.user_id\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'department_id':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\tthis.setJobValueWhenCriteriaChanged( 'job_id', {\n\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\tuser_id: this.current_edit_record.user_id,\n\t\t\t\t\t\tpunch_branch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\tpunch_department_id: this.current_edit_record.department_id\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_quick_search':\n\t\t\tcase 'job_item_quick_search':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.onJobQuickSearch( key, c_value );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\t//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_quick_search':\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );\n\n\t\t\t\t\t//Don't validate immediately as onPunchTagQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'absence_policy_id':\n\t\t\tcase 'status_id':\n\t\t\t\tthis.onStatusChange();\n\t\t\t\tbreak;\n\t\t\tcase 'user_id':\n\t\t\t\tthis.edit_view_ui_dic['absence_policy_id'].setSourceData( null );\n\t\t\t\tthis.edit_view_ui_dic['absence_policy_id'].setValue( false );\n\t\t\t\tthis.current_edit_record['absence_policy_id'] = false;\n\t\t\t\tthis.getAbsencePolicy( this.current_edit_record[key] );\n\n\t\t\t\tif ( $.isArray( this.current_edit_record[key] ) && this.current_edit_record[key].length > 1 ) {\n\t\t\t\t\tthis.is_mass_adding = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.is_mass_adding = false;\n\t\t\t\t}\n\t\t\t\tthis.setEditMenu();\n\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' )\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.getScheduleTotalTime();\n\t\tthis.getProjectedAbsencePolicyBalance();\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tgetProjectedAbsencePolicyBalance() {\n\t\t$( this.edit_view_form_item_dic['available_balance'].find( '.schedule-view-balance-info' ) ).css( 'display', 'none' );\n\n\t\tif ( this.current_edit_record['absence_policy_id'] && this.edit_view_form_item_dic['absence_policy_id'].css( 'display' ) === 'block' && !this.is_mass_editing ) {\n\t\t\tvar user_id;\n\t\t\tif ( Global.isArray( this.current_edit_record['user_id'] ) && this.current_edit_record['user_id'].length === 1 ) {\n\t\t\t\tuser_id = this.current_edit_record['user_id'][0];\n\t\t\t} else if ( this.current_edit_record['user_id'] ) {\n\t\t\t\tuser_id = this.current_edit_record['user_id'];\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar date_stamp = this.current_edit_record['date_stamp'];\n\t\t\tvar result_data = this.absence_policy_api.getProjectedAbsencePolicyBalance( this.current_edit_record['absence_policy_id'], user_id, date_stamp, this.total_time, this.pre_total_time, { async: false } );\n\n\t\t\tresult_data = result_data ? result_data : {\n\t\t\t\tavailable_balance: 0,\n\t\t\t\tcurrent_time: 0,\n\t\t\t\tremaining_balance: 0,\n\t\t\t\tprojected_balance: 0,\n\t\t\t\tprojected_remaining_balance: 0\n\t\t\t};\n\n\t\t\tthis.getBalanceHandler( result_data, date_stamp );\n\t\t}\n\t\tthis.onStatusChange();\n\t}\n\n\tgetAbsencePolicy( user_ids ) {\n\t\tvar args = { filter_data: {} };\n\t\targs.filter_data.user_id = user_ids;\n\t\tthis.edit_view_ui_dic['absence_policy_id'].setDefaultArgs( args );\n\t}\n\n\tuniformVariable( records ) {\n\t\tvar new_records = [];\n\t\tif ( Global.isArray( records.user_id ) && records.user_id.length > 0 ) {\n\t\t\tvar user_ids = records.user_id;\n\t\t\tfor ( var key in user_ids ) {\n\t\t\t\tvar tmp_records = Global.clone( records );\n\t\t\t\ttmp_records.user_id = user_ids[key];\n\t\t\t\tnew_records.push( tmp_records );\n\t\t\t}\n\t\t} else {\n\t\t\tnew_records.push( this.current_edit_record );\n\t\t}\n\n\t\tif ( this.current_edit_record.start_date_stamps && new_records.length > 0 ) {\n\t\t\t//Allowing multiple dates\n\t\t\tvar edit_record = [];\n\t\t\tfor ( var ur in new_records ) {\n\t\t\t\tvar dates = this.uniformDates( new_records[ur].start_date_stamps, new_records[ur] );\n\n\t\t\t\tif ( Array.isArray( new_records[ur].start_date_stamps ) ) {\n\t\t\t\t\tdates = new_records[ur].start_date_stamps;\n\t\t\t\t} else {\n\t\t\t\t\tdates = this.parserDatesRange( new_records[ur].start_date_stamps );\n\t\t\t\t}\n\n\t\t\t\tfor ( var d in dates ) {\n\t\t\t\t\tvar new_record = {};\n\t\t\t\t\tfor ( var er in new_records[ur] ) {\n\t\t\t\t\t\tif ( er == 'start_date_stamps' ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnew_record[er] = new_records[ur][er];\n\t\t\t\t\t}\n\t\t\t\t\tnew_record.start_date_stamp = dates[d];\n\t\t\t\t\tnew_record.date_stamp = dates[d];\n\t\t\t\t\tedit_record.push( new_record );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tedit_record = this.current_edit_record;\n\t\t\tif ( $.isArray( edit_record.start_date_stamp ) && edit_record.start_date_stamp.length == 1 ) {\n\t\t\t\tedit_record.start_date_stamp = edit_record.start_date_stamp[0];\n\t\t\t}\n\t\t}\n\n\t\treturn edit_record;\n\t}\n\n\tparserDatesRange( date ) {\n\t\tvar dates = date.split( ' - ' );\n\t\tvar resultArray = [];\n\t\tvar beginDate = Global.strToDate( dates[0] );\n\t\tvar endDate = Global.strToDate( dates[1] );\n\n\t\tvar nextDate = beginDate;\n\n\t\twhile ( nextDate.getTime() < endDate.getTime() ) {\n\t\t\tresultArray.push( nextDate.format() );\n\t\t\tnextDate = new Date( new Date( nextDate.getTime() ).setDate( nextDate.getDate() + 1 ) );\n\t\t}\n\t\treturn dates;\n\t}\n\n\tuniformDates( date_range, record ) {\n\t\tvar dates = [];\n\t\tif ( !Array.isArray( date_range ) && date_range.indexOf( ' - ' ) == -1 ) {\n\t\t\tdates = [date_range];\n\t\t} else if ( Array.isArray( date_range ) ) {\n\t\t\tdates = date_range;\n\t\t} else {\n\t\t\tdates = this.parserDatesRange( date_range );\n\t\t}\n\n\t\treturn dates;\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\t\t// When mass editing, these fields may not be the common data, so their value will be undefined, so this will cause their change event cannot work properly.\n\t\tthis.setDefaultData( {\n\t\t\t'status_id': 10\n\t\t} );\n\n\t\tif ( this.current_edit_record.id || this.is_mass_editing ) {\n\t\t\tthis.edit_view_ui_dic.user_id.setAllowMultipleSelection( false );\n\t\t} else {\n\t\t\tthis.edit_view_ui_dic.user_id.setAllowMultipleSelection( true );\n\t\t}\n\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 ) || key === 'date_stamp' ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'start_date_stamp':\n\t\t\t\t\tcase 'start_date_stamps':\n\t\t\t\t\t\tif ( !this.current_edit_record[key] ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar date_array;\n\t\t\t\t\t\tif ( !this.current_edit_record.id ) {\n\t\t\t\t\t\t\tdate_array = this.current_edit_record.start_date_stamps;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif ( Array.isArray( this.current_edit_record.start_date_stamp ) == false ) {\n\t\t\t\t\t\t\t\tdate_array = [this.current_edit_record.start_date_stamp];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.current_edit_record.start_date_stamp = date_array;\n\t\t\t\t\t\twidget.setValue( date_array );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'total_time':\n\t\t\t\t\t\tthis.pre_total_time = ( this.is_add ) ? 0 : this.current_edit_record[key];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_id':\n\t\t\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = {\n\t\t\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\t\t\tuser_id: this.current_edit_record.user_id,\n\t\t\t\t\t\t\t\tpunch_branch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\t\t\tpunch_department_id: this.current_edit_record.department_id\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_item_id':\n\t\t\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = { status_id: 10, job_id: this.current_edit_record.job_id };\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'punch_tag_id':\n\t\t\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t\tthis.previous_punch_tag_selection = this.current_edit_record[key];\n\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = $this.getPunchTagFilterData();\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'branch_id':\n\t\t\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = { user_id: this.current_edit_record.user_id };\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t}\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\tcase 'department_id':\n\t\t\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = { user_id: this.current_edit_record.user_id, branch_id: this.current_edit_record.branch_id };\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t}\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\tcase 'punch_tag_quick_search':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'user_id':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tthis.getAbsencePolicy( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'date_stamp':\n\t\t\t\t\t\tthis.current_edit_record['start_date_stamp'] = this.current_edit_record[key];\n\t\t\t\t\t\tthis.current_edit_record['start_date_stamps'] = this.current_edit_record[key];\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}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tgetScheduleTotalTime() {\n\t\tif ( this.is_mass_editing ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar startTime, endTime, date_stamp;\n\t\tif ( this.current_edit_record['start_date_stamps'] ) {\n\t\t\tdate_stamp = this.uniformDates( this.current_edit_record['start_date_stamps'], this.current_edit_record )[0];\n\t\t} else {\n\t\t\tdate_stamp = this.current_edit_record['date_stamp'];\n\t\t}\n\n\t\tvar startTime = date_stamp + ' ' + this.current_edit_record['start_time'];\n\t\tvar endTime = date_stamp + ' ' + this.current_edit_record['end_time'];\n\t\tvar schedulePolicyId = ( this.current_edit_record['schedule_policy_id'] ) ? this.current_edit_record['schedule_policy_id'] : '';\n\n\t\tif ( !schedulePolicyId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar user_id = this.current_edit_record.user_id;\n\n\t\tvar result = this.api.getScheduleTotalTime( startTime, endTime, schedulePolicyId, user_id, { async: false } );\n\t\tif ( result ) {\n\t\t\tthis.total_time = result.getResult();\n\n\t\t\tvar total_time = Global.getTimeUnit( this.total_time );\n\n\t\t\tthis.edit_view_ui_dic['total_time'].setValue( total_time );\n\n\t\t\tthis.current_edit_record['total_time'] = total_time;\n\t\t}\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tthis.onStatusChange();\n\t\tthis.getScheduleTotalTime();\n\t\tthis.setEditViewWidgetsMode();\n\t\tthis.getProjectedAbsencePolicyBalance();\n\t}\n\n\tonStatusChange() {\n\t\tif ( this.current_edit_record['status_id'] == 20 ) {\n\t\t\tthis.attachElement( 'absence_policy_id' );\n\t\t\tif ( this.current_edit_record['absence_policy_id'] && this.current_edit_record['absence_policy_id'] != TTUUID.zero_id ) {\n\t\t\t\tthis.attachElement( 'available_balance' );\n\t\t\t} else {\n\t\t\t\tthis.detachElement( 'available_balance' );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.detachElement( 'absence_policy_id' );\n\t\t\tthis.detachElement( 'available_balance' );\n\t\t}\n\n\t\tthis.editFieldResize();\n\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTztBQUNQLDJCQUEyQjtBQUMzQixFQUFFLENBQUM7QUFDSDs7O0FBR0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLENBQUM7QUFDNUIsMEJBQTBCLENBQUM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9CQUFvQixzQ0FBc0M7QUFDMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0NBQXNDO0FBQzFEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVMsQ0FBQyx1QkFBdUI7QUFDdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTtBQUNBLCtCQUErQixxQkFBcUI7QUFDcEQ7QUFDQSw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsMkJBQTJCLDZCQUE2Qjs7QUFFeEQsb0JBQW9CLENBQUM7QUFDckIsZ0NBQWdDLENBQUM7O0FBRWpDO0FBQ0E7O0FBRUEsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxpQ0FBaUMsNERBQTREO0FBQzdGLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0Esa0NBQWtDLDZEQUE2RDtBQUMvRiw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTs7QUFFQSxpQ0FBaUMsc0JBQXNCO0FBQ3ZELDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTs7QUFFQSxpQ0FBaUMsb0JBQW9COztBQUVyRCw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTtBQUNBLDJCQUEyQixzQkFBc0I7QUFDakQsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsTUFBTSx3REFBd0Q7QUFDOUQ7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxNQUFNLHdEQUF3RDtBQUM5RDtBQUNBLElBQUk7QUFDSiw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxPQUFPLHdEQUF3RDtBQUMvRDtBQUNBLEtBQUs7O0FBRUwscUJBQXFCLENBQUM7O0FBRXRCO0FBQ0EsMkJBQTJCLHVEQUF1RDtBQUNsRjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE9BQU8sd0RBQXdEO0FBQy9EO0FBQ0EsS0FBSzs7QUFFTCxxQkFBcUIsQ0FBQzs7QUFFdEI7QUFDQSxnQ0FBZ0MsNERBQTREO0FBQzVGOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxPQUFPLHdEQUF3RDtBQUMvRDtBQUNBLEtBQUs7O0FBRUwscUJBQXFCLENBQUM7O0FBRXRCO0FBQ0EsaUNBQWlDLDZEQUE2RDtBQUM5Rjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0IsK0JBQStCO0FBQzlELDZCQUE2QixDQUFDO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx1Q0FBdUM7QUFDdkUsOEJBQThCLENBQUM7QUFDL0I7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUUsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQSx1QkFBdUIsQ0FBQztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxjQUFjLENBQUMsRUFBRSxDQUFDO0FBQ2xCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDBCQUEwQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEVBQUUsQ0FBQzs7QUFFSDtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLHVCQUF1QixDQUFDO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxDQUFDO0FBQ1Y7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsQ0FBQzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsMkxBQTJMLGVBQWU7O0FBRTFNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLFFBQVEsQ0FBQztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsK0ZBQStGLGVBQWU7QUFDOUc7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2F0dGVuZGFuY2Uvc2NoZWR1bGUvU2NoZWR1bGVTaGlmdFZpZXdDb250cm9sbGVyLmpzPzM2YjUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFNjaGVkdWxlU2hpZnRWaWV3Q29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcjc2NoZWR1bGVfc2hpZnRfdmlld19jb250YWluZXInLFxuXG5cblx0XHRcdHNjaGVkdWxlX3N0YXR1c19hcnJheTogbnVsbCxcblxuXHRcdFx0dXNlcl9zdGF0dXNfYXJyYXk6IG51bGwsXG5cblx0XHRcdHVzZXJfZ3JvdXBfYXJyYXk6IG51bGwsXG5cblx0XHRcdHVzZXJfYXBpOiBudWxsLFxuXHRcdFx0dXNlcl9ncm91cF9hcGk6IG51bGwsXG5cdFx0XHRkYXRlX2FwaTogbnVsbCxcblx0XHRcdGFic2VuY2VfcG9saWN5X2FwaTogbnVsbCxcblxuXHRcdFx0am9iX2FwaTogbnVsbCxcblx0XHRcdGpvYl9pdGVtX2FwaTogbnVsbCxcblx0XHRcdGRlcGFydG1lbnRfYXBpOiBudWxsLFxuXHRcdFx0ZGVmYXVsdF9wdW5jaF90YWc6IFtdLFxuXHRcdFx0cHJldmlvdXNfcHVuY2hfdGFnX3NlbGVjdGlvbjogW10sXG5cblx0XHRcdHRvdGFsX3RpbWU6IG51bGwsXG5cdFx0XHRwcmVfdG90YWxfdGltZTogMCxcblxuXHRcdFx0aXNfbWFzc19hZGRpbmc6IGZhbHNlXG5cdFx0fSApO1xuXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcblx0fVxuXG5cdGluaXQoIG9wdGlvbnMgKSB7XG5cdFx0Ly90aGlzLl9zdXBlcignaW5pdGlhbGl6ZScsIG9wdGlvbnMgKTtcblx0XHR0aGlzLmVkaXRfdmlld190cGwgPSAnU2NoZWR1bGVTaGlmdEVkaXRWaWV3Lmh0bWwnO1xuXHRcdHRoaXMucGVybWlzc2lvbl9pZCA9ICdzY2hlZHVsZSc7XG5cdFx0dGhpcy52aWV3SWQgPSAnU2NoZWR1bGVTaGlmdCc7XG5cdFx0dGhpcy5zY3JpcHRfbmFtZSA9ICdTY2hlZHVsZVNoaWZ0Vmlldyc7XG5cdFx0dGhpcy50YWJsZV9uYW1lX2tleSA9ICdzY2hlZHVsZSc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnU2NoZWR1bGUgU2hpZnQnICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdTY2hlZHVsZScgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSVNjaGVkdWxlO1xuXHRcdHRoaXMuYWJzZW5jZV9wb2xpY3lfYXBpID0gVFRBUEkuQVBJQWJzZW5jZVBvbGljeTtcblx0XHR0aGlzLnVzZXJfYXBpID0gVFRBUEkuQVBJVXNlcjtcblx0XHR0aGlzLnVzZXJfZ3JvdXBfYXBpID0gVFRBUEkuQVBJVXNlckdyb3VwO1xuXG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdHRoaXMuam9iX2FwaSA9IFRUQVBJLkFQSUpvYjtcblx0XHRcdHRoaXMuam9iX2l0ZW1fYXBpID0gVFRBUEkuQVBJSm9iSXRlbTtcblx0XHRcdHRoaXMucHVuY2hfdGFnX2FwaSA9IFRUQVBJLkFQSVB1bmNoVGFnO1xuXHRcdFx0dGhpcy5kZXBhcnRtZW50X2FwaSA9IFRUQVBJLkFQSURlcGFydG1lbnQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5kYXRlX2FwaSA9IFRUQVBJLkFQSVRURGF0ZTtcblxuXHRcdHRoaXMuaW5pdFBlcm1pc3Npb24oKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSgpO1xuXG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9XG5cblx0Z2V0Q3VzdG9tQ29udGV4dE1lbnVNb2RlbCgpIHtcblx0XHR2YXIgY29udGV4dF9tZW51X21vZGVsID0ge1xuXHRcdFx0ZXhjbHVkZTogWydjb3B5J10sXG5cdFx0XHRpbmNsdWRlOiBbXVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0b25TYXZlQ2xpY2soIGlnbm9yZVdhcm5pbmcgKSB7XG5cdFx0Ly8gdGhpcyBmdW5jdGlvbiB3aWxsIHNob3J0bHkgYmUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgQmFzZVZpZXdDb250cm9sbGVyLm9uVmlld0NsaWNrKCksIGJ1dCB0aGlzIGludGVybWVkaWF0aWFyeSBzdGVwIG9mIHJlb3JnYW5pemluZyB0aGUgY29kZVxuXHRcdC8vIGlzIHRvIGhlbHAgZGVidWcgaW4gZnV0dXJlIGJ5IHNlZWluZyBob3cgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2FzIHVwZGF0ZWQgdG8gbWF0Y2ggYmFzZXZpZXcuXG5cdFx0Ly8gaW5pdGlhbGx5LCB0aGUgY29kZSBsb29wZWQgb3ZlciBhbGwgdGhlIG1hc3MgZWRpdCByZWNvcmRzLCBhbmQgdGhlbiBmb3IgZWFjaCByZWNvcmQsIGl0IHdvdWxkIGxvb3Agb3ZlciB0aGUgY2hhbmdlZCBmaWVsZHMgYW5kIHNldCB0aGVtIG9uIHRoYXQgcmVjb3JkLlxuXHRcdC8vIGluc3RlYWQsIHdlIHdpbGwgbm93IGp1c3QgbG9vcCBvdmVyIHRoZSBjaGFuZ2VkIGZpZWxkcyBvbmNlLCBhbmQgdGhlbiBsb29wIG92ZXIgdGhlIG1hc3MgZWRpdCByZWNvcmRzLCBjbG9uaW5nIHRoaXMgY2hhbmdlZCBzZXQgb2YgZmllbGRzLlxuXHRcdC8vIFRoZSBjbG9uZSBpdHNlbGYgaXMgcHJvYmFibHkgeWV0IGFub3RoZXIgbG9vcCBpbnRlcm5hbGx5LCBidXQgdGhpcyBhdCBsZWFzdCBtYWtlcyBpdCBlYXNpZXIgdG8gcmVhZCBhbmQgYWxzbyBhbGxvd3MgdGhlIG1lcmdlIHRvIHVzZSB0aGUgY29tbW9uIGJhc2UgdmlldyBjb250cm9sbGVyIGZ1bmN0aW9uLlxuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcmVjb3JkO1xuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHRyZWNvcmQgPSBbXTtcblxuXHRcdFx0Ly8gbG9vcCBvdmVyIGFsbCBmaWVsZHMgb24gdGhlIGZvcm0sIGFuZCB0cmFjayB0aGUgb25lcyB0aGF0IGhhdmUgY2hhbmdlZFxuXHRcdFx0dmFyIG1hc3NfcmVjb3JkX3NoYXJlZCA9IHt9O1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmVkaXRfdmlld191aV9kaWMgKSB7XG5cblx0XHRcdFx0aWYgKCAhdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQuaXNDaGVja2VkICkgKSB7XG5cdFx0XHRcdFx0aWYgKCB3aWRnZXQuaXNDaGVja2VkKCkgJiYgd2lkZ2V0LmdldEVuYWJsZWQoKSApIHtcblx0XHRcdFx0XHRcdG1hc3NfcmVjb3JkX3NoYXJlZFtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvb3Agb3ZlciBhbGwgdGhlIHNlbGVjdGVkIGlkJ3MgZm9yIHRoZSBtYXNzIGVkaXQsIGFuZCBhcHBseSBhIGNvcHkgb2YgdGhlIGNoYW5nZWQgZmllbGRzIHRvIGVhY2hcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5tYXNzX2VkaXRfcmVjb3JkX2lkcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Ly9jcmVhdGUgbmV3IGNvcHkgb2YgdGhlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZC5cblx0XHRcdFx0dmFyIG1hc3NfcmVjb3JkX3NpbmdsZSA9IEdsb2JhbC5jbG9uZSggbWFzc19yZWNvcmRfc2hhcmVkICk7XG5cdFx0XHRcdG1hc3NfcmVjb3JkX3NpbmdsZVsnaWQnXSA9ICR0aGlzLm1hc3NfZWRpdF9yZWNvcmRfaWRzW2ldO1xuXG5cdFx0XHRcdC8vIHB1c2ggdGhlIHNpbmdsZSByZWNvcmQgaW50byB0aGUgYXJyYXkgb2YgbWFzcyBlZGl0IHJlY29yZHMgdG8gYmUgc2F2ZWRcblx0XHRcdFx0cmVjb3JkLnB1c2goIG1hc3NfcmVjb3JkX3NpbmdsZSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cdFx0XHRyZWNvcmQgPSB0aGlzLnVuaWZvcm1WYXJpYWJsZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5hcGlbJ3NldCcgKyB0aGlzLmFwaS5rZXlfbmFtZV0oIHJlY29yZCwgZmFsc2UsIGlnbm9yZVdhcm5pbmcsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRcdCR0aGlzLm9uU2F2ZVJlc3VsdCggcmVzdWx0ICk7XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHQvL01ha2Ugc3VyZSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgaXMgdXBkYXRlZCBiZWZvcmUgdmFsaWRhdGVcblx0dmFsaWRhdGUoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcmVjb3JkID0ge307XG5cdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdHZhciByZWNvcmQgPSBbXTtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubWFzc19lZGl0X3JlY29yZF9pZHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhciBtYXNzX3JlY29yZCA9IHt9O1xuXHRcdFx0XHRtYXNzX3JlY29yZFsnaWQnXSA9ICR0aGlzLm1hc3NfZWRpdF9yZWNvcmRfaWRzW2ldO1xuXHRcdFx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuZWRpdF92aWV3X3VpX2RpYyApIHtcblxuXHRcdFx0XHRcdGlmICggIXRoaXMuZWRpdF92aWV3X3VpX2RpYy5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQuaXNDaGVja2VkICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHdpZGdldC5pc0NoZWNrZWQoKSAmJiB3aWRnZXQuZ2V0RW5hYmxlZCgpICkge1xuXHRcdFx0XHRcdFx0XHRtYXNzX3JlY29yZFtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJlY29yZC5wdXNoKCBtYXNzX3JlY29yZCApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cdFx0XHRyZWNvcmQgPSB0aGlzLnVuaWZvcm1WYXJpYWJsZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5hcGlbJ3ZhbGlkYXRlJyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0JHRoaXMudmFsaWRhdGVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGpvYlVJVmFsaWRhdGUoIHBfaWQgKSB7XG5cblx0XHRpZiAoICFwX2lkICkge1xuXHRcdFx0cF9pZCA9IHRoaXMucGVybWlzc2lvbl9pZDtcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnam9iJywgJ2VuYWJsZWQnICkgJiZcblx0XHRcdFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9qb2InICkgJiZcblx0XHRcdCggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRqb2JJdGVtVUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3NjaGVkdWxlJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnam9iX2l0ZW0nLCAnZW5hYmxlZCcgKSAmJlxuXHRcdFx0UGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHBfaWQsICdlZGl0X2pvYl9pdGVtJyApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1bmNoVGFnVUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3NjaGVkdWxlJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncHVuY2hfdGFnJywgJ2VuYWJsZWQnICkgJiZcblx0XHRcdFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9wdW5jaF90YWcnICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0YnJhbmNoVUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3NjaGVkdWxlJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9icmFuY2gnICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZGVwYXJ0bWVudFVJVmFsaWRhdGUoIHBfaWQgKSB7XG5cblx0XHRpZiAoICFwX2lkICkge1xuXHRcdFx0cF9pZCA9ICdzY2hlZHVsZSc7XG5cdFx0fVxuXG5cdFx0aWYgKCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggcF9pZCwgJ2VkaXRfZGVwYXJ0bWVudCcgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpbml0UGVybWlzc2lvbigpIHtcblx0XHRzdXBlci5pbml0UGVybWlzc2lvbigpO1xuXG5cdFx0aWYgKCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggdGhpcy5wZXJtaXNzaW9uX2lkLCAndmlldycgKSB8fCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggdGhpcy5wZXJtaXNzaW9uX2lkLCAndmlld19jaGlsZCcgKSApIHtcblx0XHRcdHRoaXMuc2hvd19zZWFyY2hfdGFiID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X3NlYXJjaF90YWIgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuam9iVUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X2pvYl91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19qb2JfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuam9iSXRlbVVJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19qb2JfaXRlbV91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19qb2JfaXRlbV91aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5wdW5jaFRhZ1VJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19wdW5jaF90YWdfdWkgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfcHVuY2hfdGFnX3VpID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJyYW5jaFVJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19icmFuY2hfdWkgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfYnJhbmNoX3VpID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmRlcGFydG1lbnRVSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfZGVwYXJ0bWVudF91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19kZXBhcnRtZW50X3VpID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aW5pdE9wdGlvbnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuaW5pdERyb3BEb3duT3B0aW9uKCAnc3RhdHVzJywgJ3N0YXR1c19pZCcsIHRoaXMuYXBpLCBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXG5cdFx0XHQkdGhpcy5zY2hlZHVsZV9zdGF0dXNfYXJyYXkgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzICk7XG5cblx0XHR9ICk7XG5cblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbiggJ3N0YXR1cycsICd1c2VyX3N0YXR1c19pZCcsIHRoaXMudXNlcl9hcGksIGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdCR0aGlzLnVzZXJfc3RhdHVzX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMudXNlcl9ncm91cF9hcGkuZ2V0VXNlckdyb3VwKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHQkdGhpcy51c2VyX2dyb3VwX2FycmF5ID0gcmVzO1xuXG5cdFx0XHRcdCR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydncm91cF9pZHMnXS5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGNoZWNrT3BlblBlcm1pc3Npb24oKSB7XG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSAmJiBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3NjaGVkdWxlJywgJ3ZpZXdfb3BlbicgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGdldEN1c3RvbUZpZWxkUmVmZXJlbmNlRmllbGQoKSB7XG5cdFx0cmV0dXJuICdub3RlJztcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblxuXHRcdHN1cGVyLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX3NjaGVkdWxlJzogeyAnbGFiZWwnOiAkLmkxOG4uXyggJ1NjaGVkdWxlJyApIH0sXG5cdFx0XHQndGFiX2F1ZGl0JzogdHJ1ZSxcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZSxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9zY2hlZHVsZV9zY2hlZHVsZScsXG5cdFx0XHRuYXZpZ2F0aW9uX21vZGU6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR0aGlzLnNldE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfc2NoZWR1bGUgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfc2NoZWR1bGUnICk7XG5cblx0XHR2YXIgdGFiX3NjaGVkdWxlX2NvbHVtbjEgPSB0YWJfc2NoZWR1bGUuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9zY2hlZHVsZV9jb2x1bW4xICk7XG5cblx0XHQvLyBFbXBsb3llZVxuXHRcdC8vIEVtcGxveWVlc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiAhdGhpcy5jaGVja09wZW5QZXJtaXNzaW9uKCksXG5cdFx0XHRzZXRfc3BlY2lhbF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAndXNlcl9pZCcsXG5cdFx0XHRhZGRpdGlvbl9zb3VyY2VfZnVuY3Rpb246ICggZnVuY3Rpb24oIHRhcmdldCwgc291cmNlX2RhdGEgKSB7XG5cdFx0XHRcdHJldHVybiAkdGhpcy5vbkVtcGxveWVlU291cmNlQ3JlYXRlKCB0YXJnZXQsIHNvdXJjZV9kYXRhICk7XG5cdFx0XHR9IClcblxuXHRcdH0gKTtcblx0XHR2YXIgZGVmYXVsdF9hcmdzID0ge307XG5cdFx0ZGVmYXVsdF9hcmdzLnBlcm1pc3Npb25fc2VjdGlvbiA9ICdzY2hlZHVsZSc7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldERlZmF1bHRBcmdzKCBkZWZhdWx0X2FyZ3MgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VtcGxveWVlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly8gU3RhdHVzXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuc2NoZWR1bGVfc3RhdHVzX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0dXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEgKTtcblxuXHRcdC8vQWJzZW5jZSBQb2xpY3lcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUFic2VuY2VQb2xpY3ksXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYWJzZW5jZXMnLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdhYnNlbmNlX3BvbGljeV9pZCdcblx0XHR9ICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuY3VzdG9tU2VhcmNoRmlsdGVyID0gZnVuY3Rpb24oIGZpbHRlciApIHtcblx0XHRcdHJldHVybiAkdGhpcy5zZXRBYnNlbmNlUG9saWN5RmlsdGVyKCBmaWx0ZXIgKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBYnNlbmNlIFBvbGljeScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfc2NoZWR1bGVfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIEF2YWlsYWJsZSBCYWxhbmNlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnYXZhaWxhYmxlX2JhbGFuY2UnIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveCBhdmFpbGFibGUtYmFsYW5jZS1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0dGhpcy5hdmFpbGFibGVfYmFsYW5jZV9pbmZvID0gJCggJzxzcGFuIGNsYXNzPVwiYXZhaWxhYmxlLWJhbGFuY2UtaW5mbyB0dGljb24gdHRpY29uLWluZm9fYmxhY2tfMjRkcFwiPjwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB0aGlzLmF2YWlsYWJsZV9iYWxhbmNlX2luZm8gKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQXZhaWxhYmxlIEJhbGFuY2UnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vIERhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnc3RhcnRfZGF0ZV9zdGFtcCcsIHZhbGlkYXRpb25fZmllbGQ6ICdkYXRlX3N0YW1wJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9jb2x1bW4xLCAnJywgbnVsbCApO1xuXG5cdFx0Ly9NYXNzIEFkZCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UUmFuZ2VQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF9kYXRlX3N0YW1wcycsIHZhbGlkYXRpb25fZmllbGQ6ICdkYXRlX3N0YW1wJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gSW5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRpbWVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF90aW1lJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdJbicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfc2NoZWR1bGVfY29sdW1uMSwgJycsIG51bGwgKTtcblxuXHRcdC8vIE91dFxuXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5USU1FX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUaW1lUGlja2VyKCB7IGZpZWxkOiAnZW5kX3RpbWUnIH0gKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnT3V0JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9jb2x1bW4xLCAnJywgbnVsbCApO1xuXG5cdFx0Ly8gVG90YWxcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICd0b3RhbF90aW1lJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUb3RhbCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfc2NoZWR1bGVfY29sdW1uMSApO1xuXG5cdFx0Ly8gU2NoZWR1bGUgUG9saWN5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZVBvbGljeSxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9zY2hlZHVsZScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3NjaGVkdWxlX3BvbGljeV9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTY2hlZHVsZSBQb2xpY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEgKTtcblxuXHRcdC8vIEJyYW5jaFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2JyYW5jaCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2JyYW5jaF9pZCcsXG5cdFx0XHRhZGRpdGlvbl9zb3VyY2VfZnVuY3Rpb246ICggZnVuY3Rpb24oIHRhcmdldCwgc291cmNlX2RhdGEgKSB7XG5cdFx0XHRcdHJldHVybiAkdGhpcy5vblNvdXJjZURhdGFDcmVhdGUoIHRhcmdldCwgc291cmNlX2RhdGEgKTtcblx0XHRcdH0gKSxcblx0XHRcdGFkZGVkX2l0ZW1zOiBbXG5cdFx0XHRcdHsgdmFsdWU6IFRUVVVJRC5ub3RfZXhpc3RfaWQsIGxhYmVsOiBHbG9iYWwuZGVmYXVsdF9pdGVtIH0sXG5cdFx0XHRdXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQnJhbmNoJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0aWYgKCAhdGhpcy5zaG93X2JyYW5jaF91aSApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2JyYW5jaF9pZCcgKTtcblxuXHRcdH1cblxuXHRcdC8vIERlcGFydG1lbnRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSURlcGFydG1lbnQsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2RlcGFydG1lbnRfaWQnLFxuXHRcdFx0YWRkaXRpb25fc291cmNlX2Z1bmN0aW9uOiAoIGZ1bmN0aW9uKCB0YXJnZXQsIHNvdXJjZV9kYXRhICkge1xuXHRcdFx0XHRyZXR1cm4gJHRoaXMub25Tb3VyY2VEYXRhQ3JlYXRlKCB0YXJnZXQsIHNvdXJjZV9kYXRhICk7XG5cdFx0XHR9ICksXG5cdFx0XHRhZGRlZF9pdGVtczogW1xuXHRcdFx0XHR7IHZhbHVlOiBUVFVVSUQubm90X2V4aXN0X2lkLCBsYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbSB9LFxuXHRcdFx0XVxuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RlcGFydG1lbnQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRpZiAoICF0aGlzLnNob3dfZGVwYXJ0bWVudF91aSApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RlcGFydG1lbnRfaWQnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdC8vSm9iXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2IsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYicsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0am9iX2NvZGVyLnNldFZhbHVlKCB2YWwubWFudWFsX2lkICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAnam9iX2lkJyxcblx0XHRcdFx0YWRkaXRpb25fc291cmNlX2Z1bmN0aW9uOiAoIGZ1bmN0aW9uKCB0YXJnZXQsIHNvdXJjZV9kYXRhICkge1xuXHRcdFx0XHRcdHJldHVybiAkdGhpcy5vblNvdXJjZURhdGFDcmVhdGUoIHRhcmdldCwgc291cmNlX2RhdGEgKTtcblx0XHRcdFx0fSApLFxuXHRcdFx0XHRhZGRlZF9pdGVtczogW1xuXHRcdFx0XHRcdHsgdmFsdWU6IFRUVVVJRC5ub3RfZXhpc3RfaWQsIGxhYmVsOiBHbG9iYWwuZGVmYXVsdF9pdGVtIH0sXG5cdFx0XHRcdF1cblx0XHRcdH0gKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIGpvYl9jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0am9iX2NvZGVyLlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdqb2JfcXVpY2tfc2VhcmNoJywgZGlzYWJsZV9rZXl1cF9ldmVudDogdHJ1ZSB9ICk7XG5cdFx0XHRqb2JfY29kZXIuYWRkQ2xhc3MoICdqb2ItY29kZXInICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGpvYl9jb2RlciApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0pvYicgKSwgW2Zvcm1faXRlbV9pbnB1dCwgam9iX2NvZGVyXSwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdFx0aWYgKCAhdGhpcy5zaG93X2pvYl91aSApIHtcblx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnam9iX2lkJyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYXNrXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2JJdGVtLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9qb2JfaXRlbScsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0am9iX2l0ZW1fY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0ZmllbGQ6ICdqb2JfaXRlbV9pZCcsXG5cdFx0XHRcdGFkZGl0aW9uX3NvdXJjZV9mdW5jdGlvbjogKCBmdW5jdGlvbiggdGFyZ2V0LCBzb3VyY2VfZGF0YSApIHtcblx0XHRcdFx0XHRyZXR1cm4gJHRoaXMub25Tb3VyY2VEYXRhQ3JlYXRlKCB0YXJnZXQsIHNvdXJjZV9kYXRhICk7XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0YWRkZWRfaXRlbXM6IFtcblx0XHRcdFx0XHR7IHZhbHVlOiBUVFVVSUQubm90X2V4aXN0X2lkLCBsYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbSB9LFxuXHRcdFx0XHRdXG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBqb2JfaXRlbV9jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuYWRkQ2xhc3MoICdqb2ItY29kZXInICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGpvYl9pdGVtX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGFzaycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgam9iX2l0ZW1fY29kZXJdLCB0YWJfc2NoZWR1bGVfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0XHRpZiAoICF0aGlzLnNob3dfam9iX2l0ZW1fdWkgKSB7XG5cdFx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2pvYl9pdGVtX2lkJyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvL1B1bmNoIFRhZ1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUHVuY2hUYWcsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfcHVuY2hfdGFnJyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdGdldF9yZWFsX2RhdGFfb25fbXVsdGk6IHRydWUsXG5cdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoICggcHVuY2hfdGFncywgZ2V0X3JlYWxfZGF0YSApID0+IHtcblx0XHRcdFx0XHRpZiAoIHB1bmNoX3RhZ3MgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnUXVpY2tTZWFyY2hNYW51YWxJZHMoIHB1bmNoX3RhZ3MsIGdldF9yZWFsX2RhdGEgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0ZmllbGQ6ICdwdW5jaF90YWdfaWQnLFxuXHRcdFx0XHRhZGRpdGlvbl9zb3VyY2VfZnVuY3Rpb246ICggZnVuY3Rpb24oIHRhcmdldCwgc291cmNlX2RhdGEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR0aGlzLm9uU291cmNlRGF0YUNyZWF0ZSggdGFyZ2V0LCBzb3VyY2VfZGF0YSApO1xuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGFkZGVkX2l0ZW1zOiBbXG5cdFx0XHRcdFx0eyB2YWx1ZTogVFRVVUlELm5vdF9leGlzdF9pZCwgbGFiZWw6IEdsb2JhbC5kZWZhdWx0X2l0ZW0gfSxcblx0XHRcdFx0XVxuXHRcdFx0fSApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgcHVuY2hfdGFnX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRwdW5jaF90YWdfY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnLCBkaXNhYmxlX2tleXVwX2V2ZW50OiB0cnVlIH0gKTtcblx0XHRcdHB1bmNoX3RhZ19jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggcHVuY2hfdGFnX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGFncycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgcHVuY2hfdGFnX2NvZGVyXSwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdFx0aWYgKCAhdGhpcy5zaG93X3B1bmNoX3RhZ191aSApIHtcblx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vTm90ZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9BUkVBICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0QXJlYSggeyBmaWVsZDogJ25vdGUnLCB3aWR0aDogJzEwMCUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ05vdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCBudWxsLCBudWxsLCB0cnVlICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSAmJiB0aGlzLmlzX3ZpZXdpbmcgPT0gZmFsc2UgKSB7XG5cdFx0XHQvL05vdGlmeSBFbXBsb3llZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ25vdGlmeV91c2VyX3NjaGVkdWxlX2NoYW5nZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdOb3RpZnkgRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3RvdGFsX3RpbWUnICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3RvdGFsX3RpbWUnICk7XG5cdFx0fVxuXHR9XG5cblx0b25Tb3VyY2VEYXRhQ3JlYXRlKCB0YXJnZXQsIHNvdXJjZV9kYXRhICkge1xuXHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSB0YXJnZXQuZ2V0RGlzcGxheUNvbHVtbnMoKTtcblx0XHR2YXIgZmlyc3RfaXRlbSA9IHt9O1xuXG5cdFx0JC5lYWNoKCBkaXNwbGF5X2NvbHVtbnMsIGZ1bmN0aW9uKCBpbmRleCwgY29udGVudCApIHtcblx0XHRcdGZpcnN0X2l0ZW0uaWQgPSBUVFVVSUQubm90X2V4aXN0X2lkO1xuXHRcdFx0Zmlyc3RfaXRlbVtjb250ZW50Lm5hbWVdID0gR2xvYmFsLmRlZmF1bHRfaXRlbTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9ICk7XG5cblx0XHQvL0Vycm9yOiBPYmplY3QgZG9lc24ndCBzdXBwb3J0IHByb3BlcnR5IG9yIG1ldGhvZCAndW5zaGlmdCcgaW4gL2ludGVyZmFjZS9odG1sNS9saW5lIDY5NTNcblx0XHRpZiAoICFzb3VyY2VfZGF0YSB8fCAkLnR5cGUoIHNvdXJjZV9kYXRhICkgIT09ICdhcnJheScgKSB7XG5cdFx0XHRzb3VyY2VfZGF0YSA9IFtdO1xuXHRcdH1cblx0XHRzb3VyY2VfZGF0YS51bnNoaWZ0KCBmaXJzdF9pdGVtICk7XG5cblx0XHRyZXR1cm4gc291cmNlX2RhdGE7XG5cdH1cblxuXHRzZXRFZGl0Vmlld1dpZGdldHNNb2RlKCkge1xuXHRcdHZhciBkaWRfY2xlYW5fZGljID0ge307XG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmVkaXRfdmlld191aV9kaWMgKSB7XG5cdFx0XHRpZiAoICF0aGlzLmVkaXRfdmlld191aV9kaWMuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdHZhciB3aWRnZXRDb250YWluZXIgPSB0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2tleV07XG5cdFx0XHR2YXIgY29sdW1uID0gd2lkZ2V0LnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpO1xuXHRcdFx0dmFyIHRhYl9pZCA9IGNvbHVtbi5wYXJlbnQoKS5hdHRyKCAnaWQnICk7XG5cdFx0XHRpZiAoICFjb2x1bW4uaGFzQ2xhc3MoICd2LWJveCcgKSApIHtcblx0XHRcdFx0aWYgKCAhZGlkX2NsZWFuX2RpY1t0YWJfaWRdICkge1xuXHRcdFx0XHRcdGRpZF9jbGVhbl9kaWNbdGFiX2lkXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0Y2FzZSAnc3RhcnRfZGF0ZV9zdGFtcHMnOlxuXHRcdFx0XHRcdGlmICggKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA9PSBUVFVVSUQuemVyb19pZCApICYmICF0aGlzLmlzX21hc3NfZWRpdGluZyAmJiAhdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0XHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCBrZXkgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCBrZXkgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3N0YXJ0X2RhdGVfc3RhbXAnOlxuXHRcdFx0XHRcdGlmICggKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA9PSBUVFVVSUQuemVyb19pZCApICYmICF0aGlzLmlzX21hc3NfZWRpdGluZyAmJiAhdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCBrZXkgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCBrZXkgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0d2lkZ2V0LmNzcyggJ29wYWNpdHknLCAxICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdC8vICMyODMxIE11c3QgY2hlY2sgaXNfdmlld2luZywgb3RoZXJ3aXNlIGFsbCBmaWVsZHMgYXJlIGVkaXRhYmxlIGluIFZpZXcgbW9kZS4gQnVnIG9yaWdpbmF0ZWQgaW4gODg2YTMzYzcxMTc0YzEwYzA2OTljYmY4NjlhM2NmMmViZDIwMDU5MVxuXHRcdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQuc2V0RW5hYmxlZCApICkge1xuXHRcdFx0XHRcdHdpZGdldC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0LnNldEVuYWJsZWQgKSApIHtcblx0XHRcdFx0XHR3aWRnZXQuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZXhjaGFuZ2VCYWxhbmNlKCkge1xuXG5cdFx0dmFyIGJfZGl2ID0gJCggJCggdGhpcyApLm5leHQoKSApO1xuXHRcdGlmICggYl9kaXYuY3NzKCAnZGlzcGxheScgKSA9PT0gJ2Jsb2NrJyApIHtcblx0XHRcdGJfZGl2LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHR9IGVsc2UgaWYgKCBiX2Rpdi5jc3MoICdkaXNwbGF5JyApID09PSAnbm9uZScgKSB7XG5cdFx0XHRiX2Rpdi5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXG5cdFx0fVxuXHR9XG5cblx0b25BZGRSZXN1bHQoIHJlc3VsdCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRpZiAoICFyZXN1bHRfZGF0YSApIHtcblx0XHRcdHJlc3VsdF9kYXRhID0gW107XG5cdFx0fVxuXHRcdHJlc3VsdF9kYXRhLmNvbXBhbnkgPSBMb2NhbENhY2hlRGF0YS5jdXJyZW50X2NvbXBhbnkubmFtZTtcblx0XHRpZiAoICR0aGlzLnN1Yl92aWV3X21vZGUgJiYgJHRoaXMucGFyZW50X2tleSApIHtcblx0XHRcdHJlc3VsdF9kYXRhWyR0aGlzLnBhcmVudF9rZXldID0gJHRoaXMucGFyZW50X3ZhbHVlO1xuXHRcdH1cblx0XHQvLyBEZWZhdWx0IHRvIE9wZW5cblx0XHRyZXN1bHRfZGF0YSA9PT0gdHJ1ZSAmJiAoIHJlc3VsdF9kYXRhID0geyB1c2VyX2lkOiBUVFVVSUQuemVyb19pZCB9ICk7XG5cdFx0IXJlc3VsdF9kYXRhLnVzZXJfaWQgJiYgKCByZXN1bHRfZGF0YS51c2VyX2lkID0gVFRVVUlELnplcm9faWQgKTtcblx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0gcmVzdWx0X2RhdGE7XG5cdFx0JHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdH1cblxuXHRzZXRBYnNlbmNlUG9saWN5RmlsdGVyKCBmaWx0ZXIgKSB7XG5cdFx0aWYgKCAhZmlsdGVyLmZpbHRlcl9kYXRhICkge1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0fVxuXG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblx0XHRpZiAoIGZpbHRlci5maWx0ZXJfY29sdW1ucyApIHtcblx0XHRcdGZpbHRlci5maWx0ZXJfY29sdW1ucy5hYnNlbmNlX3BvbGljeSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpbHRlcjtcblx0fVxuXG5cdG9uRW1wbG95ZWVTb3VyY2VDcmVhdGUoIHRhcmdldCwgc291cmNlX2RhdGEgKSB7XG5cblx0XHRpZiAoICF0aGlzLmNoZWNrT3BlblBlcm1pc3Npb24oKSApIHtcblx0XHRcdHJldHVybiBzb3VyY2VfZGF0YTtcblx0XHR9XG5cblx0XHR2YXIgZGlzcGxheV9jb2x1bW5zID0gdGFyZ2V0LmdldERpc3BsYXlDb2x1bW5zKCk7XG5cblx0XHR2YXIgZmlyc3RfaXRlbSA9IHt9O1xuXHRcdCQuZWFjaCggZGlzcGxheV9jb2x1bW5zLCBmdW5jdGlvbiggaW5kZXgsIGNvbnRlbnQgKSB7XG5cblx0XHRcdGZpcnN0X2l0ZW0uaWQgPSBUVFVVSUQuemVyb19pZDtcblx0XHRcdGZpcnN0X2l0ZW1bY29udGVudC5uYW1lXSA9IEdsb2JhbC5vcGVuX2l0ZW07XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9ICk7XG5cblx0XHQvL0Vycm9yOiBPYmplY3QgZG9lc24ndCBzdXBwb3J0IHByb3BlcnR5IG9yIG1ldGhvZCAndW5zaGlmdCcgaW4gL2ludGVyZmFjZS9odG1sNS9saW5lIDY5NTNcblx0XHRpZiAoICFzb3VyY2VfZGF0YSB8fCAkLnR5cGUoIHNvdXJjZV9kYXRhICkgIT09ICdhcnJheScgKSB7XG5cdFx0XHRzb3VyY2VfZGF0YSA9IFtdO1xuXHRcdH1cblx0XHRzb3VyY2VfZGF0YS51bnNoaWZ0KCBmaXJzdF9pdGVtICk7XG5cblx0XHRyZXR1cm4gc291cmNlX2RhdGE7XG5cdH1cblxuXHRidWlsZFNlYXJjaEZpZWxkcygpIHtcblxuXHRcdHN1cGVyLmJ1aWxkU2VhcmNoRmllbGRzKCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnNlYXJjaF9maWVsZHMgPSBbXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdTdGF0dXMnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdzdGF0dXNfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRW1wbG95ZWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd1c2VyX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWRkaXRpb25fc291cmNlX2Z1bmN0aW9uOiAoIGZ1bmN0aW9uKCB0YXJnZXQsIHNvdXJjZV9kYXRhICkge1xuXHRcdFx0XHRcdHJldHVybiAkdGhpcy5vbkVtcGxveWVlU291cmNlQ3JlYXRlKCB0YXJnZXQsIHNvdXJjZV9kYXRhICk7XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUGF5IFBlcmlvZCcgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3BheV9wZXJpb2RfaWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9QYXlfcGVyaW9kJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElQYXlQZXJpb2QsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1N0YXJ0IERhdGUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdzdGFydF9kYXRlJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUlxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VuZCBEYXRlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnZW5kX2RhdGUnLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbXBsb3llZSBTdGF0dXMnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd1c2VyX3N0YXR1c19pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRGVmYXVsdCBCcmFuY2gnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdkZWZhdWx0X2JyYW5jaF9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2JyYW5jaCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0c2NyaXB0X25hbWU6ICdCcmFuY2hWaWV3Jyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRGVmYXVsdCBEZXBhcnRtZW50JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnZGVmYXVsdF9kZXBhcnRtZW50X2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJRGVwYXJ0bWVudCxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdHNjcmlwdF9uYW1lOiAnRGVwYXJ0bWVudFZpZXcnLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdHcm91cCcgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdncm91cF9pZHMnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF90cmVlX2NvbHVtbicsXG5cdFx0XHRcdHRyZWVfbW9kZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVGl0bGUnICksXG5cdFx0XHRcdGZpZWxkOiAndGl0bGVfaWQnLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYl90aXRsZScsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlclRpdGxlLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSm9iJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnam9iX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iJyxcblx0XHRcdFx0YXBpX2NsYXNzOiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgPyBUVEFQSS5BUElKb2IgOiBudWxsLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogKCB0aGlzLnNob3dfam9iX3VpICYmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUYXNrJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnam9iX2l0ZW1faWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9qb2JfaXRlbScsXG5cdFx0XHRcdGFwaV9jbGFzczogKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApID8gVFRBUEkuQVBJSm9iSXRlbSA6IG51bGwsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiAoIHRoaXMuc2hvd19qb2JfaXRlbV91aSAmJiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU2NoZWR1bGUgQnJhbmNoJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnYnJhbmNoX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYnJhbmNoJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElCcmFuY2gsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdHNjcmlwdF9uYW1lOiAnQnJhbmNoVmlldycsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NjaGVkdWxlIERlcGFydG1lbnQnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdkZXBhcnRtZW50X2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJRGVwYXJ0bWVudCxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0c2NyaXB0X25hbWU6ICdEZXBhcnRtZW50VmlldycsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NjaGVkdWxlIFBvbGljeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3NjaGVkdWxlX3BvbGljeV9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3NjaGVkdWxlJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZVBvbGljeSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApXG5cdFx0XTtcblx0fVxuXG5cdG9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuc2V0SXNDaGFuZ2VkKCB0YXJnZXQgKTtcblx0XHR0aGlzLnNldE1hc3NFZGl0aW5nRmllbGRzV2hlbkZvcm1DaGFuZ2UoIHRhcmdldCApO1xuXG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IGNfdmFsdWU7XG5cblx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRjYXNlICdqb2JfaWQnOlxuXHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snam9iX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5zZXRKb2JJdGVtVmFsdWVXaGVuSm9iQ2hhbmdlZCggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICksICdqb2JfaXRlbV9pZCcsIHtcblx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5qb2JfaWRcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfaXRlbV9xdWlja19zZWFyY2gnXS5zZXRDaGVja0JveCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdWYWx1ZXNXaGVuQ3JpdGVyaWFDaGFuZ2VkKCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX2lkJzpcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHRpZiAoIGNfdmFsdWUgIT09IFRUVVVJRC56ZXJvX2lkICYmIGNfdmFsdWUgIT09IGZhbHNlICYmIGNfdmFsdWUubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdRdWlja1NlYXJjaE1hbnVhbElkcyggdGFyZ2V0LmdldFNlbGVjdEl0ZW1zKCkgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydwdW5jaF90YWdfcXVpY2tfc2VhcmNoJ10uc2V0VmFsdWUoICcnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCR0aGlzLnByZXZpb3VzX3B1bmNoX3RhZ19zZWxlY3Rpb24gPSBjX3ZhbHVlO1xuXHRcdFx0XHRcdC8vUmVzZXQgc291cmNlIGRhdGEgdG8gbWFrZSBzdXJlIGNvcnJlY3QgcHVuY2ggdGFncyBhcmUgYWx3YXlzIHNob3duLlxuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHVuY2hfdGFnX2lkJ10uc2V0U291cmNlRGF0YSggbnVsbCApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYnJhbmNoX2lkJzpcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0XHR0aGlzLnNldEpvYlZhbHVlV2hlbkNyaXRlcmlhQ2hhbmdlZCggJ2pvYl9pZCcsIHtcblx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHR1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2JyYW5jaF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmJyYW5jaF9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2RlcGFydG1lbnRfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kZXBhcnRtZW50X2lkXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdHRoaXMuc2V0RGVwYXJ0bWVudFZhbHVlV2hlbkJyYW5jaENoYW5nZWQoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLCAnZGVwYXJ0bWVudF9pZCcsIHtcblx0XHRcdFx0XHRcdGJyYW5jaF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmJyYW5jaF9pZCxcblx0XHRcdFx0XHRcdHVzZXJfaWQ6ICAgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWRcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdkZXBhcnRtZW50X2lkJzpcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0XHR0aGlzLnNldEpvYlZhbHVlV2hlbkNyaXRlcmlhQ2hhbmdlZCggJ2pvYl9pZCcsIHtcblx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHR1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2JyYW5jaF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmJyYW5jaF9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2RlcGFydG1lbnRfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kZXBhcnRtZW50X2lkXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRjYXNlICdqb2JfaXRlbV9xdWlja19zZWFyY2gnOlxuXHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHRcdHRoaXMub25Kb2JRdWlja1NlYXJjaCgga2V5LCBjX3ZhbHVlICk7XG5cdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1ZhbHVlc1doZW5Dcml0ZXJpYUNoYW5nZWQoIHRoaXMuZ2V0UHVuY2hUYWdGaWx0ZXJEYXRhKCksICdwdW5jaF90YWdfaWQnICk7XG5cdFx0XHRcdFx0Ly9Eb24ndCB2YWxpZGF0ZSBpbW1lZGlhdGVseSBhcyBvbkpvYlF1aWNrU2VhcmNoIGlzIGRvaW5nIGFzeW5jIEFQSSBjYWxscywgYW5kIGl0IHdvdWxkIGNhdXNlIGEgZ3VhcmFudGVlZCB2YWxpZGF0aW9uIGZhaWx1cmUuXG5cdFx0XHRcdFx0ZG9Ob3RWYWxpZGF0ZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwdW5jaF90YWdfcXVpY2tfc2VhcmNoJzpcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHR0aGlzLm9uUHVuY2hUYWdRdWlja1NlYXJjaCggY192YWx1ZSwgdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblxuXHRcdFx0XHRcdC8vRG9uJ3QgdmFsaWRhdGUgaW1tZWRpYXRlbHkgYXMgb25QdW5jaFRhZ1F1aWNrU2VhcmNoIGlzIGRvaW5nIGFzeW5jIEFQSSBjYWxscywgYW5kIGl0IHdvdWxkIGNhdXNlIGEgZ3VhcmFudGVlZCB2YWxpZGF0aW9uIGZhaWx1cmUuXG5cdFx0XHRcdFx0ZG9Ob3RWYWxpZGF0ZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhYnNlbmNlX3BvbGljeV9pZCc6XG5cdFx0XHRjYXNlICdzdGF0dXNfaWQnOlxuXHRcdFx0XHR0aGlzLm9uU3RhdHVzQ2hhbmdlKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcl9pZCc6XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYWJzZW5jZV9wb2xpY3lfaWQnXS5zZXRTb3VyY2VEYXRhKCBudWxsICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYWJzZW5jZV9wb2xpY3lfaWQnXS5zZXRWYWx1ZSggZmFsc2UgKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydhYnNlbmNlX3BvbGljeV9pZCddID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuZ2V0QWJzZW5jZVBvbGljeSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblxuXHRcdFx0XHRpZiAoICQuaXNBcnJheSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKSAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XS5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRcdHRoaXMuaXNfbWFzc19hZGRpbmcgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuaXNfbWFzc19hZGRpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0U2NoZWR1bGVUb3RhbFRpbWUoKTtcblx0XHR0aGlzLmdldFByb2plY3RlZEFic2VuY2VQb2xpY3lCYWxhbmNlKCk7XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdGdldFByb2plY3RlZEFic2VuY2VQb2xpY3lCYWxhbmNlKCkge1xuXHRcdCQoIHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbJ2F2YWlsYWJsZV9iYWxhbmNlJ10uZmluZCggJy5zY2hlZHVsZS12aWV3LWJhbGFuY2UtaW5mbycgKSApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydhYnNlbmNlX3BvbGljeV9pZCddICYmIHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbJ2Fic2VuY2VfcG9saWN5X2lkJ10uY3NzKCAnZGlzcGxheScgKSA9PT0gJ2Jsb2NrJyAmJiAhdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHR2YXIgdXNlcl9pZDtcblx0XHRcdGlmICggR2xvYmFsLmlzQXJyYXkoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndXNlcl9pZCddICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd1c2VyX2lkJ10ubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHR1c2VyX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd1c2VyX2lkJ11bMF07XG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3VzZXJfaWQnXSApIHtcblx0XHRcdFx0dXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndXNlcl9pZCddO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGF0ZV9zdGFtcCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZGF0ZV9zdGFtcCddO1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gdGhpcy5hYnNlbmNlX3BvbGljeV9hcGkuZ2V0UHJvamVjdGVkQWJzZW5jZVBvbGljeUJhbGFuY2UoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnYWJzZW5jZV9wb2xpY3lfaWQnXSwgdXNlcl9pZCwgZGF0ZV9zdGFtcCwgdGhpcy50b3RhbF90aW1lLCB0aGlzLnByZV90b3RhbF90aW1lLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cblx0XHRcdHJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGEgPyByZXN1bHRfZGF0YSA6IHtcblx0XHRcdFx0YXZhaWxhYmxlX2JhbGFuY2U6IDAsXG5cdFx0XHRcdGN1cnJlbnRfdGltZTogMCxcblx0XHRcdFx0cmVtYWluaW5nX2JhbGFuY2U6IDAsXG5cdFx0XHRcdHByb2plY3RlZF9iYWxhbmNlOiAwLFxuXHRcdFx0XHRwcm9qZWN0ZWRfcmVtYWluaW5nX2JhbGFuY2U6IDBcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuZ2V0QmFsYW5jZUhhbmRsZXIoIHJlc3VsdF9kYXRhLCBkYXRlX3N0YW1wICk7XG5cdFx0fVxuXHRcdHRoaXMub25TdGF0dXNDaGFuZ2UoKTtcblx0fVxuXG5cdGdldEFic2VuY2VQb2xpY3koIHVzZXJfaWRzICkge1xuXHRcdHZhciBhcmdzID0geyBmaWx0ZXJfZGF0YToge30gfTtcblx0XHRhcmdzLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB1c2VyX2lkcztcblx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2Fic2VuY2VfcG9saWN5X2lkJ10uc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0fVxuXG5cdHVuaWZvcm1WYXJpYWJsZSggcmVjb3JkcyApIHtcblx0XHR2YXIgbmV3X3JlY29yZHMgPSBbXTtcblx0XHRpZiAoIEdsb2JhbC5pc0FycmF5KCByZWNvcmRzLnVzZXJfaWQgKSAmJiByZWNvcmRzLnVzZXJfaWQubGVuZ3RoID4gMCApIHtcblx0XHRcdHZhciB1c2VyX2lkcyA9IHJlY29yZHMudXNlcl9pZDtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gdXNlcl9pZHMgKSB7XG5cdFx0XHRcdHZhciB0bXBfcmVjb3JkcyA9IEdsb2JhbC5jbG9uZSggcmVjb3JkcyApO1xuXHRcdFx0XHR0bXBfcmVjb3Jkcy51c2VyX2lkID0gdXNlcl9pZHNba2V5XTtcblx0XHRcdFx0bmV3X3JlY29yZHMucHVzaCggdG1wX3JlY29yZHMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3X3JlY29yZHMucHVzaCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcHMgJiYgbmV3X3JlY29yZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdC8vQWxsb3dpbmcgbXVsdGlwbGUgZGF0ZXNcblx0XHRcdHZhciBlZGl0X3JlY29yZCA9IFtdO1xuXHRcdFx0Zm9yICggdmFyIHVyIGluIG5ld19yZWNvcmRzICkge1xuXHRcdFx0XHR2YXIgZGF0ZXMgPSB0aGlzLnVuaWZvcm1EYXRlcyggbmV3X3JlY29yZHNbdXJdLnN0YXJ0X2RhdGVfc3RhbXBzLCBuZXdfcmVjb3Jkc1t1cl0gKTtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5ld19yZWNvcmRzW3VyXS5zdGFydF9kYXRlX3N0YW1wcyApICkge1xuXHRcdFx0XHRcdGRhdGVzID0gbmV3X3JlY29yZHNbdXJdLnN0YXJ0X2RhdGVfc3RhbXBzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGVzID0gdGhpcy5wYXJzZXJEYXRlc1JhbmdlKCBuZXdfcmVjb3Jkc1t1cl0uc3RhcnRfZGF0ZV9zdGFtcHMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBkIGluIGRhdGVzICkge1xuXHRcdFx0XHRcdHZhciBuZXdfcmVjb3JkID0ge307XG5cdFx0XHRcdFx0Zm9yICggdmFyIGVyIGluIG5ld19yZWNvcmRzW3VyXSApIHtcblx0XHRcdFx0XHRcdGlmICggZXIgPT0gJ3N0YXJ0X2RhdGVfc3RhbXBzJyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRuZXdfcmVjb3JkW2VyXSA9IG5ld19yZWNvcmRzW3VyXVtlcl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld19yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcCA9IGRhdGVzW2RdO1xuXHRcdFx0XHRcdG5ld19yZWNvcmQuZGF0ZV9zdGFtcCA9IGRhdGVzW2RdO1xuXHRcdFx0XHRcdGVkaXRfcmVjb3JkLnB1c2goIG5ld19yZWNvcmQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRlZGl0X3JlY29yZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZDtcblx0XHRcdGlmICggJC5pc0FycmF5KCBlZGl0X3JlY29yZC5zdGFydF9kYXRlX3N0YW1wICkgJiYgZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcC5sZW5ndGggPT0gMSApIHtcblx0XHRcdFx0ZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcCA9IGVkaXRfcmVjb3JkLnN0YXJ0X2RhdGVfc3RhbXBbMF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVkaXRfcmVjb3JkO1xuXHR9XG5cblx0cGFyc2VyRGF0ZXNSYW5nZSggZGF0ZSApIHtcblx0XHR2YXIgZGF0ZXMgPSBkYXRlLnNwbGl0KCAnIC0gJyApO1xuXHRcdHZhciByZXN1bHRBcnJheSA9IFtdO1xuXHRcdHZhciBiZWdpbkRhdGUgPSBHbG9iYWwuc3RyVG9EYXRlKCBkYXRlc1swXSApO1xuXHRcdHZhciBlbmREYXRlID0gR2xvYmFsLnN0clRvRGF0ZSggZGF0ZXNbMV0gKTtcblxuXHRcdHZhciBuZXh0RGF0ZSA9IGJlZ2luRGF0ZTtcblxuXHRcdHdoaWxlICggbmV4dERhdGUuZ2V0VGltZSgpIDwgZW5kRGF0ZS5nZXRUaW1lKCkgKSB7XG5cdFx0XHRyZXN1bHRBcnJheS5wdXNoKCBuZXh0RGF0ZS5mb3JtYXQoKSApO1xuXHRcdFx0bmV4dERhdGUgPSBuZXcgRGF0ZSggbmV3IERhdGUoIG5leHREYXRlLmdldFRpbWUoKSApLnNldERhdGUoIG5leHREYXRlLmdldERhdGUoKSArIDEgKSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZGF0ZXM7XG5cdH1cblxuXHR1bmlmb3JtRGF0ZXMoIGRhdGVfcmFuZ2UsIHJlY29yZCApIHtcblx0XHR2YXIgZGF0ZXMgPSBbXTtcblx0XHRpZiAoICFBcnJheS5pc0FycmF5KCBkYXRlX3JhbmdlICkgJiYgZGF0ZV9yYW5nZS5pbmRleE9mKCAnIC0gJyApID09IC0xICkge1xuXHRcdFx0ZGF0ZXMgPSBbZGF0ZV9yYW5nZV07XG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggZGF0ZV9yYW5nZSApICkge1xuXHRcdFx0ZGF0ZXMgPSBkYXRlX3JhbmdlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRlcyA9IHRoaXMucGFyc2VyRGF0ZXNSYW5nZSggZGF0ZV9yYW5nZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRlcztcblx0fVxuXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdC8vIFdoZW4gbWFzcyBlZGl0aW5nLCB0aGVzZSBmaWVsZHMgbWF5IG5vdCBiZSB0aGUgY29tbW9uIGRhdGEsIHNvIHRoZWlyIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkLCBzbyB0aGlzIHdpbGwgY2F1c2UgdGhlaXIgY2hhbmdlIGV2ZW50IGNhbm5vdCB3b3JrIHByb3Blcmx5LlxuXHRcdHRoaXMuc2V0RGVmYXVsdERhdGEoIHtcblx0XHRcdCdzdGF0dXNfaWQnOiAxMFxuXHRcdH0gKTtcblxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkIHx8IHRoaXMuaXNfbWFzc19lZGl0aW5nICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXJfaWQuc2V0QWxsb3dNdWx0aXBsZVNlbGVjdGlvbiggZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXJfaWQuc2V0QWxsb3dNdWx0aXBsZVNlbGVjdGlvbiggdHJ1ZSApO1xuXHRcdH1cblxuXHRcdC8vU2V0IGN1cnJlbnQgZWRpdCByZWNvcmQgZGF0YSB0byBhbGwgd2lkZ2V0c1xuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkge1xuXHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldCApIHx8IGtleSA9PT0gJ2RhdGVfc3RhbXAnICkge1xuXHRcdFx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRcdFx0Y2FzZSAnc3RhcnRfZGF0ZV9zdGFtcCc6XG5cdFx0XHRcdFx0Y2FzZSAnc3RhcnRfZGF0ZV9zdGFtcHMnOlxuXHRcdFx0XHRcdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFyIGRhdGVfYXJyYXk7XG5cdFx0XHRcdFx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRcdFx0XHRcdGRhdGVfYXJyYXkgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcHM7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlX3N0YW1wICkgPT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0ZV9hcnJheSA9IFt0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZV9zdGFtcF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlX3N0YW1wID0gZGF0ZV9hcnJheTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggZGF0ZV9hcnJheSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndG90YWxfdGltZSc6XG5cdFx0XHRcdFx0XHR0aGlzLnByZV90b3RhbF90aW1lID0gKCB0aGlzLmlzX2FkZCApID8gMCA6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnam9iX2lkJzpcblx0XHRcdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhcmdzID0ge307XG5cdFx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzX2lkOiAxMCxcblx0XHRcdFx0XHRcdFx0XHR1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCxcblx0XHRcdFx0XHRcdFx0XHRwdW5jaF9icmFuY2hfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5icmFuY2hfaWQsXG5cdFx0XHRcdFx0XHRcdFx0cHVuY2hfZGVwYXJ0bWVudF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRlcGFydG1lbnRfaWRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0LnNldERlZmF1bHRBcmdzKCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhcmdzID0ge307XG5cdFx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7IHN0YXR1c19pZDogMTAsIGpvYl9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmpvYl9pZCB9O1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHVuY2hfdGFnX2lkJzpcblx0XHRcdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSB7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5wcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV07XG5cblx0XHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdFx0YXJncy5maWx0ZXJfZGF0YSA9ICR0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JyYW5jaF9pZCc6XG5cdFx0XHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdFx0XHRcdFx0XHRhcmdzLmZpbHRlcl9kYXRhID0geyB1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCB9O1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcGFydG1lbnRfaWQnOlxuXHRcdFx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdFx0YXJncy5maWx0ZXJfZGF0YSA9IHsgdXNlcl9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQsIGJyYW5jaF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmJyYW5jaF9pZCB9O1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndXNlcl9pZCc6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHR0aGlzLmdldEFic2VuY2VQb2xpY3koIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkYXRlX3N0YW1wJzpcblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc3RhcnRfZGF0ZV9zdGFtcCddID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV07XG5cdFx0XHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X2RhdGVfc3RhbXBzJ10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0VUlEYXRhVG9DdXJyZW50RWRpdFJlY29yZCgpO1xuXHRcdHRoaXMuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHR9XG5cblx0Z2V0U2NoZWR1bGVUb3RhbFRpbWUoKSB7XG5cdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgc3RhcnRUaW1lLCBlbmRUaW1lLCBkYXRlX3N0YW1wO1xuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzdGFydF9kYXRlX3N0YW1wcyddICkge1xuXHRcdFx0ZGF0ZV9zdGFtcCA9IHRoaXMudW5pZm9ybURhdGVzKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X2RhdGVfc3RhbXBzJ10sIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApWzBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRlX3N0YW1wID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydkYXRlX3N0YW1wJ107XG5cdFx0fVxuXG5cdFx0dmFyIHN0YXJ0VGltZSA9IGRhdGVfc3RhbXAgKyAnICcgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X3RpbWUnXTtcblx0XHR2YXIgZW5kVGltZSA9IGRhdGVfc3RhbXAgKyAnICcgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2VuZF90aW1lJ107XG5cdFx0dmFyIHNjaGVkdWxlUG9saWN5SWQgPSAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc2NoZWR1bGVfcG9saWN5X2lkJ10gKSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc2NoZWR1bGVfcG9saWN5X2lkJ10gOiAnJztcblxuXHRcdGlmICggIXNjaGVkdWxlUG9saWN5SWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLmFwaS5nZXRTY2hlZHVsZVRvdGFsVGltZSggc3RhcnRUaW1lLCBlbmRUaW1lLCBzY2hlZHVsZVBvbGljeUlkLCB1c2VyX2lkLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHR0aGlzLnRvdGFsX3RpbWUgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdHZhciB0b3RhbF90aW1lID0gR2xvYmFsLmdldFRpbWVVbml0KCB0aGlzLnRvdGFsX3RpbWUgKTtcblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWyd0b3RhbF90aW1lJ10uc2V0VmFsdWUoIHRvdGFsX3RpbWUgKTtcblxuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd0b3RhbF90aW1lJ10gPSB0b3RhbF90aW1lO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdHRoaXMub25TdGF0dXNDaGFuZ2UoKTtcblx0XHR0aGlzLmdldFNjaGVkdWxlVG90YWxUaW1lKCk7XG5cdFx0dGhpcy5zZXRFZGl0Vmlld1dpZGdldHNNb2RlKCk7XG5cdFx0dGhpcy5nZXRQcm9qZWN0ZWRBYnNlbmNlUG9saWN5QmFsYW5jZSgpO1xuXHR9XG5cblx0b25TdGF0dXNDaGFuZ2UoKSB7XG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXR1c19pZCddID09IDIwICkge1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAnYWJzZW5jZV9wb2xpY3lfaWQnICk7XG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnYWJzZW5jZV9wb2xpY3lfaWQnXSAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2Fic2VuY2VfcG9saWN5X2lkJ10gIT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ2F2YWlsYWJsZV9iYWxhbmNlJyApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnYXZhaWxhYmxlX2JhbGFuY2UnICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2Fic2VuY2VfcG9saWN5X2lkJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnYXZhaWxhYmxlX2JhbGFuY2UnICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lZGl0RmllbGRSZXNpemUoKTtcblxuXHR9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2509\n")}}]); |