TimeTrex/interface/html5/dist/hr-kpi-UserReviewControlViewController.bundle.js

1 line
96 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["hr-kpi-UserReviewControlViewController"],{7454:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserReviewControlViewController\": () => (/* binding */ UserReviewControlViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass UserReviewControlViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#user_review_control_view_container',\n\n\n\n\t\t\ttype_array: null,\n\t\t\tstatus_array: null,\n\t\t\tterm_array: null,\n\t\t\tseverity_array: null,\n\n\t\t\tkpi_group_array: null,\n\t\t\toriginal_user_review_data: [],\n\n\t\t\tdocument_object_type_id: null,\n\n\t\t\tkpi_group_api: null,\n\n\t\t\tuser_review_api: null,\n\n\t\t\tkpi_api: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'UserReviewControlEditView.html';\n\t\tthis.permission_id = 'user_review';\n\t\tthis.viewId = 'UserReviewControl';\n\t\tthis.script_name = 'UserReviewControlView';\n\t\tthis.table_name_key = 'user_review_control';\n\t\tthis.context_menu_name = $.i18n._( 'Reviews' );\n\t\tthis.navigation_label = $.i18n._( 'Review' );\n\t\tthis.api = TTAPI.APIUserReviewControl;\n\t\tthis.kpi_group_api = TTAPI.APIKPIGroup;\n\t\tthis.user_review_api = TTAPI.APIUserReview;\n\t\tthis.kpi_api = TTAPI.APIKPI;\n\t\tthis.document_object_type_id = 220;\n\t\tthis.render();\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\tthis.buildContextMenu( true );\n\t\t} else {\n\t\t\tthis.buildContextMenu();\n\t\t}\n\n\t\t//call init data in parent view\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.initData();\n\t\t}\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['mass_edit'],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Print' ),\n\t\t\t\t\tid: 'pdf_review_print',\n\t\t\t\t\tvue_icon: 'tticon tticon-print_black_24dp',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\tsort_order: 100\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tvar options = [\n\t\t\t{ option_name: 'type', api: this.api },\n\t\t\t{ option_name: 'status', api: this.api },\n\t\t\t{ option_name: 'term', api: this.api },\n\t\t\t{ option_name: 'severity', api: this.api },\n\t\t];\n\n\t\tthis.initDropDownOptions( options );\n\n\t\tthis.kpi_group_api.getKPIGroup( false, false, false, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = Global.clone( res.getResult() );\n\n\t\t\t\t//Error: Uncaught TypeError: Cannot set property 'name' of undefined in /interface/html5/#!m=Employee&a=edit&id=41499&tab=Reviews line 60\n\t\t\t\tif ( !res || !res[0] ) {\n\t\t\t\t\t$this.kpi_group_array = [];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres[0].name = '-- ' + $.i18n._( 'Add KPIs' ) + ' --';\n\n\t\t\t\tvar all = {};\n\t\t\t\tall.name = '-- ' + $.i18n._( 'All' ) + ' --';\n\t\t\t\tall.level = 1;\n\t\t\t\tall.id = TTUUID.not_exist_id;\n\n\t\t\t\tif ( res.hasOwnProperty( '0' ) && res[0].hasOwnProperty( 'children' ) ) {\n\t\t\t\t\tres[0].children.unshift( all );\n\t\t\t\t} else {\n\t\t\t\t\tres = [\n\t\t\t\t\t\t{ children: [all], id: 0, level: 0, name: '-- ' + $.i18n._( 'Add KPIs' ) + ' --' }\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tres = Global.buildTreeRecord( res );\n\n\t\t\t\t$this.kpi_group_array = res;\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_review': {\n\t\t\t\t'label': $.i18n._( 'Review' ),\n\t\t\t\t'html_template': this.getUserReviewTabHtml(),\n\t\t\t\t'is_multi_column': true\n\t\t\t},\n\t\t\t'tab_attachment': true,\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.APIUserReviewControl,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_kpi_review_control',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//Tab 0 start\n\n\t\tvar tab_review = this.edit_view_tab.find( '#tab_review' );\n\n\t\tvar tab_review_column1 = tab_review.find( '.first-column' );\n\t\tvar tab_review_column2 = tab_review.find( '.second-column' );\n\t\tvar tab_review_column4 = tab_review.find( '.forth-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_review_column1 );\n\t\tthis.edit_view_tabs[0].push( tab_review_column2 );\n\n\t\t// Employee\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUser,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'user_id'\n\t\t} );\n\n\t\tvar default_args = {};\n\t\tdefault_args.permission_section = 'user_review';\n\t\tform_item_input.setDefaultArgs( default_args );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_review_column1, '' );\n\n\t\t// Reviewer\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUser,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'reviewer_user_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Reviewer' ), form_item_input, tab_review_column1 );\n\n\t\t// Status\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'status_id' } );\n\t\tform_item_input.setSourceData( $this.status_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_review_column1 );\n\n\t\t// Type\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'type_id' } );\n\t\tform_item_input.setSourceData( $this.type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_review_column1 );\n\n\t\t// Terms\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'term_id' } );\n\t\tform_item_input.setSourceData( $this.term_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Terms' ), form_item_input, tab_review_column1 );\n\n\t\t// Rating\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'rating', width: 50 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Rating' ), form_item_input, tab_review_column1, '' );\n\n\t\t// Severity\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'severity_id' } );\n\t\tform_item_input.setSourceData( $this.severity_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Severity' ), form_item_input, tab_review_column2, '' );\n\n\t\t// Start Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'start_date' } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_review_column2, '', null );\n\n\t\t// End Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'end_date' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_review_column2, '', null );\n\n\t\t// Due Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'due_date' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Due Date' ), form_item_input, tab_review_column2, '', null );\n\n\t\t//Tags\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TAG_INPUT );\n\n\t\tform_item_input.TTagInput( { field: 'tag', object_type_id: 320 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), form_item_input, tab_review_column2, '', null, null, true );\n\n\t\tif ( this.is_add || this.is_edit ) {\n\t\t\t// Add KPIs from Groups\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\ttree_mode: true,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_tree_column',\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'group_id'\n\t\t\t} );\n\t\t\tform_item_input.setSourceData( $this.kpi_group_array );\n\n\t\t\tvar tab_review_column3 = tab_review.find( '.third-column' ).css( {\n\t\t\t\t'float': 'left',\n\t\t\t\t'margin-top': '10px',\n\t\t\t\t'margin-bottom': '10px'\n\t\t\t} );\n\t\t\ttab_review_column3.find( '.column-form-item-label' ).css( {\n\t\t\t\t'float': 'left',\n\t\t\t\t'margin-right': '10px',\n\t\t\t\t'margin-top': '5px'\n\t\t\t} ).text( $.i18n._( 'Add KPIs from Groups' ) );\n\t\t\ttab_review_column3.find( '.column-form-item-input' ).css( { 'float': 'left' } ).append( form_item_input );\n\n\t\t\tthis.edit_view_ui_dic[form_item_input.getField()] = form_item_input;\n\n\t\t\tform_item_input.bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\t\t$this.onFormItemChange( target, doNotValidate );\n\t\t\t} );\n\t\t}\n\n\t\t// Note\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\n\t\tform_item_input.TTextArea( { field: 'note', width: '100%', height: 66 } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Note' ), form_item_input, tab_review_column4, 'first_last', null, null, true );\n\t}\n\n\tinitInsideEditorUI() {\n\t\t//Inside editor\n\t\tvar tab_review = this.edit_view_tab.find( '#tab_review' );\n\n\t\tvar inside_editor_div = tab_review.find( '.inside-editor-div' );\n\n\t\tvar args = {\n\t\t\tserial: '#',\n\t\t\tname: $.i18n._( 'Key Performance Indicator' ) + '<br>(' + $.i18n._('Hover for Description') + ')',\n\t\t\trating: $.i18n._( 'Result' ),\n\t\t\tnote: $.i18n._( 'Note' )\n\t\t};\n\n\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\n\t\tthis.editor.InsideEditor( {\n\t\t\taddRow: this.insideEditorAddRow,\n\t\t\tremoveRow: this.insideEditorRemoveRow,\n\t\t\tgetValue: this.insideEditorGetValue,\n\t\t\tsetValue: this.insideEditorSetValue,\n\t\t\tonFormItemChange: this.onInsideFormItemChange,\n\t\t\tparent_controller: this,\n\t\t\tapi: this.user_review_api,\n\t\t\trender: getRender(),\n\t\t\trender_args: args,\n\t\t\trender_inline_html: true,\n\t\t\trow_render: getRowRender()\n\n\t\t} );\n\n\t\tfunction getRender() {\n\t\t\treturn `\n\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t<tr class=\"title\" style=\"font-weight: bold\">\n\t\t\t\t\t<td style=\"width: 50px\"><%= serial %></td>\n\t\t\t\t\t<td style=\"width: 820px\"><%= name %></td>\n\t\t\t\t\t<td style=\"width: 70px\"><%= rating %></td>\n\t\t\t\t\t<td style=\"width: 300px;\"><%= note %></td>\n\t\t\t\t</tr>\n\t\t\t</table>`;\n\t\t}\n\n\t\tfunction getRowRender() {\n\t\t\treturn `\n\t\t\t<tr class=\"inside-editor-row data-row\">\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t</tr>`;\n\t\t}\n\n\t\tinside_editor_div.append( this.editor );\n\t}\n\n\t/* jshint ignore:start */\n\n\taddEditFieldToColumn( label, widgets, column, firstOrLastRecord, widgetContainer, saveFormItemDiv, setResizeEvent, saveFormItemDivKey, hasKeyEvent, customLabelWidget ) {\n\n\t\tvar $this = this;\n\t\tvar form_item = $( Global.loadWidgetByName( WidgetNamesDic.EDIT_VIEW_FORM_ITEM ) );\n\t\tvar form_item_label_div = form_item.find( '.edit-view-form-item-label-div' );\n\t\tvar form_item_label = form_item.find( '.edit-view-form-item-label' );\n\t\tvar form_item_input_div = form_item.find( '.edit-view-form-item-input-div' );\n\n\t\tif ( customLabelWidget ) {\n\t\t\tform_item_label.parent().append( customLabelWidget );\n\t\t\tform_item_label.remove();\n\t\t} else {\n\t\t\tform_item_label.text( $.i18n._( label ) );\n\t\t}\n\n\t\tvar widget = widgets;\n\n\t\tif ( Global.isArray( widgets ) ) {\n\n\t\t\tfor ( var i = 0; i < widgets.length; i++ ) {\n\t\t\t\twidget = widgets[i];\n\t\t\t\twidget.css( 'opacity', 0 );\n\n\t\t\t\tthis.edit_view_ui_dic[widget.getField()] = widget;\n\n\t\t\t\twidget.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\t\t\t$this.onFormItemChange( target, doNotValidate );\n\t\t\t\t} );\n\n\t\t\t\tif ( hasKeyEvent ) {\n\t\t\t\t\twidget.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) {\n\t\t\t\t\t\t$this.onFormItemKeyUp( target );\n\t\t\t\t\t} );\n\n\t\t\t\t\twidget.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) {\n\t\t\t\t\t\t$this.onFormItemKeyDown( target );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\twidget.css( 'opacity', 0 );\n\n\t\t\tthis.edit_view_ui_dic[widget.getField()] = widget;\n\n\t\t\twidget.bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\t\t$this.onFormItemChange( target, doNotValidate );\n\t\t\t} );\n\n\t\t\tif ( hasKeyEvent ) {\n\t\t\t\twidget.bind( 'formItemKeyUp', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyUp( target );\n\t\t\t\t} );\n\n\t\t\t\twidget.bind( 'formItemKeyDown', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyDown( target );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Global.isSet( widgetContainer ) ) {\n\t\t\tform_item_input_div.append( widgetContainer );\n\n\t\t} else {\n\t\t\tform_item_input_div.append( widget );\n\t\t}\n\n\t\tif ( setResizeEvent ) {\n\n\t\t\tif ( widget.getField() === 'note' ) {\n\n\t\t\t\tform_item_input_div.css( 'width', '80%' );\n\t\t\t\tform_item_label_div.css( 'height', '80' );\n\t\t\t\twidget.css( { 'width': '100%', 'resize': 'none' } );\n\n\t\t\t} else {\n\n\t\t\t\tform_item.bind( 'resize', function() {\n\n\t\t\t\t\tif ( form_item_label_div.height() !== form_item.height() && form_item.height() !== 0 ) {\n\t\t\t\t\t\tform_item_label_div.css( 'height', form_item.height() );\n\t\t\t\t\t\tform_item.unbind( 'resize' );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\twidget.bind( 'setSize', function() {\n\t\t\t\t\tform_item_label_div.css( 'height', widget.height() + 5 );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t}\n\n\t\tif ( saveFormItemDiv ) {\n\n\t\t\tif ( Global.isArray( widgets ) ) {\n\t\t\t\tthis.edit_view_form_item_dic[widgets[0].getField()] = form_item;\n\t\t\t} else {\n\t\t\t\tthis.edit_view_form_item_dic[widget.getField()] = form_item;\n\t\t\t}\n\n\t\t}\n\n\t\tcolumn.append( form_item );\n\t\t//column.append( \"<div class='clear-both-div'></div>\" );\n\t}\n\n\t/* jshint ignore:end */\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\n\t\tvar default_args = {};\n\t\tdefault_args.permission_section = 'user_review';\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tdefault_args: default_args,\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Reviewer' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'reviewer_user_id',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Type' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'type_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Tags' ),\n\t\t\t\tfield: 'tag',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tin_column: 1,\n\t\t\t\tobject_type_id: 320,\n\t\t\t\tform_item_type: FormItemType.TAG_INPUT\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Terms' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'term_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Severity' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'severity_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Start Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'start_date',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'End Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'end_date',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Due Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'due_date',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'KPI' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'kpi_id',\n\t\t\t\tlayout_name: 'global_kpi',\n\t\t\t\tapi_class: TTAPI.APIKPI,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Created By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'created_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Updated By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'updated_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\t}\n\n\tremoveEditView() {\n\t\tsuper.removeEditView();\n\t\tthis.editor = null;\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tthis.initInsideEditorData();\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tswitch ( key ) {\n\t\t\tcase 'group_id':\n\t\t\t\tvar filter = {};\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\t// why need [c_value, -1], -1 will return all, the filter won't work correct if send -1,remove for testting\n\t\t\t\tfilter.filter_data.group_id = [c_value];\n\t\t\t\tthis.kpi_api['get' + this.kpi_api.key_name]( filter, false, true, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t$this.setInsideEditorData( res );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.current_edit_record[key] = c_value;\n\t\t\t\tif ( !doNotValidate ) {\n\t\t\t\t\tthis.validate();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonInsideFormItemChange( target, doNotValidate ) {\n\t\ttarget.clearErrorStyle();\n\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tswitch ( key ) {\n\t\t\tcase 'rating':\n\t\t\t\tvar minimum_rate = parseInt( target.attr( 'minimum_rate' ) );\n\t\t\t\tvar maximum_rate = parseInt( target.attr( 'maximum_rate' ) );\n\t\t\t\tif ( c_value !== '' ) {\n\t\t\t\t\tc_value = parseInt( c_value );\n\t\t\t\t\tif ( c_value >= minimum_rate && c_value <= maximum_rate ) {\n\t\t\t\t\t\ttarget.clearErrorStyle();\n\t\t\t\t\t\tthis.parent_controller.setEditMenu();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.setErrorStyle( $.i18n._( 'Rating must between' ) + ' ' + minimum_rate + ' ' + $.i18n._( 'and' ) + ' ' + maximum_rate, true );\n\t\t\t\t\t\tthis.parent_controller.setErrorMenu();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tinitInsideEditorData() {\n\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( this.current_edit_record.id ) {\n\n\t\t\targs.filter_data.user_review_control_id = this.current_edit_record['id'];\n\n\t\t\t$this.user_review_api['get' + $this.user_review_api.key_name]( args, true, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$this.setInsideEditorData( res );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* jshint ignore:start */\n\n\tsetInsideEditorData( res ) {\n\t\tvar data = res.getResult();\n\t\tvar len = data.length;\n\n\t\tif ( len > 0 ) {\n\n\t\t\tif ( !this.editor ) {\n\t\t\t\tthis.initInsideEditorUI();\n\t\t\t}\n\n\t\t\tvar serial = 1;\n\t\t\tfor ( var key in data ) {\n\t\t\t\tvar row = data[key];\n\t\t\t\tvar is_existed = false;\n\t\t\t\tif ( !row.kpi_id ) {\n\t\t\t\t\trow.kpi_id = row.id;\n\t\t\t\t\trow.id = false;\n\t\t\t\t}\n\t\t\t\t// the row.kpi_id if existed in this.editor.editor_data?\n\t\t\t\tif ( this.editor.editor_data ) {\n\n\t\t\t\t\tfor ( var i = 0; i < this.editor.editor_data.length; i++ ) {\n\t\t\t\t\t\tvar item = this.editor.editor_data[i];\n\t\t\t\t\t\tif ( row.kpi_id === item.kpi_id ) {\n\t\t\t\t\t\t\tis_existed = true; // the current row has already displayed.\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !is_existed ) {\n\t\t\t\t\t\tserial = this.editor.editor_data.length + 1;\n\t\t\t\t\t\trow.serial = serial;\n\t\t\t\t\t\tthis.editor.editor_data.push( row );\n\t\t\t\t\t}\n\n//\t\t\t\t\tserial++;\n\n\t\t\t\t} else {\n\t\t\t\t\trow.serial = serial;\n\t\t\t\t\tdata[key] = row;\n\t\t\t\t\tserial++;\n\t\t\t\t}\n\n\t\t\t\tif ( !is_existed ) {\n\t\t\t\t\tthis.editor.addRow( row );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( !this.editor.editor_data ) {\n\t\t\t\tthis.original_user_review_data = _.map( data, _.clone );\n\t\t\t\tfor ( let i = 0; i < this.original_user_review_data.length; i++ ) {\n\t\t\t\t\t//Need to convert these jQuery objects to their values so thwt future data change comparisons do not fail.\n\t\t\t\t\tif ( this.original_user_review_data[i].hasOwnProperty( 'rating' ) && this.original_user_review_data[i].rating !== false ) {\n\t\t\t\t\t\tthis.original_user_review_data[i].rating = this.original_user_review_data[i].rating.getValue();\n\t\t\t\t\t}\n\t\t\t\t\tif ( this.original_user_review_data[i].hasOwnProperty( 'note' ) && this.original_user_review_data[i].note !== false ) {\n\t\t\t\t\t\tthis.original_user_review_data[i].note = this.original_user_review_data[i].note.getValue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.editor.editor_data = data;\n\t\t\t}\n\n\t\t}\n\n//\t\t$this.editor.setValue( data );\n\t}\n\n\t/* jshint ignore:end */\n\n//\tinsideEditorSetValue( val ) {\n//\t\tvar len = val.length;\n//\t\tthis.removeAllRows();\n//\n//\t\tif ( len > 0 ) {\n//\t\t\tvar serial = 1;\n//\t\t\tfor ( var i = 0; i < val.length; i++ ) {\n//\t\t\t\tif ( Global.isSet( val[i] ) ) {\n//\t\t\t\t\tvar row = val[i];\n//\t\t\t\t\trow.serial = serial;\n//\t\t\t\t\tthis.addRow( row );\n//\t\t\t\t\tserial++;\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//\n//\t},\n\n\tinsideEditorAddRow( data ) {\n\t\tvar $this = this;\n\t\tif ( !data ) {\n//\t\t\tthis.getDefaultData();\n\t\t} else {\n\t\t\tvar row = this.getRowRender(); //Get Row render\n\t\t\tvar render = this.getRender(); //get render, should be a table\n\t\t\tvar widgets = data; //Save each row's widgets\n\n\t\t\t//Build row widgets\n\n\t\t\t// #\n\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'serial', width: 50 } );\n\t\t\tform_item_input.setValue( data.serial ? data.serial : null );\n//\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\trow.children().eq( 0 ).append( form_item_input );\n\n\t\t\t// Key Performance Indicator\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'name', width: 600 } );\n\t\t\tform_item_input.setValue( data.name ? data.name : null );\n\t\t\tform_item_input.attr( 'title', data.description ? data.description : '' );\n\n\t\t\trow.children().eq( 1 ).append( form_item_input );\n\n\t\t\t// Rating\n\t\t\tif ( data.type_id == 10 ) {\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'rating', width: 40 } );\n\t\t\t\tform_item_input.setValue( data.rating ? data.rating : null );\n\t\t\t\tform_item_input.attr( { 'minimum_rate': data.minimum_rate, 'maximum_rate': data.maximum_rate } );\n\t\t\t\tform_item_input.bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\t\t\t$this.onFormItemChange( target, doNotValidate );\n\t\t\t\t} );\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\t\trow.children().eq( 2 ).append( form_item_input );\n\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t} else if ( data.type_id == 20 ) {\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\t\tform_item_input.TCheckbox( { field: 'rating' } );\n\t\t\t\tform_item_input.setValue( data.rating ? ( data.rating >= 1 ? true : false ) : null ); //Rating is numeric, so make sure we pass true/false to TCheckbox.\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\t\trow.children().eq( 2 ).append( form_item_input );\n\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\t\t\t}\n\n\t\t\t// Note\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\t\tform_item_input.TTextArea( {\n\t\t\t\tfield: 'note',\n\t\t\t\tstyle: { width: '300px', height: '20px', 'min-height': '10px' }\n\t\t\t} );\n\t\t\tform_item_input.setValue( data.note ? data.note : null );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\trow.children().eq( 3 ).css( 'text-align', 'right' ).append( form_item_input );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t// end\n\n\t\t\tif ( this.rows_widgets_array.length === 0 ) {\n\t\t\t\t$( render ).append( row );\n\t\t\t} else {\n\t\t\t\t// Get all rows and insert new row according to it's display_order\n\t\t\t\tlet rows = render.find( 'tr' ).get();\n\n\t\t\t\tdata.display_order = parseInt( data.display_order ) || 0;\n\n\t\t\t\tfor ( let i = 0; i < rows.length; i++ ) {\n\t\t\t\t\t// Loop looks for the correct spot to insert the new row based on the value of display_order.\n\t\t\t\t\t// If the last row is undefined or the value of display_order is less than the row to be inserted and the row after this is undefined or has a higher display_order, insert it there.\n\t\t\t\t\tif ( ( i === 0 || $( rows[i] ).attr( 'data-order' ) <= data.display_order ) && ( rows[i + 1] === undefined || $( rows[i + 1] ).attr( 'data-order' ) >= data.display_order ) ) {\n\t\t\t\t\t\t$( rows[i] ).after( row );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Now that the rows are in the correct order, renumber them.\n\t\t\t\trows = render.find( 'tr' ).get();\n\t\t\t\tlet order_number = 1;\n\t\t\t\tfor ( let i = 0; i < rows.length; i++ ) {\n\t\t\t\t\tif ( i !== 0 ) {\n\t\t\t\t\t\t$( rows[i] ).find( \"td:first\" ).text( order_number );\n\t\t\t\t\t\torder_number++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\t\trow.find( '.control-icon' ).hide();\n\t\t\t}\n\n\t\t\tthis.rows_widgets_array.push( widgets );\n\n\t\t\tthis.addIconsEvent( row ); //Bind event to add and minus icon\n\t\t\tthis.removeLastRowLine();\n\n\t\t\t// Attach display_order to the <tr> for easy reordering after adding new KPI groups.\n\t\t\trow.attr('data-order', data.display_order);\n\t\t}\n\t}\n\n\tinsideEditorRemoveRow( row ) {\n\t\tvar index = row[0].rowIndex - 1;\n\t\tvar remove_id = this.rows_widgets_array[index].current_edit_item.id;\n\t\tif ( TTUUID.isUUID( remove_id ) && remove_id != TTUUID.zero_id && remove_id != TTUUID.not_exist_id ) {\n\t\t\tthis.delete_ids.push( remove_id );\n\t\t}\n\t\trow.remove();\n\t\tthis.rows_widgets_array.splice( index, 1 );\n\t\tthis.removeLastRowLine();\n\t}\n\n\tonSaveResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search();\n\t\t\t\t$this.onSaveDone( result );\n\n\t\t\t\t$this.removeEditView();\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorMenu();\n\t\t\t$this.setErrorTips( result );\n\n\t\t}\n\t}\n\n\t// onSaveAndContinueResult( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onEditClick( $this.refresh_id, true );\n\t//\n\t// \t\t\t$this.onSaveAndContinueDone( result );\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\tonEditClick( editId, noRefreshUI ) {\n\t\tvar $this = this;\n\t\tif ( $this.editor ) {\n\t\t\t$this.editor.remove();\n\t\t\t$this.editor = null;\n\t\t}\n\n\t\tsuper.onEditClick( editId, noRefreshUI );\n\t}\n\n\tsaveInsideEditorData( callBack ) {\n\t\tvar $this = this;\n\n\t\tif ( !this.editor ) {\n\t\t\tcallBack();\n\t\t} else {\n\t\t\tvar data = this.editor.getValue( this.refresh_id );\n\t\t\tlet changed_data = this.getChangedRecords( data, this.original_user_review_data, [] );\n\n\t\t\tif ( Array.isArray( changed_data ) && changed_data.length > 0 ) {\n\t\t\t\tthis.user_review_api.setUserReview( changed_data, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tcallBack();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tcallBack();\n\t\t\t}\n\n\t\t}\n\t}\n\n\tinsideEditorGetValue( current_edit_item_id ) {\n\t\tvar len = this.rows_widgets_array.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\tif ( row.rating ) {\n\t\t\t\trow.rating = row.rating.getValue();\n\t\t\t}\n\t\t\trow.note = row.note.getValue();\n\n\t\t\trow.user_review_control_id = current_edit_item_id;\n\n\t\t\tthis.rows_widgets_array[i] = row;\n\t\t}\n\n\t\treturn this.rows_widgets_array;\n\t}\n\n\t_continueDoCopyAsNew() {\n\n\t\tvar $this = this;\n\t\tthis.is_add = true;\n\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\n\t\tif ( Global.isSet( this.edit_view ) ) {\n\n\t\t\tthis.current_edit_record.id = '';\n\t\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\t\tnavigation_div.css( 'display', 'none' );\n\t\t\tif ( this.editor ) {\n\t\t\t\tthis.editor.remove();\n\t\t\t\tthis.editor = null;\n\t\t\t}\n\t\t\tthis.setEditMenu();\n\t\t\tthis.setTabStatus();\n\t\t\tthis.is_changed = false;\n\t\t\tProgressBar.closeOverlay();\n\n\t\t} else {\n\t\t\tsuper._continueDoCopyAsNew();\n\t\t}\n\t}\n\n\tonSaveAndNewResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\t\t\t\tif ( $this.editor ) {\n\t\t\t\t\t$this.editor.remove();\n\t\t\t\t\t$this.editor = null;\n\t\t\t\t}\n\t\t\t\t$this.onAddClick( true );\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorTips( result );\n\t\t\t$this.setErrorMenu();\n\t\t}\n\t}\n\n\tonSaveAndCopyResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\t\t\t\tif ( $this.editor ) {\n\t\t\t\t\t$this.editor.remove();\n\t\t\t\t\t$this.editor = null;\n\t\t\t\t}\n\t\t\t\t$this.onCopyAsNewClick();\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorTips( result );\n\t\t\t$this.setErrorMenu();\n\t\t}\n\t}\n\n\t// onSaveAndNextResult( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.onRightArrowClick();\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onSaveAndNextDone( result );\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\tonRightArrowClick() {\n\t\tif ( this.editor ) {\n\t\t\tthis.editor.remove();\n\t\t\tthis.editor = null;\n\t\t}\n\t\tsuper.onRightArrowClick();\n\t}\n\n\tonLeftArrowClick() {\n\t\tif ( this.editor ) {\n\t\t\tthis.editor.remove();\n\t\t\tthis.editor = null;\n\t\t}\n\t\tsuper.onLeftArrowClick();\n\t}\n\n\tsearchDone() {\n\t\tsuper.searchDone();\n\t\tTTPromise.resolve( 'ReviewView', 'init' );\n\t}\n\n\tsetDefaultMenuReportRelatedIcons( context_btn, grid_selected_length, pId ) {\n\t\tif ( !this.payStubReportIconsValidate() ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length > 0 && this.viewOwnerOrChildPermissionValidate() ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'pdf_review_print':\n\t\t\t\tif ( grid_selected_length > 0 && this.viewOwnerOrChildPermissionValidate() ) {\n\t\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t\t\t} else {\n\t\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tdoFormIFrameCall( postData ) {\n\t\tGlobal.APIFileDownload( 'APIKPIReport', 'getKPIReport', postData );\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tvar $this = this;\n\n\t\tswitch ( id ) {\n\t\t\tcase 'pdf_review_print':\n\t\t\t\tvar grid_selected_id_array;\n\n\t\t\t\tvar ids = [];\n\t\t\t\tif ( $this.edit_view && $this.current_edit_record.id ) {\n\t\t\t\t\tids.push( $this.current_edit_record.id );\n\t\t\t\t} else {\n\t\t\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t\t\t\tvar grid_selected_row = $this.getRecordFromGridById( value );\n\t\t\t\t\t\tids.push( grid_selected_row.id );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tthis.doFormIFrameCall( { 0: { 'user_review_control_id': ids }, 1: 'pdf_review_print' } );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tgetUserReviewTabHtml() {\n\t\treturn `<div id=\"tab_review\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_review_content_div\">\n\t\t\t\t\t\t<div class=\"first-column\"></div>\n\t\t\t\t\t\t<div class=\"second-column\"></div>\n\t\t\t\t\t\t<div class=\"third-column full-width-column\">\n\t\t\t\t\t\t\t<div class=\"third-column-form-item\" style=\"margin-left: 40%\">\n\t\t\t\t\t\t\t\t<div class=\"column-form-item-label\"></div>\n\t\t\t\t\t\t\t\t<div class=\"column-form-item-input\"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"inside-editor-div full-width-column\"></div>\n\t\t\t\t\t\t<div class=\"forth-column full-width-column border-column\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n}\n\nUserReviewControlViewController.loadSubView = function( container, beforeViewLoadedFun, afterViewLoadedFun ) {\n\tGlobal.loadViewSource( 'UserReviewControl', 'SubUserReviewControlView.html', function( result ) {\n\t\tvar args = {};\n\t\tvar template = _.template( result );\n\n\t\tif ( Global.isSet( beforeViewLoadedFun ) ) {\n\t\t\tbeforeViewLoadedFun();\n\t\t}\n\t\tif ( Global.isSet( container ) ) {\n\t\t\tcontainer.html( template( args ) );\n\t\t\tif ( Global.isSet( afterViewLoadedFun ) ) {\n\t\t\t\tTTPromise.wait( 'BaseViewController', 'initialize', function() {\n\t\t\t\t\tafterViewLoadedFun( sub_user_review_control_view_controller );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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OztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSw2QkFBNkIsS0FBSywrQkFBK0IsMEJBQTBCO0FBQzNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixDQUFDOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3MvaHIva3BpL1VzZXJSZXZpZXdDb250cm9sVmlld0NvbnRyb2xsZXIuanM/ZDRjNiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVXNlclJldmlld0NvbnRyb2xWaWV3Q29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcjdXNlcl9yZXZpZXdfY29udHJvbF92aWV3X2NvbnRhaW5lcicsXG5cblxuXG5cdFx0XHR0eXBlX2FycmF5OiBudWxsLFxuXHRcdFx0c3RhdHVzX2FycmF5OiBudWxsLFxuXHRcdFx0dGVybV9hcnJheTogbnVsbCxcblx0XHRcdHNldmVyaXR5X2FycmF5OiBudWxsLFxuXG5cdFx0XHRrcGlfZ3JvdXBfYXJyYXk6IG51bGwsXG5cdFx0XHRvcmlnaW5hbF91c2VyX3Jldmlld19kYXRhOiBbXSxcblxuXHRcdFx0ZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQ6IG51bGwsXG5cblx0XHRcdGtwaV9ncm91cF9hcGk6IG51bGwsXG5cblx0XHRcdHVzZXJfcmV2aWV3X2FwaTogbnVsbCxcblxuXHRcdFx0a3BpX2FwaTogbnVsbFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1VzZXJSZXZpZXdDb250cm9sRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3VzZXJfcmV2aWV3Jztcblx0XHR0aGlzLnZpZXdJZCA9ICdVc2VyUmV2aWV3Q29udHJvbCc7XG5cdFx0dGhpcy5zY3JpcHRfbmFtZSA9ICdVc2VyUmV2aWV3Q29udHJvbFZpZXcnO1xuXHRcdHRoaXMudGFibGVfbmFtZV9rZXkgPSAndXNlcl9yZXZpZXdfY29udHJvbCc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnUmV2aWV3cycgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ1JldmlldycgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSVVzZXJSZXZpZXdDb250cm9sO1xuXHRcdHRoaXMua3BpX2dyb3VwX2FwaSA9IFRUQVBJLkFQSUtQSUdyb3VwO1xuXHRcdHRoaXMudXNlcl9yZXZpZXdfYXBpID0gVFRBUEkuQVBJVXNlclJldmlldztcblx0XHR0aGlzLmtwaV9hcGkgPSBUVEFQSS5BUElLUEk7XG5cdFx0dGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZCA9IDIyMDtcblx0XHR0aGlzLnJlbmRlcigpO1xuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCk7XG5cdFx0fVxuXG5cdFx0Ly9jYWxsIGluaXQgZGF0YSBpbiBwYXJlbnQgdmlld1xuXHRcdGlmICggIXRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdHRoaXMuaW5pdERhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRleGNsdWRlOiBbJ21hc3NfZWRpdCddLFxuXHRcdFx0aW5jbHVkZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUHJpbnQnICksXG5cdFx0XHRcdFx0aWQ6ICdwZGZfcmV2aWV3X3ByaW50Jyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tcHJpbnRfYmxhY2tfMjRkcCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRzb3J0X29yZGVyOiAxMDBcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0aW5pdE9wdGlvbnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBvcHRpb25zID0gW1xuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc3RhdHVzJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3Rlcm0nLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc2V2ZXJpdHknLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuaW5pdERyb3BEb3duT3B0aW9ucyggb3B0aW9ucyApO1xuXG5cdFx0dGhpcy5rcGlfZ3JvdXBfYXBpLmdldEtQSUdyb3VwKCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0cmVzID0gR2xvYmFsLmNsb25lKCByZXMuZ2V0UmVzdWx0KCkgKTtcblxuXHRcdFx0XHQvL0Vycm9yOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCBzZXQgcHJvcGVydHkgJ25hbWUnIG9mIHVuZGVmaW5lZCBpbiAvaW50ZXJmYWNlL2h0bWw1LyMhbT1FbXBsb3llZSZhPWVkaXQmaWQ9NDE0OTkmdGFiPVJldmlld3MgbGluZSA2MFxuXHRcdFx0XHRpZiAoICFyZXMgfHwgIXJlc1swXSApIHtcblx0XHRcdFx0XHQkdGhpcy5rcGlfZ3JvdXBfYXJyYXkgPSBbXTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXNbMF0ubmFtZSA9ICctLSAnICsgJC5pMThuLl8oICdBZGQgS1BJcycgKSArICcgLS0nO1xuXG5cdFx0XHRcdHZhciBhbGwgPSB7fTtcblx0XHRcdFx0YWxsLm5hbWUgPSAnLS0gJyArICQuaTE4bi5fKCAnQWxsJyApICsgJyAtLSc7XG5cdFx0XHRcdGFsbC5sZXZlbCA9IDE7XG5cdFx0XHRcdGFsbC5pZCA9IFRUVVVJRC5ub3RfZXhpc3RfaWQ7XG5cblx0XHRcdFx0aWYgKCByZXMuaGFzT3duUHJvcGVydHkoICcwJyApICYmIHJlc1swXS5oYXNPd25Qcm9wZXJ0eSggJ2NoaWxkcmVuJyApICkge1xuXHRcdFx0XHRcdHJlc1swXS5jaGlsZHJlbi51bnNoaWZ0KCBhbGwgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXMgPSBbXG5cdFx0XHRcdFx0XHR7IGNoaWxkcmVuOiBbYWxsXSwgaWQ6IDAsIGxldmVsOiAwLCBuYW1lOiAnLS0gJyArICQuaTE4bi5fKCAnQWRkIEtQSXMnICkgKyAnIC0tJyB9XG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXG5cdFx0XHRcdCR0aGlzLmtwaV9ncm91cF9hcnJheSA9IHJlcztcblxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblxuXHRcdHN1cGVyLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX3Jldmlldyc6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdSZXZpZXcnICksXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRVc2VyUmV2aWV3VGFiSHRtbCgpLFxuXHRcdFx0XHQnaXNfbXVsdGlfY29sdW1uJzogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCd0YWJfYXR0YWNobWVudCc6IHRydWUsXG5cdFx0XHQndGFiX2F1ZGl0JzogdHJ1ZSxcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyUmV2aWV3Q29udHJvbCxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9rcGlfcmV2aWV3X2NvbnRyb2wnLFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5zZXROYXZpZ2F0aW9uKCk7XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cblx0XHR2YXIgdGFiX3JldmlldyA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9yZXZpZXcnICk7XG5cblx0XHR2YXIgdGFiX3Jldmlld19jb2x1bW4xID0gdGFiX3Jldmlldy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR2YXIgdGFiX3Jldmlld19jb2x1bW4yID0gdGFiX3Jldmlldy5maW5kKCAnLnNlY29uZC1jb2x1bW4nICk7XG5cdFx0dmFyIHRhYl9yZXZpZXdfY29sdW1uNCA9IHRhYl9yZXZpZXcuZmluZCggJy5mb3J0aC1jb2x1bW4nICk7XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9yZXZpZXdfY29sdW1uMSApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX3Jldmlld19jb2x1bW4yICk7XG5cblx0XHQvLyBFbXBsb3llZVxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICd1c2VyX2lkJ1xuXHRcdH0gKTtcblxuXHRcdHZhciBkZWZhdWx0X2FyZ3MgPSB7fTtcblx0XHRkZWZhdWx0X2FyZ3MucGVybWlzc2lvbl9zZWN0aW9uID0gJ3VzZXJfcmV2aWV3Jztcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0RGVmYXVsdEFyZ3MoIGRlZmF1bHRfYXJncyApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmV2aWV3X2NvbHVtbjEsICcnICk7XG5cblx0XHQvLyBSZXZpZXdlclxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3Jldmlld2VyX3VzZXJfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUmV2aWV3ZXInICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3Jldmlld19jb2x1bW4xICk7XG5cblx0XHQvLyBTdGF0dXNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3N0YXR1c19pZCcgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5zdGF0dXNfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N0YXR1cycgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmV2aWV3X2NvbHVtbjEgKTtcblxuXHRcdC8vIFR5cGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3R5cGVfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudHlwZV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVHlwZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmV2aWV3X2NvbHVtbjEgKTtcblxuXHRcdC8vIFRlcm1zXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICd0ZXJtX2lkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnRlcm1fYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1Rlcm1zJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXZpZXdfY29sdW1uMSApO1xuXG5cdFx0Ly8gUmF0aW5nXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3JhdGluZycsIHdpZHRoOiA1MCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdSYXRpbmcnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3Jldmlld19jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly8gU2V2ZXJpdHlcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3NldmVyaXR5X2lkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnNldmVyaXR5X2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTZXZlcml0eScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmV2aWV3X2NvbHVtbjIsICcnICk7XG5cblx0XHQvLyBTdGFydCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnc3RhcnRfZGF0ZScgfSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGFydCBEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXZpZXdfY29sdW1uMiwgJycsIG51bGwgKTtcblxuXHRcdC8vIEVuZCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnZW5kX2RhdGUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VuZCBEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXZpZXdfY29sdW1uMiwgJycsIG51bGwgKTtcblxuXHRcdC8vIER1ZSBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnZHVlX2RhdGUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0R1ZSBEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXZpZXdfY29sdW1uMiwgJycsIG51bGwgKTtcblxuXHRcdC8vVGFnc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEFHX0lOUFVUICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRhZ0lucHV0KCB7IGZpZWxkOiAndGFnJywgb2JqZWN0X3R5cGVfaWQ6IDMyMCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYWdzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXZpZXdfY29sdW1uMiwgJycsIG51bGwsIG51bGwsIHRydWUgKTtcblxuXHRcdGlmICggdGhpcy5pc19hZGQgfHwgdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0Ly8gQWRkIEtQSXMgZnJvbSBHcm91cHNcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHR0cmVlX21vZGU6IHRydWUsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3RyZWVfY29sdW1uJyxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2dyb3VwX2lkJ1xuXHRcdFx0fSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmtwaV9ncm91cF9hcnJheSApO1xuXG5cdFx0XHR2YXIgdGFiX3Jldmlld19jb2x1bW4zID0gdGFiX3Jldmlldy5maW5kKCAnLnRoaXJkLWNvbHVtbicgKS5jc3MoIHtcblx0XHRcdFx0J2Zsb2F0JzogJ2xlZnQnLFxuXHRcdFx0XHQnbWFyZ2luLXRvcCc6ICcxMHB4Jyxcblx0XHRcdFx0J21hcmdpbi1ib3R0b20nOiAnMTBweCdcblx0XHRcdH0gKTtcblx0XHRcdHRhYl9yZXZpZXdfY29sdW1uMy5maW5kKCAnLmNvbHVtbi1mb3JtLWl0ZW0tbGFiZWwnICkuY3NzKCB7XG5cdFx0XHRcdCdmbG9hdCc6ICdsZWZ0Jyxcblx0XHRcdFx0J21hcmdpbi1yaWdodCc6ICcxMHB4Jyxcblx0XHRcdFx0J21hcmdpbi10b3AnOiAnNXB4J1xuXHRcdFx0fSApLnRleHQoICQuaTE4bi5fKCAnQWRkIEtQSXMgZnJvbSBHcm91cHMnICkgKTtcblx0XHRcdHRhYl9yZXZpZXdfY29sdW1uMy5maW5kKCAnLmNvbHVtbi1mb3JtLWl0ZW0taW5wdXQnICkuY3NzKCB7ICdmbG9hdCc6ICdsZWZ0JyB9ICkuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIE5vdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfQVJFQSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0QXJlYSggeyBmaWVsZDogJ25vdGUnLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6IDY2IH0gKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTm90ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmV2aWV3X2NvbHVtbjQsICdmaXJzdF9sYXN0JywgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXHR9XG5cblx0aW5pdEluc2lkZUVkaXRvclVJKCkge1xuXHRcdC8vSW5zaWRlIGVkaXRvclxuXHRcdHZhciB0YWJfcmV2aWV3ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JldmlldycgKTtcblxuXHRcdHZhciBpbnNpZGVfZWRpdG9yX2RpdiA9IHRhYl9yZXZpZXcuZmluZCggJy5pbnNpZGUtZWRpdG9yLWRpdicgKTtcblxuXHRcdHZhciBhcmdzID0ge1xuXHRcdFx0c2VyaWFsOiAnIycsXG5cdFx0XHRuYW1lOiAkLmkxOG4uXyggJ0tleSBQZXJmb3JtYW5jZSBJbmRpY2F0b3InICkgKyAnPGJyPignICsgJC5pMThuLl8oJ0hvdmVyIGZvciBEZXNjcmlwdGlvbicpICsgJyknLFxuXHRcdFx0cmF0aW5nOiAkLmkxOG4uXyggJ1Jlc3VsdCcgKSxcblx0XHRcdG5vdGU6ICQuaTE4bi5fKCAnTm90ZScgKVxuXHRcdH07XG5cblx0XHR0aGlzLmVkaXRvciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuSU5TSURFX0VESVRPUiApO1xuXG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRhZGRSb3c6IHRoaXMuaW5zaWRlRWRpdG9yQWRkUm93LFxuXHRcdFx0cmVtb3ZlUm93OiB0aGlzLmluc2lkZUVkaXRvclJlbW92ZVJvdyxcblx0XHRcdGdldFZhbHVlOiB0aGlzLmluc2lkZUVkaXRvckdldFZhbHVlLFxuXHRcdFx0c2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yU2V0VmFsdWUsXG5cdFx0XHRvbkZvcm1JdGVtQ2hhbmdlOiB0aGlzLm9uSW5zaWRlRm9ybUl0ZW1DaGFuZ2UsXG5cdFx0XHRwYXJlbnRfY29udHJvbGxlcjogdGhpcyxcblx0XHRcdGFwaTogdGhpcy51c2VyX3Jldmlld19hcGksXG5cdFx0XHRyZW5kZXI6IGdldFJlbmRlcigpLFxuXHRcdFx0cmVuZGVyX2FyZ3M6IGFyZ3MsXG5cdFx0XHRyZW5kZXJfaW5saW5lX2h0bWw6IHRydWUsXG5cdFx0XHRyb3dfcmVuZGVyOiBnZXRSb3dSZW5kZXIoKVxuXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0YWJsZSBjbGFzcz1cImluc2lkZS1lZGl0b3ItcmVuZGVyXCI+XG5cdFx0XHRcdDx0ciBjbGFzcz1cInRpdGxlXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiA1MHB4XCI+PCU9IHNlcmlhbCAlPjwvdGQ+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDgyMHB4XCI+PCU9IG5hbWUgJT48L3RkPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiA3MHB4XCI+PCU9IHJhdGluZyAlPjwvdGQ+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDMwMHB4O1wiPjwlPSBub3RlICU+PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdDwvdGFibGU+YDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRSb3dSZW5kZXIoKSB7XG5cdFx0XHRyZXR1cm4gYFxuXHRcdFx0PHRyIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yb3cgZGF0YS1yb3dcIj5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHQ8L3RyPmA7XG5cdFx0fVxuXG5cdFx0aW5zaWRlX2VkaXRvcl9kaXYuYXBwZW5kKCB0aGlzLmVkaXRvciApO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXG5cdGFkZEVkaXRGaWVsZFRvQ29sdW1uKCBsYWJlbCwgd2lkZ2V0cywgY29sdW1uLCBmaXJzdE9yTGFzdFJlY29yZCwgd2lkZ2V0Q29udGFpbmVyLCBzYXZlRm9ybUl0ZW1EaXYsIHNldFJlc2l6ZUV2ZW50LCBzYXZlRm9ybUl0ZW1EaXZLZXksIGhhc0tleUV2ZW50LCBjdXN0b21MYWJlbFdpZGdldCApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGZvcm1faXRlbSA9ICQoIEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBXaWRnZXROYW1lc0RpYy5FRElUX1ZJRVdfRk9STV9JVEVNICkgKTtcblx0XHR2YXIgZm9ybV9pdGVtX2xhYmVsX2RpdiA9IGZvcm1faXRlbS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwtZGl2JyApO1xuXHRcdHZhciBmb3JtX2l0ZW1fbGFiZWwgPSBmb3JtX2l0ZW0uZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWxhYmVsJyApO1xuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXRfZGl2ID0gZm9ybV9pdGVtLmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1pbnB1dC1kaXYnICk7XG5cblx0XHRpZiAoIGN1c3RvbUxhYmVsV2lkZ2V0ICkge1xuXHRcdFx0Zm9ybV9pdGVtX2xhYmVsLnBhcmVudCgpLmFwcGVuZCggY3VzdG9tTGFiZWxXaWRnZXQgKTtcblx0XHRcdGZvcm1faXRlbV9sYWJlbC5yZW1vdmUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybV9pdGVtX2xhYmVsLnRleHQoICQuaTE4bi5fKCBsYWJlbCApICk7XG5cdFx0fVxuXG5cdFx0dmFyIHdpZGdldCA9IHdpZGdldHM7XG5cblx0XHRpZiAoIEdsb2JhbC5pc0FycmF5KCB3aWRnZXRzICkgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHdpZGdldCA9IHdpZGdldHNbaV07XG5cdFx0XHRcdHdpZGdldC5jc3MoICdvcGFjaXR5JywgMCApO1xuXG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1t3aWRnZXQuZ2V0RmllbGQoKV0gPSB3aWRnZXQ7XG5cblx0XHRcdFx0d2lkZ2V0LnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRpZiAoIGhhc0tleUV2ZW50ICkge1xuXHRcdFx0XHRcdHdpZGdldC51bmJpbmQoICdmb3JtSXRlbUtleVVwJyApLmJpbmQoICdmb3JtSXRlbUtleVVwJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1LZXlVcCggdGFyZ2V0ICk7XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0d2lkZ2V0LnVuYmluZCggJ2Zvcm1JdGVtS2V5RG93bicgKS5iaW5kKCAnZm9ybUl0ZW1LZXlEb3duJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1LZXlEb3duKCB0YXJnZXQgKTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR3aWRnZXQuY3NzKCAnb3BhY2l0eScsIDAgKTtcblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW3dpZGdldC5nZXRGaWVsZCgpXSA9IHdpZGdldDtcblxuXHRcdFx0d2lkZ2V0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGhhc0tleUV2ZW50ICkge1xuXHRcdFx0XHR3aWRnZXQuYmluZCggJ2Zvcm1JdGVtS2V5VXAnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1LZXlVcCggdGFyZ2V0ICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR3aWRnZXQuYmluZCggJ2Zvcm1JdGVtS2V5RG93bicsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUtleURvd24oIHRhcmdldCApO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0Q29udGFpbmVyICkgKSB7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXRfZGl2LmFwcGVuZCggd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0X2Rpdi5hcHBlbmQoIHdpZGdldCApO1xuXHRcdH1cblxuXHRcdGlmICggc2V0UmVzaXplRXZlbnQgKSB7XG5cblx0XHRcdGlmICggd2lkZ2V0LmdldEZpZWxkKCkgPT09ICdub3RlJyApIHtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXRfZGl2LmNzcyggJ3dpZHRoJywgJzgwJScgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2xhYmVsX2Rpdi5jc3MoICdoZWlnaHQnLCAnODAnICk7XG5cdFx0XHRcdHdpZGdldC5jc3MoIHsgJ3dpZHRoJzogJzEwMCUnLCAncmVzaXplJzogJ25vbmUnIH0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3JtX2l0ZW0uYmluZCggJ3Jlc2l6ZScsIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBmb3JtX2l0ZW1fbGFiZWxfZGl2LmhlaWdodCgpICE9PSBmb3JtX2l0ZW0uaGVpZ2h0KCkgJiYgZm9ybV9pdGVtLmhlaWdodCgpICE9PSAwICkge1xuXHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2xhYmVsX2Rpdi5jc3MoICdoZWlnaHQnLCBmb3JtX2l0ZW0uaGVpZ2h0KCkgKTtcblx0XHRcdFx0XHRcdGZvcm1faXRlbS51bmJpbmQoICdyZXNpemUnICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR3aWRnZXQuYmluZCggJ3NldFNpemUnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fbGFiZWxfZGl2LmNzcyggJ2hlaWdodCcsIHdpZGdldC5oZWlnaHQoKSArIDUgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBzYXZlRm9ybUl0ZW1EaXYgKSB7XG5cblx0XHRcdGlmICggR2xvYmFsLmlzQXJyYXkoIHdpZGdldHMgKSApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1t3aWRnZXRzWzBdLmdldEZpZWxkKCldID0gZm9ybV9pdGVtO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1t3aWRnZXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW07XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb2x1bW4uYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHQvL2NvbHVtbi5hcHBlbmQoIFwiPGRpdiBjbGFzcz0nY2xlYXItYm90aC1kaXYnPjwvZGl2PlwiICk7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdGJ1aWxkU2VhcmNoRmllbGRzKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRTZWFyY2hGaWVsZHMoKTtcblxuXHRcdHZhciBkZWZhdWx0X2FyZ3MgPSB7fTtcblx0XHRkZWZhdWx0X2FyZ3MucGVybWlzc2lvbl9zZWN0aW9uID0gJ3VzZXJfcmV2aWV3Jztcblx0XHR0aGlzLnNlYXJjaF9maWVsZHMgPSBbXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbXBsb3llZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3VzZXJfaWQnLFxuXHRcdFx0XHRkZWZhdWx0X2FyZ3M6IGRlZmF1bHRfYXJncyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUmV2aWV3ZXInICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdyZXZpZXdlcl91c2VyX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVHlwZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3R5cGVfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVGFncycgKSxcblx0XHRcdFx0ZmllbGQ6ICd0YWcnLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0b2JqZWN0X3R5cGVfaWQ6IDMyMCxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5UQUdfSU5QVVRcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1N0YXR1cycgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3N0YXR1c19pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUZXJtcycgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3Rlcm1faWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU2V2ZXJpdHknICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdzZXZlcml0eV9pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdTdGFydCBEYXRlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnc3RhcnRfZGF0ZScsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVJcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VuZCBEYXRlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnZW5kX2RhdGUnLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdEdWUgRGF0ZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ2R1ZV9kYXRlJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUlxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnS1BJJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAna3BpX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfa3BpJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElLUEksXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDcmVhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnY3JlYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdVcGRhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAndXBkYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9IClcblx0XHRdO1xuXHR9XG5cblx0cmVtb3ZlRWRpdFZpZXcoKSB7XG5cdFx0c3VwZXIucmVtb3ZlRWRpdFZpZXcoKTtcblx0XHR0aGlzLmVkaXRvciA9IG51bGw7XG5cdH1cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHN1cGVyLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0XHR0aGlzLmluaXRJbnNpZGVFZGl0b3JEYXRhKCk7XG5cdH1cblxuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnNldElzQ2hhbmdlZCggdGFyZ2V0ICk7XG5cdFx0dGhpcy5zZXRNYXNzRWRpdGluZ0ZpZWxkc1doZW5Gb3JtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHR2YXIga2V5ID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dmFyIGNfdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRjYXNlICdncm91cF9pZCc6XG5cdFx0XHRcdHZhciBmaWx0ZXIgPSB7fTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdC8vIHdoeSBuZWVkIFtjX3ZhbHVlLCAtMV0sIC0xIHdpbGwgcmV0dXJuIGFsbCwgdGhlIGZpbHRlciB3b24ndCB3b3JrIGNvcnJlY3QgaWYgc2VuZCAtMSxyZW1vdmUgZm9yIHRlc3R0aW5nXG5cdFx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YS5ncm91cF9pZCA9IFtjX3ZhbHVlXTtcblx0XHRcdFx0dGhpcy5rcGlfYXBpWydnZXQnICsgdGhpcy5rcGlfYXBpLmtleV9uYW1lXSggZmlsdGVyLCBmYWxzZSwgdHJ1ZSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2V0SW5zaWRlRWRpdG9yRGF0YSggcmVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBjX3ZhbHVlO1xuXHRcdFx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0XHRcdHRoaXMudmFsaWRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRvbkluc2lkZUZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0dGFyZ2V0LmNsZWFyRXJyb3JTdHlsZSgpO1xuXG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0Y2FzZSAncmF0aW5nJzpcblx0XHRcdFx0dmFyIG1pbmltdW1fcmF0ZSA9IHBhcnNlSW50KCB0YXJnZXQuYXR0ciggJ21pbmltdW1fcmF0ZScgKSApO1xuXHRcdFx0XHR2YXIgbWF4aW11bV9yYXRlID0gcGFyc2VJbnQoIHRhcmdldC5hdHRyKCAnbWF4aW11bV9yYXRlJyApICk7XG5cdFx0XHRcdGlmICggY192YWx1ZSAhPT0gJycgKSB7XG5cdFx0XHRcdFx0Y192YWx1ZSA9IHBhcnNlSW50KCBjX3ZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCBjX3ZhbHVlID49IG1pbmltdW1fcmF0ZSAmJiBjX3ZhbHVlIDw9IG1heGltdW1fcmF0ZSApIHtcblx0XHRcdFx0XHRcdHRhcmdldC5jbGVhckVycm9yU3R5bGUoKTtcblx0XHRcdFx0XHRcdHRoaXMucGFyZW50X2NvbnRyb2xsZXIuc2V0RWRpdE1lbnUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnNldEVycm9yU3R5bGUoICQuaTE4bi5fKCAnUmF0aW5nIG11c3QgYmV0d2VlbicgKSArICcgJyArIG1pbmltdW1fcmF0ZSArICcgJyArICQuaTE4bi5fKCAnYW5kJyApICsgJyAnICsgbWF4aW11bV9yYXRlLCB0cnVlICk7XG5cdFx0XHRcdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLnNldEVycm9yTWVudSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdGluaXRJbnNpZGVFZGl0b3JEYXRhKCkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7fTtcblxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXG5cdFx0XHRhcmdzLmZpbHRlcl9kYXRhLnVzZXJfcmV2aWV3X2NvbnRyb2xfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2lkJ107XG5cblx0XHRcdCR0aGlzLnVzZXJfcmV2aWV3X2FwaVsnZ2V0JyArICR0aGlzLnVzZXJfcmV2aWV3X2FwaS5rZXlfbmFtZV0oIGFyZ3MsIHRydWUsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0aWYgKCAhJHRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkdGhpcy5zZXRJbnNpZGVFZGl0b3JEYXRhKCByZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblxuXHRzZXRJbnNpZGVFZGl0b3JEYXRhKCByZXMgKSB7XG5cdFx0dmFyIGRhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0dmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuXG5cdFx0aWYgKCBsZW4gPiAwICkge1xuXG5cdFx0XHRpZiAoICF0aGlzLmVkaXRvciApIHtcblx0XHRcdFx0dGhpcy5pbml0SW5zaWRlRWRpdG9yVUkoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHNlcmlhbCA9IDE7XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGRhdGEgKSB7XG5cdFx0XHRcdHZhciByb3cgPSBkYXRhW2tleV07XG5cdFx0XHRcdHZhciBpc19leGlzdGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmICggIXJvdy5rcGlfaWQgKSB7XG5cdFx0XHRcdFx0cm93LmtwaV9pZCA9IHJvdy5pZDtcblx0XHRcdFx0XHRyb3cuaWQgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB0aGUgcm93LmtwaV9pZCBpZiBleGlzdGVkIGluIHRoaXMuZWRpdG9yLmVkaXRvcl9kYXRhP1xuXHRcdFx0XHRpZiAoIHRoaXMuZWRpdG9yLmVkaXRvcl9kYXRhICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0b3IuZWRpdG9yX2RhdGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaXRlbSA9IHRoaXMuZWRpdG9yLmVkaXRvcl9kYXRhW2ldO1xuXHRcdFx0XHRcdFx0aWYgKCByb3cua3BpX2lkID09PSBpdGVtLmtwaV9pZCApIHtcblx0XHRcdFx0XHRcdFx0aXNfZXhpc3RlZCA9IHRydWU7IC8vIHRoZSBjdXJyZW50IHJvdyBoYXMgYWxyZWFkeSBkaXNwbGF5ZWQuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggIWlzX2V4aXN0ZWQgKSB7XG5cdFx0XHRcdFx0XHRzZXJpYWwgPSB0aGlzLmVkaXRvci5lZGl0b3JfZGF0YS5sZW5ndGggKyAxO1xuXHRcdFx0XHRcdFx0cm93LnNlcmlhbCA9IHNlcmlhbDtcblx0XHRcdFx0XHRcdHRoaXMuZWRpdG9yLmVkaXRvcl9kYXRhLnB1c2goIHJvdyApO1xuXHRcdFx0XHRcdH1cblxuLy9cdFx0XHRcdFx0c2VyaWFsKys7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyb3cuc2VyaWFsID0gc2VyaWFsO1xuXHRcdFx0XHRcdGRhdGFba2V5XSA9IHJvdztcblx0XHRcdFx0XHRzZXJpYWwrKztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggIWlzX2V4aXN0ZWQgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0b3IuYWRkUm93KCByb3cgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggIXRoaXMuZWRpdG9yLmVkaXRvcl9kYXRhICkge1xuXHRcdFx0XHR0aGlzLm9yaWdpbmFsX3VzZXJfcmV2aWV3X2RhdGEgPSBfLm1hcCggZGF0YSwgXy5jbG9uZSApO1xuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsX3VzZXJfcmV2aWV3X2RhdGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0Ly9OZWVkIHRvIGNvbnZlcnQgdGhlc2UgalF1ZXJ5IG9iamVjdHMgdG8gdGhlaXIgdmFsdWVzIHNvIHRod3QgZnV0dXJlIGRhdGEgY2hhbmdlIGNvbXBhcmlzb25zIGRvIG5vdCBmYWlsLlxuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbF91c2VyX3Jldmlld19kYXRhW2ldLmhhc093blByb3BlcnR5KCAncmF0aW5nJyApICYmIHRoaXMub3JpZ2luYWxfdXNlcl9yZXZpZXdfZGF0YVtpXS5yYXRpbmcgIT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0dGhpcy5vcmlnaW5hbF91c2VyX3Jldmlld19kYXRhW2ldLnJhdGluZyA9IHRoaXMub3JpZ2luYWxfdXNlcl9yZXZpZXdfZGF0YVtpXS5yYXRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsX3VzZXJfcmV2aWV3X2RhdGFbaV0uaGFzT3duUHJvcGVydHkoICdub3RlJyApICYmIHRoaXMub3JpZ2luYWxfdXNlcl9yZXZpZXdfZGF0YVtpXS5ub3RlICE9PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdHRoaXMub3JpZ2luYWxfdXNlcl9yZXZpZXdfZGF0YVtpXS5ub3RlID0gdGhpcy5vcmlnaW5hbF91c2VyX3Jldmlld19kYXRhW2ldLm5vdGUuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5lZGl0b3IuZWRpdG9yX2RhdGEgPSBkYXRhO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG4vL1x0XHQkdGhpcy5lZGl0b3Iuc2V0VmFsdWUoIGRhdGEgKTtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbi8vXHRpbnNpZGVFZGl0b3JTZXRWYWx1ZSggdmFsICkge1xuLy9cdFx0dmFyIGxlbiA9IHZhbC5sZW5ndGg7XG4vL1x0XHR0aGlzLnJlbW92ZUFsbFJvd3MoKTtcbi8vXG4vL1x0XHRpZiAoIGxlbiA+IDAgKSB7XG4vL1x0XHRcdHZhciBzZXJpYWwgPSAxO1xuLy9cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKysgKSB7XG4vL1x0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHZhbFtpXSApICkge1xuLy9cdFx0XHRcdFx0dmFyIHJvdyA9IHZhbFtpXTtcbi8vXHRcdFx0XHRcdHJvdy5zZXJpYWwgPSBzZXJpYWw7XG4vL1x0XHRcdFx0XHR0aGlzLmFkZFJvdyggcm93ICk7XG4vL1x0XHRcdFx0XHRzZXJpYWwrKztcbi8vXHRcdFx0XHR9XG4vL1x0XHRcdH1cbi8vXHRcdH1cbi8vXG4vL1x0fSxcblxuXHRpbnNpZGVFZGl0b3JBZGRSb3coIGRhdGEgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICFkYXRhICkge1xuLy9cdFx0XHR0aGlzLmdldERlZmF1bHREYXRhKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByb3cgPSB0aGlzLmdldFJvd1JlbmRlcigpOyAvL0dldCBSb3cgcmVuZGVyXG5cdFx0XHR2YXIgcmVuZGVyID0gdGhpcy5nZXRSZW5kZXIoKTsgLy9nZXQgcmVuZGVyLCBzaG91bGQgYmUgYSB0YWJsZVxuXHRcdFx0dmFyIHdpZGdldHMgPSBkYXRhOyAvL1NhdmUgZWFjaCByb3cncyB3aWRnZXRzXG5cblx0XHRcdC8vQnVpbGQgcm93IHdpZGdldHNcblxuXHRcdFx0Ly8gI1xuXHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnc2VyaWFsJywgd2lkdGg6IDUwIH0gKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5zZXJpYWwgPyBkYXRhLnNlcmlhbCA6IG51bGwgKTtcbi8vXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1faW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1faW5wdXQ7XG5cdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdC8vIEtleSBQZXJmb3JtYW5jZSBJbmRpY2F0b3Jcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiA2MDAgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLm5hbWUgPyBkYXRhLm5hbWUgOiBudWxsICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ3RpdGxlJywgZGF0YS5kZXNjcmlwdGlvbiA/IGRhdGEuZGVzY3JpcHRpb24gOiAnJyApO1xuXG5cdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdC8vIFJhdGluZ1xuXHRcdFx0aWYgKCBkYXRhLnR5cGVfaWQgPT0gMTAgKSB7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3JhdGluZycsIHdpZHRoOiA0MCB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5yYXRpbmcgPyBkYXRhLnJhdGluZyA6IG51bGwgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmF0dHIoIHsgJ21pbmltdW1fcmF0ZSc6IGRhdGEubWluaW11bV9yYXRlLCAnbWF4aW11bV9yYXRlJzogZGF0YS5tYXhpbXVtX3JhdGUgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDIgKS5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGRhdGEudHlwZV9pZCA9PSAyMCApIHtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVENoZWNrYm94KCB7IGZpZWxkOiAncmF0aW5nJyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5yYXRpbmcgPyAoIGRhdGEucmF0aW5nID49IDEgPyB0cnVlIDogZmFsc2UgKSA6IG51bGwgKTsgLy9SYXRpbmcgaXMgbnVtZXJpYywgc28gbWFrZSBzdXJlIHdlIHBhc3MgdHJ1ZS9mYWxzZSB0byBUQ2hlY2tib3guXG5cdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMiApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTm90ZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0FSRUEgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dEFyZWEoIHtcblx0XHRcdFx0ZmllbGQ6ICdub3RlJyxcblx0XHRcdFx0c3R5bGU6IHsgd2lkdGg6ICczMDBweCcsIGhlaWdodDogJzIwcHgnLCAnbWluLWhlaWdodCc6ICcxMHB4JyB9XG5cdFx0XHR9ICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEubm90ZSA/IGRhdGEubm90ZSA6IG51bGwgKTtcblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDMgKS5jc3MoICd0ZXh0LWFsaWduJywgJ3JpZ2h0JyApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHQvLyBlbmRcblxuXHRcdFx0aWYgKCB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGggPT09IDAgKSB7XG5cdFx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggcm93ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBHZXQgYWxsIHJvd3MgYW5kIGluc2VydCBuZXcgcm93IGFjY29yZGluZyB0byBpdCdzIGRpc3BsYXlfb3JkZXJcblx0XHRcdFx0bGV0IHJvd3MgPSByZW5kZXIuZmluZCggJ3RyJyApLmdldCgpO1xuXG5cdFx0XHRcdGRhdGEuZGlzcGxheV9vcmRlciA9IHBhcnNlSW50KCBkYXRhLmRpc3BsYXlfb3JkZXIgKSB8fCAwO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0Ly8gTG9vcCBsb29rcyBmb3IgdGhlIGNvcnJlY3Qgc3BvdCB0byBpbnNlcnQgdGhlIG5ldyByb3cgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGRpc3BsYXlfb3JkZXIuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIGxhc3Qgcm93IGlzIHVuZGVmaW5lZCBvciB0aGUgdmFsdWUgb2YgZGlzcGxheV9vcmRlciBpcyBsZXNzIHRoYW4gdGhlIHJvdyB0byBiZSBpbnNlcnRlZCBhbmQgdGhlIHJvdyBhZnRlciB0aGlzIGlzIHVuZGVmaW5lZCBvciBoYXMgYSBoaWdoZXIgZGlzcGxheV9vcmRlciwgaW5zZXJ0IGl0IHRoZXJlLlxuXHRcdFx0XHRcdGlmICggKCBpID09PSAwIHx8ICQoIHJvd3NbaV0gKS5hdHRyKCAnZGF0YS1vcmRlcicgKSA8PSBkYXRhLmRpc3BsYXlfb3JkZXIgKSAmJiAoIHJvd3NbaSArIDFdID09PSB1bmRlZmluZWQgfHwgJCggcm93c1tpICsgMV0gKS5hdHRyKCAnZGF0YS1vcmRlcicgKSA+PSBkYXRhLmRpc3BsYXlfb3JkZXIgKSApIHtcblx0XHRcdFx0XHRcdCQoIHJvd3NbaV0gKS5hZnRlciggcm93ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOb3cgdGhhdCB0aGUgcm93cyBhcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIHJlbnVtYmVyIHRoZW0uXG5cdFx0XHRcdHJvd3MgPSByZW5kZXIuZmluZCggJ3RyJyApLmdldCgpO1xuXHRcdFx0XHRsZXQgb3JkZXJfbnVtYmVyID0gMTtcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSB7XG5cdFx0XHRcdFx0XHQkKCByb3dzW2ldICkuZmluZCggXCJ0ZDpmaXJzdFwiICkudGV4dCggb3JkZXJfbnVtYmVyICk7XG5cdFx0XHRcdFx0XHRvcmRlcl9udW1iZXIrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRcdHJvdy5maW5kKCAnLmNvbnRyb2wtaWNvbicgKS5oaWRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHdpZGdldHMgKTtcblxuXHRcdFx0dGhpcy5hZGRJY29uc0V2ZW50KCByb3cgKTsgLy9CaW5kIGV2ZW50IHRvIGFkZCBhbmQgbWludXMgaWNvblxuXHRcdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXG5cdFx0XHQvLyBBdHRhY2ggZGlzcGxheV9vcmRlciB0byB0aGUgPHRyPiBmb3IgZWFzeSByZW9yZGVyaW5nIGFmdGVyIGFkZGluZyBuZXcgS1BJIGdyb3Vwcy5cblx0XHRcdHJvdy5hdHRyKCdkYXRhLW9yZGVyJywgZGF0YS5kaXNwbGF5X29yZGVyKTtcblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JSZW1vdmVSb3coIHJvdyApIHtcblx0XHR2YXIgaW5kZXggPSByb3dbMF0ucm93SW5kZXggLSAxO1xuXHRcdHZhciByZW1vdmVfaWQgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF0uY3VycmVudF9lZGl0X2l0ZW0uaWQ7XG5cdFx0aWYgKCBUVFVVSUQuaXNVVUlEKCByZW1vdmVfaWQgKSAmJiByZW1vdmVfaWQgIT0gVFRVVUlELnplcm9faWQgJiYgcmVtb3ZlX2lkICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHR0aGlzLmRlbGV0ZV9pZHMucHVzaCggcmVtb3ZlX2lkICk7XG5cdFx0fVxuXHRcdHJvdy5yZW1vdmUoKTtcblx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXHR9XG5cblx0b25TYXZlUmVzdWx0KCByZXN1bHQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCgpO1xuXHRcdFx0XHQkdGhpcy5vblNhdmVEb25lKCByZXN1bHQgKTtcblxuXHRcdFx0XHQkdGhpcy5yZW1vdmVFZGl0VmlldygpO1xuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblxuXHRcdH1cblx0fVxuXG5cdC8vIG9uU2F2ZUFuZENvbnRpbnVlUmVzdWx0KCByZXN1bHQgKSB7XG5cdC8vIFx0dmFyICR0aGlzID0gdGhpcztcblx0Ly8gXHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdC8vIFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdC8vIFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHQvLyBcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0Ly9cblx0Ly8gXHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHQvLyBcdFx0fVxuXHQvL1xuXHQvLyBcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHQvLyBcdFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7XG5cdC8vIFx0XHRcdCR0aGlzLm9uRWRpdENsaWNrKCAkdGhpcy5yZWZyZXNoX2lkLCB0cnVlICk7XG5cdC8vXG5cdC8vIFx0XHRcdCR0aGlzLm9uU2F2ZUFuZENvbnRpbnVlRG9uZSggcmVzdWx0ICk7XG5cdC8vIFx0XHR9ICk7XG5cdC8vXG5cdC8vIFx0fSBlbHNlIHtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0Ly8gXHR9XG5cdC8vIH0sXG5cblx0b25FZGl0Q2xpY2soIGVkaXRJZCwgbm9SZWZyZXNoVUkgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICR0aGlzLmVkaXRvciApIHtcblx0XHRcdCR0aGlzLmVkaXRvci5yZW1vdmUoKTtcblx0XHRcdCR0aGlzLmVkaXRvciA9IG51bGw7XG5cdFx0fVxuXG5cdFx0c3VwZXIub25FZGl0Q2xpY2soIGVkaXRJZCwgbm9SZWZyZXNoVUkgKTtcblx0fVxuXG5cdHNhdmVJbnNpZGVFZGl0b3JEYXRhKCBjYWxsQmFjayApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhdGhpcy5lZGl0b3IgKSB7XG5cdFx0XHRjYWxsQmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZGF0YSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCB0aGlzLnJlZnJlc2hfaWQgKTtcblx0XHRcdGxldCBjaGFuZ2VkX2RhdGEgPSB0aGlzLmdldENoYW5nZWRSZWNvcmRzKCBkYXRhLCB0aGlzLm9yaWdpbmFsX3VzZXJfcmV2aWV3X2RhdGEsIFtdICk7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggY2hhbmdlZF9kYXRhICkgJiYgY2hhbmdlZF9kYXRhLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHRoaXMudXNlcl9yZXZpZXdfYXBpLnNldFVzZXJSZXZpZXcoIGNoYW5nZWRfZGF0YSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0Y2FsbEJhY2soKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHR9XG5cblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JHZXRWYWx1ZSggY3VycmVudF9lZGl0X2l0ZW1faWQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciByb3cgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpXTtcblx0XHRcdGlmICggcm93LnJhdGluZyApIHtcblx0XHRcdFx0cm93LnJhdGluZyA9IHJvdy5yYXRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdH1cblx0XHRcdHJvdy5ub3RlID0gcm93Lm5vdGUuZ2V0VmFsdWUoKTtcblxuXHRcdFx0cm93LnVzZXJfcmV2aWV3X2NvbnRyb2xfaWQgPSBjdXJyZW50X2VkaXRfaXRlbV9pZDtcblxuXHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaV0gPSByb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucm93c193aWRnZXRzX2FycmF5O1xuXHR9XG5cblx0X2NvbnRpbnVlRG9Db3B5QXNOZXcoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuaXNfYWRkID0gdHJ1ZTtcblxuXHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnY29weV9hc19uZXcnO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuZWRpdF92aWV3ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA9ICcnO1xuXHRcdFx0dmFyIG5hdmlnYXRpb25fZGl2ID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJy5uYXZpZ2F0aW9uLWRpdicgKTtcblx0XHRcdG5hdmlnYXRpb25fZGl2LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdGlmICggdGhpcy5lZGl0b3IgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdG9yLnJlbW92ZSgpO1xuXHRcdFx0XHR0aGlzLmVkaXRvciA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0XHR0aGlzLnNldFRhYlN0YXR1cygpO1xuXHRcdFx0dGhpcy5pc19jaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdXBlci5fY29udGludWVEb0NvcHlBc05ldygpO1xuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZUFuZE5ld1Jlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0XHRcdFx0aWYgKCAkdGhpcy5lZGl0b3IgKSB7XG5cdFx0XHRcdFx0JHRoaXMuZWRpdG9yLnJlbW92ZSgpO1xuXHRcdFx0XHRcdCR0aGlzLmVkaXRvciA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHRoaXMub25BZGRDbGljayggdHJ1ZSApO1xuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0XHR9XG5cdH1cblxuXHRvblNhdmVBbmRDb3B5UmVzdWx0KCByZXN1bHQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblxuXHRcdFx0fSBlbHNlIGlmICggVFRVVUlELmlzVVVJRCggcmVzdWx0X2RhdGEgKSAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQuemVyb19pZCAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gcmVzdWx0X2RhdGE7XG5cdFx0XHR9XG5cblx0XHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHRcdFx0XHRpZiAoICR0aGlzLmVkaXRvciApIHtcblx0XHRcdFx0XHQkdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG5cdFx0XHRcdFx0JHRoaXMuZWRpdG9yID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHQkdGhpcy5vbkNvcHlBc05ld0NsaWNrKCk7XG5cdFx0XHR9ICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblx0XHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHRcdH1cblx0fVxuXG5cdC8vIG9uU2F2ZUFuZE5leHRSZXN1bHQoIHJlc3VsdCApIHtcblx0Ly8gXHR2YXIgJHRoaXMgPSB0aGlzO1xuXHQvLyBcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0Ly8gXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0Ly8gXHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXHQvLyBcdFx0fSBlbHNlIGlmICggVFRVVUlELmlzVVVJRCggcmVzdWx0X2RhdGEgKSAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQuemVyb19pZCAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHQvLyBcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gcmVzdWx0X2RhdGE7XG5cdC8vIFx0XHR9XG5cdC8vXG5cdC8vIFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdC8vIFx0XHRcdCR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCk7XG5cdC8vIFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0Ly8gXHRcdFx0JHRoaXMub25TYXZlQW5kTmV4dERvbmUoIHJlc3VsdCApO1xuXHQvLyBcdFx0fSApO1xuXHQvL1xuXHQvLyBcdH0gZWxzZSB7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHQvLyBcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdC8vIFx0fVxuXHQvLyB9LFxuXG5cdG9uUmlnaHRBcnJvd0NsaWNrKCkge1xuXHRcdGlmICggdGhpcy5lZGl0b3IgKSB7XG5cdFx0XHR0aGlzLmVkaXRvci5yZW1vdmUoKTtcblx0XHRcdHRoaXMuZWRpdG9yID0gbnVsbDtcblx0XHR9XG5cdFx0c3VwZXIub25SaWdodEFycm93Q2xpY2soKTtcblx0fVxuXG5cdG9uTGVmdEFycm93Q2xpY2soKSB7XG5cdFx0aWYgKCB0aGlzLmVkaXRvciApIHtcblx0XHRcdHRoaXMuZWRpdG9yLnJlbW92ZSgpO1xuXHRcdFx0dGhpcy5lZGl0b3IgPSBudWxsO1xuXHRcdH1cblx0XHRzdXBlci5vbkxlZnRBcnJvd0NsaWNrKCk7XG5cdH1cblxuXHRzZWFyY2hEb25lKCkge1xuXHRcdHN1cGVyLnNlYXJjaERvbmUoKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ1Jldmlld1ZpZXcnLCAnaW5pdCcgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51UmVwb3J0UmVsYXRlZEljb25zKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICF0aGlzLnBheVN0dWJSZXBvcnRJY29uc1ZhbGlkYXRlKCkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXG5cdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgJiYgdGhpcy52aWV3T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q3VzdG9tRGVmYXVsdE1lbnVJY29uKCBpZCwgY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdHN3aXRjaCAoIGlkICkge1xuXHRcdFx0Y2FzZSAncGRmX3Jldmlld19wcmludCc6XG5cdFx0XHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPiAwICYmIHRoaXMudmlld093bmVyT3JDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSgpICkge1xuXHRcdFx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0ZG9Gb3JtSUZyYW1lQ2FsbCggcG9zdERhdGEgKSB7XG5cdFx0R2xvYmFsLkFQSUZpbGVEb3dubG9hZCggJ0FQSUtQSVJlcG9ydCcsICdnZXRLUElSZXBvcnQnLCBwb3N0RGF0YSApO1xuXHR9XG5cblx0b25DdXN0b21Db250ZXh0Q2xpY2soIGlkICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3BkZl9yZXZpZXdfcHJpbnQnOlxuXHRcdFx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9pZF9hcnJheTtcblxuXHRcdFx0XHR2YXIgaWRzID0gW107XG5cdFx0XHRcdGlmICggJHRoaXMuZWRpdF92aWV3ICYmICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRcdFx0aWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdFx0XHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRcdHZhciBncmlkX3NlbGVjdGVkX3JvdyA9ICR0aGlzLmdldFJlY29yZEZyb21HcmlkQnlJZCggdmFsdWUgKTtcblx0XHRcdFx0XHRcdGlkcy5wdXNoKCBncmlkX3NlbGVjdGVkX3Jvdy5pZCApO1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZG9Gb3JtSUZyYW1lQ2FsbCggeyAwOiB7ICd1c2VyX3Jldmlld19jb250cm9sX2lkJzogaWRzIH0sIDE6ICdwZGZfcmV2aWV3X3ByaW50JyB9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdGdldFVzZXJSZXZpZXdUYWJIdG1sKCkge1xuXHRcdHJldHVybiBgPGRpdiBpZD1cInRhYl9yZXZpZXdcIiBjbGFzcz1cImVkaXQtdmlldy10YWItb3V0c2lkZVwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJlZGl0LXZpZXctdGFiXCIgaWQ9XCJ0YWJfcmV2aWV3X2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlyc3QtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2Vjb25kLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRoaXJkLWNvbHVtbiBmdWxsLXdpZHRoLWNvbHVtblwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGhpcmQtY29sdW1uLWZvcm0taXRlbVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDQwJVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW4tZm9ybS1pdGVtLWxhYmVsXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbHVtbi1mb3JtLWl0ZW0taW5wdXRcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLWRpdiBmdWxsLXdpZHRoLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcnRoLWNvbHVtbiBmdWxsLXdpZHRoLWNvbHVtbiBib3JkZXItY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PmA7XG5cdH1cbn1cblxuVXNlclJldmlld0NvbnRyb2xWaWV3Q29udHJvbGxlci5sb2FkU3ViVmlldyA9IGZ1bmN0aW9uKCBjb250YWluZXIsIGJlZm9yZVZpZXdMb2FkZWRGdW4sIGFmdGVyVmlld0xvYWRlZEZ1biApIHtcblx0R2xvYmFsLmxvYWRWaWV3U291cmNlKCAnVXNlclJldmlld0NvbnRyb2wnLCAnU3ViVXNlclJldmlld0NvbnRyb2xWaWV3Lmh0bWwnLCBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdHZhciBhcmdzID0ge307XG5cdFx0dmFyIHRlbXBsYXRlID0gXy50ZW1wbGF0ZSggcmVzdWx0ICk7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggYmVmb3JlVmlld0xvYWRlZEZ1biApICkge1xuXHRcdFx0YmVmb3JlVmlld0xvYWRlZEZ1bigpO1xuXHRcdH1cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggY29udGFpbmVyICkgKSB7XG5cdFx0XHRjb250YWluZXIuaHRtbCggdGVtcGxhdGUoIGFyZ3MgKSApO1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGFmdGVyVmlld0xvYWRlZEZ1biApICkge1xuXHRcdFx0XHRUVFByb21pc2Uud2FpdCggJ0Jhc2VWaWV3Q29udHJvbGxlcicsICdpbml0aWFsaXplJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YWZ0ZXJWaWV3TG9hZGVkRnVuKCBzdWJfdXNlcl9yZXZpZXdfY29udHJvbF92aWV3X2NvbnRyb2xsZXIgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7454\n")}}]);