TimeTrex/interface/html5/dist/common-RequestViewCommonController.bundle.js

1 line
160 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["common-RequestViewCommonController"],{2343:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"RequestViewCommonController\": () => (/* binding */ RequestViewCommonController)\n/* harmony export */ });\n/* harmony import */ var _global_Global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9490);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\nclass RequestViewCommonController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tauthorization_history: null,\n\t\t\tselected_absence_policy_record: null,\n\t\t\tenable_edit_view_ui: false\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tsetGridCellBackGround() {\n\t\t//Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tif ( !this.grid ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar data = this.grid.getGridParam( 'data' );\n\t\t//Error: TypeError: data is undefined in /interface/html5/framework/jquery.min.js?v=7.4.6-20141027-074127 line 2 > eval line 70\n\t\tif ( !data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar len = data.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar item = data[i];\n\n\t\t\tif ( item.status_id == 30 ) {\n\t\t\t\t$( 'tr#' + item.id ).addClass( 'bolder-request' );\n\t\t\t}\n\t\t}\n\t}\n\n\tonCancelClick( force, cancel_all, callback ) {\n\t\tTTPromise.add( 'base', 'onCancelClick' );\n\t\tvar $this = this;\n\n\t\t//#2571 - Unable to get property 'id' of undefined or null reference\n\t\tif ( this.current_edit_record && this.current_edit_record.id ) {\n\t\t\tvar $record_id = this.current_edit_record.id;\n\t\t}\n\n\t\tLocalCacheData.current_doing_context_action = 'cancel';\n\t\tif ( this.is_changed && !force ) {\n\t\t\tTAlertManager.showConfirmAlert( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.modify_alert_message */ .x.modify_alert_message, null, function( flag ) {\n\n\t\t\t\tif ( flag === true ) {\n\t\t\t\t\tdoNext();\n\t\t\t\t}\n\n\t\t\t} );\n\t\t} else {\n\t\t\tdoNext();\n\t\t}\n\n\t\tfunction doNext() {\n\t\t\tif ( !$this.edit_view && $this.parent_view_controller && $this.sub_view_mode ) {\n\t\t\t\t$this.parent_view_controller.is_changed = false;\n\t\t\t\t$this.parent_view_controller.buildContextMenu( true );\n\t\t\t\t$this.parent_view_controller.onCancelClick();\n\n\t\t\t} else {\n\t\t\t\tif ( $this.is_edit && $record_id ) {\n\t\t\t\t\tContextMenuManager.unmountContextMenu( $this.determineContextMenuMountAttributes().id );\n\t\t\t\t\t$this.setCurrentEditViewState( 'view' );\n\t\t\t\t\t$this.onViewClick( $record_id, true );\n\t\t\t\t\t$this.setEditMenu();\n\t\t\t\t} else {\n\t\t\t\t\t$this.removeEditView();\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\n\t\t\t$this.search( false ); //Refresh the grid, as we don't do that during authorize/decline clicks anymore.\n\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.setUIInitComplete */ .x.setUIInitComplete();\n\t\t\tProgressBar.closeOverlay();\n\n\t\t\tTTPromise.resolve( 'base', 'onCancelClick' );\n\n\t\t}\n\n\t}\n\n\toverlappingShiftUIValidate() {\n\t\t//Same permissions as APISchedule->getOverlappingShifts()\n\t\tif ( !PermissionManager.validate( 'schedule', 'enabled' )\n\t\t\t|| !( PermissionManager.validate( 'schedule', 'view' ) || PermissionManager.validate( 'schedule', 'view_own' ) || PermissionManager.validate( 'schedule', 'view_child' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonCloseIconClick() {\n\t\tthis.onCancelClick();\n\t}\n\n\tbuildDataForAPI( data ) {\n\t\tif ( this.viewId == 'RequestAuthorization' && ( !data.request_schedule_id || data.request_schedule_id <= 0 ) ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tvar user_id = LocalCacheData.loginUser.id;\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record.user_id ) ) {\n\t\t\tuser_id = this.current_edit_record.user_id;\n\t\t}\n\t\tvar data_for_api = { 'user_id': user_id };\n\t\tvar request_schedule = {};\n\n\t\tvar request_schedule_keys = '';\n\n\t\tvar afn = this.getAdvancedFieldNames();\n\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tif ( key == 'start_date' && this.edit_view_ui_dic[key] ) {\n\t\t\t\tdata_for_api.date_stamp = this.edit_view_ui_dic[key].getValue();\n\t\t\t}\n\n\t\t\tif ( afn.indexOf( key ) > -1 ) {\n\t\t\t\tif ( key == 'request_schedule_id' ) {\n\t\t\t\t\trequest_schedule['id'] = this.current_edit_record.request_schedule_id;\n\t\t\t\t} else if ( key == 'request_schedule_status_id' ) {\n\t\t\t\t\t//this case is for when asking for default data\n\t\t\t\t\trequest_schedule['status_id'] = this.edit_view_ui_dic.request_schedule_status_id.getValue();\n\t\t\t\t} else if ( this.edit_view_ui_dic[key] ) {\n\t\t\t\t\trequest_schedule[key] = this.edit_view_ui_dic[key].getValue();\n\t\t\t\t}\n\t\t\t} else if ( key == 'available_balance' || key == 'job_item_quick_search' || key == 'job_quick_search' ) {\n\t\t\t\t//ignore. these fields do not need to be saved and break the insert sql.\n\t\t\t} else {\n\t\t\t\tdata_for_api[key] = this.current_edit_record[key];\n\t\t\t}\n\t\t}\n\n\t\t//There is a case where a regular employee has access to submit advanced requests, but the supervisor does not.\n\t\t// In that case we still need to allow advanced requests for authorization.\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 && ( PermissionManager.validate( 'request', 'add_advanced' ) || _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isEmpty */ .x.isEmpty( request_schedule ) == false ) && ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) ) {\n\t\t\tdata_for_api.request_schedule = request_schedule;\n\t\t}\n\t\treturn data_for_api;\n\t}\n\n\tbuildDataFromAPI( data ) {\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( data ) && _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( data.request_schedule ) ) {\n\t\t\tfor ( var key in data.request_schedule ) {\n\t\t\t\tif ( key == 'id' ) {\n\t\t\t\t\tdata['request_schedule_id'] = data.request_schedule.id;\n\t\t\t\t} else if ( key == 'status_id' ) {\n\t\t\t\t\tdata['request_schedule_status_id'] = data.request_schedule.status_id;\n\t\t\t\t} else if ( typeof ( data[key] ) == 'undefined' ) {\n\t\t\t\t\tdata[key] = data.request_schedule[key];\n\t\t\t\t} else {\n\t\t\t\t\t//Debug.Text('Not overwriting: '+key+' request_schedule: '+data.request_schedule[key]+' request: '+data[key], 'RequestViewCommonController.js', 'RequestViewCommonController','buildDataFromAPI' ,10)\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tdelete data.request_schedule;\n\t\t\tthis.pre_request_schedule = false; //is this a request from before request schedule was added? we need to know if this is an \"old version\" request\n\t\t} else {\n\t\t\tthis.pre_request_schedule = true;\n\t\t}\n\n\t\tvar retval = $.extend( this.current_edit_record, data );\n\t\treturn retval;\n\t}\n\n\tshowAdvancedFields( update_schedule_total_time ) {\n\t\tif (\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 &&\n\t\t\t( PermissionManager.validate( 'request', 'add_advanced' )\n\t\t\t\t|| ( TTUUID.isUUID( this.current_edit_record.request_schedule_id ) && this.current_edit_record.request_schedule_id != TTUUID.zero_id && this.current_edit_record.request_schedule_id != TTUUID.not_exist_id ) )\n\t\t\t&& ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) && ( !this.pre_request_schedule || this.is_add )\n\t\t) {\n\t\t\tvar advanced_field_names = this.getAdvancedFieldNames();\n\t\t\tif ( this.edit_view_ui_dic ) {\n\t\t\t\tfor ( var i = 0; i < advanced_field_names.length; i++ ) {\n\t\t\t\t\tif ( advanced_field_names[i] == 'absence_policy_id' && this.edit_view_ui_dic.request_schedule_status_id && this.edit_view_ui_dic.request_schedule_status_id.getValue() != 20 ) {\n\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif ( this.edit_view_ui_dic[advanced_field_names[i]] ) {\n\t\t\t\t\t\tif ( advanced_field_names[i] == 'branch_id' && !this.show_branch_ui ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else if ( advanced_field_names[i] == 'department_id' && !this.show_department_ui ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else if ( advanced_field_names[i] == 'job_id' && !this.show_job_ui ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else if ( advanced_field_names[i] == 'job_item_id' && !this.show_job_item_ui ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else if ( advanced_field_names[i] == 'punch_tag_id' && !this.show_punch_tag_ui ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else if ( advanced_field_names[i] == 'available_balance' && !this.is_viewing ) {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).show();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( this.edit_view_ui_dic.date ) {\n\t\t\t\t\tthis.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t}\n\n\t\t\t\tif ( this.edit_view_ui_dic.available_balance ) {\n\t\t\t\t\tif ( this.is_viewing == true && this.viewId == 'Request' ) {\n\t\t\t\t\t\tthis.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( this.current_edit_record.type_id != 30 && this.current_edit_record.type_id != 40 ) {\n\t\t\t\t\tif ( this.edit_view_ui_dic.total_time ) {\n\t\t\t\t\t\tthis.edit_view_ui_dic.total_time.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\tthis.edit_view_ui_dic.overlap_type_id.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\tthis.edit_view_ui_dic.is_replace_with_open_shift.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( update_schedule_total_time != false ) {\n\t\t\t\t\t\tthis.getScheduleTotalTime();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.edit_view_ui_dic.date_stamp ) {\n\t\t\t\tthis.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).show();\n\t\t\t}\n\t\t\tthis.hideAdvancedFields();\n\t\t}\n\t}\n\n\thideAdvancedFields() {\n\t\tvar advanced_field_names = this.getAdvancedFieldNames();\n\t\tif ( this.edit_view_ui_dic ) {\n\t\t\tfor ( var i = 0; i < advanced_field_names.length; i++ ) {\n\t\t\t\tif ( this.edit_view_ui_dic[advanced_field_names[i]] ) {\n\t\t\t\t\tthis.edit_view_ui_dic[advanced_field_names[i]].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.edit_view_ui_dic.date ) {\n\t\t\t\tthis.edit_view_ui_dic.date.parents( '.edit-view-form-item-div' ).show();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAdvancedFieldNames() {\n\t\treturn [\n\t\t\t'request_id',\n\t\t\t'request_schedule_status_id',\n\t\t\t'request_schedule_id',\n\t\t\t'start_date',\n\t\t\t'end_date',\n\n\t\t\t'sun',\n\t\t\t'mon',\n\t\t\t'tue',\n\t\t\t'wed',\n\t\t\t'thu',\n\t\t\t'fri',\n\t\t\t'sat',\n\n\t\t\t'start_time',\n\t\t\t'end_time',\n\t\t\t'total_time',\n\n\t\t\t'schedule_policy_id',\n\t\t\t'absence_policy_id',\n\t\t\t'branch_id',\n\t\t\t'department_id',\n\t\t\t'job_id',\n\t\t\t'job_item_id',\n\t\t\t'punch_tag_id',\n\n\t\t\t'schedule_policy',\n\t\t\t'absence_policy',\n\t\t\t'branch',\n\t\t\t'department',\n\t\t\t'job',\n\t\t\t'job_item',\n\t\t\t'available_balance',\n\n\t\t\t'overlap_type_id',\n\t\t\t'is_replace_with_open_shift'\n\t\t];\n\t}\n\n\tgetScheduleTotalTime() {\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15\n\t\t\t&& ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 )\n\t\t\t&& ( this.edit_view_ui_dic && this.edit_view_ui_dic['total_time'] )\n\t\t) {\n\n\t\t\tvar start_time = false;\n\t\t\tif ( this.current_edit_record['start_date'] && this.current_edit_record['start_time'] ) {\n\t\t\t\tstart_time = this.current_edit_record['start_date'] + ' ' + this.current_edit_record['start_time'];\n\t\t\t}\n\n\t\t\tvar end_time = false;\n\t\t\tif ( this.current_edit_record['start_date'] && this.current_edit_record['end_time'] ) {\n\t\t\t\tend_time = this.current_edit_record['start_date'] + ' ' + this.current_edit_record['end_time'];\n\t\t\t}\n\n\t\t\tvar schedulePolicyId = ( this.current_edit_record['schedule_policy_id'] ) ? this.current_edit_record['schedule_policy_id'] : null;\n\t\t\tvar user_id = this.current_edit_record.user_id;\n\n\t\t\tif ( typeof user_id == 'undefined' && LocalCacheData.getLoginUser().id ) {\n\t\t\t\tuser_id = LocalCacheData.getLoginUser().id;\n\t\t\t}\n\n\t\t\tif ( start_time && end_time ) {\n\t\t\t\tvar schedule_api = TTAPI.APISchedule;\n\t\t\t\tvar result = schedule_api.getScheduleTotalTime( start_time, end_time, schedulePolicyId, user_id, { async: false } );\n\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\tthis.total_time = result.getResult();\n\t\t\t\t} else {\n\t\t\t\t\tthis.total_time = 0;\n\t\t\t\t}\n\n\t\t\t\tvar days = 1;\n\t\t\t\tif ( this.current_edit_record.start_date != this.current_edit_record.end_date ) {\n\t\t\t\t\tdays = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getDaysInSpan */ .x.getDaysInSpan( this.current_edit_record.start_date, this.current_edit_record.end_date, this.current_edit_record.sun, this.current_edit_record.mon, this.current_edit_record.tue, this.current_edit_record.wed, this.current_edit_record.thu, this.current_edit_record.fri, this.current_edit_record.sat );\n\t\t\t\t}\n\n\t\t\t\tvar overall_total_time = this.total_time * days;\n\t\t\t\t$('#total_info').text( $.i18n._( 'x %s Day(s) = %s', days, _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( overall_total_time ) ) );\n\n\t\t\t\tthis.current_edit_record['total_time'] = this.total_time;\n\t\t\t\tvar total_time = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( this.total_time );\n\t\t\t\tthis.edit_view_ui_dic['total_time'].setValue( total_time );\n\t\t\t\tthis.edit_view_ui_dic.total_time.parents( '.edit-view-form-item-div' ).show();\n\t\t\t} else {\n\t\t\t\tif ( this.edit_view_ui_dic.total_time ) {\n\t\t\t\t\tthis.edit_view_ui_dic.total_time.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.edit_view_ui_dic.total_time ) {\n\t\t\t\tthis.edit_view_ui_dic.total_time.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t}\n\t\t}\n\n\t\tthis.onAvailableBalanceChange();\n\t}\n\n\tonWorkingStatusChanged() {\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\t\t\tif ( this.edit_view_ui_dic.request_schedule_status_id && this.edit_view_ui_dic.absence_policy_id ) {\n\t\t\t\tvar type_id = this.edit_view_ui_dic.type_id ? this.edit_view_ui_dic.type_id.getValue() : this.current_edit_record.type_id;\n\t\t\t\tthis.showAbsencePolicyField( type_id, this.edit_view_ui_dic.request_schedule_status_id.getValue(), this.edit_view_ui_dic.absence_policy_id );\n\t\t\t}\n\t\t\tthis.showCreateOpenShift();\n\t\t}\n\t}\n\n\tshowCreateOpenShift() {\n\t\tif ( PermissionManager.checkTopLevelPermission( 'RequestAuthorization' ) && this.current_edit_record && this.current_edit_record.request_schedule_status_id == 20 ) {\n\t\t\tthis.attachElement( 'is_replace_with_open_shift' );\n\t\t} else {\n\t\t\tthis.detachElement( 'is_replace_with_open_shift' );\n\t\t}\n\t}\n\n\tshowAbsencePolicyField( type_id, request_schedule_status_id, ui_field ) {\n\t\tif ( request_schedule_status_id == 20 && ( type_id == 30 || type_id == 40 ) ) {\n\t\t\tui_field.parents( '.edit-view-form-item-div' ).show();\n\t\t\tif ( ( this.viewId == 'Request' && this.is_viewing ) == false ) {\n\t\t\t\tthis.onAvailableBalanceChange();\n\t\t\t}\n\t\t} else {\n\t\t\tui_field.parents( '.edit-view-form-item-div' ).hide();\n\t\t\tthis.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t}\n\t}\n\n\tonDateStampChanged() {\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {\n\t\t\tthis.edit_view_ui_dic.start_date.setValue( this.current_edit_record.date_stamp );\n\t\t\tthis.current_edit_record.start_date = this.current_edit_record.date_stamp;\n\t\t}\n\t}\n\n\tonStartDateChanged() {\n\t\tthis.edit_view_ui_dic.date_stamp.setValue( this.current_edit_record.start_date );\n\t\tthis.current_edit_record.date_stamp = this.current_edit_record.start_date;\n\t}\n\n\tgetAvailableBalance() {\n\t\tif ( ( this.is_viewing && this.viewId == 'Request' ) || _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record ) == false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ( this.viewId != 'Request' || this.is_viewing == false ) &&\n\t\t\tthis.current_edit_record.absence_policy_id &&\n\t\t\t( PermissionManager.validate( 'request', 'add_advanced' ) || ( TTUUID.isUUID( this.current_edit_record.request_schedule_id ) && this.current_edit_record.request_schedule_id != TTUUID.zero_id && this.current_edit_record.request_schedule_id != TTUUID.not_exist_id ) ) &&\n\t\t\tLocalCacheData.loginUser.id &&\n\t\t\tthis.current_edit_record.total_time &&\n\t\t\tthis.current_edit_record.total_time != 0 &&\n\t\t\tthis.current_edit_record.start_date ) {\n\n\t\t\tvar days = 1;\n\t\t\tif ( this.current_edit_record.start_date != this.current_edit_record.end_date ) {\n\t\t\t\tdays = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getDaysInSpan */ .x.getDaysInSpan( this.current_edit_record.start_date, this.current_edit_record.end_date, this.current_edit_record.sun, this.current_edit_record.mon, this.current_edit_record.tue, this.current_edit_record.wed, this.current_edit_record.thu, this.current_edit_record.fri, this.current_edit_record.sat );\n\t\t\t}\n\n\t\t\tvar $this = this;\n\t\t\tvar user_id = this.current_edit_record.user_id;\n\t\t\tvar total_time = this.current_edit_record.total_time * days;\n\t\t\tvar date_stamp = this.current_edit_record.date_stamp;\n\t\t\tvar policy_id = this.current_edit_record.absence_policy_id ? this.current_edit_record.absence_policy_id : TTUUID.zero_id;\n\n\t\t\tif ( user_id && date_stamp && total_time ) {\n\t\t\t\tthis.api_absence_policy.getProjectedAbsencePolicyBalance(\n\t\t\t\t\tpolicy_id,\n\t\t\t\t\tuser_id,\n\t\t\t\t\tdate_stamp,\n\t\t\t\t\ttotal_time,\n\t\t\t\t\t{\n\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\tif ( $this.edit_view_ui_dic && $this.edit_view_ui_dic.available_balance ) {\n\t\t\t\t\t\t\t\t$this.getBalanceHandler( result, date_stamp );\n\t\t\t\t\t\t\t\tif ( result && $this.selected_absence_policy_record ) {\n\t\t\t\t\t\t\t\t\t$this.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).show();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$this.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\t// If unset or set to --None--...\n\t\t} else if ( this.current_edit_record.absence_policy_id == false || this.current_edit_record.absence_policy_id == TTUUID.zero_id ) {\n\t\t\tif ( this.edit_view_ui_dic.available_balance ) {\n\t\t\t\tthis.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetFilterColumnsFromDisplayColumns( authorization_history ) {\n\t\t// Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tvar display_columns = [];\n\t\tif ( authorization_history ) {\n\t\t\tif ( this.authorization_history.authorization_history_grid ) {\n\t\t\t\tdisplay_columns = AuthorizationHistory.getAuthorizationHistoryDefaultDisplayColumns();\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.grid ) {\n\t\t\t\tdisplay_columns = this.grid.getGridParam( 'colModel' );\n\t\t\t}\n\t\t}\n\t\tvar column_filter = {};\n\t\tcolumn_filter.is_owner = true;\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.is_child = true;\n\t\tcolumn_filter.in_use = true;\n\t\tcolumn_filter.first_name = true;\n\t\tcolumn_filter.last_name = true;\n\t\tcolumn_filter.user_id = true;\n\t\tcolumn_filter.status_id = true;\n\n\t\tif ( display_columns ) {\n\t\t\tvar len = display_columns.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar column_info = display_columns[i];\n\t\t\t\tcolumn_filter[column_info.name] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\tjobUIValidate() {\n\t\t//use punch permission section rather than schedule permission section as that's what they can see when they're creating punches\n\t\tif ( PermissionManager.validate( 'job', 'enabled' ) &&\n\t\t\tPermissionManager.validate( 'punch', 'edit_job' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tjobItemUIValidate() {\n\t\t//use punch permission section rather than schedule permission section as that's what they can see when they're creating punches\n\t\tif ( PermissionManager.validate( 'punch', 'edit_job_item' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpunchTagUIValidate() {\n\t\t//use punch permission section rather than schedule permission section as that's what they can see when they're creating punches\n\t\tif ( PermissionManager.validate( 'punch', 'edit_punch_tag' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbranchUIValidate() {\n\t\t//use punch permission section rather than schedule permission section as that's what they can see when they're creating punches\n\t\tif ( PermissionManager.validate( 'punch', 'edit_branch' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdepartmentUIValidate() {\n\t\t//use punch permission section rather than schedule permission section as that's what they can see when they're creating punches\n\t\tif ( PermissionManager.validate( 'punch', 'edit_department' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprocessAPICallbackResult( result_data ) {\n\t\tthis.current_edit_record = this.buildDataFromAPI( result_data[0] );\n\t\tthis.current_edit_record.total_time = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( this.current_edit_record.total_time );\n\n\t\treturn result_data;\n\t}\n\n\tdoViewClickResult( result_data ) {\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record.start_date ) && this.edit_view_tab ) {\n\t\t\tthis.edit_view_tab.find( '#tab_request' ).find( '.third-column' ).show();\n\t\t}\n\n\t\tthis.initEditView();\n\t\tthis.initViewingView();\n\n\t\t//This line is required to avoid problems with the absence policy box not showing properly on initial load.\n\t\tthis.onWorkingStatusChanged();\n\n\t\tvar $this = this;\n\t\tEmbeddedMessage.init( this.current_edit_record.id, 50, this, this.edit_view, this.edit_view_tab, this.edit_view_ui_dic, function() {\n\t\t\t$this.authorization_history = AuthorizationHistory.init( $this );\n\t\t\t$this.setEditMenu();\n\t\t} );\n\t\treturn this.clearCurrentSelectedRecord();\n\t}\n\n\tonViewClick( edit_record, clear_edit_view ) {\n\t\tif ( clear_edit_view ) {\n\t\t\tthis.clearEditView();\n\t\t}\n\t\tsuper.onViewClick( edit_record );\n\t}\n\n\tsetSubLogViewFilter() {\n\t\tif ( !this.sub_log_view_controller ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.sub_log_view_controller.getSubViewFilter = function( filter ) {\n\t\t\tfilter['table_name_object_id'] = {\n\t\t\t\t'request': [this.parent_edit_record.id],\n\t\t\t\t'request_schedule': [this.parent_edit_record.request_schedule_id]\n\t\t\t};\n\n\t\t\treturn filter;\n\t\t};\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * This function exists because the edit form is not actually an edit mode form, so we need to do some\n\t * stuff differently in view mode than in edit mode.\n\t */\n\tinitViewingView() {\n\t\tthis.showAdvancedFields();\n\t}\n\n\tinitEditViewUI( view_id, edit_view_file_name ) {\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.setUINotready */ .x.setUINotready();\n\t\tTTPromise.add( 'init', 'init' );\n\t\tTTPromise.wait();\n\t\tvar $this = this;\n\n\t\tif ( this.edit_view ) {\n\t\t\tthis.edit_view.remove();\n\t\t}\n\n\t\tthis.edit_view = $( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadViewSource */ .x.loadViewSource( view_id, edit_view_file_name, null, true ) );\n\t\tthis.edit_view_tab = $( this.edit_view.find( '.edit-view-tab-bar' ) );\n\n\t\t//Give edt view tab a id, so we can load it when put right click menu on it\n\t\tthis.edit_view_tab.attr( 'id', this.ui_id + '_edit_view_tab' );\n\n\t\t// Moved into generic BaseView.initEditViewTabs\n\t\t// this.setTabOVisibility( false );\n\t\t// this.edit_view_tab = this.edit_view_tab.tabs( {\n\t\t// \tactivate: function( e, ui ) {\n\t\t// \t\t$this.onTabShow( e, ui );\n\t\t// \t}\n\t\t// } );\n\t\t// Note: Check the 'tabsselect' replaced with generic 'click' in baseview does not cause issue.\n\t\t// this.edit_view_tab.bind( 'tabsselect', function( e, ui ) {\n\t\t// \t$this.onTabIndexChange( e, ui );\n\t\t// } );\n\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.contentContainer */ .x.contentContainer().append( this.edit_view );\n\t\tthis.initRightClickMenu( RightClickMenuType.EDITVIEW );\n\n\t\tif ( this.is_viewing ) {\n\t\t\tLocalCacheData.current_doing_context_action = 'view';\n\t\t\tthis.buildViewUI();\n\t\t} else if ( this.is_edit ) {\n\t\t\tLocalCacheData.current_doing_context_action = 'edit';\n\t\t\tthis.buildEditViewUI();\n\t\t\tContextMenuManager.unmountContextMenu( this.determineContextMenuMountAttributes().id );\n\t\t\tthis.buildContextMenu( true );\n\t\t}\n\n\t\t$this.setEditViewTabHeight();\n\t}\n\n\tinitEditViewTabs() {\n\t\tvar $this = this;\n\t\tvar tab_options = {\n\t\t\tactivate: function( e, ui ) {\n\t\t\t\t$this.onTabShow( e, ui );\n\t\t\t}\n\t\t};\n\n\t\tsuper.initEditViewTabs( tab_options );\n\t}\n\n\tonEditClick( editId, noRefreshUI ) {\n\t\tthis.setCurrentEditViewState( 'edit' );\n\t\tthis.initEditViewUI( this.viewId, this.edit_view_tpl );\n\t\tthis.initEditView();\n\t\t//Clear last sent message body value.\n\t\tthis.edit_view_ui_dic.body.setValue( '' );\n\t\t//ensure send button is available\n\t\tthis.setEditMenu();\n\t}\n\n\tbuildViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_request': {\n\t\t\t\t'label': $.i18n._( 'Request' ),\n\t\t\t\t'html_template': this.getRequestTabHtml()\n\t\t\t},\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIRequest,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_request',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\n\n\t\t//Tab 0 first column start\n\t\tvar tab_request = this.edit_view_tab.find( '#tab_request' );\n\t\tvar tab_request_column1 = tab_request.find( '.first-column' );\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab_request_column1 );\n\n\t\t// Employee\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'full_name' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_request_column1 );\n\n\t\t// Type\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'type', set_empty: false } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_request_column1 );\n\n\t\t// Date\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'date_stamp' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_request_column1 );\n\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\n\t\t\t//Working Status\n\t\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\tform_item_input.TComboBox( { field: 'request_schedule_status_id', set_empty: false } );\n\t\t\tform_item_input.setSourceData( { 10: 'Working', 20: 'Absent' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_request_column1 );\n\t\t\tform_item_input.bind( 'change', function( e ) {\n\t\t\t\t$this.onWorkingStatusChanged();\n\t\t\t} );\n\n\t\t\t//Absence Policy\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIAbsencePolicy,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_absences',\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'absence_policy_id',\n\t\t\t\tcustomSearchFilter: function( filter ) {\n\t\t\t\t\treturn $this.setAbsencePolicyFilter( filter );\n\t\t\t\t},\n\t\t\t\tsetRealValueCallBack: function( value ) {\n\t\t\t\t\t// #2135 fix for cases where user is removed from absence policies between creating request and approval\n\t\t\t\t\t$this.selected_absence_policy_record = value;\n\t\t\t\t\t$this.onAvailableBalanceChange();\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Absence Policy' ), form_item_input, tab_request_column1 );\n\n\t\t\t//Available Balance\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'available_balance' } );\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box available-balance-h-box\\'></div>' );\n\t\t\tthis.available_balance_info = $( '<span class=\"available-balance-info tticon tticon-info_black_24dp\"></span>' );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\twidgetContainer.append( this.available_balance_info );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Available Balance' ), form_item_input, tab_request_column1, '', widgetContainer, true );\n\n\t\t\t//Start Date\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\t\tform_item_input.TDatePicker( { field: 'start_date' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_request_column1, '' );\n\n\t\t\t//End Date\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\t\tform_item_input.TDatePicker( { field: 'end_date' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_request_column1, '' );\n\n\t\t\t// Effective Days\n\t\t\tvar form_item_sun_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sun_checkbox.TCheckbox( { field: 'sun' } );\n\n\t\t\tvar form_item_mon_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_mon_checkbox.TCheckbox( { field: 'mon' } );\n\n\t\t\tvar form_item_tue_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_tue_checkbox.TCheckbox( { field: 'tue' } );\n\n\t\t\tvar form_item_wed_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_wed_checkbox.TCheckbox( { field: 'wed' } );\n\n\t\t\tvar form_item_thu_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_thu_checkbox.TCheckbox( { field: 'thu' } );\n\n\t\t\tvar form_item_fri_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_fri_checkbox.TCheckbox( { field: 'fri' } );\n\n\t\t\tvar form_item_sat_checkbox = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sat_checkbox.TCheckbox( { field: 'sat' } );\n\n\t\t\twidgetContainer = $( '<div></div>' );\n\n\t\t\tvar sun = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Sun' ) + ' <br> ' + ' </span>' );\n\t\t\tvar mon = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Mon' ) + ' <br> ' + ' </span>' );\n\t\t\tvar tue = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Tue' ) + ' <br> ' + ' </span>' );\n\t\t\tvar wed = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Wed' ) + ' <br> ' + ' </span>' );\n\t\t\tvar thu = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Thu' ) + ' <br> ' + ' </span>' );\n\t\t\tvar fri = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Fri' ) + ' <br> ' + ' </span>' );\n\t\t\tvar sat = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Sat' ) + ' <br> ' + ' </span>' );\n\n\t\t\tsun.append( form_item_sun_checkbox );\n\t\t\tmon.append( form_item_mon_checkbox );\n\t\t\ttue.append( form_item_tue_checkbox );\n\t\t\twed.append( form_item_wed_checkbox );\n\t\t\tthu.append( form_item_thu_checkbox );\n\t\t\tfri.append( form_item_fri_checkbox );\n\t\t\tsat.append( form_item_sat_checkbox );\n\n\t\t\twidgetContainer.append( sun );\n\t\t\twidgetContainer.append( mon );\n\t\t\twidgetContainer.append( tue );\n\t\t\twidgetContainer.append( wed );\n\t\t\twidgetContainer.append( thu );\n\t\t\twidgetContainer.append( fri );\n\t\t\twidgetContainer.append( sat );\n\n\t\t\twidgetContainer.addClass( 'request_edit_view_effective_days' );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Effective Days' ), [form_item_sun_checkbox, form_item_mon_checkbox, form_item_tue_checkbox, form_item_wed_checkbox, form_item_thu_checkbox, form_item_fri_checkbox, form_item_sat_checkbox], tab_request_column1, '', widgetContainer, false, true );\n\n\t\t\t//Start time\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'start_time' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'In' ), form_item_input, tab_request_column1 );\n\n\t\t\t//End time\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'end_time' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Out' ), form_item_input, tab_request_column1 );\n\n\t\t\t// Total\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'total_time' } );\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\tlabel = $( '<span class=\\'widget-right-label\\' id=\\'total_info\\'></span>' );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\twidgetContainer.append( label );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Total' ), form_item_input, tab_request_column1, '', widgetContainer );\n\n\t\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) && this.overlappingShiftUIValidate() == true ) {\n\t\t\t\t//Override / Split shift\n\t\t\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'overlap_type_id', set_empty: false } );\n\t\t\t\tform_item_input.setSourceData( this.overlap_type_array );\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box overlapping-shift-h-box\\'></div>' );\n\t\t\t\tthis.overlapping_shift_info = $( '<span style=\"position: relative; top: -3px; left: 3px;\" id=\"overlapping-shift-total\"></span><span id=\"overlapping-shift-icon\" class=\"overlapping-shift-info tticon tticon-info_black_24dp\"></span>' );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( this.overlapping_shift_info );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Overlapping Shift(s)' ), form_item_input, tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\t\tform_item_input.TCheckbox( { field: 'is_replace_with_open_shift' } );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'For Absences' ) + ' )</span>' );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( label );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Create Open Shift' ), form_item_input, tab_request_column1, '', widgetContainer, true );\n\n\t\t\t}\n\n\t\t\t//Schedule Policy\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_schedule',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'schedule_policy_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Schedule Policy' ), form_item_input, tab_request_column1 );\n\n\t\t\t//Branch\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'branch_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_request_column1 );\n\t\t\tif ( !this.show_branch_ui ) {\n\t\t\t\tthis.detachElement( 'branch_id' );\n\t\t\t}\n\n\t\t\t//Department\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'department_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_request_column1 );\n\t\t\tif ( !this.show_department_ui ) {\n\t\t\t\tthis.detachElement( 'department_id' );\n\t\t\t}\n\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 20 ) {\n\t\t\t\t//Job\n\t\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'job_id',\n\t\t\t\t\tadded_items: [\n\t\t\t\t\t\t{ value: '-1', label: _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.default_item */ .x.default_item },\n\t\t\t\t\t\t{ value: '-2', label: _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.selected_item */ .x.selected_item }\n\t\t\t\t\t]\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar job_coder = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( job_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_job_ui ) {\n\t\t\t\t\tthis.detachElement( 'job_id' );\n\t\t\t\t}\n\n\t\t\t\t//Job Item\n\t\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'job_item_id',\n\t\t\t\t\tadded_items: [\n\t\t\t\t\t\t{ value: '-1', label: _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.default_item */ .x.default_item },\n\t\t\t\t\t\t{ value: '-2', label: _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.selected_item */ .x.selected_item }\n\t\t\t\t\t]\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar job_item_coder = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( job_item_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_job_item_ui ) {\n\t\t\t\t\tthis.detachElement( 'job_item_id' );\n\t\t\t\t}\n\n\t\t\t\t//Punch Tag\n\t\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\t\tallow_multiple_selection: true,\n\t\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( ( punch_tags ) => {\n\t\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'punch_tag_id'\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar punch_tag_coder = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tpunch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );\n\t\t\t\tpunch_tag_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( punch_tag_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Punch Tags' ), [form_item_input, punch_tag_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_punch_tag_ui ) {\n\t\t\t\t\tthis.detachElement( 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tEmbeddedMessage.initUI( this, tab_request );\n\t}\n\n\tsetAbsencePolicyFilter( filter ) {\n\t\tif ( !filter.filter_data ) {\n\t\t\tfilter.filter_data = {};\n\t\t}\n\t\tfilter.filter_data.user_id = this.current_edit_record.user_id;\n\n\t\tif ( filter.filter_columns ) {\n\t\t\tfilter.filter_columns.absence_policy = true;\n\t\t}\n\t\treturn filter;\n\t}\n\n\tneedShowNavigation() {\n\t\tif ( this.is_viewing && this.current_edit_record && _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record.id ) && this.current_edit_record.id ) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tonNavigationClick( iconName ) {\n\n\t\tvar $this = this;\n\t\tvar filter;\n\t\tvar temp_filter;\n\t\tvar grid_selected_id_array;\n\t\tvar grid_selected_length;\n\n\t\tvar selectedId;\n\t\t/* jshint ignore:start */\n\t\tswitch ( iconName ) {\n\t\t\tcase 'timesheet':\n\t\t\t\tfilter = { filter_data: {} };\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record ) ) {\n\n\t\t\t\t\tfilter.user_id = this.current_edit_record.user_id ? this.current_edit_record.user_id : LocalCacheData.loginUser.id;\n\t\t\t\t\tfilter.base_date = this.current_edit_record.date_stamp;\n\n\t\t\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.addViewTab */ .x.addViewTab( $this.viewId, $.i18n._( 'Authorization - Request' ), window.location.href );\n\t\t\t\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\n\t\t\t\t} else {\n\t\t\t\t\ttemp_filter = {};\n\t\t\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t\t\tgrid_selected_length = grid_selected_id_array.length;\n\n\t\t\t\t\tif ( grid_selected_length > 0 ) {\n\t\t\t\t\t\tselectedId = grid_selected_id_array[0];\n\n\t\t\t\t\t\ttemp_filter.filter_data = {};\n\t\t\t\t\t\ttemp_filter.filter_columns = { user_id: true, date_stamp: true };\n\t\t\t\t\t\ttemp_filter.filter_data.id = [selectedId];\n\n\t\t\t\t\t\tthis.api['get' + this.api.key_name]( temp_filter, {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\t\t\tif ( !result_data ) {\n\t\t\t\t\t\t\t\t\tresult_data = [];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresult_data = result_data[0];\n\n\t\t\t\t\t\t\t\tfilter.user_id = result_data.user_id;\n\t\t\t\t\t\t\t\tfilter.base_date = result_data.date_stamp;\n\t\t\t\t\t\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.addViewTab */ .x.addViewTab( $this.viewId, $.i18n._( 'Authorization - Request' ), window.location.href );\n\t\t\t\t\t\t\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'edit_employee':\n\t\t\t\tfilter = { filter_data: {} };\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record ) ) {\n\t\t\t\t\tIndexViewController.openEditView( this, 'Employee', this.current_edit_record.user_id ? this.current_edit_record.user_id : LocalCacheData.loginUser.id );\n\t\t\t\t} else {\n\t\t\t\t\ttemp_filter = {};\n\t\t\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t\t\tgrid_selected_length = grid_selected_id_array.length;\n\n\t\t\t\t\tif ( grid_selected_length > 0 ) {\n\t\t\t\t\t\tselectedId = grid_selected_id_array[0];\n\n\t\t\t\t\t\ttemp_filter.filter_data = {};\n\t\t\t\t\t\ttemp_filter.filter_columns = { user_id: true };\n\t\t\t\t\t\ttemp_filter.filter_data.id = [selectedId];\n\n\t\t\t\t\t\tthis.api['get' + this.api.key_name]( temp_filter, {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\t\t\tif ( !result_data ) {\n\t\t\t\t\t\t\t\t\tresult_data = [];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresult_data = result_data[0];\n\n\t\t\t\t\t\t\t\tIndexViewController.openEditView( $this, 'Employee', result_data.user_id );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\n\t\t\t\tfilter = { filter_data: {} };\n\n\t\t\t\tvar include_users = null;\n\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.current_edit_record ) ) {\n\n\t\t\t\t\tinclude_users = [this.current_edit_record.user_id ? this.current_edit_record.user_id : LocalCacheData.loginUser.id];\n\t\t\t\t\tfilter.filter_data.include_user_ids = { value: include_users };\n\t\t\t\t\tfilter.select_date = this.current_edit_record.date_stamp;\n\n\t\t\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.addViewTab */ .x.addViewTab( $this.viewId, $.i18n._( 'Authorization - Request' ), window.location.href );\n\t\t\t\t\tIndexViewController.goToView( 'Schedule', filter );\n\n\t\t\t\t} else {\n\t\t\t\t\ttemp_filter = {};\n\t\t\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t\t\tgrid_selected_length = grid_selected_id_array.length;\n\n\t\t\t\t\tif ( grid_selected_length > 0 ) {\n\t\t\t\t\t\tselectedId = grid_selected_id_array[0];\n\n\t\t\t\t\t\ttemp_filter.filter_data = {};\n\t\t\t\t\t\ttemp_filter.filter_columns = { user_id: true, date_stamp: true };\n\t\t\t\t\t\ttemp_filter.filter_data.id = [selectedId];\n\n\t\t\t\t\t\tthis.api['get' + this.api.key_name]( temp_filter, {\n\t\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\t\t\t\t\tif ( !result_data ) {\n\t\t\t\t\t\t\t\t\tresult_data = [];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresult_data = result_data[0];\n\n\t\t\t\t\t\t\t\tinclude_users = [result_data.user_id];\n\n\t\t\t\t\t\t\t\tfilter.filter_data.include_user_ids = include_users;\n\t\t\t\t\t\t\t\tfilter.select_date = result_data.date_stamp;\n\n\t\t\t\t\t\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.addViewTab */ .x.addViewTab( $this.viewId, $.i18n._( 'Authorization - Request' ), window.location.href );\n\t\t\t\t\t\t\t\tIndexViewController.goToView( 'Schedule', filter );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* jshint ignore:end */\n\t}\n\n\tinitPermission() {\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\n\t\t// Error: Uncaught TypeError: (intermediate value).isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled is not a function on line 207\n\t\tvar company_api = TTAPI.APICompany;\n\t\tif ( company_api && _.isFunction( company_api.isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled ) ) {\n\t\t\tvar result = company_api.isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled( { async: false } ).getResult();\n\t\t}\n\n\t\tif ( !result ) {\n\t\t\tthis.show_branch_ui = false;\n\t\t\tthis.show_department_ui = false;\n\t\t\tthis.show_job_ui = false;\n\t\t\tthis.show_job_item_ui = false;\n\t\t\tthis.show_punch_tag_ui = false;\n\t\t} else {\n\t\t\tif ( !result.branch ) {\n\t\t\t\tthis.show_branch_ui = false;\n\t\t\t}\n\n\t\t\tif ( !result.department ) {\n\t\t\t\tthis.show_department_ui = false;\n\t\t\t}\n\n\t\t\tif ( !result.job ) {\n\t\t\t\tthis.show_job_ui = false;\n\t\t\t}\n\n\t\t\tif ( !result.job_item ) {\n\t\t\t\tthis.show_job_item_ui = false;\n\t\t\t}\n\n\t\t\tif ( !result.punch_tag ) {\n\t\t\t\tthis.show_punch_tag_ui = false;\n\t\t\t}\n\t\t}\n\n\t}\n\n\tsetEditMenuEditIcon( context_btn ) {\n\t\tif ( !this.editPermissionValidate( 'request' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\t//If edit_child is FALSE and this is a child record, inputs should be read-only.\n\t\tif ( this.editOwnerOrChildPermissionValidate( 'request' ) ) {\n\t\t\tthis.enable_edit_view_ui = true;\n\t\t} else {\n\t\t\tthis.enable_edit_view_ui = false;\n\t\t}\n\n\t\tif ( !this.editOwnerOrChildPermissionValidate( 'request' ) || this.is_add || this.is_edit ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tgetOverlappingShifts() {\n\t\tlet $this = this;\n\n\t\tif ( !this.current_edit_record || !this.current_edit_record.type_id ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//Do not get overlapping shifts if user does not have schedule permissions, is on a lower product edition or request is not a schedule change.\n\t\tif ( this.overlappingShiftUIValidate() == false || ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() < 15 ) || ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) == false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet data = {};\n\t\tdata.start_date = this.current_edit_record.start_date;\n\t\tdata.end_date = this.current_edit_record.end_date;\n\t\tdata.user_id = this.current_edit_record.user_id;\n\t\tdata.start_time = this.current_edit_record.start_time;\n\t\tdata.end_time = this.current_edit_record.end_time;\n\n\t\tdata.overlap_type_id = this.current_edit_record.overlap_type_id;\n\n\t\tdata.schedule_policy_id = this.current_edit_record.schedule_policy_id;\n\t\tdata.absence_policy_id = this.current_edit_record.absence_policy_id;\n\t\tdata.request_schedule_status_id = this.current_edit_record.request_schedule_status_id;\n\n\t\tdata.requested_days = {};\n\n\t\tdata.requested_days[0] = this.current_edit_record.sun;\n\t\tdata.requested_days[1] = this.current_edit_record.mon;\n\t\tdata.requested_days[2] = this.current_edit_record.tue;\n\t\tdata.requested_days[3] = this.current_edit_record.wed;\n\t\tdata.requested_days[4] = this.current_edit_record.thu;\n\t\tdata.requested_days[5] = this.current_edit_record.fri;\n\t\tdata.requested_days[6] = this.current_edit_record.sat;\n\n\t\tdata.is_replace_with_open_shift = this.current_edit_record.is_replace_with_open_shift;\n\n\t\tthis.schedule_api.getOverlappingShifts( data, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tlet result_data = result.getResult();\n\n\t\t\t\tif ( !result_data || !result_data.split ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$this.overlapping_shift_data = result_data;\n\n\t\t\t\t$this.buildOverlappingShiftInfo();\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildOverlappingShiftInfo() {\n\t\tlet $this = this;\n\n\t\tif ( !this.current_edit_record ) {\n\t\t\t//Issue #3216 - Error: Uncaught TypeError: Cannot read properties of null (reading 'overlap_type_id')\n\t\t\t//This could happen under race conditions or opening a request and then quickly closing it when experiencing latency.\n\t\t\treturn;\n\t\t}\n\n\t\tlet overlapping_shifts_html = '';\n\t\tlet split_shifts = this.overlapping_shift_data['split'];\n\t\tlet shifts_after = 0;\n\t\tlet shifts_before = 0;\n\t\tlet shifts_after_total_time = 0;\n\t\tlet shifts_before_total_time = 0;\n\n\t\tlet suggested_overlap_type_id = 10; //Replace\n\n\t\tshifts_after = this.overlapping_shift_data['no_overlap'].length;\n\t\tshifts_after_total_time += this.overlapping_shift_data['no_overlap'].reduce( ( a, b ) => parseFloat( a ) + parseFloat( b.total_time ), 0 );\n\t\tif ( this.current_edit_record.overlap_type_id == 10 ) { //Replace\n\t\t\tshifts_after += this.overlapping_shift_data['open_replaced'].length;\n\t\t\tshifts_after_total_time += this.overlapping_shift_data['open_replaced'].reduce( ( a, b ) => parseFloat( a ) + parseFloat( b.total_time ), 0 );\n\t\t} else if ( this.current_edit_record.overlap_type_id == 20 ) { //Split\n\t\t\tshifts_after += split_shifts.length;\n\t\t\tshifts_after_total_time += split_shifts.reduce( ( a, b ) => a + b.total_time, 0 );\n\t\t}\n\t\tif ( this.current_edit_record.is_replace_with_open_shift == true ) {\n\t\t\tshifts_after += this.overlapping_shift_data['open_replaced'].length;\n\t\t\tshifts_after_total_time += this.overlapping_shift_data['open_replaced'].reduce( ( a, b ) => parseFloat( a ) + parseFloat( b.total_time ), 0 );\n\t\t}\n\t\tshifts_before = this.overlapping_shift_data['original'].filter( shift => !shift.not_unique && !shift.do_not_split ).length;\n\t\tshifts_before_total_time = this.overlapping_shift_data['original'].filter( shift => !shift.not_unique && !shift.do_not_split ).reduce( ( a, b ) => parseFloat( a ) + parseFloat( b.total_time ), 0 );\n\t\t$( '#overlapping-shift-total' ).text( '( ' + shifts_before + ' / ' + shifts_after + ' )' );\n\t\t//Group modified shifts by parent (specific starting shift)\n\t\tif ( Array.isArray( split_shifts ) ) {\n\t\t\tlet shift_data_map = {};\n\t\t\tfor ( let i = 0; i < split_shifts.length; i++ ) {\n\t\t\t\tif ( split_shifts[i].split_state === 'no_split' ) {\n\t\t\t\t\t//No change to this shift.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( !shift_data_map[split_shifts[i].split_parent] ) {\n\t\t\t\t\tshift_data_map[split_shifts[i].split_parent] = [];\n\t\t\t\t}\n\t\t\t\tshift_data_map[split_shifts[i].split_parent].push( split_shifts[i] );\n\n\t\t\t\t//Check if split overlaps < 50% of parent (original) shift. Only check if split is not already suggested.\n\t\t\t\tif ( suggested_overlap_type_id == 10 ) { //Replace\n\t\t\t\t\tlet parent_shift = this.overlapping_shift_data['original'].find( shift => shift.id === split_shifts[i].split_parent );\n\t\t\t\t\tif ( parent_shift ) {\n\t\t\t\t\t\tlet split_shift_percent = ( parseFloat( split_shifts[i].total_time ) / parseFloat( parent_shift.total_time ) ) * 100;\n\t\t\t\t\t\tif ( split_shift_percent < 50 ) {\n\t\t\t\t\t\t\tsuggested_overlap_type_id = 20; //Split\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toverlapping_shifts_html += '<table class=\"overlapping-info-table\">';\n\n\t\t\tif ( this.current_edit_record.overlap_type_id != suggested_overlap_type_id ) {\n\t\t\t\tlet suggested_overlap_label = suggested_overlap_type_id == 10 ? $.i18n._( 'Replace' ) : $.i18n._( 'Split' );\n\t\t\t\toverlapping_shifts_html += '<tr><th colspan=\"3\" style=\"text-align: center; color: red;\">' + $.i18n._( 'Suggested Overlapping Shift(s) Mode' ) + ': <strong>' + suggested_overlap_label + '</strong></th></tr>';\n\t\t\t\t//Make the overlapping icon red if the suggested overlap type is different from the current selected overlap type.\n\t\t\t\t//This is to draw the users' attention.\n\t\t\t\t$( '#overlapping-shift-icon' ).css( 'color', 'red' );\n\t\t\t} else {\n\t\t\t\t$( '#overlapping-shift-icon' ).css( 'color', '' );\n\t\t\t}\n\n\t\t\tif ( this.current_edit_record.overlap_type_id == 20 && split_shifts.length > 0 ) {\n\t\t\t\toverlapping_shifts_html += '<th colspan=\"3\" style=\"text-align: center\">' + $.i18n._( 'Overlapping Shifts' ) + '</th></tr>';\n\t\t\t} else if ( this.current_edit_record.overlap_type_id == 10 && this.overlapping_shift_data['open_replaced'].length > 0 ) {\n\t\t\t\toverlapping_shifts_html += '<tr><th colspan=\"3\" style=\"text-align: center\">' + $.i18n._( 'Replaced Shifts' ) + '</th></tr>';\n\t\t\t}\n\n\t\t\tif ( _.size( shift_data_map ) > 0 ) {\n\t\t\t\toverlapping_shifts_html += this.getOverlappingShiftHeaderHtml();\n\t\t\t}\n\n\t\t\tfor ( let shift_data in shift_data_map ) {\n\t\t\t\tlet parent_data = this.overlapping_shift_data['original'].find( shift => shift.id === shift_data_map[shift_data][0].split_parent );\n\t\t\t\toverlapping_shifts_html += '<tr>';\n\t\t\t\toverlapping_shifts_html += '<td>' + parent_data.start_date + '</td>';\n\t\t\t\toverlapping_shifts_html += '<td>' + parent_data.start_time + ' - ' + parent_data.end_time + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( parent_data.total_time ) + '</td>';\n\n\t\t\t\tlet table_row_break = false;\n\t\t\t\tfor ( let i = 0; i < shift_data_map[shift_data].length; i++ ) {\n\t\t\t\t\tif ( this.current_edit_record.overlap_type_id == 20 || ( shift_data_map[shift_data][i].split_state === 'new' || shift_data_map[shift_data][i].split_state === 'replaced' ) ) { //Split\n\t\t\t\t\t\tif ( table_row_break === true ) {\n\t\t\t\t\t\t\toverlapping_shifts_html += '</tr>';\n\t\t\t\t\t\t\toverlapping_shifts_html += '<tr>';\n\t\t\t\t\t\t\toverlapping_shifts_html += '<td>' + shift_data_map[shift_data][i].start_date + '</td>';\n\t\t\t\t\t\t\toverlapping_shifts_html += '<td></td>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet modified_label = shift_data_map[shift_data][i].split_state === 'new' ? $.i18n._( 'New' ) : $.i18n._( 'Modified' );\n\t\t\t\t\t\tlet cell_class = shift_data_map[shift_data][i].is_absence ? 'overlap-absence' : '';\n\t\t\t\t\t\toverlapping_shifts_html += '<td class =\"' + cell_class + '\">' + shift_data_map[shift_data][i].start_time + ' - ' + shift_data_map[shift_data][i].end_time + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( shift_data_map[shift_data][i].total_time ) + ' [' + modified_label + '] </td>';\n\t\t\t\t\t\tif ( table_row_break === true ) {\n\t\t\t\t\t\t\toverlapping_shifts_html += '</tr>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttable_row_break = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toverlapping_shifts_html += '</tr>';\n\t\t\t}\n\n\t\t\tif ( Array.isArray( this.overlapping_shift_data['no_overlap'] ) && this.overlapping_shift_data['no_overlap'].length > 0 ) {\n\t\t\t\toverlapping_shifts_html += '<tr style=\"border-bottom: 15px solid transparent;\"></tr>'; //blank row for spacing\n\t\t\t\toverlapping_shifts_html += '<tr><th colspan=\"3\" style=\"text-align: center\">' + $.i18n._( 'New Shifts (Not Overlapping)' ) + '</th></tr>';\n\n\t\t\t\tif ( _.size( shift_data_map ) === 0 ) {\n\t\t\t\t\toverlapping_shifts_html += this.getOverlappingShiftHeaderHtml();\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < this.overlapping_shift_data['no_overlap'].length; i++ ) {\n\t\t\t\t\tlet tr_class = this.current_edit_record.request_schedule_status_id == 20 ? 'overlap-absence' : '';\n\t\t\t\t\toverlapping_shifts_html += '<tr class=\"' + tr_class + '\">';\n\t\t\t\t\toverlapping_shifts_html += '<td>' + this.overlapping_shift_data['no_overlap'][i].start_date + '</td>';\n\t\t\t\t\toverlapping_shifts_html += '<td></td>';\n\t\t\t\t\toverlapping_shifts_html += '<td>' + this.overlapping_shift_data['no_overlap'][i].start_time + ' - ' + this.overlapping_shift_data['no_overlap'][i].end_time + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( this.overlapping_shift_data['no_overlap'][i].total_time ) + '</td>';\n\t\t\t\t\toverlapping_shifts_html += '<tr>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( this.current_edit_record.is_replace_with_open_shift == true && Array.isArray( this.overlapping_shift_data['open_replaced'] ) && this.overlapping_shift_data['open_replaced'].length > 0 ) {\n\t\t\t\toverlapping_shifts_html += '<tr style=\"border-bottom: 15px solid transparent;\"></tr>'; //blank row for spacing\n\t\t\t\toverlapping_shifts_html += '<tr><th colspan=\"3\" style=\"text-align: center\">' + $.i18n._( 'New Open Shifts' ) + '</th></tr>';\n\t\t\t\tfor ( let i = 0; i < this.overlapping_shift_data['open_replaced'].length; i++ ) {\n\t\t\t\t\toverlapping_shifts_html += '<tr>';\n\t\t\t\t\toverlapping_shifts_html += '<td>' + this.overlapping_shift_data['open_replaced'][i].start_date + '</td>';\n\t\t\t\t\toverlapping_shifts_html += '<td></td>';\n\t\t\t\t\toverlapping_shifts_html += '<td>' + this.overlapping_shift_data['open_replaced'][i].start_time + ' - ' + this.overlapping_shift_data['open_replaced'][i].end_time + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( this.overlapping_shift_data['open_replaced'][i].total_time ) + '</td>';\n\t\t\t\t\toverlapping_shifts_html += '<tr>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( this.overlapping_shift_data['original'].length > 0 || this.overlapping_shift_data['no_overlap'].length > 0 ) {\n\t\t\t\toverlapping_shifts_html += '<tr style=\"border-bottom: 15px solid transparent;\"></tr>'; //blank row for spacing\n\t\t\t\toverlapping_shifts_html += '<tr style=\"text-align: center\"> <th>' + $.i18n._( 'Total Shifts' ) + '</th><th>' + shifts_before + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( shifts_before_total_time ) + '</th> <th>' + shifts_after + ' = ' + _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getTimeUnit */ .x.getTimeUnit( shifts_after_total_time ) + '</th></tr>';\n\t\t\t} else {\n\t\t\t\toverlapping_shifts_html += '<tr><th colspan=\"3\" style=\"text-align: center\">' + $.i18n._( 'No New or Overlapping Shifts' ) + '</th>' + overlapping_shifts_html + '</tr>';\n\t\t\t}\n\n\t\t\toverlapping_shifts_html += '</table>';\n\t\t}\n\n\t\tif ( $this.overlapping_shift_info ) {\n\t\t\t$this.overlapping_shift_info.qtip( {\n\t\t\t\tshow: {\n\t\t\t\t\tevent: 'click',\n\t\t\t\t\tdelay: 10,\n\t\t\t\t\teffect: true\n\t\t\t\t},\n\t\t\t\thide: {\n\t\t\t\t\tevent: ['unfocus click'],\n\t\t\t\t},\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: 525, //Dynamically changing the width causes display bugs when switching between Absence Policies and thereby widths.\n\t\t\t\t\tclasses: 'overlapping-info-display'\n\t\t\t\t},\n\t\t\t\tcontent: overlapping_shifts_html,\n\t\t\t} );\n\t\t}\n\t}\n\n\tgetOverlappingShiftHeaderHtml() {\n\t\treturn `<tr>\n\t\t\t\t\t<th style=\"text-align: center\">` + $.i18n._( 'Date' ) + `</th>\n\t\t\t\t\t<th style=\"text-align: center\">` + $.i18n._( 'Before' ) + `</th>\n\t\t\t\t\t<th style=\"text-align: center\">` + $.i18n._( 'After' ) + `</th>\n\t\t\t\t</tr>\n\t\t\t\t`;\n\t}\n\n\t// Creates the record shipped to the API at setMesssage\n\tuniformMessageVariable( records ) {\n\t\tvar msg = {};\n\n\t\tmsg.subject = this.edit_view_ui_dic['subject'].getValue();\n\t\tmsg.body = this.edit_view_ui_dic['body'].getValue();\n\t\tmsg.object_id = this.current_edit_record['id'];\n\t\tmsg.object_type_id = 50;\n\n\t\treturn msg;\n\t}\n\n\tgetRequestTabHtml() {\n\t\treturn `\n\t\t<div id=\"tab_request\" class=\"edit-view-tab-outside\">\n\t\t\t<div class=\"edit-view-tab\" id=\"tab_request_content_div\">\n\t\t\t\t<div class=\"first-column full-width-column\"></div>\n\t\t\t\t<div class=\"authorization-grid-div inside-grid full-width-column\">\n\t\t\t\t\t<div class=\"grid-top-border\"></div>\n\t\t\t\t\t<div class=\"grid-title separated-box\"></div>\n\t\t\t\t\t<table id=\"grid\"></table>\n\t\t\t\t\t<div class=\"bottom-div\">\n\t\t\t\t\t\t<div class=\"grid-bottom-border\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"separate full-width-column\"></div>\n\t\t\t\t<div class=\"second-column embedded-message-template full-width-column\" style=\"margin-left: 0\"></div>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTs7QUFFQTtBQUNBLGlGQUFpRixVQUFVO0FBQzNGLG1GQUFtRixDQUFDO0FBQ3BGLHFCQUFxQix5REFBeUQ7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsaUxBQWlMLG1GQUFrQjtBQUNuTTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpRkFBaUYsVUFBVTtBQUMzRix3RUFBd0UsQ0FBQyxrRUFBa0UsbUZBQWtCLHFFQUFxRSxtRkFBa0I7QUFDcFAsS0FBSztBQUNMLG1GQUFtRixDQUFDO0FBQ3BGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxDQUFDO0FBQ3pDLHdDQUF3QyxDQUFDO0FBQ3pDLHdDQUF3QyxDQUFDO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2ludGVyZmFjZS9odG1sNS92aWV3cy9jb21tb24vUmVxdWVzdFZpZXdDb21tb25Db250cm9sbGVyLmpzPzVmNjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnQC9nbG9iYWwvR2xvYmFsJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RWaWV3Q29tbW9uQ29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0YXV0aG9yaXphdGlvbl9oaXN0b3J5OiBudWxsLFxuXHRcdFx0c2VsZWN0ZWRfYWJzZW5jZV9wb2xpY3lfcmVjb3JkOiBudWxsLFxuXHRcdFx0ZW5hYmxlX2VkaXRfdmlld191aTogZmFsc2Vcblx0XHR9ICk7XG5cblx0XHRzdXBlciggb3B0aW9ucyApO1xuXHR9XG5cblx0c2V0R3JpZENlbGxCYWNrR3JvdW5kKCkge1xuXHRcdC8vRXJyb3I6IFVuYWJsZSB0byBnZXQgcHJvcGVydHkgJ2dldEdyaWRQYXJhbScgb2YgdW5kZWZpbmVkIG9yIG51bGwgcmVmZXJlbmNlXG5cdFx0aWYgKCAhdGhpcy5ncmlkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhID0gdGhpcy5ncmlkLmdldEdyaWRQYXJhbSggJ2RhdGEnICk7XG5cdFx0Ly9FcnJvcjogVHlwZUVycm9yOiBkYXRhIGlzIHVuZGVmaW5lZCBpbiAvaW50ZXJmYWNlL2h0bWw1L2ZyYW1ld29yay9qcXVlcnkubWluLmpzP3Y9Ny40LjYtMjAxNDEwMjctMDc0MTI3IGxpbmUgMiA+IGV2YWwgbGluZSA3MFxuXHRcdGlmICggIWRhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIGl0ZW0gPSBkYXRhW2ldO1xuXG5cdFx0XHRpZiAoIGl0ZW0uc3RhdHVzX2lkID09IDMwICkge1xuXHRcdFx0XHQkKCAndHIjJyArIGl0ZW0uaWQgKS5hZGRDbGFzcyggJ2JvbGRlci1yZXF1ZXN0JyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG9uQ2FuY2VsQ2xpY2soIGZvcmNlLCBjYW5jZWxfYWxsLCBjYWxsYmFjayApIHtcblx0XHRUVFByb21pc2UuYWRkKCAnYmFzZScsICdvbkNhbmNlbENsaWNrJyApO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHQvLyMyNTcxIC0gVW5hYmxlIHRvIGdldCBwcm9wZXJ0eSAnaWQnIG9mIHVuZGVmaW5lZCBvciBudWxsIHJlZmVyZW5jZVxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdHZhciAkcmVjb3JkX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXHRcdH1cblxuXHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnY2FuY2VsJztcblx0XHRpZiAoIHRoaXMuaXNfY2hhbmdlZCAmJiAhZm9yY2UgKSB7XG5cdFx0XHRUQWxlcnRNYW5hZ2VyLnNob3dDb25maXJtQWxlcnQoIEdsb2JhbC5tb2RpZnlfYWxlcnRfbWVzc2FnZSwgbnVsbCwgZnVuY3Rpb24oIGZsYWcgKSB7XG5cblx0XHRcdFx0aWYgKCBmbGFnID09PSB0cnVlICkge1xuXHRcdFx0XHRcdGRvTmV4dCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9OZXh0KCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZG9OZXh0KCkge1xuXHRcdFx0aWYgKCAhJHRoaXMuZWRpdF92aWV3ICYmICR0aGlzLnBhcmVudF92aWV3X2NvbnRyb2xsZXIgJiYgJHRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdFx0JHRoaXMucGFyZW50X3ZpZXdfY29udHJvbGxlci5pc19jaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdCR0aGlzLnBhcmVudF92aWV3X2NvbnRyb2xsZXIuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdFx0XHQkdGhpcy5wYXJlbnRfdmlld19jb250cm9sbGVyLm9uQ2FuY2VsQ2xpY2soKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCAkdGhpcy5pc19lZGl0ICYmICRyZWNvcmRfaWQgKSB7XG5cdFx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLnVubW91bnRDb250ZXh0TWVudSggJHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCApO1xuXHRcdFx0XHRcdCR0aGlzLnNldEN1cnJlbnRFZGl0Vmlld1N0YXRlKCAndmlldycgKTtcblx0XHRcdFx0XHQkdGhpcy5vblZpZXdDbGljayggJHJlY29yZF9pZCwgdHJ1ZSApO1xuXHRcdFx0XHRcdCR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMucmVtb3ZlRWRpdFZpZXcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7IC8vUmVmcmVzaCB0aGUgZ3JpZCwgYXMgd2UgZG9uJ3QgZG8gdGhhdCBkdXJpbmcgYXV0aG9yaXplL2RlY2xpbmUgY2xpY2tzIGFueW1vcmUuXG5cblx0XHRcdEdsb2JhbC5zZXRVSUluaXRDb21wbGV0ZSgpO1xuXHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cblx0XHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnYmFzZScsICdvbkNhbmNlbENsaWNrJyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRvdmVybGFwcGluZ1NoaWZ0VUlWYWxpZGF0ZSgpIHtcblx0XHQvL1NhbWUgcGVybWlzc2lvbnMgYXMgQVBJU2NoZWR1bGUtPmdldE92ZXJsYXBwaW5nU2hpZnRzKClcblx0XHRpZiAoICFQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3NjaGVkdWxlJywgJ2VuYWJsZWQnIClcblx0XHRcdHx8ICEoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnc2NoZWR1bGUnLCAndmlldycgKSB8fCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3NjaGVkdWxlJywgJ3ZpZXdfb3duJyApIHx8IFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnc2NoZWR1bGUnLCAndmlld19jaGlsZCcgKSApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0b25DbG9zZUljb25DbGljaygpIHtcblx0XHR0aGlzLm9uQ2FuY2VsQ2xpY2soKTtcblx0fVxuXG5cdGJ1aWxkRGF0YUZvckFQSSggZGF0YSApIHtcblx0XHRpZiAoIHRoaXMudmlld0lkID09ICdSZXF1ZXN0QXV0aG9yaXphdGlvbicgJiYgKCAhZGF0YS5yZXF1ZXN0X3NjaGVkdWxlX2lkIHx8IGRhdGEucmVxdWVzdF9zY2hlZHVsZV9pZCA8PSAwICkgKSB7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHR2YXIgdXNlcl9pZCA9IExvY2FsQ2FjaGVEYXRhLmxvZ2luVXNlci5pZDtcblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQgKSApIHtcblx0XHRcdHVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblx0XHR9XG5cdFx0dmFyIGRhdGFfZm9yX2FwaSA9IHsgJ3VzZXJfaWQnOiB1c2VyX2lkIH07XG5cdFx0dmFyIHJlcXVlc3Rfc2NoZWR1bGUgPSB7fTtcblxuXHRcdHZhciByZXF1ZXN0X3NjaGVkdWxlX2tleXMgPSAnJztcblxuXHRcdHZhciBhZm4gPSB0aGlzLmdldEFkdmFuY2VkRmllbGROYW1lcygpO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRpZiAoIGtleSA9PSAnc3RhcnRfZGF0ZScgJiYgdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0gKSB7XG5cdFx0XHRcdGRhdGFfZm9yX2FwaS5kYXRlX3N0YW1wID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uZ2V0VmFsdWUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhZm4uaW5kZXhPZigga2V5ICkgPiAtMSApIHtcblx0XHRcdFx0aWYgKCBrZXkgPT0gJ3JlcXVlc3Rfc2NoZWR1bGVfaWQnICkge1xuXHRcdFx0XHRcdHJlcXVlc3Rfc2NoZWR1bGVbJ2lkJ10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucmVxdWVzdF9zY2hlZHVsZV9pZDtcblx0XHRcdFx0fSBlbHNlIGlmICgga2V5ID09ICdyZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCcgKSB7XG5cdFx0XHRcdFx0Ly90aGlzIGNhc2UgaXMgZm9yIHdoZW4gYXNraW5nIGZvciBkZWZhdWx0IGRhdGFcblx0XHRcdFx0XHRyZXF1ZXN0X3NjaGVkdWxlWydzdGF0dXNfaWQnXSA9IHRoaXMuZWRpdF92aWV3X3VpX2RpYy5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XSApIHtcblx0XHRcdFx0XHRyZXF1ZXN0X3NjaGVkdWxlW2tleV0gPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT0gJ2F2YWlsYWJsZV9iYWxhbmNlJyB8fCBrZXkgPT0gJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCcgfHwga2V5ID09ICdqb2JfcXVpY2tfc2VhcmNoJyApIHtcblx0XHRcdFx0Ly9pZ25vcmUuIHRoZXNlIGZpZWxkcyBkbyBub3QgbmVlZCB0byBiZSBzYXZlZCBhbmQgYnJlYWsgdGhlIGluc2VydCBzcWwuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhX2Zvcl9hcGlba2V5XSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vVGhlcmUgaXMgYSBjYXNlIHdoZXJlIGEgcmVndWxhciBlbXBsb3llZSBoYXMgYWNjZXNzIHRvIHN1Ym1pdCBhZHZhbmNlZCByZXF1ZXN0cywgYnV0IHRoZSBzdXBlcnZpc29yIGRvZXMgbm90LlxuXHRcdC8vIEluIHRoYXQgY2FzZSB3ZSBzdGlsbCBuZWVkIHRvIGFsbG93IGFkdmFuY2VkIHJlcXVlc3RzIGZvciBhdXRob3JpemF0aW9uLlxuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgJiYgKCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3JlcXVlc3QnLCAnYWRkX2FkdmFuY2VkJyApIHx8IEdsb2JhbC5pc0VtcHR5KCByZXF1ZXN0X3NjaGVkdWxlICkgPT0gZmFsc2UgKSAmJiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDMwIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDQwICkgKSB7XG5cdFx0XHRkYXRhX2Zvcl9hcGkucmVxdWVzdF9zY2hlZHVsZSA9IHJlcXVlc3Rfc2NoZWR1bGU7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhX2Zvcl9hcGk7XG5cdH1cblxuXHRidWlsZERhdGFGcm9tQVBJKCBkYXRhICkge1xuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBkYXRhICkgJiYgR2xvYmFsLmlzU2V0KCBkYXRhLnJlcXVlc3Rfc2NoZWR1bGUgKSApIHtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gZGF0YS5yZXF1ZXN0X3NjaGVkdWxlICkge1xuXHRcdFx0XHRpZiAoIGtleSA9PSAnaWQnICkge1xuXHRcdFx0XHRcdGRhdGFbJ3JlcXVlc3Rfc2NoZWR1bGVfaWQnXSA9IGRhdGEucmVxdWVzdF9zY2hlZHVsZS5pZDtcblx0XHRcdFx0fSBlbHNlIGlmICgga2V5ID09ICdzdGF0dXNfaWQnICkge1xuXHRcdFx0XHRcdGRhdGFbJ3JlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkJ10gPSBkYXRhLnJlcXVlc3Rfc2NoZWR1bGUuc3RhdHVzX2lkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgKCBkYXRhW2tleV0gKSA9PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdFx0XHRkYXRhW2tleV0gPSBkYXRhLnJlcXVlc3Rfc2NoZWR1bGVba2V5XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL0RlYnVnLlRleHQoJ05vdCBvdmVyd3JpdGluZzogJytrZXkrJyByZXF1ZXN0X3NjaGVkdWxlOiAnK2RhdGEucmVxdWVzdF9zY2hlZHVsZVtrZXldKycgcmVxdWVzdDogJytkYXRhW2tleV0sICdSZXF1ZXN0Vmlld0NvbW1vbkNvbnRyb2xsZXIuanMnLCAnUmVxdWVzdFZpZXdDb21tb25Db250cm9sbGVyJywnYnVpbGREYXRhRnJvbUFQSScgLDEwKVxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBkYXRhLnJlcXVlc3Rfc2NoZWR1bGU7XG5cdFx0XHR0aGlzLnByZV9yZXF1ZXN0X3NjaGVkdWxlID0gZmFsc2U7IC8vaXMgdGhpcyBhIHJlcXVlc3QgZnJvbSBiZWZvcmUgcmVxdWVzdCBzY2hlZHVsZSB3YXMgYWRkZWQ/IHdlIG5lZWQgdG8ga25vdyBpZiB0aGlzIGlzIGFuIFwib2xkIHZlcnNpb25cIiByZXF1ZXN0XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucHJlX3JlcXVlc3Rfc2NoZWR1bGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHZhciByZXR2YWwgPSAkLmV4dGVuZCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLCBkYXRhICk7XG5cdFx0cmV0dXJuIHJldHZhbDtcblx0fVxuXG5cdHNob3dBZHZhbmNlZEZpZWxkcyggdXBkYXRlX3NjaGVkdWxlX3RvdGFsX3RpbWUgKSB7XG5cdFx0aWYgKFxuXHRcdFx0R2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgJiZcblx0XHRcdCggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoICdyZXF1ZXN0JywgJ2FkZF9hZHZhbmNlZCcgKVxuXHRcdFx0XHR8fCAoIFRUVVVJRC5pc1VVSUQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZXF1ZXN0X3NjaGVkdWxlX2lkICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnJlcXVlc3Rfc2NoZWR1bGVfaWQgIT0gVFRVVUlELnplcm9faWQgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnJlcXVlc3Rfc2NoZWR1bGVfaWQgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIClcblx0XHRcdCYmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMzAgfHwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gNDAgKSAmJiAoICF0aGlzLnByZV9yZXF1ZXN0X3NjaGVkdWxlIHx8IHRoaXMuaXNfYWRkIClcblx0XHQpIHtcblx0XHRcdHZhciBhZHZhbmNlZF9maWVsZF9uYW1lcyA9IHRoaXMuZ2V0QWR2YW5jZWRGaWVsZE5hbWVzKCk7XG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYyApIHtcblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYWR2YW5jZWRfZmllbGRfbmFtZXMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBhZHZhbmNlZF9maWVsZF9uYW1lc1tpXSA9PSAnYWJzZW5jZV9wb2xpY3lfaWQnICYmIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCAmJiB0aGlzLmVkaXRfdmlld191aV9kaWMucmVxdWVzdF9zY2hlZHVsZV9zdGF0dXNfaWQuZ2V0VmFsdWUoKSAhPSAyMCApIHtcblx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1thZHZhbmNlZF9maWVsZF9uYW1lc1tpXV0ucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWNbYWR2YW5jZWRfZmllbGRfbmFtZXNbaV1dICkge1xuXHRcdFx0XHRcdFx0aWYgKCBhZHZhbmNlZF9maWVsZF9uYW1lc1tpXSA9PSAnYnJhbmNoX2lkJyAmJiAhdGhpcy5zaG93X2JyYW5jaF91aSApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2FkdmFuY2VkX2ZpZWxkX25hbWVzW2ldXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFkdmFuY2VkX2ZpZWxkX25hbWVzW2ldID09ICdkZXBhcnRtZW50X2lkJyAmJiAhdGhpcy5zaG93X2RlcGFydG1lbnRfdWkgKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1thZHZhbmNlZF9maWVsZF9uYW1lc1tpXV0ucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhZHZhbmNlZF9maWVsZF9uYW1lc1tpXSA9PSAnam9iX2lkJyAmJiAhdGhpcy5zaG93X2pvYl91aSApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2FkdmFuY2VkX2ZpZWxkX25hbWVzW2ldXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFkdmFuY2VkX2ZpZWxkX25hbWVzW2ldID09ICdqb2JfaXRlbV9pZCcgJiYgIXRoaXMuc2hvd19qb2JfaXRlbV91aSApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2FkdmFuY2VkX2ZpZWxkX25hbWVzW2ldXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFkdmFuY2VkX2ZpZWxkX25hbWVzW2ldID09ICdwdW5jaF90YWdfaWQnICYmICF0aGlzLnNob3dfcHVuY2hfdGFnX3VpICkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbYWR2YW5jZWRfZmllbGRfbmFtZXNbaV1dLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYWR2YW5jZWRfZmllbGRfbmFtZXNbaV0gPT0gJ2F2YWlsYWJsZV9iYWxhbmNlJyAmJiAhdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbYWR2YW5jZWRfZmllbGRfbmFtZXNbaV1dLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2FkdmFuY2VkX2ZpZWxkX25hbWVzW2ldXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kYXRlICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kYXRlX3N0YW1wLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuYXZhaWxhYmxlX2JhbGFuY2UgKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgPT0gdHJ1ZSAmJiB0aGlzLnZpZXdJZCA9PSAnUmVxdWVzdCcgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuYXZhaWxhYmxlX2JhbGFuY2UucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCAhPSAzMCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCAhPSA0MCApIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy50b3RhbF90aW1lICkge1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnRvdGFsX3RpbWUucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMub3ZlcmxhcF90eXBlX2lkLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmlzX3JlcGxhY2Vfd2l0aF9vcGVuX3NoaWZ0LnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIHVwZGF0ZV9zY2hlZHVsZV90b3RhbF90aW1lICE9IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRTY2hlZHVsZVRvdGFsVGltZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kYXRlX3N0YW1wICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGF0ZV9zdGFtcC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaGlkZUFkdmFuY2VkRmllbGRzKCk7XG5cdFx0fVxuXHR9XG5cblx0aGlkZUFkdmFuY2VkRmllbGRzKCkge1xuXHRcdHZhciBhZHZhbmNlZF9maWVsZF9uYW1lcyA9IHRoaXMuZ2V0QWR2YW5jZWRGaWVsZE5hbWVzKCk7XG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMgKSB7XG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhZHZhbmNlZF9maWVsZF9uYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWNbYWR2YW5jZWRfZmllbGRfbmFtZXNbaV1dICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1thZHZhbmNlZF9maWVsZF9uYW1lc1tpXV0ucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRhdGUgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kYXRlLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuc2hvdygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGdldEFkdmFuY2VkRmllbGROYW1lcygpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3JlcXVlc3RfaWQnLFxuXHRcdFx0J3JlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkJyxcblx0XHRcdCdyZXF1ZXN0X3NjaGVkdWxlX2lkJyxcblx0XHRcdCdzdGFydF9kYXRlJyxcblx0XHRcdCdlbmRfZGF0ZScsXG5cblx0XHRcdCdzdW4nLFxuXHRcdFx0J21vbicsXG5cdFx0XHQndHVlJyxcblx0XHRcdCd3ZWQnLFxuXHRcdFx0J3RodScsXG5cdFx0XHQnZnJpJyxcblx0XHRcdCdzYXQnLFxuXG5cdFx0XHQnc3RhcnRfdGltZScsXG5cdFx0XHQnZW5kX3RpbWUnLFxuXHRcdFx0J3RvdGFsX3RpbWUnLFxuXG5cdFx0XHQnc2NoZWR1bGVfcG9saWN5X2lkJyxcblx0XHRcdCdhYnNlbmNlX3BvbGljeV9pZCcsXG5cdFx0XHQnYnJhbmNoX2lkJyxcblx0XHRcdCdkZXBhcnRtZW50X2lkJyxcblx0XHRcdCdqb2JfaWQnLFxuXHRcdFx0J2pvYl9pdGVtX2lkJyxcblx0XHRcdCdwdW5jaF90YWdfaWQnLFxuXG5cdFx0XHQnc2NoZWR1bGVfcG9saWN5Jyxcblx0XHRcdCdhYnNlbmNlX3BvbGljeScsXG5cdFx0XHQnYnJhbmNoJyxcblx0XHRcdCdkZXBhcnRtZW50Jyxcblx0XHRcdCdqb2InLFxuXHRcdFx0J2pvYl9pdGVtJyxcblx0XHRcdCdhdmFpbGFibGVfYmFsYW5jZScsXG5cblx0XHRcdCdvdmVybGFwX3R5cGVfaWQnLFxuXHRcdFx0J2lzX3JlcGxhY2Vfd2l0aF9vcGVuX3NoaWZ0J1xuXHRcdF07XG5cdH1cblxuXHRnZXRTY2hlZHVsZVRvdGFsVGltZSgpIHtcblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1XG5cdFx0XHQmJiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDMwIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDQwIClcblx0XHRcdCYmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljICYmIHRoaXMuZWRpdF92aWV3X3VpX2RpY1sndG90YWxfdGltZSddIClcblx0XHQpIHtcblxuXHRcdFx0dmFyIHN0YXJ0X3RpbWUgPSBmYWxzZTtcblx0XHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzdGFydF9kYXRlJ10gJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzdGFydF90aW1lJ10gKSB7XG5cdFx0XHRcdHN0YXJ0X3RpbWUgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X2RhdGUnXSArICcgJyArIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc3RhcnRfdGltZSddO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZW5kX3RpbWUgPSBmYWxzZTtcblx0XHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzdGFydF9kYXRlJ10gJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydlbmRfdGltZSddICkge1xuXHRcdFx0XHRlbmRfdGltZSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc3RhcnRfZGF0ZSddICsgJyAnICsgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydlbmRfdGltZSddO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2NoZWR1bGVQb2xpY3lJZCA9ICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzY2hlZHVsZV9wb2xpY3lfaWQnXSApID8gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzY2hlZHVsZV9wb2xpY3lfaWQnXSA6IG51bGw7XG5cdFx0XHR2YXIgdXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiB1c2VyX2lkID09ICd1bmRlZmluZWQnICYmIExvY2FsQ2FjaGVEYXRhLmdldExvZ2luVXNlcigpLmlkICkge1xuXHRcdFx0XHR1c2VyX2lkID0gTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyKCkuaWQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3RhcnRfdGltZSAmJiBlbmRfdGltZSApIHtcblx0XHRcdFx0dmFyIHNjaGVkdWxlX2FwaSA9IFRUQVBJLkFQSVNjaGVkdWxlO1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gc2NoZWR1bGVfYXBpLmdldFNjaGVkdWxlVG90YWxUaW1lKCBzdGFydF90aW1lLCBlbmRfdGltZSwgc2NoZWR1bGVQb2xpY3lJZCwgdXNlcl9pZCwgeyBhc3luYzogZmFsc2UgfSApO1xuXHRcdFx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0dGhpcy50b3RhbF90aW1lID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMudG90YWxfdGltZSA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZGF5cyA9IDE7XG5cdFx0XHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGUgIT0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmVuZF9kYXRlICkge1xuXHRcdFx0XHRcdGRheXMgPSBHbG9iYWwuZ2V0RGF5c0luU3BhbiggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGUsIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5lbmRfZGF0ZSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN1biwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1vbiwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR1ZSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLndlZCwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnRodSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmZyaSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNhdCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG92ZXJhbGxfdG90YWxfdGltZSA9IHRoaXMudG90YWxfdGltZSAqIGRheXM7XG5cdFx0XHRcdCQoJyN0b3RhbF9pbmZvJykudGV4dCggJC5pMThuLl8oICd4ICVzIERheShzKSA9ICVzJywgZGF5cywgR2xvYmFsLmdldFRpbWVVbml0KCBvdmVyYWxsX3RvdGFsX3RpbWUgKSApICk7XG5cblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd0b3RhbF90aW1lJ10gPSB0aGlzLnRvdGFsX3RpbWU7XG5cdFx0XHRcdHZhciB0b3RhbF90aW1lID0gR2xvYmFsLmdldFRpbWVVbml0KCB0aGlzLnRvdGFsX3RpbWUgKTtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWyd0b3RhbF90aW1lJ10uc2V0VmFsdWUoIHRvdGFsX3RpbWUgKTtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnRvdGFsX3RpbWUucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy50b3RhbF90aW1lICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy50b3RhbF90aW1lLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnRvdGFsX3RpbWUgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy50b3RhbF90aW1lLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMub25BdmFpbGFibGVCYWxhbmNlQ2hhbmdlKCk7XG5cdH1cblxuXHRvbldvcmtpbmdTdGF0dXNDaGFuZ2VkKCkge1xuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCAmJiB0aGlzLmVkaXRfdmlld191aV9kaWMuYWJzZW5jZV9wb2xpY3lfaWQgKSB7XG5cdFx0XHRcdHZhciB0eXBlX2lkID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnR5cGVfaWQgPyB0aGlzLmVkaXRfdmlld191aV9kaWMudHlwZV9pZC5nZXRWYWx1ZSgpIDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQ7XG5cdFx0XHRcdHRoaXMuc2hvd0Fic2VuY2VQb2xpY3lGaWVsZCggdHlwZV9pZCwgdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkLmdldFZhbHVlKCksIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hYnNlbmNlX3BvbGljeV9pZCApO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zaG93Q3JlYXRlT3BlblNoaWZ0KCk7XG5cdFx0fVxuXHR9XG5cblx0c2hvd0NyZWF0ZU9wZW5TaGlmdCgpIHtcblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLmNoZWNrVG9wTGV2ZWxQZXJtaXNzaW9uKCAnUmVxdWVzdEF1dGhvcml6YXRpb24nICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCA9PSAyMCApIHtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ2lzX3JlcGxhY2Vfd2l0aF9vcGVuX3NoaWZ0JyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdpc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdCcgKTtcblx0XHR9XG5cdH1cblxuXHRzaG93QWJzZW5jZVBvbGljeUZpZWxkKCB0eXBlX2lkLCByZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCwgdWlfZmllbGQgKSB7XG5cdFx0aWYgKCByZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCA9PSAyMCAmJiAoIHR5cGVfaWQgPT0gMzAgfHwgdHlwZV9pZCA9PSA0MCApICkge1xuXHRcdFx0dWlfZmllbGQucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5zaG93KCk7XG5cdFx0XHRpZiAoICggdGhpcy52aWV3SWQgPT0gJ1JlcXVlc3QnICYmIHRoaXMuaXNfdmlld2luZyApID09IGZhbHNlICkge1xuXHRcdFx0XHR0aGlzLm9uQXZhaWxhYmxlQmFsYW5jZUNoYW5nZSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR1aV9maWVsZC5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHR9XG5cdH1cblxuXHRvbkRhdGVTdGFtcENoYW5nZWQoKSB7XG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSAmJiBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3JlcXVlc3QnLCAnYWRkX2FkdmFuY2VkJyApICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnN0YXJ0X2RhdGUuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kYXRlX3N0YW1wICk7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kYXRlX3N0YW1wO1xuXHRcdH1cblx0fVxuXG5cdG9uU3RhcnREYXRlQ2hhbmdlZCgpIHtcblx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGF0ZV9zdGFtcC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGUgKTtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGF0ZV9zdGFtcCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlO1xuXHR9XG5cblx0Z2V0QXZhaWxhYmxlQmFsYW5jZSgpIHtcblx0XHRpZiAoICggdGhpcy5pc192aWV3aW5nICYmIHRoaXMudmlld0lkID09ICdSZXF1ZXN0JyApIHx8IEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkgPT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRoaXMudmlld0lkICE9ICdSZXF1ZXN0JyB8fCB0aGlzLmlzX3ZpZXdpbmcgPT0gZmFsc2UgKSAmJlxuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFic2VuY2VfcG9saWN5X2lkICYmXG5cdFx0XHQoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncmVxdWVzdCcsICdhZGRfYWR2YW5jZWQnICkgfHwgKCBUVFVVSUQuaXNVVUlEKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucmVxdWVzdF9zY2hlZHVsZV9pZCApICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZXF1ZXN0X3NjaGVkdWxlX2lkICE9IFRUVVVJRC56ZXJvX2lkICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZXF1ZXN0X3NjaGVkdWxlX2lkICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSApICYmXG5cdFx0XHRMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIuaWQgJiZcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50b3RhbF90aW1lICYmXG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudG90YWxfdGltZSAhPSAwICYmXG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZSApIHtcblxuXHRcdFx0dmFyIGRheXMgPSAxO1xuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZSAhPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZW5kX2RhdGUgKSB7XG5cdFx0XHRcdGRheXMgPSBHbG9iYWwuZ2V0RGF5c0luU3BhbiggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGUsIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5lbmRfZGF0ZSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN1biwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1vbiwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR1ZSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLndlZCwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnRodSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmZyaSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNhdCApO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdFx0dmFyIHVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblx0XHRcdHZhciB0b3RhbF90aW1lID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnRvdGFsX3RpbWUgKiBkYXlzO1xuXHRcdFx0dmFyIGRhdGVfc3RhbXAgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGF0ZV9zdGFtcDtcblx0XHRcdHZhciBwb2xpY3lfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYWJzZW5jZV9wb2xpY3lfaWQgPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYWJzZW5jZV9wb2xpY3lfaWQgOiBUVFVVSUQuemVyb19pZDtcblxuXHRcdFx0aWYgKCB1c2VyX2lkICYmIGRhdGVfc3RhbXAgJiYgdG90YWxfdGltZSApIHtcblx0XHRcdFx0dGhpcy5hcGlfYWJzZW5jZV9wb2xpY3kuZ2V0UHJvamVjdGVkQWJzZW5jZVBvbGljeUJhbGFuY2UoXG5cdFx0XHRcdFx0cG9saWN5X2lkLFxuXHRcdFx0XHRcdHVzZXJfaWQsXG5cdFx0XHRcdFx0ZGF0ZV9zdGFtcCxcblx0XHRcdFx0XHR0b3RhbF90aW1lLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICR0aGlzLmVkaXRfdmlld191aV9kaWMgJiYgJHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5nZXRCYWxhbmNlSGFuZGxlciggcmVzdWx0LCBkYXRlX3N0YW1wICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXN1bHQgJiYgJHRoaXMuc2VsZWN0ZWRfYWJzZW5jZV9wb2xpY3lfcmVjb3JkICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZiB1bnNldCBvciBzZXQgdG8gLS1Ob25lLS0uLi5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYWJzZW5jZV9wb2xpY3lfaWQgPT0gZmFsc2UgfHwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFic2VuY2VfcG9saWN5X2lkID09IFRUVVVJRC56ZXJvX2lkICkge1xuXHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuYXZhaWxhYmxlX2JhbGFuY2UgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCBhdXRob3JpemF0aW9uX2hpc3RvcnkgKSB7XG5cdFx0Ly8gRXJyb3I6IFVuYWJsZSB0byBnZXQgcHJvcGVydHkgJ2dldEdyaWRQYXJhbScgb2YgdW5kZWZpbmVkIG9yIG51bGwgcmVmZXJlbmNlXG5cdFx0dmFyIGRpc3BsYXlfY29sdW1ucyA9IFtdO1xuXHRcdGlmICggYXV0aG9yaXphdGlvbl9oaXN0b3J5ICkge1xuXHRcdFx0aWYgKCB0aGlzLmF1dGhvcml6YXRpb25faGlzdG9yeS5hdXRob3JpemF0aW9uX2hpc3RvcnlfZ3JpZCApIHtcblx0XHRcdFx0ZGlzcGxheV9jb2x1bW5zID0gQXV0aG9yaXphdGlvbkhpc3RvcnkuZ2V0QXV0aG9yaXphdGlvbkhpc3RvcnlEZWZhdWx0RGlzcGxheUNvbHVtbnMoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCB0aGlzLmdyaWQgKSB7XG5cdFx0XHRcdGRpc3BsYXlfY29sdW1ucyA9IHRoaXMuZ3JpZC5nZXRHcmlkUGFyYW0oICdjb2xNb2RlbCcgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFyIGNvbHVtbl9maWx0ZXIgPSB7fTtcblx0XHRjb2x1bW5fZmlsdGVyLmlzX293bmVyID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmlkID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmlzX2NoaWxkID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmluX3VzZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5maXJzdF9uYW1lID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmxhc3RfbmFtZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci51c2VyX2lkID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLnN0YXR1c19pZCA9IHRydWU7XG5cblx0XHRpZiAoIGRpc3BsYXlfY29sdW1ucyApIHtcblx0XHRcdHZhciBsZW4gPSBkaXNwbGF5X2NvbHVtbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0dmFyIGNvbHVtbl9pbmZvID0gZGlzcGxheV9jb2x1bW5zW2ldO1xuXHRcdFx0XHRjb2x1bW5fZmlsdGVyW2NvbHVtbl9pbmZvLm5hbWVdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sdW1uX2ZpbHRlcjtcblx0fVxuXG5cdGpvYlVJVmFsaWRhdGUoKSB7XG5cdFx0Ly91c2UgcHVuY2ggcGVybWlzc2lvbiBzZWN0aW9uIHJhdGhlciB0aGFuIHNjaGVkdWxlIHBlcm1pc3Npb24gc2VjdGlvbiBhcyB0aGF0J3Mgd2hhdCB0aGV5IGNhbiBzZWUgd2hlbiB0aGV5J3JlIGNyZWF0aW5nIHB1bmNoZXNcblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnam9iJywgJ2VuYWJsZWQnICkgJiZcblx0XHRcdFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncHVuY2gnLCAnZWRpdF9qb2InICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0am9iSXRlbVVJVmFsaWRhdGUoKSB7XG5cdFx0Ly91c2UgcHVuY2ggcGVybWlzc2lvbiBzZWN0aW9uIHJhdGhlciB0aGFuIHNjaGVkdWxlIHBlcm1pc3Npb24gc2VjdGlvbiBhcyB0aGF0J3Mgd2hhdCB0aGV5IGNhbiBzZWUgd2hlbiB0aGV5J3JlIGNyZWF0aW5nIHB1bmNoZXNcblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncHVuY2gnLCAnZWRpdF9qb2JfaXRlbScgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdW5jaFRhZ1VJVmFsaWRhdGUoKSB7XG5cdFx0Ly91c2UgcHVuY2ggcGVybWlzc2lvbiBzZWN0aW9uIHJhdGhlciB0aGFuIHNjaGVkdWxlIHBlcm1pc3Npb24gc2VjdGlvbiBhcyB0aGF0J3Mgd2hhdCB0aGV5IGNhbiBzZWUgd2hlbiB0aGV5J3JlIGNyZWF0aW5nIHB1bmNoZXNcblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncHVuY2gnLCAnZWRpdF9wdW5jaF90YWcnICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0YnJhbmNoVUlWYWxpZGF0ZSgpIHtcblx0XHQvL3VzZSBwdW5jaCBwZXJtaXNzaW9uIHNlY3Rpb24gcmF0aGVyIHRoYW4gc2NoZWR1bGUgcGVybWlzc2lvbiBzZWN0aW9uIGFzIHRoYXQncyB3aGF0IHRoZXkgY2FuIHNlZSB3aGVuIHRoZXkncmUgY3JlYXRpbmcgcHVuY2hlc1xuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoICdwdW5jaCcsICdlZGl0X2JyYW5jaCcgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRkZXBhcnRtZW50VUlWYWxpZGF0ZSgpIHtcblx0XHQvL3VzZSBwdW5jaCBwZXJtaXNzaW9uIHNlY3Rpb24gcmF0aGVyIHRoYW4gc2NoZWR1bGUgcGVybWlzc2lvbiBzZWN0aW9uIGFzIHRoYXQncyB3aGF0IHRoZXkgY2FuIHNlZSB3aGVuIHRoZXkncmUgY3JlYXRpbmcgcHVuY2hlc1xuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoICdwdW5jaCcsICdlZGl0X2RlcGFydG1lbnQnICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJvY2Vzc0FQSUNhbGxiYWNrUmVzdWx0KCByZXN1bHRfZGF0YSApIHtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSB0aGlzLmJ1aWxkRGF0YUZyb21BUEkoIHJlc3VsdF9kYXRhWzBdICk7XG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnRvdGFsX3RpbWUgPSBHbG9iYWwuZ2V0VGltZVVuaXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50b3RhbF90aW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0X2RhdGE7XG5cdH1cblxuXHRkb1ZpZXdDbGlja1Jlc3VsdCggcmVzdWx0X2RhdGEgKSB7XG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlICkgJiYgdGhpcy5lZGl0X3ZpZXdfdGFiICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcXVlc3QnICkuZmluZCggJy50aGlyZC1jb2x1bW4nICkuc2hvdygpO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdFx0dGhpcy5pbml0Vmlld2luZ1ZpZXcoKTtcblxuXHRcdC8vVGhpcyBsaW5lIGlzIHJlcXVpcmVkIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhlIGFic2VuY2UgcG9saWN5IGJveCBub3Qgc2hvd2luZyBwcm9wZXJseSBvbiBpbml0aWFsIGxvYWQuXG5cdFx0dGhpcy5vbldvcmtpbmdTdGF0dXNDaGFuZ2VkKCk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdEVtYmVkZGVkTWVzc2FnZS5pbml0KCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQsIDUwLCB0aGlzLCB0aGlzLmVkaXRfdmlldywgdGhpcy5lZGl0X3ZpZXdfdGFiLCB0aGlzLmVkaXRfdmlld191aV9kaWMsIGZ1bmN0aW9uKCkge1xuXHRcdFx0JHRoaXMuYXV0aG9yaXphdGlvbl9oaXN0b3J5ID0gQXV0aG9yaXphdGlvbkhpc3RvcnkuaW5pdCggJHRoaXMgKTtcblx0XHRcdCR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzLmNsZWFyQ3VycmVudFNlbGVjdGVkUmVjb3JkKCk7XG5cdH1cblxuXHRvblZpZXdDbGljayggZWRpdF9yZWNvcmQsIGNsZWFyX2VkaXRfdmlldyApIHtcblx0XHRpZiAoIGNsZWFyX2VkaXRfdmlldyApIHtcblx0XHRcdHRoaXMuY2xlYXJFZGl0VmlldygpO1xuXHRcdH1cblx0XHRzdXBlci5vblZpZXdDbGljayggZWRpdF9yZWNvcmQgKTtcblx0fVxuXG5cdHNldFN1YkxvZ1ZpZXdGaWx0ZXIoKSB7XG5cdFx0aWYgKCAhdGhpcy5zdWJfbG9nX3ZpZXdfY29udHJvbGxlciApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLnN1Yl9sb2dfdmlld19jb250cm9sbGVyLmdldFN1YlZpZXdGaWx0ZXIgPSBmdW5jdGlvbiggZmlsdGVyICkge1xuXHRcdFx0ZmlsdGVyWyd0YWJsZV9uYW1lX29iamVjdF9pZCddID0ge1xuXHRcdFx0XHQncmVxdWVzdCc6IFt0aGlzLnBhcmVudF9lZGl0X3JlY29yZC5pZF0sXG5cdFx0XHRcdCdyZXF1ZXN0X3NjaGVkdWxlJzogW3RoaXMucGFyZW50X2VkaXRfcmVjb3JkLnJlcXVlc3Rfc2NoZWR1bGVfaWRdXG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gZmlsdGVyO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIHRoZSBlZGl0IGZvcm0gaXMgbm90IGFjdHVhbGx5IGFuIGVkaXQgbW9kZSBmb3JtLCBzbyB3ZSBuZWVkIHRvIGRvIHNvbWVcblx0ICogc3R1ZmYgZGlmZmVyZW50bHkgaW4gdmlldyBtb2RlIHRoYW4gaW4gZWRpdCBtb2RlLlxuXHQgKi9cblx0aW5pdFZpZXdpbmdWaWV3KCkge1xuXHRcdHRoaXMuc2hvd0FkdmFuY2VkRmllbGRzKCk7XG5cdH1cblxuXHRpbml0RWRpdFZpZXdVSSggdmlld19pZCwgZWRpdF92aWV3X2ZpbGVfbmFtZSApIHtcblx0XHRHbG9iYWwuc2V0VUlOb3RyZWFkeSgpO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdpbml0JywgJ2luaXQnICk7XG5cdFx0VFRQcm9taXNlLndhaXQoKTtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3LnJlbW92ZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuZWRpdF92aWV3ID0gJCggR2xvYmFsLmxvYWRWaWV3U291cmNlKCB2aWV3X2lkLCBlZGl0X3ZpZXdfZmlsZV9uYW1lLCBudWxsLCB0cnVlICkgKTtcblx0XHR0aGlzLmVkaXRfdmlld190YWIgPSAkKCB0aGlzLmVkaXRfdmlldy5maW5kKCAnLmVkaXQtdmlldy10YWItYmFyJyApICk7XG5cblx0XHQvL0dpdmUgZWR0IHZpZXcgdGFiIGEgaWQsIHNvIHdlIGNhbiBsb2FkIGl0IHdoZW4gcHV0IHJpZ2h0IGNsaWNrIG1lbnUgb24gaXRcblx0XHR0aGlzLmVkaXRfdmlld190YWIuYXR0ciggJ2lkJywgdGhpcy51aV9pZCArICdfZWRpdF92aWV3X3RhYicgKTtcblxuXHRcdC8vIE1vdmVkIGludG8gZ2VuZXJpYyBCYXNlVmlldy5pbml0RWRpdFZpZXdUYWJzXG5cdFx0Ly8gdGhpcy5zZXRUYWJPVmlzaWJpbGl0eSggZmFsc2UgKTtcblx0XHQvLyB0aGlzLmVkaXRfdmlld190YWIgPSB0aGlzLmVkaXRfdmlld190YWIudGFicygge1xuXHRcdC8vIFx0YWN0aXZhdGU6IGZ1bmN0aW9uKCBlLCB1aSApIHtcblx0XHQvLyBcdFx0JHRoaXMub25UYWJTaG93KCBlLCB1aSApO1xuXHRcdC8vIFx0fVxuXHRcdC8vIH0gKTtcblx0XHQvLyBOb3RlOiBDaGVjayB0aGUgJ3RhYnNzZWxlY3QnIHJlcGxhY2VkIHdpdGggZ2VuZXJpYyAnY2xpY2snIGluIGJhc2V2aWV3IGRvZXMgbm90IGNhdXNlIGlzc3VlLlxuXHRcdC8vIHRoaXMuZWRpdF92aWV3X3RhYi5iaW5kKCAndGFic3NlbGVjdCcsIGZ1bmN0aW9uKCBlLCB1aSApIHtcblx0XHQvLyBcdCR0aGlzLm9uVGFiSW5kZXhDaGFuZ2UoIGUsIHVpICk7XG5cdFx0Ly8gfSApO1xuXG5cdFx0R2xvYmFsLmNvbnRlbnRDb250YWluZXIoKS5hcHBlbmQoIHRoaXMuZWRpdF92aWV3ICk7XG5cdFx0dGhpcy5pbml0UmlnaHRDbGlja01lbnUoIFJpZ2h0Q2xpY2tNZW51VHlwZS5FRElUVklFVyApO1xuXG5cdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ3ZpZXcnO1xuXHRcdFx0dGhpcy5idWlsZFZpZXdVSSgpO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuaXNfZWRpdCApIHtcblx0XHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnZWRpdCc7XG5cdFx0XHR0aGlzLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLnVubW91bnRDb250ZXh0TWVudSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkICk7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHR9XG5cblx0XHQkdGhpcy5zZXRFZGl0Vmlld1RhYkhlaWdodCgpO1xuXHR9XG5cblx0aW5pdEVkaXRWaWV3VGFicygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciB0YWJfb3B0aW9ucyA9IHtcblx0XHRcdGFjdGl2YXRlOiBmdW5jdGlvbiggZSwgdWkgKSB7XG5cdFx0XHRcdCR0aGlzLm9uVGFiU2hvdyggZSwgdWkgKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0c3VwZXIuaW5pdEVkaXRWaWV3VGFicyggdGFiX29wdGlvbnMgKTtcblx0fVxuXG5cdG9uRWRpdENsaWNrKCBlZGl0SWQsIG5vUmVmcmVzaFVJICkge1xuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRWaWV3U3RhdGUoICdlZGl0JyApO1xuXHRcdHRoaXMuaW5pdEVkaXRWaWV3VUkoIHRoaXMudmlld0lkLCB0aGlzLmVkaXRfdmlld190cGwgKTtcblx0XHR0aGlzLmluaXRFZGl0VmlldygpO1xuXHRcdC8vQ2xlYXIgbGFzdCBzZW50IG1lc3NhZ2UgYm9keSB2YWx1ZS5cblx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuYm9keS5zZXRWYWx1ZSggJycgKTtcblx0XHQvL2Vuc3VyZSBzZW5kIGJ1dHRvbiBpcyBhdmFpbGFibGVcblx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdH1cblxuXHRidWlsZFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl9yZXF1ZXN0Jzoge1xuXHRcdFx0XHQnbGFiZWwnOiAkLmkxOG4uXyggJ1JlcXVlc3QnICksXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRSZXF1ZXN0VGFiSHRtbCgpXG5cdFx0XHR9LFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUmVxdWVzdCxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9yZXF1ZXN0Jyxcblx0XHRcdG5hdmlnYXRpb25fbW9kZTogdHJ1ZSxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyO1xuXHRcdHZhciBsYWJlbDtcblxuXHRcdC8vVGFiIDAgZmlyc3QgY29sdW1uIHN0YXJ0XG5cdFx0dmFyIHRhYl9yZXF1ZXN0ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcXVlc3QnICk7XG5cdFx0dmFyIHRhYl9yZXF1ZXN0X2NvbHVtbjEgPSB0YWJfcmVxdWVzdC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXS5wdXNoKCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHQvLyBFbXBsb3llZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2Z1bGxfbmFtZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSApO1xuXG5cdFx0Ly8gVHlwZVxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICd0eXBlJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUeXBlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblxuXHRcdC8vIERhdGVcblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZGF0ZV9zdGFtcCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkge1xuXG5cdFx0XHQvL1dvcmtpbmcgU3RhdHVzXG5cdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdyZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCcsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIHsgMTA6ICdXb3JraW5nJywgMjA6ICdBYnNlbnQnIH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhdHVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnY2hhbmdlJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdCR0aGlzLm9uV29ya2luZ1N0YXR1c0NoYW5nZWQoKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0Ly9BYnNlbmNlIFBvbGljeVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUFic2VuY2VQb2xpY3ksXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2Fic2VuY2VzJyxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2Fic2VuY2VfcG9saWN5X2lkJyxcblx0XHRcdFx0Y3VzdG9tU2VhcmNoRmlsdGVyOiBmdW5jdGlvbiggZmlsdGVyICkge1xuXHRcdFx0XHRcdHJldHVybiAkdGhpcy5zZXRBYnNlbmNlUG9saWN5RmlsdGVyKCBmaWx0ZXIgKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0UmVhbFZhbHVlQ2FsbEJhY2s6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHQvLyAjMjEzNSBmaXggZm9yIGNhc2VzIHdoZXJlIHVzZXIgaXMgcmVtb3ZlZCBmcm9tIGFic2VuY2UgcG9saWNpZXMgYmV0d2VlbiBjcmVhdGluZyByZXF1ZXN0IGFuZCBhcHByb3ZhbFxuXHRcdFx0XHRcdCR0aGlzLnNlbGVjdGVkX2Fic2VuY2VfcG9saWN5X3JlY29yZCA9IHZhbHVlO1xuXHRcdFx0XHRcdCR0aGlzLm9uQXZhaWxhYmxlQmFsYW5jZUNoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Fic2VuY2UgUG9saWN5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblxuXHRcdFx0Ly9BdmFpbGFibGUgQmFsYW5jZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdhdmFpbGFibGVfYmFsYW5jZScgfSApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94IGF2YWlsYWJsZS1iYWxhbmNlLWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdHRoaXMuYXZhaWxhYmxlX2JhbGFuY2VfaW5mbyA9ICQoICc8c3BhbiBjbGFzcz1cImF2YWlsYWJsZS1iYWxhbmNlLWluZm8gdHRpY29uIHR0aWNvbi1pbmZvX2JsYWNrXzI0ZHBcIj48L3NwYW4+JyApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB0aGlzLmF2YWlsYWJsZV9iYWxhbmNlX2luZm8gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQXZhaWxhYmxlIEJhbGFuY2UnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0XHQvL1N0YXJ0IERhdGVcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5URGF0ZVBpY2tlciggeyBmaWVsZDogJ3N0YXJ0X2RhdGUnIH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhcnQgRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0XHQvL0VuZCAgRGF0ZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnZW5kX2RhdGUnIH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW5kIERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycgKTtcblxuXHRcdFx0Ly8gRWZmZWN0aXZlIERheXNcblx0XHRcdHZhciBmb3JtX2l0ZW1fc3VuX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3N1bl9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdzdW4nIH0gKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbV9tb25fY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fbW9uX2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ21vbicgfSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtX3R1ZV9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV90dWVfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAndHVlJyB9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW1fd2VkX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3dlZF9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICd3ZWQnIH0gKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbV90aHVfY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fdGh1X2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3RodScgfSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtX2ZyaV9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV9mcmlfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAnZnJpJyB9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW1fc2F0X2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3NhdF9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdzYXQnIH0gKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXY+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgc3VuID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC10b3AtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ1N1bicgKSArICcgPGJyPiAnICsgJyA8L3NwYW4+JyApO1xuXHRcdFx0dmFyIG1vbiA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtdG9wLWxhYmVsXFwnPiAnICsgJC5pMThuLl8oICdNb24nICkgKyAnIDxicj4gJyArICcgPC9zcGFuPicgKTtcblx0XHRcdHZhciB0dWUgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXRvcC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnVHVlJyApICsgJyA8YnI+ICcgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHR2YXIgd2VkID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC10b3AtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ1dlZCcgKSArICcgPGJyPiAnICsgJyA8L3NwYW4+JyApO1xuXHRcdFx0dmFyIHRodSA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtdG9wLWxhYmVsXFwnPiAnICsgJC5pMThuLl8oICdUaHUnICkgKyAnIDxicj4gJyArICcgPC9zcGFuPicgKTtcblx0XHRcdHZhciBmcmkgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXRvcC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnRnJpJyApICsgJyA8YnI+ICcgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHR2YXIgc2F0ID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC10b3AtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ1NhdCcgKSArICcgPGJyPiAnICsgJyA8L3NwYW4+JyApO1xuXG5cdFx0XHRzdW4uYXBwZW5kKCBmb3JtX2l0ZW1fc3VuX2NoZWNrYm94ICk7XG5cdFx0XHRtb24uYXBwZW5kKCBmb3JtX2l0ZW1fbW9uX2NoZWNrYm94ICk7XG5cdFx0XHR0dWUuYXBwZW5kKCBmb3JtX2l0ZW1fdHVlX2NoZWNrYm94ICk7XG5cdFx0XHR3ZWQuYXBwZW5kKCBmb3JtX2l0ZW1fd2VkX2NoZWNrYm94ICk7XG5cdFx0XHR0aHUuYXBwZW5kKCBmb3JtX2l0ZW1fdGh1X2NoZWNrYm94ICk7XG5cdFx0XHRmcmkuYXBwZW5kKCBmb3JtX2l0ZW1fZnJpX2NoZWNrYm94ICk7XG5cdFx0XHRzYXQuYXBwZW5kKCBmb3JtX2l0ZW1fc2F0X2NoZWNrYm94ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHN1biApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbW9uICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB0dWUgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHdlZCApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggdGh1ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmcmkgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHNhdCApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIuYWRkQ2xhc3MoICdyZXF1ZXN0X2VkaXRfdmlld19lZmZlY3RpdmVfZGF5cycgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRWZmZWN0aXZlIERheXMnICksIFtmb3JtX2l0ZW1fc3VuX2NoZWNrYm94LCBmb3JtX2l0ZW1fbW9uX2NoZWNrYm94LCBmb3JtX2l0ZW1fdHVlX2NoZWNrYm94LCBmb3JtX2l0ZW1fd2VkX2NoZWNrYm94LCBmb3JtX2l0ZW1fdGh1X2NoZWNrYm94LCBmb3JtX2l0ZW1fZnJpX2NoZWNrYm94LCBmb3JtX2l0ZW1fc2F0X2NoZWNrYm94XSwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgZmFsc2UsIHRydWUgKTtcblxuXHRcdFx0Ly9TdGFydCB0aW1lXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRpbWVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF90aW1lJyB9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0luJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblxuXHRcdFx0Ly9FbmQgIHRpbWVcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVElNRV9QSUNLRVIgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGltZVBpY2tlciggeyBmaWVsZDogJ2VuZF90aW1lJyB9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ091dCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHRcdC8vIFRvdGFsXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3RvdGFsX3RpbWUnIH0gKTtcblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCcgaWQ9XFwndG90YWxfaW5mb1xcJz48L3NwYW4+JyApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUb3RhbCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICYmIHRoaXMub3ZlcmxhcHBpbmdTaGlmdFVJVmFsaWRhdGUoKSA9PSB0cnVlICkge1xuXHRcdFx0XHQvL092ZXJyaWRlIC8gU3BsaXQgc2hpZnRcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdvdmVybGFwX3R5cGVfaWQnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIHRoaXMub3ZlcmxhcF90eXBlX2FycmF5ICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveCBvdmVybGFwcGluZy1zaGlmdC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHRcdHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfaW5mbyA9ICQoICc8c3BhbiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAtM3B4OyBsZWZ0OiAzcHg7XCIgaWQ9XCJvdmVybGFwcGluZy1zaGlmdC10b3RhbFwiPjwvc3Bhbj48c3BhbiBpZD1cIm92ZXJsYXBwaW5nLXNoaWZ0LWljb25cIiBjbGFzcz1cIm92ZXJsYXBwaW5nLXNoaWZ0LWluZm8gdHRpY29uIHR0aWNvbi1pbmZvX2JsYWNrXzI0ZHBcIj48L3NwYW4+JyApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggdGhpcy5vdmVybGFwcGluZ19zaGlmdF9pbmZvICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnT3ZlcmxhcHBpbmcgU2hpZnQocyknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2lzX3JlcGxhY2Vfd2l0aF9vcGVuX3NoaWZ0JyB9ICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0bGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnPiggJyArICQuaTE4bi5fKCAnRm9yIEFic2VuY2VzJyApICsgJyApPC9zcGFuPicgKTtcblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGxhYmVsICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDcmVhdGUgT3BlbiBTaGlmdCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9TY2hlZHVsZSBQb2xpY3lcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZVBvbGljeSxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfc2NoZWR1bGUnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdzY2hlZHVsZV9wb2xpY3lfaWQnXG5cdFx0XHR9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1NjaGVkdWxlIFBvbGljeScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHRcdC8vQnJhbmNoXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9icmFuY2gnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdicmFuY2hfaWQnXG5cdFx0XHR9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0JyYW5jaCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cdFx0XHRpZiAoICF0aGlzLnNob3dfYnJhbmNoX3VpICkge1xuXHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdicmFuY2hfaWQnICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vRGVwYXJ0bWVudFxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSURlcGFydG1lbnQsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2RlcGFydG1lbnQnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdkZXBhcnRtZW50X2lkJ1xuXHRcdFx0fSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEZXBhcnRtZW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblx0XHRcdGlmICggIXRoaXMuc2hvd19kZXBhcnRtZW50X3VpICkge1xuXHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZXBhcnRtZW50X2lkJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHQvL0pvYlxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJSm9iLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iJyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0XHRqb2JfY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICksXG5cdFx0XHRcdFx0ZmllbGQ6ICdqb2JfaWQnLFxuXHRcdFx0XHRcdGFkZGVkX2l0ZW1zOiBbXG5cdFx0XHRcdFx0XHR7IHZhbHVlOiAnLTEnLCBsYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbSB9LFxuXHRcdFx0XHRcdFx0eyB2YWx1ZTogJy0yJywgbGFiZWw6IEdsb2JhbC5zZWxlY3RlZF9pdGVtIH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciBqb2JfY29kZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0am9iX2NvZGVyLlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdqb2JfcXVpY2tfc2VhcmNoJywgZGlzYWJsZV9rZXl1cF9ldmVudDogdHJ1ZSB9ICk7XG5cdFx0XHRcdGpvYl9jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBqb2JfY29kZXIgKTtcblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iJyApLCBbZm9ybV9pdGVtX2lucHV0LCBqb2JfY29kZXJdLCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCAhdGhpcy5zaG93X2pvYl91aSApIHtcblx0XHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdqb2JfaWQnICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL0pvYiBJdGVtXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2JJdGVtLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iX2l0ZW0nLFxuXHRcdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdFx0c2V0UmVhbFZhbHVlQ2FsbEJhY2s6ICggZnVuY3Rpb24oIHZhbCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRcdGpvYl9pdGVtX2NvZGVyLnNldFZhbHVlKCB2YWwubWFudWFsX2lkICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApLFxuXHRcdFx0XHRcdGZpZWxkOiAnam9iX2l0ZW1faWQnLFxuXHRcdFx0XHRcdGFkZGVkX2l0ZW1zOiBbXG5cdFx0XHRcdFx0XHR7IHZhbHVlOiAnLTEnLCBsYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbSB9LFxuXHRcdFx0XHRcdFx0eyB2YWx1ZTogJy0yJywgbGFiZWw6IEdsb2JhbC5zZWxlY3RlZF9pdGVtIH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciBqb2JfaXRlbV9jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRqb2JfaXRlbV9jb2Rlci5UVGV4dElucHV0KCB7IGZpZWxkOiAnam9iX2l0ZW1fcXVpY2tfc2VhcmNoJywgZGlzYWJsZV9rZXl1cF9ldmVudDogdHJ1ZSB9ICk7XG5cdFx0XHRcdGpvYl9pdGVtX2NvZGVyLmFkZENsYXNzKCAnam9iLWNvZGVyJyApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGpvYl9pdGVtX2NvZGVyICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1Rhc2snICksIFtmb3JtX2l0ZW1faW5wdXQsIGpvYl9pdGVtX2NvZGVyXSwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggIXRoaXMuc2hvd19qb2JfaXRlbV91aSApIHtcblx0XHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdqb2JfaXRlbV9pZCcgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vUHVuY2ggVGFnXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElQdW5jaFRhZyxcblx0XHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfcHVuY2hfdGFnJyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoICggcHVuY2hfdGFncyApID0+IHtcblx0XHRcdFx0XHRcdGlmICggcHVuY2hfdGFncyApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1F1aWNrU2VhcmNoTWFudWFsSWRzKCBwdW5jaF90YWdzICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApLFxuXHRcdFx0XHRcdGZpZWxkOiAncHVuY2hfdGFnX2lkJ1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgcHVuY2hfdGFnX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdHB1bmNoX3RhZ19jb2Rlci5UVGV4dElucHV0KCB7IGZpZWxkOiAncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0XHRwdW5jaF90YWdfY29kZXIuYWRkQ2xhc3MoICdqb2ItY29kZXInICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggcHVuY2hfdGFnX2NvZGVyICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1B1bmNoIFRhZ3MnICksIFtmb3JtX2l0ZW1faW5wdXQsIHB1bmNoX3RhZ19jb2Rlcl0sIHRhYl9yZXF1ZXN0X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpZiAoICF0aGlzLnNob3dfcHVuY2hfdGFnX3VpICkge1xuXHRcdFx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEVtYmVkZGVkTWVzc2FnZS5pbml0VUkoIHRoaXMsIHRhYl9yZXF1ZXN0ICk7XG5cdH1cblxuXHRzZXRBYnNlbmNlUG9saWN5RmlsdGVyKCBmaWx0ZXIgKSB7XG5cdFx0aWYgKCAhZmlsdGVyLmZpbHRlcl9kYXRhICkge1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0fVxuXHRcdGZpbHRlci5maWx0ZXJfZGF0YS51c2VyX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQ7XG5cblx0XHRpZiAoIGZpbHRlci5maWx0ZXJfY29sdW1ucyApIHtcblx0XHRcdGZpbHRlci5maWx0ZXJfY29sdW1ucy5hYnNlbmNlX3BvbGljeSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmaWx0ZXI7XG5cdH1cblxuXHRuZWVkU2hvd05hdmlnYXRpb24oKSB7XG5cdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICYmIEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRvbk5hdmlnYXRpb25DbGljayggaWNvbk5hbWUgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBmaWx0ZXI7XG5cdFx0dmFyIHRlbXBfZmlsdGVyO1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5O1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2xlbmd0aDtcblxuXHRcdHZhciBzZWxlY3RlZElkO1xuXHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHRzd2l0Y2ggKCBpY29uTmFtZSApIHtcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRcdGZpbHRlciA9IHsgZmlsdGVyX2RhdGE6IHt9IH07XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSApIHtcblxuXHRcdFx0XHRcdGZpbHRlci51c2VyX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQgPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCA6IExvY2FsQ2FjaGVEYXRhLmxvZ2luVXNlci5pZDtcblx0XHRcdFx0XHRmaWx0ZXIuYmFzZV9kYXRlID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXA7XG5cblx0XHRcdFx0XHRHbG9iYWwuYWRkVmlld1RhYiggJHRoaXMudmlld0lkLCAkLmkxOG4uXyggJ0F1dGhvcml6YXRpb24gLSBSZXF1ZXN0JyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdUaW1lU2hlZXQnLCBmaWx0ZXIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRlbXBfZmlsdGVyID0ge307XG5cdFx0XHRcdFx0Z3JpZF9zZWxlY3RlZF9pZF9hcnJheSA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHRcdFx0XHRncmlkX3NlbGVjdGVkX2xlbmd0aCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3RlZElkID0gZ3JpZF9zZWxlY3RlZF9pZF9hcnJheVswXTtcblxuXHRcdFx0XHRcdFx0dGVtcF9maWx0ZXIuZmlsdGVyX2RhdGEgPSB7fTtcblx0XHRcdFx0XHRcdHRlbXBfZmlsdGVyLmZpbHRlcl9jb2x1bW5zID0geyB1c2VyX2lkOiB0cnVlLCBkYXRlX3N0YW1wOiB0cnVlIH07XG5cdFx0XHRcdFx0XHR0ZW1wX2ZpbHRlci5maWx0ZXJfZGF0YS5pZCA9IFtzZWxlY3RlZElkXTtcblxuXHRcdFx0XHRcdFx0dGhpcy5hcGlbJ2dldCcgKyB0aGlzLmFwaS5rZXlfbmFtZV0oIHRlbXBfZmlsdGVyLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggIXJlc3VsdF9kYXRhICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhWzBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLnVzZXJfaWQgPSByZXN1bHRfZGF0YS51c2VyX2lkO1xuXHRcdFx0XHRcdFx0XHRcdGZpbHRlci5iYXNlX2RhdGUgPSByZXN1bHRfZGF0YS5kYXRlX3N0YW1wO1xuXHRcdFx0XHRcdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCAkdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnQXV0aG9yaXphdGlvbiAtIFJlcXVlc3QnICksIHdpbmRvdy5sb2NhdGlvbi5ocmVmICk7XG5cdFx0XHRcdFx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1RpbWVTaGVldCcsIGZpbHRlciApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0ZmlsdGVyID0geyBmaWx0ZXJfZGF0YToge30gfTtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApICkge1xuXHRcdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIub3BlbkVkaXRWaWV3KCB0aGlzLCAnRW1wbG95ZWUnLCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkIDogTG9jYWxDYWNoZURhdGEubG9naW5Vc2VyLmlkICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGVtcF9maWx0ZXIgPSB7fTtcblx0XHRcdFx0XHRncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdFx0XHRcdGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID0gZ3JpZF9zZWxlY3RlZF9pZF9hcnJheS5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRcdHNlbGVjdGVkSWQgPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5WzBdO1xuXG5cdFx0XHRcdFx0XHR0ZW1wX2ZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdFx0XHRcdFx0dGVtcF9maWx0ZXIuZmlsdGVyX2NvbHVtbnMgPSB7IHVzZXJfaWQ6IHRydWUgfTtcblx0XHRcdFx0XHRcdHRlbXBfZmlsdGVyLmZpbHRlcl9kYXRhLmlkID0gW3NlbGVjdGVkSWRdO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmFwaVsnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggdGVtcF9maWx0ZXIsIHtcblx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhcmVzdWx0X2RhdGEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRfZGF0YSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFbMF07XG5cblx0XHRcdFx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLm9wZW5FZGl0VmlldyggJHRoaXMsICdFbXBsb3llZScsIHJlc3VsdF9kYXRhLnVzZXJfaWQgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzY2hlZHVsZSc6XG5cblx0XHRcdFx0ZmlsdGVyID0geyBmaWx0ZXJfZGF0YToge30gfTtcblxuXHRcdFx0XHR2YXIgaW5jbHVkZV91c2VycyA9IG51bGw7XG5cblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApICkge1xuXG5cdFx0XHRcdFx0aW5jbHVkZV91c2VycyA9IFt0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkIDogTG9jYWxDYWNoZURhdGEubG9naW5Vc2VyLmlkXTtcblx0XHRcdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEuaW5jbHVkZV91c2VyX2lkcyA9IHsgdmFsdWU6IGluY2x1ZGVfdXNlcnMgfTtcblx0XHRcdFx0XHRmaWx0ZXIuc2VsZWN0X2RhdGUgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGF0ZV9zdGFtcDtcblxuXHRcdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCAkdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnQXV0aG9yaXphdGlvbiAtIFJlcXVlc3QnICksIHdpbmRvdy5sb2NhdGlvbi5ocmVmICk7XG5cdFx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1NjaGVkdWxlJywgZmlsdGVyICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0ZW1wX2ZpbHRlciA9IHt9O1xuXHRcdFx0XHRcdGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cdFx0XHRcdFx0Z3JpZF9zZWxlY3RlZF9sZW5ndGggPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5Lmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWRJZCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXlbMF07XG5cblx0XHRcdFx0XHRcdHRlbXBfZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdFx0XHR0ZW1wX2ZpbHRlci5maWx0ZXJfY29sdW1ucyA9IHsgdXNlcl9pZDogdHJ1ZSwgZGF0ZV9zdGFtcDogdHJ1ZSB9O1xuXHRcdFx0XHRcdFx0dGVtcF9maWx0ZXIuZmlsdGVyX2RhdGEuaWQgPSBbc2VsZWN0ZWRJZF07XG5cblx0XHRcdFx0XHRcdHRoaXMuYXBpWydnZXQnICsgdGhpcy5hcGkua2V5X25hbWVdKCB0ZW1wX2ZpbHRlciwge1xuXHRcdFx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoICFyZXN1bHRfZGF0YSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdF9kYXRhID0gW107XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSByZXN1bHRfZGF0YVswXTtcblxuXHRcdFx0XHRcdFx0XHRcdGluY2x1ZGVfdXNlcnMgPSBbcmVzdWx0X2RhdGEudXNlcl9pZF07XG5cblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEuaW5jbHVkZV91c2VyX2lkcyA9IGluY2x1ZGVfdXNlcnM7XG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLnNlbGVjdF9kYXRlID0gcmVzdWx0X2RhdGEuZGF0ZV9zdGFtcDtcblxuXHRcdFx0XHRcdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCAkdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnQXV0aG9yaXphdGlvbiAtIFJlcXVlc3QnICksIHdpbmRvdy5sb2NhdGlvbi5ocmVmICk7XG5cdFx0XHRcdFx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1NjaGVkdWxlJywgZmlsdGVyICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdH1cblxuXHRpbml0UGVybWlzc2lvbigpIHtcblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCB0aGlzLnBlcm1pc3Npb25faWQsICd2aWV3JyApIHx8IFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCB0aGlzLnBlcm1pc3Npb25faWQsICd2aWV3X2NoaWxkJyApICkge1xuXHRcdFx0dGhpcy5zaG93X3NlYXJjaF90YWIgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfc2VhcmNoX3RhYiA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5qb2JVSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfam9iX3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X2pvYl91aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5qb2JJdGVtVUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X2pvYl9pdGVtX3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X2pvYl9pdGVtX3VpID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnB1bmNoVGFnVUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X3B1bmNoX3RhZ191aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19wdW5jaF90YWdfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYnJhbmNoVUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X2JyYW5jaF91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19icmFuY2hfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZGVwYXJ0bWVudFVJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19kZXBhcnRtZW50X3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X2RlcGFydG1lbnRfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBFcnJvcjogVW5jYXVnaHQgVHlwZUVycm9yOiAoaW50ZXJtZWRpYXRlIHZhbHVlKS5pc0JyYW5jaEFuZERlcGFydG1lbnRBbmRKb2JBbmRKb2JJdGVtQW5kUHVuY2hUYWdFbmFibGVkIGlzIG5vdCBhIGZ1bmN0aW9uIG9uIGxpbmUgMjA3XG5cdFx0dmFyIGNvbXBhbnlfYXBpID0gVFRBUEkuQVBJQ29tcGFueTtcblx0XHRpZiAoIGNvbXBhbnlfYXBpICYmIF8uaXNGdW5jdGlvbiggY29tcGFueV9hcGkuaXNCcmFuY2hBbmREZXBhcnRtZW50QW5kSm9iQW5kSm9iSXRlbUFuZFB1bmNoVGFnRW5hYmxlZCApICkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IGNvbXBhbnlfYXBpLmlzQnJhbmNoQW5kRGVwYXJ0bWVudEFuZEpvYkFuZEpvYkl0ZW1BbmRQdW5jaFRhZ0VuYWJsZWQoIHsgYXN5bmM6IGZhbHNlIH0gKS5nZXRSZXN1bHQoKTtcblx0XHR9XG5cblx0XHRpZiAoICFyZXN1bHQgKSB7XG5cdFx0XHR0aGlzLnNob3dfYnJhbmNoX3VpID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNob3dfZGVwYXJ0bWVudF91aSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zaG93X2pvYl91aSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zaG93X2pvYl9pdGVtX3VpID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNob3dfcHVuY2hfdGFnX3VpID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggIXJlc3VsdC5icmFuY2ggKSB7XG5cdFx0XHRcdHRoaXMuc2hvd19icmFuY2hfdWkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhcmVzdWx0LmRlcGFydG1lbnQgKSB7XG5cdFx0XHRcdHRoaXMuc2hvd19kZXBhcnRtZW50X3VpID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggIXJlc3VsdC5qb2IgKSB7XG5cdFx0XHRcdHRoaXMuc2hvd19qb2JfdWkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhcmVzdWx0LmpvYl9pdGVtICkge1xuXHRcdFx0XHR0aGlzLnNob3dfam9iX2l0ZW1fdWkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhcmVzdWx0LnB1bmNoX3RhZyApIHtcblx0XHRcdFx0dGhpcy5zaG93X3B1bmNoX3RhZ191aSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHR9XG5cblx0c2V0RWRpdE1lbnVFZGl0SWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0aWYgKCAhdGhpcy5lZGl0UGVybWlzc2lvblZhbGlkYXRlKCAncmVxdWVzdCcgKSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cblx0XHQvL0lmIGVkaXRfY2hpbGQgaXMgRkFMU0UgYW5kIHRoaXMgaXMgYSBjaGlsZCByZWNvcmQsIGlucHV0cyBzaG91bGQgYmUgcmVhZC1vbmx5LlxuXHRcdGlmICggdGhpcy5lZGl0T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCAncmVxdWVzdCcgKSApIHtcblx0XHRcdHRoaXMuZW5hYmxlX2VkaXRfdmlld191aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZW5hYmxlX2VkaXRfdmlld191aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggIXRoaXMuZWRpdE93bmVyT3JDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSggJ3JlcXVlc3QnICkgfHwgdGhpcy5pc19hZGQgfHwgdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRPdmVybGFwcGluZ1NoaWZ0cygpIHtcblx0XHRsZXQgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvL0RvIG5vdCBnZXQgb3ZlcmxhcHBpbmcgc2hpZnRzIGlmIHVzZXIgZG9lcyBub3QgaGF2ZSBzY2hlZHVsZSBwZXJtaXNzaW9ucywgaXMgb24gYSBsb3dlciBwcm9kdWN0IGVkaXRpb24gb3IgcmVxdWVzdCBpcyBub3QgYSBzY2hlZHVsZSBjaGFuZ2UuXG5cdFx0aWYgKCB0aGlzLm92ZXJsYXBwaW5nU2hpZnRVSVZhbGlkYXRlKCkgPT0gZmFsc2UgfHwgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA8IDE1ICkgfHwgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAzMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSA0MCApID09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCBkYXRhID0ge307XG5cdFx0ZGF0YS5zdGFydF9kYXRlID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGU7XG5cdFx0ZGF0YS5lbmRfZGF0ZSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5lbmRfZGF0ZTtcblx0XHRkYXRhLnVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblx0XHRkYXRhLnN0YXJ0X3RpbWUgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfdGltZTtcblx0XHRkYXRhLmVuZF90aW1lID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmVuZF90aW1lO1xuXG5cdFx0ZGF0YS5vdmVybGFwX3R5cGVfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQub3ZlcmxhcF90eXBlX2lkO1xuXG5cdFx0ZGF0YS5zY2hlZHVsZV9wb2xpY3lfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2NoZWR1bGVfcG9saWN5X2lkO1xuXHRcdGRhdGEuYWJzZW5jZV9wb2xpY3lfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYWJzZW5jZV9wb2xpY3lfaWQ7XG5cdFx0ZGF0YS5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZDtcblxuXHRcdGRhdGEucmVxdWVzdGVkX2RheXMgPSB7fTtcblxuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbMF0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3VuO1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbMV0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubW9uO1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbMl0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHVlO1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbM10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQud2VkO1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbNF0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudGh1O1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbNV0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZnJpO1xuXHRcdGRhdGEucmVxdWVzdGVkX2RheXNbNl0gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2F0O1xuXG5cdFx0ZGF0YS5pc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdDtcblxuXHRcdHRoaXMuc2NoZWR1bGVfYXBpLmdldE92ZXJsYXBwaW5nU2hpZnRzKCBkYXRhLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0bGV0IHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdGlmICggIXJlc3VsdF9kYXRhIHx8ICFyZXN1bHRfZGF0YS5zcGxpdCApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhID0gcmVzdWx0X2RhdGE7XG5cblx0XHRcdFx0JHRoaXMuYnVpbGRPdmVybGFwcGluZ1NoaWZ0SW5mbygpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkT3ZlcmxhcHBpbmdTaGlmdEluZm8oKSB7XG5cdFx0bGV0ICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdC8vSXNzdWUgIzMyMTYgLSBFcnJvcjogVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmcgJ292ZXJsYXBfdHlwZV9pZCcpXG5cdFx0XHQvL1RoaXMgY291bGQgaGFwcGVuIHVuZGVyIHJhY2UgY29uZGl0aW9ucyBvciBvcGVuaW5nIGEgcmVxdWVzdCBhbmQgdGhlbiBxdWlja2x5IGNsb3NpbmcgaXQgd2hlbiBleHBlcmllbmNpbmcgbGF0ZW5jeS5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgb3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgPSAnJztcblx0XHRsZXQgc3BsaXRfc2hpZnRzID0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydzcGxpdCddO1xuXHRcdGxldCBzaGlmdHNfYWZ0ZXIgPSAwO1xuXHRcdGxldCBzaGlmdHNfYmVmb3JlID0gMDtcblx0XHRsZXQgc2hpZnRzX2FmdGVyX3RvdGFsX3RpbWUgPSAwO1xuXHRcdGxldCBzaGlmdHNfYmVmb3JlX3RvdGFsX3RpbWUgPSAwO1xuXG5cdFx0bGV0IHN1Z2dlc3RlZF9vdmVybGFwX3R5cGVfaWQgPSAxMDsgLy9SZXBsYWNlXG5cblx0XHRzaGlmdHNfYWZ0ZXIgPSB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXS5sZW5ndGg7XG5cdFx0c2hpZnRzX2FmdGVyX3RvdGFsX3RpbWUgKz0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydub19vdmVybGFwJ10ucmVkdWNlKCAoIGEsIGIgKSA9PiBwYXJzZUZsb2F0KCBhICkgKyBwYXJzZUZsb2F0KCBiLnRvdGFsX3RpbWUgKSwgMCApO1xuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm92ZXJsYXBfdHlwZV9pZCA9PSAxMCApIHsgLy9SZXBsYWNlXG5cdFx0XHRzaGlmdHNfYWZ0ZXIgKz0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ10ubGVuZ3RoO1xuXHRcdFx0c2hpZnRzX2FmdGVyX3RvdGFsX3RpbWUgKz0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ10ucmVkdWNlKCAoIGEsIGIgKSA9PiBwYXJzZUZsb2F0KCBhICkgKyBwYXJzZUZsb2F0KCBiLnRvdGFsX3RpbWUgKSwgMCApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5vdmVybGFwX3R5cGVfaWQgPT0gMjAgKSB7IC8vU3BsaXRcblx0XHRcdHNoaWZ0c19hZnRlciArPSBzcGxpdF9zaGlmdHMubGVuZ3RoO1xuXHRcdFx0c2hpZnRzX2FmdGVyX3RvdGFsX3RpbWUgKz0gc3BsaXRfc2hpZnRzLnJlZHVjZSggKCBhLCBiICkgPT4gYSArIGIudG90YWxfdGltZSwgMCApO1xuXHRcdH1cblx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdCA9PSB0cnVlICkge1xuXHRcdFx0c2hpZnRzX2FmdGVyICs9IHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnb3Blbl9yZXBsYWNlZCddLmxlbmd0aDtcblx0XHRcdHNoaWZ0c19hZnRlcl90b3RhbF90aW1lICs9IHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnb3Blbl9yZXBsYWNlZCddLnJlZHVjZSggKCBhLCBiICkgPT4gcGFyc2VGbG9hdCggYSApICsgcGFyc2VGbG9hdCggYi50b3RhbF90aW1lICksIDAgKTtcblx0XHR9XG5cdFx0c2hpZnRzX2JlZm9yZSA9IHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnb3JpZ2luYWwnXS5maWx0ZXIoIHNoaWZ0ID0+ICFzaGlmdC5ub3RfdW5pcXVlICYmICFzaGlmdC5kb19ub3Rfc3BsaXQgKS5sZW5ndGg7XG5cdFx0c2hpZnRzX2JlZm9yZV90b3RhbF90aW1lID0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcmlnaW5hbCddLmZpbHRlciggc2hpZnQgPT4gIXNoaWZ0Lm5vdF91bmlxdWUgJiYgIXNoaWZ0LmRvX25vdF9zcGxpdCApLnJlZHVjZSggKCBhLCBiICkgPT4gcGFyc2VGbG9hdCggYSApICsgcGFyc2VGbG9hdCggYi50b3RhbF90aW1lICksIDAgKTtcblx0XHQkKCAnI292ZXJsYXBwaW5nLXNoaWZ0LXRvdGFsJyApLnRleHQoICcoICcgKyBzaGlmdHNfYmVmb3JlICsgJyAvICcgKyBzaGlmdHNfYWZ0ZXIgKyAnICknICk7XG5cdFx0Ly9Hcm91cCBtb2RpZmllZCBzaGlmdHMgYnkgcGFyZW50IChzcGVjaWZpYyBzdGFydGluZyBzaGlmdClcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNwbGl0X3NoaWZ0cyApICkge1xuXHRcdFx0bGV0IHNoaWZ0X2RhdGFfbWFwID0ge307XG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzcGxpdF9zaGlmdHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggc3BsaXRfc2hpZnRzW2ldLnNwbGl0X3N0YXRlID09PSAnbm9fc3BsaXQnICkge1xuXHRcdFx0XHRcdC8vTm8gY2hhbmdlIHRvIHRoaXMgc2hpZnQuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhc2hpZnRfZGF0YV9tYXBbc3BsaXRfc2hpZnRzW2ldLnNwbGl0X3BhcmVudF0gKSB7XG5cdFx0XHRcdFx0c2hpZnRfZGF0YV9tYXBbc3BsaXRfc2hpZnRzW2ldLnNwbGl0X3BhcmVudF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaGlmdF9kYXRhX21hcFtzcGxpdF9zaGlmdHNbaV0uc3BsaXRfcGFyZW50XS5wdXNoKCBzcGxpdF9zaGlmdHNbaV0gKTtcblxuXHRcdFx0XHQvL0NoZWNrIGlmIHNwbGl0IG92ZXJsYXBzIDwgNTAlIG9mIHBhcmVudCAob3JpZ2luYWwpIHNoaWZ0LiBPbmx5IGNoZWNrIGlmIHNwbGl0IGlzIG5vdCBhbHJlYWR5IHN1Z2dlc3RlZC5cblx0XHRcdFx0aWYgKCBzdWdnZXN0ZWRfb3ZlcmxhcF90eXBlX2lkID09IDEwICkgeyAvL1JlcGxhY2Vcblx0XHRcdFx0XHRsZXQgcGFyZW50X3NoaWZ0ID0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcmlnaW5hbCddLmZpbmQoIHNoaWZ0ID0+IHNoaWZ0LmlkID09PSBzcGxpdF9zaGlmdHNbaV0uc3BsaXRfcGFyZW50ICk7XG5cdFx0XHRcdFx0aWYgKCBwYXJlbnRfc2hpZnQgKSB7XG5cdFx0XHRcdFx0XHRsZXQgc3BsaXRfc2hpZnRfcGVyY2VudCA9ICggcGFyc2VGbG9hdCggc3BsaXRfc2hpZnRzW2ldLnRvdGFsX3RpbWUgKSAvIHBhcnNlRmxvYXQoIHBhcmVudF9zaGlmdC50b3RhbF90aW1lICkgKSAqIDEwMDtcblx0XHRcdFx0XHRcdGlmICggc3BsaXRfc2hpZnRfcGVyY2VudCA8IDUwICkge1xuXHRcdFx0XHRcdFx0XHRzdWdnZXN0ZWRfb3ZlcmxhcF90eXBlX2lkID0gMjA7IC8vU3BsaXRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0YWJsZSBjbGFzcz1cIm92ZXJsYXBwaW5nLWluZm8tdGFibGVcIj4nO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5vdmVybGFwX3R5cGVfaWQgIT0gc3VnZ2VzdGVkX292ZXJsYXBfdHlwZV9pZCApIHtcblx0XHRcdFx0bGV0IHN1Z2dlc3RlZF9vdmVybGFwX2xhYmVsID0gc3VnZ2VzdGVkX292ZXJsYXBfdHlwZV9pZCA9PSAxMCA/ICQuaTE4bi5fKCAnUmVwbGFjZScgKSA6ICQuaTE4bi5fKCAnU3BsaXQnICk7XG5cdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8dHI+PHRoIGNvbHNwYW49XCIzXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiByZWQ7XCI+JyArICQuaTE4bi5fKCAnU3VnZ2VzdGVkIE92ZXJsYXBwaW5nIFNoaWZ0KHMpIE1vZGUnICkgKyAnOiA8c3Ryb25nPicgKyBzdWdnZXN0ZWRfb3ZlcmxhcF9sYWJlbCArICc8L3N0cm9uZz48L3RoPjwvdHI+Jztcblx0XHRcdFx0Ly9NYWtlIHRoZSBvdmVybGFwcGluZyBpY29uIHJlZCBpZiB0aGUgc3VnZ2VzdGVkIG92ZXJsYXAgdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBvdmVybGFwIHR5cGUuXG5cdFx0XHRcdC8vVGhpcyBpcyB0byBkcmF3IHRoZSB1c2VycycgYXR0ZW50aW9uLlxuXHRcdFx0XHQkKCAnI292ZXJsYXBwaW5nLXNoaWZ0LWljb24nICkuY3NzKCAnY29sb3InLCAncmVkJyApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JCggJyNvdmVybGFwcGluZy1zaGlmdC1pY29uJyApLmNzcyggJ2NvbG9yJywgJycgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQub3ZlcmxhcF90eXBlX2lkID09IDIwICYmIHNwbGl0X3NoaWZ0cy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRoIGNvbHNwYW49XCIzXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIj4nICsgJC5pMThuLl8oICdPdmVybGFwcGluZyBTaGlmdHMnICkgKyAnPC90aD48L3RyPic7XG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQub3ZlcmxhcF90eXBlX2lkID09IDEwICYmIHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnb3Blbl9yZXBsYWNlZCddLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8dHI+PHRoIGNvbHNwYW49XCIzXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIj4nICsgJC5pMThuLl8oICdSZXBsYWNlZCBTaGlmdHMnICkgKyAnPC90aD48L3RyPic7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggXy5zaXplKCBzaGlmdF9kYXRhX21hcCApID4gMCApIHtcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gdGhpcy5nZXRPdmVybGFwcGluZ1NoaWZ0SGVhZGVySHRtbCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBsZXQgc2hpZnRfZGF0YSBpbiBzaGlmdF9kYXRhX21hcCApIHtcblx0XHRcdFx0bGV0IHBhcmVudF9kYXRhID0gdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcmlnaW5hbCddLmZpbmQoIHNoaWZ0ID0+IHNoaWZ0LmlkID09PSBzaGlmdF9kYXRhX21hcFtzaGlmdF9kYXRhXVswXS5zcGxpdF9wYXJlbnQgKTtcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0cj4nO1xuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRkPicgKyBwYXJlbnRfZGF0YS5zdGFydF9kYXRlICsgJzwvdGQ+Jztcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZD4nICsgcGFyZW50X2RhdGEuc3RhcnRfdGltZSArICcgLSAnICsgcGFyZW50X2RhdGEuZW5kX3RpbWUgKyAnID0gJyArIEdsb2JhbC5nZXRUaW1lVW5pdCggcGFyZW50X2RhdGEudG90YWxfdGltZSApICsgJzwvdGQ+JztcblxuXHRcdFx0XHRsZXQgdGFibGVfcm93X2JyZWFrID0gZmFsc2U7XG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNoaWZ0X2RhdGFfbWFwW3NoaWZ0X2RhdGFdLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm92ZXJsYXBfdHlwZV9pZCA9PSAyMCB8fCAoIHNoaWZ0X2RhdGFfbWFwW3NoaWZ0X2RhdGFdW2ldLnNwbGl0X3N0YXRlID09PSAnbmV3JyB8fCBzaGlmdF9kYXRhX21hcFtzaGlmdF9kYXRhXVtpXS5zcGxpdF9zdGF0ZSA9PT0gJ3JlcGxhY2VkJyApICkgeyAvL1NwbGl0XG5cdFx0XHRcdFx0XHRpZiAoIHRhYmxlX3Jvd19icmVhayA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzwvdHI+Jztcblx0XHRcdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0cj4nO1xuXHRcdFx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRkPicgKyBzaGlmdF9kYXRhX21hcFtzaGlmdF9kYXRhXVtpXS5zdGFydF9kYXRlICsgJzwvdGQ+Jztcblx0XHRcdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZD48L3RkPic7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsZXQgbW9kaWZpZWRfbGFiZWwgPSBzaGlmdF9kYXRhX21hcFtzaGlmdF9kYXRhXVtpXS5zcGxpdF9zdGF0ZSA9PT0gJ25ldycgPyAkLmkxOG4uXyggJ05ldycgKSA6ICQuaTE4bi5fKCAnTW9kaWZpZWQnICk7XG5cdFx0XHRcdFx0XHRsZXQgY2VsbF9jbGFzcyA9IHNoaWZ0X2RhdGFfbWFwW3NoaWZ0X2RhdGFdW2ldLmlzX2Fic2VuY2UgPyAnb3ZlcmxhcC1hYnNlbmNlJyA6ICcnO1xuXHRcdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZCBjbGFzcyA9XCInICsgY2VsbF9jbGFzcyArICdcIj4nICsgc2hpZnRfZGF0YV9tYXBbc2hpZnRfZGF0YV1baV0uc3RhcnRfdGltZSArICcgLSAnICsgc2hpZnRfZGF0YV9tYXBbc2hpZnRfZGF0YV1baV0uZW5kX3RpbWUgKyAnID0gJyArIEdsb2JhbC5nZXRUaW1lVW5pdCggc2hpZnRfZGF0YV9tYXBbc2hpZnRfZGF0YV1baV0udG90YWxfdGltZSApICsgJyBbJyArIG1vZGlmaWVkX2xhYmVsICsgJ10gPC90ZD4nO1xuXHRcdFx0XHRcdFx0aWYgKCB0YWJsZV9yb3dfYnJlYWsgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8L3RyPic7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWJsZV9yb3dfYnJlYWsgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPC90cj4nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnbm9fb3ZlcmxhcCddICkgJiYgdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydub19vdmVybGFwJ10ubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDE1cHggc29saWQgdHJhbnNwYXJlbnQ7XCI+PC90cj4nOyAvL2JsYW5rIHJvdyBmb3Igc3BhY2luZ1xuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRyPjx0aCBjb2xzcGFuPVwiM1wiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+JyArICQuaTE4bi5fKCAnTmV3IFNoaWZ0cyAoTm90IE92ZXJsYXBwaW5nKScgKSArICc8L3RoPjwvdHI+JztcblxuXHRcdFx0XHRpZiAoIF8uc2l6ZSggc2hpZnRfZGF0YV9tYXAgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSB0aGlzLmdldE92ZXJsYXBwaW5nU2hpZnRIZWFkZXJIdG1sKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRsZXQgdHJfY2xhc3MgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucmVxdWVzdF9zY2hlZHVsZV9zdGF0dXNfaWQgPT0gMjAgPyAnb3ZlcmxhcC1hYnNlbmNlJyA6ICcnO1xuXHRcdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8dHIgY2xhc3M9XCInICsgdHJfY2xhc3MgKyAnXCI+Jztcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRkPicgKyB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXVtpXS5zdGFydF9kYXRlICsgJzwvdGQ+Jztcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRkPjwvdGQ+Jztcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRkPicgKyB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXVtpXS5zdGFydF90aW1lICsgJyAtICcgKyB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXVtpXS5lbmRfdGltZSArICcgPSAnICsgR2xvYmFsLmdldFRpbWVVbml0KCB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXVtpXS50b3RhbF90aW1lICkgKyAnPC90ZD4nO1xuXHRcdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8dHI+Jztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdCA9PSB0cnVlICYmIEFycmF5LmlzQXJyYXkoIHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfZGF0YVsnb3Blbl9yZXBsYWNlZCddICkgJiYgdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ10ubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDE1cHggc29saWQgdHJhbnNwYXJlbnQ7XCI+PC90cj4nOyAvL2JsYW5rIHJvdyBmb3Igc3BhY2luZ1xuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRyPjx0aCBjb2xzcGFuPVwiM1wiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+JyArICQuaTE4bi5fKCAnTmV3IE9wZW4gU2hpZnRzJyApICsgJzwvdGg+PC90cj4nO1xuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ29wZW5fcmVwbGFjZWQnXS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRyPic7XG5cdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZD4nICsgdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ11baV0uc3RhcnRfZGF0ZSArICc8L3RkPic7XG5cdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZD48L3RkPic7XG5cdFx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0ZD4nICsgdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ11baV0uc3RhcnRfdGltZSArICcgLSAnICsgdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ11baV0uZW5kX3RpbWUgKyAnID0gJyArIEdsb2JhbC5nZXRUaW1lVW5pdCggdGhpcy5vdmVybGFwcGluZ19zaGlmdF9kYXRhWydvcGVuX3JlcGxhY2VkJ11baV0udG90YWxfdGltZSApICsgJzwvdGQ+Jztcblx0XHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRyPic7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ29yaWdpbmFsJ10ubGVuZ3RoID4gMCB8fCB0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2RhdGFbJ25vX292ZXJsYXAnXS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMTVweCBzb2xpZCB0cmFuc3BhcmVudDtcIj48L3RyPic7IC8vYmxhbmsgcm93IGZvciBzcGFjaW5nXG5cdFx0XHRcdG92ZXJsYXBwaW5nX3NoaWZ0c19odG1sICs9ICc8dHIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIj4gPHRoPicgKyAkLmkxOG4uXyggJ1RvdGFsIFNoaWZ0cycgKSArICc8L3RoPjx0aD4nICsgc2hpZnRzX2JlZm9yZSArICcgPSAnICsgR2xvYmFsLmdldFRpbWVVbml0KCBzaGlmdHNfYmVmb3JlX3RvdGFsX3RpbWUgKSArICc8L3RoPiA8dGg+JyArIHNoaWZ0c19hZnRlciArICcgPSAnICsgR2xvYmFsLmdldFRpbWVVbml0KCBzaGlmdHNfYWZ0ZXJfdG90YWxfdGltZSApICsgJzwvdGg+PC90cj4nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKz0gJzx0cj48dGggY29sc3Bhbj1cIjNcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiPicgKyAkLmkxOG4uXyggJ05vIE5ldyBvciBPdmVybGFwcGluZyBTaGlmdHMnICkgKyAnPC90aD4nICsgb3ZlcmxhcHBpbmdfc2hpZnRzX2h0bWwgKyAnPC90cj4nO1xuXHRcdFx0fVxuXG5cdFx0XHRvdmVybGFwcGluZ19zaGlmdHNfaHRtbCArPSAnPC90YWJsZT4nO1xuXHRcdH1cblxuXHRcdGlmICggJHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfaW5mbyApIHtcblx0XHRcdCR0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2luZm8ucXRpcCgge1xuXHRcdFx0XHRzaG93OiB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdjbGljaycsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwLFxuXHRcdFx0XHRcdGVmZmVjdDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaWRlOiB7XG5cdFx0XHRcdFx0ZXZlbnQ6IFsndW5mb2N1cyBjbGljayddLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdHlsZToge1xuXHRcdFx0XHRcdHdpZHRoOiA1MjUsIC8vRHluYW1pY2FsbHkgY2hhbmdpbmcgdGhlIHdpZHRoIGNhdXNlcyBkaXNwbGF5IGJ1Z3Mgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBBYnNlbmNlIFBvbGljaWVzIGFuZCB0aGVyZWJ5IHdpZHRocy5cblx0XHRcdFx0XHRjbGFzc2VzOiAnb3ZlcmxhcHBpbmctaW5mby1kaXNwbGF5J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiBvdmVybGFwcGluZ19zaGlmdHNfaHRtbCxcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRnZXRPdmVybGFwcGluZ1NoaWZ0SGVhZGVySHRtbCgpIHtcblx0XHRyZXR1cm4gYDx0cj5cblx0XHRcdFx0XHQ8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIj5gICsgJC5pMThuLl8oICdEYXRlJyApICsgYDwvdGg+XG5cdFx0XHRcdFx0PHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+YCArICQuaTE4bi5fKCAnQmVmb3JlJyApICsgYDwvdGg+XG5cdFx0XHRcdFx0PHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+YCArICQuaTE4bi5fKCAnQWZ0ZXInICkgKyBgPC90aD5cblx0XHRcdFx0PC90cj5cblx0XHRcdFx0YDtcblx0fVxuXG5cdC8vIENyZWF0ZXMgdGhlIHJlY29yZCBzaGlwcGVkIHRvIHRoZSBBUEkgYXQgc2V0TWVzc3NhZ2Vcblx0dW5pZm9ybU1lc3NhZ2VWYXJpYWJsZSggcmVjb3JkcyApIHtcblx0XHR2YXIgbXNnID0ge307XG5cblx0XHRtc2cuc3ViamVjdCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1snc3ViamVjdCddLmdldFZhbHVlKCk7XG5cdFx0bXNnLmJvZHkgPSB0aGlzLmVkaXRfdmlld191aV9kaWNbJ2JvZHknXS5nZXRWYWx1ZSgpO1xuXHRcdG1zZy5vYmplY3RfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2lkJ107XG5cdFx0bXNnLm9iamVjdF90eXBlX2lkID0gNTA7XG5cblx0XHRyZXR1cm4gbXNnO1xuXHR9XG5cblx0Z2V0UmVxdWVzdFRhYkh0bWwoKSB7XG5cdFx0cmV0dXJuIGBcblx0XHQ8ZGl2IGlkPVwidGFiX3JlcXVlc3RcIiBjbGFzcz1cImVkaXQtdmlldy10YWItb3V0c2lkZVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9yZXF1ZXN0X2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJmaXJzdC1jb2x1bW4gZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImF1dGhvcml6YXRpb24tZ3JpZC1kaXYgaW5zaWRlLWdyaWQgZnVsbC13aWR0aC1jb2x1bW5cIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC10b3AtYm9yZGVyXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtdGl0bGUgc2VwYXJhdGVkLWJveFwiPjwvZGl2PlxuXHRcdFx0XHRcdDx0YWJsZSBpZD1cImdyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3R0b20tZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC1ib3R0b20tYm9yZGVyXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2VwYXJhdGUgZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInNlY29uZC1jb2x1bW4gZW1iZWRkZWQtbWVzc2FnZS10ZW1wbGF0ZSBmdWxsLXdpZHRoLWNvbHVtblwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDBcIj48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2343\n")}}]);