"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["payroll-pay_stub-PayStubViewController"],{3436:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PayStubViewController\": () => (/* binding */ PayStubViewController)\n/* harmony export */ });\n/* harmony import */ var decimal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(482);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\nclass PayStubViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#pay_stub_view_container',\n\n\t\t\tfiltered_status_array: null,\n\t\t\tuser_status_array: null,\n\t\t\tuser_group_array: null,\n\t\t\tuser_destination_account_array: null,\n\t\t\tcurrency_array: null,\n\t\t\ttype_array: null,\n\n\t\t\tcountry_array: null,\n\t\t\tprovince_array: null,\n\n\t\t\te_province_array: null,\n\n\t\t\tuser_api: null,\n\t\t\tuser_group_api: null,\n\t\t\tcompany_api: null,\n\n\t\t\tpay_stub_entry_api: null,\n\n\t\t\tinclude_pay_stub_accounts: true,\n\t\t\ttransaction_status_array: false,\n\n\t\t\tnet_pay_amount: false,\n\n\t\t\tpseal_link: false,\n\n\t\t\toriginal_status_id: 10\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 = 'PayStubEditView.html';\n\t\tthis.permission_id = 'pay_stub';\n\t\tthis.viewId = 'PayStub';\n\t\tthis.script_name = 'PayStubView';\n\t\tthis.table_name_key = 'pay_stub';\n\t\tthis.context_menu_name = $.i18n._( 'Pay Stub' );\n\t\tthis.navigation_label = $.i18n._( 'Pay Stubs' );\n\t\tthis.api = TTAPI.APIPayStub;\n\t\tthis.user_api = TTAPI.APIUser;\n\t\tthis.pay_stub_entry_api = TTAPI.APIPayStubEntry;\n\t\tthis.pay_stub_entry_account_link_api = TTAPI.APIPayStubEntryAccountLink;\n\t\tthis.user_group_api = TTAPI.APIUserGroup;\n\t\tthis.company_api = TTAPI.APICompany;\n\t\tthis.pay_period_api = TTAPI.APIPayPeriod;\n\t\tthis.pay_stub_transaction_api = TTAPI.APIPayStubTransaction;\n\t\tthis.remittance_destination_account_api = TTAPI.APIRemittanceDestinationAccount;\n\n\t\tvar $this = this;\n\t\t$.when(\n\t\t\tthis.preloadTransactionOptions( new $.Deferred() ),\n\t\t\tthis.preloadPayStubAccountLinks( new $.Deferred() )\n\t\t).done( function() {\n\t\t\t$this.completeInit();\n\t\t} );\n\t}\n\n\tisEditMode() {\n\t\tif ( this.is_add || ( this.is_edit && this.original_status_id == 25 ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpreloadTransactionOptions( dfd ) {\n\t\tvar $this = this;\n\t\tthis.pay_stub_transaction_api.getOptions( 'status', false, false, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t$this.transaction_status_array = result.getResult();\n\t\t\t\tdfd.resolve( true );\n\t\t\t}\n\t\t} );\n\n\t\treturn dfd.promise();\n\t}\n\n\tpreloadPayStubAccountLinks( dfd ) {\n\t\tvar $this = this;\n\t\tthis.pay_stub_entry_account_link_api.getPayStubEntryAccountLink( '', false, false, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar data = result.getResult()[0];\n\t\t\t\tif ( data ) {\n\t\t\t\t\t$this.pseal_link = {\n\t\t\t\t\t\ttotal_gross_entry_account_id: false,\n\t\t\t\t\t\ttotal_deductions_entry_account_id: false,\n\t\t\t\t\t\tnet_pay_entry_account_id: false,\n\t\t\t\t\t\tcontributions_entry_account_id: false\n\t\t\t\t\t};\n\n\t\t\t\t\t$this.pseal_link.total_gross_entry_account_id = data.total_gross;\n\t\t\t\t\t$this.pseal_link.total_deductions_entry_account_id = data.total_employee_deduction;\n\t\t\t\t\t$this.pseal_link.net_pay_entry_account_id = data.total_net_pay;\n\t\t\t\t\t$this.pseal_link.contributions_entry_account_id = data.total_employer_deduction;\n\t\t\t\t}\n\t\t\t\tdfd.resolve( true );\n\t\t\t}\n\t\t} );\n\n\t\treturn dfd.promise();\n\t}\n\n\tcompleteInit() {\n\t\tthis.initPermission();\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\tinitPermission() {\n\n\t\tsuper.initPermission();\n\n\t\tif ( PermissionManager.validate( this.permission_id, 'view' ) || PermissionManager.validate( this.permission_id, 'view_child' ) ) {\n\t\t\tthis.show_search_tab = true;\n\t\t} else {\n\t\t\tthis.show_search_tab = false;\n\t\t}\n\t\treturn {};\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tvar options = [\n\t\t\t{ option_name: 'filtered_status', field_name: 'status_id', api: this.api },\n\t\t\t{ option_name: 'type', field_name: 'type_id', api: this.api },\n\t\t\t{ option_name: 'status', field_name: 'user_status_id', api: this.user_api },\n\t\t\t{ option_name: 'country', field_name: 'country', api: this.company_api },\n\t\t];\n\n\t\tthis.initDropDownOptions( options );\n\n\t\tvar result = {};\n\t\tfor ( var i = 1; i <= 128; i++ ) {\n\t\t\tresult[i] = i;\n\t\t}\n\t\t$this.basic_search_field_ui_dic['run_id'].setSourceData( Global.buildRecordArray( result ) );\n\t\t$this.adv_search_field_ui_dic['run_id'].setSourceData( Global.buildRecordArray( result ) );\n\t\tthis.user_group_api.getUserGroup( '', false, false, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\n\t\t\t\tres = Global.buildTreeRecord( res );\n\t\t\t\t$this.user_group_array = res;\n\n\t\t\t\tif ( !$this.sub_view_mode && $this.basic_search_field_ui_dic['group_id'] ) {\n\t\t\t\t\t$this.basic_search_field_ui_dic['group_id'].setSourceData( res );\n\t\t\t\t\t$this.adv_search_field_ui_dic['group_id'].setSourceData( res );\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\tgroups: {\n\t\t\t\tpay_stubs: {\n\t\t\t\t\tlabel: $.i18n._( 'Pay Stubs' ),\n\t\t\t\t\tid: this.script_name + 'Pay Stubs'\n\t\t\t\t}\n\t\t\t},\n\t\t\texclude: [\n\t\t\t\t'copy',\n\t\t\t\t'save_and_new',\n\t\t\t\t'save_and_copy',\n\t\t\t],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Jump To' ),\n\t\t\t\t\tid: 'jump_to_header',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\taction_group_header: true,\n\t\t\t\t\tpermission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers.\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'TimeSheet' ),\n\t\t\t\t\tid: 'timesheet',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Schedule' ),\n\t\t\t\t\tid: 'schedule',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Pay Stub Amendments' ),\n\t\t\t\t\tid: 'pay_stub_amendment',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Pay Stub Transactions' ),\n\t\t\t\t\tid: 'pay_stub_transaction',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\titems: [], // TODO: Is this still needed? It interferes with PrimeVue as it thinks its a submenu but wrong format, but I cant see anywhere this code is used, other than for Print menu.\n\t\t\t\t\tpermission_result: true,\n\t\t\t\t\tpermission: true,\n\t\t\t\t\tsort_order: null\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Edit Employee' ),\n\t\t\t\t\tid: 'edit_employee',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Edit Pay Period' ),\n\t\t\t\t\tid: 'edit_pay_period',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: '', //Empty label. vue_icon is displayed instead of text.\n\t\t\t\t\tid: 'other_header',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'other',\n\t\t\t\t\taction_group_header: true,\n\t\t\t\t\tvue_icon: 'tticon tticon-more_vert_black_24dp',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View: Employee Pay Stubs' ),\n\t\t\t\t\tid: 'employee_pay_stubs',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'other',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View: Employer Pay Stubs' ),\n\t\t\t\t\tid: 'employer_pay_stubs',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'other',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Generate Pay Stub' ),\n\t\t\t\t\tid: 'generate_pay_stub',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'other',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Process Transactions' ),\n\t\t\t\t\tid: 'direct_deposit',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'other',\n\t\t\t\t\ticon: 'direct_deposit-35x35.png',\n\t\t\t\t\titems: [],\n\t\t\t\t\tpermission_result: true,\n\t\t\t\t\tpermission: true\n\t\t\t\t},\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_amendment':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'pay_stub_amendment' );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_transaction':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'pay_stub_transaction' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length, 'user' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_pay_period':\n\t\t\t\tthis.setDefaultMenuEditPayPeriodIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'employee_pay_stubs':\n\t\t\tcase 'employer_pay_stubs':\n\t\t\tcase 'print_checks':\n\t\t\tcase 'direct_deposit':\n\t\t\t\tthis.setDefaultMenuReportRelatedIcons( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'generate_pay_stub':\n\t\t\t\tthis.setDefaultMenuGeneratePayStubIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetDefaultMenuEditPayPeriodIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !this.editPermissionValidate( 'pay_period_schedule' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t\tif ( grid_selected_length === 1 ) {\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\tsetDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.editChildPermissionValidate( 'user' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length === 1 ) {\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\tsetDefaultMenuViewIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( pId === 'punch' || pId === 'schedule' || pId === 'pay_stub_amendment' ) {\n\t\t\tsuper.setDefaultMenuViewIcon( context_btn, grid_selected_length, pId );\n\t\t} else if ( pId === 'pay_stub_transaction' ) {\n\t\t\tif ( PermissionManager.validate( 'pay_stub', 'enabled' )\n\t\t\t\t&& ( PermissionManager.validate( 'pay_stub', 'view' ) || PermissionManager.validate( 'pay_stub', 'view_child' ) ) ) {\n\t\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t\t} else {\n\t\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t\t}\n\t\t} else {\n\t\t\tif ( !this.viewPermissionValidate( pId ) || this.edit_only_mode ) {\n\t\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t\t}\n\n\t\t\tif ( grid_selected_length > 0 && this.viewOwnerOrChildPermissionValidate() ) {\n\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t\t} else {\n\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t}\n\t\t}\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_amendment':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'pay_stub_amendment' );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_transaction':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'pay_stub_transaction' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'user' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_pay_period':\n\t\t\t\tthis.setEditMenuViewIcon( context_btn, 'pay_period_schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'view':\n\t\t\tcase 'employer_pay_stubs':\n\t\t\tcase 'employee_pay_stubs':\n\t\t\tcase 'print_checks':\n\t\t\tcase 'direct_deposit':\n\t\t\t\t//this.setEditMenuReportRelatedIcons( context_btn );\n\t\t\t\tthis.setEditMenuEditIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'generate_pay_stub':\n\t\t\t\tthis.setEditMenuGeneratePayStubIcon( context_btn );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpayStubReportIconsValidate() {\n\t\tif ( !PermissionManager.validate( 'pay_stub', 'enabled' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar selected_item = this.getSelectedItem();\n\n\t\tif ( PermissionManager.validate( 'pay_stub', 'view' ) || this.ownerOrChildPermissionValidate( 'pay_stub', 'view_child', selected_item ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\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\tsetEditMenuReportRelatedIcons( 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 ( this.current_edit_record.id && 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\tsetEditMenuGeneratePayStubIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !PermissionManager.checkTopLevelPermission( 'GeneratePayStubs' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t}\n\n\tsetDefaultMenuGeneratePayStubIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !PermissionManager.checkTopLevelPermission( 'GeneratePayStubs' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t}\n\n\tremoveEntryInsideEditorCover() {\n\t\tif ( this.cover && this.cover.length > 0 ) {\n\t\t\tthis.cover.remove();\n\t\t}\n\t\tthis.cover = null;\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tthis.include_pay_stub_accounts = true;\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'country':\n\t\t\t\t\t\tthis.setCountryValue( widget, key );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'status_id':\n\t\t\t\t\t\tif ( this.current_edit_record[key] == 40 || this.current_edit_record[key] == 100 ) {\n\t\t\t\t\t\t\tthis.include_pay_stub_accounts = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\n\t\tif ( this.is_add ) {\n\t\t\tthis.edit_view_ui_dic.user_id.setEnabled( true );\n\t\t} else {\n\t\t\tthis.edit_view_ui_dic.user_id.setEnabled( false );\n\t\t}\n\n\t\tif ( !this.is_mass_editing ) {\n\t\t\tthis.initInsideEntryEditorData();\n\t\t}\n\t}\n\n\tgetPayStubTransactionDefaultData( callback, index ) {\n\t\tthis.pay_stub_transaction_api['get' + this.pay_stub_transaction_api.key_name + 'DefaultData']( {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar data = [];\n\t\t\t\tvar result_data = result.getResult();\n\t\t\t\tresult_data.id = false;\n\n\t\t\t\tdata.push( result_data );\n\n\t\t\t\tcallback( data, index );\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetPayStubTransaction( callback ) {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\t\targs.filter_data.pay_stub_id = TTUUID.isUUID( this.current_edit_record.id ) ? this.current_edit_record.id : ( TTUUID.isUUID( this.copied_record_id ) ? this.copied_record_id : '' );\n\t\tthis.pay_stub_transaction_api['getPayStubTransaction']( args, true, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar result_data = res.getResult();\n\t\t\t\tif ( _.size( result_data ) == 0 ) {\n\t\t\t\t\tresult_data = [];\n\t\t\t\t}\n\n\t\t\t\tcallback( result_data );\n\t\t\t}\n\t\t} );\n\t}\n\n\tinitInsideTransactionEditorData() {\n\t\tvar $this = this;\n\n\t\tif ( ( !this.current_edit_record || TTUUID.isUUID( this.current_edit_record.id ) == false ) && !this.copied_record_id ) {\n\t\t\tthis.getPayStubTransactionDefaultData( function( data ) {\n\t\t\t\tif ( $this.isEditMode() == true || data.length > 0 ) {\n\t\t\t\t\t$this.editor.transaction_data = data;\n\t\t\t\t} else {\n\t\t\t\t\t$this.editor.transaction_data = false;\n\t\t\t\t}\n\t\t\t\t//Issue #2890 - Having a promise resolve after the API call for getting transaction data and storing that data\n\t\t\t\t//to be used later while building the HTML. This stops this API call from being delayed and causing unintended issues\n\t\t\t\t//with duplicating transactions, overlays and data sync issues.\n\t\t\t\tTTPromise.resolve( 'PayStubViewController', 'insideEditorDataLoaded' );\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.getPayStubTransaction( function( data ) {\n\t\t\t\tif ( $this.isEditMode() == true || data.length > 0 ) {\n\t\t\t\t\t$this.editor.transaction_data = data;\n\t\t\t\t} else {\n\t\t\t\t\t$this.editor.transaction_data = false;\n\t\t\t\t}\n\t\t\t\t//Issue #2890 - Having a promise resolve after the API call for getting transaction data and storing that data\n\t\t\t\t//to be used later while building the HTML. This stops this API call from being delayed and causing unintended issues\n\t\t\t\t//with duplicating transactions, overlays and data sync issues.\n\t\t\t\tTTPromise.resolve( 'PayStubViewController', 'insideEditorDataLoaded' );\n\t\t\t} );\n\t\t}\n\t}\n\n\tinitInsideEntryEditorData() {\n\t\tTTPromise.add( 'PayStubViewController', 'insideEditorDataLoaded' );\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( this.copied_record_id || ( this.current_edit_record && this.current_edit_record.id ) ) {\n\t\t\targs.filter_data.pay_stub_id = TTUUID.isUUID( this.current_edit_record.id ) ? this.current_edit_record.id : this.copied_record_id;\n\t\t\tthis.pay_stub_entry_api['get' + this.pay_stub_entry_api.key_name]( args, {\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\tvar data = $this.handlePayStubEntryData( res.getResult() );\n\t\t\t\t\tTTPromise.wait( 'PayStubViewController', 'insideEditorDataLoaded', function() {\n\t\t\t\t\t\t$this.editor.setValue( data );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tvar data = $this.handlePayStubEntryData();\n\t\t\tTTPromise.wait( 'PayStubViewController', 'insideEditorDataLoaded', function() {\n\t\t\t\t$this.editor.setValue( data );\n\t\t\t} );\n\t\t}\n\n\t\tthis.initInsideTransactionEditorData();\n\t}\n\n\thandlePayStubEntryData( data ) {\n\n\t\tvar total_rows = {};\n\t\tvar retval = {};\n\t\tif ( data ) {\n\t\t\tfor ( var n in data ) {\n\t\t\t\tvar type_id = data[n].type_id;\n\t\t\t\tif ( type_id == 40 ) {\n\t\t\t\t\tif ( data[n].pay_stub_entry_account_id ) {\n\t\t\t\t\t\tvar newrow = data[n];\n\t\t\t\t\t\tnewrow.total_row = true;\n\t\t\t\t\t\ttotal_rows[data[n].pay_stub_entry_account_id] = newrow[n];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( typeof retval[type_id] == 'undefined' ) {\n\t\t\t\t\t\tretval[type_id] = [];\n\t\t\t\t\t}\n\t\t\t\t\tretval[type_id].push( data[n] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//set blanks where there are no records in any given sections\n\t\tvar type_ids = [10, 20, 30, 50, 80]; //no net pay default row\n\t\tfor ( var t = 0; t < type_ids.length; t++ ) {\n\t\t\tif ( typeof retval[type_ids[t]] == 'undefined' || retval[type_ids[t]].length == 0 ) {\n\t\t\t\tretval[type_ids[t]] = [];\n\t\t\t\tretval[type_ids[t]].push( { type_id: type_ids[t] } );\n\t\t\t}\n\t\t}\n\n\t\t//Fill up the missing total rows.\n\t\tvar gross_total = {};\n\t\tif ( total_rows[this.pseal_link.total_gross_entry_account_id] ) {\n\t\t\tgross_total = total_rows[this.pseal_link.total_gross_entry_account_id];\n\t\t} else {\n\t\t\tgross_total = {\n\t\t\t\ttotal_row: true,\n\t\t\t\ttype_id: 40,\n\t\t\t\tname: $.i18n._( 'Total Gross' ),\n\t\t\t\tpay_stub_entry_account_id: this.pseal_link.total_gross_entry_account_id\n\t\t\t};\n\t\t}\n\t\tretval[10].push( gross_total );\n\n\t\tvar employee_deduction_total = {};\n\t\tif ( total_rows[this.pseal_link.total_deductions_entry_account_id] ) {\n\t\t\temployee_deduction_total = total_rows[this.pseal_link.total_deductions_entry_account_id];\n\t\t} else {\n\t\t\temployee_deduction_total = {\n\t\t\t\ttotal_row: true,\n\t\t\t\ttype_id: 40,\n\t\t\t\tname: $.i18n._( 'Total Deductions' ),\n\t\t\t\tpay_stub_entry_account_id: this.pseal_link.total_deductions_entry_account_id\n\t\t\t};\n\t\t}\n\t\tretval[20].push( employee_deduction_total );\n\n\t\tvar net_pay_total = {};\n\t\tif ( total_rows[this.pseal_link.net_pay_entry_account_id] ) {\n\t\t\tnet_pay_total = total_rows[this.pseal_link.net_pay_entry_account_id];\n\t\t} else {\n\t\t\tnet_pay_total = {\n\t\t\t\t//total_row: true,\n\t\t\t\ttype_id: 40,\n\t\t\t\tname: $.i18n._( 'Net Pay' ),\n\t\t\t\tpay_stub_entry_account_id: this.pseal_link.net_pay_entry_account_id\n\t\t\t};\n\t\t}\n\t\t//Because we don't add empty rows to retval[40], and there should only ever be one row in net pay, we will need to initialize retval[40] here.\n\t\tretval[40] = net_pay_total;\n\n\t\tvar employer_deduction_total = {};\n\t\tif ( total_rows[this.pseal_link.contributions_entry_account_id] ) {\n\t\t\temployer_deduction_total = total_rows[this.pseal_link.contributions_entry_account_id];\n\t\t} else {\n\t\t\temployer_deduction_total = {\n\t\t\t\ttotal_row: true,\n\t\t\t\ttype_id: 40,\n\t\t\t\tname: $.i18n._( 'Employer Total Contributions' ),\n\t\t\t\tpay_stub_entry_account_id: this.pseal_link.contributions_entry_account_id\n\t\t\t};\n\t\t}\n\t\tretval[30].push( employer_deduction_total );\n\n\t\treturn retval;\n\t}\n\n\tinsideEntryEditorSetValue( val ) {\n\t\tvar $this = this;\n\t\tthis.removeAllRows( true );\n\t\tthis.removeCover();\n\n\t\tfunction setEarnings( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = `\n\t\t\t
`;\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Earnings' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Rate' ),\n\t\t\t\tcol4: $.i18n._( 'Hrs/Units' ),\n\t\t\t\tcol5: $.i18n._( 'Amount' ),\n\t\t\t\tcol6: $.i18n._( 'YTD Amount' )\n\t\t\t};\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t\tfor ( var i = 0; i < _.size( data ); i++ ) {\n\t\t\t\tif ( Global.isSet( data[i] ) ) {\n\t\t\t\t\tvar row = data[i];\n\t\t\t\t\trow.type_id = 10;\n\t\t\t\t\t$this.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t}\n\n\t\tfunction getHeaderThreeColumn() {\n\t\t\treturn `\n\t\t\t`;\n\t\t}\n\t\tfunction setDeductions( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = getHeaderThreeColumn();\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Deductions' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Amount' ),\n\t\t\t\tcol4: $.i18n._( 'YTD Amount' )\n\t\t\t};\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t\tfor ( var i = 0; i < _.size( data ); i++ ) {\n\t\t\t\tif ( Global.isSet( data[i] ) ) {\n\t\t\t\t\tvar row = data[i];\n\t\t\t\t\trow.type_id = 20;\n\t\t\t\t\t$this.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\n\t\t}\n\n\t\tfunction setNetPay( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tif ( data ) {\n\t\t\t\t// data.type_id = 40;\n\t\t\t\t$this.addRow( data );\n\t\t\t}\n\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\n\t\t}\n\n\t\tfunction setMiscellaneous( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = getHeaderThreeColumn();\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Miscellaneous' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Amount' ),\n\t\t\t\tcol4: $.i18n._( 'YTD Amount' )\n\t\t\t};\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t\tfor ( var i in data ) {\n\t\t\t\t$this.addRow( data[i] );\n\t\t\t}\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t}\n\n\t\tfunction setEmployerContributions( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = getHeaderThreeColumn();\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Employer Contributions' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Amount' ),\n\t\t\t\tcol4: $.i18n._( 'YTD Amount' )\n\t\t\t};\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t\tfor ( var i = 0; i < _.size( data ); i++ ) {\n\t\t\t\tif ( Global.isSet( data[i] ) ) {\n\t\t\t\t\tvar row = data[i];\n\t\t\t\t\trow.type_id = 30;\n\t\t\t\t\t$this.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t}\n\n\t\tfunction setAccrual( data ) {\n\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = getHeaderThreeColumn();\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Accrual' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Amount' ),\n\t\t\t\tcol4: $.i18n._( 'Balance' )\n\t\t\t};\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t\tfor ( var i = 0; i < _.size( data ); i++ ) {\n\t\t\t\tif ( Global.isSet( data[i] ) ) {\n\t\t\t\t\tvar row = data[i];\n\t\t\t\t\trow.type_id = 50;\n\t\t\t\t\t$this.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t\t$( render ).append( ' ' );\n\t\t\t$this.rows_widgets_array.push( true );\n\t\t}\n\n\t\tif ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[10] ) ) {\n\t\t\tsetEarnings( val[10] );\n\t\t}\n\n\t\tif ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[20] ) ) {\n\t\t\tsetDeductions( val[20] );\n\t\t}\n\n\t\tsetNetPay( val[40] );\n\n\t\tif ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[80] ) ) {\n\t\t\tsetMiscellaneous( val[80] );\n\t\t}\n\n\t\tif ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[30] ) ) {\n\t\t\tsetEmployerContributions( val[30] );\n\t\t}\n\n\t\tif ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[50] ) ) {\n\t\t\tsetAccrual( val[50] );\n\t\t}\n\n\t\tif ( this.parent_controller.editor.transaction_data ) {\n\t\t\tthis.parent_controller.editor.insideTransactionEditorSetValue( this.parent_controller.editor.transaction_data );\n\t\t}\n\n\t\tif ( this.parent_controller.copied_record_id && TTUUID.isUUID( this.parent_controller.copied_record_id ) ) {\n\t\t\tthis.parent_controller.copied_record_id = '';\n\t\t}\n\n\t\tthis.calcTotal();\n\t}\n\n\tcheckForNonHeaderData( data ) {\n\t\tfor ( var n in data ) {\n\t\t\tif ( TTUUID.isUUID( data[n].id ) == true ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tinsideEntryEditorAddRow( data, index ) {\n\t\tvar $this = this;\n\t\tif ( !data ) {\n\t\t\t$this.addRow( {}, index );\n\t\t} else {\n\t\t\tif ( typeof index != 'undefined' && typeof this.rows_widgets_array[index].ytd_amount != 'undefined' && !data['type_id'] ) {\n\t\t\t\tdata['type_id'] = this.rows_widgets_array[index].ytd_amount.attr( 'type_id' );\n\t\t\t}\n\n\t\t\tfunction renderColumns( data, type, index ) {\n\t\t\t\tvar render = $this.getRender(); //get render, should be a table\n\t\t\t\tvar widgets = {}; //Save each row's widgets\n\t\t\t\tvar row; //Get Row render\n\t\t\t\tvar widgetContainer = $( '
' );\n\t\t\t\tvar right_label;\n\t\t\t\tvar args = { filter_data: {} };\n\t\t\t\tvar pay_stub_amendment_id = '', user_expense_id = '';\n\t\t\t\tvar pay_stub_status_id = $this.parent_controller['current_edit_record']['status_id'];\n\n\t\t\t\tvar is_add = false;\n\n\t\t\t\tif ( ( !$this.parent_controller['current_edit_record']['id'] && !$this.parent_controller.copied_record_id ) || ( !data.id ) ) {\n\t\t\t\t\tis_add = true;\n\t\t\t\t}\n\n\t\t\t\tif ( pay_stub_status_id == 40 || pay_stub_status_id == 100 ) {\n\t\t\t\t\tis_add = false;\n\t\t\t\t}\n\n\t\t\t\tif ( TTUUID.isUUID( data['pay_stub_amendment_id'] ) && data['pay_stub_amendment_id'] != TTUUID.zero_id ) {\n\t\t\t\t\tpay_stub_amendment_id = data['pay_stub_amendment_id'];\n\t\t\t\t}\n\t\t\t\tif ( TTUUID.isUUID( data['user_expense_id'] ) && data['user_expense_id'] != TTUUID.zero_id ) {\n\t\t\t\t\tuser_expense_id = data['user_expense_id'];\n\t\t\t\t}\n\n\t\t\t\tif ( $this.parent_controller.copied_record_id ) {\n\t\t\t\t\tpay_stub_amendment_id = '';\n\t\t\t\t\tuser_expense_id = '';\n\t\t\t\t}\n\n\t\t\t\tvar row_enabled = true;\n\t\t\t\t// if the pay_stub_amendment_id and user_expense_id all >0 how to display the right label?\n\t\t\t\tif ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) {\n\t\t\t\t\tright_label = $( ' (' + $.i18n._( 'Amendment' ) + ') ' );\n\t\t\t\t\trow_enabled = false;\n\t\t\t\t} else if ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) {\n\t\t\t\t\tright_label = $( ' (' + $.i18n._( 'Expense' ) + ') ' );\n\t\t\t\t\trow_enabled = false;\n\t\t\t\t}\n\n\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\trow = $( `\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t ` );\n\t\t\t\t} else {\n\t\t\t\t\trow = $( `\n\t\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\t\t\n\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\t\t\t\t\t}\n\n\t\t\t\t// Pay Stub Account\n\t\t\t\tvar form_item_name_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\t\tform_item_name_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIPayStubEntryAccount,\n\t\t\t\t\twidth: 132,\n\t\t\t\t\tis_static_width: 132,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_PayStubAccount',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tfield: 'pay_stub_entry_name_id'\n\t\t\t\t} );\n\t\t\t\tform_item_name_input.setValue( data.pay_stub_entry_name_id );\n\t\t\t\tform_item_name_input.setEnabled( row_enabled );\n\n\t\t\t\tform_item_name_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.onFormItemChange( target );\n\t\t\t\t} );\n\n\t\t\t\tvar form_item_name_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_name_text.TText( { field: 'name' } );\n\t\t\t\tform_item_name_text.setValue( data.name ? ( ( data['type_id'] != 40 ) ? ' ' + data.name : data.name ) : '' );\n\n\t\t\t\t// Note(description)\n\t\t\t\tvar form_item_note_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_note_input.TTextInput( { field: 'description', width: 300, display_na: false } );\n\t\t\t\tform_item_note_input.setValue( data.description );\n\t\t\t\tform_item_note_input.attr( 'editable', true );\n\n\t\t\t\tvar form_item_note_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_note_text.TText( { field: 'description', display_na: false } );\n\t\t\t\tform_item_note_text.setValue( data.description ? data.description : ' ' );\n\n\t\t\t\t// Rate\n\t\t\t\tvar form_item_rate_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_rate_input.TTextInput( { field: 'rate', width: 60, hasKeyEvent: true } );\n\t\t\t\tform_item_rate_input.setValue( Global.removeTrailingZeros( data.rate ) );\n\t\t\t\tform_item_rate_input.attr( 'editable', true );\n\t\t\t\tform_item_rate_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyUp( target );\n\t\t\t\t} );\n\n\t\t\t\tform_item_rate_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyDown( target );\n\t\t\t\t} );\n\n\t\t\t\tform_item_rate_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.onFormItemChange( target );\n\t\t\t\t} );\n\n\t\t\t\tvar form_item_rate_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_rate_text.TText( { field: 'rate' } );\n\t\t\t\tform_item_rate_text.setValue( Global.removeTrailingZeros( data.rate ) );\n\n\t\t\t\t// Hrs/Units\n\t\t\t\tvar form_item_units_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_units_input.TTextInput( { field: 'units', width: 60, hasKeyEvent: true } );\n\t\t\t\tform_item_units_input.setValue( Global.removeTrailingZeros( data.units ) );\n\t\t\t\tform_item_units_input.attr( 'editable', true );\n\t\t\t\tform_item_units_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyUp( target );\n\t\t\t\t} );\n\n\t\t\t\tform_item_units_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyDown( target );\n\t\t\t\t} );\n\t\t\t\tform_item_units_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.onFormItemChange( target );\n\t\t\t\t} );\n\n\t\t\t\tvar form_item_units_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_units_text.TText( { field: 'units' } );\n\t\t\t\tform_item_units_text.setValue( Global.removeTrailingZeros( data.units ) );\n\n\t\t\t\t// Amount\n\t\t\t\tvar form_item_amount_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_amount_input.TTextInput( { field: 'amount', width: 60 } );\n\t\t\t\tform_item_amount_input.setValue( Global.removeTrailingZeros( data.amount ) );\n\n\t\t\t\tform_item_amount_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyUp( target );\n\t\t\t\t} );\n\n\t\t\t\tform_item_amount_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) {\n\t\t\t\t\t$this.onFormItemKeyDown( target );\n\t\t\t\t} );\n\n\t\t\t\tform_item_amount_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.onFormItemChange( target );\n\t\t\t\t} );\n\n\t\t\t\tvar form_item_amount_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_amount_text.TText( { field: 'amount' } );\n\t\t\t\tform_item_amount_text.setValue( Global.removeTrailingZeros( data.amount ) );\n\n\t\t\t\t// YTD Amount\n\t\t\t\tvar form_item_ytd_amount_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_ytd_amount_text.TText( { field: 'ytd_amount' } );\n\t\t\t\tform_item_ytd_amount_text.setValue( Global.removeTrailingZeros( data.ytd_amount ) );\n\t\t\t\tform_item_ytd_amount_text.attr( {\n\t\t\t\t\t'pay_stub_entry_id': ( data.id && $this.parent_controller.current_edit_record.id ) ? data.id : '',\n\t\t\t\t\t'type_id': data['type_id'],\n\t\t\t\t\t'original_amount': data['amount'] ? data['amount'] : '0.00',\n\t\t\t\t\t'original_ytd_amount': data['ytd_amount'] ? data['ytd_amount'] : '0.00',\n\t\t\t\t\t'pay_stub_entry_name_id': data['pay_stub_entry_name_id'] ? data['pay_stub_entry_name_id'] : null\n\t\t\t\t} );\n\n//\t\t\t\tif ( !$this.parent_controller.copied_record_id ) {\n\t\t\t\tform_item_ytd_amount_text.attr( 'pay_stub_amendment_id', pay_stub_amendment_id );\n\t\t\t\tform_item_ytd_amount_text.attr( 'user_expense_id', user_expense_id );\n//\t\t\t\t}\n\n\t\t\t\tif ( parseFloat( data['ytd_amount'] ) != 0 ) {\n\n\t\t\t\t} else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) {\n\t\t\t\t\tform_item_ytd_amount_text.text( '-' );\n\t\t\t\t}\n\n\t\t\t\tif ( data.rate && parseFloat( data.rate ) != 0 && !$this.parent_controller.copied_record_id ) {\n\t\t\t\t\tform_item_amount_input.setReadOnly( true );\n\t\t\t\t} else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) {\n\t\t\t\t\tform_item_rate_text.text( '-' );\n\t\t\t\t}\n\n\t\t\t\tif ( data.units && parseFloat( data.units ) != 0 && !$this.parent_controller.copied_record_id ) {\n\t\t\t\t\tform_item_amount_input.setReadOnly( true );\n\t\t\t\t} else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) {\n\t\t\t\t\tform_item_units_text.text( '-' );\n\t\t\t\t}\n\n\t\t\t\t// name\n\t\t\t\tif ( type == 40 || data.total_row === true ) {\n\t\t\t\t\tif ( data['type_id'] == 40 || data.total_row === true ) {\n\t\t\t\t\t\tform_item_name_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t}\n\t\t\t\t\twidgets[form_item_name_text.getField()] = form_item_name_text;\n\t\t\t\t\twidgetContainer.append( form_item_name_text );\n\t\t\t\t\twidgetContainer.append( right_label );\n\t\t\t\t\trow.children().eq( 0 ).append( widgetContainer );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( $this.parent_controller.isEditMode() == true || index ) {\n\n\t\t\t\t\t\tif ( data['type_id'] == 40 || data.total_row === true ) {\n\t\t\t\t\t\t\tform_item_name_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t\twidgets[form_item_name_text.getField()] = form_item_name_text;\n\t\t\t\t\t\t\twidgetContainer.append( form_item_name_text );\n\t\t\t\t\t\t\twidgetContainer.append( right_label );\n\t\t\t\t\t\t\trow.children().eq( 0 ).append( widgetContainer );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs['filter_data']['type_id'] = [type];\n\t\t\t\t\t\t\tform_item_name_input.setDefaultArgs( args );\n\t\t\t\t\t\t\twidgets[form_item_name_input.getField()] = form_item_name_input;\n\t\t\t\t\t\t\twidgetContainer.append( form_item_name_input );\n\t\t\t\t\t\t\twidgetContainer.append( right_label );\n\t\t\t\t\t\t\trow.children().eq( 0 ).append( widgetContainer );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( data['type_id'] == 40 || data.total_row === true ) {\n\t\t\t\t\t\t\tform_item_name_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgets[form_item_name_text.getField()] = form_item_name_text;\n\t\t\t\t\t\twidgetContainer.append( form_item_name_text );\n\t\t\t\t\t\twidgetContainer.append( right_label );\n\t\t\t\t\t\trow.children().eq( 0 ).append( widgetContainer );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Note\n\t\t\t\tif ( ( data['type_id'] == type.toString() || data['type_id'] === type ) && type != 40 && !data.total_row ) {\n\t\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\t\tif ( ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) ) {\n\t\t\t\t\t\t\tform_item_note_input.setReadOnly( true );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgets[form_item_note_input.getField()] = form_item_note_input;\n\t\t\t\t\t\trow.children().eq( 1 ).append( form_item_note_input );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\twidgets[form_item_note_text.getField()] = form_item_note_text;\n\t\t\t\t\t\trow.children().eq( 1 ).append( form_item_note_text );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( Global.isSet( index ) || is_add || ( _.size( data ) === 1 && ( $this.parent_controller.isEditMode() == true ) ) ) {\n\t\t\t\t\t\tif ( ( data['type_id'] == 40 || data.total_row === true ) ) {\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidgets[form_item_note_input.getField()] = form_item_note_input;\n\t\t\t\t\t\t\trow.children().eq( 1 ).append( form_item_note_input );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( type == 20 || type == 30 || type == 50 || type == 80 ) {\n\t\t\t\t\t\twidgets[form_item_note_text.getField()] = form_item_note_text;\n\t\t\t\t\t\trow.children().eq( 1 ).append( form_item_note_text );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// amount\n\t\t\t\tif ( ( data['type_id'] === type.toString() || data['type_id'] === type ) && type != 40 && !data.total_row ) {\n\t\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\t\tif ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) {\n\t\t\t\t\t\t\tform_item_amount_input.setReadOnly( true );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgets[form_item_amount_input.getField()] = form_item_amount_input;\n\t\t\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\t\t\trow.children().eq( 4 ).append( form_item_amount_input );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_amount_input );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twidgets[form_item_amount_text.getField()] = form_item_amount_text;\n\t\t\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\t\t\trow.children().eq( 4 ).append( form_item_amount_text );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_amount_text );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( ( Global.isSet( index ) || is_add || ( _.size( data ) === 1 && ( $this.parent_controller.isEditMode() == true ) ) ) && type != 40 && !data.total_row ) {\n\n\t\t\t\t\t\tif ( data['type_id'] == 40 ) {\n\t\t\t\t\t\t\tform_item_amount_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t\twidgets[form_item_amount_text.getField()] = form_item_amount_text;\n\t\t\t\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\t\t\t\trow.children().eq( 4 ).append( form_item_amount_text );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_amount_text );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidgets[form_item_amount_input.getField()] = form_item_amount_input;\n\t\t\t\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\t\t\t\trow.children().eq( 4 ).append( form_item_amount_input );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_amount_input );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( ( data['type_id'] == 40 || data.total_row ) && type == 30 ) {\n\t\t\t\t\t\t\tform_item_amount_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tform_item_amount_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgets[form_item_amount_text.getField()] = form_item_amount_text;\n\t\t\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\t\t\trow.children().eq( 4 ).append( form_item_amount_text );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_amount_text );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Ytd amount\n\t\t\t\tif ( data['type_id'] == 40 || data.total_row ) {\n\t\t\t\t\tform_item_ytd_amount_text.css( 'font-weight', 'bold' );\n\t\t\t\t}\n\t\t\t\tif ( ( Global.isSet( index ) || is_add || _.size( data ) === 1 ) && type != 40 ) {\n\t\t\t\t\tform_item_ytd_amount_text.text( '-' );\n\t\t\t\t}\n\t\t\t\twidgets[form_item_ytd_amount_text.getField()] = form_item_ytd_amount_text;\n\t\t\t\tif ( type == 10 ) {\n\t\t\t\t\trow.children().eq( 5 ).append( form_item_ytd_amount_text );\n\t\t\t\t} else {\n\t\t\t\t\trow.children().eq( 3 ).append( form_item_ytd_amount_text );\n\t\t\t\t}\n\n\t\t\t\tif ( type == 10 ) { // && !data.total_row ) {\n\n\t\t\t\t\t// rate\n\t\t\t\t\tif ( data['type_id'] == 10 && !data.total_row ) {\n\t\t\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\t\t\tif ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) {\n\t\t\t\t\t\t\t\tform_item_rate_input.setReadOnly( true );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twidgets[form_item_rate_input.getField()] = form_item_rate_input;\n\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_rate_input );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidgets[form_item_rate_text.getField()] = form_item_rate_text;\n\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_rate_text );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( Global.isSet( index ) || is_add ) {\n\t\t\t\t\t\t\tif ( data['type_id'] == 40 || data.total_row ) {\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidgets[form_item_rate_input.getField()] = form_item_rate_input;\n\t\t\t\t\t\t\t\trow.children().eq( 2 ).append( form_item_rate_input );\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\t// units\n\t\t\t\t\tif ( data['type_id'] == 10 && !data.total_row ) {\n\t\t\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\t\t\tif ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) {\n\t\t\t\t\t\t\t\tform_item_units_input.setReadOnly( true );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twidgets[form_item_units_input.getField()] = form_item_units_input;\n\t\t\t\t\t\t\trow.children().eq( 3 ).append( form_item_units_input );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidgets[form_item_units_text.getField()] = form_item_units_text;\n\t\t\t\t\t\t\trow.children().eq( 3 ).append( form_item_units_text );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( Global.isSet( index ) || is_add ) {\n\n\t\t\t\t\t\t\tif ( data['type_id'] == 40 || data.total_row ) {\n\t\t\t\t\t\t\t\tform_item_units_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t\t\twidgets[form_item_units_text.getField()] = form_item_units_text;\n\t\t\t\t\t\t\t\trow.children().eq( 3 ).append( form_item_units_text );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidgets[form_item_units_input.getField()] = form_item_units_input;\n\t\t\t\t\t\t\t\trow.children().eq( 3 ).append( form_item_units_input );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tform_item_units_text.css( 'font-weight', 'bold' );\n\t\t\t\t\t\t\twidgets[form_item_units_text.getField()] = form_item_units_text;\n\t\t\t\t\t\t\trow.children().eq( 3 ).append( form_item_units_text );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//Build row widgets\n\t\t\t\tif ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) {\n\t\t\t\t\trow.children().last().find( '.minus-icon ' ).hide();\n\t\t\t\t}\n\n\t\t\t\tif ( data['total_row'] == true ) {\n\t\t\t\t\twidgets['total_row'] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( typeof data['type_id'] != 'undefined' ) {\n\t\t\t\t\twidgets['type_id'] = data['type_id'];\n\t\t\t\t}\n\n\t\t\t\tif ( data['pay_stub_entry_account_id'] == $this.parent_controller.pseal_link.net_pay_entry_account_id ) {\n\t\t\t\t\twidgets['pay_stub_entry_account_id'] = $this.parent_controller.pseal_link.net_pay_entry_account_id;\n\t\t\t\t}\n\n\t\t\t\tif ( typeof index !== 'undefined' ) {\n\t\t\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\t\t\t$this.rows_widgets_array.splice( ( index + 1 ), 0, widgets );\n\n\t\t\t\t} else {\n\t\t\t\t\t$( render ).append( row );\n\t\t\t\t\t$this.rows_widgets_array.push( widgets );\n\t\t\t\t}\n\n\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\t$this.addIconsEvent( row ); //Bind event to add and minus icon\n\t\t\t\t} else {\n\t\t\t\t\trow.children().last().empty();\n\t\t\t\t}\n\n\t\t\t\tif ( data.total_row || data.type_id == 40 ) {\n\t\t\t\t\trow.find( '.plus-icon' ).remove();\n\t\t\t\t\trow.find( '.minus-icon' ).remove();\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( data['type_id'] == 10 ) {\n\t\t\t\trenderColumns( data, 10, index );\n\t\t\t} else if ( data['type_id'] == 20 ) {\n\t\t\t\trenderColumns( data, 20, index );\n\t\t\t} else if ( data['type_id'] == 30 ) {\n\t\t\t\trenderColumns( data, 30, index );\n\t\t\t} else if ( data['type_id'] == 40 ) {\n\t\t\t\trenderColumns( data, 40, index );\n\t\t\t} else if ( data['type_id'] == 50 ) {\n\t\t\t\trenderColumns( data, 50, index );\n\t\t\t} else if ( data['type_id'] == 80 ) {\n\t\t\t\trenderColumns( data, 80, index );\n\t\t\t}\n\n\t\t}\n\t}\n\n\tinsideEntryEditorRemoveRow( row ) {\n\t\tvar index = row[0].rowIndex;\n\t\tif ( this.rows_widgets_array[index].ytd_amount ) {\n\t\t\tvar remove_id = this.rows_widgets_array[index].ytd_amount.attr( 'pay_stub_entry_id' );\n\t\t\tvar type_id = this.rows_widgets_array[index].ytd_amount.attr( 'type_id' );\n\t\t\tif ( TTUUID.isUUID( remove_id ) ) {\n\t\t\t\tthis.delete_ids.push( remove_id );\n\t\t\t}\n\t\t\trow.remove();\n\t\t\tif ( this.rows_widgets_array[index - 1] === true && ( this.rows_widgets_array[index + 1]['total_row'] === true || this.rows_widgets_array[index + 1] === true ) ) {\n\t\t\t\tthis.addRow( { id: '', type_id: type_id }, index - 1 );\n\t\t\t\tthis.rows_widgets_array.splice( index + 1, 1 ); //Remove from the array used in calcTotal()\n\t\t\t} else {\n\t\t\t\tthis.rows_widgets_array.splice( index, 1 ); //Remove from the array used in calcTotal()\n\t\t\t}\n\n\t\t}\n\t\tthis.calcTotal();\n\t}\n\n\tsavePayStub( record, callbackFunction ) {\n\t\t// when the user create a new pay stub record have them can send entries to api.\n\t\tif ( this.include_pay_stub_accounts ) {\n\t\t\tvar entries = this.saveInsideEntryEditorData();\n\t\t\tvar transactions = this.saveInsideTransactionEditorData();\n\t\t\tif ( entries.length > 0 ) {\n\t\t\t\trecord['entries'] = entries;\n\t\t\t}\n\t\t\tif ( transactions.length > 0 ) {\n\t\t\t\trecord['transactions'] = transactions;\n\t\t\t}\n\t\t}\n\t\tcallbackFunction();\n\t}\n\n\tonSaveClick( ignoreWarning ) {\n\t\tif ( this.is_mass_editing ) {\n\t\t\tthis.include_pay_stub_accounts = false;\n\t\t}\n\t\tsuper.onSaveClick( ignoreWarning );\n\t}\n\n\tdoSaveAPICall( record, ignoreWarning, callback ) {\n\t\tthis.savePayStub( record, () => {\n\t\t\tsuper.doSaveAPICall( record, true, callback );\n\t\t} );\n\t}\n\n\tonSaveDone( result ) {\n\t\tthis.current_edit_record = null;\n\t\treturn true;\n\t}\n\n\tsaveInsideTransactionEditorData( callBack ) {\n\t\t//called by validation function\n\t\tvar $this = this;\n\t\tvar data = this.editor.insideTransactionEditorGetValue( $this.current_edit_record.id ? $this.current_edit_record.id : '' );\n\n\t\tif ( this.editor.delete_transaction_ids.length > 0 ) {\n\t\t\tfor ( var i = 0; i < this.editor.delete_transaction_ids.length; i++ ) {\n\t\t\t\tfor ( var n = 0; n < data.length; n++ ) {\n\t\t\t\t\tif ( this.editor.delete_transaction_ids[i] == data[n].id ) {\n\t\t\t\t\t\tdata[n].deleted = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t}\n\n\tonCopyAsNewClick() {\n\t\tvar $this = this;\n\t\tvar reload_entries = false;\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\t\tif ( Global.isSet( this.edit_view ) ) {\n//\t\t\tfor ( var i = 0; i < this.editor.rows_widgets_array.length; i++ ) {\n//\t\t\t\tif ( this.editor.rows_widgets_array[i] === true ) {\n//\t\t\t\t\tcontinue;\n//\t\t\t\t}\n//\t\t\t\tthis.editor.rows_widgets_array[i].ytd_amount.attr( 'pay_stub_entry_id', '' );\n//\t\t\t\tthis.editor.rows_widgets_array[i].ytd_amount.removeAttr( 'pay_stub_amendment_id' );\n//\t\t\t\tthis.editor.rows_widgets_array[i].ytd_amount.removeAttr( 'user_expense_id' );\n//\t\t\t}\n\t\t\tthis.copied_record_id = this.current_edit_record.id;\n\t\t\tthis.current_edit_record.id = '';\n\n\t\t\tthis.edit_view_ui_dic.user_id.setEnabled( true );\n\t\t\tif ( this.current_edit_record.status_id != 25 ) {\n\t\t\t\tthis.current_edit_record.status_id = 25;\n\t\t\t\tthis.edit_view_ui_dic.status_id.setValue( 25 );\n//\t\t\t\tthis.editor.show_cover = false;\n//\t\t\t\tthis.include_pay_stub_accounts = true;\n//\t\t\t\treload_entries = true;\n\t\t\t}\n\t\t\tthis.editor.show_cover = false;\n//\t\t\tthis.editor.removeCover();\n\n\t\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\t\tnavigation_div.css( 'display', 'none' );\n\t\t\tthis.setEditMenu();\n\t\t\tthis.setTabStatus();\n\t\t\tthis.is_changed = false;\n\t\t\t// reset the entries data.\n//\t\t\tif ( reload_entries ) {\n\t\t\tthis.editor.removeAllRows( true );\n\t\t\tthis.initInsideEntryEditorData();\n//\t\t\t}\n\n\t\t\tProgressBar.closeOverlay();\n\n\t\t} else {\n\n\t\t\tvar filter = {};\n\t\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\t\tvar grid_selected_length = grid_selected_id_array.length;\n\t\t\tvar selectedId;\n\n\t\t\tif ( grid_selected_length > 0 ) {\n\t\t\t\tselectedId = grid_selected_id_array[0];\n\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\tfilter.filter_data.id = [selectedId];\n\n\t\t\t\tthis.api['get' + this.api.key_name]( filter, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.onCopyAsNewResult( result );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tTAlertManager.showAlert( $.i18n._( 'No selected record' ) );\n\t\t\t}\n\n\t\t}\n\t}\n\n\tinitEditView() {\n\t\tthis.original_status_id = this.current_edit_record.status_id;\n\t\tsuper.initEditView();\n\t}\n\n\tonSubViewRemoved() {\n\t\tthis.search();\n\n\t\tif ( !this.edit_view ) {\n\t\t\tthis.setDefaultMenu();\n\t\t} else {\n\t\t\tthis.setEditMenu();\n\t\t}\n\t}\n\n\tonCopyAsNewResult( result ) {\n\t\tvar $this = this;\n\t\tvar result_data = result.getResult();\n\n\t\tif ( !result_data ) {\n\t\t\tTAlertManager.showAlert( $.i18n._( 'Record does not exist' ) );\n\t\t\t$this.onCancelClick();\n\t\t\treturn;\n\t\t}\n\n\t\t$this.openEditView(); // Put it here is to avoid if the selected one is not existed in data or have deleted by other pragram. in this case, the edit view should not be opend.\n\n\t\tresult_data = result_data[0];\n\t\tthis.copied_record_id = result_data.id;\n\t\tresult_data.id = '';\n\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t}\n\t\tif ( result_data.status_id != 25 ) {\n\t\t\tresult_data.status_id = 25; // If its status is not open then set it to open status.\n\t\t}\n\n\t\t$this.current_edit_record = result_data;\n\t\t$this.editor.show_cover = false;\n\t\t$this.initEditView();\n\t}\n\n\tonSaveAndContinue( ignoreWarning ) {\n\t\tvar $this = this;\n\t\tif ( !Global.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\t\tthis.is_changed = false;\n\t\tthis.is_add = false;\n\t\tLocalCacheData.current_doing_context_action = 'save_and_continue';\n\t\tvar record = this.current_edit_record;\n\t\tthis.original_status_id = record.status_id;\n\n\t\trecord = this.uniformVariable( record );\n\n\t\tthis.savePayStub( record, function() {\n\t\t\t$this.api['set' + $this.api.key_name]( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.onSaveAndContinueResult( result );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\tonCancelClick() {\n\t\tTTPromise.reject( 'PayStubViewController', 'insideEditorDataLoaded' );\n\t\tsuper.onCancelClick();\n\t}\n\n\topenEditView() {\n\t\tif ( this.editor ) {\n\t\t\tthis.editor.transaction_data = false;\n\t\t}\n\t\tTTPromise.reject( 'PayStubViewController', 'insideEditorDataLoaded' );\n\t\tsuper.openEditView();\n\t}\n\n\tonMassEditClick() {\n\t\tvar $this = this;\n\t\t$this.is_add = false;\n\t\t$this.is_viewing = false;\n\t\t$this.is_mass_editing = true;\n\t\tLocalCacheData.current_doing_context_action = 'mass_edit';\n\t\t$this.openEditView();\n\t\tvar filter = {};\n\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\tvar grid_selected_length = grid_selected_id_array.length;\n\t\tthis.mass_edit_record_ids = [];\n\n\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t$this.mass_edit_record_ids.push( value );\n\t\t} );\n\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_data.id = this.mass_edit_record_ids;\n\n\t\tthis.api['getCommon' + this.api.key_name + 'Data']( filter, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\tif ( !result_data ) {\n\t\t\t\t\tresult_data = [];\n\t\t\t\t}\n\n\t\t\t\t$this.api['getOptions']( 'unique_columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.unique_columns = result.getResult();\n\t\t\t\t\t\t$this.api['getOptions']( 'linked_columns', {\n\t\t\t\t\t\t\tonResult: function( result1 ) {\n\t\t\t\t\t\t\t\t$this.linked_columns = result1.getResult();\n\t\t\t\t\t\t\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\t\t\t\t\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t$this.current_edit_record = result_data;\n\t\t\t\t\t\t\t\t$this.initEditView();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tonSaveAndContinueResult( 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\t\t\t$this.search( false );\n\t\t\t$this.editor.show_cover = false;\n\t\t\t$this.onEditClick( $this.refresh_id, true );\n\n\t\t\t$this.onSaveAndContinueDone( result );\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// \t\t$this.editor.show_cover = true;\n\t// \t\t$this.onRightArrowClick();\n\t// \t\t$this.search( false );\n\t// \t\t$this.onSaveAndNextDone( result );\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\tsaveInsideEntryEditorData( callBack ) {\n\t\t//called by validation function\n\t\tvar $this = this;\n\t\tvar data = this.editor.getValue( $this.current_edit_record.id ? $this.current_edit_record.id : '' );\n\n\t\tif ( this.editor.delete_ids.length > 0 ) {\n\t\t\tfor ( var i = 0; i < this.editor.delete_ids.length; i++ ) {\n\t\t\t\tfor ( var n = 0; n < data.length; n++ ) {\n\t\t\t\t\tif ( this.editor.delete_ids[i] == data[n].id ) {\n\t\t\t\t\t\tdata[n].deleted = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ( callBack && typeof callBack == 'function' ) {\n\t\t\tcallBack();\n\t\t}\n\t\treturn data;\n\t}\n\n\tinsideEntryEditorGetValue( current_edit_item_id ) {\n\t\tvar len = this.rows_widgets_array.length;\n\t\tvar result = [];\n\n\t\tif ( this.cover && this.cover.length > 0 ) {\n\t\t\treturn result;\n\t\t}\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\tvar data = {};\n\n\t\t\tif ( row === true || _.isArray( row ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n//\t\t\tvar pay_stub_amendment_id = row['ytd_amount'].attr( 'pay_stub_amendment_id' );\n//\t\t\tvar user_expense_id = row['ytd_amount'].attr( 'user_expense_id' );\n//\n//\t\t\tif ( pay_stub_amendment_id > 0 || user_expense_id > 0 ) {\n//\t\t\t\tcontinue;\n//\t\t\t}\n\n\t\t\tdata['id'] = row['ytd_amount'].attr( 'pay_stub_entry_id' );\n\n\t\t\tif ( row['ytd_amount'].attr( 'type_id' ) ) {\n\t\t\t\tdata['type'] = row['ytd_amount'].attr( 'type_id' );\n\t\t\t}\n\n\t\t\tdata['rate'] = row['rate'] ? row['rate'].getValue() : '';\n\t\t\tdata['units'] = row['units'] ? row['units'].getValue() : '';\n\t\t\tdata['amount'] = row['amount'] ? row['amount'].getValue() : '';\n\n\t\t\tif ( Global.isSet( row['ytd_amount'] ) ) {\n\t\t\t\tdata['ytd_amount'] = row['ytd_amount'].getValue();\n\t\t\t}\n\n\t\t\tdata['description'] = row['description'] ? row['description'].getValue() : '';\n\n\t\t\tif ( Global.isSet( row['pay_stub_entry_name_id'] ) ) {\n\t\t\t\tdata['pay_stub_entry_name_id'] = row['pay_stub_entry_name_id'].getValue();\n\t\t\t} else {\n\t\t\t\tdata['pay_stub_entry_name_id'] = row['ytd_amount'].attr( 'pay_stub_entry_name_id' );\n\t\t\t}\n\n\t\t\t// return back to the server with the same data get from API.\n\t\t\tdata['pay_stub_amendment_id'] = row['ytd_amount'].attr( 'pay_stub_amendment_id' );\n\t\t\tdata['user_expense_id'] = row['ytd_amount'].attr( 'user_expense_id' );\n\n\t\t\tdata['pay_stub_id'] = current_edit_item_id;\n\t\t\tif ( row['total_row'] != true && TTUUID.isUUID( data['pay_stub_entry_name_id'] )\n\t\t\t\t&& ( data['pay_stub_entry_name_id'] != TTUUID.zero_id\n\t\t\t\t\t|| ( data['description'] != undefined && data['description'].length > 0 )\n\t\t\t\t\t|| ( data['rate'] != undefined && data['rate'].length > 0 && parseFloat( data['rate'] ) != 0 )\n\t\t\t\t\t|| ( data['units'] != undefined && data['units'].length > 0 && parseFloat( data['units'] ) != 0 )\n\t\t\t\t\t|| ( data['amount'] != undefined && data['amount'].length > 0 && parseFloat( data['amount'] ) != 0 )\n\t\t\t\t) ) {\n\t\t\t\tresult.push( data );\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\n\t\tvar column_filter = {};\n\t\tcolumn_filter.is_owner = true;\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.user_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.start_date = true;\n\t\tcolumn_filter.end_date = true;\n\t\tcolumn_filter.pay_period_id = true;\n\n\t\t// Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tvar display_columns = [];\n\t\tif ( this.grid ) {\n\t\t\tdisplay_columns = this.grid.getGridParam( 'colModel' );\n\t\t}\n\n\t\tif ( display_columns ) {\n\t\t\tvar len = display_columns.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar column_info = display_columns[i];\n\t\t\t\tcolumn_filter[column_info.name] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\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\n\t\tthis.current_edit_record[key] = c_value;\n\t\tswitch ( key ) {\n//\t\t\tcase 'status_id':\n//\t\t\t\tif ( c_value == 40 || c_value == 100 ) {\n//\t\t\t\t\tthis.include_pay_stub_accounts = false;\n//\t\t\t\t}\n//\t\t\t\tbreak;\n\t\t\tcase 'user_id':\n\t\t\t\tif ( this.is_add ) {\n\t\t\t\t\tvar transaction_rows = $this.editor.rows_widgets_array[$this.editor.rows_widgets_array.length - 2];\n\t\t\t\t\tvar user_id = $this.edit_view_ui_dic.user_id.getValue();\n\t\t\t\t\tfor ( var t in transaction_rows ) {\n\t\t\t\t\t\tif ( Global.isArray( transaction_rows ) && transaction_rows[t].remittance_destination_account_id ) {\n\t\t\t\t\t\t\ttransaction_rows[t].remittance_destination_account_id.setDefaultArgs( { filter_data: { user_id: user_id } } );\n\t\t\t\t\t\t\ttransaction_rows[t].remittance_destination_account_id.setValue( TTUUID.zero_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'country':\n\t\t\t\tvar widget = this.edit_view_ui_dic['province'];\n\t\t\t\twidget.setValue( null );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_period_id':\n\t\t\t\tvar filter = {};\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\tfilter.filter_data.id = c_value;\n\t\t\t\tthis.pay_period_api['get' + this.pay_period_api.key_name]( filter, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t//Error: Uncaught TypeError: Cannot read property 'start_date' of undefined in interface/html5/#!m=PayStub&a=new&tab=PayStub line 1836\n\t\t\t\t\t\tif ( res.isValid() && res.getResult()[0] ) {\n\t\t\t\t\t\t\tvar result = res.getResult()[0];\n\t\t\t\t\t\t\tvar start_date = Global.strToDate( result.start_date ).format();\n\t\t\t\t\t\t\tvar end_date = Global.strToDate( result.end_date ).format();\n\t\t\t\t\t\t\tvar transaction_date = Global.strToDate( result.transaction_date ).format();\n\n\t\t\t\t\t\t\t$this.current_edit_record['start_date'] = start_date;\n\t\t\t\t\t\t\t$this.current_edit_record['end_date'] = end_date;\n\t\t\t\t\t\t\t$this.current_edit_record['transaction_date'] = transaction_date;\n\n\t\t\t\t\t\t\t$this.edit_view_ui_dic['start_date'].setValue( start_date );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic['end_date'].setValue( end_date );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic['transaction_date'].setValue( transaction_date );\n\n\t\t\t\t\t\t\tif ( !doNotValidate ) {\n\t\t\t\t\t\t\t\t$this.validate();\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\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ( !doNotValidate ) {\n\t\t\t\t\t$this.validate();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( key === 'country' || key === 'pay_period_id' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\n\t\t}\n\t}\n\n\tonSetSearchFilterFinished() {\n\n\t\tif ( this.search_panel.getSelectTabIndex() === 1 ) {\n\t\t\tvar combo = this.adv_search_field_ui_dic['country'];\n\t\t\tvar select_value = combo.getValue();\n\t\t\tthis.setProvince( select_value );\n\t\t}\n\t}\n\n\tonBuildAdvUIFinished() {\n\n\t\tthis.adv_search_field_ui_dic['country'].change( $.proxy( function() {\n\t\t\tvar combo = this.adv_search_field_ui_dic['country'];\n\t\t\tvar selectVal = combo.getValue();\n\n\t\t\tthis.setProvince( selectVal );\n\n\t\t\tthis.adv_search_field_ui_dic['province'].setValue( null );\n\n\t\t}, this ) );\n\t}\n\n\tsetProvince( val, m ) {\n\t\tvar $this = this;\n\n\t\tif ( !val || val === '-1' || val === '0' ) {\n\t\t\t$this.province_array = [];\n\t\t\tthis.adv_search_field_ui_dic['province'].setSourceData( [] );\n\t\t} else {\n\n\t\t\tthis.company_api.getOptions( 'province', val, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tres = res.getResult();\n\t\t\t\t\tif ( !res ) {\n\t\t\t\t\t\tres = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.province_array = Global.buildRecordArray( res );\n\t\t\t\t\t$this.adv_search_field_ui_dic['province'].setSourceData( $this.province_array );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\teSetProvince( val, refresh ) {\n\t\tvar $this = this;\n\t\tvar province_widget = $this.edit_view_ui_dic['province'];\n\n\t\tif ( !val || val === '-1' || val === '0' ) {\n\t\t\t$this.e_province_array = [];\n\t\t\tprovince_widget.setSourceData( [] );\n\t\t} else {\n\t\t\tthis.company_api.getOptions( 'province', val, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tres = res.getResult();\n\t\t\t\t\tif ( !res ) {\n\t\t\t\t\t\tres = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.e_province_array = Global.buildRecordArray( res );\n\t\t\t\t\tif ( refresh && $this.e_province_array.length > 0 ) {\n\t\t\t\t\t\t$this.current_edit_record.province = $this.e_province_array[0].value;\n\t\t\t\t\t\tprovince_widget.setValue( $this.current_edit_record.province );\n\t\t\t\t\t}\n\t\t\t\t\tprovince_widget.setSourceData( $this.e_province_array );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tvalidate() {\n\t\tvar $this = this;\n\n\t\tvar record = {};\n\t\tvar transaction_record = {};\n\n\t\tif ( this.is_mass_editing ) {\n\t\t\tfor ( var key in this.edit_view_ui_dic ) {\n\n\t\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar widget = this.edit_view_ui_dic[key];\n\n\t\t\t\tif ( Global.isSet( widget.isChecked ) ) {\n\t\t\t\t\tif ( widget.isChecked() && widget.getEnabled() ) {\n\t\t\t\t\t\trecord[key] = widget.getValue();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\trecord = this.current_edit_record;\n\t\t}\n\n\t\trecord = this.uniformVariable( record );\n\n\t\tif ( this.include_pay_stub_accounts ) {\n\t\t\tvar entries = $this.saveInsideEntryEditorData();\n\t\t\tvar transactions = $this.saveInsideTransactionEditorData();\n\t\t\tif ( typeof entries == 'object' ) {\n\t\t\t\trecord['entries'] = entries;\n\t\t\t}\n\t\t\tif ( typeof transactions == 'object' ) {\n\t\t\t\trecord['transactions'] = transactions;\n\t\t\t}\n\t\t}\n\n\t\tthis.api['validate' + this.api.key_name]( record, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t$this.validateResult( result );\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_pay_stub': {\n\t\t\t\t'label': $.i18n._( 'Pay Stub' ), 'is_multi_column': true,\n\t\t\t\t'html_template': this.getPayStubTabHtml()\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.APIPayStub,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_pay_stub',\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_pay_stub = this.edit_view_tab.find( '#tab_pay_stub' );\n\n\t\tvar tab_pay_stub_column1 = tab_pay_stub.find( '.first-column' );\n\t\tvar tab_pay_stub_column2 = tab_pay_stub.find( '.second-column' );\n//\t\tvar tab_pay_stub_column3 = tab_pay_stub.find( '.third-column' );\n\n\t\tvar form_item_input;\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_pay_stub_column1 );\n\n\t\t// Employee\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: false,\n\t\t\tfield: 'user_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_pay_stub_column1 );\n\n\t\t// Status\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'status_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.filtered_status_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_pay_stub_column1 );\n\n\t\t// Type\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'type_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_pay_stub_column1 );\n\n\t\t// Currency\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APICurrency,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_currency',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'currency_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Currency' ), form_item_input, tab_pay_stub_column1 );\n\n\t\t// Pay Period\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIPayPeriod,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_Pay_period',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'pay_period_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Period' ), form_item_input, tab_pay_stub_column2 );\n\n\t\t// Payroll Run\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'run_id', width: 20 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Payroll Run' ), form_item_input, tab_pay_stub_column2 );\n\n\t\t// Pay Start Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'start_date' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Start Date' ), form_item_input, tab_pay_stub_column2 );\n\n\t\t// Pay 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._( 'Pay End Date' ), form_item_input, tab_pay_stub_column2 );\n\n\t\t// Payment Date\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'transaction_date' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Payment Date' ), form_item_input, tab_pay_stub_column2, '' );\n\n\t\t//Inside pay stub entries editor\n\n\t\tvar inside_pay_stub_entry_editor_div = tab_pay_stub.find( '.inside-pay-stub-entry-editor-div' );\n\n\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\n\t\tthis.editor.InsideEditor( {\n\t\t\taddRow: this.insideEntryEditorAddRow,\n\t\t\tremoveRow: this.insideEntryEditorRemoveRow,\n\t\t\tgetValue: this.insideEntryEditorGetValue,\n\t\t\tsetValue: this.insideEntryEditorSetValue,\n\t\t\tparent_controller: this,\n\t\t\tapi: this.pay_stub_entry_api,\n\t\t\trender: getRender(),\n\t\t\trender_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`;\n\t\t}\n\n\t\tfunction getRowRender() {\n\t\t\treturn `
`;\n\t\t}\n\n\t\tthis.editor.show_cover = true;\n\t\tthis.editor.delete_transaction_ids = [];\n\t\tthis.editor.removeCover = this.removeEntryInsideEditorCover;\n\t\tthis.editor.onEditClick = this.removeEntryInsideEditorCover;\n\t\tthis.editor.onFormItemKeyUp = function( target ) {\n\t\t\tvar index = target.parent().parent().index();\n\t\t\tvar $this = this;\n\t\t\tvar widget_rate = $this.rows_widgets_array[index]['rate'];\n\t\t\tvar widget_units = $this.rows_widgets_array[index]['units'];\n\t\t\tvar widget_amount = $this.rows_widgets_array[index]['amount'];\n\n\t\t\tif ( target.getValue().length === 0 ) {\n\t\t\t\twidget_amount.setReadOnly( false );\n\t\t\t}\n\t\t\tif ( widget_rate.getValue().length > 0 || widget_units.getValue().length > 0 ) {\n\t\t\t\twidget_amount.setReadOnly( true );\n\t\t\t}\n\n\t\t\tif ( widget_rate.getValue().length > 0 && widget_units.getValue().length > 0 ) {\n\t\t\t\t//widget_amount.setValue( ( parseFloat( widget_rate.getValue() ) * parseFloat( widget_units.getValue() ) ).toFixed( 2 ) );\n\t\t\t\t//var amount_value = Global.MoneyRound( parseFloat( widget_rate.getValue() ) * parseFloat( widget_units.getValue() ) );\n\t\t\t\tvar amount_value = Global.MoneyRound( (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( parseFloat( widget_rate.getValue() ) ).mul( parseFloat( widget_units.getValue() ) ).toFixed( 4 ) );\n\t\t\t\tif ( amount_value == 'NaN' || amount_value == 0 || amount_value == '' ) {\n\t\t\t\t\tamount_value = '0.00';\n\t\t\t\t}\n\t\t\t\twidget_amount.setValue( amount_value );\n\t\t\t\tthis.onFormItemChange( widget_amount, true );\n\t\t\t} else {\n\t\t\t\twidget_amount.setValue( '0.00' );\n\t\t\t\tthis.onFormItemChange( widget_amount, true );\n\t\t\t}\n\t\t};\n\t\tthis.editor.onFormItemKeyDown = function( target ) {\n\t\t\tvar index = target.parent().parent().index();\n\t\t\tvar $this = this;\n\t\t\tvar widget = $this.rows_widgets_array[index]['amount'];\n\t\t\tvar widget_rate = $this.rows_widgets_array[index]['rate'];\n\t\t\tvar widget_units = $this.rows_widgets_array[index]['units'];\n\t\t\tif ( widget_rate.getValue().length > 0 && widget_units.getValue().length > 0 ) {\n\n\t\t\t} else {\n\t\t\t\twidget.setValue( '0.00' );\n\t\t\t\tthis.onFormItemChange( widget, true );\n\t\t\t}\n\n\t\t\twidget.setReadOnly( true );\n\t\t};\n\t\tthis.editor.onFormItemChange = function( target, doNotValidate ) {\n\t\t\tvar key = target.getField();\n\t\t\tvar c_value = parseFloat( target.getValue() ? target.getValue() : 0 ); // new value\n\t\t\tvar index = target.parent().parent().index();\n\n\t\t\tif ( key === 'amount' ) {\n\t\t\t\tvar original_ytd_amount = parseFloat( this.rows_widgets_array[index]['ytd_amount'].attr( 'original_ytd_amount' ) );\n\t\t\t\tif ( isNaN( original_ytd_amount ) ) {\n\t\t\t\t\toriginal_ytd_amount = 0.00;\n\t\t\t\t}\n\n\t\t\t\tvar original_amount = parseFloat( this.rows_widgets_array[index]['ytd_amount'].attr( 'original_amount' ) );\n\t\t\t\tif ( isNaN( original_amount ) ) {\n\t\t\t\t\toriginal_amount = 0.00;\n\t\t\t\t}\n\n\t\t\t\tvar new_ytd_amount = Global.removeTrailingZeros( (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( original_ytd_amount ).sub( original_amount ).add( c_value ).toFixed( 4 ) );\n\t\t\t\tif ( isNaN( new_ytd_amount ) ) {\n\t\t\t\t\tnew_ytd_amount = 0.00;\n\t\t\t\t}\n\n\t\t\t\tthis.rows_widgets_array[index]['ytd_amount'].setValue( new_ytd_amount != 0 ? new_ytd_amount : '-' );\n\t\t\t\tthis.rows_widgets_array[index]['ytd_amount'].attr( 'original_ytd_amount', new_ytd_amount );\n\t\t\t\tthis.rows_widgets_array[index]['ytd_amount'].attr( 'original_amount', c_value );\n\t\t\t}\n\n\t\t\tif ( doNotValidate ) {\n\n\t\t\t} else {\n\t\t\t\tthis.parent_controller.validate();\n\t\t\t}\n\n\t\t\tthis.calcTotal();\n\t\t};\n\n\t\tthis.editor.calcTotal = function() {\n\t\t\tvar total_units = 0;\n\t\t\tvar total_amount = 0;\n\t\t\tvar total_ytd_amount = 0;\n\t\t\tvar net_pay_amount = 0;\n\t\t\tvar net_pay_ytd_amount = 0;\n\t\t\tvar total_units_blank = true;\n\n\t\t\tfor ( var i = 0; i < this.rows_widgets_array.length; i++ ) {\n\t\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\t\tif ( row === true || _.isArray( row ) ) {\n\t\t\t\t\ttotal_units = 0;\n\t\t\t\t\ttotal_amount = 0;\n\t\t\t\t\ttotal_ytd_amount = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( row['total_row'] === true ) {\n\t\t\t\t\tif ( !Global.isNumeric( total_amount ) ) {\n\t\t\t\t\t\ttotal_amount = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Global.isSet( row['units'] ) ) {\n\t\t\t\t\t\tif ( total_units_blank == false ) {\n\t\t\t\t\t\t\trow['units'].setValue( Global.MoneyRound( total_units ) );\n\t\t\t\t\t\t} else if ( total_units_blank ) {\n\t\t\t\t\t\t\trow['units'].setValue( '-' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trow['amount'].setValue( Global.MoneyRound( parseFloat( total_amount ) ) );\n\t\t\t\t\trow['ytd_amount'].setValue( Global.MoneyRound( parseFloat( total_ytd_amount ) ) );\n\n\t\t\t\t\tif ( row.type_id == 10 ) { // Start with total gross value\n\t\t\t\t\t\tnet_pay_amount = total_amount;\n\t\t\t\t\t\tnet_pay_ytd_amount = total_ytd_amount;\n\t\t\t\t\t} else if ( row.type_id == 20 ) { // Subtract deductions (only)\n\t\t\t\t\t\t//net_pay_amount = net_pay_amount - total_amount;\n\t\t\t\t\t\tnet_pay_amount = (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( net_pay_amount ).sub( total_amount ).toFixed( 4 );\n\n\t\t\t\t\t\t//net_pay_ytd_amount = net_pay_ytd_amount - total_ytd_amount;\n\t\t\t\t\t\tnet_pay_ytd_amount = (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( net_pay_ytd_amount ).sub( total_ytd_amount ).toFixed( 4 );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.parent_controller.net_pay_amount = net_pay_amount;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( row['pay_stub_entry_account_id'] && row['pay_stub_entry_account_id'] == this.parent_controller.pseal_link.net_pay_entry_account_id ) {\n\t\t\t\t\trow['amount'].setValue( Global.MoneyRound( net_pay_amount ) );\n\t\t\t\t\trow['ytd_amount'].setValue( Global.MoneyRound( net_pay_ytd_amount ) );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar current_units = 0;\n\t\t\t\tif ( Global.isSet( row['units'] ) && Global.isNumeric( row['units'].getValue() ) ) {\n\t\t\t\t\tcurrent_units = Global.MoneyRound( parseFloat( row['units'].getValue() ) );\n\t\t\t\t\ttotal_units_blank = false;\n\t\t\t\t}\n\n\t\t\t\tvar current_total_amount = 0;\n\t\t\t\tif ( Global.isSet( row['amount'] ) && Global.isNumeric( row['amount'].getValue() ) ) {\n\t\t\t\t\tcurrent_total_amount = parseFloat( row['amount'].getValue() );\n\t\t\t\t\ttotal_units_blank = false;\n\t\t\t\t}\n\n\t\t\t\tvar current_ytd_total = 0;\n\t\t\t\tif ( Global.isSet( row['ytd_amount'] ) && Global.isNumeric( row['ytd_amount'].getValue() ) ) {\n\t\t\t\t\tcurrent_ytd_total = parseFloat( row['ytd_amount'].getValue() );\n\t\t\t\t}\n\n\t\t\t\tif ( total_units_blank == false ) {\n\t\t\t\t\t// total_units = parseFloat( total_units ) + parseFloat( current_units );\n\t\t\t\t\ttotal_units = (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( parseFloat( total_units ) ).add( parseFloat( current_units ) ).toFixed( 4 );\n\t\t\t\t} else {\n\t\t\t\t\ttotal_units = '';\n\t\t\t\t}\n\n\t\t\t\tif ( Global.isNumeric( current_total_amount ) ) {\n\t\t\t\t\t// total_amount = total_amount + current_total_amount;\n\t\t\t\t\ttotal_amount = (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( total_amount ).add( current_total_amount ).toFixed( 4 );\n\t\t\t\t}\n\n\t\t\t\tif ( Global.isNumeric( current_ytd_total ) ) {\n\t\t\t\t\t// total_ytd_amount = total_ytd_amount + current_ytd_total;\n\t\t\t\t\ttotal_ytd_amount = (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( total_ytd_amount ).add( current_ytd_total ).toFixed( 4 );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.calcTransactionTotals();\n\n\t\t};\n\n\t\tthis.editor.insideTransactionEditorSetValue = function( data ) {\n\t\t\t$this = this;\n\t\t\tif ( !this.parent_controller.current_edit_record ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar pay_stub_status_id = this.parent_controller['current_edit_record']['status_id'];\n\t\t\tvar is_add = false;\n\t\t\tif ( !this.parent_controller['current_edit_record']['id'] && !this.parent_controller.copied_record_id ) {\n\t\t\t\tis_add = true;\n\t\t\t}\n\t\t\tif ( !is_add && ( pay_stub_status_id == 25 ) && this.show_cover ) {\n\t\t\t\tthis.cover = Global.loadWidgetByName( WidgetNamesDic.NO_RESULT_BOX );\n\t\t\t\tthis.cover.NoResultBox( {\n\t\t\t\t\trelated_view_controller: this,\n\t\t\t\t\tmessage: $.i18n._( 'Click the Edit icon below to override pay stub amounts' ),\n\t\t\t\t\tis_edit: true\n\t\t\t\t} );\n\t\t\t}\n\t\t\tvar render = this.getRender(); //get render, should be a table\n\t\t\tvar headerRow = `\n\t\t\t`;\n\t\t\tvar args = {\n\t\t\t\tcol1: $.i18n._( 'Payment Method' ),\n\t\t\t\tcol2: $.i18n._( 'Note' ),\n\t\t\t\tcol3: $.i18n._( 'Status' ),\n\t\t\t\tcol4: $.i18n._( 'Payment Date' ),\n\t\t\t\tcol5: $.i18n._( 'Amount' )\n\t\t\t};\n\t\t\t$( render ).append( '' );\n\n\t\t\tvar template = _.template( headerRow );\n\t\t\t$( render ).append( template( args ) );\n\n\t\t\tthis.rows_widgets_array.push( true );\n\t\t\tif ( _.size( data ) > 0 ) {\n\t\t\t\tfor ( var i = 0; i < _.size( data ); i++ ) {\n\t\t\t\t\tif ( Global.isSet( data[i] ) ) {\n\t\t\t\t\t\tvar row = data[i];\n\t\t\t\t\t\tthis.insideTransactionEditorAddRow( row );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//$( render ).append( ' ' );\n\t\t\t\tthis.rows_widgets_array.push( true );\n\t\t\t\tif ( this.cover && this.cover.length > 0 ) {\n\t\t\t\t\tthis.cover.css( { width: this.width(), height: this.height() + 30 } );\n\t\t\t\t\tthis.parent().append( this.cover );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.parent_controller.getPayStubTransactionDefaultData( function( data ) {\n\t\t\t\t\t$this.insideTransactionEditorAddRow( data );\n\t\t\t\t\t//$( render ).append( ' ' );\n\t\t\t\t\t$this.rows_widgets_array.push( true );\n\t\t\t\t\tif ( $this.cover && $this.cover.length > 0 ) {\n\t\t\t\t\t\t$this.cover.css( { width: $this.width(), height: $this.height() } );\n\t\t\t\t\t\t$this.parent().append( $this.cover );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tthis.calcTransactionTotals();\n\t\t};\n\n\t\tthis.editor.insideTransactionEditorGetValue = function( parent_id ) {\n\t\t\tvar len = this.rows_widgets_array.length;\n\t\t\tvar result = [];\n\n\t\t\tif ( this.cover && this.cover.length > 0 ) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar data = {};\n\t\t\t\tif ( _.isArray( this.rows_widgets_array[i] ) ) {\n\t\t\t\t\tvar row = this.rows_widgets_array[i][0];\n\n\t\t\t\t\tif ( !Global.isSet( row['remittance_destination_account_id'] ) || !row['remittance_destination_account_id'].getValue() ) {\n\t\t\t\t\t\tcontinue; //row is not editable but is among those that are.\n\t\t\t\t\t}\n\t\t\t\t\tdata['id'] = row['form_item_record']['id'];\n\t\t\t\t\tdata['remittance_destination_account_id'] = row['remittance_destination_account_id'] ? row['remittance_destination_account_id'].getValue() : TTUUID.zero_id;\n\n\t\t\t\t\tif ( Global.isSet( row['status_id'] ) ) {\n\t\t\t\t\t\tdata['status_id'] = row['status_id'].getValue();\n\t\t\t\t\t}\n\n\t\t\t\t\tdata['transaction_date'] = row['transaction_date'] ? row['transaction_date'].getValue() : '';\n\n\t\t\t\t\tif ( Global.isSet( row['currency_id'] ) ) {\n\t\t\t\t\t\tdata['currency_id'] = row['currency_id'].getValue();\n\t\t\t\t\t}\n\n\t\t\t\t\tdata['note'] = row['note'] ? row['note'].getValue() : '';\n\n\t\t\t\t\tdata['amount'] = row['amount'] ? row['amount'].getValue() : '';\n\n\t\t\t\t\tif ( Global.isSet( row['deleted'] ) && row['deleted'] == 1 ) {\n\t\t\t\t\t\tdata['deleted'] = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata['deleted'] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tdata['pay_stub_id'] = parent_id;\n\n\t\t\t\t\tif ( row['total_row'] != true && TTUUID.isUUID( data['remittance_destination_account_id'] )\n\t\t\t\t\t\t&& ( data['remittance_destination_account_id'] != TTUUID.zero_id\n\t\t\t\t\t\t\t|| ( data['note'] != undefined && data['note'].length > 0 )\n\t\t\t\t\t\t\t|| ( data['amount'] != undefined && data['amount'].length > 0 && parseFloat( data['amount'] ) != 0 )\n\t\t\t\t\t\t) ) {\n\t\t\t\t\t\tresult.push( data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\tthis.editor.insideTransactionEditorRemoveRow = function( row ) {\n\t\t\tvar index = row[0].rowIndex - 1;\n\n\t\t\tif ( this.rows_widgets_array[index][0] ) {\n\t\t\t\tthis.rows_widgets_array[index][0]['form_item_record']['deleted'] = 1;\n\t\t\t\tvar remove_id = this.rows_widgets_array[index][0]['form_item_record']['id'];\n\t\t\t}\n\n\t\t\tif ( TTUUID.isUUID( remove_id ) ) {\n\t\t\t\tthis.delete_transaction_ids.push( remove_id );\n\t\t\t} else {\n\t\t\t\t// only remove the row if it was a new row, existing rows (in db) must only be hidden, not removed.\n\t\t\t\tthis.rows_widgets_array.splice( index, 1 );\n\t\t\t}\n\n\t\t\t// hide the row from user view, so we can still query the data during the save operation (api still needs it to know what to delete).\n\t\t\trow.hide();\n\n\t\t\t//count transaction rows.\n\t\t\tvar trows = $( '.paystub_transaction_row:visible' ).length;\n\n\t\t\tif ( trows == 0 ) {\n\t\t\t\t// if all rows removed, make sure we add a blank row in again.\n\t\t\t\tthis.insideTransactionEditorAddRow( {}, index );\n\t\t\t}\n\n\t\t\tthis.parent_controller.validate();\n\t\t\t$this.calcTransactionTotals();\n\n\t\t};\n\n\t\tthis.editor.calcTransactionTotals = function() {\n\t\t\tvar total_amount = 0;\n\n\t\t\tfor ( var i = 0; i < this.rows_widgets_array.length; i++ ) {\n\t\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\t\t//use transaction_date column existence as is transaction flag.\n\t\t\t\tif ( _.isObject( row ) //row is object\n\t\t\t\t\t&& Global.isSet( row[0] )\t//row's object is set.\n\t\t\t\t\t&& Global.isSet( row[0].remittance_destination_account_id ) //row is a pay stub transaction\n\t\t\t\t\t&& Global.isSet( row[0].form_item_record.deleted ) == false //row is not removed\n\t\t\t\t\t&& Global.isSet( row[0].status_id ) //row is not removed\n\t\t\t\t\t&& ( row[0].status_id.getValue() == 10 || row[0].status_id.getValue() == 20 ) //status is valid\n\t\t\t\t) {\n\t\t\t\t\tvar current = parseFloat( row[0].amount.getValue() );\n\t\t\t\t\tif ( isNaN( current ) ) {\n\t\t\t\t\t\tcurrent = 0;\n\t\t\t\t\t}\n\t\t\t\t\ttotal_amount += current;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttotal_amount = Global.MoneyRound( total_amount );\n\n\t\t\t//total_amount = Global.removeTrailingZeros(total_amount);\n\t\t\tvar render = this.getRender();\n\t\t\t$( '.transaction_total_rows' ).remove();\n\n\t\t\tif ( total_amount > 0 ) {\n\t\t\t\t// var difference = Global.removeTrailingZeros( parseFloat( total_amount ) - parseFloat( this.parent_controller.net_pay_amount ) );\n\t\t\t\tvar difference = Global.removeTrailingZeros( (0,decimal_js__WEBPACK_IMPORTED_MODULE_0__/* .Decimal */ .t)( parseFloat( total_amount ) ).sub( parseFloat( this.parent_controller.net_pay_amount ) ).toFixed( 4 ) );\n\n\t\t\t\tif ( isNaN( difference ) ) {\n\t\t\t\t\tdifference = 0;\n\t\t\t\t}\n\n\t\t\t\tvar color = 'green';\n\t\t\t\tif ( difference != 0 ) {\n\t\t\t\t\tcolor = 'red';\n\t\t\t\t}\n\n\t\t\t\tif ( difference != 0 ) {\n\t\t\t\t\tdifference = Global.MoneyRound( difference );\n\t\t\t\t\t$( render ).append( 'Transaction Total Difference: ' + difference + ' ' + Global.MoneyRound( total_amount ) + ' ' );\n\t\t\t\t} else {\n\t\t\t\t\t$( render ).append( 'Transaction Total ' + total_amount + ' ' );\n\t\t\t\t}\n\n\t\t\t\tthis.rows_widgets_array.push( true );\n\t\t\t}\n\t\t};\n\n\t\tthis.editor.insideTransactionEditorAddRow = function( data, index ) {\n\t\t\tvar $this = this;\n\t\t\tif ( _.size( data ) == 0 ) {\n\t\t\t\tthis.parent_controller.getPayStubTransactionDefaultData( function( data ) {\n\t\t\t\t\t$this.insideTransactionEditorAddRow( data, index );\n\t\t\t\t}, index );\n\t\t\t} else {\n\t\t\t\tvar render = $this.getRender();\n\t\t\t\tvar widgets = [];\n\t\t\t\tvar transaction = {};\n\t\t\t\ttransaction.form_item_record = {};\n\t\t\t\tvar row = $( `\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t ` );\n\t\t\t\tdata = _.isArray( data ) ? data[0] : data;\n\t\t\t\ttransaction.form_item_record.id = ( data.id && $this.parent_controller.current_edit_record.id ) ? data.id : '';\n\t\t\t\tvar pay_stub_status_id = $this.parent_controller.current_edit_record.status_id;\n\t\t\t\tvar is_add = false;\n\t\t\t\tif ( !$this.parent_controller.current_edit_record.id && !$this.parent_controller.copied_record_id ) {\n\t\t\t\t\tis_add = true;\n\t\t\t\t\tdata.status_id = 10; //10=Pending == When using Copy as New force transaction statuses to pending.\n\t\t\t\t}\n\n\t\t\t\t// Destination Account - writable\n\t\t\t\tvar allowed_statuses = [10];\n\t\t\t\tif ( $this.parent_controller.is_add == false ) {\n\t\t\t\t\tallowed_statuses.push( 20 );\n\t\t\t\t}\n\t\t\t\tvar form_item_remittance_destination_account_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\t\tform_item_remittance_destination_account_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIRemittanceDestinationAccount,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_remittance_destination_account',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tfield: 'remittance_destination_account_id',\n\t\t\t\t\tdefault_args: {\n\t\t\t\t\t\tfilter_data: {\n\t\t\t\t\t\t\tuser_id: $this.parent_controller.current_edit_record.user_id,\n\t\t\t\t\t\t\tstatus_id: allowed_statuses\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tform_item_remittance_destination_account_input.setValue( data.remittance_destination_account_id ? data.remittance_destination_account_id : '' );\n\t\t\t\tform_item_remittance_destination_account_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.parent_controller.validate();\n\t\t\t\t} );\n\n\t\t\t\t// readable\n\t\t\t\tvar form_item_remittance_destination_account_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_remittance_destination_account_text.TText( { field: 'remittance_destination_account' } );\n\t\t\t\tform_item_remittance_destination_account_text.setValue( data.remittance_destination_account ? data.remittance_destination_account : '' );\n\n\t\t\t\t// Note - writable\n\t\t\t\tvar form_item_note_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_note_input.TTextInput( { field: 'note', width: 300, display_na: false } );\n\t\t\t\tform_item_note_input.setValue( data.note );\n\t\t\t\tform_item_note_input.attr( 'editable', true );\n\t\t\t\t//readable\n\t\t\t\tvar form_item_note_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_note_text.TText( { field: 'description', display_na: false } );\n\t\t\t\tform_item_note_text.setValue( data.description );\n\n\t\t\t\t// Transaction Status - writable\n\t\t\t\tvar form_item_status_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_status_input.TComboBox( { field: 'status_id', set_empty: false } );\n\t\t\t\tform_item_status_input.setSourceData( $this.parent_controller.transaction_status_array );\n\t\t\t\tform_item_status_input.setValue( data.status_id ? data.status_id : '' );\n\t\t\t\tform_item_status_input.setEnabled( ( LocalCacheData.current_doing_context_action == 'copy_as_new' ) );\n\t\t\t\tform_item_status_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.parent_controller.validate();\n\t\t\t\t} );\n\t\t\t\t// readable\n\t\t\t\tvar form_item_status_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_status_text.TText( { field: 'status' } );\n\t\t\t\tform_item_status_text.setValue( data.status ? data.status : '' );\n\n\t\t\t\t// Transaction Date - writable\n\t\t\t\tvar form_item_transaction_date_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\t\t\tform_item_transaction_date_input.TDatePicker( { field: 'transaction_date' } );\n\t\t\t\tform_item_transaction_date_input.setValue( data.transaction_date ? data.transaction_date : '' );\n\t\t\t\tform_item_transaction_date_input.attr( 'editable', true );\n\n\t\t\t\tif ( !data['transaction_date'] ) {\n\t\t\t\t\tform_item_transaction_date_input.setValue( $this.parent_controller.edit_view_ui_dic.transaction_date.getValue() );\n\t\t\t\t}\n\n\t\t\t\tform_item_transaction_date_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.parent_controller.validate();\n\t\t\t\t} );\n\t\t\t\t// readable\n\t\t\t\tvar form_item_confirmation_number_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_confirmation_number_text.TText( { field: 'transaction_date' } );\n\t\t\t\tform_item_confirmation_number_text.setValue( data.transaction_date ? data.transaction_date : '' );\n\n\t\t\t\t// Amount - writable\n\t\t\t\tvar form_item_amount_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_amount_input.TTextInput( { field: 'amount', width: 60 } );\n\t\t\t\tform_item_amount_input.setValue( data.amount ? Global.removeTrailingZeros( data.amount ) : '' );\n\t\t\t\tform_item_amount_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.parent_controller.validate();\n\t\t\t\t\t$this.calcTransactionTotals();\n\t\t\t\t} );\n\t\t\t\tform_item_amount_input.attr( 'editable', true );\n\t\t\t\t// readable\n\t\t\t\tvar form_item_amount_text = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_amount_text.TText( { field: 'amount' } );\n\t\t\t\tform_item_amount_text.setValue( data.amount ? Global.removeTrailingZeros( data.amount ) : '' );\n\n\t\t\t\tif ( !data.status_id ) {\n\t\t\t\t\tdata.status_id = 10;\n\t\t\t\t}\n\n\t\t\t\tif ( $this.parent_controller.isEditMode() ) {\n\t\t\t\t\tform_item_remittance_destination_account_input.setEnabled( data.status_id == 10 );\n\t\t\t\t\tform_item_transaction_date_input.setEnabled( data.status_id == 10 );\n\t\t\t\t\tform_item_amount_input.setReadOnly( data.status_id != 10 );\n\t\t\t\t\tform_item_note_input.setReadOnly( data.status_id != 10 );\n\t\t\t\t\t//form_item_status_input.setValue( 10 ); //set to pending\n\t\t\t\t\tform_item_status_input.setEnabled( false );\n\t\t\t\t} else {\n\t\t\t\t\t//status is not pending. disable editing the row.\n\t\t\t\t\tform_item_remittance_destination_account_input.setEnabled( false );\n\t\t\t\t\tform_item_transaction_date_input.setEnabled( false );\n\t\t\t\t\tform_item_amount_input.setEnabled( false );\n\t\t\t\t\tform_item_note_input.setEnabled( false );\n\t\t\t\t\tform_item_status_input.setEnabled( false );\n\t\t\t\t\tform_item_input = form_item_note_text; //only way to hide the N/A is to swap in a Text Field in view mode.\n\t\t\t\t}\n\n\t\t\t\t//actually append the row to the DOM\n\t\t\t\ttransaction[form_item_remittance_destination_account_input.getField()] = form_item_remittance_destination_account_input;\n\t\t\t\trow.children().eq( 0 ).append( form_item_remittance_destination_account_input );\n\n\t\t\t\ttransaction[form_item_note_input.getField()] = form_item_note_input;\n\t\t\t\trow.children().eq( 1 ).append( form_item_note_input );\n\n\t\t\t\ttransaction[form_item_status_input.getField()] = form_item_status_input;\n\t\t\t\trow.children().eq( 2 ).append( form_item_status_input );\n\n\t\t\t\ttransaction[form_item_transaction_date_input.getField()] = form_item_transaction_date_input;\n\t\t\t\trow.children().eq( 3 ).append( form_item_transaction_date_input );\n\n\t\t\t\ttransaction[form_item_amount_input.getField()] = form_item_amount_input;\n\t\t\t\trow.children().eq( 4 ).append( form_item_amount_input );\n\n\t\t\t\twidgets.push( transaction );\n\t\t\t\tif ( typeof index !== 'undefined' ) {\n\t\t\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\t\t\t$this.rows_widgets_array.splice( ( index ), 0, widgets );\n\t\t\t\t} else {\n\t\t\t\t\t$( render ).append( row );\n\t\t\t\t\t$this.rows_widgets_array.push( widgets );\n\t\t\t\t}\n\n\t\t\t\tif ( $this.parent_controller.isEditMode() == true ) {\n\t\t\t\t\tvar minus_icon = row.find( '.minus-icon' );\n\t\t\t\t\tif ( data.status_id != 10 ) {\n\t\t\t\t\t\tminus_icon.remove();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminus_icon.click( function() {\n\t\t\t\t\t\t\t$this.insideTransactionEditorRemoveRow( row );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\tvar plus_icon = row.find( '.plus-icon' );\n\t\t\t\t\tplus_icon.click( function() {\n\t\t\t\t\t\t$this.insideTransactionEditorAddRow( {}, $( this ).parents( 'tr' ).index() );\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t//#2548 - Do not show plus button in view mode (when paystub is marked paid)\n\t\t\t\t\trow.children().last().find( '.minus-icon' ).remove();\n\t\t\t\t\t//if ( data.status_id != 20 ) {\n\t\t\t\t\trow.children().last().find( '.plus-icon' ).remove();\n\t\t\t\t\t//}\n\t\t\t\t}\n\n\t\t\t}\n\t\t};\n\t\tinside_pay_stub_entry_editor_div.append( this.editor );\n\t}\n\n\tbuildSearchFields() {\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Stub Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Stub 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\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Period' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'pay_period_id',\n\t\t\t\tlayout_name: 'global_Pay_period',\n\t\t\t\tapi_class: TTAPI.APIPayPeriod,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Payroll Run' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'run_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\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Title' ),\n\t\t\t\tfield: 'title_id',\n\t\t\t\tin_column: 1,\n\t\t\t\tlayout_name: 'global_job_title',\n\t\t\t\tapi_class: TTAPI.APIUserTitle,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Currency' ),\n\t\t\t\tfield: 'currency_id',\n\t\t\t\tin_column: 1,\n\t\t\t\tlayout_name: 'global_currency',\n\t\t\t\tapi_class: TTAPI.APICurrency,\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\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Group' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tmultiple: true,\n\t\t\t\tfield: 'group_id',\n\t\t\t\tlayout_name: 'global_tree_column',\n\t\t\t\ttree_mode: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Branch' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'default_branch_id',\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Department' ),\n\t\t\t\tfield: 'default_department_id',\n\t\t\t\tin_column: 2,\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Country' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'country',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.COMBO_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Province/State' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'province',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'City' ),\n\t\t\t\tfield: 'city',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tin_column: 2,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\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\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'timesheet':\n\t\t\tcase 'schedule':\n\t\t\tcase 'pay_stub_amendment':\n\t\t\tcase 'edit_employee':\n\t\t\tcase 'employee_pay_stubs':\n\t\t\tcase 'employer_pay_stubs':\n\t\t\tcase 'generate_pay_stub':\n\t\t\tcase 'edit_pay_period':\n\t\t\tcase 'export_excel':\n\t\t\tcase 'pay_stub_transaction':\n\t\t\tdefault:\n\t\t\t\tthis.onNavigationClick( id );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonViewClick( edit_record, noRefreshUI ) {\n\t\tthis.onNavigationClick( 'view' );\n\t}\n\n\tonReportPrintClick( key ) {\n\t\tvar $this = this;\n\n\t\tvar grid_selected_id_array;\n\n\t\tvar filter = {};\n\n\t\tvar ids = [];\n\n\t\tvar user_ids = [];\n\n\t\tvar base_date;\n\n\t\tvar pay_period_ids = [];\n\n\t\tif ( $this.edit_view && $this.current_edit_record.id ) {\n\t\t\tids.push( $this.current_edit_record.id );\n\t\t\tuser_ids.push( $this.current_edit_record.user_id );\n\t\t\tpay_period_ids.push( $this.current_edit_record.pay_period_id );\n\t\t\tbase_date = $this.current_edit_record.start_date;\n\t\t} else {\n\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t\tvar grid_selected_row = $this.getRecordFromGridById( value );\n\t\t\t\tids.push( grid_selected_row.id );\n\t\t\t\tuser_ids.push( grid_selected_row.user_id );\n\t\t\t\tpay_period_ids.push( grid_selected_row.pay_period_id );\n\t\t\t\tbase_date = grid_selected_row.start_date;\n\t\t\t} );\n\t\t}\n\n\t\tvar args = { filter_data: { id: ids } };\n\t\tvar post_data = { 0: args, 1: true, 2: key };\n\n\t\tthis.doFormIFrameCall( post_data );\n\t}\n\n\tonNavigationClick( iconName ) {\n\n\t\tvar $this = this;\n\n\t\tvar grid_selected_id_array;\n\n\t\tvar filter = {};\n\n\t\tvar ids = [];\n\n\t\tvar user_ids = [];\n\n\t\tvar base_date;\n\n\t\tvar pay_period_ids = [];\n\n\t\tif ( $this.edit_view && $this.current_edit_record.id ) {\n\t\t\tids.push( $this.current_edit_record.id );\n\t\t\tuser_ids.push( $this.current_edit_record.user_id );\n\t\t\tpay_period_ids.push( $this.current_edit_record.pay_period_id );\n\t\t\tbase_date = $this.current_edit_record.start_date;\n\t\t} else {\n\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t\tvar grid_selected_row = $this.getRecordFromGridById( value );\n\t\t\t\tids.push( grid_selected_row.id );\n\t\t\t\tuser_ids.push( grid_selected_row.user_id );\n\t\t\t\tpay_period_ids.push( grid_selected_row.pay_period_id );\n\t\t\t\tbase_date = grid_selected_row.start_date;\n\t\t\t} );\n\t\t}\n\n\t\tvar args = { filter_data: { id: ids } };\n\n\t\tvar post_data;\n\n\t\tswitch ( iconName ) {\n\t\t\tcase 'edit_employee':\n\t\t\t\tif ( user_ids.length > 0 ) {\n\t\t\t\t\tIndexViewController.openEditView( this, 'Employee', user_ids[0] );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'edit_pay_period':\n\t\t\t\tif ( pay_period_ids.length > 0 ) {\n\t\t\t\t\tIndexViewController.openEditView( this, 'PayPeriods', pay_period_ids[0] );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tif ( user_ids.length > 0 ) {\n\t\t\t\t\tfilter.user_id = user_ids[0];\n\t\t\t\t\tfilter.base_date = base_date;\n\t\t\t\t\tGlobal.addViewTab( $this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href );\n\t\t\t\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\tvar include_users = { value: user_ids };\n\t\t\t\tfilter.filter_data.include_user_ids = include_users;\n\t\t\t\tfilter.select_date = base_date;\n\t\t\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'Schedule', filter );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_amendment':\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\tfilter.filter_data.user_id = user_ids[0];\n\t\t\t\tfilter.filter_data.pay_period_id = pay_period_ids[0];\n\t\t\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'PayStubAmendment', filter );\n\t\t\t\tbreak;\n\t\t\tcase 'generate_pay_stub':\n\n\t\t\t\tif ( user_ids.length === 1 ) {\n\t\t\t\t\tfilter.user_id = user_ids[0];\n\t\t\t\t} else if ( user_ids.length > 1 ) {\n\t\t\t\t\tfilter.user_id = user_ids;\n\t\t\t\t}\n\n\t\t\t\tif ( pay_period_ids.length === 1 ) {\n\t\t\t\t\tfilter.pay_period_id = [pay_period_ids[0]];\n\t\t\t\t} else if ( pay_period_ids.length > 1 ) {\n\t\t\t\t\tfilter.pay_period_id = pay_period_ids;\n\t\t\t\t} else {\n\t\t\t\t\tfilter.pay_period_id = [];\n\t\t\t\t}\n\n\t\t\t\tIndexViewController.openWizard( 'GeneratePayStubWizard', filter, function() {\n\t\t\t\t\t$this.search();\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'view':\n\t\t\t\t//If its a payroll admin or higher, by default make the View button show employer pay stub.\n\t\t\t\tif ( ( PermissionManager.validate( 'pay_stub', 'view' ) || PermissionManager.validate( 'pay_stub', 'view_child' ) ) ) {\n\t\t\t\t\tpost_data = { 0: args, 1: false, 2: 'pdf', 3: false };\n\t\t\t\t} else {\n\t\t\t\t\tpost_data = { 0: args, 1: false, 2: 'pdf', 3: true };\n\t\t\t\t}\n\t\t\t\tthis.doFormIFrameCall( post_data );\n\t\t\t\t$().TFeedback( {\n\t\t\t\t\tsource: 'View', // viewId GovernmentDocument will be prepended in TFeedback functions.\n\t\t\t\t\tdelay: 5000\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'employee_pay_stubs':\n\t\t\t\tpost_data = { 0: args, 1: false, 2: 'pdf', 3: true };\n\t\t\t\tthis.doFormIFrameCall( post_data );\n\t\t\t\tbreak;\n\t\t\tcase 'employer_pay_stubs':\n\t\t\t\tpost_data = { 0: args, 1: false, 2: 'pdf', 3: false };\n\t\t\t\tthis.doFormIFrameCall( post_data );\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_transaction':\n\t\t\t\tfilter = {};\n\t\t\t\tfilter.filter_data = {};\n\n\t\t\t\tfilter.filter_data.user_id = { value: user_ids };\n\t\t\t\tfilter.filter_data.pay_period_id = { value: pay_period_ids };\n\n\t\t\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'PayStubTransaction', filter );\n\t\t\t\tbreak;\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onExportClick( 'export' + this.api.key_name );\n\t\t\t\tbreak;\n\t\t\tcase 'direct_deposit':\n\t\t\t\tvar data = {\n\t\t\t\t\tfilter_data: {\n\t\t\t\t\t\tpay_stub_id: this.getGridSelectIdArray()\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tIndexViewController.openWizardController( 'ProcessTransactionsWizardController', data );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonReportMenuClick( id ) {\n\t\tthis.onReportPrintClick( id );\n\t}\n\n\tdoFormIFrameCall( postData ) {\n\t\tGlobal.APIFileDownload( this.api.className, 'get' + this.api.key_name, postData );\n\t}\n\n\tgetPayStubTabHtml() {\n\t\treturn `\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\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}\n\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQzNi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQXFDOztBQUU5QjtBQUNQLDJCQUEyQjtBQUMzQixFQUFFLENBQUM7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixDQUFDO0FBQzVCLDBCQUEwQixDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsQ0FBQztBQUNILHVDQUF1QyxDQUFDO0FBQ3hDLHdDQUF3QyxDQUFDO0FBQ3pDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUssd0VBQXdFO0FBQzdFLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUsseUVBQXlFO0FBQzlFLEtBQUssc0VBQXNFO0FBQzNFOztBQUVBOztBQUVBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRSxlQUFlLHFCQUFxQjtBQUNuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtEQUFrRCxDQUFDO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWEsQ0FBQztBQUNkO0FBQ0Es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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHLENBQUM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBLGVBQWUsZUFBZTtBQUM5QixvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUcsQ0FBQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsZUFBZSxlQUFlOztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxvQ0FBb0MsQ0FBQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsQ0FBQztBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLE1BQU07QUFDTixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLElBQUksQ0FBQztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkMseUNBQXlDOztBQUV6QyxvQ0FBb0MsQ0FBQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL3BheXJvbGwvcGF5X3N0dWIvUGF5U3R1YlZpZXdDb250cm9sbGVyLmpzP2Q4NDUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjaW1hbCB9IGZyb20gJ2RlY2ltYWwuanMnO1xuXG5leHBvcnQgY2xhc3MgUGF5U3R1YlZpZXdDb250cm9sbGVyIGV4dGVuZHMgQmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHRlbDogJyNwYXlfc3R1Yl92aWV3X2NvbnRhaW5lcicsXG5cblx0XHRcdGZpbHRlcmVkX3N0YXR1c19hcnJheTogbnVsbCxcblx0XHRcdHVzZXJfc3RhdHVzX2FycmF5OiBudWxsLFxuXHRcdFx0dXNlcl9ncm91cF9hcnJheTogbnVsbCxcblx0XHRcdHVzZXJfZGVzdGluYXRpb25fYWNjb3VudF9hcnJheTogbnVsbCxcblx0XHRcdGN1cnJlbmN5X2FycmF5OiBudWxsLFxuXHRcdFx0dHlwZV9hcnJheTogbnVsbCxcblxuXHRcdFx0Y291bnRyeV9hcnJheTogbnVsbCxcblx0XHRcdHByb3ZpbmNlX2FycmF5OiBudWxsLFxuXG5cdFx0XHRlX3Byb3ZpbmNlX2FycmF5OiBudWxsLFxuXG5cdFx0XHR1c2VyX2FwaTogbnVsbCxcblx0XHRcdHVzZXJfZ3JvdXBfYXBpOiBudWxsLFxuXHRcdFx0Y29tcGFueV9hcGk6IG51bGwsXG5cblx0XHRcdHBheV9zdHViX2VudHJ5X2FwaTogbnVsbCxcblxuXHRcdFx0aW5jbHVkZV9wYXlfc3R1Yl9hY2NvdW50czogdHJ1ZSxcblx0XHRcdHRyYW5zYWN0aW9uX3N0YXR1c19hcnJheTogZmFsc2UsXG5cblx0XHRcdG5ldF9wYXlfYW1vdW50OiBmYWxzZSxcblxuXHRcdFx0cHNlYWxfbGluazogZmFsc2UsXG5cblx0XHRcdG9yaWdpbmFsX3N0YXR1c19pZDogMTBcblx0XHR9ICk7XG5cblx0XHRzdXBlciggb3B0aW9ucyApO1xuXHR9XG5cblx0aW5pdCggb3B0aW9ucyApIHtcblx0XHQvL3RoaXMuX3N1cGVyKCdpbml0aWFsaXplJywgb3B0aW9ucyApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RwbCA9ICdQYXlTdHViRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3BheV9zdHViJztcblx0XHR0aGlzLnZpZXdJZCA9ICdQYXlTdHViJztcblx0XHR0aGlzLnNjcmlwdF9uYW1lID0gJ1BheVN0dWJWaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ3BheV9zdHViJztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdQYXkgU3R1YicgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ1BheSBTdHVicycgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSVBheVN0dWI7XG5cdFx0dGhpcy51c2VyX2FwaSA9IFRUQVBJLkFQSVVzZXI7XG5cdFx0dGhpcy5wYXlfc3R1Yl9lbnRyeV9hcGkgPSBUVEFQSS5BUElQYXlTdHViRW50cnk7XG5cdFx0dGhpcy5wYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2xpbmtfYXBpID0gVFRBUEkuQVBJUGF5U3R1YkVudHJ5QWNjb3VudExpbms7XG5cdFx0dGhpcy51c2VyX2dyb3VwX2FwaSA9IFRUQVBJLkFQSVVzZXJHcm91cDtcblx0XHR0aGlzLmNvbXBhbnlfYXBpID0gVFRBUEkuQVBJQ29tcGFueTtcblx0XHR0aGlzLnBheV9wZXJpb2RfYXBpID0gVFRBUEkuQVBJUGF5UGVyaW9kO1xuXHRcdHRoaXMucGF5X3N0dWJfdHJhbnNhY3Rpb25fYXBpID0gVFRBUEkuQVBJUGF5U3R1YlRyYW5zYWN0aW9uO1xuXHRcdHRoaXMucmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2FwaSA9IFRUQVBJLkFQSVJlbWl0dGFuY2VEZXN0aW5hdGlvbkFjY291bnQ7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdCQud2hlbihcblx0XHRcdHRoaXMucHJlbG9hZFRyYW5zYWN0aW9uT3B0aW9ucyggbmV3ICQuRGVmZXJyZWQoKSApLFxuXHRcdFx0dGhpcy5wcmVsb2FkUGF5U3R1YkFjY291bnRMaW5rcyggbmV3ICQuRGVmZXJyZWQoKSApXG5cdFx0KS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdCR0aGlzLmNvbXBsZXRlSW5pdCgpO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlzRWRpdE1vZGUoKSB7XG5cdFx0aWYgKCB0aGlzLmlzX2FkZCB8fCAoIHRoaXMuaXNfZWRpdCAmJiB0aGlzLm9yaWdpbmFsX3N0YXR1c19pZCA9PSAyNSApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByZWxvYWRUcmFuc2FjdGlvbk9wdGlvbnMoIGRmZCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMucGF5X3N0dWJfdHJhbnNhY3Rpb25fYXBpLmdldE9wdGlvbnMoICdzdGF0dXMnLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHQkdGhpcy50cmFuc2FjdGlvbl9zdGF0dXNfYXJyYXkgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdGRmZC5yZXNvbHZlKCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIGRmZC5wcm9taXNlKCk7XG5cdH1cblxuXHRwcmVsb2FkUGF5U3R1YkFjY291bnRMaW5rcyggZGZkICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5wYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2xpbmtfYXBpLmdldFBheVN0dWJFbnRyeUFjY291bnRMaW5rKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0dmFyIGRhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KClbMF07XG5cdFx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0XHQkdGhpcy5wc2VhbF9saW5rID0ge1xuXHRcdFx0XHRcdFx0dG90YWxfZ3Jvc3NfZW50cnlfYWNjb3VudF9pZDogZmFsc2UsXG5cdFx0XHRcdFx0XHR0b3RhbF9kZWR1Y3Rpb25zX2VudHJ5X2FjY291bnRfaWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0bmV0X3BheV9lbnRyeV9hY2NvdW50X2lkOiBmYWxzZSxcblx0XHRcdFx0XHRcdGNvbnRyaWJ1dGlvbnNfZW50cnlfYWNjb3VudF9pZDogZmFsc2Vcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0JHRoaXMucHNlYWxfbGluay50b3RhbF9ncm9zc19lbnRyeV9hY2NvdW50X2lkID0gZGF0YS50b3RhbF9ncm9zcztcblx0XHRcdFx0XHQkdGhpcy5wc2VhbF9saW5rLnRvdGFsX2RlZHVjdGlvbnNfZW50cnlfYWNjb3VudF9pZCA9IGRhdGEudG90YWxfZW1wbG95ZWVfZGVkdWN0aW9uO1xuXHRcdFx0XHRcdCR0aGlzLnBzZWFsX2xpbmsubmV0X3BheV9lbnRyeV9hY2NvdW50X2lkID0gZGF0YS50b3RhbF9uZXRfcGF5O1xuXHRcdFx0XHRcdCR0aGlzLnBzZWFsX2xpbmsuY29udHJpYnV0aW9uc19lbnRyeV9hY2NvdW50X2lkID0gZGF0YS50b3RhbF9lbXBsb3llcl9kZWR1Y3Rpb247XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGZkLnJlc29sdmUoIHRydWUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gZGZkLnByb21pc2UoKTtcblx0fVxuXG5cdGNvbXBsZXRlSW5pdCgpIHtcblx0XHR0aGlzLmluaXRQZXJtaXNzaW9uKCk7XG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTtcblxuXHRcdHRoaXMuaW5pdERhdGEoKTtcblx0fVxuXG5cdGluaXRQZXJtaXNzaW9uKCkge1xuXG5cdFx0c3VwZXIuaW5pdFBlcm1pc3Npb24oKTtcblxuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHRoaXMucGVybWlzc2lvbl9pZCwgJ3ZpZXcnICkgfHwgUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHRoaXMucGVybWlzc2lvbl9pZCwgJ3ZpZXdfY2hpbGQnICkgKSB7XG5cdFx0XHR0aGlzLnNob3dfc2VhcmNoX3RhYiA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19zZWFyY2hfdGFiID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdGluaXRPcHRpb25zKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgb3B0aW9ucyA9IFtcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdmaWx0ZXJlZF9zdGF0dXMnLCBmaWVsZF9uYW1lOiAnc3RhdHVzX2lkJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3R5cGUnLCBmaWVsZF9uYW1lOiAndHlwZV9pZCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdzdGF0dXMnLCBmaWVsZF9uYW1lOiAndXNlcl9zdGF0dXNfaWQnLCBhcGk6IHRoaXMudXNlcl9hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdjb3VudHJ5JywgZmllbGRfbmFtZTogJ2NvdW50cnknLCBhcGk6IHRoaXMuY29tcGFueV9hcGkgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5pbml0RHJvcERvd25PcHRpb25zKCBvcHRpb25zICk7XG5cblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDw9IDEyODsgaSsrICkge1xuXHRcdFx0cmVzdWx0W2ldID0gaTtcblx0XHR9XG5cdFx0JHRoaXMuYmFzaWNfc2VhcmNoX2ZpZWxkX3VpX2RpY1sncnVuX2lkJ10uc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdCApICk7XG5cdFx0JHRoaXMuYWR2X3NlYXJjaF9maWVsZF91aV9kaWNbJ3J1bl9pZCddLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHQgKSApO1xuXHRcdHRoaXMudXNlcl9ncm91cF9hcGkuZ2V0VXNlckdyb3VwKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHQkdGhpcy51c2VyX2dyb3VwX2FycmF5ID0gcmVzO1xuXG5cdFx0XHRcdGlmICggISR0aGlzLnN1Yl92aWV3X21vZGUgJiYgJHRoaXMuYmFzaWNfc2VhcmNoX2ZpZWxkX3VpX2RpY1snZ3JvdXBfaWQnXSApIHtcblx0XHRcdFx0XHQkdGhpcy5iYXNpY19zZWFyY2hfZmllbGRfdWlfZGljWydncm91cF9pZCddLnNldFNvdXJjZURhdGEoIHJlcyApO1xuXHRcdFx0XHRcdCR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydncm91cF9pZCddLnNldFNvdXJjZURhdGEoIHJlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRncm91cHM6IHtcblx0XHRcdFx0cGF5X3N0dWJzOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUGF5IFN0dWJzJyApLFxuXHRcdFx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ1BheSBTdHVicydcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGV4Y2x1ZGU6IFtcblx0XHRcdFx0J2NvcHknLFxuXHRcdFx0XHQnc2F2ZV9hbmRfbmV3Jyxcblx0XHRcdFx0J3NhdmVfYW5kX2NvcHknLFxuXHRcdFx0XSxcblx0XHRcdGluY2x1ZGU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0p1bXAgVG8nICksXG5cdFx0XHRcdFx0aWQ6ICdqdW1wX3RvX2hlYWRlcicsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXBfaGVhZGVyOiB0cnVlLFxuXHRcdFx0XHRcdHBlcm1pc3Npb25fcmVzdWx0OiBmYWxzZSAvLyB0byBoaWRlIGl0IGluIGxlZ2FjeSBjb250ZXh0IG1lbnUgYW5kIGF2b2lkIGVycm9ycyBpbiBsZWdhY3kgcGFyc2Vycy5cblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1RpbWVTaGVldCcgKSxcblx0XHRcdFx0XHRpZDogJ3RpbWVzaGVldCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRncm91cDogJ25hdmlnYXRpb24nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdTY2hlZHVsZScgKSxcblx0XHRcdFx0XHRpZDogJ3NjaGVkdWxlJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGdyb3VwOiAnbmF2aWdhdGlvbicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1BheSBTdHViIEFtZW5kbWVudHMnICksXG5cdFx0XHRcdFx0aWQ6ICdwYXlfc3R1Yl9hbWVuZG1lbnQnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUGF5IFN0dWIgVHJhbnNhY3Rpb25zJyApLFxuXHRcdFx0XHRcdGlkOiAncGF5X3N0dWJfdHJhbnNhY3Rpb24nLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHRpdGVtczogW10sIC8vIFRPRE86IElzIHRoaXMgc3RpbGwgbmVlZGVkPyBJdCBpbnRlcmZlcmVzIHdpdGggUHJpbWVWdWUgYXMgaXQgdGhpbmtzIGl0cyBhIHN1Ym1lbnUgYnV0IHdyb25nIGZvcm1hdCwgYnV0IEkgY2FudCBzZWUgYW55d2hlcmUgdGhpcyBjb2RlIGlzIHVzZWQsIG90aGVyIHRoYW4gZm9yIFByaW50IG1lbnUuXG5cdFx0XHRcdFx0cGVybWlzc2lvbl9yZXN1bHQ6IHRydWUsXG5cdFx0XHRcdFx0cGVybWlzc2lvbjogdHJ1ZSxcblx0XHRcdFx0XHRzb3J0X29yZGVyOiBudWxsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFZGl0IEVtcGxveWVlJyApLFxuXHRcdFx0XHRcdGlkOiAnZWRpdF9lbXBsb3llZScsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRncm91cDogJ25hdmlnYXRpb24nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFZGl0IFBheSBQZXJpb2QnICksXG5cdFx0XHRcdFx0aWQ6ICdlZGl0X3BheV9wZXJpb2QnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICcnLCAvL0VtcHR5IGxhYmVsLiB2dWVfaWNvbiBpcyBkaXNwbGF5ZWQgaW5zdGVhZCBvZiB0ZXh0LlxuXHRcdFx0XHRcdGlkOiAnb3RoZXJfaGVhZGVyJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ290aGVyJyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXBfaGVhZGVyOiB0cnVlLFxuXHRcdFx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi1tb3JlX3ZlcnRfYmxhY2tfMjRkcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3OiBFbXBsb3llZSBQYXkgU3R1YnMnICksXG5cdFx0XHRcdFx0aWQ6ICdlbXBsb3llZV9wYXlfc3R1YnMnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnb3RoZXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3OiBFbXBsb3llciBQYXkgU3R1YnMnICksXG5cdFx0XHRcdFx0aWQ6ICdlbXBsb3llcl9wYXlfc3R1YnMnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnb3RoZXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdHZW5lcmF0ZSBQYXkgU3R1YicgKSxcblx0XHRcdFx0XHRpZDogJ2dlbmVyYXRlX3BheV9zdHViJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ290aGVyJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUHJvY2VzcyBUcmFuc2FjdGlvbnMnICksXG5cdFx0XHRcdFx0aWQ6ICdkaXJlY3RfZGVwb3NpdCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdvdGhlcicsXG5cdFx0XHRcdFx0aWNvbjogJ2RpcmVjdF9kZXBvc2l0LTM1eDM1LnBuZycsXG5cdFx0XHRcdFx0aXRlbXM6IFtdLFxuXHRcdFx0XHRcdHBlcm1pc3Npb25fcmVzdWx0OiB0cnVlLFxuXHRcdFx0XHRcdHBlcm1pc3Npb246IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdF1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIGNvbnRleHRfbWVudV9tb2RlbDtcblx0fVxuXG5cdHNldEN1c3RvbURlZmF1bHRNZW51SWNvbiggaWQsIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCAncHVuY2gnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgJ3NjaGVkdWxlJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BheV9zdHViX2FtZW5kbWVudCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCAncGF5X3N0dWJfYW1lbmRtZW50JyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BheV9zdHViX3RyYW5zYWN0aW9uJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsICdwYXlfc3R1Yl90cmFuc2FjdGlvbicgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUVkaXRFbXBsb3llZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgJ3VzZXInICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZWRpdF9wYXlfcGVyaW9kJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUVkaXRQYXlQZXJpb2RJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlbXBsb3llZV9wYXlfc3R1YnMnOlxuXHRcdFx0Y2FzZSAnZW1wbG95ZXJfcGF5X3N0dWJzJzpcblx0XHRcdGNhc2UgJ3ByaW50X2NoZWNrcyc6XG5cdFx0XHRjYXNlICdkaXJlY3RfZGVwb3NpdCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVSZXBvcnRSZWxhdGVkSWNvbnMoIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2dlbmVyYXRlX3BheV9zdHViJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUdlbmVyYXRlUGF5U3R1Ykljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUVkaXRQYXlQZXJpb2RJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICF0aGlzLmVkaXRQZXJtaXNzaW9uVmFsaWRhdGUoICdwYXlfcGVyaW9kX3NjaGVkdWxlJyApICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID09PSAxICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51RWRpdEVtcGxveWVlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdGlmICggIXRoaXMuZWRpdENoaWxkUGVybWlzc2lvblZhbGlkYXRlKCAndXNlcicgKSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID09PSAxICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgcElkICkge1xuXHRcdGlmICggcElkID09PSAncHVuY2gnIHx8IHBJZCA9PT0gJ3NjaGVkdWxlJyB8fCBwSWQgPT09ICdwYXlfc3R1Yl9hbWVuZG1lbnQnICkge1xuXHRcdFx0c3VwZXIuc2V0RGVmYXVsdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKTtcblx0XHR9IGVsc2UgaWYgKCBwSWQgPT09ICdwYXlfc3R1Yl90cmFuc2FjdGlvbicgKSB7XG5cdFx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncGF5X3N0dWInLCAnZW5hYmxlZCcgKVxuXHRcdFx0XHQmJiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncGF5X3N0dWInLCAndmlldycgKSB8fCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3BheV9zdHViJywgJ3ZpZXdfY2hpbGQnICkgKSApIHtcblx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoICF0aGlzLnZpZXdQZXJtaXNzaW9uVmFsaWRhdGUoIHBJZCApIHx8IHRoaXMuZWRpdF9vbmx5X21vZGUgKSB7XG5cdFx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgJiYgdGhpcy52aWV3T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCkgKSB7XG5cdFx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0c2V0Q3VzdG9tRWRpdE1lbnVJY29uKCBpZCwgY29udGV4dF9idG4gKSB7XG5cdFx0c3dpdGNoICggaWQgKSB7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCAncHVuY2gnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCAnc2NoZWR1bGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGF5X3N0dWJfYW1lbmRtZW50Jzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgJ3BheV9zdHViX2FtZW5kbWVudCcgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl90cmFuc2FjdGlvbic6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sICdwYXlfc3R1Yl90cmFuc2FjdGlvbicgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgJ3VzZXInICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZWRpdF9wYXlfcGVyaW9kJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgJ3BheV9wZXJpb2Rfc2NoZWR1bGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmlldyc6XG5cdFx0XHRjYXNlICdlbXBsb3llcl9wYXlfc3R1YnMnOlxuXHRcdFx0Y2FzZSAnZW1wbG95ZWVfcGF5X3N0dWJzJzpcblx0XHRcdGNhc2UgJ3ByaW50X2NoZWNrcyc6XG5cdFx0XHRjYXNlICdkaXJlY3RfZGVwb3NpdCc6XG5cdFx0XHRcdC8vdGhpcy5zZXRFZGl0TWVudVJlcG9ydFJlbGF0ZWRJY29ucyggY29udGV4dF9idG4gKTtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudUVkaXRJY29uKCBjb250ZXh0X2J0biApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2dlbmVyYXRlX3BheV9zdHViJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudUdlbmVyYXRlUGF5U3R1Ykljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHBheVN0dWJSZXBvcnRJY29uc1ZhbGlkYXRlKCkge1xuXHRcdGlmICggIVBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncGF5X3N0dWInLCAnZW5hYmxlZCcgKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR2YXIgc2VsZWN0ZWRfaXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtKCk7XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncGF5X3N0dWInLCAndmlldycgKSB8fCB0aGlzLm93bmVyT3JDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSggJ3BheV9zdHViJywgJ3ZpZXdfY2hpbGQnLCBzZWxlY3RlZF9pdGVtICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudVJlcG9ydFJlbGF0ZWRJY29ucyggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKSB7XG5cdFx0aWYgKCAhdGhpcy5wYXlTdHViUmVwb3J0SWNvbnNWYWxpZGF0ZSgpICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblxuXHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPiAwICYmIHRoaXMudmlld093bmVyT3JDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSgpICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51UmVwb3J0UmVsYXRlZEljb25zKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICF0aGlzLnBheVN0dWJSZXBvcnRJY29uc1ZhbGlkYXRlKCkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgJiYgdGhpcy52aWV3T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdE1lbnVHZW5lcmF0ZVBheVN0dWJJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICFQZXJtaXNzaW9uTWFuYWdlci5jaGVja1RvcExldmVsUGVybWlzc2lvbiggJ0dlbmVyYXRlUGF5U3R1YnMnICkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnVHZW5lcmF0ZVBheVN0dWJJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICFQZXJtaXNzaW9uTWFuYWdlci5jaGVja1RvcExldmVsUGVybWlzc2lvbiggJ0dlbmVyYXRlUGF5U3R1YnMnICkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXHR9XG5cblx0cmVtb3ZlRW50cnlJbnNpZGVFZGl0b3JDb3ZlcigpIHtcblx0XHRpZiAoIHRoaXMuY292ZXIgJiYgdGhpcy5jb3Zlci5sZW5ndGggPiAwICkge1xuXHRcdFx0dGhpcy5jb3Zlci5yZW1vdmUoKTtcblx0XHR9XG5cdFx0dGhpcy5jb3ZlciA9IG51bGw7XG5cdH1cblxuXHRzZXRDdXJyZW50RWRpdFJlY29yZERhdGEoKSB7XG5cdFx0dGhpcy5pbmNsdWRlX3BheV9zdHViX2FjY291bnRzID0gdHJ1ZTtcblx0XHQvL1NldCBjdXJyZW50IGVkaXQgcmVjb3JkIGRhdGEgdG8gYWxsIHdpZGdldHNcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQgKSApIHtcblx0XHRcdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0XHRcdGNhc2UgJ2NvdW50cnknOlxuXHRcdFx0XHRcdFx0dGhpcy5zZXRDb3VudHJ5VmFsdWUoIHdpZGdldCwga2V5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdGF0dXNfaWQnOlxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9PSA0MCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9PSAxMDAgKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaW5jbHVkZV9wYXlfc3R1Yl9hY2NvdW50cyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cdFx0dGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdH1cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHN1cGVyLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblxuXHRcdGlmICggdGhpcy5pc19hZGQgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMudXNlcl9pZC5zZXRFbmFibGVkKCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy51c2VyX2lkLnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHR0aGlzLmluaXRJbnNpZGVFbnRyeUVkaXRvckRhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRnZXRQYXlTdHViVHJhbnNhY3Rpb25EZWZhdWx0RGF0YSggY2FsbGJhY2ssIGluZGV4ICkge1xuXHRcdHRoaXMucGF5X3N0dWJfdHJhbnNhY3Rpb25fYXBpWydnZXQnICsgdGhpcy5wYXlfc3R1Yl90cmFuc2FjdGlvbl9hcGkua2V5X25hbWUgKyAnRGVmYXVsdERhdGEnXSgge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdHZhciBkYXRhID0gW107XG5cdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0cmVzdWx0X2RhdGEuaWQgPSBmYWxzZTtcblxuXHRcdFx0XHRkYXRhLnB1c2goIHJlc3VsdF9kYXRhICk7XG5cblx0XHRcdFx0Y2FsbGJhY2soIGRhdGEsIGluZGV4ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0Z2V0UGF5U3R1YlRyYW5zYWN0aW9uKCBjYWxsYmFjayApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBhcmdzID0ge307XG5cdFx0YXJncy5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGFyZ3MuZmlsdGVyX2RhdGEucGF5X3N0dWJfaWQgPSBUVFVVSUQuaXNVVUlEKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA6ICggVFRVVUlELmlzVVVJRCggdGhpcy5jb3BpZWRfcmVjb3JkX2lkICkgPyB0aGlzLmNvcGllZF9yZWNvcmRfaWQgOiAnJyApO1xuXHRcdHRoaXMucGF5X3N0dWJfdHJhbnNhY3Rpb25fYXBpWydnZXRQYXlTdHViVHJhbnNhY3Rpb24nXSggYXJncywgdHJ1ZSwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdGlmICggISR0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdGlmICggXy5zaXplKCByZXN1bHRfZGF0YSApID09IDAgKSB7XG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrKCByZXN1bHRfZGF0YSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGluaXRJbnNpZGVUcmFuc2FjdGlvbkVkaXRvckRhdGEoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8IFRUVVVJRC5pc1VVSUQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApID09IGZhbHNlICkgJiYgIXRoaXMuY29waWVkX3JlY29yZF9pZCApIHtcblx0XHRcdHRoaXMuZ2V0UGF5U3R1YlRyYW5zYWN0aW9uRGVmYXVsdERhdGEoIGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICR0aGlzLmlzRWRpdE1vZGUoKSA9PSB0cnVlIHx8IGRhdGEubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHQkdGhpcy5lZGl0b3IudHJhbnNhY3Rpb25fZGF0YSA9IGRhdGE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMuZWRpdG9yLnRyYW5zYWN0aW9uX2RhdGEgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL0lzc3VlICMyODkwIC0gSGF2aW5nIGEgcHJvbWlzZSByZXNvbHZlIGFmdGVyIHRoZSBBUEkgY2FsbCBmb3IgZ2V0dGluZyB0cmFuc2FjdGlvbiBkYXRhIGFuZCBzdG9yaW5nIHRoYXQgZGF0YVxuXHRcdFx0XHQvL3RvIGJlIHVzZWQgbGF0ZXIgd2hpbGUgYnVpbGRpbmcgdGhlIEhUTUwuIFRoaXMgc3RvcHMgdGhpcyBBUEkgY2FsbCBmcm9tIGJlaW5nIGRlbGF5ZWQgYW5kIGNhdXNpbmcgdW5pbnRlbmRlZCBpc3N1ZXNcblx0XHRcdFx0Ly93aXRoIGR1cGxpY2F0aW5nIHRyYW5zYWN0aW9ucywgb3ZlcmxheXMgYW5kIGRhdGEgc3luYyBpc3N1ZXMuXG5cdFx0XHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnUGF5U3R1YlZpZXdDb250cm9sbGVyJywgJ2luc2lkZUVkaXRvckRhdGFMb2FkZWQnICk7XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZ2V0UGF5U3R1YlRyYW5zYWN0aW9uKCBmdW5jdGlvbiggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAkdGhpcy5pc0VkaXRNb2RlKCkgPT0gdHJ1ZSB8fCBkYXRhLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0JHRoaXMuZWRpdG9yLnRyYW5zYWN0aW9uX2RhdGEgPSBkYXRhO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCR0aGlzLmVkaXRvci50cmFuc2FjdGlvbl9kYXRhID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9Jc3N1ZSAjMjg5MCAtIEhhdmluZyBhIHByb21pc2UgcmVzb2x2ZSBhZnRlciB0aGUgQVBJIGNhbGwgZm9yIGdldHRpbmcgdHJhbnNhY3Rpb24gZGF0YSBhbmQgc3RvcmluZyB0aGF0IGRhdGFcblx0XHRcdFx0Ly90byBiZSB1c2VkIGxhdGVyIHdoaWxlIGJ1aWxkaW5nIHRoZSBIVE1MLiBUaGlzIHN0b3BzIHRoaXMgQVBJIGNhbGwgZnJvbSBiZWluZyBkZWxheWVkIGFuZCBjYXVzaW5nIHVuaW50ZW5kZWQgaXNzdWVzXG5cdFx0XHRcdC8vd2l0aCBkdXBsaWNhdGluZyB0cmFuc2FjdGlvbnMsIG92ZXJsYXlzIGFuZCBkYXRhIHN5bmMgaXNzdWVzLlxuXHRcdFx0XHRUVFByb21pc2UucmVzb2x2ZSggJ1BheVN0dWJWaWV3Q29udHJvbGxlcicsICdpbnNpZGVFZGl0b3JEYXRhTG9hZGVkJyApO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdGluaXRJbnNpZGVFbnRyeUVkaXRvckRhdGEoKSB7XG5cdFx0VFRQcm9taXNlLmFkZCggJ1BheVN0dWJWaWV3Q29udHJvbGxlcicsICdpbnNpZGVFZGl0b3JEYXRhTG9hZGVkJyApO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRhcmdzLmZpbHRlcl9kYXRhID0ge307XG5cblx0XHRpZiAoIHRoaXMuY29waWVkX3JlY29yZF9pZCB8fCAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSApIHtcblx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEucGF5X3N0dWJfaWQgPSBUVFVVSUQuaXNVVUlEKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA6IHRoaXMuY29waWVkX3JlY29yZF9pZDtcblx0XHRcdHRoaXMucGF5X3N0dWJfZW50cnlfYXBpWydnZXQnICsgdGhpcy5wYXlfc3R1Yl9lbnRyeV9hcGkua2V5X25hbWVdKCBhcmdzLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdGlmICggISR0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFyIGRhdGEgPSAkdGhpcy5oYW5kbGVQYXlTdHViRW50cnlEYXRhKCByZXMuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRUVFByb21pc2Uud2FpdCggJ1BheVN0dWJWaWV3Q29udHJvbGxlcicsICdpbnNpZGVFZGl0b3JEYXRhTG9hZGVkJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5lZGl0b3Iuc2V0VmFsdWUoIGRhdGEgKTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGRhdGEgPSAkdGhpcy5oYW5kbGVQYXlTdHViRW50cnlEYXRhKCk7XG5cdFx0XHRUVFByb21pc2Uud2FpdCggJ1BheVN0dWJWaWV3Q29udHJvbGxlcicsICdpbnNpZGVFZGl0b3JEYXRhTG9hZGVkJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLmVkaXRvci5zZXRWYWx1ZSggZGF0YSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5pdEluc2lkZVRyYW5zYWN0aW9uRWRpdG9yRGF0YSgpO1xuXHR9XG5cblx0aGFuZGxlUGF5U3R1YkVudHJ5RGF0YSggZGF0YSApIHtcblxuXHRcdHZhciB0b3RhbF9yb3dzID0ge307XG5cdFx0dmFyIHJldHZhbCA9IHt9O1xuXHRcdGlmICggZGF0YSApIHtcblx0XHRcdGZvciAoIHZhciBuIGluIGRhdGEgKSB7XG5cdFx0XHRcdHZhciB0eXBlX2lkID0gZGF0YVtuXS50eXBlX2lkO1xuXHRcdFx0XHRpZiAoIHR5cGVfaWQgPT0gNDAgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhW25dLnBheV9zdHViX2VudHJ5X2FjY291bnRfaWQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgbmV3cm93ID0gZGF0YVtuXTtcblx0XHRcdFx0XHRcdG5ld3Jvdy50b3RhbF9yb3cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dG90YWxfcm93c1tkYXRhW25dLnBheV9zdHViX2VudHJ5X2FjY291bnRfaWRdID0gbmV3cm93W25dO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiByZXR2YWxbdHlwZV9pZF0gPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdFx0XHRyZXR2YWxbdHlwZV9pZF0gPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dmFsW3R5cGVfaWRdLnB1c2goIGRhdGFbbl0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vc2V0IGJsYW5rcyB3aGVyZSB0aGVyZSBhcmUgbm8gcmVjb3JkcyBpbiBhbnkgZ2l2ZW4gc2VjdGlvbnNcblx0XHR2YXIgdHlwZV9pZHMgPSBbMTAsIDIwLCAzMCwgNTAsIDgwXTsgLy9ubyBuZXQgcGF5IGRlZmF1bHQgcm93XG5cdFx0Zm9yICggdmFyIHQgPSAwOyB0IDwgdHlwZV9pZHMubGVuZ3RoOyB0KysgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiByZXR2YWxbdHlwZV9pZHNbdF1dID09ICd1bmRlZmluZWQnIHx8IHJldHZhbFt0eXBlX2lkc1t0XV0ubGVuZ3RoID09IDAgKSB7XG5cdFx0XHRcdHJldHZhbFt0eXBlX2lkc1t0XV0gPSBbXTtcblx0XHRcdFx0cmV0dmFsW3R5cGVfaWRzW3RdXS5wdXNoKCB7IHR5cGVfaWQ6IHR5cGVfaWRzW3RdIH0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvL0ZpbGwgdXAgdGhlIG1pc3NpbmcgdG90YWwgcm93cy5cblx0XHR2YXIgZ3Jvc3NfdG90YWwgPSB7fTtcblx0XHRpZiAoIHRvdGFsX3Jvd3NbdGhpcy5wc2VhbF9saW5rLnRvdGFsX2dyb3NzX2VudHJ5X2FjY291bnRfaWRdICkge1xuXHRcdFx0Z3Jvc3NfdG90YWwgPSB0b3RhbF9yb3dzW3RoaXMucHNlYWxfbGluay50b3RhbF9ncm9zc19lbnRyeV9hY2NvdW50X2lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Z3Jvc3NfdG90YWwgPSB7XG5cdFx0XHRcdHRvdGFsX3JvdzogdHJ1ZSxcblx0XHRcdFx0dHlwZV9pZDogNDAsXG5cdFx0XHRcdG5hbWU6ICQuaTE4bi5fKCAnVG90YWwgR3Jvc3MnICksXG5cdFx0XHRcdHBheV9zdHViX2VudHJ5X2FjY291bnRfaWQ6IHRoaXMucHNlYWxfbGluay50b3RhbF9ncm9zc19lbnRyeV9hY2NvdW50X2lkXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR2YWxbMTBdLnB1c2goIGdyb3NzX3RvdGFsICk7XG5cblx0XHR2YXIgZW1wbG95ZWVfZGVkdWN0aW9uX3RvdGFsID0ge307XG5cdFx0aWYgKCB0b3RhbF9yb3dzW3RoaXMucHNlYWxfbGluay50b3RhbF9kZWR1Y3Rpb25zX2VudHJ5X2FjY291bnRfaWRdICkge1xuXHRcdFx0ZW1wbG95ZWVfZGVkdWN0aW9uX3RvdGFsID0gdG90YWxfcm93c1t0aGlzLnBzZWFsX2xpbmsudG90YWxfZGVkdWN0aW9uc19lbnRyeV9hY2NvdW50X2lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZW1wbG95ZWVfZGVkdWN0aW9uX3RvdGFsID0ge1xuXHRcdFx0XHR0b3RhbF9yb3c6IHRydWUsXG5cdFx0XHRcdHR5cGVfaWQ6IDQwLFxuXHRcdFx0XHRuYW1lOiAkLmkxOG4uXyggJ1RvdGFsIERlZHVjdGlvbnMnICksXG5cdFx0XHRcdHBheV9zdHViX2VudHJ5X2FjY291bnRfaWQ6IHRoaXMucHNlYWxfbGluay50b3RhbF9kZWR1Y3Rpb25zX2VudHJ5X2FjY291bnRfaWRcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHZhbFsyMF0ucHVzaCggZW1wbG95ZWVfZGVkdWN0aW9uX3RvdGFsICk7XG5cblx0XHR2YXIgbmV0X3BheV90b3RhbCA9IHt9O1xuXHRcdGlmICggdG90YWxfcm93c1t0aGlzLnBzZWFsX2xpbmsubmV0X3BheV9lbnRyeV9hY2NvdW50X2lkXSApIHtcblx0XHRcdG5ldF9wYXlfdG90YWwgPSB0b3RhbF9yb3dzW3RoaXMucHNlYWxfbGluay5uZXRfcGF5X2VudHJ5X2FjY291bnRfaWRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXRfcGF5X3RvdGFsID0ge1xuXHRcdFx0XHQvL3RvdGFsX3JvdzogdHJ1ZSxcblx0XHRcdFx0dHlwZV9pZDogNDAsXG5cdFx0XHRcdG5hbWU6ICQuaTE4bi5fKCAnTmV0IFBheScgKSxcblx0XHRcdFx0cGF5X3N0dWJfZW50cnlfYWNjb3VudF9pZDogdGhpcy5wc2VhbF9saW5rLm5ldF9wYXlfZW50cnlfYWNjb3VudF9pZFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Ly9CZWNhdXNlIHdlIGRvbid0IGFkZCBlbXB0eSByb3dzIHRvIHJldHZhbFs0MF0sIGFuZCB0aGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSByb3cgaW4gbmV0IHBheSwgd2Ugd2lsbCBuZWVkIHRvIGluaXRpYWxpemUgcmV0dmFsWzQwXSBoZXJlLlxuXHRcdHJldHZhbFs0MF0gPSBuZXRfcGF5X3RvdGFsO1xuXG5cdFx0dmFyIGVtcGxveWVyX2RlZHVjdGlvbl90b3RhbCA9IHt9O1xuXHRcdGlmICggdG90YWxfcm93c1t0aGlzLnBzZWFsX2xpbmsuY29udHJpYnV0aW9uc19lbnRyeV9hY2NvdW50X2lkXSApIHtcblx0XHRcdGVtcGxveWVyX2RlZHVjdGlvbl90b3RhbCA9IHRvdGFsX3Jvd3NbdGhpcy5wc2VhbF9saW5rLmNvbnRyaWJ1dGlvbnNfZW50cnlfYWNjb3VudF9pZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVtcGxveWVyX2RlZHVjdGlvbl90b3RhbCA9IHtcblx0XHRcdFx0dG90YWxfcm93OiB0cnVlLFxuXHRcdFx0XHR0eXBlX2lkOiA0MCxcblx0XHRcdFx0bmFtZTogJC5pMThuLl8oICdFbXBsb3llciBUb3RhbCBDb250cmlidXRpb25zJyApLFxuXHRcdFx0XHRwYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2lkOiB0aGlzLnBzZWFsX2xpbmsuY29udHJpYnV0aW9uc19lbnRyeV9hY2NvdW50X2lkXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR2YWxbMzBdLnB1c2goIGVtcGxveWVyX2RlZHVjdGlvbl90b3RhbCApO1xuXG5cdFx0cmV0dXJuIHJldHZhbDtcblx0fVxuXG5cdGluc2lkZUVudHJ5RWRpdG9yU2V0VmFsdWUoIHZhbCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMucmVtb3ZlQWxsUm93cyggdHJ1ZSApO1xuXHRcdHRoaXMucmVtb3ZlQ292ZXIoKTtcblxuXHRcdGZ1bmN0aW9uIHNldEVhcm5pbmdzKCBkYXRhICkge1xuXHRcdFx0dmFyIHJlbmRlciA9ICR0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgaGVhZGVyUm93ID0gYFxuXHRcdFx0PHRyIGNsYXNzPVwidGJsSGVhZGVyXCI+XG5cdFx0XHRcdDx0ZCBhbGlnbj1cImxlZnRcIiBjb2xzcGFuPVwiMlwiPjwlPSBjb2wxICU+PC90ZD5cblx0XHRcdFx0PHRkPiA8JT0gY29sMiAlPjwvdGQ+XG5cdFx0XHRcdDx0ZD4gPCU9IGNvbDMgJT48L3RkPlxuXHRcdFx0XHQ8dGQ+IDwlPSBjb2w0ICU+PC90ZD5cblx0XHRcdFx0PHRkPiA8JT0gY29sNSAlPjwvdGQ+XG5cdFx0XHRcdDx0ZD4gPCU9IGNvbDYgJT48L3RkPlxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIlwiIHN0eWxlPVwid2lkdGg6NjBweFwiPjwvdGQ+XG5cdFx0XHQ8L3RyPmA7XG5cdFx0XHR2YXIgYXJncyA9IHtcblx0XHRcdFx0Y29sMTogJC5pMThuLl8oICdFYXJuaW5ncycgKSxcblx0XHRcdFx0Y29sMjogJC5pMThuLl8oICdOb3RlJyApLFxuXHRcdFx0XHRjb2wzOiAkLmkxOG4uXyggJ1JhdGUnICksXG5cdFx0XHRcdGNvbDQ6ICQuaTE4bi5fKCAnSHJzL1VuaXRzJyApLFxuXHRcdFx0XHRjb2w1OiAkLmkxOG4uXyggJ0Ftb3VudCcgKSxcblx0XHRcdFx0Y29sNjogJC5pMThuLl8oICdZVEQgQW1vdW50JyApXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBfLnRlbXBsYXRlKCBoZWFkZXJSb3cgKTtcblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggdGVtcGxhdGUoIGFyZ3MgKSApO1xuXG5cdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggdHJ1ZSApO1xuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgXy5zaXplKCBkYXRhICk7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGRhdGFbaV0gKSApIHtcblx0XHRcdFx0XHR2YXIgcm93ID0gZGF0YVtpXTtcblx0XHRcdFx0XHRyb3cudHlwZV9pZCA9IDEwO1xuXHRcdFx0XHRcdCR0aGlzLmFkZFJvdyggcm93ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggJzx0cj48dGQgY29sc3Bhbj1cIjhcIj48YnI+PC90ZD48L3RyPicgKTtcblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0SGVhZGVyVGhyZWVDb2x1bW4oKSB7XG5cdFx0XHRyZXR1cm4gYFxuXHRcdFx0PHRyIGNsYXNzPVwidGJsSGVhZGVyXCI+XG5cdFx0XHRcdDx0ZCBhbGlnbj1cImxlZnRcIiBjb2xzcGFuPVwiMlwiPjwlPSBjb2wxICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIzXCI+IDwlPSBjb2wyICU+PC90ZD5cblx0XHRcdFx0PHRkPiA8JT0gY29sMyAlPjwvdGQ+XG5cdFx0XHRcdDx0ZD4gPCU9IGNvbDQgJT48L3RkPlxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIlwiIHN0eWxlPVwid2lkdGg6IDMwcHhcIj48L3RkPlxuXHRcdFx0PC90cj5gO1xuXHRcdH1cblx0XHRmdW5jdGlvbiBzZXREZWR1Y3Rpb25zKCBkYXRhICkge1xuXHRcdFx0dmFyIHJlbmRlciA9ICR0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgaGVhZGVyUm93ID0gZ2V0SGVhZGVyVGhyZWVDb2x1bW4oKTtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRjb2wxOiAkLmkxOG4uXyggJ0RlZHVjdGlvbnMnICksXG5cdFx0XHRcdGNvbDI6ICQuaTE4bi5fKCAnTm90ZScgKSxcblx0XHRcdFx0Y29sMzogJC5pMThuLl8oICdBbW91bnQnICksXG5cdFx0XHRcdGNvbDQ6ICQuaTE4bi5fKCAnWVREIEFtb3VudCcgKVxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHRlbXBsYXRlID0gXy50ZW1wbGF0ZSggaGVhZGVyUm93ICk7XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoIHRlbXBsYXRlKCBhcmdzICkgKTtcblxuXHRcdFx0JHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHRydWUgKTtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF8uc2l6ZSggZGF0YSApOyBpKysgKSB7XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBkYXRhW2ldICkgKSB7XG5cdFx0XHRcdFx0dmFyIHJvdyA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cm93LnR5cGVfaWQgPSAyMDtcblx0XHRcdFx0XHQkdGhpcy5hZGRSb3coIHJvdyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggJzx0cj48dGQgY29sc3Bhbj1cIjhcIj48YnI+PC90ZD48L3RyPicgKTtcblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXROZXRQYXkoIGRhdGEgKSB7XG5cdFx0XHR2YXIgcmVuZGVyID0gJHRoaXMuZ2V0UmVuZGVyKCk7IC8vZ2V0IHJlbmRlciwgc2hvdWxkIGJlIGEgdGFibGVcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0Ly8gZGF0YS50eXBlX2lkID0gNDA7XG5cdFx0XHRcdCR0aGlzLmFkZFJvdyggZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoICc8dHI+PHRkIGNvbHNwYW49XCI4XCI+PGJyPjwvdGQ+PC90cj4nICk7XG5cdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0TWlzY2VsbGFuZW91cyggZGF0YSApIHtcblx0XHRcdHZhciByZW5kZXIgPSAkdGhpcy5nZXRSZW5kZXIoKTsgLy9nZXQgcmVuZGVyLCBzaG91bGQgYmUgYSB0YWJsZVxuXHRcdFx0dmFyIGhlYWRlclJvdyA9IGdldEhlYWRlclRocmVlQ29sdW1uKCk7XG5cdFx0XHR2YXIgYXJncyA9IHtcblx0XHRcdFx0Y29sMTogJC5pMThuLl8oICdNaXNjZWxsYW5lb3VzJyApLFxuXHRcdFx0XHRjb2wyOiAkLmkxOG4uXyggJ05vdGUnICksXG5cdFx0XHRcdGNvbDM6ICQuaTE4bi5fKCAnQW1vdW50JyApLFxuXHRcdFx0XHRjb2w0OiAkLmkxOG4uXyggJ1lURCBBbW91bnQnIClcblx0XHRcdH07XG5cblx0XHRcdHZhciB0ZW1wbGF0ZSA9IF8udGVtcGxhdGUoIGhlYWRlclJvdyApO1xuXHRcdFx0JCggcmVuZGVyICkuYXBwZW5kKCB0ZW1wbGF0ZSggYXJncyApICk7XG5cblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cdFx0XHRmb3IgKCB2YXIgaSBpbiBkYXRhICkge1xuXHRcdFx0XHQkdGhpcy5hZGRSb3coIGRhdGFbaV0gKTtcblx0XHRcdH1cblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggJzx0cj48dGQgY29sc3Bhbj1cIjhcIj48YnI+PC90ZD48L3RyPicgKTtcblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0RW1wbG95ZXJDb250cmlidXRpb25zKCBkYXRhICkge1xuXHRcdFx0dmFyIHJlbmRlciA9ICR0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgaGVhZGVyUm93ID0gZ2V0SGVhZGVyVGhyZWVDb2x1bW4oKTtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRjb2wxOiAkLmkxOG4uXyggJ0VtcGxveWVyIENvbnRyaWJ1dGlvbnMnICksXG5cdFx0XHRcdGNvbDI6ICQuaTE4bi5fKCAnTm90ZScgKSxcblx0XHRcdFx0Y29sMzogJC5pMThuLl8oICdBbW91bnQnICksXG5cdFx0XHRcdGNvbDQ6ICQuaTE4bi5fKCAnWVREIEFtb3VudCcgKVxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHRlbXBsYXRlID0gXy50ZW1wbGF0ZSggaGVhZGVyUm93ICk7XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoIHRlbXBsYXRlKCBhcmdzICkgKTtcblxuXHRcdFx0JHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHRydWUgKTtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF8uc2l6ZSggZGF0YSApOyBpKysgKSB7XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBkYXRhW2ldICkgKSB7XG5cdFx0XHRcdFx0dmFyIHJvdyA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cm93LnR5cGVfaWQgPSAzMDtcblx0XHRcdFx0XHQkdGhpcy5hZGRSb3coIHJvdyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoICc8dHI+PHRkIGNvbHNwYW49XCI4XCI+PGJyPjwvdGQ+PC90cj4nICk7XG5cdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggdHJ1ZSApO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEFjY3J1YWwoIGRhdGEgKSB7XG5cdFx0XHR2YXIgcmVuZGVyID0gJHRoaXMuZ2V0UmVuZGVyKCk7IC8vZ2V0IHJlbmRlciwgc2hvdWxkIGJlIGEgdGFibGVcblx0XHRcdHZhciBoZWFkZXJSb3cgPSBnZXRIZWFkZXJUaHJlZUNvbHVtbigpO1xuXHRcdFx0dmFyIGFyZ3MgPSB7XG5cdFx0XHRcdGNvbDE6ICQuaTE4bi5fKCAnQWNjcnVhbCcgKSxcblx0XHRcdFx0Y29sMjogJC5pMThuLl8oICdOb3RlJyApLFxuXHRcdFx0XHRjb2wzOiAkLmkxOG4uXyggJ0Ftb3VudCcgKSxcblx0XHRcdFx0Y29sNDogJC5pMThuLl8oICdCYWxhbmNlJyApXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBfLnRlbXBsYXRlKCBoZWFkZXJSb3cgKTtcblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggdGVtcGxhdGUoIGFyZ3MgKSApO1xuXG5cdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggdHJ1ZSApO1xuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgXy5zaXplKCBkYXRhICk7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGRhdGFbaV0gKSApIHtcblx0XHRcdFx0XHR2YXIgcm93ID0gZGF0YVtpXTtcblx0XHRcdFx0XHRyb3cudHlwZV9pZCA9IDUwO1xuXHRcdFx0XHRcdCR0aGlzLmFkZFJvdyggcm93ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggJzx0cj48dGQgY29sc3Bhbj1cIjhcIj48YnI+PC90ZD48L3RyPicgKTtcblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlIHx8IHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY2hlY2tGb3JOb25IZWFkZXJEYXRhKCB2YWxbMTBdICkgKSB7XG5cdFx0XHRzZXRFYXJuaW5ncyggdmFsWzEwXSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc0VkaXRNb2RlKCkgPT0gdHJ1ZSB8fCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmNoZWNrRm9yTm9uSGVhZGVyRGF0YSggdmFsWzIwXSApICkge1xuXHRcdFx0c2V0RGVkdWN0aW9ucyggdmFsWzIwXSApO1xuXHRcdH1cblxuXHRcdHNldE5ldFBheSggdmFsWzQwXSApO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlIHx8IHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY2hlY2tGb3JOb25IZWFkZXJEYXRhKCB2YWxbODBdICkgKSB7XG5cdFx0XHRzZXRNaXNjZWxsYW5lb3VzKCB2YWxbODBdICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlIHx8IHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY2hlY2tGb3JOb25IZWFkZXJEYXRhKCB2YWxbMzBdICkgKSB7XG5cdFx0XHRzZXRFbXBsb3llckNvbnRyaWJ1dGlvbnMoIHZhbFszMF0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNFZGl0TW9kZSgpID09IHRydWUgfHwgdGhpcy5wYXJlbnRfY29udHJvbGxlci5jaGVja0Zvck5vbkhlYWRlckRhdGEoIHZhbFs1MF0gKSApIHtcblx0XHRcdHNldEFjY3J1YWwoIHZhbFs1MF0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZWRpdG9yLnRyYW5zYWN0aW9uX2RhdGEgKSB7XG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLmVkaXRvci5pbnNpZGVUcmFuc2FjdGlvbkVkaXRvclNldFZhbHVlKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmVkaXRvci50cmFuc2FjdGlvbl9kYXRhICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmNvcGllZF9yZWNvcmRfaWQgJiYgVFRVVUlELmlzVVVJRCggdGhpcy5wYXJlbnRfY29udHJvbGxlci5jb3BpZWRfcmVjb3JkX2lkICkgKSB7XG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLmNvcGllZF9yZWNvcmRfaWQgPSAnJztcblx0XHR9XG5cblx0XHR0aGlzLmNhbGNUb3RhbCgpO1xuXHR9XG5cblx0Y2hlY2tGb3JOb25IZWFkZXJEYXRhKCBkYXRhICkge1xuXHRcdGZvciAoIHZhciBuIGluIGRhdGEgKSB7XG5cdFx0XHRpZiAoIFRUVVVJRC5pc1VVSUQoIGRhdGFbbl0uaWQgKSA9PSB0cnVlICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpbnNpZGVFbnRyeUVkaXRvckFkZFJvdyggZGF0YSwgaW5kZXggKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICFkYXRhICkge1xuXHRcdFx0JHRoaXMuYWRkUm93KCB7fSwgaW5kZXggKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCB0eXBlb2YgaW5kZXggIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XS55dGRfYW1vdW50ICE9ICd1bmRlZmluZWQnICYmICFkYXRhWyd0eXBlX2lkJ10gKSB7XG5cdFx0XHRcdGRhdGFbJ3R5cGVfaWQnXSA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XS55dGRfYW1vdW50LmF0dHIoICd0eXBlX2lkJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiByZW5kZXJDb2x1bW5zKCBkYXRhLCB0eXBlLCBpbmRleCApIHtcblx0XHRcdFx0dmFyIHJlbmRlciA9ICR0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHRcdHZhciB3aWRnZXRzID0ge307IC8vU2F2ZSBlYWNoIHJvdydzIHdpZGdldHNcblx0XHRcdFx0dmFyIHJvdzsgLy9HZXQgUm93IHJlbmRlclxuXHRcdFx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIHJpZ2h0X2xhYmVsO1xuXHRcdFx0XHR2YXIgYXJncyA9IHsgZmlsdGVyX2RhdGE6IHt9IH07XG5cdFx0XHRcdHZhciBwYXlfc3R1Yl9hbWVuZG1lbnRfaWQgPSAnJywgdXNlcl9leHBlbnNlX2lkID0gJyc7XG5cdFx0XHRcdHZhciBwYXlfc3R1Yl9zdGF0dXNfaWQgPSAkdGhpcy5wYXJlbnRfY29udHJvbGxlclsnY3VycmVudF9lZGl0X3JlY29yZCddWydzdGF0dXNfaWQnXTtcblxuXHRcdFx0XHR2YXIgaXNfYWRkID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKCAoICEkdGhpcy5wYXJlbnRfY29udHJvbGxlclsnY3VycmVudF9lZGl0X3JlY29yZCddWydpZCddICYmICEkdGhpcy5wYXJlbnRfY29udHJvbGxlci5jb3BpZWRfcmVjb3JkX2lkICkgfHwgKCAhZGF0YS5pZCApICkge1xuXHRcdFx0XHRcdGlzX2FkZCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHBheV9zdHViX3N0YXR1c19pZCA9PSA0MCB8fCBwYXlfc3R1Yl9zdGF0dXNfaWQgPT0gMTAwICkge1xuXHRcdFx0XHRcdGlzX2FkZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBUVFVVSUQuaXNVVUlEKCBkYXRhWydwYXlfc3R1Yl9hbWVuZG1lbnRfaWQnXSApICYmIGRhdGFbJ3BheV9zdHViX2FtZW5kbWVudF9pZCddICE9IFRUVVVJRC56ZXJvX2lkICkge1xuXHRcdFx0XHRcdHBheV9zdHViX2FtZW5kbWVudF9pZCA9IGRhdGFbJ3BheV9zdHViX2FtZW5kbWVudF9pZCddO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggVFRVVUlELmlzVVVJRCggZGF0YVsndXNlcl9leHBlbnNlX2lkJ10gKSAmJiBkYXRhWyd1c2VyX2V4cGVuc2VfaWQnXSAhPSBUVFVVSUQuemVyb19pZCApIHtcblx0XHRcdFx0XHR1c2VyX2V4cGVuc2VfaWQgPSBkYXRhWyd1c2VyX2V4cGVuc2VfaWQnXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggJHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY29waWVkX3JlY29yZF9pZCApIHtcblx0XHRcdFx0XHRwYXlfc3R1Yl9hbWVuZG1lbnRfaWQgPSAnJztcblx0XHRcdFx0XHR1c2VyX2V4cGVuc2VfaWQgPSAnJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciByb3dfZW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXlfc3R1Yl9hbWVuZG1lbnRfaWQgYW5kIHVzZXJfZXhwZW5zZV9pZCBhbGwgPjAgaG93IHRvIGRpc3BsYXkgdGhlIHJpZ2h0IGxhYmVsP1xuXHRcdFx0XHRpZiAoIFRUVVVJRC5pc1VVSUQoIHBheV9zdHViX2FtZW5kbWVudF9pZCApICYmIHBheV9zdHViX2FtZW5kbWVudF9pZCAhPSBUVFVVSUQuemVyb19pZCApIHtcblx0XHRcdFx0XHRyaWdodF9sYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICgnICsgJC5pMThuLl8oICdBbWVuZG1lbnQnICkgKyAnKTwvc3Bhbj4nICk7XG5cdFx0XHRcdFx0cm93X2VuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIGlmICggVFRVVUlELmlzVVVJRCggdXNlcl9leHBlbnNlX2lkICkgJiYgdXNlcl9leHBlbnNlX2lkICE9IFRUVVVJRC56ZXJvX2lkICkge1xuXHRcdFx0XHRcdHJpZ2h0X2xhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4gKCcgKyAkLmkxOG4uXyggJ0V4cGVuc2UnICkgKyAnKTwvc3Bhbj4nICk7XG5cdFx0XHRcdFx0cm93X2VuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdHlwZSA9PSAxMCApIHtcblx0XHRcdFx0XHRyb3cgPSAkKCBgPHRyIGNsYXNzPVwidGJsRGF0YVdoaXRlXCIgYWxpZ249XCJyaWdodFwiPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBhbGlnbj1cImxlZnRcIiBjb2xzcGFuPVwiMlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJcIj48L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJcIj48L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJwbHVzLWljb25cIiBvbmNsaWNrPVwiXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJtaW51cy1pY29uIFwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+YCApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvdyA9ICQoIGA8dHIgY2xhc3M9XCJ0YmxEYXRhV2hpdGVcIiBhbGlnbj1cInJpZ2h0XCI+XG5cdFx0XHRcdFx0XHQ8dGQgYWxpZ249XCJsZWZ0XCIgY29sc3Bhbj1cIjJcIj48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCIgY29sc3Bhbj1cIjNcIj48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cImNlbGwgY29udHJvbC1pY29uXCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiPlxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwicGx1cy1pY29uXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwibWludXMtaWNvbiBcIiBvbmNsaWNrPVwiXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdDwvdHI+YCApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFBheSBTdHViIEFjY291bnRcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9uYW1lX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fbmFtZV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVBheVN0dWJFbnRyeUFjY291bnQsXG5cdFx0XHRcdFx0d2lkdGg6IDEzMixcblx0XHRcdFx0XHRpc19zdGF0aWNfd2lkdGg6IDEzMixcblx0XHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX1BheVN0dWJBY2NvdW50Jyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRcdGZpZWxkOiAncGF5X3N0dWJfZW50cnlfbmFtZV9pZCdcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fbmFtZV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5wYXlfc3R1Yl9lbnRyeV9uYW1lX2lkICk7XG5cdFx0XHRcdGZvcm1faXRlbV9uYW1lX2lucHV0LnNldEVuYWJsZWQoIHJvd19lbmFibGVkICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX25hbWVfaW5wdXQudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fbmFtZV90ZXh0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9uYW1lX3RleHQuVFRleHQoIHsgZmllbGQ6ICduYW1lJyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9uYW1lX3RleHQuc2V0VmFsdWUoIGRhdGEubmFtZSA/ICggKCBkYXRhWyd0eXBlX2lkJ10gIT0gNDAgKSA/ICcgICcgKyBkYXRhLm5hbWUgOiBkYXRhLm5hbWUgKSA6ICcnICk7XG5cblx0XHRcdFx0Ly8gTm90ZShkZXNjcmlwdGlvbilcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9ub3RlX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ub3RlX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHdpZHRoOiAzMDAsIGRpc3BsYXlfbmE6IGZhbHNlIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfaW5wdXQuc2V0VmFsdWUoIGRhdGEuZGVzY3JpcHRpb24gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfaW5wdXQuYXR0ciggJ2VkaXRhYmxlJywgdHJ1ZSApO1xuXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fbm90ZV90ZXh0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ub3RlX3RleHQuVFRleHQoIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGRpc3BsYXlfbmE6IGZhbHNlIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfdGV4dC5zZXRWYWx1ZSggZGF0YS5kZXNjcmlwdGlvbiA/IGRhdGEuZGVzY3JpcHRpb24gOiAnICcgKTtcblxuXHRcdFx0XHQvLyBSYXRlXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fcmF0ZV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fcmF0ZV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAncmF0ZScsIHdpZHRoOiA2MCwgaGFzS2V5RXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fcmF0ZV9pbnB1dC5zZXRWYWx1ZSggR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIGRhdGEucmF0ZSApICk7XG5cdFx0XHRcdGZvcm1faXRlbV9yYXRlX2lucHV0LmF0dHIoICdlZGl0YWJsZScsIHRydWUgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3JhdGVfaW5wdXQudW5iaW5kKCAnZm9ybUl0ZW1LZXlVcCcgKS5iaW5kKCAnZm9ybUl0ZW1LZXlVcCcsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUtleVVwKCB0YXJnZXQgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9yYXRlX2lucHV0LnVuYmluZCggJ2Zvcm1JdGVtS2V5RG93bicgKS5iaW5kKCAnZm9ybUl0ZW1LZXlEb3duJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtS2V5RG93biggdGFyZ2V0ICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1fcmF0ZV9pbnB1dC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dmFyIGZvcm1faXRlbV9yYXRlX3RleHQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3JhdGVfdGV4dC5UVGV4dCggeyBmaWVsZDogJ3JhdGUnIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3JhdGVfdGV4dC5zZXRWYWx1ZSggR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIGRhdGEucmF0ZSApICk7XG5cblx0XHRcdFx0Ly8gSHJzL1VuaXRzXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fdW5pdHNfaW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3VuaXRzX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd1bml0cycsIHdpZHRoOiA2MCwgaGFzS2V5RXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fdW5pdHNfaW5wdXQuc2V0VmFsdWUoIEdsb2JhbC5yZW1vdmVUcmFpbGluZ1plcm9zKCBkYXRhLnVuaXRzICkgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3VuaXRzX2lucHV0LmF0dHIoICdlZGl0YWJsZScsIHRydWUgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3VuaXRzX2lucHV0LnVuYmluZCggJ2Zvcm1JdGVtS2V5VXAnICkuYmluZCggJ2Zvcm1JdGVtS2V5VXAnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1LZXlVcCggdGFyZ2V0ICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1fdW5pdHNfaW5wdXQudW5iaW5kKCAnZm9ybUl0ZW1LZXlEb3duJyApLmJpbmQoICdmb3JtSXRlbUtleURvd24nLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1LZXlEb3duKCB0YXJnZXQgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fdW5pdHNfaW5wdXQudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fdW5pdHNfdGV4dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fdW5pdHNfdGV4dC5UVGV4dCggeyBmaWVsZDogJ3VuaXRzJyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV91bml0c190ZXh0LnNldFZhbHVlKCBHbG9iYWwucmVtb3ZlVHJhaWxpbmdaZXJvcyggZGF0YS51bml0cyApICk7XG5cblx0XHRcdFx0Ly8gQW1vdW50XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fYW1vdW50X2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2Ftb3VudCcsIHdpZHRoOiA2MCB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuc2V0VmFsdWUoIEdsb2JhbC5yZW1vdmVUcmFpbGluZ1plcm9zKCBkYXRhLmFtb3VudCApICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF9pbnB1dC51bmJpbmQoICdmb3JtSXRlbUtleVVwJyApLmJpbmQoICdmb3JtSXRlbUtleVVwJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtS2V5VXAoIHRhcmdldCApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF9pbnB1dC51bmJpbmQoICdmb3JtSXRlbUtleURvd24nICkuYmluZCggJ2Zvcm1JdGVtS2V5RG93bicsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUtleURvd24oIHRhcmdldCApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF9pbnB1dC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dmFyIGZvcm1faXRlbV9hbW91bnRfdGV4dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X3RleHQuVFRleHQoIHsgZmllbGQ6ICdhbW91bnQnIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF90ZXh0LnNldFZhbHVlKCBHbG9iYWwucmVtb3ZlVHJhaWxpbmdaZXJvcyggZGF0YS5hbW91bnQgKSApO1xuXG5cdFx0XHRcdC8vIFlURCBBbW91bnRcblx0XHRcdFx0dmFyIGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3l0ZF9hbW91bnRfdGV4dC5UVGV4dCggeyBmaWVsZDogJ3l0ZF9hbW91bnQnIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3l0ZF9hbW91bnRfdGV4dC5zZXRWYWx1ZSggR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIGRhdGEueXRkX2Ftb3VudCApICk7XG5cdFx0XHRcdGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQuYXR0cigge1xuXHRcdFx0XHRcdCdwYXlfc3R1Yl9lbnRyeV9pZCc6ICggZGF0YS5pZCAmJiAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgPyBkYXRhLmlkIDogJycsXG5cdFx0XHRcdFx0J3R5cGVfaWQnOiBkYXRhWyd0eXBlX2lkJ10sXG5cdFx0XHRcdFx0J29yaWdpbmFsX2Ftb3VudCc6IGRhdGFbJ2Ftb3VudCddID8gZGF0YVsnYW1vdW50J10gOiAnMC4wMCcsXG5cdFx0XHRcdFx0J29yaWdpbmFsX3l0ZF9hbW91bnQnOiBkYXRhWyd5dGRfYW1vdW50J10gPyBkYXRhWyd5dGRfYW1vdW50J10gOiAnMC4wMCcsXG5cdFx0XHRcdFx0J3BheV9zdHViX2VudHJ5X25hbWVfaWQnOiBkYXRhWydwYXlfc3R1Yl9lbnRyeV9uYW1lX2lkJ10gPyBkYXRhWydwYXlfc3R1Yl9lbnRyeV9uYW1lX2lkJ10gOiBudWxsXG5cdFx0XHRcdH0gKTtcblxuLy9cdFx0XHRcdGlmICggISR0aGlzLnBhcmVudF9jb250cm9sbGVyLmNvcGllZF9yZWNvcmRfaWQgKSB7XG5cdFx0XHRcdGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQuYXR0ciggJ3BheV9zdHViX2FtZW5kbWVudF9pZCcsIHBheV9zdHViX2FtZW5kbWVudF9pZCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1feXRkX2Ftb3VudF90ZXh0LmF0dHIoICd1c2VyX2V4cGVuc2VfaWQnLCB1c2VyX2V4cGVuc2VfaWQgKTtcbi8vXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBkYXRhWyd5dGRfYW1vdW50J10gKSAhPSAwICkge1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBheV9zdHViX3N0YXR1c19pZCA9PSA0MCB8fCBwYXlfc3R1Yl9zdGF0dXNfaWQgPT0gMTAwIHx8IGRhdGEudG90YWxfcm93ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQudGV4dCggJy0nICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEucmF0ZSAmJiBwYXJzZUZsb2F0KCBkYXRhLnJhdGUgKSAhPSAwICYmICEkdGhpcy5wYXJlbnRfY29udHJvbGxlci5jb3BpZWRfcmVjb3JkX2lkICkge1xuXHRcdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuc2V0UmVhZE9ubHkoIHRydWUgKTtcblx0XHRcdFx0fSBlbHNlIGlmICggcGF5X3N0dWJfc3RhdHVzX2lkID09IDQwIHx8IHBheV9zdHViX3N0YXR1c19pZCA9PSAxMDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX3JhdGVfdGV4dC50ZXh0KCAnLScgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS51bml0cyAmJiBwYXJzZUZsb2F0KCBkYXRhLnVuaXRzICkgIT0gMCAmJiAhJHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY29waWVkX3JlY29yZF9pZCApIHtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X2lucHV0LnNldFJlYWRPbmx5KCB0cnVlICk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBheV9zdHViX3N0YXR1c19pZCA9PSA0MCB8fCBwYXlfc3R1Yl9zdGF0dXNfaWQgPT0gMTAwIHx8IGRhdGEudG90YWxfcm93ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdGZvcm1faXRlbV91bml0c190ZXh0LnRleHQoICctJyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbmFtZVxuXHRcdFx0XHRpZiAoIHR5cGUgPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1fbmFtZV90ZXh0LmNzcyggJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX25hbWVfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9uYW1lX3RleHQ7XG5cdFx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX25hbWVfdGV4dCApO1xuXHRcdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHJpZ2h0X2xhYmVsICk7XG5cdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDAgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc0VkaXRNb2RlKCkgPT0gdHJ1ZSB8fCBpbmRleCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdGZvcm1faXRlbV9uYW1lX3RleHQuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fbmFtZV90ZXh0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX25hbWVfdGV4dDtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX25hbWVfdGV4dCApO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCByaWdodF9sYWJlbCApO1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFyZ3NbJ2ZpbHRlcl9kYXRhJ11bJ3R5cGVfaWQnXSA9IFt0eXBlXTtcblx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX25hbWVfaW5wdXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fbmFtZV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9uYW1lX2lucHV0O1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1fbmFtZV9pbnB1dCApO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCByaWdodF9sYWJlbCApO1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggd2lkZ2V0Q29udGFpbmVyICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdGZvcm1faXRlbV9uYW1lX3RleHQuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX25hbWVfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9uYW1lX3RleHQ7XG5cdFx0XHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1fbmFtZV90ZXh0ICk7XG5cdFx0XHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCByaWdodF9sYWJlbCApO1xuXHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDAgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE5vdGVcblx0XHRcdFx0aWYgKCAoIGRhdGFbJ3R5cGVfaWQnXSA9PSB0eXBlLnRvU3RyaW5nKCkgfHwgZGF0YVsndHlwZV9pZCddID09PSB0eXBlICkgJiYgdHlwZSAhPSA0MCAmJiAhZGF0YS50b3RhbF9yb3cgKSB7XG5cdFx0XHRcdFx0aWYgKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc0VkaXRNb2RlKCkgPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdGlmICggKCAoIFRUVVVJRC5pc1VVSUQoIHBheV9zdHViX2FtZW5kbWVudF9pZCApICYmIHBheV9zdHViX2FtZW5kbWVudF9pZCAhPSBUVFVVSUQuemVyb19pZCApIHx8ICggVFRVVUlELmlzVVVJRCggdXNlcl9leHBlbnNlX2lkICkgJiYgdXNlcl9leHBlbnNlX2lkICE9IFRUVVVJRC56ZXJvX2lkICkgKSApIHtcblx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfaW5wdXQuc2V0UmVhZE9ubHkoIHRydWUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX25vdGVfaW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fbm90ZV9pbnB1dDtcblx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAxICkuYXBwZW5kKCBmb3JtX2l0ZW1fbm90ZV9pbnB1dCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX25vdGVfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9ub3RlX3RleHQ7XG5cdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX25vdGVfdGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggaW5kZXggKSB8fCBpc19hZGQgfHwgKCBfLnNpemUoIGRhdGEgKSA9PT0gMSAmJiAoICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlICkgKSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgPT09IHRydWUgKSApIHtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fbm90ZV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9ub3RlX2lucHV0O1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX25vdGVfaW5wdXQgKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT0gMjAgfHwgdHlwZSA9PSAzMCB8fCB0eXBlID09IDUwIHx8IHR5cGUgPT0gODAgKSB7XG5cdFx0XHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9ub3RlX3RleHQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fbm90ZV90ZXh0O1xuXHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIGZvcm1faXRlbV9ub3RlX3RleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBhbW91bnRcblx0XHRcdFx0aWYgKCAoIGRhdGFbJ3R5cGVfaWQnXSA9PT0gdHlwZS50b1N0cmluZygpIHx8IGRhdGFbJ3R5cGVfaWQnXSA9PT0gdHlwZSApICYmIHR5cGUgIT0gNDAgJiYgIWRhdGEudG90YWxfcm93ICkge1xuXHRcdFx0XHRcdGlmICggJHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNFZGl0TW9kZSgpID09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggVFRVVUlELmlzVVVJRCggcGF5X3N0dWJfYW1lbmRtZW50X2lkICkgJiYgcGF5X3N0dWJfYW1lbmRtZW50X2lkICE9IFRUVVVJRC56ZXJvX2lkICkgfHwgKCBUVFVVSUQuaXNVVUlEKCB1c2VyX2V4cGVuc2VfaWQgKSAmJiB1c2VyX2V4cGVuc2VfaWQgIT0gVFRVVUlELnplcm9faWQgKSApIHtcblx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF9pbnB1dC5zZXRSZWFkT25seSggdHJ1ZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fYW1vdW50X2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2Ftb3VudF9pbnB1dDtcblx0XHRcdFx0XHRcdGlmICggdHlwZSA9PSAxMCApIHtcblx0XHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDQgKS5hcHBlbmQoIGZvcm1faXRlbV9hbW91bnRfaW5wdXQgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X2lucHV0ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2Ftb3VudF90ZXh0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2Ftb3VudF90ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKCB0eXBlID09IDEwICkge1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNCApLmFwcGVuZCggZm9ybV9pdGVtX2Ftb3VudF90ZXh0ICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMiApLmFwcGVuZCggZm9ybV9pdGVtX2Ftb3VudF90ZXh0ICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5pc1NldCggaW5kZXggKSB8fCBpc19hZGQgfHwgKCBfLnNpemUoIGRhdGEgKSA9PT0gMSAmJiAoICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlICkgKSApICYmIHR5cGUgIT0gNDAgJiYgIWRhdGEudG90YWxfcm93ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGFbJ3R5cGVfaWQnXSA9PSA0MCApIHtcblx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF90ZXh0LmNzcyggJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnICk7XG5cdFx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2Ftb3VudF90ZXh0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2Ftb3VudF90ZXh0O1xuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT0gMTAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDQgKS5hcHBlbmQoIGZvcm1faXRlbV9hbW91bnRfdGV4dCApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X3RleHQgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fYW1vdW50X2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2Ftb3VudF9pbnB1dDtcblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09IDEwICkge1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCA0ICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X2lucHV0ICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDIgKS5hcHBlbmQoIGZvcm1faXRlbV9hbW91bnRfaW5wdXQgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICggKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgfHwgZGF0YS50b3RhbF9yb3cgKSAmJiB0eXBlID09IDMwICkge1xuXHRcdFx0XHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X3RleHQuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfdGV4dC5jc3MoICdmb250LXdlaWdodCcsICdib2xkJyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fYW1vdW50X3RleHQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fYW1vdW50X3RleHQ7XG5cdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT0gMTAgKSB7XG5cdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCA0ICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X3RleHQgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X3RleHQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBZdGQgYW1vdW50XG5cdFx0XHRcdGlmICggZGF0YVsndHlwZV9pZCddID09IDQwIHx8IGRhdGEudG90YWxfcm93ICkge1xuXHRcdFx0XHRcdGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmlzU2V0KCBpbmRleCApIHx8IGlzX2FkZCB8fCBfLnNpemUoIGRhdGEgKSA9PT0gMSApICYmIHR5cGUgIT0gNDAgKSB7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX3l0ZF9hbW91bnRfdGV4dC50ZXh0KCAnLScgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV95dGRfYW1vdW50X3RleHQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1feXRkX2Ftb3VudF90ZXh0O1xuXHRcdFx0XHRpZiAoIHR5cGUgPT0gMTAgKSB7XG5cdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDUgKS5hcHBlbmQoIGZvcm1faXRlbV95dGRfYW1vdW50X3RleHQgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMyApLmFwcGVuZCggZm9ybV9pdGVtX3l0ZF9hbW91bnRfdGV4dCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0eXBlID09IDEwICkgeyAvLyAmJiAhZGF0YS50b3RhbF9yb3cgKSB7XG5cblx0XHRcdFx0XHQvLyByYXRlXG5cdFx0XHRcdFx0aWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gMTAgJiYgIWRhdGEudG90YWxfcm93ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc0VkaXRNb2RlKCkgPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAoIFRUVVVJRC5pc1VVSUQoIHBheV9zdHViX2FtZW5kbWVudF9pZCApICYmIHBheV9zdHViX2FtZW5kbWVudF9pZCAhPSBUVFVVSUQuemVyb19pZCApIHx8ICggVFRVVUlELmlzVVVJRCggdXNlcl9leHBlbnNlX2lkICkgJiYgdXNlcl9leHBlbnNlX2lkICE9IFRUVVVJRC56ZXJvX2lkICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX3JhdGVfaW5wdXQuc2V0UmVhZE9ubHkoIHRydWUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9yYXRlX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX3JhdGVfaW5wdXQ7XG5cdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fcmF0ZV9pbnB1dCApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9yYXRlX3RleHQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fcmF0ZV90ZXh0O1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMiApLmFwcGVuZCggZm9ybV9pdGVtX3JhdGVfdGV4dCApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggaW5kZXggKSB8fCBpc19hZGQgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggZGF0YVsndHlwZV9pZCddID09IDQwIHx8IGRhdGEudG90YWxfcm93ICkge1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fcmF0ZV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9yYXRlX2lucHV0O1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fcmF0ZV9pbnB1dCApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdW5pdHNcblx0XHRcdFx0XHRpZiAoIGRhdGFbJ3R5cGVfaWQnXSA9PSAxMCAmJiAhZGF0YS50b3RhbF9yb3cgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICggVFRVVUlELmlzVVVJRCggcGF5X3N0dWJfYW1lbmRtZW50X2lkICkgJiYgcGF5X3N0dWJfYW1lbmRtZW50X2lkICE9IFRUVVVJRC56ZXJvX2lkICkgfHwgKCBUVFVVSUQuaXNVVUlEKCB1c2VyX2V4cGVuc2VfaWQgKSAmJiB1c2VyX2V4cGVuc2VfaWQgIT0gVFRVVUlELnplcm9faWQgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRmb3JtX2l0ZW1fdW5pdHNfaW5wdXQuc2V0UmVhZE9ubHkoIHRydWUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV91bml0c19pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV91bml0c19pbnB1dDtcblx0XHRcdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDMgKS5hcHBlbmQoIGZvcm1faXRlbV91bml0c19pbnB1dCApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fdW5pdHNfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV91bml0c190ZXh0O1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMyApLmFwcGVuZCggZm9ybV9pdGVtX3VuaXRzX3RleHQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGluZGV4ICkgfHwgaXNfYWRkICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZGF0YVsndHlwZV9pZCddID09IDQwIHx8IGRhdGEudG90YWxfcm93ICkge1xuXHRcdFx0XHRcdFx0XHRcdGZvcm1faXRlbV91bml0c190ZXh0LmNzcyggJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fdW5pdHNfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV91bml0c190ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAzICkuYXBwZW5kKCBmb3JtX2l0ZW1fdW5pdHNfdGV4dCApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX3VuaXRzX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX3VuaXRzX2lucHV0O1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAzICkuYXBwZW5kKCBmb3JtX2l0ZW1fdW5pdHNfaW5wdXQgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Zm9ybV9pdGVtX3VuaXRzX3RleHQuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fdW5pdHNfdGV4dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV91bml0c190ZXh0O1xuXHRcdFx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMyApLmFwcGVuZCggZm9ybV9pdGVtX3VuaXRzX3RleHQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vQnVpbGQgcm93IHdpZGdldHNcblx0XHRcdFx0aWYgKCAoIFRUVVVJRC5pc1VVSUQoIHBheV9zdHViX2FtZW5kbWVudF9pZCApICYmIHBheV9zdHViX2FtZW5kbWVudF9pZCAhPSBUVFVVSUQuemVyb19pZCApIHx8ICggVFRVVUlELmlzVVVJRCggdXNlcl9leHBlbnNlX2lkICkgJiYgdXNlcl9leHBlbnNlX2lkICE9IFRUVVVJRC56ZXJvX2lkICkgKSB7XG5cdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkubGFzdCgpLmZpbmQoICcubWludXMtaWNvbiAnICkuaGlkZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhWyd0b3RhbF9yb3cnXSA9PSB0cnVlICkge1xuXHRcdFx0XHRcdHdpZGdldHNbJ3RvdGFsX3JvdyddID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdHlwZW9mIGRhdGFbJ3R5cGVfaWQnXSAhPSAndW5kZWZpbmVkJyApIHtcblx0XHRcdFx0XHR3aWRnZXRzWyd0eXBlX2lkJ10gPSBkYXRhWyd0eXBlX2lkJ107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGFbJ3BheV9zdHViX2VudHJ5X2FjY291bnRfaWQnXSA9PSAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5wc2VhbF9saW5rLm5ldF9wYXlfZW50cnlfYWNjb3VudF9pZCApIHtcblx0XHRcdFx0XHR3aWRnZXRzWydwYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2lkJ10gPSAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5wc2VhbF9saW5rLm5ldF9wYXlfZW50cnlfYWNjb3VudF9pZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdHlwZW9mIGluZGV4ICE9PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdFx0XHRyb3cuaW5zZXJ0QWZ0ZXIoICQoIHJlbmRlciApLmZpbmQoICd0cicgKS5lcSggaW5kZXggKSApO1xuXHRcdFx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5zcGxpY2UoICggaW5kZXggKyAxICksIDAsIHdpZGdldHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggcm93ICk7XG5cdFx0XHRcdFx0JHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHdpZGdldHMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggJHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNFZGl0TW9kZSgpID09IHRydWUgKSB7XG5cdFx0XHRcdFx0JHRoaXMuYWRkSWNvbnNFdmVudCggcm93ICk7IC8vQmluZCBldmVudCB0byBhZGQgYW5kIG1pbnVzIGljb25cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5sYXN0KCkuZW1wdHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS50b3RhbF9yb3cgfHwgZGF0YS50eXBlX2lkID09IDQwICkge1xuXHRcdFx0XHRcdHJvdy5maW5kKCAnLnBsdXMtaWNvbicgKS5yZW1vdmUoKTtcblx0XHRcdFx0XHRyb3cuZmluZCggJy5taW51cy1pY29uJyApLnJlbW92ZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gMTAgKSB7XG5cdFx0XHRcdHJlbmRlckNvbHVtbnMoIGRhdGEsIDEwLCBpbmRleCApO1xuXHRcdFx0fSBlbHNlIGlmICggZGF0YVsndHlwZV9pZCddID09IDIwICkge1xuXHRcdFx0XHRyZW5kZXJDb2x1bW5zKCBkYXRhLCAyMCwgaW5kZXggKTtcblx0XHRcdH0gZWxzZSBpZiAoIGRhdGFbJ3R5cGVfaWQnXSA9PSAzMCApIHtcblx0XHRcdFx0cmVuZGVyQ29sdW1ucyggZGF0YSwgMzAsIGluZGV4ICk7XG5cdFx0XHR9IGVsc2UgaWYgKCBkYXRhWyd0eXBlX2lkJ10gPT0gNDAgKSB7XG5cdFx0XHRcdHJlbmRlckNvbHVtbnMoIGRhdGEsIDQwLCBpbmRleCApO1xuXHRcdFx0fSBlbHNlIGlmICggZGF0YVsndHlwZV9pZCddID09IDUwICkge1xuXHRcdFx0XHRyZW5kZXJDb2x1bW5zKCBkYXRhLCA1MCwgaW5kZXggKTtcblx0XHRcdH0gZWxzZSBpZiAoIGRhdGFbJ3R5cGVfaWQnXSA9PSA4MCApIHtcblx0XHRcdFx0cmVuZGVyQ29sdW1ucyggZGF0YSwgODAsIGluZGV4ICk7XG5cdFx0XHR9XG5cblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFbnRyeUVkaXRvclJlbW92ZVJvdyggcm93ICkge1xuXHRcdHZhciBpbmRleCA9IHJvd1swXS5yb3dJbmRleDtcblx0XHRpZiAoIHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XS55dGRfYW1vdW50ICkge1xuXHRcdFx0dmFyIHJlbW92ZV9pZCA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XS55dGRfYW1vdW50LmF0dHIoICdwYXlfc3R1Yl9lbnRyeV9pZCcgKTtcblx0XHRcdHZhciB0eXBlX2lkID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdLnl0ZF9hbW91bnQuYXR0ciggJ3R5cGVfaWQnICk7XG5cdFx0XHRpZiAoIFRUVVVJRC5pc1VVSUQoIHJlbW92ZV9pZCApICkge1xuXHRcdFx0XHR0aGlzLmRlbGV0ZV9pZHMucHVzaCggcmVtb3ZlX2lkICk7XG5cdFx0XHR9XG5cdFx0XHRyb3cucmVtb3ZlKCk7XG5cdFx0XHRpZiAoIHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4IC0gMV0gPT09IHRydWUgJiYgKCB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleCArIDFdWyd0b3RhbF9yb3cnXSA9PT0gdHJ1ZSB8fCB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleCArIDFdID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdHRoaXMuYWRkUm93KCB7IGlkOiAnJywgdHlwZV9pZDogdHlwZV9pZCB9LCBpbmRleCAtIDEgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCArIDEsIDEgKTsgLy9SZW1vdmUgZnJvbSB0aGUgYXJyYXkgdXNlZCBpbiBjYWxjVG90YWwoKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApOyAvL1JlbW92ZSBmcm9tIHRoZSBhcnJheSB1c2VkIGluIGNhbGNUb3RhbCgpXG5cdFx0XHR9XG5cblx0XHR9XG5cdFx0dGhpcy5jYWxjVG90YWwoKTtcblx0fVxuXG5cdHNhdmVQYXlTdHViKCByZWNvcmQsIGNhbGxiYWNrRnVuY3Rpb24gKSB7XG5cdFx0Ly8gd2hlbiB0aGUgdXNlciBjcmVhdGUgYSBuZXcgcGF5IHN0dWIgcmVjb3JkIGhhdmUgdGhlbSBjYW4gc2VuZCBlbnRyaWVzIHRvIGFwaS5cblx0XHRpZiAoIHRoaXMuaW5jbHVkZV9wYXlfc3R1Yl9hY2NvdW50cyApIHtcblx0XHRcdHZhciBlbnRyaWVzID0gdGhpcy5zYXZlSW5zaWRlRW50cnlFZGl0b3JEYXRhKCk7XG5cdFx0XHR2YXIgdHJhbnNhY3Rpb25zID0gdGhpcy5zYXZlSW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JEYXRhKCk7XG5cdFx0XHRpZiAoIGVudHJpZXMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0cmVjb3JkWydlbnRyaWVzJ10gPSBlbnRyaWVzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCB0cmFuc2FjdGlvbnMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0cmVjb3JkWyd0cmFuc2FjdGlvbnMnXSA9IHRyYW5zYWN0aW9ucztcblx0XHRcdH1cblx0XHR9XG5cdFx0Y2FsbGJhY2tGdW5jdGlvbigpO1xuXHR9XG5cblx0b25TYXZlQ2xpY2soIGlnbm9yZVdhcm5pbmcgKSB7XG5cdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdHRoaXMuaW5jbHVkZV9wYXlfc3R1Yl9hY2NvdW50cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRzdXBlci5vblNhdmVDbGljayggaWdub3JlV2FybmluZyApO1xuXHR9XG5cblx0ZG9TYXZlQVBJQ2FsbCggcmVjb3JkLCBpZ25vcmVXYXJuaW5nLCBjYWxsYmFjayApIHtcblx0XHR0aGlzLnNhdmVQYXlTdHViKCByZWNvcmQsICgpID0+IHtcblx0XHRcdHN1cGVyLmRvU2F2ZUFQSUNhbGwoIHJlY29yZCwgdHJ1ZSwgY2FsbGJhY2sgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRvblNhdmVEb25lKCByZXN1bHQgKSB7XG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0gbnVsbDtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHNhdmVJbnNpZGVUcmFuc2FjdGlvbkVkaXRvckRhdGEoIGNhbGxCYWNrICkge1xuXHRcdC8vY2FsbGVkIGJ5IHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBkYXRhID0gdGhpcy5lZGl0b3IuaW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JHZXRWYWx1ZSggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA/ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgOiAnJyApO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRvci5kZWxldGVfdHJhbnNhY3Rpb25faWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmVkaXRvci5kZWxldGVfdHJhbnNhY3Rpb25faWRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCBkYXRhLmxlbmd0aDsgbisrICkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5lZGl0b3IuZGVsZXRlX3RyYW5zYWN0aW9uX2lkc1tpXSA9PSBkYXRhW25dLmlkICkge1xuXHRcdFx0XHRcdFx0ZGF0YVtuXS5kZWxldGVkID0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHRvbkNvcHlBc05ld0NsaWNrKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHJlbG9hZF9lbnRyaWVzID0gZmFsc2U7XG5cdFx0dGhpcy5zZXRDdXJyZW50RWRpdFZpZXdTdGF0ZSggJ25ldycgKTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ2NvcHlfYXNfbmV3Jztcblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5lZGl0X3ZpZXcgKSApIHtcbi8vXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDsgaSsrICkge1xuLy9cdFx0XHRcdGlmICggdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldID09PSB0cnVlICkge1xuLy9cdFx0XHRcdFx0Y29udGludWU7XG4vL1x0XHRcdFx0fVxuLy9cdFx0XHRcdHRoaXMuZWRpdG9yLnJvd3Nfd2lkZ2V0c19hcnJheVtpXS55dGRfYW1vdW50LmF0dHIoICdwYXlfc3R1Yl9lbnRyeV9pZCcsICcnICk7XG4vL1x0XHRcdFx0dGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldLnl0ZF9hbW91bnQucmVtb3ZlQXR0ciggJ3BheV9zdHViX2FtZW5kbWVudF9pZCcgKTtcbi8vXHRcdFx0XHR0aGlzLmVkaXRvci5yb3dzX3dpZGdldHNfYXJyYXlbaV0ueXRkX2Ftb3VudC5yZW1vdmVBdHRyKCAndXNlcl9leHBlbnNlX2lkJyApO1xuLy9cdFx0XHR9XG5cdFx0XHR0aGlzLmNvcGllZF9yZWNvcmRfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgPSAnJztcblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXJfaWQuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhdHVzX2lkICE9IDI1ICkge1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhdHVzX2lkID0gMjU7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5zdGF0dXNfaWQuc2V0VmFsdWUoIDI1ICk7XG4vL1x0XHRcdFx0dGhpcy5lZGl0b3Iuc2hvd19jb3ZlciA9IGZhbHNlO1xuLy9cdFx0XHRcdHRoaXMuaW5jbHVkZV9wYXlfc3R1Yl9hY2NvdW50cyA9IHRydWU7XG4vL1x0XHRcdFx0cmVsb2FkX2VudHJpZXMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5lZGl0b3Iuc2hvd19jb3ZlciA9IGZhbHNlO1xuLy9cdFx0XHR0aGlzLmVkaXRvci5yZW1vdmVDb3ZlcigpO1xuXG5cdFx0XHR2YXIgbmF2aWdhdGlvbl9kaXYgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnLm5hdmlnYXRpb24tZGl2JyApO1xuXHRcdFx0bmF2aWdhdGlvbl9kaXYuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdFx0dGhpcy5zZXRUYWJTdGF0dXMoKTtcblx0XHRcdHRoaXMuaXNfY2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0Ly8gcmVzZXQgdGhlIGVudHJpZXMgZGF0YS5cbi8vXHRcdFx0aWYgKCByZWxvYWRfZW50cmllcyApIHtcblx0XHRcdHRoaXMuZWRpdG9yLnJlbW92ZUFsbFJvd3MoIHRydWUgKTtcblx0XHRcdHRoaXMuaW5pdEluc2lkZUVudHJ5RWRpdG9yRGF0YSgpO1xuLy9cdFx0XHR9XG5cblx0XHRcdFByb2dyZXNzQmFyLmNsb3NlT3ZlcmxheSgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cdFx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9sZW5ndGggPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5Lmxlbmd0aDtcblx0XHRcdHZhciBzZWxlY3RlZElkO1xuXG5cdFx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID4gMCApIHtcblx0XHRcdFx0c2VsZWN0ZWRJZCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXlbMF07XG5cblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YS5pZCA9IFtzZWxlY3RlZElkXTtcblxuXHRcdFx0XHR0aGlzLmFwaVsnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggZmlsdGVyLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5vbkNvcHlBc05ld1Jlc3VsdCggcmVzdWx0ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCAkLmkxOG4uXyggJ05vIHNlbGVjdGVkIHJlY29yZCcgKSApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXHR9XG5cblx0aW5pdEVkaXRWaWV3KCkge1xuXHRcdHRoaXMub3JpZ2luYWxfc3RhdHVzX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXR1c19pZDtcblx0XHRzdXBlci5pbml0RWRpdFZpZXcoKTtcblx0fVxuXG5cdG9uU3ViVmlld1JlbW92ZWQoKSB7XG5cdFx0dGhpcy5zZWFyY2goKTtcblxuXHRcdGlmICggIXRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0fVxuXHR9XG5cblx0b25Db3B5QXNOZXdSZXN1bHQoIHJlc3VsdCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdGlmICggIXJlc3VsdF9kYXRhICkge1xuXHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoICQuaTE4bi5fKCAnUmVjb3JkIGRvZXMgbm90IGV4aXN0JyApICk7XG5cdFx0XHQkdGhpcy5vbkNhbmNlbENsaWNrKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JHRoaXMub3BlbkVkaXRWaWV3KCk7IC8vIFB1dCBpdCBoZXJlIGlzIHRvIGF2b2lkIGlmIHRoZSBzZWxlY3RlZCBvbmUgaXMgbm90IGV4aXN0ZWQgaW4gZGF0YSBvciBoYXZlIGRlbGV0ZWQgYnkgb3RoZXIgcHJhZ3JhbS4gaW4gdGhpcyBjYXNlLCB0aGUgZWRpdCB2aWV3IHNob3VsZCBub3QgYmUgb3BlbmQuXG5cblx0XHRyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhWzBdO1xuXHRcdHRoaXMuY29waWVkX3JlY29yZF9pZCA9IHJlc3VsdF9kYXRhLmlkO1xuXHRcdHJlc3VsdF9kYXRhLmlkID0gJyc7XG5cdFx0aWYgKCAkdGhpcy5zdWJfdmlld19tb2RlICYmICR0aGlzLnBhcmVudF9rZXkgKSB7XG5cdFx0XHRyZXN1bHRfZGF0YVskdGhpcy5wYXJlbnRfa2V5XSA9ICR0aGlzLnBhcmVudF92YWx1ZTtcblx0XHR9XG5cdFx0aWYgKCByZXN1bHRfZGF0YS5zdGF0dXNfaWQgIT0gMjUgKSB7XG5cdFx0XHRyZXN1bHRfZGF0YS5zdGF0dXNfaWQgPSAyNTsgLy8gSWYgaXRzIHN0YXR1cyBpcyBub3Qgb3BlbiB0aGVuIHNldCBpdCB0byBvcGVuIHN0YXR1cy5cblx0XHR9XG5cblx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0gcmVzdWx0X2RhdGE7XG5cdFx0JHRoaXMuZWRpdG9yLnNob3dfY292ZXIgPSBmYWxzZTtcblx0XHQkdGhpcy5pbml0RWRpdFZpZXcoKTtcblx0fVxuXG5cdG9uU2F2ZUFuZENvbnRpbnVlKCBpZ25vcmVXYXJuaW5nICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCAhR2xvYmFsLmlzU2V0KCBpZ25vcmVXYXJuaW5nICkgKSB7XG5cdFx0XHRpZ25vcmVXYXJuaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdHRoaXMuaXNfY2hhbmdlZCA9IGZhbHNlO1xuXHRcdHRoaXMuaXNfYWRkID0gZmFsc2U7XG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdzYXZlX2FuZF9jb250aW51ZSc7XG5cdFx0dmFyIHJlY29yZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZDtcblx0XHR0aGlzLm9yaWdpbmFsX3N0YXR1c19pZCA9IHJlY29yZC5zdGF0dXNfaWQ7XG5cblx0XHRyZWNvcmQgPSB0aGlzLnVuaWZvcm1WYXJpYWJsZSggcmVjb3JkICk7XG5cblx0XHR0aGlzLnNhdmVQYXlTdHViKCByZWNvcmQsIGZ1bmN0aW9uKCkge1xuXHRcdFx0JHRoaXMuYXBpWydzZXQnICsgJHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCBmYWxzZSwgaWdub3JlV2FybmluZywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHQkdGhpcy5vblNhdmVBbmRDb250aW51ZVJlc3VsdCggcmVzdWx0ICk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdG9uQ2FuY2VsQ2xpY2soKSB7XG5cdFx0VFRQcm9taXNlLnJlamVjdCggJ1BheVN0dWJWaWV3Q29udHJvbGxlcicsICdpbnNpZGVFZGl0b3JEYXRhTG9hZGVkJyApO1xuXHRcdHN1cGVyLm9uQ2FuY2VsQ2xpY2soKTtcblx0fVxuXG5cdG9wZW5FZGl0VmlldygpIHtcblx0XHRpZiAoIHRoaXMuZWRpdG9yICkge1xuXHRcdFx0dGhpcy5lZGl0b3IudHJhbnNhY3Rpb25fZGF0YSA9IGZhbHNlO1xuXHRcdH1cblx0XHRUVFByb21pc2UucmVqZWN0KCAnUGF5U3R1YlZpZXdDb250cm9sbGVyJywgJ2luc2lkZUVkaXRvckRhdGFMb2FkZWQnICk7XG5cdFx0c3VwZXIub3BlbkVkaXRWaWV3KCk7XG5cdH1cblxuXHRvbk1hc3NFZGl0Q2xpY2soKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHQkdGhpcy5pc19hZGQgPSBmYWxzZTtcblx0XHQkdGhpcy5pc192aWV3aW5nID0gZmFsc2U7XG5cdFx0JHRoaXMuaXNfbWFzc19lZGl0aW5nID0gdHJ1ZTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ21hc3NfZWRpdCc7XG5cdFx0JHRoaXMub3BlbkVkaXRWaWV3KCk7XG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2xlbmd0aCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkubGVuZ3RoO1xuXHRcdHRoaXMubWFzc19lZGl0X3JlY29yZF9pZHMgPSBbXTtcblxuXHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdCR0aGlzLm1hc3NfZWRpdF9yZWNvcmRfaWRzLnB1c2goIHZhbHVlICk7XG5cdFx0fSApO1xuXG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLmlkID0gdGhpcy5tYXNzX2VkaXRfcmVjb3JkX2lkcztcblxuXHRcdHRoaXMuYXBpWydnZXRDb21tb24nICsgdGhpcy5hcGkua2V5X25hbWUgKyAnRGF0YSddKCBmaWx0ZXIsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0aWYgKCAhcmVzdWx0X2RhdGEgKSB7XG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLmFwaVsnZ2V0T3B0aW9ucyddKCAndW5pcXVlX2NvbHVtbnMnLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy51bmlxdWVfY29sdW1ucyA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdCR0aGlzLmFwaVsnZ2V0T3B0aW9ucyddKCAnbGlua2VkX2NvbHVtbnMnLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0MSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5saW5rZWRfY29sdW1ucyA9IHJlc3VsdDEuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5zdWJfdmlld19tb2RlICYmICR0aGlzLnBhcmVudF9rZXkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRfZGF0YVskdGhpcy5wYXJlbnRfa2V5XSA9ICR0aGlzLnBhcmVudF92YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0gcmVzdWx0X2RhdGE7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0b25TYXZlQW5kQ29udGludWVSZXN1bHQoIHJlc3VsdCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0XHRcdH1cblx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0XHRcdCR0aGlzLmVkaXRvci5zaG93X2NvdmVyID0gZmFsc2U7XG5cdFx0XHQkdGhpcy5vbkVkaXRDbGljayggJHRoaXMucmVmcmVzaF9pZCwgdHJ1ZSApO1xuXG5cdFx0XHQkdGhpcy5vblNhdmVBbmRDb250aW51ZURvbmUoIHJlc3VsdCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gb25TYXZlQW5kTmV4dFJlc3VsdCggcmVzdWx0ICkge1xuXHQvLyBcdHZhciAkdGhpcyA9IHRoaXM7XG5cdC8vIFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHQvLyBcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHQvLyBcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdC8vIFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0Ly8gXHRcdH1cblx0Ly8gXHRcdCR0aGlzLmVkaXRvci5zaG93X2NvdmVyID0gdHJ1ZTtcblx0Ly8gXHRcdCR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCk7XG5cdC8vIFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7XG5cdC8vIFx0XHQkdGhpcy5vblNhdmVBbmROZXh0RG9uZSggcmVzdWx0ICk7XG5cdC8vXG5cdC8vIFx0fSBlbHNlIHtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0Ly8gXHR9XG5cdC8vIH0sXG5cblx0c2F2ZUluc2lkZUVudHJ5RWRpdG9yRGF0YSggY2FsbEJhY2sgKSB7XG5cdFx0Ly9jYWxsZWQgYnkgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGRhdGEgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCA/ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgOiAnJyApO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRvci5kZWxldGVfaWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmVkaXRvci5kZWxldGVfaWRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCBkYXRhLmxlbmd0aDsgbisrICkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5lZGl0b3IuZGVsZXRlX2lkc1tpXSA9PSBkYXRhW25dLmlkICkge1xuXHRcdFx0XHRcdFx0ZGF0YVtuXS5kZWxldGVkID0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCBjYWxsQmFjayAmJiB0eXBlb2YgY2FsbEJhY2sgPT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhO1xuXHR9XG5cblx0aW5zaWRlRW50cnlFZGl0b3JHZXRWYWx1ZSggY3VycmVudF9lZGl0X2l0ZW1faWQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRpZiAoIHRoaXMuY292ZXIgJiYgdGhpcy5jb3Zlci5sZW5ndGggPiAwICkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciByb3cgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpXTtcblx0XHRcdHZhciBkYXRhID0ge307XG5cblx0XHRcdGlmICggcm93ID09PSB0cnVlIHx8IF8uaXNBcnJheSggcm93ICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG4vL1x0XHRcdHZhciBwYXlfc3R1Yl9hbWVuZG1lbnRfaWQgPSByb3dbJ3l0ZF9hbW91bnQnXS5hdHRyKCAncGF5X3N0dWJfYW1lbmRtZW50X2lkJyApO1xuLy9cdFx0XHR2YXIgdXNlcl9leHBlbnNlX2lkID0gcm93Wyd5dGRfYW1vdW50J10uYXR0ciggJ3VzZXJfZXhwZW5zZV9pZCcgKTtcbi8vXG4vL1x0XHRcdGlmICggIHBheV9zdHViX2FtZW5kbWVudF9pZCA+IDAgfHwgdXNlcl9leHBlbnNlX2lkID4gMCAgKSB7XG4vL1x0XHRcdFx0Y29udGludWU7XG4vL1x0XHRcdH1cblxuXHRcdFx0ZGF0YVsnaWQnXSA9IHJvd1sneXRkX2Ftb3VudCddLmF0dHIoICdwYXlfc3R1Yl9lbnRyeV9pZCcgKTtcblxuXHRcdFx0aWYgKCByb3dbJ3l0ZF9hbW91bnQnXS5hdHRyKCAndHlwZV9pZCcgKSApIHtcblx0XHRcdFx0ZGF0YVsndHlwZSddID0gcm93Wyd5dGRfYW1vdW50J10uYXR0ciggJ3R5cGVfaWQnICk7XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbJ3JhdGUnXSA9IHJvd1sncmF0ZSddID8gcm93WydyYXRlJ10uZ2V0VmFsdWUoKSA6ICcnO1xuXHRcdFx0ZGF0YVsndW5pdHMnXSA9IHJvd1sndW5pdHMnXSA/IHJvd1sndW5pdHMnXS5nZXRWYWx1ZSgpIDogJyc7XG5cdFx0XHRkYXRhWydhbW91bnQnXSA9IHJvd1snYW1vdW50J10gPyByb3dbJ2Ftb3VudCddLmdldFZhbHVlKCkgOiAnJztcblxuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHJvd1sneXRkX2Ftb3VudCddICkgKSB7XG5cdFx0XHRcdGRhdGFbJ3l0ZF9hbW91bnQnXSA9IHJvd1sneXRkX2Ftb3VudCddLmdldFZhbHVlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbJ2Rlc2NyaXB0aW9uJ10gPSByb3dbJ2Rlc2NyaXB0aW9uJ10gPyByb3dbJ2Rlc2NyaXB0aW9uJ10uZ2V0VmFsdWUoKSA6ICcnO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggcm93WydwYXlfc3R1Yl9lbnRyeV9uYW1lX2lkJ10gKSApIHtcblx0XHRcdFx0ZGF0YVsncGF5X3N0dWJfZW50cnlfbmFtZV9pZCddID0gcm93WydwYXlfc3R1Yl9lbnRyeV9uYW1lX2lkJ10uZ2V0VmFsdWUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFbJ3BheV9zdHViX2VudHJ5X25hbWVfaWQnXSA9IHJvd1sneXRkX2Ftb3VudCddLmF0dHIoICdwYXlfc3R1Yl9lbnRyeV9uYW1lX2lkJyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZXR1cm4gYmFjayB0byB0aGUgc2VydmVyIHdpdGggdGhlIHNhbWUgZGF0YSBnZXQgZnJvbSBBUEkuXG5cdFx0XHRkYXRhWydwYXlfc3R1Yl9hbWVuZG1lbnRfaWQnXSA9IHJvd1sneXRkX2Ftb3VudCddLmF0dHIoICdwYXlfc3R1Yl9hbWVuZG1lbnRfaWQnICk7XG5cdFx0XHRkYXRhWyd1c2VyX2V4cGVuc2VfaWQnXSA9IHJvd1sneXRkX2Ftb3VudCddLmF0dHIoICd1c2VyX2V4cGVuc2VfaWQnICk7XG5cblx0XHRcdGRhdGFbJ3BheV9zdHViX2lkJ10gPSBjdXJyZW50X2VkaXRfaXRlbV9pZDtcblx0XHRcdGlmICggcm93Wyd0b3RhbF9yb3cnXSAhPSB0cnVlICYmIFRUVVVJRC5pc1VVSUQoIGRhdGFbJ3BheV9zdHViX2VudHJ5X25hbWVfaWQnXSApXG5cdFx0XHRcdCYmICggZGF0YVsncGF5X3N0dWJfZW50cnlfbmFtZV9pZCddICE9IFRUVVVJRC56ZXJvX2lkXG5cdFx0XHRcdFx0fHwgKCBkYXRhWydkZXNjcmlwdGlvbiddICE9IHVuZGVmaW5lZCAmJiBkYXRhWydkZXNjcmlwdGlvbiddLmxlbmd0aCA+IDAgKVxuXHRcdFx0XHRcdHx8ICggZGF0YVsncmF0ZSddICE9IHVuZGVmaW5lZCAmJiBkYXRhWydyYXRlJ10ubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KCBkYXRhWydyYXRlJ10gKSAhPSAwIClcblx0XHRcdFx0XHR8fCAoIGRhdGFbJ3VuaXRzJ10gIT0gdW5kZWZpbmVkICYmIGRhdGFbJ3VuaXRzJ10ubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KCBkYXRhWyd1bml0cyddICkgIT0gMCApXG5cdFx0XHRcdFx0fHwgKCBkYXRhWydhbW91bnQnXSAhPSB1bmRlZmluZWQgJiYgZGF0YVsnYW1vdW50J10ubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KCBkYXRhWydhbW91bnQnXSApICE9IDAgKVxuXHRcdFx0XHQpICkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCggZGF0YSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCkge1xuXG5cdFx0dmFyIGNvbHVtbl9maWx0ZXIgPSB7fTtcblx0XHRjb2x1bW5fZmlsdGVyLmlzX293bmVyID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmlkID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLnVzZXJfaWQgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuaXNfY2hpbGQgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuaW5fdXNlID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLmZpcnN0X25hbWUgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIubGFzdF9uYW1lID0gdHJ1ZTtcblx0XHRjb2x1bW5fZmlsdGVyLnN0YXJ0X2RhdGUgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZW5kX2RhdGUgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIucGF5X3BlcmlvZF9pZCA9IHRydWU7XG5cblx0XHQvLyBFcnJvcjogVW5hYmxlIHRvIGdldCBwcm9wZXJ0eSAnZ2V0R3JpZFBhcmFtJyBvZiB1bmRlZmluZWQgb3IgbnVsbCByZWZlcmVuY2Vcblx0XHR2YXIgZGlzcGxheV9jb2x1bW5zID0gW107XG5cdFx0aWYgKCB0aGlzLmdyaWQgKSB7XG5cdFx0XHRkaXNwbGF5X2NvbHVtbnMgPSB0aGlzLmdyaWQuZ2V0R3JpZFBhcmFtKCAnY29sTW9kZWwnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBkaXNwbGF5X2NvbHVtbnMgKSB7XG5cdFx0XHR2YXIgbGVuID0gZGlzcGxheV9jb2x1bW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdHZhciBjb2x1bW5faW5mbyA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblx0XHRcdFx0Y29sdW1uX2ZpbHRlcltjb2x1bW5faW5mby5uYW1lXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbl9maWx0ZXI7XG5cdH1cblxuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnNldElzQ2hhbmdlZCggdGFyZ2V0ICk7XG5cdFx0dGhpcy5zZXRNYXNzRWRpdGluZ0ZpZWxkc1doZW5Gb3JtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHR2YXIga2V5ID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dmFyIGNfdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblxuXHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldID0gY192YWx1ZTtcblx0XHRzd2l0Y2ggKCBrZXkgKSB7XG4vL1x0XHRcdGNhc2UgJ3N0YXR1c19pZCc6XG4vL1x0XHRcdFx0aWYgKCBjX3ZhbHVlID09IDQwIHx8IGNfdmFsdWUgPT0gMTAwICkge1xuLy9cdFx0XHRcdFx0dGhpcy5pbmNsdWRlX3BheV9zdHViX2FjY291bnRzID0gZmFsc2U7XG4vL1x0XHRcdFx0fVxuLy9cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcl9pZCc6XG5cdFx0XHRcdGlmICggdGhpcy5pc19hZGQgKSB7XG5cdFx0XHRcdFx0dmFyIHRyYW5zYWN0aW9uX3Jvd3MgPSAkdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5WyR0aGlzLmVkaXRvci5yb3dzX3dpZGdldHNfYXJyYXkubGVuZ3RoIC0gMl07XG5cdFx0XHRcdFx0dmFyIHVzZXJfaWQgPSAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXJfaWQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRmb3IgKCB2YXIgdCBpbiB0cmFuc2FjdGlvbl9yb3dzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBHbG9iYWwuaXNBcnJheSggdHJhbnNhY3Rpb25fcm93cyApICYmIHRyYW5zYWN0aW9uX3Jvd3NbdF0ucmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkICkge1xuXHRcdFx0XHRcdFx0XHR0cmFuc2FjdGlvbl9yb3dzW3RdLnJlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZC5zZXREZWZhdWx0QXJncyggeyBmaWx0ZXJfZGF0YTogeyB1c2VyX2lkOiB1c2VyX2lkIH0gfSApO1xuXHRcdFx0XHRcdFx0XHR0cmFuc2FjdGlvbl9yb3dzW3RdLnJlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZC5zZXRWYWx1ZSggVFRVVUlELnplcm9faWQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjb3VudHJ5Jzpcblx0XHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHJvdmluY2UnXTtcblx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCBudWxsICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGF5X3BlcmlvZF9pZCc6XG5cdFx0XHRcdHZhciBmaWx0ZXIgPSB7fTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YS5pZCA9IGNfdmFsdWU7XG5cdFx0XHRcdHRoaXMucGF5X3BlcmlvZF9hcGlbJ2dldCcgKyB0aGlzLnBheV9wZXJpb2RfYXBpLmtleV9uYW1lXSggZmlsdGVyLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHQvL0Vycm9yOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdzdGFydF9kYXRlJyBvZiB1bmRlZmluZWQgaW4gaW50ZXJmYWNlL2h0bWw1LyMhbT1QYXlTdHViJmE9bmV3JnRhYj1QYXlTdHViIGxpbmUgMTgzNlxuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICYmIHJlcy5nZXRSZXN1bHQoKVswXSApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHJlcy5nZXRSZXN1bHQoKVswXTtcblx0XHRcdFx0XHRcdFx0dmFyIHN0YXJ0X2RhdGUgPSBHbG9iYWwuc3RyVG9EYXRlKCByZXN1bHQuc3RhcnRfZGF0ZSApLmZvcm1hdCgpO1xuXHRcdFx0XHRcdFx0XHR2YXIgZW5kX2RhdGUgPSBHbG9iYWwuc3RyVG9EYXRlKCByZXN1bHQuZW5kX2RhdGUgKS5mb3JtYXQoKTtcblx0XHRcdFx0XHRcdFx0dmFyIHRyYW5zYWN0aW9uX2RhdGUgPSBHbG9iYWwuc3RyVG9EYXRlKCByZXN1bHQudHJhbnNhY3Rpb25fZGF0ZSApLmZvcm1hdCgpO1xuXG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X2RhdGUnXSA9IHN0YXJ0X2RhdGU7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2VuZF9kYXRlJ10gPSBlbmRfZGF0ZTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndHJhbnNhY3Rpb25fZGF0ZSddID0gdHJhbnNhY3Rpb25fZGF0ZTtcblxuXHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydzdGFydF9kYXRlJ10uc2V0VmFsdWUoIHN0YXJ0X2RhdGUgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZW5kX2RhdGUnXS5zZXRWYWx1ZSggZW5kX2RhdGUgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpY1sndHJhbnNhY3Rpb25fZGF0ZSddLnNldFZhbHVlKCB0cmFuc2FjdGlvbl9kYXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCAhZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy52YWxpZGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYgKCAhZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHRcdFx0XHQkdGhpcy52YWxpZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSAnY291bnRyeScgfHwga2V5ID09PSAncGF5X3BlcmlvZF9pZCcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHRcdHRoaXMudmFsaWRhdGUoKTtcblxuXHRcdH1cblx0fVxuXG5cdG9uU2V0U2VhcmNoRmlsdGVyRmluaXNoZWQoKSB7XG5cblx0XHRpZiAoIHRoaXMuc2VhcmNoX3BhbmVsLmdldFNlbGVjdFRhYkluZGV4KCkgPT09IDEgKSB7XG5cdFx0XHR2YXIgY29tYm8gPSB0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydjb3VudHJ5J107XG5cdFx0XHR2YXIgc2VsZWN0X3ZhbHVlID0gY29tYm8uZ2V0VmFsdWUoKTtcblx0XHRcdHRoaXMuc2V0UHJvdmluY2UoIHNlbGVjdF92YWx1ZSApO1xuXHRcdH1cblx0fVxuXG5cdG9uQnVpbGRBZHZVSUZpbmlzaGVkKCkge1xuXG5cdFx0dGhpcy5hZHZfc2VhcmNoX2ZpZWxkX3VpX2RpY1snY291bnRyeSddLmNoYW5nZSggJC5wcm94eSggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY29tYm8gPSB0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydjb3VudHJ5J107XG5cdFx0XHR2YXIgc2VsZWN0VmFsID0gY29tYm8uZ2V0VmFsdWUoKTtcblxuXHRcdFx0dGhpcy5zZXRQcm92aW5jZSggc2VsZWN0VmFsICk7XG5cblx0XHRcdHRoaXMuYWR2X3NlYXJjaF9maWVsZF91aV9kaWNbJ3Byb3ZpbmNlJ10uc2V0VmFsdWUoIG51bGwgKTtcblxuXHRcdH0sIHRoaXMgKSApO1xuXHR9XG5cblx0c2V0UHJvdmluY2UoIHZhbCwgbSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhdmFsIHx8IHZhbCA9PT0gJy0xJyB8fCB2YWwgPT09ICcwJyApIHtcblx0XHRcdCR0aGlzLnByb3ZpbmNlX2FycmF5ID0gW107XG5cdFx0XHR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydwcm92aW5jZSddLnNldFNvdXJjZURhdGEoIFtdICk7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wYW55X2FwaS5nZXRPcHRpb25zKCAncHJvdmluY2UnLCB2YWwsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdGlmICggIXJlcyApIHtcblx0XHRcdFx0XHRcdHJlcyA9IFtdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCR0aGlzLnByb3ZpbmNlX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdFx0XHRcdCR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydwcm92aW5jZSddLnNldFNvdXJjZURhdGEoICR0aGlzLnByb3ZpbmNlX2FycmF5ICk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdGVTZXRQcm92aW5jZSggdmFsLCByZWZyZXNoICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHByb3ZpbmNlX3dpZGdldCA9ICR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3Byb3ZpbmNlJ107XG5cblx0XHRpZiAoICF2YWwgfHwgdmFsID09PSAnLTEnIHx8IHZhbCA9PT0gJzAnICkge1xuXHRcdFx0JHRoaXMuZV9wcm92aW5jZV9hcnJheSA9IFtdO1xuXHRcdFx0cHJvdmluY2Vfd2lkZ2V0LnNldFNvdXJjZURhdGEoIFtdICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29tcGFueV9hcGkuZ2V0T3B0aW9ucyggJ3Byb3ZpbmNlJywgdmFsLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRpZiAoICFyZXMgKSB7XG5cdFx0XHRcdFx0XHRyZXMgPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkdGhpcy5lX3Byb3ZpbmNlX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdFx0XHRcdGlmICggcmVmcmVzaCAmJiAkdGhpcy5lX3Byb3ZpbmNlX2FycmF5Lmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnByb3ZpbmNlID0gJHRoaXMuZV9wcm92aW5jZV9hcnJheVswXS52YWx1ZTtcblx0XHRcdFx0XHRcdHByb3ZpbmNlX3dpZGdldC5zZXRWYWx1ZSggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5wcm92aW5jZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwcm92aW5jZV93aWRnZXQuc2V0U291cmNlRGF0YSggJHRoaXMuZV9wcm92aW5jZV9hcnJheSApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHR2YWxpZGF0ZSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHJlY29yZCA9IHt9O1xuXHRcdHZhciB0cmFuc2FjdGlvbl9yZWNvcmQgPSB7fTtcblxuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuZWRpdF92aWV3X3VpX2RpYyApIHtcblxuXHRcdFx0XHRpZiAoICF0aGlzLmVkaXRfdmlld191aV9kaWMuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQuaXNDaGVja2VkICkgKSB7XG5cdFx0XHRcdFx0aWYgKCB3aWRnZXQuaXNDaGVja2VkKCkgJiYgd2lkZ2V0LmdldEVuYWJsZWQoKSApIHtcblx0XHRcdFx0XHRcdHJlY29yZFtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWNvcmQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQ7XG5cdFx0fVxuXG5cdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHJlY29yZCApO1xuXG5cdFx0aWYgKCB0aGlzLmluY2x1ZGVfcGF5X3N0dWJfYWNjb3VudHMgKSB7XG5cdFx0XHR2YXIgZW50cmllcyA9ICR0aGlzLnNhdmVJbnNpZGVFbnRyeUVkaXRvckRhdGEoKTtcblx0XHRcdHZhciB0cmFuc2FjdGlvbnMgPSAkdGhpcy5zYXZlSW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JEYXRhKCk7XG5cdFx0XHRpZiAoIHR5cGVvZiBlbnRyaWVzID09ICdvYmplY3QnICkge1xuXHRcdFx0XHRyZWNvcmRbJ2VudHJpZXMnXSA9IGVudHJpZXM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHR5cGVvZiB0cmFuc2FjdGlvbnMgPT0gJ29iamVjdCcgKSB7XG5cdFx0XHRcdHJlY29yZFsndHJhbnNhY3Rpb25zJ10gPSB0cmFuc2FjdGlvbnM7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5hcGlbJ3ZhbGlkYXRlJyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0JHRoaXMudmFsaWRhdGVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl9wYXlfc3R1Yic6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdQYXkgU3R1YicgKSwgJ2lzX211bHRpX2NvbHVtbic6IHRydWUsXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRQYXlTdHViVGFiSHRtbCgpXG5cdFx0XHR9LFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5U3R1Yixcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9wYXlfc3R1YicsXG5cdFx0XHRuYXZpZ2F0aW9uX21vZGU6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR0aGlzLnNldE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfcGF5X3N0dWIgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfcGF5X3N0dWInICk7XG5cblx0XHR2YXIgdGFiX3BheV9zdHViX2NvbHVtbjEgPSB0YWJfcGF5X3N0dWIuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cdFx0dmFyIHRhYl9wYXlfc3R1Yl9jb2x1bW4yID0gdGFiX3BheV9zdHViLmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcbi8vXHRcdHZhciB0YWJfcGF5X3N0dWJfY29sdW1uMyA9IHRhYl9wYXlfc3R1Yi5maW5kKCAnLnRoaXJkLWNvbHVtbicgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ7XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9wYXlfc3R1Yl9jb2x1bW4xICk7XG5cblx0XHQvLyBFbXBsb3llZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IGZhbHNlLFxuXHRcdFx0ZmllbGQ6ICd1c2VyX2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VtcGxveWVlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9wYXlfc3R1Yl9jb2x1bW4xICk7XG5cblx0XHQvLyBTdGF0dXNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuZmlsdGVyZWRfc3RhdHVzX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0dXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3BheV9zdHViX2NvbHVtbjEgKTtcblxuXHRcdC8vIFR5cGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICd0eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnR5cGVfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1R5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3BheV9zdHViX2NvbHVtbjEgKTtcblxuXHRcdC8vIEN1cnJlbmN5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElDdXJyZW5jeSxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9jdXJyZW5jeScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2N1cnJlbmN5X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0N1cnJlbmN5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9wYXlfc3R1Yl9jb2x1bW4xICk7XG5cblx0XHQvLyBQYXkgUGVyaW9kXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElQYXlQZXJpb2QsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5X3BlcmlvZCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3BheV9wZXJpb2RfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUGF5IFBlcmlvZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcGF5X3N0dWJfY29sdW1uMiApO1xuXG5cdFx0Ly8gUGF5cm9sbCBSdW5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3J1bl9pZCcsIHdpZHRoOiAyMCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXlyb2xsIFJ1bicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcGF5X3N0dWJfY29sdW1uMiApO1xuXG5cdFx0Ly8gUGF5IFN0YXJ0IERhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF9kYXRlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXkgU3RhcnQgRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcGF5X3N0dWJfY29sdW1uMiApO1xuXG5cdFx0Ly8gUGF5IEVuZCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnZW5kX2RhdGUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BheSBFbmQgRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcGF5X3N0dWJfY29sdW1uMiApO1xuXG5cdFx0Ly8gUGF5bWVudCBEYXRlXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICd0cmFuc2FjdGlvbl9kYXRlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXltZW50IERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3BheV9zdHViX2NvbHVtbjIsICcnICk7XG5cblx0XHQvL0luc2lkZSBwYXkgc3R1YiBlbnRyaWVzIGVkaXRvclxuXG5cdFx0dmFyIGluc2lkZV9wYXlfc3R1Yl9lbnRyeV9lZGl0b3JfZGl2ID0gdGFiX3BheV9zdHViLmZpbmQoICcuaW5zaWRlLXBheS1zdHViLWVudHJ5LWVkaXRvci1kaXYnICk7XG5cblx0XHR0aGlzLmVkaXRvciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuSU5TSURFX0VESVRPUiApO1xuXG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRhZGRSb3c6IHRoaXMuaW5zaWRlRW50cnlFZGl0b3JBZGRSb3csXG5cdFx0XHRyZW1vdmVSb3c6IHRoaXMuaW5zaWRlRW50cnlFZGl0b3JSZW1vdmVSb3csXG5cdFx0XHRnZXRWYWx1ZTogdGhpcy5pbnNpZGVFbnRyeUVkaXRvckdldFZhbHVlLFxuXHRcdFx0c2V0VmFsdWU6IHRoaXMuaW5zaWRlRW50cnlFZGl0b3JTZXRWYWx1ZSxcblx0XHRcdHBhcmVudF9jb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0YXBpOiB0aGlzLnBheV9zdHViX2VudHJ5X2FwaSxcblx0XHRcdHJlbmRlcjogZ2V0UmVuZGVyKCksXG5cdFx0XHRyZW5kZXJfYXJnczoge30sXG5cdFx0XHRyZW5kZXJfaW5saW5lX2h0bWw6IHRydWUsXG5cdFx0XHRyb3dfcmVuZGVyOiBnZXRSb3dSZW5kZXIoKVxuXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0YWJsZSBjbGFzcz1cImluc2lkZS1lZGl0b3ItcmVuZGVyIHRibExpc3RcIj5cblx0XHRcdDwvdGFibGU+YDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRSb3dSZW5kZXIoKSB7XG5cdFx0XHRyZXR1cm4gYDxkaXY+PC9kaXY+YDtcblx0XHR9XG5cblx0XHR0aGlzLmVkaXRvci5zaG93X2NvdmVyID0gdHJ1ZTtcblx0XHR0aGlzLmVkaXRvci5kZWxldGVfdHJhbnNhY3Rpb25faWRzID0gW107XG5cdFx0dGhpcy5lZGl0b3IucmVtb3ZlQ292ZXIgPSB0aGlzLnJlbW92ZUVudHJ5SW5zaWRlRWRpdG9yQ292ZXI7XG5cdFx0dGhpcy5lZGl0b3Iub25FZGl0Q2xpY2sgPSB0aGlzLnJlbW92ZUVudHJ5SW5zaWRlRWRpdG9yQ292ZXI7XG5cdFx0dGhpcy5lZGl0b3Iub25Gb3JtSXRlbUtleVVwID0gZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHRcdHZhciBpbmRleCA9IHRhcmdldC5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpO1xuXHRcdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRcdHZhciB3aWRnZXRfcmF0ZSA9ICR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF1bJ3JhdGUnXTtcblx0XHRcdHZhciB3aWRnZXRfdW5pdHMgPSAkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdWyd1bml0cyddO1xuXHRcdFx0dmFyIHdpZGdldF9hbW91bnQgPSAkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdWydhbW91bnQnXTtcblxuXHRcdFx0aWYgKCB0YXJnZXQuZ2V0VmFsdWUoKS5sZW5ndGggPT09IDAgKSB7XG5cdFx0XHRcdHdpZGdldF9hbW91bnQuc2V0UmVhZE9ubHkoIGZhbHNlICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHdpZGdldF9yYXRlLmdldFZhbHVlKCkubGVuZ3RoID4gMCB8fCB3aWRnZXRfdW5pdHMuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHR3aWRnZXRfYW1vdW50LnNldFJlYWRPbmx5KCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2lkZ2V0X3JhdGUuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHdpZGdldF91bml0cy5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdC8vd2lkZ2V0X2Ftb3VudC5zZXRWYWx1ZSggKCBwYXJzZUZsb2F0KCB3aWRnZXRfcmF0ZS5nZXRWYWx1ZSgpICkgKiBwYXJzZUZsb2F0KCB3aWRnZXRfdW5pdHMuZ2V0VmFsdWUoKSApICkudG9GaXhlZCggMiApICk7XG5cdFx0XHRcdC8vdmFyIGFtb3VudF92YWx1ZSA9IEdsb2JhbC5Nb25leVJvdW5kKCBwYXJzZUZsb2F0KCB3aWRnZXRfcmF0ZS5nZXRWYWx1ZSgpICkgKiBwYXJzZUZsb2F0KCB3aWRnZXRfdW5pdHMuZ2V0VmFsdWUoKSApICk7XG5cdFx0XHRcdHZhciBhbW91bnRfdmFsdWUgPSBHbG9iYWwuTW9uZXlSb3VuZCggRGVjaW1hbCggcGFyc2VGbG9hdCggd2lkZ2V0X3JhdGUuZ2V0VmFsdWUoKSApICkubXVsKCBwYXJzZUZsb2F0KCB3aWRnZXRfdW5pdHMuZ2V0VmFsdWUoKSApICkudG9GaXhlZCggNCApICk7XG5cdFx0XHRcdGlmICggYW1vdW50X3ZhbHVlID09ICdOYU4nIHx8IGFtb3VudF92YWx1ZSA9PSAwIHx8IGFtb3VudF92YWx1ZSA9PSAnJyApIHtcblx0XHRcdFx0XHRhbW91bnRfdmFsdWUgPSAnMC4wMCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0d2lkZ2V0X2Ftb3VudC5zZXRWYWx1ZSggYW1vdW50X3ZhbHVlICk7XG5cdFx0XHRcdHRoaXMub25Gb3JtSXRlbUNoYW5nZSggd2lkZ2V0X2Ftb3VudCwgdHJ1ZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2lkZ2V0X2Ftb3VudC5zZXRWYWx1ZSggJzAuMDAnICk7XG5cdFx0XHRcdHRoaXMub25Gb3JtSXRlbUNoYW5nZSggd2lkZ2V0X2Ftb3VudCwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGhpcy5lZGl0b3Iub25Gb3JtSXRlbUtleURvd24gPSBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdFx0dmFyIGluZGV4ID0gdGFyZ2V0LnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCk7XG5cdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdFx0dmFyIHdpZGdldCA9ICR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF1bJ2Ftb3VudCddO1xuXHRcdFx0dmFyIHdpZGdldF9yYXRlID0gJHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XVsncmF0ZSddO1xuXHRcdFx0dmFyIHdpZGdldF91bml0cyA9ICR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF1bJ3VuaXRzJ107XG5cdFx0XHRpZiAoIHdpZGdldF9yYXRlLmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB3aWRnZXRfdW5pdHMuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoICcwLjAwJyApO1xuXHRcdFx0XHR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHdpZGdldCwgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3aWRnZXQuc2V0UmVhZE9ubHkoIHRydWUgKTtcblx0XHR9O1xuXHRcdHRoaXMuZWRpdG9yLm9uRm9ybUl0ZW1DaGFuZ2UgPSBmdW5jdGlvbiggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdFx0dmFyIGNfdmFsdWUgPSBwYXJzZUZsb2F0KCB0YXJnZXQuZ2V0VmFsdWUoKSA/IHRhcmdldC5nZXRWYWx1ZSgpIDogMCApOyAvLyBuZXcgdmFsdWVcblx0XHRcdHZhciBpbmRleCA9IHRhcmdldC5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpO1xuXG5cdFx0XHRpZiAoIGtleSA9PT0gJ2Ftb3VudCcgKSB7XG5cdFx0XHRcdHZhciBvcmlnaW5hbF95dGRfYW1vdW50ID0gcGFyc2VGbG9hdCggdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdWyd5dGRfYW1vdW50J10uYXR0ciggJ29yaWdpbmFsX3l0ZF9hbW91bnQnICkgKTtcblx0XHRcdFx0aWYgKCBpc05hTiggb3JpZ2luYWxfeXRkX2Ftb3VudCApICkge1xuXHRcdFx0XHRcdG9yaWdpbmFsX3l0ZF9hbW91bnQgPSAwLjAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9yaWdpbmFsX2Ftb3VudCA9IHBhcnNlRmxvYXQoIHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XVsneXRkX2Ftb3VudCddLmF0dHIoICdvcmlnaW5hbF9hbW91bnQnICkgKTtcblx0XHRcdFx0aWYgKCBpc05hTiggb3JpZ2luYWxfYW1vdW50ICkgKSB7XG5cdFx0XHRcdFx0b3JpZ2luYWxfYW1vdW50ID0gMC4wMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBuZXdfeXRkX2Ftb3VudCA9IEdsb2JhbC5yZW1vdmVUcmFpbGluZ1plcm9zKCBEZWNpbWFsKCBvcmlnaW5hbF95dGRfYW1vdW50ICkuc3ViKCBvcmlnaW5hbF9hbW91bnQgKS5hZGQoIGNfdmFsdWUgKS50b0ZpeGVkKCA0ICkgKTtcblx0XHRcdFx0aWYgKCBpc05hTiggbmV3X3l0ZF9hbW91bnQgKSApIHtcblx0XHRcdFx0XHRuZXdfeXRkX2Ftb3VudCA9IDAuMDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF1bJ3l0ZF9hbW91bnQnXS5zZXRWYWx1ZSggbmV3X3l0ZF9hbW91bnQgIT0gMCA/IG5ld195dGRfYW1vdW50IDogJy0nICk7XG5cdFx0XHRcdHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XVsneXRkX2Ftb3VudCddLmF0dHIoICdvcmlnaW5hbF95dGRfYW1vdW50JywgbmV3X3l0ZF9hbW91bnQgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdWyd5dGRfYW1vdW50J10uYXR0ciggJ29yaWdpbmFsX2Ftb3VudCcsIGNfdmFsdWUgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkb05vdFZhbGlkYXRlICkge1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLnZhbGlkYXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuY2FsY1RvdGFsKCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZWRpdG9yLmNhbGNUb3RhbCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHRvdGFsX3VuaXRzID0gMDtcblx0XHRcdHZhciB0b3RhbF9hbW91bnQgPSAwO1xuXHRcdFx0dmFyIHRvdGFsX3l0ZF9hbW91bnQgPSAwO1xuXHRcdFx0dmFyIG5ldF9wYXlfYW1vdW50ID0gMDtcblx0XHRcdHZhciBuZXRfcGF5X3l0ZF9hbW91bnQgPSAwO1xuXHRcdFx0dmFyIHRvdGFsX3VuaXRzX2JsYW5rID0gdHJ1ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhciByb3cgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpXTtcblx0XHRcdFx0aWYgKCByb3cgPT09IHRydWUgfHwgXy5pc0FycmF5KCByb3cgKSApIHtcblx0XHRcdFx0XHR0b3RhbF91bml0cyA9IDA7XG5cdFx0XHRcdFx0dG90YWxfYW1vdW50ID0gMDtcblx0XHRcdFx0XHR0b3RhbF95dGRfYW1vdW50ID0gMDtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggcm93Wyd0b3RhbF9yb3cnXSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRpZiAoICFHbG9iYWwuaXNOdW1lcmljKCB0b3RhbF9hbW91bnQgKSApIHtcblx0XHRcdFx0XHRcdHRvdGFsX2Ftb3VudCA9IDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHJvd1sndW5pdHMnXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCB0b3RhbF91bml0c19ibGFuayA9PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0cm93Wyd1bml0cyddLnNldFZhbHVlKCBHbG9iYWwuTW9uZXlSb3VuZCggdG90YWxfdW5pdHMgKSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdG90YWxfdW5pdHNfYmxhbmsgKSB7XG5cdFx0XHRcdFx0XHRcdHJvd1sndW5pdHMnXS5zZXRWYWx1ZSggJy0nICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJvd1snYW1vdW50J10uc2V0VmFsdWUoIEdsb2JhbC5Nb25leVJvdW5kKCBwYXJzZUZsb2F0KCB0b3RhbF9hbW91bnQgKSApICk7XG5cdFx0XHRcdFx0cm93Wyd5dGRfYW1vdW50J10uc2V0VmFsdWUoIEdsb2JhbC5Nb25leVJvdW5kKCBwYXJzZUZsb2F0KCB0b3RhbF95dGRfYW1vdW50ICkgKSApO1xuXG5cdFx0XHRcdFx0aWYgKCByb3cudHlwZV9pZCA9PSAxMCApIHsgLy8gU3RhcnQgd2l0aCB0b3RhbCBncm9zcyB2YWx1ZVxuXHRcdFx0XHRcdFx0bmV0X3BheV9hbW91bnQgPSB0b3RhbF9hbW91bnQ7XG5cdFx0XHRcdFx0XHRuZXRfcGF5X3l0ZF9hbW91bnQgPSB0b3RhbF95dGRfYW1vdW50O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHJvdy50eXBlX2lkID09IDIwICkgeyAvLyBTdWJ0cmFjdCBkZWR1Y3Rpb25zIChvbmx5KVxuXHRcdFx0XHRcdFx0Ly9uZXRfcGF5X2Ftb3VudCA9IG5ldF9wYXlfYW1vdW50IC0gdG90YWxfYW1vdW50O1xuXHRcdFx0XHRcdFx0bmV0X3BheV9hbW91bnQgPSBEZWNpbWFsKCBuZXRfcGF5X2Ftb3VudCApLnN1YiggdG90YWxfYW1vdW50ICkudG9GaXhlZCggNCApO1xuXG5cdFx0XHRcdFx0XHQvL25ldF9wYXlfeXRkX2Ftb3VudCA9IG5ldF9wYXlfeXRkX2Ftb3VudCAtIHRvdGFsX3l0ZF9hbW91bnQ7XG5cdFx0XHRcdFx0XHRuZXRfcGF5X3l0ZF9hbW91bnQgPSBEZWNpbWFsKCBuZXRfcGF5X3l0ZF9hbW91bnQgKS5zdWIoIHRvdGFsX3l0ZF9hbW91bnQgKS50b0ZpeGVkKCA0ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5wYXJlbnRfY29udHJvbGxlci5uZXRfcGF5X2Ftb3VudCA9IG5ldF9wYXlfYW1vdW50O1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByb3dbJ3BheV9zdHViX2VudHJ5X2FjY291bnRfaWQnXSAmJiByb3dbJ3BheV9zdHViX2VudHJ5X2FjY291bnRfaWQnXSA9PSB0aGlzLnBhcmVudF9jb250cm9sbGVyLnBzZWFsX2xpbmsubmV0X3BheV9lbnRyeV9hY2NvdW50X2lkICkge1xuXHRcdFx0XHRcdHJvd1snYW1vdW50J10uc2V0VmFsdWUoIEdsb2JhbC5Nb25leVJvdW5kKCBuZXRfcGF5X2Ftb3VudCApICk7XG5cdFx0XHRcdFx0cm93Wyd5dGRfYW1vdW50J10uc2V0VmFsdWUoIEdsb2JhbC5Nb25leVJvdW5kKCBuZXRfcGF5X3l0ZF9hbW91bnQgKSApO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGN1cnJlbnRfdW5pdHMgPSAwO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggcm93Wyd1bml0cyddICkgJiYgR2xvYmFsLmlzTnVtZXJpYyggcm93Wyd1bml0cyddLmdldFZhbHVlKCkgKSApIHtcblx0XHRcdFx0XHRjdXJyZW50X3VuaXRzID0gR2xvYmFsLk1vbmV5Um91bmQoIHBhcnNlRmxvYXQoIHJvd1sndW5pdHMnXS5nZXRWYWx1ZSgpICkgKTtcblx0XHRcdFx0XHR0b3RhbF91bml0c19ibGFuayA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGN1cnJlbnRfdG90YWxfYW1vdW50ID0gMDtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHJvd1snYW1vdW50J10gKSAmJiBHbG9iYWwuaXNOdW1lcmljKCByb3dbJ2Ftb3VudCddLmdldFZhbHVlKCkgKSApIHtcblx0XHRcdFx0XHRjdXJyZW50X3RvdGFsX2Ftb3VudCA9IHBhcnNlRmxvYXQoIHJvd1snYW1vdW50J10uZ2V0VmFsdWUoKSApO1xuXHRcdFx0XHRcdHRvdGFsX3VuaXRzX2JsYW5rID0gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY3VycmVudF95dGRfdG90YWwgPSAwO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggcm93Wyd5dGRfYW1vdW50J10gKSAmJiBHbG9iYWwuaXNOdW1lcmljKCByb3dbJ3l0ZF9hbW91bnQnXS5nZXRWYWx1ZSgpICkgKSB7XG5cdFx0XHRcdFx0Y3VycmVudF95dGRfdG90YWwgPSBwYXJzZUZsb2F0KCByb3dbJ3l0ZF9hbW91bnQnXS5nZXRWYWx1ZSgpICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRvdGFsX3VuaXRzX2JsYW5rID09IGZhbHNlICkge1xuXHRcdFx0XHRcdC8vIHRvdGFsX3VuaXRzID0gcGFyc2VGbG9hdCggdG90YWxfdW5pdHMgKSArIHBhcnNlRmxvYXQoIGN1cnJlbnRfdW5pdHMgKTtcblx0XHRcdFx0XHR0b3RhbF91bml0cyA9IERlY2ltYWwoIHBhcnNlRmxvYXQoIHRvdGFsX3VuaXRzICkgKS5hZGQoIHBhcnNlRmxvYXQoIGN1cnJlbnRfdW5pdHMgKSApLnRvRml4ZWQoIDQgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0b3RhbF91bml0cyA9ICcnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNOdW1lcmljKCBjdXJyZW50X3RvdGFsX2Ftb3VudCApICkge1xuXHRcdFx0XHRcdC8vIHRvdGFsX2Ftb3VudCA9IHRvdGFsX2Ftb3VudCArIGN1cnJlbnRfdG90YWxfYW1vdW50O1xuXHRcdFx0XHRcdHRvdGFsX2Ftb3VudCA9IERlY2ltYWwoIHRvdGFsX2Ftb3VudCApLmFkZCggY3VycmVudF90b3RhbF9hbW91bnQgKS50b0ZpeGVkKCA0ICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc051bWVyaWMoIGN1cnJlbnRfeXRkX3RvdGFsICkgKSB7XG5cdFx0XHRcdFx0Ly8gdG90YWxfeXRkX2Ftb3VudCA9IHRvdGFsX3l0ZF9hbW91bnQgKyBjdXJyZW50X3l0ZF90b3RhbDtcblx0XHRcdFx0XHR0b3RhbF95dGRfYW1vdW50ID0gRGVjaW1hbCggdG90YWxfeXRkX2Ftb3VudCApLmFkZCggY3VycmVudF95dGRfdG90YWwgKS50b0ZpeGVkKCA0ICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbGNUcmFuc2FjdGlvblRvdGFscygpO1xuXG5cdFx0fTtcblxuXHRcdHRoaXMuZWRpdG9yLmluc2lkZVRyYW5zYWN0aW9uRWRpdG9yU2V0VmFsdWUgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0XHRcdCR0aGlzID0gdGhpcztcblx0XHRcdGlmICggIXRoaXMucGFyZW50X2NvbnRyb2xsZXIuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHBheV9zdHViX3N0YXR1c19pZCA9IHRoaXMucGFyZW50X2NvbnRyb2xsZXJbJ2N1cnJlbnRfZWRpdF9yZWNvcmQnXVsnc3RhdHVzX2lkJ107XG5cdFx0XHR2YXIgaXNfYWRkID0gZmFsc2U7XG5cdFx0XHRpZiAoICF0aGlzLnBhcmVudF9jb250cm9sbGVyWydjdXJyZW50X2VkaXRfcmVjb3JkJ11bJ2lkJ10gJiYgIXRoaXMucGFyZW50X2NvbnRyb2xsZXIuY29waWVkX3JlY29yZF9pZCApIHtcblx0XHRcdFx0aXNfYWRkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICggIWlzX2FkZCAmJiAoIHBheV9zdHViX3N0YXR1c19pZCA9PSAyNSApICYmIHRoaXMuc2hvd19jb3ZlciApIHtcblx0XHRcdFx0dGhpcy5jb3ZlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBXaWRnZXROYW1lc0RpYy5OT19SRVNVTFRfQk9YICk7XG5cdFx0XHRcdHRoaXMuY292ZXIuTm9SZXN1bHRCb3goIHtcblx0XHRcdFx0XHRyZWxhdGVkX3ZpZXdfY29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0XHRtZXNzYWdlOiAkLmkxOG4uXyggJ0NsaWNrIHRoZSBFZGl0IGljb24gYmVsb3cgdG8gb3ZlcnJpZGUgcGF5IHN0dWIgYW1vdW50cycgKSxcblx0XHRcdFx0XHRpc19lZGl0OiB0cnVlXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHRcdHZhciByZW5kZXIgPSB0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgaGVhZGVyUm93ID0gYFxuXHRcdFx0PHRyIGNsYXNzPVwidGJsSGVhZGVyXCI+XG5cdFx0XHRcdDx0ZCBhbGlnbj1cImxlZnRcIiBjb2xzcGFuPVwiMlwiPjwlPSBjb2wxICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIyXCI+IDwlPSBjb2wyICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIxXCI+IDwlPSBjb2wzICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIxXCI+IDwlPSBjb2w0ICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIxXCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiPjwlPSBjb2w1ICU+PC90ZD5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJ3aWR0aDo2MHB4XCI+PC90ZD5cblx0XHRcdDwvdHI+YDtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRjb2wxOiAkLmkxOG4uXyggJ1BheW1lbnQgTWV0aG9kJyApLFxuXHRcdFx0XHRjb2wyOiAkLmkxOG4uXyggJ05vdGUnICksXG5cdFx0XHRcdGNvbDM6ICQuaTE4bi5fKCAnU3RhdHVzJyApLFxuXHRcdFx0XHRjb2w0OiAkLmkxOG4uXyggJ1BheW1lbnQgRGF0ZScgKSxcblx0XHRcdFx0Y29sNTogJC5pMThuLl8oICdBbW91bnQnIClcblx0XHRcdH07XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoICc8dHIgY2xhc3M9XCJ0YmxTZXBIZWFkZXJcIj48dGQgY29sc3Bhbj1cIjhcIj4nICsgJC5pMThuLl8oICdUcmFuc2FjdGlvbnMnICkgKyAnPC90ZD48L3RyPicgKTtcblxuXHRcdFx0dmFyIHRlbXBsYXRlID0gXy50ZW1wbGF0ZSggaGVhZGVyUm93ICk7XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoIHRlbXBsYXRlKCBhcmdzICkgKTtcblxuXHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggdHJ1ZSApO1xuXHRcdFx0aWYgKCBfLnNpemUoIGRhdGEgKSA+IDAgKSB7XG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF8uc2l6ZSggZGF0YSApOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGRhdGFbaV0gKSApIHtcblx0XHRcdFx0XHRcdHZhciByb3cgPSBkYXRhW2ldO1xuXHRcdFx0XHRcdFx0dGhpcy5pbnNpZGVUcmFuc2FjdGlvbkVkaXRvckFkZFJvdyggcm93ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vJCggcmVuZGVyICkuYXBwZW5kKCAnPHRyPjx0ZCBjb2xzcGFuPVwiOFwiPjxicj48L3RkPjwvdHI+JyApO1xuXHRcdFx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB0cnVlICk7XG5cdFx0XHRcdGlmICggdGhpcy5jb3ZlciAmJiB0aGlzLmNvdmVyLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0dGhpcy5jb3Zlci5jc3MoIHsgd2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpICsgMzAgfSApO1xuXHRcdFx0XHRcdHRoaXMucGFyZW50KCkuYXBwZW5kKCB0aGlzLmNvdmVyICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZ2V0UGF5U3R1YlRyYW5zYWN0aW9uRGVmYXVsdERhdGEoIGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0XHRcdCR0aGlzLmluc2lkZVRyYW5zYWN0aW9uRWRpdG9yQWRkUm93KCBkYXRhICk7XG5cdFx0XHRcdFx0Ly8kKCByZW5kZXIgKS5hcHBlbmQoICc8dHI+PHRkIGNvbHNwYW49XCI4XCI+PGJyPjwvdGQ+PC90cj4nICk7XG5cdFx0XHRcdFx0JHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHRydWUgKTtcblx0XHRcdFx0XHRpZiAoICR0aGlzLmNvdmVyICYmICR0aGlzLmNvdmVyLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5jb3Zlci5jc3MoIHsgd2lkdGg6ICR0aGlzLndpZHRoKCksIGhlaWdodDogJHRoaXMuaGVpZ2h0KCkgfSApO1xuXHRcdFx0XHRcdFx0JHRoaXMucGFyZW50KCkuYXBwZW5kKCAkdGhpcy5jb3ZlciApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbGNUcmFuc2FjdGlvblRvdGFscygpO1xuXHRcdH07XG5cblx0XHR0aGlzLmVkaXRvci5pbnNpZGVUcmFuc2FjdGlvbkVkaXRvckdldFZhbHVlID0gZnVuY3Rpb24oIHBhcmVudF9pZCApIHtcblx0XHRcdHZhciBsZW4gPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGg7XG5cdFx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRcdGlmICggdGhpcy5jb3ZlciAmJiB0aGlzLmNvdmVyLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IHt9O1xuXHRcdFx0XHRpZiAoIF8uaXNBcnJheSggdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaV0gKSApIHtcblx0XHRcdFx0XHR2YXIgcm93ID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaV1bMF07XG5cblx0XHRcdFx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIHJvd1sncmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkJ10gKSB8fCAhcm93WydyZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnRfaWQnXS5nZXRWYWx1ZSgpICkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7IC8vcm93IGlzIG5vdCBlZGl0YWJsZSBidXQgaXMgYW1vbmcgdGhvc2UgdGhhdCBhcmUuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGFbJ2lkJ10gPSByb3dbJ2Zvcm1faXRlbV9yZWNvcmQnXVsnaWQnXTtcblx0XHRcdFx0XHRkYXRhWydyZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnRfaWQnXSA9IHJvd1sncmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkJ10gPyByb3dbJ3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZCddLmdldFZhbHVlKCkgOiBUVFVVSUQuemVyb19pZDtcblxuXHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCByb3dbJ3N0YXR1c19pZCddICkgKSB7XG5cdFx0XHRcdFx0XHRkYXRhWydzdGF0dXNfaWQnXSA9IHJvd1snc3RhdHVzX2lkJ10uZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRkYXRhWyd0cmFuc2FjdGlvbl9kYXRlJ10gPSByb3dbJ3RyYW5zYWN0aW9uX2RhdGUnXSA/IHJvd1sndHJhbnNhY3Rpb25fZGF0ZSddLmdldFZhbHVlKCkgOiAnJztcblxuXHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCByb3dbJ2N1cnJlbmN5X2lkJ10gKSApIHtcblx0XHRcdFx0XHRcdGRhdGFbJ2N1cnJlbmN5X2lkJ10gPSByb3dbJ2N1cnJlbmN5X2lkJ10uZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRkYXRhWydub3RlJ10gPSByb3dbJ25vdGUnXSA/IHJvd1snbm90ZSddLmdldFZhbHVlKCkgOiAnJztcblxuXHRcdFx0XHRcdGRhdGFbJ2Ftb3VudCddID0gcm93WydhbW91bnQnXSA/IHJvd1snYW1vdW50J10uZ2V0VmFsdWUoKSA6ICcnO1xuXG5cdFx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHJvd1snZGVsZXRlZCddICkgJiYgcm93WydkZWxldGVkJ10gPT0gMSApIHtcblx0XHRcdFx0XHRcdGRhdGFbJ2RlbGV0ZWQnXSA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFbJ2RlbGV0ZWQnXSA9IDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZGF0YVsncGF5X3N0dWJfaWQnXSA9IHBhcmVudF9pZDtcblxuXHRcdFx0XHRcdGlmICggcm93Wyd0b3RhbF9yb3cnXSAhPSB0cnVlICYmIFRUVVVJRC5pc1VVSUQoIGRhdGFbJ3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZCddIClcblx0XHRcdFx0XHRcdCYmICggZGF0YVsncmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkJ10gIT0gVFRVVUlELnplcm9faWRcblx0XHRcdFx0XHRcdFx0fHwgKCBkYXRhWydub3RlJ10gIT0gdW5kZWZpbmVkICYmIGRhdGFbJ25vdGUnXS5sZW5ndGggPiAwIClcblx0XHRcdFx0XHRcdFx0fHwgKCBkYXRhWydhbW91bnQnXSAhPSB1bmRlZmluZWQgJiYgZGF0YVsnYW1vdW50J10ubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KCBkYXRhWydhbW91bnQnXSApICE9IDAgKVxuXHRcdFx0XHRcdFx0KSApIHtcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdHRoaXMuZWRpdG9yLmluc2lkZVRyYW5zYWN0aW9uRWRpdG9yUmVtb3ZlUm93ID0gZnVuY3Rpb24oIHJvdyApIHtcblx0XHRcdHZhciBpbmRleCA9IHJvd1swXS5yb3dJbmRleCAtIDE7XG5cblx0XHRcdGlmICggdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdWzBdICkge1xuXHRcdFx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF1bMF1bJ2Zvcm1faXRlbV9yZWNvcmQnXVsnZGVsZXRlZCddID0gMTtcblx0XHRcdFx0dmFyIHJlbW92ZV9pZCA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2luZGV4XVswXVsnZm9ybV9pdGVtX3JlY29yZCddWydpZCddO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIFRUVVVJRC5pc1VVSUQoIHJlbW92ZV9pZCApICkge1xuXHRcdFx0XHR0aGlzLmRlbGV0ZV90cmFuc2FjdGlvbl9pZHMucHVzaCggcmVtb3ZlX2lkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBvbmx5IHJlbW92ZSB0aGUgcm93IGlmIGl0IHdhcyBhIG5ldyByb3csIGV4aXN0aW5nIHJvd3MgKGluIGRiKSBtdXN0IG9ubHkgYmUgaGlkZGVuLCBub3QgcmVtb3ZlZC5cblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBoaWRlIHRoZSByb3cgZnJvbSB1c2VyIHZpZXcsIHNvIHdlIGNhbiBzdGlsbCBxdWVyeSB0aGUgZGF0YSBkdXJpbmcgdGhlIHNhdmUgb3BlcmF0aW9uIChhcGkgc3RpbGwgbmVlZHMgaXQgdG8ga25vdyB3aGF0IHRvIGRlbGV0ZSkuXG5cdFx0XHRyb3cuaGlkZSgpO1xuXG5cdFx0XHQvL2NvdW50IHRyYW5zYWN0aW9uIHJvd3MuXG5cdFx0XHR2YXIgdHJvd3MgPSAkKCAnLnBheXN0dWJfdHJhbnNhY3Rpb25fcm93OnZpc2libGUnICkubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHRyb3dzID09IDAgKSB7XG5cdFx0XHRcdC8vIGlmIGFsbCByb3dzIHJlbW92ZWQsIG1ha2Ugc3VyZSB3ZSBhZGQgYSBibGFuayByb3cgaW4gYWdhaW4uXG5cdFx0XHRcdHRoaXMuaW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JBZGRSb3coIHt9LCBpbmRleCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLnZhbGlkYXRlKCk7XG5cdFx0XHQkdGhpcy5jYWxjVHJhbnNhY3Rpb25Ub3RhbHMoKTtcblxuXHRcdH07XG5cblx0XHR0aGlzLmVkaXRvci5jYWxjVHJhbnNhY3Rpb25Ub3RhbHMgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0b3RhbF9hbW91bnQgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFyIHJvdyA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2ldO1xuXHRcdFx0XHQvL3VzZSB0cmFuc2FjdGlvbl9kYXRlIGNvbHVtbiBleGlzdGVuY2UgYXMgaXMgdHJhbnNhY3Rpb24gZmxhZy5cblx0XHRcdFx0aWYgKCBfLmlzT2JqZWN0KCByb3cgKSAvL3JvdyBpcyBvYmplY3Rcblx0XHRcdFx0XHQmJiBHbG9iYWwuaXNTZXQoIHJvd1swXSApXHQvL3JvdydzIG9iamVjdCBpcyBzZXQuXG5cdFx0XHRcdFx0JiYgR2xvYmFsLmlzU2V0KCByb3dbMF0ucmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkICkgLy9yb3cgaXMgYSBwYXkgc3R1YiB0cmFuc2FjdGlvblxuXHRcdFx0XHRcdCYmIEdsb2JhbC5pc1NldCggcm93WzBdLmZvcm1faXRlbV9yZWNvcmQuZGVsZXRlZCApID09IGZhbHNlIC8vcm93IGlzIG5vdCByZW1vdmVkXG5cdFx0XHRcdFx0JiYgR2xvYmFsLmlzU2V0KCByb3dbMF0uc3RhdHVzX2lkICkgLy9yb3cgaXMgbm90IHJlbW92ZWRcblx0XHRcdFx0XHQmJiAoIHJvd1swXS5zdGF0dXNfaWQuZ2V0VmFsdWUoKSA9PSAxMCB8fCByb3dbMF0uc3RhdHVzX2lkLmdldFZhbHVlKCkgPT0gMjAgKSAvL3N0YXR1cyBpcyB2YWxpZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR2YXIgY3VycmVudCA9IHBhcnNlRmxvYXQoIHJvd1swXS5hbW91bnQuZ2V0VmFsdWUoKSApO1xuXHRcdFx0XHRcdGlmICggaXNOYU4oIGN1cnJlbnQgKSApIHtcblx0XHRcdFx0XHRcdGN1cnJlbnQgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0b3RhbF9hbW91bnQgKz0gY3VycmVudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0b3RhbF9hbW91bnQgPSBHbG9iYWwuTW9uZXlSb3VuZCggdG90YWxfYW1vdW50ICk7XG5cblx0XHRcdC8vdG90YWxfYW1vdW50ID0gR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3ModG90YWxfYW1vdW50KTtcblx0XHRcdHZhciByZW5kZXIgPSB0aGlzLmdldFJlbmRlcigpO1xuXHRcdFx0JCggJy50cmFuc2FjdGlvbl90b3RhbF9yb3dzJyApLnJlbW92ZSgpO1xuXG5cdFx0XHRpZiAoIHRvdGFsX2Ftb3VudCA+IDAgKSB7XG5cdFx0XHRcdC8vIHZhciBkaWZmZXJlbmNlID0gR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIHBhcnNlRmxvYXQoIHRvdGFsX2Ftb3VudCApIC0gcGFyc2VGbG9hdCggdGhpcy5wYXJlbnRfY29udHJvbGxlci5uZXRfcGF5X2Ftb3VudCApICk7XG5cdFx0XHRcdHZhciBkaWZmZXJlbmNlID0gR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIERlY2ltYWwoIHBhcnNlRmxvYXQoIHRvdGFsX2Ftb3VudCApICkuc3ViKCBwYXJzZUZsb2F0KCB0aGlzLnBhcmVudF9jb250cm9sbGVyLm5ldF9wYXlfYW1vdW50ICkgKS50b0ZpeGVkKCA0ICkgKTtcblxuXHRcdFx0XHRpZiAoIGlzTmFOKCBkaWZmZXJlbmNlICkgKSB7XG5cdFx0XHRcdFx0ZGlmZmVyZW5jZSA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY29sb3IgPSAnZ3JlZW4nO1xuXHRcdFx0XHRpZiAoIGRpZmZlcmVuY2UgIT0gMCApIHtcblx0XHRcdFx0XHRjb2xvciA9ICdyZWQnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkaWZmZXJlbmNlICE9IDAgKSB7XG5cdFx0XHRcdFx0ZGlmZmVyZW5jZSA9IEdsb2JhbC5Nb25leVJvdW5kKCBkaWZmZXJlbmNlICk7XG5cdFx0XHRcdFx0JCggcmVuZGVyICkuYXBwZW5kKCAnPHRyIGNsYXNzPVwidGJsRGF0YVdoaXRlIHRyYW5zYWN0aW9uX3RvdGFsX3Jvd3NcIj48dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPjxiPlRyYW5zYWN0aW9uIFRvdGFsPC9iPjwvdGQ+PHRkIGNvbHNwYW49XCIzXCI+PGJyPjwvdGQ+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtcIj48c3Bhbj5EaWZmZXJlbmNlOiA8aSAgc3R5bGU9XCJjb2xvcjpyZWQ7XCI+JyArIGRpZmZlcmVuY2UgKyAnPC9pPjwvYj48L3RkPjx0ZD48YiBzdHlsZT1cImNvbG9yOicgKyBjb2xvciArICdcIj4nICsgR2xvYmFsLk1vbmV5Um91bmQoIHRvdGFsX2Ftb3VudCApICsgJzwvYj48L3RkPjx0ZD48L3RkPjwvdGQ+PC90cj4nICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JCggcmVuZGVyICkuYXBwZW5kKCAnPHRyIGNsYXNzPVwidGJsRGF0YVdoaXRlIHRyYW5zYWN0aW9uX3RvdGFsX3Jvd3NcIj48dGQgY29sc3Bhbj1cIjJcIiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPjxiPlRyYW5zYWN0aW9uIFRvdGFsPC9iPjwvdGQ+PHRkIGNvbHNwYW49XCI0XCI+PGJyPjwvdGQ+PHRkPjxiIHN0eWxlPVwiY29sb3I6JyArIGNvbG9yICsgJ1wiPicgKyB0b3RhbF9hbW91bnQgKyAnPC9iPjwvdGQ+PHRkPjwvdGQ+PC90ZD48L3RyPicgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHRydWUgKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5lZGl0b3IuaW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JBZGRSb3cgPSBmdW5jdGlvbiggZGF0YSwgaW5kZXggKSB7XG5cdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdFx0aWYgKCBfLnNpemUoIGRhdGEgKSA9PSAwICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLmdldFBheVN0dWJUcmFuc2FjdGlvbkRlZmF1bHREYXRhKCBmdW5jdGlvbiggZGF0YSApIHtcblx0XHRcdFx0XHQkdGhpcy5pbnNpZGVUcmFuc2FjdGlvbkVkaXRvckFkZFJvdyggZGF0YSwgaW5kZXggKTtcblx0XHRcdFx0fSwgaW5kZXggKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciByZW5kZXIgPSAkdGhpcy5nZXRSZW5kZXIoKTtcblx0XHRcdFx0dmFyIHdpZGdldHMgPSBbXTtcblx0XHRcdFx0dmFyIHRyYW5zYWN0aW9uID0ge307XG5cdFx0XHRcdHRyYW5zYWN0aW9uLmZvcm1faXRlbV9yZWNvcmQgPSB7fTtcblx0XHRcdFx0dmFyIHJvdyA9ICQoIGA8dHIgY2xhc3M9XCJ0YmxEYXRhV2hpdGUgcGF5c3R1Yl90cmFuc2FjdGlvbl9yb3dcIiBhbGlnbj1cInJpZ2h0XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGFsaWduPVwibGVmdFwiIGNvbHNwYW49XCIyXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cIlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGNvbHNwYW49XCIxXCIgY2xhc3M9XCJcIj48L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBjb2xzcGFuPVwiMVwiIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjFcIiBjbGFzcz1cImNlbGwgY29udHJvbC1pY29uXCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGNvbHNwYW49XCIxXCIgY2xhc3M9XCJjZWxsIGNvbnRyb2wtaWNvblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cInBsdXMtaWNvblwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cIm1pbnVzLWljb24gXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5gICk7XG5cdFx0XHRcdGRhdGEgPSBfLmlzQXJyYXkoIGRhdGEgKSA/IGRhdGFbMF0gOiBkYXRhO1xuXHRcdFx0XHR0cmFuc2FjdGlvbi5mb3JtX2l0ZW1fcmVjb3JkLmlkID0gKCBkYXRhLmlkICYmICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSA/IGRhdGEuaWQgOiAnJztcblx0XHRcdFx0dmFyIHBheV9zdHViX3N0YXR1c19pZCA9ICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhdHVzX2lkO1xuXHRcdFx0XHR2YXIgaXNfYWRkID0gZmFsc2U7XG5cdFx0XHRcdGlmICggISR0aGlzLnBhcmVudF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgJiYgISR0aGlzLnBhcmVudF9jb250cm9sbGVyLmNvcGllZF9yZWNvcmRfaWQgKSB7XG5cdFx0XHRcdFx0aXNfYWRkID0gdHJ1ZTtcblx0XHRcdFx0XHRkYXRhLnN0YXR1c19pZCA9IDEwOyAvLzEwPVBlbmRpbmcgPT0gV2hlbiB1c2luZyBDb3B5IGFzIE5ldyBmb3JjZSB0cmFuc2FjdGlvbiBzdGF0dXNlcyB0byBwZW5kaW5nLlxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRGVzdGluYXRpb24gQWNjb3VudCAtIHdyaXRhYmxlXG5cdFx0XHRcdHZhciBhbGxvd2VkX3N0YXR1c2VzID0gWzEwXTtcblx0XHRcdFx0aWYgKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc19hZGQgPT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YWxsb3dlZF9zdGF0dXNlcy5wdXNoKCAyMCApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fcmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fcmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUmVtaXR0YW5jZURlc3RpbmF0aW9uQWNjb3VudCxcblx0XHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudCcsXG5cdFx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0XHRmaWVsZDogJ3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZCcsXG5cdFx0XHRcdFx0ZGVmYXVsdF9hcmdzOiB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJfZGF0YToge1xuXHRcdFx0XHRcdFx0XHR1c2VyX2lkOiAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQsXG5cdFx0XHRcdFx0XHRcdHN0YXR1c19pZDogYWxsb3dlZF9zdGF0dXNlc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fcmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lucHV0LnNldFZhbHVlKCBkYXRhLnJlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pZCA/IGRhdGEucmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lkIDogJycgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pbnB1dC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLnBhcmVudF9jb250cm9sbGVyLnZhbGlkYXRlKCk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvLyByZWFkYWJsZVxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF90ZXh0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9yZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnRfdGV4dC5UVGV4dCggeyBmaWVsZDogJ3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudCcgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fcmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X3RleHQuc2V0VmFsdWUoIGRhdGEucmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50ID8gZGF0YS5yZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnQgOiAnJyApO1xuXG5cdFx0XHRcdC8vIE5vdGUgLSB3cml0YWJsZVxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX25vdGVfaW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfaW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ25vdGUnLCB3aWR0aDogMzAwLCBkaXNwbGF5X25hOiBmYWxzZSB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ub3RlX2lucHV0LnNldFZhbHVlKCBkYXRhLm5vdGUgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfaW5wdXQuYXR0ciggJ2VkaXRhYmxlJywgdHJ1ZSApO1xuXHRcdFx0XHQvL3JlYWRhYmxlXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fbm90ZV90ZXh0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ub3RlX3RleHQuVFRleHQoIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGRpc3BsYXlfbmE6IGZhbHNlIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX25vdGVfdGV4dC5zZXRWYWx1ZSggZGF0YS5kZXNjcmlwdGlvbiApO1xuXG5cdFx0XHRcdC8vIFRyYW5zYWN0aW9uIFN0YXR1cyAtIHdyaXRhYmxlXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fc3RhdHVzX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3N0YXR1c19pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3N0YXR1c19pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci50cmFuc2FjdGlvbl9zdGF0dXNfYXJyYXkgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3N0YXR1c19pbnB1dC5zZXRWYWx1ZSggZGF0YS5zdGF0dXNfaWQgPyBkYXRhLnN0YXR1c19pZCA6ICcnICk7XG5cdFx0XHRcdGZvcm1faXRlbV9zdGF0dXNfaW5wdXQuc2V0RW5hYmxlZCggKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID09ICdjb3B5X2FzX25ldycgKSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fc3RhdHVzX2lucHV0LnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMucGFyZW50X2NvbnRyb2xsZXIudmFsaWRhdGUoKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0XHQvLyByZWFkYWJsZVxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX3N0YXR1c190ZXh0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9zdGF0dXNfdGV4dC5UVGV4dCggeyBmaWVsZDogJ3N0YXR1cycgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fc3RhdHVzX3RleHQuc2V0VmFsdWUoIGRhdGEuc3RhdHVzID8gZGF0YS5zdGF0dXMgOiAnJyApO1xuXG5cdFx0XHRcdC8vIFRyYW5zYWN0aW9uIERhdGUgLSB3cml0YWJsZVxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX3RyYW5zYWN0aW9uX2RhdGVfaW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cdFx0XHRcdGZvcm1faXRlbV90cmFuc2FjdGlvbl9kYXRlX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAndHJhbnNhY3Rpb25fZGF0ZScgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fdHJhbnNhY3Rpb25fZGF0ZV9pbnB1dC5zZXRWYWx1ZSggZGF0YS50cmFuc2FjdGlvbl9kYXRlID8gZGF0YS50cmFuc2FjdGlvbl9kYXRlIDogJycgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3RyYW5zYWN0aW9uX2RhdGVfaW5wdXQuYXR0ciggJ2VkaXRhYmxlJywgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggIWRhdGFbJ3RyYW5zYWN0aW9uX2RhdGUnXSApIHtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fdHJhbnNhY3Rpb25fZGF0ZV9pbnB1dC5zZXRWYWx1ZSggJHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZWRpdF92aWV3X3VpX2RpYy50cmFuc2FjdGlvbl9kYXRlLmdldFZhbHVlKCkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvcm1faXRlbV90cmFuc2FjdGlvbl9kYXRlX2lucHV0LnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMucGFyZW50X2NvbnRyb2xsZXIudmFsaWRhdGUoKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0XHQvLyByZWFkYWJsZVxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2NvbmZpcm1hdGlvbl9udW1iZXJfdGV4dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fY29uZmlybWF0aW9uX251bWJlcl90ZXh0LlRUZXh0KCB7IGZpZWxkOiAndHJhbnNhY3Rpb25fZGF0ZScgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fY29uZmlybWF0aW9uX251bWJlcl90ZXh0LnNldFZhbHVlKCBkYXRhLnRyYW5zYWN0aW9uX2RhdGUgPyBkYXRhLnRyYW5zYWN0aW9uX2RhdGUgOiAnJyApO1xuXG5cdFx0XHRcdC8vIEFtb3VudCAtIHdyaXRhYmxlXG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1fYW1vdW50X2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2Ftb3VudCcsIHdpZHRoOiA2MCB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuc2V0VmFsdWUoIGRhdGEuYW1vdW50ID8gR2xvYmFsLnJlbW92ZVRyYWlsaW5nWmVyb3MoIGRhdGEuYW1vdW50ICkgOiAnJyApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X2lucHV0LnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdFx0JHRoaXMucGFyZW50X2NvbnRyb2xsZXIudmFsaWRhdGUoKTtcblx0XHRcdFx0XHQkdGhpcy5jYWxjVHJhbnNhY3Rpb25Ub3RhbHMoKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X2lucHV0LmF0dHIoICdlZGl0YWJsZScsIHRydWUgKTtcblx0XHRcdFx0Ly8gcmVhZGFibGVcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9hbW91bnRfdGV4dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1fYW1vdW50X3RleHQuVFRleHQoIHsgZmllbGQ6ICdhbW91bnQnIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF90ZXh0LnNldFZhbHVlKCBkYXRhLmFtb3VudCA/IEdsb2JhbC5yZW1vdmVUcmFpbGluZ1plcm9zKCBkYXRhLmFtb3VudCApIDogJycgKTtcblxuXHRcdFx0XHRpZiAoICFkYXRhLnN0YXR1c19pZCApIHtcblx0XHRcdFx0XHRkYXRhLnN0YXR1c19pZCA9IDEwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAkdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc0VkaXRNb2RlKCkgKSB7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pbnB1dC5zZXRFbmFibGVkKCBkYXRhLnN0YXR1c19pZCA9PSAxMCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV90cmFuc2FjdGlvbl9kYXRlX2lucHV0LnNldEVuYWJsZWQoIGRhdGEuc3RhdHVzX2lkID09IDEwICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2Ftb3VudF9pbnB1dC5zZXRSZWFkT25seSggZGF0YS5zdGF0dXNfaWQgIT0gMTAgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fbm90ZV9pbnB1dC5zZXRSZWFkT25seSggZGF0YS5zdGF0dXNfaWQgIT0gMTAgKTtcblx0XHRcdFx0XHQvL2Zvcm1faXRlbV9zdGF0dXNfaW5wdXQuc2V0VmFsdWUoIDEwICk7IC8vc2V0IHRvIHBlbmRpbmdcblx0XHRcdFx0XHRmb3JtX2l0ZW1fc3RhdHVzX2lucHV0LnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9zdGF0dXMgaXMgbm90IHBlbmRpbmcuIGRpc2FibGUgZWRpdGluZyB0aGUgcm93LlxuXHRcdFx0XHRcdGZvcm1faXRlbV9yZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnRfaW5wdXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fdHJhbnNhY3Rpb25fZGF0ZV9pbnB1dC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9hbW91bnRfaW5wdXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1fbm90ZV9pbnB1dC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9zdGF0dXNfaW5wdXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBmb3JtX2l0ZW1fbm90ZV90ZXh0OyAvL29ubHkgd2F5IHRvIGhpZGUgdGhlIE4vQSBpcyB0byBzd2FwIGluIGEgVGV4dCBGaWVsZCBpbiB2aWV3IG1vZGUuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2FjdHVhbGx5IGFwcGVuZCB0aGUgcm93IHRvIHRoZSBET01cblx0XHRcdFx0dHJhbnNhY3Rpb25bZm9ybV9pdGVtX3JlbWl0dGFuY2VfZGVzdGluYXRpb25fYWNjb3VudF9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9yZW1pdHRhbmNlX2Rlc3RpbmF0aW9uX2FjY291bnRfaW5wdXQ7XG5cdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAwICkuYXBwZW5kKCBmb3JtX2l0ZW1fcmVtaXR0YW5jZV9kZXN0aW5hdGlvbl9hY2NvdW50X2lucHV0ICk7XG5cblx0XHRcdFx0dHJhbnNhY3Rpb25bZm9ybV9pdGVtX25vdGVfaW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fbm90ZV9pbnB1dDtcblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIGZvcm1faXRlbV9ub3RlX2lucHV0ICk7XG5cblx0XHRcdFx0dHJhbnNhY3Rpb25bZm9ybV9pdGVtX3N0YXR1c19pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9zdGF0dXNfaW5wdXQ7XG5cdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAyICkuYXBwZW5kKCBmb3JtX2l0ZW1fc3RhdHVzX2lucHV0ICk7XG5cblx0XHRcdFx0dHJhbnNhY3Rpb25bZm9ybV9pdGVtX3RyYW5zYWN0aW9uX2RhdGVfaW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fdHJhbnNhY3Rpb25fZGF0ZV9pbnB1dDtcblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDMgKS5hcHBlbmQoIGZvcm1faXRlbV90cmFuc2FjdGlvbl9kYXRlX2lucHV0ICk7XG5cblx0XHRcdFx0dHJhbnNhY3Rpb25bZm9ybV9pdGVtX2Ftb3VudF9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9hbW91bnRfaW5wdXQ7XG5cdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCA0ICkuYXBwZW5kKCBmb3JtX2l0ZW1fYW1vdW50X2lucHV0ICk7XG5cblx0XHRcdFx0d2lkZ2V0cy5wdXNoKCB0cmFuc2FjdGlvbiApO1xuXHRcdFx0XHRpZiAoIHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdFx0cm93Lmluc2VydEFmdGVyKCAkKCByZW5kZXIgKS5maW5kKCAndHInICkuZXEoIGluZGV4ICkgKTtcblx0XHRcdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCAoIGluZGV4ICksIDAsIHdpZGdldHMgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoIHJvdyApO1xuXHRcdFx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB3aWRnZXRzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICR0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzRWRpdE1vZGUoKSA9PSB0cnVlICkge1xuXHRcdFx0XHRcdHZhciBtaW51c19pY29uID0gcm93LmZpbmQoICcubWludXMtaWNvbicgKTtcblx0XHRcdFx0XHRpZiAoIGRhdGEuc3RhdHVzX2lkICE9IDEwICkge1xuXHRcdFx0XHRcdFx0bWludXNfaWNvbi5yZW1vdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWludXNfaWNvbi5jbGljayggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluc2lkZVRyYW5zYWN0aW9uRWRpdG9yUmVtb3ZlUm93KCByb3cgKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFyIHBsdXNfaWNvbiA9IHJvdy5maW5kKCAnLnBsdXMtaWNvbicgKTtcblx0XHRcdFx0XHRwbHVzX2ljb24uY2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0JHRoaXMuaW5zaWRlVHJhbnNhY3Rpb25FZGl0b3JBZGRSb3coIHt9LCAkKCB0aGlzICkucGFyZW50cyggJ3RyJyApLmluZGV4KCkgKTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8jMjU0OCAtIERvIG5vdCBzaG93IHBsdXMgYnV0dG9uIGluIHZpZXcgbW9kZSAod2hlbiBwYXlzdHViIGlzIG1hcmtlZCBwYWlkKVxuXHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmxhc3QoKS5maW5kKCAnLm1pbnVzLWljb24nICkucmVtb3ZlKCk7XG5cdFx0XHRcdFx0Ly9pZiAoIGRhdGEuc3RhdHVzX2lkICE9IDIwICkge1xuXHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmxhc3QoKS5maW5kKCAnLnBsdXMtaWNvbicgKS5yZW1vdmUoKTtcblx0XHRcdFx0XHQvL31cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpbnNpZGVfcGF5X3N0dWJfZW50cnlfZWRpdG9yX2Rpdi5hcHBlbmQoIHRoaXMuZWRpdG9yICk7XG5cdH1cblxuXHRidWlsZFNlYXJjaEZpZWxkcygpIHtcblx0XHRzdXBlci5idWlsZFNlYXJjaEZpZWxkcygpO1xuXHRcdHRoaXMuc2VhcmNoX2ZpZWxkcyA9IFtcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQYXkgU3R1YiBTdGF0dXMnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdzdGF0dXNfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1BheSBTdHViIFR5cGUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd0eXBlX2lkJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbXBsb3llZSBTdGF0dXMnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd1c2VyX3N0YXR1c19pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1BheSBQZXJpb2QnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdwYXlfcGVyaW9kX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5X3BlcmlvZCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5UGVyaW9kLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUGF5cm9sbCBSdW4nICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdydW5faWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VtcGxveWVlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAndXNlcl9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUaXRsZScgKSxcblx0XHRcdFx0ZmllbGQ6ICd0aXRsZV9pZCcsXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iX3RpdGxlJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyVGl0bGUsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ3VycmVuY3knICksXG5cdFx0XHRcdGZpZWxkOiAnY3VycmVuY3lfaWQnLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2N1cnJlbmN5Jyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElDdXJyZW5jeSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdHcm91cCcgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdncm91cF9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3RyZWVfY29sdW1uJyxcblx0XHRcdFx0dHJlZV9tb2RlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdEZWZhdWx0IEJyYW5jaCcgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ2RlZmF1bHRfYnJhbmNoX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYnJhbmNoJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElCcmFuY2gsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdEZWZhdWx0IERlcGFydG1lbnQnICksXG5cdFx0XHRcdGZpZWxkOiAnZGVmYXVsdF9kZXBhcnRtZW50X2lkJyxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9kZXBhcnRtZW50Jyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElEZXBhcnRtZW50LFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ291bnRyeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ2NvdW50cnknLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUHJvdmluY2UvU3RhdGUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdwcm92aW5jZScsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0NpdHknICksXG5cdFx0XHRcdGZpZWxkOiAnY2l0eScsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDcmVhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnY3JlYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdVcGRhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAndXBkYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9IClcblx0XHRdO1xuXHR9XG5cblx0b25DdXN0b21Db250ZXh0Q2xpY2soIGlkICkge1xuXHRcdHN3aXRjaCAoIGlkICkge1xuXHRcdFx0Y2FzZSAndGltZXNoZWV0Jzpcblx0XHRcdGNhc2UgJ3NjaGVkdWxlJzpcblx0XHRcdGNhc2UgJ3BheV9zdHViX2FtZW5kbWVudCc6XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdGNhc2UgJ2VtcGxveWVlX3BheV9zdHVicyc6XG5cdFx0XHRjYXNlICdlbXBsb3llcl9wYXlfc3R1YnMnOlxuXHRcdFx0Y2FzZSAnZ2VuZXJhdGVfcGF5X3N0dWInOlxuXHRcdFx0Y2FzZSAnZWRpdF9wYXlfcGVyaW9kJzpcblx0XHRcdGNhc2UgJ2V4cG9ydF9leGNlbCc6XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl90cmFuc2FjdGlvbic6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aGlzLm9uTmF2aWdhdGlvbkNsaWNrKCBpZCApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRvblZpZXdDbGljayggZWRpdF9yZWNvcmQsIG5vUmVmcmVzaFVJICkge1xuXHRcdHRoaXMub25OYXZpZ2F0aW9uQ2xpY2soICd2aWV3JyApO1xuXHR9XG5cblx0b25SZXBvcnRQcmludENsaWNrKCBrZXkgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5O1xuXG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXG5cdFx0dmFyIGlkcyA9IFtdO1xuXG5cdFx0dmFyIHVzZXJfaWRzID0gW107XG5cblx0XHR2YXIgYmFzZV9kYXRlO1xuXG5cdFx0dmFyIHBheV9wZXJpb2RfaWRzID0gW107XG5cblx0XHRpZiAoICR0aGlzLmVkaXRfdmlldyAmJiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0aWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKTtcblx0XHRcdHVzZXJfaWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCApO1xuXHRcdFx0cGF5X3BlcmlvZF9pZHMucHVzaCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5wYXlfcGVyaW9kX2lkICk7XG5cdFx0XHRiYXNlX2RhdGUgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cdFx0XHQkLmVhY2goIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXksIGZ1bmN0aW9uKCBpbmRleCwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBncmlkX3NlbGVjdGVkX3JvdyA9ICR0aGlzLmdldFJlY29yZEZyb21HcmlkQnlJZCggdmFsdWUgKTtcblx0XHRcdFx0aWRzLnB1c2goIGdyaWRfc2VsZWN0ZWRfcm93LmlkICk7XG5cdFx0XHRcdHVzZXJfaWRzLnB1c2goIGdyaWRfc2VsZWN0ZWRfcm93LnVzZXJfaWQgKTtcblx0XHRcdFx0cGF5X3BlcmlvZF9pZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cucGF5X3BlcmlvZF9pZCApO1xuXHRcdFx0XHRiYXNlX2RhdGUgPSBncmlkX3NlbGVjdGVkX3Jvdy5zdGFydF9kYXRlO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciBhcmdzID0geyBmaWx0ZXJfZGF0YTogeyBpZDogaWRzIH0gfTtcblx0XHR2YXIgcG9zdF9kYXRhID0geyAwOiBhcmdzLCAxOiB0cnVlLCAyOiBrZXkgfTtcblxuXHRcdHRoaXMuZG9Gb3JtSUZyYW1lQ2FsbCggcG9zdF9kYXRhICk7XG5cdH1cblxuXHRvbk5hdmlnYXRpb25DbGljayggaWNvbk5hbWUgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXk7XG5cblx0XHR2YXIgZmlsdGVyID0ge307XG5cblx0XHR2YXIgaWRzID0gW107XG5cblx0XHR2YXIgdXNlcl9pZHMgPSBbXTtcblxuXHRcdHZhciBiYXNlX2RhdGU7XG5cblx0XHR2YXIgcGF5X3BlcmlvZF9pZHMgPSBbXTtcblxuXHRcdGlmICggJHRoaXMuZWRpdF92aWV3ICYmICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRpZHMucHVzaCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApO1xuXHRcdFx0dXNlcl9pZHMucHVzaCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkICk7XG5cdFx0XHRwYXlfcGVyaW9kX2lkcy5wdXNoKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnBheV9wZXJpb2RfaWQgKTtcblx0XHRcdGJhc2VfZGF0ZSA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Z3JpZF9zZWxlY3RlZF9pZF9hcnJheSA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfcm93ID0gJHRoaXMuZ2V0UmVjb3JkRnJvbUdyaWRCeUlkKCB2YWx1ZSApO1xuXHRcdFx0XHRpZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cuaWQgKTtcblx0XHRcdFx0dXNlcl9pZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cudXNlcl9pZCApO1xuXHRcdFx0XHRwYXlfcGVyaW9kX2lkcy5wdXNoKCBncmlkX3NlbGVjdGVkX3Jvdy5wYXlfcGVyaW9kX2lkICk7XG5cdFx0XHRcdGJhc2VfZGF0ZSA9IGdyaWRfc2VsZWN0ZWRfcm93LnN0YXJ0X2RhdGU7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIGFyZ3MgPSB7IGZpbHRlcl9kYXRhOiB7IGlkOiBpZHMgfSB9O1xuXG5cdFx0dmFyIHBvc3RfZGF0YTtcblxuXHRcdHN3aXRjaCAoIGljb25OYW1lICkge1xuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdGlmICggdXNlcl9pZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLm9wZW5FZGl0VmlldyggdGhpcywgJ0VtcGxveWVlJywgdXNlcl9pZHNbMF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2VkaXRfcGF5X3BlcmlvZCc6XG5cdFx0XHRcdGlmICggcGF5X3BlcmlvZF9pZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLm9wZW5FZGl0VmlldyggdGhpcywgJ1BheVBlcmlvZHMnLCBwYXlfcGVyaW9kX2lkc1swXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndGltZXNoZWV0Jzpcblx0XHRcdFx0aWYgKCB1c2VyX2lkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdGZpbHRlci51c2VyX2lkID0gdXNlcl9pZHNbMF07XG5cdFx0XHRcdFx0ZmlsdGVyLmJhc2VfZGF0ZSA9IGJhc2VfZGF0ZTtcblx0XHRcdFx0XHRHbG9iYWwuYWRkVmlld1RhYiggJHRoaXMudmlld0lkLCAkLmkxOG4uXyggJ1BheSBTdHVicycgKSwgd2luZG93LmxvY2F0aW9uLmhyZWYgKTtcblx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLmdvVG9WaWV3KCAnVGltZVNoZWV0JywgZmlsdGVyICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzY2hlZHVsZSc6XG5cdFx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdFx0XHR2YXIgaW5jbHVkZV91c2VycyA9IHsgdmFsdWU6IHVzZXJfaWRzIH07XG5cdFx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YS5pbmNsdWRlX3VzZXJfaWRzID0gaW5jbHVkZV91c2Vycztcblx0XHRcdFx0ZmlsdGVyLnNlbGVjdF9kYXRlID0gYmFzZV9kYXRlO1xuXHRcdFx0XHRHbG9iYWwuYWRkVmlld1RhYiggdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnUGF5IFN0dWJzJyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLmdvVG9WaWV3KCAnU2NoZWR1bGUnLCBmaWx0ZXIgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl9hbWVuZG1lbnQnOlxuXHRcdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEgPSB7fTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB1c2VyX2lkc1swXTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLnBheV9wZXJpb2RfaWQgPSBwYXlfcGVyaW9kX2lkc1swXTtcblx0XHRcdFx0R2xvYmFsLmFkZFZpZXdUYWIoIHRoaXMudmlld0lkLCAkLmkxOG4uXyggJ1BheSBTdHVicycgKSwgd2luZG93LmxvY2F0aW9uLmhyZWYgKTtcblx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1BheVN0dWJBbWVuZG1lbnQnLCBmaWx0ZXIgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdnZW5lcmF0ZV9wYXlfc3R1Yic6XG5cblx0XHRcdFx0aWYgKCB1c2VyX2lkcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRcdFx0ZmlsdGVyLnVzZXJfaWQgPSB1c2VyX2lkc1swXTtcblx0XHRcdFx0fSBlbHNlIGlmICggdXNlcl9pZHMubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0XHRmaWx0ZXIudXNlcl9pZCA9IHVzZXJfaWRzO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBwYXlfcGVyaW9kX2lkcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRcdFx0ZmlsdGVyLnBheV9wZXJpb2RfaWQgPSBbcGF5X3BlcmlvZF9pZHNbMF1dO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBwYXlfcGVyaW9kX2lkcy5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRcdGZpbHRlci5wYXlfcGVyaW9kX2lkID0gcGF5X3BlcmlvZF9pZHM7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmlsdGVyLnBheV9wZXJpb2RfaWQgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIub3BlbldpemFyZCggJ0dlbmVyYXRlUGF5U3R1YldpemFyZCcsIGZpbHRlciwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd2aWV3Jzpcblx0XHRcdFx0Ly9JZiBpdHMgYSBwYXlyb2xsIGFkbWluIG9yIGhpZ2hlciwgYnkgZGVmYXVsdCBtYWtlIHRoZSBWaWV3IGJ1dHRvbiBzaG93IGVtcGxveWVyIHBheSBzdHViLlxuXHRcdFx0XHRpZiAoICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoICdwYXlfc3R1YicsICd2aWV3JyApIHx8IFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncGF5X3N0dWInLCAndmlld19jaGlsZCcgKSApICkge1xuXHRcdFx0XHRcdHBvc3RfZGF0YSA9IHsgMDogYXJncywgMTogZmFsc2UsIDI6ICdwZGYnLCAzOiBmYWxzZSB9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBvc3RfZGF0YSA9IHsgMDogYXJncywgMTogZmFsc2UsIDI6ICdwZGYnLCAzOiB0cnVlIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5kb0Zvcm1JRnJhbWVDYWxsKCBwb3N0X2RhdGEgKTtcblx0XHRcdFx0JCgpLlRGZWVkYmFjaygge1xuXHRcdFx0XHRcdHNvdXJjZTogJ1ZpZXcnLCAvLyB2aWV3SWQgR292ZXJubWVudERvY3VtZW50IHdpbGwgYmUgcHJlcGVuZGVkIGluIFRGZWVkYmFjayBmdW5jdGlvbnMuXG5cdFx0XHRcdFx0ZGVsYXk6IDUwMDBcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2VtcGxveWVlX3BheV9zdHVicyc6XG5cdFx0XHRcdHBvc3RfZGF0YSA9IHsgMDogYXJncywgMTogZmFsc2UsIDI6ICdwZGYnLCAzOiB0cnVlIH07XG5cdFx0XHRcdHRoaXMuZG9Gb3JtSUZyYW1lQ2FsbCggcG9zdF9kYXRhICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZW1wbG95ZXJfcGF5X3N0dWJzJzpcblx0XHRcdFx0cG9zdF9kYXRhID0geyAwOiBhcmdzLCAxOiBmYWxzZSwgMjogJ3BkZicsIDM6IGZhbHNlIH07XG5cdFx0XHRcdHRoaXMuZG9Gb3JtSUZyYW1lQ2FsbCggcG9zdF9kYXRhICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGF5X3N0dWJfdHJhbnNhY3Rpb24nOlxuXHRcdFx0XHRmaWx0ZXIgPSB7fTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB7IHZhbHVlOiB1c2VyX2lkcyB9O1xuXHRcdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEucGF5X3BlcmlvZF9pZCA9IHsgdmFsdWU6IHBheV9wZXJpb2RfaWRzIH07XG5cblx0XHRcdFx0R2xvYmFsLmFkZFZpZXdUYWIoIHRoaXMudmlld0lkLCAkLmkxOG4uXyggJ1BheSBTdHVicycgKSwgd2luZG93LmxvY2F0aW9uLmhyZWYgKTtcblx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1BheVN0dWJUcmFuc2FjdGlvbicsIGZpbHRlciApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2V4cG9ydF9leGNlbCc6XG5cdFx0XHRcdHRoaXMub25FeHBvcnRDbGljayggJ2V4cG9ydCcgKyB0aGlzLmFwaS5rZXlfbmFtZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RpcmVjdF9kZXBvc2l0Jzpcblx0XHRcdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRcdFx0ZmlsdGVyX2RhdGE6IHtcblx0XHRcdFx0XHRcdHBheV9zdHViX2lkOiB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIub3BlbldpemFyZENvbnRyb2xsZXIoICdQcm9jZXNzVHJhbnNhY3Rpb25zV2l6YXJkQ29udHJvbGxlcicsIGRhdGEgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0b25SZXBvcnRNZW51Q2xpY2soIGlkICkge1xuXHRcdHRoaXMub25SZXBvcnRQcmludENsaWNrKCBpZCApO1xuXHR9XG5cblx0ZG9Gb3JtSUZyYW1lQ2FsbCggcG9zdERhdGEgKSB7XG5cdFx0R2xvYmFsLkFQSUZpbGVEb3dubG9hZCggdGhpcy5hcGkuY2xhc3NOYW1lLCAnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lLCBwb3N0RGF0YSApO1xuXHR9XG5cblx0Z2V0UGF5U3R1YlRhYkh0bWwoKSB7XG5cdFx0cmV0dXJuIGA8ZGl2IGlkPVwidGFiX3BheV9zdHViXCIgY2xhc3M9XCJlZGl0LXZpZXctdGFiLW91dHNpZGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZWRpdC12aWV3LXRhYlwiIGlkPVwidGFiX3BheV9zdHViX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlyc3QtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2Vjb25kLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc2lkZS1wYXktc3R1Yi1lbnRyeS1lZGl0b3ItZGl2IGZ1bGwtd2lkdGgtY29sdW1uXCIgc3R5bGU9XCJmbG9hdDogbGVmdDsgcG9zaXRpb246IHJlbGF0aXZlXCI+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+YDtcblx0fVxuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3436\n")}}]);