1 line
152 KiB
JavaScript
1 line
152 KiB
JavaScript
(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["my_account-expense-ExpenseAuthorizationViewController","filebrowser-TImageBrowser"],{8326:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("/* provided dependency */ var jQuery = __webpack_require__(9755);\n( function( $ ) {\n\n\t$.fn.TImageBrowser = function( options ) {\n\t\tGlobal.addCss( 'global/widgets/filebrowser/TImageBrowser.css' );\n\t\tvar opts = $.extend( {}, $.fn.TImageBrowser.defaults, options );\n\n\t\tvar $this = this;\n\t\tvar field;\n\t\tvar id = 'file_browser';\n\t\tvar name = 'filedata';\n\t\tvar browser;\n\n\t\tvar accept_filter = '';\n\n\t\tvar default_width = 177;\n\t\tvar default_height = 42;\n\t\tvar enabled = true;\n\n\t\tthis.setEnabled = function( val ) {\n\t\t\tenabled = val;\n\n\t\t\tvar btn = this.find( '.browser-form input' );\n\n\t\t\tif ( !val ) {\n\t\t\t\tbtn.attr( 'disabled', true );\n\t\t\t\tbtn.removeClass( 'disable-element' ).addClass( 'disable-element' );\n\t\t\t} else {\n\t\t\t\tbtn.removeAttr( 'disabled' );\n\t\t\t\tbtn.removeClass( 'disable-element' );\n\t\t\t}\n\n\t\t};\n\n\t\tthis.clearErrorStyle = function() {\n\n\t\t};\n\n\t\tthis.getFileName = function() {\n\n\t\t\treturn browser.val();\n\t\t};\n\n\t\tthis.getField = function() {\n\t\t\treturn field;\n\t\t};\n\n\t\tthis.setEnableDelete = function( val ) {\n\t\t\tvar image = $this.find( '.image' );\n\t\t\tif ( !val ) {\n\t\t\t\timage.removeAttr( 'enable-delete' );\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\timage.attr( 'enable-delete', 1 );\n\t\t\t}\n\t\t};\n\n\t\tthis.getValue = function() {\n\t\t\tvar form_data;\n\t\t\tif ( browser && browser.val() ) {\n\n\t\t\t\tif ( typeof FormData == 'undefined' ) {\n\t\t\t\t\tform_data = $this.find( '.browser-form' );\n\t\t\t\t} else {\n\t\t\t\t\tform_data = new FormData( $( $this.find( '.browser-form' ) )[0] );\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tform_data = null;\n\t\t\t}\n\n\t\t\treturn form_data;\n\t\t};\n\n\t\tthis.getImageSrc = function() {\n\t\t\tvar image = $this.find( '.image' );\n\t\t\treturn image.attr( 'src' );\n\t\t};\n\n\t\tthis.setImage = function( val ) {\n\t\t\tvar image = $this.find( '.image' );\n\n\t\t\tif ( !val ) {\n\t\t\t\timage.attr( 'src', '' );\n\t\t\t\timage.hide();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar d = new Date();\n\t\t\timage.hide();\n\t\t\timage.attr( 'src', val + '&t=' + d.getTime() );\n\t\t\timage.css( 'height', 'auto' );\n\t\t\timage.css( 'width', 'auto' );\n\n\t\t};\n\n\t\tvar onImageLoad = function( image ) {\n\n\t\t\tvar image_height = $( image ).height() > 0 ? $( image ).height() : image.naturalHeight;\n\t\t\tvar image_width = $( image ).width() > 0 ? $( image ).width() : image.naturalWidth;\n\n\t\t\tif ( image_height > default_height ) {\n\t\t\t\t$( image ).css( 'height', default_height );\n\n\t\t\t}\n\n\t\t\tif ( image_width > default_width ) {\n\t\t\t\t$( image ).css( 'width', default_width );\n\t\t\t\t$( image ).css( 'height', 'auto' );\n\t\t\t}\n\n\t\t\t$this.trigger( 'setSize' );\n\n\t\t\tif ( image_height < 5 ) {\n\t\t\t\t$( image ).hide();\n\t\t\t} else {\n\t\t\t\t$( image ).show();\n\t\t\t}\n\t\t};\n\n\t\tthis.setValue = function( val ) {\n\n\t\t\tif ( !val ) {\n\t\t\t\tval = '';\n\t\t\t}\n\n\t\t};\n\n\t\tthis.each( function() {\n\t\t\tvar o = $.meta ? $.extend( {}, opts, $( this ).data() ) : opts;\n\n\t\t\tfield = o.field;\n\n\t\t\t// var $this = this;\n\n\t\t\tif ( o.default_width > 0 ) {\n\t\t\t\tdefault_width = o.default_width;\n\t\t\t}\n\n\t\t\tif ( o.default_height > 0 ) {\n\t\t\t\tdefault_height = o.default_height;\n\t\t\t}\n\n\t\t\tif ( Global.isSet( o.name ) ) {\n\t\t\t\tname = o.name;\n\t\t\t}\n\n\t\t\tif ( Global.isSet( accept_filter ) ) {\n\t\t\t\taccept_filter = o.accept_filter;\n\t\t\t}\n\n\t\t\tbrowser = $( this ).find( '.browser' );\n\t\t\tvar image = $( this ).find( '.image' );\n\t\t\timage.hide();\n\t\t\timage.on( 'load', function() {\n\t\t\t\tonImageLoad( this );\n\n\t\t\t} );\n\n\t\t\tif ( accept_filter ) {\n\t\t\t\tbrowser.attr( 'accept', accept_filter );\n\t\t\t} else {\n\t\t\t\taccept_filter = 'image/*';\n\t\t\t\tbrowser.attr( 'accept', 'image/*' );\n\t\t\t}\n\n\t\t\tbrowser.attr( 'id', id );\n\t\t\tbrowser.attr( 'name', name );\n\n\t\t\tif ( Global.isSet( o.changeHandler ) ) {\n\n\t\t\t\t$this.bind( 'imageChange', o.changeHandler );\n\t\t\t}\n\t\t\tif ( Global.isSet( o.deleteImageHandler ) ) {\n\t\t\t\tthis.find( '.file-browser' ).on( 'deleteClick', function() {\n\t\t\t\t\to.deleteImageHandler();\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tbrowser.bind( 'change', function() {\n\t\t\t\timage.hide();\n\n\t\t\t\tif ( typeof FileReader != 'undefined' ) {\n\n\t\t\t\t\tvar files = !!this.files ? this.files : [];\n\n\t\t\t\t\t// If no files were selected, or no FileReader support, return\n\t\t\t\t\tif ( !files.length || !window.FileReader ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( accept_filter === 'image/*' ) {\n\t\t\t\t\t\t// Create a new instance of the FileReader\n\t\t\t\t\t\tvar reader = new FileReader();\n\n\t\t\t\t\t\t// Read the local file as a DataURL\n\t\t\t\t\t\treader.readAsDataURL( files[0] );\n\n\t\t\t\t\t\t// When loaded, set image data as background of div\n\t\t\t\t\t\treader.onloadend = function() {\n\t\t\t\t\t\t\tvar url = this.result;\n\t\t\t\t\t\t\timage.attr( 'src', url );\n\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$this.trigger( 'imageChange', [$this] );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\treturn this;\n\n\t};\n\n\t$.fn.TImageBrowser.defaults = {};\n\t$.fn.TImageBrowser.html_template = `\n\t<div class=\"file-browser\">\n\t\t<img class=\"image\">\n\t\t<form enctype=\"multipart/form-data\" class=\"browser-form\">\n\t\t\t<input name=\"filedata\" class=\"browser\" type=\"file\"/>\n\t\t</form>\n\t</div>\n\t`;\n\n} )( jQuery );//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMyNi5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7O0FBRUE7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdDQUFnQzs7QUFFaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxLQUFLOztBQUVMLElBQUk7O0FBRUo7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsR0FBRyxNQUFNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L2dsb2JhbC93aWRnZXRzL2ZpbGVicm93c2VyL1RJbWFnZUJyb3dzZXIuanM/MjAyOSJdLCJzb3VyY2VzQ29udGVudCI6WyIoIGZ1bmN0aW9uKCAkICkge1xuXG5cdCQuZm4uVEltYWdlQnJvd3NlciA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdEdsb2JhbC5hZGRDc3MoICdnbG9iYWwvd2lkZ2V0cy9maWxlYnJvd3Nlci9USW1hZ2VCcm93c2VyLmNzcycgKTtcblx0XHR2YXIgb3B0cyA9ICQuZXh0ZW5kKCB7fSwgJC5mbi5USW1hZ2VCcm93c2VyLmRlZmF1bHRzLCBvcHRpb25zICk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBmaWVsZDtcblx0XHR2YXIgaWQgPSAnZmlsZV9icm93c2VyJztcblx0XHR2YXIgbmFtZSA9ICdmaWxlZGF0YSc7XG5cdFx0dmFyIGJyb3dzZXI7XG5cblx0XHR2YXIgYWNjZXB0X2ZpbHRlciA9ICcnO1xuXG5cdFx0dmFyIGRlZmF1bHRfd2lkdGggPSAxNzc7XG5cdFx0dmFyIGRlZmF1bHRfaGVpZ2h0ID0gNDI7XG5cdFx0dmFyIGVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdGVuYWJsZWQgPSB2YWw7XG5cblx0XHRcdHZhciBidG4gPSB0aGlzLmZpbmQoICcuYnJvd3Nlci1mb3JtIGlucHV0JyApO1xuXG5cdFx0XHRpZiAoICF2YWwgKSB7XG5cdFx0XHRcdGJ0bi5hdHRyKCAnZGlzYWJsZWQnLCB0cnVlICk7XG5cdFx0XHRcdGJ0bi5yZW1vdmVDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKS5hZGRDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ0bi5yZW1vdmVBdHRyKCAnZGlzYWJsZWQnICk7XG5cdFx0XHRcdGJ0bi5yZW1vdmVDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKTtcblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR0aGlzLmNsZWFyRXJyb3JTdHlsZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0cmV0dXJuIGJyb3dzZXIudmFsKCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0RmllbGQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmaWVsZDtcblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRFbmFibGVEZWxldGUgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0dmFyIGltYWdlID0gJHRoaXMuZmluZCggJy5pbWFnZScgKTtcblx0XHRcdGlmICggIXZhbCApIHtcblx0XHRcdFx0aW1hZ2UucmVtb3ZlQXR0ciggJ2VuYWJsZS1kZWxldGUnICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGltYWdlLmF0dHIoICdlbmFibGUtZGVsZXRlJywgMSApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZm9ybV9kYXRhO1xuXHRcdFx0aWYgKCBicm93c2VyICYmIGJyb3dzZXIudmFsKCkgKSB7XG5cblx0XHRcdFx0aWYgKCB0eXBlb2YgRm9ybURhdGEgPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdFx0Zm9ybV9kYXRhID0gJHRoaXMuZmluZCggJy5icm93c2VyLWZvcm0nICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9ybV9kYXRhID0gbmV3IEZvcm1EYXRhKCAkKCAkdGhpcy5maW5kKCAnLmJyb3dzZXItZm9ybScgKSApWzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3JtX2RhdGEgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm9ybV9kYXRhO1xuXHRcdH07XG5cblx0XHR0aGlzLmdldEltYWdlU3JjID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW1hZ2UgPSAkdGhpcy5maW5kKCAnLmltYWdlJyApO1xuXHRcdFx0cmV0dXJuIGltYWdlLmF0dHIoICdzcmMnICk7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2V0SW1hZ2UgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0dmFyIGltYWdlID0gJHRoaXMuZmluZCggJy5pbWFnZScgKTtcblxuXHRcdFx0aWYgKCAhdmFsICkge1xuXHRcdFx0XHRpbWFnZS5hdHRyKCAnc3JjJywgJycgKTtcblx0XHRcdFx0aW1hZ2UuaGlkZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBkID0gbmV3IERhdGUoKTtcblx0XHRcdGltYWdlLmhpZGUoKTtcblx0XHRcdGltYWdlLmF0dHIoICdzcmMnLCB2YWwgKyAnJnQ9JyArIGQuZ2V0VGltZSgpICk7XG5cdFx0XHRpbWFnZS5jc3MoICdoZWlnaHQnLCAnYXV0bycgKTtcblx0XHRcdGltYWdlLmNzcyggJ3dpZHRoJywgJ2F1dG8nICk7XG5cblx0XHR9O1xuXG5cdFx0dmFyIG9uSW1hZ2VMb2FkID0gZnVuY3Rpb24oIGltYWdlICkge1xuXG5cdFx0XHR2YXIgaW1hZ2VfaGVpZ2h0ID0gJCggaW1hZ2UgKS5oZWlnaHQoKSA+IDAgPyAkKCBpbWFnZSApLmhlaWdodCgpIDogaW1hZ2UubmF0dXJhbEhlaWdodDtcblx0XHRcdHZhciBpbWFnZV93aWR0aCA9ICQoIGltYWdlICkud2lkdGgoKSA+IDAgPyAkKCBpbWFnZSApLndpZHRoKCkgOiBpbWFnZS5uYXR1cmFsV2lkdGg7XG5cblx0XHRcdGlmICggaW1hZ2VfaGVpZ2h0ID4gZGVmYXVsdF9oZWlnaHQgKSB7XG5cdFx0XHRcdCQoIGltYWdlICkuY3NzKCAnaGVpZ2h0JywgZGVmYXVsdF9oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGltYWdlX3dpZHRoID4gZGVmYXVsdF93aWR0aCApIHtcblx0XHRcdFx0JCggaW1hZ2UgKS5jc3MoICd3aWR0aCcsIGRlZmF1bHRfd2lkdGggKTtcblx0XHRcdFx0JCggaW1hZ2UgKS5jc3MoICdoZWlnaHQnLCAnYXV0bycgKTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMudHJpZ2dlciggJ3NldFNpemUnICk7XG5cblx0XHRcdGlmICggaW1hZ2VfaGVpZ2h0IDwgNSApIHtcblx0XHRcdFx0JCggaW1hZ2UgKS5oaWRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKCBpbWFnZSApLnNob3coKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdGlmICggIXZhbCApIHtcblx0XHRcdFx0dmFsID0gJyc7XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvID0gJC5tZXRhID8gJC5leHRlbmQoIHt9LCBvcHRzLCAkKCB0aGlzICkuZGF0YSgpICkgOiBvcHRzO1xuXG5cdFx0XHRmaWVsZCA9IG8uZmllbGQ7XG5cblx0XHRcdC8vIHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRcdGlmICggby5kZWZhdWx0X3dpZHRoID4gMCApIHtcblx0XHRcdFx0ZGVmYXVsdF93aWR0aCA9IG8uZGVmYXVsdF93aWR0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvLmRlZmF1bHRfaGVpZ2h0ID4gMCApIHtcblx0XHRcdFx0ZGVmYXVsdF9oZWlnaHQgPSBvLmRlZmF1bHRfaGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5uYW1lICkgKSB7XG5cdFx0XHRcdG5hbWUgPSBvLm5hbWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBhY2NlcHRfZmlsdGVyICkgKSB7XG5cdFx0XHRcdGFjY2VwdF9maWx0ZXIgPSBvLmFjY2VwdF9maWx0ZXI7XG5cdFx0XHR9XG5cblx0XHRcdGJyb3dzZXIgPSAkKCB0aGlzICkuZmluZCggJy5icm93c2VyJyApO1xuXHRcdFx0dmFyIGltYWdlID0gJCggdGhpcyApLmZpbmQoICcuaW1hZ2UnICk7XG5cdFx0XHRpbWFnZS5oaWRlKCk7XG5cdFx0XHRpbWFnZS5vbiggJ2xvYWQnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0b25JbWFnZUxvYWQoIHRoaXMgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGFjY2VwdF9maWx0ZXIgKSB7XG5cdFx0XHRcdGJyb3dzZXIuYXR0ciggJ2FjY2VwdCcsIGFjY2VwdF9maWx0ZXIgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjY2VwdF9maWx0ZXIgPSAnaW1hZ2UvKic7XG5cdFx0XHRcdGJyb3dzZXIuYXR0ciggJ2FjY2VwdCcsICdpbWFnZS8qJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRicm93c2VyLmF0dHIoICdpZCcsIGlkICk7XG5cdFx0XHRicm93c2VyLmF0dHIoICduYW1lJywgbmFtZSApO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5jaGFuZ2VIYW5kbGVyICkgKSB7XG5cblx0XHRcdFx0JHRoaXMuYmluZCggJ2ltYWdlQ2hhbmdlJywgby5jaGFuZ2VIYW5kbGVyICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5kZWxldGVJbWFnZUhhbmRsZXIgKSApIHtcblx0XHRcdFx0dGhpcy5maW5kKCAnLmZpbGUtYnJvd3NlcicgKS5vbiggJ2RlbGV0ZUNsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0by5kZWxldGVJbWFnZUhhbmRsZXIoKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJyb3dzZXIuYmluZCggJ2NoYW5nZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpbWFnZS5oaWRlKCk7XG5cblx0XHRcdFx0aWYgKCB0eXBlb2YgRmlsZVJlYWRlciAhPSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0XHRcdHZhciBmaWxlcyA9ICEhdGhpcy5maWxlcyA/IHRoaXMuZmlsZXMgOiBbXTtcblxuXHRcdFx0XHRcdC8vIElmIG5vIGZpbGVzIHdlcmUgc2VsZWN0ZWQsIG9yIG5vIEZpbGVSZWFkZXIgc3VwcG9ydCwgcmV0dXJuXG5cdFx0XHRcdFx0aWYgKCAhZmlsZXMubGVuZ3RoIHx8ICF3aW5kb3cuRmlsZVJlYWRlciApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGFjY2VwdF9maWx0ZXIgPT09ICdpbWFnZS8qJyApIHtcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsZVJlYWRlclxuXHRcdFx0XHRcdFx0dmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cblx0XHRcdFx0XHRcdC8vIFJlYWQgdGhlIGxvY2FsIGZpbGUgYXMgYSBEYXRhVVJMXG5cdFx0XHRcdFx0XHRyZWFkZXIucmVhZEFzRGF0YVVSTCggZmlsZXNbMF0gKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBsb2FkZWQsIHNldCBpbWFnZSBkYXRhIGFzIGJhY2tncm91bmQgb2YgZGl2XG5cdFx0XHRcdFx0XHRyZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB1cmwgPSB0aGlzLnJlc3VsdDtcblx0XHRcdFx0XHRcdFx0aW1hZ2UuYXR0ciggJ3NyYycsIHVybCApO1xuXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMudHJpZ2dlciggJ2ltYWdlQ2hhbmdlJywgWyR0aGlzXSApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdCQuZm4uVEltYWdlQnJvd3Nlci5kZWZhdWx0cyA9IHt9O1xuXHQkLmZuLlRJbWFnZUJyb3dzZXIuaHRtbF90ZW1wbGF0ZSA9IGBcblx0PGRpdiBjbGFzcz1cImZpbGUtYnJvd3NlclwiPlxuXHRcdDxpbWcgY2xhc3M9XCJpbWFnZVwiPlxuXHRcdDxmb3JtIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgY2xhc3M9XCJicm93c2VyLWZvcm1cIj5cblx0XHRcdDxpbnB1dCBuYW1lPVwiZmlsZWRhdGFcIiBjbGFzcz1cImJyb3dzZXJcIiB0eXBlPVwiZmlsZVwiLz5cblx0XHQ8L2Zvcm0+XG5cdDwvZGl2PlxuXHRgO1xuXG59ICkoIGpRdWVyeSApOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8326\n")},936:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ExpenseAuthorizationViewController\": () => (/* binding */ ExpenseAuthorizationViewController)\n/* harmony export */ });\n/* harmony import */ var _global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8326);\n/* harmony import */ var _global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\nclass ExpenseAuthorizationViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#expense_authorization_view_container',\n\n\t\t\t// _required_files: ['TImageBrowser'],\n\n\t\t\thierarchy_level_array: null,\n\t\t\tstatus_array: null,\n\n\t\t\tpayment_method_array: null,\n\n\t\t\tsub_document_view_controller: null,\n\n\t\t\tdocument_object_type_id: null,\n\n\t\t\trelatedExpenseArray: null,\n\n\t\t\tpunch_tag_api: null,\n\t\t\tdefault_punch_tag: [],\n\t\t\tprevious_punch_tag_selection: [],\n\n\t\t\tdocument_api: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'ExpenseAuthorizationEditView.html';\n\t\tthis.permission_id = 'user_expense';\n\t\tthis.viewId = 'ExpenseAuthorization';\n\t\tthis.script_name = 'ExpenseAuthorizationView';\n\t\tthis.table_name_key = 'user_expense';\n\t\tthis.context_menu_name = $.i18n._( 'Expense (Authorizations)' );\n\t\tthis.navigation_label = $.i18n._( 'Expense' );\n\t\tthis.api = TTAPI.APIUserExpense;\n\t\tthis.message_control_api = TTAPI.APIMessageControl;\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\tthis.job_api = TTAPI.APIJob;\n\t\t\tthis.job_item_api = TTAPI.APIJobItem;\n\t\t\tthis.punch_tag_api = TTAPI.APIPunchTag;\n\t\t}\n\n\t\tthis.document_api = TTAPI.APIDocument;\n\t\tthis.authorization_api = TTAPI.APIAuthorization;\n\n\t\tthis.document_object_type_id = 400;\n\n\t\tthis.hierarchy_type_id = 200;\n\t\tthis.event_bus = new TTEventBus({ view_id: this.viewId });\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tvar args = {};\n\t\tvar filter_data = {};\n\t\tfilter_data.type_id = [10, 20, 30];\n\t\tfilter_data.user_id = [this.current_edit_record ? this.current_edit_record.user_id : LocalCacheData.getLoginUser().id];\n\n\t\tthis.initDropDownOption( 'status' );\n\t\tthis.initDropDownOption( 'payment_method' );\n\n\t\targs.filter_data = filter_data;\n\n\t\tif ( Global.isSet( $this.basic_search_field_ui_dic['expense_policy_id'] ) ) {\n\t\t\t$this.basic_search_field_ui_dic['expense_policy_id'].setDefaultArgs( args );\n\t\t}\n\n\t\tvar res = this.api.getHierarchyLevelOptions( [-1], { async: false } );\n\t\tvar data = res.getResult();\n\t\t$this['hierarchy_level_array'] = Global.buildRecordArray( data );\n\t\tif ( Global.isSet( $this.basic_search_field_ui_dic['hierarchy_level'] ) ) {\n\t\t\t$this.basic_search_field_ui_dic['hierarchy_level'].setSourceData( Global.buildRecordArray( data ) );\n\t\t}\n\t}\n\n\tgetSubViewFilter( filter ) {\n\n\t\tif ( filter.length === 0 ) {\n\t\t\tfilter = {};\n\t\t}\n\n\t\tfilter['parent_id'] = 0;\n\t\tif ( !Global.isSet( filter.hierarchy_level ) ) {\n\t\t\tfilter['hierarchy_level'] = 1;\n\t\t\tthis.filter_data['hierarchy_level'] = {\n\t\t\t\tfield: 'hierarchy_level',\n\t\t\t\tid: '',\n\t\t\t\tvalue: this.basic_search_field_ui_dic['hierarchy_level'].getValue( true )\n\t\t\t};\n\t\t}\n\n\t\treturn filter;\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\t\tvar column_filter = {};\n\t\t//Issue #2897 - The column user_id is required for the navigation icons to function properly while not in edit view.\n\t\tcolumn_filter.user_id = true;\n\n\t\treturn this._getFilterColumnsFromDisplayColumns( column_filter, true );\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\tgroups: {\n\t\t\t\tauthorization: {\n\t\t\t\t\tlabel: $.i18n._( 'Authorization' ),\n\t\t\t\t\tid: this.script_name + 'Authorization'\n\t\t\t\t},\n\t\t\t\tobjects: {\n\t\t\t\t\tlabel: $.i18n._( 'Objects' ),\n\t\t\t\t\tid: this.script_name + 'objects'\n\t\t\t\t}\n\t\t\t},\n\t\t\texclude: ['default'],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View' ),\n\t\t\t\t\tid: 'edit', // copy pasted this value, but 'edit' seems deliberate. clicking this icon opens edit view, not view. Double check before changing.\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-visibility_black_24dp',\n\t\t\t\t\tshow_on_right_click: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Cancel' ),\n\t\t\t\t\tid: 'cancel',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Authorize' ),\n\t\t\t\t\tid: 'authorization',\n\t\t\t\t\tvue_icon: 'tticon tticon-thumb_up_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Pass' ),\n\t\t\t\t\tid: 'pass',\n\t\t\t\t\tvue_icon: 'tticon tticon-redo_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Decline' ),\n\t\t\t\t\tid: 'decline',\n\t\t\t\t\tvue_icon: 'tticon tticon-thumb_down_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\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._( 'Export' ),\n\t\t\t\t\tid: 'export_excel',\n\t\t\t\t\tgroup: 'other',\n\t\t\t\t\tvue_icon: 'tticon tticon-file_upload_black_24dp',\n\t\t\t\t\tmenu_align: 'right'\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]\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 'authorization':\n\t\t\t\tthis.setDefaultMenuAuthorizationIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.setDefaultMenuPassIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.setDefaultMenuDeclineIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.setDefaultMenuAuthorizationRequestIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tthis.setDefaultMenuAuthorizationTimesheetIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.setDefaultMenuAuthorizationExpenseIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\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 'edit_employee':\n\t\t\t\tthis.setDefaultMenuEditIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetDefaultMenuEditIcon( context_btn, grid_selected_length ) {\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\tsetDefaultMenuSaveIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t}\n\n\tsetDefaultMenuAuthorizationIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.is_viewing ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuPassIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.is_viewing ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuDeclineIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.is_viewing ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'authorization':\n\t\t\t\tthis.setEditMenuAuthorizationIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.setEditMenuPassIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.setEditMenuDeclineIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.setEditMenuAuthorizationRequestIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tthis.setEditMenuAuthorizationTimesheetIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.setEditMenuAuthorizationExpenseIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setEditMenuNavEditIcon( context_btn, 'user' );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetDefaultMenuAuthorizationRequestIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tsetDefaultMenuAuthorizationTimesheetIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tsetDefaultMenuAuthorizationExpenseIcon( context_btn, grid_selected_length ) {\n\t\tif ( !( Global.getProductEdition() >= 25 ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tsetEditMenuAuthorizationRequestIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuAuthorizationTimesheetIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuAuthorizationExpenseIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuEditIcon( context_btn ) {\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetEditMenuSaveIcon( context_btn ) {\n\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t}\n\n\tsetEditMenuAuthorizationIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuPassIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuDeclineIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'authorization':\n\t\t\t\tthis.onAuthorizationClick();\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.onPassClick();\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.onDeclineClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.onAuthorizationRequestClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tthis.onAuthorizationTimesheetClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.onAuthorizationExpenseClick();\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\tcase 'schedule':\n\t\t\tcase 'edit_employee':\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onNavigationClick( id );\n\t\t\t\tbreak;\n\t\t}\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\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\tbase_date = $this.current_edit_record.incurred_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\tbase_date = grid_selected_row.incurred_date;\n\t\t\t} );\n\t\t}\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, $.i18n._( 'Employee' ), user_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._( 'Authorization - Expense' ), 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._( 'Authorization - Expense' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'Schedule', 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\n\t\t}\n\t}\n\n\tonAuthorizationExpenseClick() {\n\t\tIndexViewController.goToView( 'ExpenseAuthorization' );\n\t}\n\n\tonAuthorizationTimesheetClick() {\n\t\tIndexViewController.goToView( 'TimeSheetAuthorization' );\n\t}\n\n\tonAuthorizationRequestClick() {\n\t\tIndexViewController.goToView( 'RequestAuthorization' );\n\t}\n\n\tonAuthorizationClick() {\n\t\tvar $this = this;\n\t\tvar record = this.current_edit_record;\n\t\trecord = this.uniformVariable( record );\n\n\t\tthis.api['set' + this.api.key_name]( record, false, false, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tif ( result.isValid() ) { //Don't try to authorize the expense if validation fails, display the validation errors and stop.\n\t\t\t\t\t$this.is_changed = false;\n\t\t\t\t\t$this.onSaveResult( result );\n\n\t\t\t\t\t$this.setAuthorization( true );\n\t\t\t\t} else {\n\t\t\t\t\t$this.setErrorMenu();\n\t\t\t\t\t$this.setErrorTips( result, true );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tonPassClick() {\n\t\tvar $this = this;\n\t\tthis.onRightArrowClick( function() {\n\t\t\t$this.search();\n\t\t\t$().TFeedback( {\n\t\t\t\tsource: 'Pass'\n\t\t\t} );\n\t\t} );\n\t}\n\n\tonDeclineClick() {\n\t\tthis.setAuthorization( false );\n\t}\n\n\tsetAuthorization( authorized ) {\n\t\tvar $this = this;\n\t\tvar filter = {};\n\n\t\tfilter.authorized = authorized ? authorized : false;\n\t\tfilter.object_id = $this.current_edit_record.id;\n\t\tfilter.object_type_id = 200;\n\n\t\t$this.authorization_api['setAuthorization']( [filter], {\n\t\t\tonResult: function( res ) {\n\t\t\t\t$this.updateBadgeCount();\n\t\t\t\t$this.onRightArrowClick( function() {\n\t\t\t\t\t$this.search( false );\n\t\t\t\t\tvar authorization_value = authorized ? 'Authorize' : 'Decline';\n\t\t\t\t\t$().TFeedback( {\n\t\t\t\t\t\tsource: authorization_value\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_expense': {\n\t\t\t\t'label': $.i18n._( 'Expense' ),\n\t\t\t\t'html_template': this.getExpenseAuthorizationTabHtml(),\n\t\t\t\t'is_multi_column': true\n\t\t\t},\n\t\t\t'tab_attachment': true,\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUserExpense,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_expense',\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_expense = this.edit_view_tab.find( '#tab_expense' );\n\n\t\tvar tab_expense_column1 = tab_expense.find( '.first-column' );\n\t\tvar tab_expense_column2 = tab_expense.find( '.second-column' );\n\t\t//var authorization_history_column = tab_expense.find( '.auth-history-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_expense_column1 );\n\t\tthis.edit_view_tabs[0].push( tab_expense_column2 );\n\t\t//this.edit_view_tabs[0].push( authorization_history_column );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\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\tfield: 'user_id',\n\t\t\tset_empty: false\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_expense_column1, '', null );\n\n\t\t// Date Incurred\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'incurred_date' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date Incurred' ), form_item_input, tab_expense_column1, '', null );\n\n\t\t// Description\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'description', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_expense_column1, '', null, null, true );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t// Payment Method\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'payment_method_id' } );\n\t\tform_item_input.setSourceData( $this.payment_method_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Payment Method' ), form_item_input, tab_expense_column1 );\n\n\t\t// Type\n\n\t\tvar args = {};\n\t\tvar filter_data = {};\n\t\tfilter_data.type_id = [10, 20, 30];\n\t\tfilter_data.user_id = [LocalCacheData.getLoginUser().id];\n\n\t\targs.filter_data = filter_data;\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIExpensePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_expense_policy',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'expense_policy_id'\n\t\t} );\n\n\t\tform_item_input.setDefaultArgs( args );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_expense_column1 );\n\n\t\t//Amount\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'gross_amount1' } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box \\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + $.i18n._( 'Reimburse' ) + ' </span>' );\n\n\t\tvar widget_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\twidget_checkbox.TCheckbox( { field: 'is_reimbursable' } );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\twidgetContainer.append( widget_checkbox );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Amount' ), [form_item_input, widget_checkbox], tab_expense_column1, '', widgetContainer );\n\n\t\t// Currency\n\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_expense_column2, '' );\n\n\t\t//Branch\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_branch',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'branch_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_expense_column2 );\n\n\t\t//Department\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_department',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'department_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_expense_column2 );\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t//Job\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_expense_column2, '', widgetContainer );\n\n\t\t\t// Task\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_item_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_item_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_expense_column2, '', widgetContainer );\n\n\t\t\t//Punch Tag\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tget_real_data_on_multi: true,\n\t\t\t\tsetRealValueCallBack: ( ( punch_tags, get_real_data ) => {\n\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags, get_real_data );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'punch_tag_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tpunch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );\n\t\t\tpunch_tag_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( punch_tag_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Punch Tags' ), [form_item_input, punch_tag_coder], tab_expense_column2, '', widgetContainer, true );\n\n\t\t}\n\t\t//Tags\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TAG_INPUT );\n\n\t\tform_item_input.TTagInput( { field: 'tag', object_type_id: 930 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), form_item_input, tab_expense_column2, '', null, null, true );\n\n\t\t//Inside editor\n\n\t\tvar inside_editor_div = tab_expense.find( '.inside-editor-div' );\n\n\t\tvar inside_editor_args = {\n\t\t\tname: $.i18n._( 'Attachment Name' ),\n\t\t\taction: $.i18n._( 'Action' )\n\t\t};\n\n\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\t\tthis.editor.InsideEditor( {\n\t\t\taddRow: this.insideEditorAddRow,\n\t\t\tremoveRow: this.insideEditorRemoveRow,\n\t\t\tgetValue: this.insideEditorGetValue,\n\t\t\tsetValue: this.insideEditorSetValue,\n\t\t\tparent_controller: this,\n\t\t\tapi: this.document_api,\n\t\t\trender: getRender(),\n\t\t\trender_args: inside_editor_args,\n\t\t\trender_inline_html: true,\n\t\t\trow_render: getRowRender(),\n\n\t\t} );\n\n\t\tfunction getRender() {\n\t\t\treturn `\n\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t<tr class=\"title\" style=\"font-weight: bold\">\n\t\t\t\t\t<td style=\"width: 400px\"><%= name %></td>\n\t\t\t\t\t<td style=\"width: 300px\"><%= action %></td>\n\t\t\t\t</tr>\n\t\t\t</table>`;\n\t\t}\n\n\t\tfunction getRowRender() {\n\t\t\treturn `\n\t\t\t<tr class=\"inside-editor-row data-row\">\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t<button class=\"plus-icon\" onclick=\"\"></button>\n\t\t\t\t</td>\n\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t<button class=\"minus-icon \" onclick=\"\"></button>\n\t\t\t\t</td>\n\t\t\t</tr>`;\n\t\t}\n\n\t\tinside_editor_div.append( this.editor );\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Type' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'expense_policy_id',\n\t\t\t\tlayout_name: 'global_expense_policy',\n\t\t\t\tapi_class: TTAPI.APIExpensePolicy,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Tags' ),\n\t\t\t\tfield: 'tag',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tin_column: 1,\n\t\t\t\tobject_type_id: 930,\n\t\t\t\tform_item_type: FormItemType.TAG_INPUT\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Hierarchy Level' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tmultiple: false,\n\t\t\t\tset_any: false,\n\t\t\t\tfield: 'hierarchy_level',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\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];\n\t}\n\n\tsearch( set_default_menu, page_action, page_number, callBack ) {\n\t\tthis.updateBadgeCount();\n\t\tsuper.search( set_default_menu, page_action, page_number, callBack );\n\t}\n\n\tupdateBadgeCount() {\n\t\tthis.event_bus.emit( 'tt_topbar', 'profile_pending_counts', { //Update \"My Profile\" badge.\n\t\t\tobject_types: [ 'notification', 'expense_authorization' ]\n\t\t} );\n\t}\n\n\t/* jshint ignore:start */\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\n\t\t\tif ( !this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'user_id':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\twidget.setEnabled( false );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'gross_amount1':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record['gross_amount'] );\n\t\t\t\t\t\t//this.onFormItemChange(widget); //This causes onFormItemChange() to trigger for gross_amount1, causing the related expense policies to be recalculated when the view appears. So if the user specified custom taxes they will get wiped out.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'gross_amount':\n\t\t\t\t\tcase 'net_amount':\n\t\t\t\t\t\t// Don't do anything.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_item_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = { job_id: this.current_edit_record.job_id };\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'punch_tag_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t\tthis.previous_punch_tag_selection = this.current_edit_record[key];\n\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = $this.getPunchTagFilterData();\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'punch_tag_quick_search':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_quick_search':\n//\t\t\t\t\t\twidget.setValue( this.current_edit_record['job_id'] ? this.current_edit_record['job_id'] : 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_item_quick_search':\n//\t\t\t\t\t\twidget.setValue( this.current_edit_record['job_item_id'] ? this.current_edit_record['job_item_id'] : 0 );\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\n\t\tthis.setEditViewDataDone();\n\t}\n\n\t/* jshint ignore:end */\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tvar $this = this;\n\t\tthis.is_changed = false;\n\n\t\tif ( Global.isSet( this.current_edit_record['related_expenses'] ) ) {\n\t\t\tthis.relatedExpenseArray = this.current_edit_record['related_expenses'];\n\t\t\tthis.setRelatedExpense( this.current_edit_record['related_expenses'] );\n\t\t}\n\n\t\tthis.initInsideEditorData();\n\t\tAuthorizationHistory.init( this );\n\t}\n\n\tinitInsideEditorData() {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\t$this.editor.removeAllRows();\n\t\t\t$this.editor.getDefaultData();\n\t\t} else {\n\n\t\t\targs.filter_data.object_type_id = this.document_object_type_id;\n\t\t\targs.filter_data.object_id = this.current_edit_record['id'];\n\n\t\t\t$this.api['getAttachment']( args, {\n\t\t\t\tonResult: function( res ) {\n\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 = res.getResult();\n\t\t\t\t\t$this.editor.setValue( data );\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\t}\n\n\tinsideEditorSetValue( val ) {\n\t\tvar len = val.length;\n\t\tthis.removeAllRows();\n\n\t\tif ( len > 0 ) {\n\t\t\tfor ( var i = 0; i < val.length; i++ ) {\n\t\t\t\tif ( Global.isSet( val[i] ) ) {\n\t\t\t\t\tvar row = val[i];\n\t\t\t\t\tthis.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.getDefaultData();\n\t\t}\n\t}\n\n\tinsideEditorGetValue() {\n\n\t\tvar len = this.rows_widgets_array.length;\n\n\t\tvar result = [];\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\tif ( Global.isSet( row.file ) ) {\n\t\t\t\tvar data = {\n\t\t\t\t\tname: row.name.getValue(),\n\t\t\t\t\tfile: row.file.getValue()\n\t\t\t\t};\n\n\t\t\t\tif ( data.name === 'No File Selected' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tresult.push( data );\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tinsideEditorAddRow( data, index ) {\n\n\t\tif ( !data ) {\n\t\t\tthis.getDefaultData( index );\n\t\t} else {\n\t\t\tvar row = this.getRowRender(); //Get Row render\n\t\t\tvar render = this.getRender(); //get render, should be a table\n\t\t\tvar widgets = {}; //Save each row's widgets\n\n\t\t\t//Build row widgets\n\n\t\t\t// Attachment Name\n\t\t\tvar form_item_file_name = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_file_name.TText( { field: 'name', width: 400 } );\n\t\t\tform_item_file_name.setValue( data.name ? data.name : $.i18n._( 'No File Selected' ) );\n\t\t\tform_item_file_name.setClassStyle( data.name ? { 'font-weight': 'bold' } : null );\n\t\t\twidgets[form_item_file_name.getField()] = form_item_file_name;\n\t\t\trow.children().eq( 0 ).append( form_item_file_name );\n\t\t\tform_item_file_name.attr( 'document_id', ( data.id && this.parent_controller.current_edit_record.id ) ? data.id : '' );\n\t\t\tform_item_file_name.attr( 'document_revision_id', ( data.document_revision_id && this.parent_controller.current_edit_record.id ) ? data.document_revision_id : '' );\n\n\t\t\t// Action\n\t\t\tif ( data.name ) {\n\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tvar download = $( '<button type=\\'button\\' class=\\' download-button t-button widget-right-label\\'>' + $.i18n._( 'Download' ) + '</button>' );\n\t\t\t\tvar view = $( '<button type=\\'button\\' class=\\' view-button t-button widget-right-label\\'>' + $.i18n._( 'View' ) + '</button>' );\n\n\t\t\t\tdownload.attr( {\n\t\t\t\t\tdocument_id: data.id,\n\t\t\t\t\tdocument_revision_id: data.document_revision_id,\n\t\t\t\t\tobject_type_id: this.parent_controller.document_object_type_id\n\t\t\t\t} );\n\t\t\t\tview.attr( {\n\t\t\t\t\tdocument_id: data.id,\n\t\t\t\t\tdocument_revision_id: data.document_revision_id,\n\t\t\t\t\tobject_type_id: this.parent_controller.document_object_type_id\n\t\t\t\t} );\n\n\t\t\t\tdownload.bind( 'click', this.parent_controller.downloadFile );\n\t\t\t\tview.bind( 'click', this.parent_controller.downloadFile );\n\n\t\t\t\twidgetContainer.append( download );\n\t\t\t\twidgetContainer.append( view );\n\n\t\t\t\trow.children().eq( 1 ).append( widgetContainer );\n\t\t\t} else {\n\t\t\t\tvar form_item_file = Global.loadWidgetByName( FormItemType.IMAGE_BROWSER );\n\n\t\t\t\tvar $this = this.file_browser = form_item_file.TImageBrowser( {\n\t\t\t\t\t\tfield: 'file',\n\t\t\t\t\t\tname: 'filedata',\n\t\t\t\t\t\taccept_filter: '*',\n\t\t\t\t\t\tchangeHandler: function( a ) {\n\t\t\t\t\t\t\tvar file_name = $( this ).find( '.browser' )[0].files[0].name;\n\t\t\t\t\t\t\tform_item_file_name.setValue( file_name );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\twidgets[form_item_file.getField()] = form_item_file;\n\t\t\t\trow.children().eq( 1 ).append( form_item_file );\n\n\t\t\t}\n\n\t\t\t// end\n\n\t\t\tif ( typeof index != 'undefined' ) {\n\n\t\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\t\tthis.rows_widgets_array.splice( ( index ), 0, widgets );\n\n\t\t\t} else {\n\t\t\t\t$( render ).append( row );\n\t\t\t\tthis.rows_widgets_array.push( widgets );\n\t\t\t}\n\n\t\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\t\trow.find( '.control-icon' ).hide();\n\t\t\t}\n\n\t\t\tthis.addIconsEvent( row ); //Bind event to add and minus icon\n\t\t\tthis.removeLastRowLine();\n\t\t}\n\t}\n\n\tdownloadFile() {\n\n\t\tvar $this = $( this );\n\t\tvar document_attachment_id = $this.attr( 'document_id' );\n\t\tvar document_revision_id = $this.attr( 'document_revision_id' );\n\t\tvar object_type_id = $this.attr( 'object_type_id' );\n\n\t\tvar url = ServiceCaller.getURLByObjectType( 'file_download' ) + '&object_type=document&parent_id=' + document_attachment_id + '&parent_object_type_id=' + object_type_id + '&object_id=' + document_revision_id;\n\n\t\tGlobal.APIFileDownload( null, null, null, url );\n\t}\n\n\tinsideEditorRemoveRow( row ) {\n\n\t\tvar $this = this;\n\t\tvar index = row[0].rowIndex - 1;\n\t\tvar remove_id = this.rows_widgets_array[index].name.attr( 'document_id' );\n\t\tif ( TTUUID.isUUID( remove_id ) && remove_id != TTUUID.zero_id && remove_id != TTUUID.not_exist_id ) {\n\t\t\tTAlertManager.showConfirmAlert( 'Are you sure to ' + this.rows_widgets_array[index].name.text() + '?', null, function( result ) {\n\t\t\t\tif ( result ) {\n\t\t\t\t\tProgressBar.showOverlay();\n\t\t\t\t\t$this.api['delete' + $this.api.key_name]( remove_id, {\n\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\t\t\trow.remove();\n\t\t\t\t\t\t\t\t$this.rows_widgets_array.splice( index, 1 );\n\t\t\t\t\t\t\t\tif ( $this.rows_widgets_array.length === 0 ) {\n\t\t\t\t\t\t\t\t\t$this.getDefaultData();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\trow.remove();\n\t\t\t$this.rows_widgets_array.splice( index, 1 );\n\t\t}\n\n\t\tthis.removeLastRowLine();\n\t}\n\n\t/* jshint ignore:start */\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\n\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\n\t\tthis.current_edit_record[key] = c_value;\n\n\t\tvar amount_arr = false;\n\n\t\tswitch ( key ) {\n\t\t\tcase 'expense_policy_id':\n\t\t\tcase 'gross_amount1':\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], amount_arr, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t{\n\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t$this.setRelatedExpense( $this.relatedExpenseArray );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'is_reimbursable':\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tamount_arr = this.relatedExpenseArray ? this.relatedExpenseArray : false;\n\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], amount_arr, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t{\n\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t$this.setRelatedExpense( $this.relatedExpenseArray );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'amount':\n\t\t\t\tvar related_expense_policy_id = target.attr( 'id' );\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tthis.relatedExpenseArray['taxes'][related_expense_policy_id]['amount'] = c_value;\n\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], this.relatedExpenseArray, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t{\n\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t$this.setRelatedExpenseData( $this.relatedExpenseArray, related_expense_policy_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'job_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id', { job_id: this.current_edit_record.job_id } );\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tif ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( target.getSelectItems() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );\n\t\t\t\t\t}\n\t\t\t\t\t$this.previous_punch_tag_selection = c_value;\n\t\t\t\t\t//Reset source data to make sure correct punch tags are always shown.\n\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_id'].setSourceData( null );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'user_id':\n\t\t\tcase 'branch_id':\n\t\t\tcase 'department_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_quick_search':\n\t\t\tcase 'job_item_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onJobQuickSearch( key, c_value );\n\n\t\t\t\t\t//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );\n\n\t\t\t\t\t//Don't validate immediately as onPunchTagQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\n\t/**\n\t * this just sets the subform data\n\t * should be called in most cases\n\t *\n\t * @param expenses\n\t */\n\tsetRelatedExpenseData( expenses, selected_related_expense_policy_id ) {\n\t\tvar tab_expense = this.edit_view_tab.find( '#tab_expense' );\n\t\tvar tab_expense_column3 = tab_expense.find( '.third-column' );\n\n\t\ttab_expense_column3.find( '#net_amount' ).val( expenses['net_amount'] );\n\t\ttab_expense_column3.find( '#gross_amount' ).val( expenses['gross_amount'] );\n\t\ttab_expense_column3.find( '#reimburse_amount' ).val( expenses['reimburse_amount'] );\n\n\t\tvar tax_inputs = tab_expense_column3.find( '.tax_input' );\n\t\tfor ( var n = 0; n < tax_inputs.length; n++ ) {\n\t\t\tvar el = $( tax_inputs[n] );\n\t\t\tif ( el.length > 0 ) {\n\t\t\t\tvar id = el.attr( 'id' );\n\t\t\t\tif ( !selected_related_expense_policy_id || selected_related_expense_policy_id != id ) {\n\t\t\t\t\tel.val( expenses['taxes'][id].amount );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t/**\n\t * rebuilds the entire subform ui\n\t * we need to call this when type changes or reimburse is checked to add and remove fields\n\t *\n\t * @param expenses\n\t */\n\tsetRelatedExpense( expenses ) {\n\n\t\t// Third column start\n\t\tvar tab_expense = this.edit_view_tab.find( '#tab_expense' );\n\t\tvar tab_expense_column3 = tab_expense.find( '.third-column' ).empty();\n\n\t\tif ( this.edit_view_tabs[0].length < 3 ) {\n\t\t\tthis.edit_view_tabs[0].push( tab_expense_column3 );\n\t\t}\n\n\t\tif ( !expenses ) {\n\t\t\texpenses = { net_amount: 0, gross_amount: 0, reimburse_amount: this.current_edit_record.reimburse_amount };\n\t\t}\n\n\t\tif ( expenses && expenses['taxes'] && Object.keys( expenses['taxes'] ).length > 0 ) {\n\t\t\t// Net Amount\n\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tform_item_input.TTextInput( { field: 'net_amount' } );\n\t\t\tform_item_input.setValue( expenses['net_amount'] );\n\t\t\tform_item_input.attr( 'id', 'net_amount' );\n\t\t\tform_item_input.setEnabled( false );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Net Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\n\t\t\tthis.edit_view_ui_dic['net_amount'].css( 'opacity', 1 );\n\n\t\t\tif ( expenses['taxes'] ) {\n\t\t\t\tfor ( var key in expenses['taxes'] ) {\n\t\t\t\t\tvar item = expenses['taxes'][key];\n\n\t\t\t\t\t// taxes\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\t\tform_item_input.TTextInput( { field: 'amount' } );\n\t\t\t\t\tform_item_input.setValue( item['amount'] );\n\t\t\t\t\tform_item_input.attr( 'id', item['expense_policy_id'] );\n\t\t\t\t\tform_item_input.addClass( 'tax_input' );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( item['expense_policy_name'] ), form_item_input, tab_expense_column3, '', null, true );\n\n\t\t\t\t\tthis.edit_view_ui_dic['amount'].css( 'opacity', 1 );\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Amount\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'gross_amount' } );\n\t\t\tform_item_input.setValue( expenses['gross_amount'] );\n\t\t\tform_item_input.attr( 'id', 'gross_amount' );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\n\t\t\tthis.edit_view_ui_dic['gross_amount'].css( 'opacity', 1 );\n\t\t}\n\n\t\t// Reimburse Amount\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'reimburse_amount' } );\n\t\tform_item_input.setValue( expenses['reimburse_amount'] );\n\t\tform_item_input.attr( 'id', 'reimburse_amount' );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Reimburse Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\n\t\tthis.edit_view_ui_dic['reimburse_amount'].css( 'opacity', 1 );\n\n\t\tthis.editFieldResize( 0 );\n\t}\n\n\tuniformVariable( records ) {\n\t\tif ( this.relatedExpenseArray ) {\n\t\t\trecords.related_expenses = this.relatedExpenseArray;\n\t\t\trecords.gross_amount = this.relatedExpenseArray.gross_amount;\n\t\t\trecords.net_amount = this.relatedExpenseArray.net_amount;\n\t\t\trecords.reimburse_amount = this.relatedExpenseArray.reimburse_amount;\n\t\t}\n\n\t\treturn records;\n\t}\n\n\t// onSaveAndContinueResult( result ) {\n\t//\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // as new\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onEditClick( $this.refresh_id, true );\n\t//\n\t// \t\t\t$this.onSaveAndContinueDone( result );\n\t//\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\t// onSaveAndNewResult: function( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // as new\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onAddClick( true );\n\t//\n\t// \t\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\tonCancelClick( force_no_confirm, cancel_all, callback ) {\n\t\t//Refresh grid on cancel as its not done during authorize/decline anymore.\n\t\tvar $this = this;\n\t\tsuper.onCancelClick( force_no_confirm, cancel_all, function() {\n\t\t\t//Since we are overriding the callback function to call this.search(), make sure the original callback is still called.\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\n\t\t\t$this.search();\n\t\t} );\n\t}\n\n\tonSaveAndCopyResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\n\t\t\t\t$this.onCopyAsNewClick();\n\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorTips( result );\n\t\t\t$this.setErrorMenu();\n\t\t}\n\t}\n\n\t// onSaveAndNextResult( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.onRightArrowClick();\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onSaveAndNextDone( result );\n\t//\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\tonSaveResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorMenu();\n\t\t\t$this.setErrorTips( result );\n\n\t\t}\n\t}\n\n\t/* jshint ignore:start */\n\tsaveInsideEditorData( callBack ) {\n\t\tvar $this = this;\n\t\tvar data = this.editor.getValue();\n\t\tvar files = data.length;\n\t\tif ( files > 0 ) {\n\t\t\tvar success = 0;\n\t\t\tfor ( var key in data ) {\n\t\t\t\tvar fileItem = data[key];\n\t\t\t\tif ( Global.isSet( fileItem.file ) ) {\n\n\t\t\t\t\tvar document_revision_id = this.api.addAttachment( fileItem.name, this.document_object_type_id, this.refresh_id, { async: false } ).getResult();\n\t\t\t\t\t$this.api.uploadFile( fileItem.file, 'object_type=document_revision&object_id=' + document_revision_id + '&parent_object_type_id=' + this.document_object_type_id, {} );\n\n\t\t\t\t\tsuccess++;\n\n\t\t\t\t} else {\n\t\t\t\t\tcallBack();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( success === files ) {\n\t\t\t\tcallBack();\n\t\t\t}\n\n\t\t} else {\n\t\t\tcallBack();\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\n\tuploadFile( document_result, file_data ) {\n\t\tvar document_revision_id = document_result.getResult();\n\t\tvar $this = this;\n\n\t\t$this.api.uploadFile( file_data, 'object_type=document_revision&object_id=' + document_revision_id, {\n\t\t\tonResult: function( upload_file_result ) {\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetExpenseAuthorizationTabHtml() {\n\t\treturn `<div id=\"tab_expense\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_expense_content_div\">\n\t\t\t\t\t\t<div class=\"first-column\"></div>\n\t\t\t\t\t\t<div class=\"second-column\"></div>\n\t\t\t\t\t\t<div class=\"third-column full-width-column border-column\"></div>\n\t\t\t\t\t\t<div class=\"inside-editor-div full-width-column\"></div>\n\t\t\t\t\t\t<div class=\"auth-history-column\">\n\t\t\t\t\t\t\t<div class=\"authorization-grid-div inside-grid full-width-column\">\n\t\t\t\t\t\t\t\t<div class=\"grid-top-border\"></div>\n\t\t\t\t\t\t\t\t<div class=\"grid-title separated-box\"></div>\n\t\t\t\t\t\t\t\t<table id=\"grid\"></table>\n\t\t\t\t\t\t\t\t<div class=\"bottom-div\">\n\t\t\t\t\t\t\t\t\t<div class=\"grid-bottom-border\"></div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTM2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQW9EOztBQUU3QztBQUNQLDJCQUEyQjtBQUMzQixFQUFFLENBQUM7QUFDSDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixDQUFDO0FBQzVCLDBCQUEwQixDQUFDO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DLHNCQUFzQjtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1REFBdUQsZUFBZTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRyxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLENBQUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLENBQUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esb0NBQW9DLENBQUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsQ0FBQztBQUNKO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLENBQUM7QUFDTjtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWEsQ0FBQztBQUNkO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxpQ0FBaUMseUJBQXlCO0FBQzFELDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsK0JBQStCLHNDQUFzQztBQUNyRSw2QkFBNkIsQ0FBQzs7QUFFOUI7O0FBRUE7QUFDQTs7QUFFQSwrQkFBK0IsNkJBQTZCO0FBQzVEO0FBQ0EsNkJBQTZCLENBQUM7O0FBRTlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsZ0NBQWdDLHlCQUF5Qjs7QUFFekQsb0JBQW9CLENBQUM7QUFDckIsVUFBVSxDQUFDLDJDQUEyQyxDQUFDOztBQUV2RDtBQUNBLCtCQUErQiwyQkFBMkI7O0FBRTFEO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsQ0FBQzs7QUFFOUI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxLQUFLOztBQUVMLHFCQUFxQixDQUFDOztBQUV0QjtBQUNBLDJCQUEyQix1REFBdUQ7QUFDbEY7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QixDQUFDOztBQUUvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLEtBQUs7O0FBRUwscUJBQXFCLENBQUM7O0FBRXRCO0FBQ0EsZ0NBQWdDLDREQUE0RDtBQUM1Rjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLEtBQUs7O0FBRUwscUJBQXFCLENBQUM7O0FBRXRCO0FBQ0EsaUNBQWlDLDZEQUE2RDtBQUM5Rjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0Isb0NBQW9DO0FBQ25FLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTs7QUFFQTtBQUNBLFNBQVMsQ0FBQztBQUNWLFdBQVcsQ0FBQztBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixrQ0FBa0M7QUFDbEMsa0NBQWtDO0FBQ2xDLHFCQUFxQjs7QUFFckI7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQyw0QkFBNEI7QUFDNUQseURBQXlELENBQUM7QUFDMUQsb0RBQW9ELHdCQUF3QjtBQUM1RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBCQUEwQixDQUFDO0FBQzNCLG1CQUFtQixDQUFDLHNGQUFzRixDQUFDO0FBQzNHLGVBQWUsQ0FBQyxrRkFBa0YsQ0FBQzs7QUFFbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLENBQUM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSxxQkFBcUIsQ0FBQztBQUN0Qjs7QUFFQSxLQUFLO0FBQ0wsSUFBSSxDQUFDO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxjQUFjLENBQUM7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRiwwQ0FBMEM7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUMsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsa0JBQWtCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxDQUFDOztBQUVqQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEIsd0JBQXdCO0FBQ3BEO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLDRCQUE0QjtBQUN2RDtBQUNBO0FBQ0EsNkJBQTZCLENBQUM7O0FBRTlCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrSEFBa0g7QUFDMUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtIQUFrSDtBQUMxSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLEtBQUs7O0FBRUwsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdIQUF3SCxlQUFlO0FBQ3ZJLDJLQUEySzs7QUFFM0s7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2ludGVyZmFjZS9odG1sNS92aWV3cy9teV9hY2NvdW50L2V4cGVuc2UvRXhwZW5zZUF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5qcz9hYjMzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQC9nbG9iYWwvd2lkZ2V0cy9maWxlYnJvd3Nlci9USW1hZ2VCcm93c2VyJztcblxuZXhwb3J0IGNsYXNzIEV4cGVuc2VBdXRob3JpemF0aW9uVmlld0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlVmlld0NvbnRyb2xsZXIge1xuXHRjb25zdHJ1Y3Rvciggb3B0aW9ucyA9IHt9ICkge1xuXHRcdF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRcdGVsOiAnI2V4cGVuc2VfYXV0aG9yaXphdGlvbl92aWV3X2NvbnRhaW5lcicsXG5cblx0XHRcdC8vIF9yZXF1aXJlZF9maWxlczogWydUSW1hZ2VCcm93c2VyJ10sXG5cblx0XHRcdGhpZXJhcmNoeV9sZXZlbF9hcnJheTogbnVsbCxcblx0XHRcdHN0YXR1c19hcnJheTogbnVsbCxcblxuXHRcdFx0cGF5bWVudF9tZXRob2RfYXJyYXk6IG51bGwsXG5cblx0XHRcdHN1Yl9kb2N1bWVudF92aWV3X2NvbnRyb2xsZXI6IG51bGwsXG5cblx0XHRcdGRvY3VtZW50X29iamVjdF90eXBlX2lkOiBudWxsLFxuXG5cdFx0XHRyZWxhdGVkRXhwZW5zZUFycmF5OiBudWxsLFxuXG5cdFx0XHRwdW5jaF90YWdfYXBpOiBudWxsLFxuXHRcdFx0ZGVmYXVsdF9wdW5jaF90YWc6IFtdLFxuXHRcdFx0cHJldmlvdXNfcHVuY2hfdGFnX3NlbGVjdGlvbjogW10sXG5cblx0XHRcdGRvY3VtZW50X2FwaTogbnVsbFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ0V4cGVuc2VBdXRob3JpemF0aW9uRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3VzZXJfZXhwZW5zZSc7XG5cdFx0dGhpcy52aWV3SWQgPSAnRXhwZW5zZUF1dGhvcml6YXRpb24nO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnRXhwZW5zZUF1dGhvcml6YXRpb25WaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ3VzZXJfZXhwZW5zZSc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnRXhwZW5zZSAoQXV0aG9yaXphdGlvbnMpJyApO1xuXHRcdHRoaXMubmF2aWdhdGlvbl9sYWJlbCA9ICQuaTE4bi5fKCAnRXhwZW5zZScgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSVVzZXJFeHBlbnNlO1xuXHRcdHRoaXMubWVzc2FnZV9jb250cm9sX2FwaSA9IFRUQVBJLkFQSU1lc3NhZ2VDb250cm9sO1xuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHR0aGlzLmpvYl9hcGkgPSBUVEFQSS5BUElKb2I7XG5cdFx0XHR0aGlzLmpvYl9pdGVtX2FwaSA9IFRUQVBJLkFQSUpvYkl0ZW07XG5cdFx0XHR0aGlzLnB1bmNoX3RhZ19hcGkgPSBUVEFQSS5BUElQdW5jaFRhZztcblx0XHR9XG5cblx0XHR0aGlzLmRvY3VtZW50X2FwaSA9IFRUQVBJLkFQSURvY3VtZW50O1xuXHRcdHRoaXMuYXV0aG9yaXphdGlvbl9hcGkgPSBUVEFQSS5BUElBdXRob3JpemF0aW9uO1xuXG5cdFx0dGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZCA9IDQwMDtcblxuXHRcdHRoaXMuaGllcmFyY2h5X3R5cGVfaWQgPSAyMDA7XG5cdFx0dGhpcy5ldmVudF9idXMgPSBuZXcgVFRFdmVudEJ1cyh7IHZpZXdfaWQ6IHRoaXMudmlld0lkIH0pO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCk7XG5cblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH1cblxuXHRpbml0T3B0aW9ucygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHR2YXIgZmlsdGVyX2RhdGEgPSB7fTtcblx0XHRmaWx0ZXJfZGF0YS50eXBlX2lkID0gWzEwLCAyMCwgMzBdO1xuXHRcdGZpbHRlcl9kYXRhLnVzZXJfaWQgPSBbdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID8gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQgOiBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5pZF07XG5cblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbiggJ3N0YXR1cycgKTtcblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbiggJ3BheW1lbnRfbWV0aG9kJyApO1xuXG5cdFx0YXJncy5maWx0ZXJfZGF0YSA9IGZpbHRlcl9kYXRhO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoICR0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2V4cGVuc2VfcG9saWN5X2lkJ10gKSApIHtcblx0XHRcdCR0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2V4cGVuc2VfcG9saWN5X2lkJ10uc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHR9XG5cblx0XHR2YXIgcmVzID0gdGhpcy5hcGkuZ2V0SGllcmFyY2h5TGV2ZWxPcHRpb25zKCBbLTFdLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cdFx0dmFyIGRhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0JHRoaXNbJ2hpZXJhcmNoeV9sZXZlbF9hcnJheSddID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGRhdGEgKTtcblx0XHRpZiAoIEdsb2JhbC5pc1NldCggJHRoaXMuYmFzaWNfc2VhcmNoX2ZpZWxkX3VpX2RpY1snaGllcmFyY2h5X2xldmVsJ10gKSApIHtcblx0XHRcdCR0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2hpZXJhcmNoeV9sZXZlbCddLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCBkYXRhICkgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRTdWJWaWV3RmlsdGVyKCBmaWx0ZXIgKSB7XG5cblx0XHRpZiAoIGZpbHRlci5sZW5ndGggPT09IDAgKSB7XG5cdFx0XHRmaWx0ZXIgPSB7fTtcblx0XHR9XG5cblx0XHRmaWx0ZXJbJ3BhcmVudF9pZCddID0gMDtcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIGZpbHRlci5oaWVyYXJjaHlfbGV2ZWwgKSApIHtcblx0XHRcdGZpbHRlclsnaGllcmFyY2h5X2xldmVsJ10gPSAxO1xuXHRcdFx0dGhpcy5maWx0ZXJfZGF0YVsnaGllcmFyY2h5X2xldmVsJ10gPSB7XG5cdFx0XHRcdGZpZWxkOiAnaGllcmFyY2h5X2xldmVsJyxcblx0XHRcdFx0aWQ6ICcnLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5iYXNpY19zZWFyY2hfZmllbGRfdWlfZGljWydoaWVyYXJjaHlfbGV2ZWwnXS5nZXRWYWx1ZSggdHJ1ZSApXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWx0ZXI7XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCkge1xuXHRcdHZhciBjb2x1bW5fZmlsdGVyID0ge307XG5cdFx0Ly9Jc3N1ZSAjMjg5NyAtIFRoZSBjb2x1bW4gdXNlcl9pZCBpcyByZXF1aXJlZCBmb3IgdGhlIG5hdmlnYXRpb24gaWNvbnMgdG8gZnVuY3Rpb24gcHJvcGVybHkgd2hpbGUgbm90IGluIGVkaXQgdmlldy5cblx0XHRjb2x1bW5fZmlsdGVyLnVzZXJfaWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dldEZpbHRlckNvbHVtbnNGcm9tRGlzcGxheUNvbHVtbnMoIGNvbHVtbl9maWx0ZXIsIHRydWUgKTtcblx0fVxuXG5cdGdldEN1c3RvbUNvbnRleHRNZW51TW9kZWwoKSB7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9tb2RlbCA9IHtcblx0XHRcdGdyb3Vwczoge1xuXHRcdFx0XHRhdXRob3JpemF0aW9uOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQXV0aG9yaXphdGlvbicgKSxcblx0XHRcdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdBdXRob3JpemF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvYmplY3RzOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnT2JqZWN0cycgKSxcblx0XHRcdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdvYmplY3RzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZXhjbHVkZTogWydkZWZhdWx0J10sXG5cdFx0XHRpbmNsdWRlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3JyApLFxuXHRcdFx0XHRcdGlkOiAnZWRpdCcsIC8vIGNvcHkgcGFzdGVkIHRoaXMgdmFsdWUsIGJ1dCAnZWRpdCcgc2VlbXMgZGVsaWJlcmF0ZS4gY2xpY2tpbmcgdGhpcyBpY29uIG9wZW5zIGVkaXQgdmlldywgbm90IHZpZXcuIERvdWJsZSBjaGVjayBiZWZvcmUgY2hhbmdpbmcuXG5cdFx0XHRcdFx0Z3JvdXA6ICdlZGl0b3InLFxuXHRcdFx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi12aXNpYmlsaXR5X2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDYW5jZWwnICksXG5cdFx0XHRcdFx0aWQ6ICdjYW5jZWwnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQXV0aG9yaXplJyApLFxuXHRcdFx0XHRcdGlkOiAnYXV0aG9yaXphdGlvbicsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXRodW1iX3VwX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdjZW50ZXInXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQYXNzJyApLFxuXHRcdFx0XHRcdGlkOiAncGFzcycsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXJlZG9fYmxhY2tfMjRkcCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ2NlbnRlcidcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlY2xpbmUnICksXG5cdFx0XHRcdFx0aWQ6ICdkZWNsaW5lJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tdGh1bWJfZG93bl9ibGFja18yNGRwJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAnY2VudGVyJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSnVtcCBUbycgKSxcblx0XHRcdFx0XHRpZDogJ2p1bXBfdG9faGVhZGVyJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cF9oZWFkZXI6IHRydWUsXG5cdFx0XHRcdFx0cGVybWlzc2lvbl9yZXN1bHQ6IGZhbHNlIC8vIHRvIGhpZGUgaXQgaW4gbGVnYWN5IGNvbnRleHQgbWVudSBhbmQgYXZvaWQgZXJyb3JzIGluIGxlZ2FjeSBwYXJzZXJzLlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVGltZVNoZWV0JyApLFxuXHRcdFx0XHRcdGlkOiAndGltZXNoZWV0Jyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGdyb3VwOiAnbmF2aWdhdGlvbicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NjaGVkdWxlJyApLFxuXHRcdFx0XHRcdGlkOiAnc2NoZWR1bGUnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRXhwb3J0JyApLFxuXHRcdFx0XHRcdGlkOiAnZXhwb3J0X2V4Y2VsJyxcblx0XHRcdFx0XHRncm91cDogJ290aGVyJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tZmlsZV91cGxvYWRfYmxhY2tfMjRkcCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRWRpdCBFbXBsb3llZScgKSxcblx0XHRcdFx0XHRpZDogJ2VkaXRfZW1wbG95ZWUnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRzZXRDdXN0b21EZWZhdWx0TWVudUljb24oIGlkLCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKSB7XG5cdFx0c3dpdGNoICggaWQgKSB7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25JY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXNzJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudVBhc3NJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdkZWNsaW5lJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudURlY2xpbmVJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uX3JlcXVlc3QnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51QXV0aG9yaXphdGlvblJlcXVlc3RJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uX3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVBdXRob3JpemF0aW9uVGltZXNoZWV0SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl9leHBlbnNlJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25FeHBlbnNlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndGltZXNoZWV0Jzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsICdwdW5jaCcgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzY2hlZHVsZSc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCAnc2NoZWR1bGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVFZGl0SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51RWRpdEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblxuXHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnVTYXZlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25JY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKSB7XG5cdFx0aWYgKCAhdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cblx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnVQYXNzSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdGlmICggIXRoaXMuaXNfdmlld2luZyApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51RGVjbGluZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoICF0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdH1cblxuXHRzZXRDdXN0b21FZGl0TWVudUljb24oIGlkLCBjb250ZXh0X2J0biApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb24nOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51QXV0aG9yaXphdGlvbkljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGFzcyc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVQYXNzSWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdkZWNsaW5lJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudURlY2xpbmVJY29uKCBjb250ZXh0X2J0biApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fcmVxdWVzdCc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVBdXRob3JpemF0aW9uUmVxdWVzdEljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl90aW1lc2hlZXQnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51QXV0aG9yaXphdGlvblRpbWVzaGVldEljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl9leHBlbnNlJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudUF1dGhvcml6YXRpb25FeHBlbnNlSWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51TmF2Vmlld0ljb24oIGNvbnRleHRfYnRuLCAncHVuY2gnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51TmF2Vmlld0ljb24oIGNvbnRleHRfYnRuLCAnc2NoZWR1bGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVOYXZFZGl0SWNvbiggY29udGV4dF9idG4sICd1c2VyJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25SZXF1ZXN0SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51QXV0aG9yaXphdGlvblRpbWVzaGVldEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25FeHBlbnNlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdGlmICggISggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjUgKSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHR9XG5cblx0c2V0RWRpdE1lbnVBdXRob3JpemF0aW9uUmVxdWVzdEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51QXV0aG9yaXphdGlvblRpbWVzaGVldEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51QXV0aG9yaXphdGlvbkV4cGVuc2VJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudUVkaXRJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHR9XG5cblx0c2V0RWRpdE1lbnVTYXZlSWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHR9XG5cblx0c2V0RWRpdE1lbnVBdXRob3JpemF0aW9uSWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdE1lbnVQYXNzSWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdE1lbnVEZWNsaW5lSWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0b25DdXN0b21Db250ZXh0Q2xpY2soIGlkICkge1xuXHRcdHN3aXRjaCAoIGlkICkge1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbic6XG5cdFx0XHRcdHRoaXMub25BdXRob3JpemF0aW9uQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXNzJzpcblx0XHRcdFx0dGhpcy5vblBhc3NDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RlY2xpbmUnOlxuXHRcdFx0XHR0aGlzLm9uRGVjbGluZUNsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl9yZXF1ZXN0Jzpcblx0XHRcdFx0dGhpcy5vbkF1dGhvcml6YXRpb25SZXF1ZXN0Q2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uX3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMub25BdXRob3JpemF0aW9uVGltZXNoZWV0Q2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uX2V4cGVuc2UnOlxuXHRcdFx0XHR0aGlzLm9uQXV0aG9yaXphdGlvbkV4cGVuc2VDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRjYXNlICdzY2hlZHVsZSc6XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdGNhc2UgJ2V4cG9ydF9leGNlbCc6XG5cdFx0XHRcdHRoaXMub25OYXZpZ2F0aW9uQ2xpY2soIGlkICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdG9uTmF2aWdhdGlvbkNsaWNrKCBpY29uTmFtZSApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9pZF9hcnJheTtcblxuXHRcdHZhciBmaWx0ZXIgPSB7fTtcblxuXHRcdHZhciBpZHMgPSBbXTtcblxuXHRcdHZhciB1c2VyX2lkcyA9IFtdO1xuXG5cdFx0dmFyIGJhc2VfZGF0ZTtcblx0XHRpZiAoICR0aGlzLmVkaXRfdmlldyAmJiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0aWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKTtcblx0XHRcdHVzZXJfaWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCApO1xuXHRcdFx0YmFzZV9kYXRlID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pbmN1cnJlZF9kYXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdFx0JC5lYWNoKCBncmlkX3NlbGVjdGVkX2lkX2FycmF5LCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9yb3cgPSAkdGhpcy5nZXRSZWNvcmRGcm9tR3JpZEJ5SWQoIHZhbHVlICk7XG5cdFx0XHRcdGlkcy5wdXNoKCBncmlkX3NlbGVjdGVkX3Jvdy5pZCApO1xuXHRcdFx0XHR1c2VyX2lkcy5wdXNoKCBncmlkX3NlbGVjdGVkX3Jvdy51c2VyX2lkICk7XG5cdFx0XHRcdGJhc2VfZGF0ZSA9IGdyaWRfc2VsZWN0ZWRfcm93LmluY3VycmVkX2RhdGU7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICggaWNvbk5hbWUgKSB7XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0aWYgKCB1c2VyX2lkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIub3BlbkVkaXRWaWV3KCB0aGlzLCAkLmkxOG4uXyggJ0VtcGxveWVlJyApLCB1c2VyX2lkc1swXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndGltZXNoZWV0Jzpcblx0XHRcdFx0aWYgKCB1c2VyX2lkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdGZpbHRlci51c2VyX2lkID0gdXNlcl9pZHNbMF07XG5cdFx0XHRcdFx0ZmlsdGVyLmJhc2VfZGF0ZSA9IGJhc2VfZGF0ZTtcblx0XHRcdFx0XHRHbG9iYWwuYWRkVmlld1RhYiggJHRoaXMudmlld0lkLCAkLmkxOG4uXyggJ0F1dGhvcml6YXRpb24gLSBFeHBlbnNlJyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdUaW1lU2hlZXQnLCBmaWx0ZXIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NjaGVkdWxlJzpcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdHZhciBpbmNsdWRlX3VzZXJzID0geyB2YWx1ZTogdXNlcl9pZHMgfTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLmluY2x1ZGVfdXNlcl9pZHMgPSBpbmNsdWRlX3VzZXJzO1xuXHRcdFx0XHRmaWx0ZXIuc2VsZWN0X2RhdGUgPSBiYXNlX2RhdGU7XG5cdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCB0aGlzLnZpZXdJZCwgJC5pMThuLl8oICdBdXRob3JpemF0aW9uIC0gRXhwZW5zZScgKSwgd2luZG93LmxvY2F0aW9uLmhyZWYgKTtcblx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1NjaGVkdWxlJywgZmlsdGVyICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZXhwb3J0X2V4Y2VsJzpcblx0XHRcdFx0dGhpcy5vbkV4cG9ydENsaWNrKCAnZXhwb3J0JyArIHRoaXMuYXBpLmtleV9uYW1lICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXHR9XG5cblx0b25BdXRob3JpemF0aW9uRXhwZW5zZUNsaWNrKCkge1xuXHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdFeHBlbnNlQXV0aG9yaXphdGlvbicgKTtcblx0fVxuXG5cdG9uQXV0aG9yaXphdGlvblRpbWVzaGVldENsaWNrKCkge1xuXHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdUaW1lU2hlZXRBdXRob3JpemF0aW9uJyApO1xuXHR9XG5cblx0b25BdXRob3JpemF0aW9uUmVxdWVzdENsaWNrKCkge1xuXHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdSZXF1ZXN0QXV0aG9yaXphdGlvbicgKTtcblx0fVxuXG5cdG9uQXV0aG9yaXphdGlvbkNsaWNrKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHJlY29yZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZDtcblx0XHRyZWNvcmQgPSB0aGlzLnVuaWZvcm1WYXJpYWJsZSggcmVjb3JkICk7XG5cblx0XHR0aGlzLmFwaVsnc2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7IC8vRG9uJ3QgdHJ5IHRvIGF1dGhvcml6ZSB0aGUgZXhwZW5zZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCBkaXNwbGF5IHRoZSB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc3RvcC5cblx0XHRcdFx0XHQkdGhpcy5pc19jaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0JHRoaXMub25TYXZlUmVzdWx0KCByZXN1bHQgKTtcblxuXHRcdFx0XHRcdCR0aGlzLnNldEF1dGhvcml6YXRpb24oIHRydWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0XHRcdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0b25QYXNzQ2xpY2soKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCBmdW5jdGlvbigpIHtcblx0XHRcdCR0aGlzLnNlYXJjaCgpO1xuXHRcdFx0JCgpLlRGZWVkYmFjaygge1xuXHRcdFx0XHRzb3VyY2U6ICdQYXNzJ1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdG9uRGVjbGluZUNsaWNrKCkge1xuXHRcdHRoaXMuc2V0QXV0aG9yaXphdGlvbiggZmFsc2UgKTtcblx0fVxuXG5cdHNldEF1dGhvcml6YXRpb24oIGF1dGhvcml6ZWQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgZmlsdGVyID0ge307XG5cblx0XHRmaWx0ZXIuYXV0aG9yaXplZCA9IGF1dGhvcml6ZWQgPyBhdXRob3JpemVkIDogZmFsc2U7XG5cdFx0ZmlsdGVyLm9iamVjdF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdFx0ZmlsdGVyLm9iamVjdF90eXBlX2lkID0gMjAwO1xuXG5cdFx0JHRoaXMuYXV0aG9yaXphdGlvbl9hcGlbJ3NldEF1dGhvcml6YXRpb24nXSggW2ZpbHRlcl0sIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHQkdGhpcy51cGRhdGVCYWRnZUNvdW50KCk7XG5cdFx0XHRcdCR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7XG5cdFx0XHRcdFx0dmFyIGF1dGhvcml6YXRpb25fdmFsdWUgPSBhdXRob3JpemVkID8gJ0F1dGhvcml6ZScgOiAnRGVjbGluZSc7XG5cdFx0XHRcdFx0JCgpLlRGZWVkYmFjaygge1xuXHRcdFx0XHRcdFx0c291cmNlOiBhdXRob3JpemF0aW9uX3ZhbHVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0YnVpbGRFZGl0Vmlld1VJKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRFZGl0Vmlld1VJKCk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHRhYl9tb2RlbCA9IHtcblx0XHRcdCd0YWJfZXhwZW5zZSc6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdFeHBlbnNlJyApLFxuXHRcdFx0XHQnaHRtbF90ZW1wbGF0ZSc6IHRoaXMuZ2V0RXhwZW5zZUF1dGhvcml6YXRpb25UYWJIdG1sKCksXG5cdFx0XHRcdCdpc19tdWx0aV9jb2x1bW4nOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3RhYl9hdHRhY2htZW50JzogdHJ1ZSxcblx0XHRcdCd0YWJfYXVkaXQnOiB0cnVlLFxuXHRcdH07XG5cdFx0dGhpcy5zZXRUYWJNb2RlbCggdGFiX21vZGVsICk7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXJFeHBlbnNlLFxuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2V4cGVuc2UnLFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5zZXROYXZpZ2F0aW9uKCk7XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cblx0XHR2YXIgdGFiX2V4cGVuc2UgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfZXhwZW5zZScgKTtcblxuXHRcdHZhciB0YWJfZXhwZW5zZV9jb2x1bW4xID0gdGFiX2V4cGVuc2UuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cdFx0dmFyIHRhYl9leHBlbnNlX2NvbHVtbjIgPSB0YWJfZXhwZW5zZS5maW5kKCAnLnNlY29uZC1jb2x1bW4nICk7XG5cdFx0Ly92YXIgYXV0aG9yaXphdGlvbl9oaXN0b3J5X2NvbHVtbiA9IHRhYl9leHBlbnNlLmZpbmQoICcuYXV0aC1oaXN0b3J5LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2V4cGVuc2VfY29sdW1uMSApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2V4cGVuc2VfY29sdW1uMiApO1xuXHRcdC8vdGhpcy5lZGl0X3ZpZXdfdGFic1swXS5wdXNoKCBhdXRob3JpemF0aW9uX2hpc3RvcnlfY29sdW1uICk7XG5cblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0O1xuXHRcdHZhciB3aWRnZXRDb250YWluZXI7XG5cdFx0dmFyIGxhYmVsO1xuXG5cdFx0Ly8gRW1wbG95ZWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0ZmllbGQ6ICd1c2VyX2lkJyxcblx0XHRcdHNldF9lbXB0eTogZmFsc2Vcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xLCAnJywgbnVsbCApO1xuXG5cdFx0Ly8gRGF0ZSBJbmN1cnJlZFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdpbmN1cnJlZF9kYXRlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRlIEluY3VycmVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjEsICcnLCBudWxsICk7XG5cblx0XHQvLyBEZXNjcmlwdGlvblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9BUkVBICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0QXJlYSggeyBmaWVsZDogJ2Rlc2NyaXB0aW9uJywgd2lkdGg6ICcxMDAlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEZXNjcmlwdGlvbicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xLCAnJywgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXG5cdFx0Ly8gUGF5bWVudCBNZXRob2Rcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3BheW1lbnRfbWV0aG9kX2lkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnBheW1lbnRfbWV0aG9kX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXltZW50IE1ldGhvZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xICk7XG5cblx0XHQvLyBUeXBlXG5cblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdHZhciBmaWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGZpbHRlcl9kYXRhLnR5cGVfaWQgPSBbMTAsIDIwLCAzMF07XG5cdFx0ZmlsdGVyX2RhdGEudXNlcl9pZCA9IFtMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5pZF07XG5cblx0XHRhcmdzLmZpbHRlcl9kYXRhID0gZmlsdGVyX2RhdGE7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElFeHBlbnNlUG9saWN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2V4cGVuc2VfcG9saWN5Jyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnZXhwZW5zZV9wb2xpY3lfaWQnXG5cdFx0fSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldERlZmF1bHRBcmdzKCBhcmdzICk7XG5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1R5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMSApO1xuXG5cdFx0Ly9BbW91bnRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2dyb3NzX2Ftb3VudDEnIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveCBcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnUmVpbWJ1cnNlJyApICsgJyA8L3NwYW4+JyApO1xuXG5cdFx0dmFyIHdpZGdldF9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHR3aWRnZXRfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAnaXNfcmVpbWJ1cnNhYmxlJyB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHdpZGdldF9jaGVja2JveCApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBbW91bnQnICksIFtmb3JtX2l0ZW1faW5wdXQsIHdpZGdldF9jaGVja2JveF0sIHRhYl9leHBlbnNlX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdC8vIEN1cnJlbmN5XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUN1cnJlbmN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2N1cnJlbmN5Jyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnY3VycmVuY3lfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ3VycmVuY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMiwgJycgKTtcblxuXHRcdC8vQnJhbmNoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElCcmFuY2gsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYnJhbmNoJyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnYnJhbmNoX2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0JyYW5jaCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4yICk7XG5cblx0XHQvL0RlcGFydG1lbnRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSURlcGFydG1lbnQsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2RlcGFydG1lbnRfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVwYXJ0bWVudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4yICk7XG5cblx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdC8vSm9iXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2IsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYicsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCBmdW5jdGlvbiggdmFsICkge1xuXG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRqb2JfY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0ZmllbGQ6ICdqb2JfaWQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBqb2JfY29kZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdGpvYl9jb2Rlci5UVGV4dElucHV0KCB7IGZpZWxkOiAnam9iX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0am9iX2NvZGVyLmFkZENsYXNzKCAnam9iLWNvZGVyJyApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBqb2JfY29kZXIgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdKb2InICksIFtmb3JtX2l0ZW1faW5wdXQsIGpvYl9jb2Rlcl0sIHRhYl9leHBlbnNlX2NvbHVtbjIsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdFx0Ly8gVGFza1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJSm9iSXRlbSxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iX2l0ZW0nLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0c2V0UmVhbFZhbHVlQ2FsbEJhY2s6ICggZnVuY3Rpb24oIHZhbCApIHtcblxuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0am9iX2l0ZW1fY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0ZmllbGQ6ICdqb2JfaXRlbV9pZCdcblx0XHRcdH0gKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIGpvYl9pdGVtX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRqb2JfaXRlbV9jb2Rlci5UVGV4dElucHV0KCB7IGZpZWxkOiAnam9iX2l0ZW1fcXVpY2tfc2VhcmNoJywgZGlzYWJsZV9rZXl1cF9ldmVudDogdHJ1ZSB9ICk7XG5cdFx0XHRqb2JfaXRlbV9jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggam9iX2l0ZW1fY29kZXIgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYXNrJyApLCBbZm9ybV9pdGVtX2lucHV0LCBqb2JfaXRlbV9jb2Rlcl0sIHRhYl9leHBlbnNlX2NvbHVtbjIsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdFx0Ly9QdW5jaCBUYWdcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVB1bmNoVGFnLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3B1bmNoX3RhZycsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRnZXRfcmVhbF9kYXRhX29uX211bHRpOiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCAoIHB1bmNoX3RhZ3MsIGdldF9yZWFsX2RhdGEgKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCBwdW5jaF90YWdzICkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1F1aWNrU2VhcmNoTWFudWFsSWRzKCBwdW5jaF90YWdzLCBnZXRfcmVhbF9kYXRhICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAncHVuY2hfdGFnX2lkJ1xuXHRcdFx0fSApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgcHVuY2hfdGFnX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRwdW5jaF90YWdfY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnLCBkaXNhYmxlX2tleXVwX2V2ZW50OiB0cnVlIH0gKTtcblx0XHRcdHB1bmNoX3RhZ19jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggcHVuY2hfdGFnX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUHVuY2ggVGFncycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgcHVuY2hfdGFnX2NvZGVyXSwgdGFiX2V4cGVuc2VfY29sdW1uMiwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0fVxuXHRcdC8vVGFnc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEFHX0lOUFVUICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRhZ0lucHV0KCB7IGZpZWxkOiAndGFnJywgb2JqZWN0X3R5cGVfaWQ6IDkzMCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYWdzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjIsICcnLCBudWxsLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL0luc2lkZSBlZGl0b3JcblxuXHRcdHZhciBpbnNpZGVfZWRpdG9yX2RpdiA9IHRhYl9leHBlbnNlLmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYnICk7XG5cblx0XHR2YXIgaW5zaWRlX2VkaXRvcl9hcmdzID0ge1xuXHRcdFx0bmFtZTogJC5pMThuLl8oICdBdHRhY2htZW50IE5hbWUnICksXG5cdFx0XHRhY3Rpb246ICQuaTE4bi5fKCAnQWN0aW9uJyApXG5cdFx0fTtcblxuXHRcdHRoaXMuZWRpdG9yID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5JTlNJREVfRURJVE9SICk7XG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRhZGRSb3c6IHRoaXMuaW5zaWRlRWRpdG9yQWRkUm93LFxuXHRcdFx0cmVtb3ZlUm93OiB0aGlzLmluc2lkZUVkaXRvclJlbW92ZVJvdyxcblx0XHRcdGdldFZhbHVlOiB0aGlzLmluc2lkZUVkaXRvckdldFZhbHVlLFxuXHRcdFx0c2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yU2V0VmFsdWUsXG5cdFx0XHRwYXJlbnRfY29udHJvbGxlcjogdGhpcyxcblx0XHRcdGFwaTogdGhpcy5kb2N1bWVudF9hcGksXG5cdFx0XHRyZW5kZXI6IGdldFJlbmRlcigpLFxuXHRcdFx0cmVuZGVyX2FyZ3M6IGluc2lkZV9lZGl0b3JfYXJncyxcblx0XHRcdHJlbmRlcl9pbmxpbmVfaHRtbDogdHJ1ZSxcblx0XHRcdHJvd19yZW5kZXI6IGdldFJvd1JlbmRlcigpLFxuXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0YWJsZSBjbGFzcz1cImluc2lkZS1lZGl0b3ItcmVuZGVyXCI+XG5cdFx0XHRcdDx0ciBjbGFzcz1cInRpdGxlXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiA0MDBweFwiPjwlPSBuYW1lICU+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMzAwcHhcIj48JT0gYWN0aW9uICU+PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdDwvdGFibGU+YDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRSb3dSZW5kZXIoKSB7XG5cdFx0XHRyZXR1cm4gYFxuXHRcdFx0PHRyIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yb3cgZGF0YS1yb3dcIj5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsIGNvbnRyb2wtaWNvblwiPlxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJwbHVzLWljb25cIiBvbmNsaWNrPVwiXCI+PC9idXR0b24+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGwgY29udHJvbC1pY29uXCI+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cIm1pbnVzLWljb24gXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC90cj5gO1xuXHRcdH1cblxuXHRcdGluc2lkZV9lZGl0b3JfZGl2LmFwcGVuZCggdGhpcy5lZGl0b3IgKTtcblx0fVxuXG5cdGJ1aWxkU2VhcmNoRmllbGRzKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRTZWFyY2hGaWVsZHMoKTtcblx0XHR0aGlzLnNlYXJjaF9maWVsZHMgPSBbXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUeXBlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnZXhwZW5zZV9wb2xpY3lfaWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9leHBlbnNlX3BvbGljeScsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJRXhwZW5zZVBvbGljeSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1RhZ3MnICksXG5cdFx0XHRcdGZpZWxkOiAndGFnJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRvYmplY3RfdHlwZV9pZDogOTMwLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLlRBR19JTlBVVFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSGllcmFyY2h5IExldmVsJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdG11bHRpcGxlOiBmYWxzZSxcblx0XHRcdFx0c2V0X2FueTogZmFsc2UsXG5cdFx0XHRcdGZpZWxkOiAnaGllcmFyY2h5X2xldmVsJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKVxuXHRcdF07XG5cdH1cblxuXHRzZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKSB7XG5cdFx0dGhpcy51cGRhdGVCYWRnZUNvdW50KCk7XG5cdFx0c3VwZXIuc2VhcmNoKCBzZXRfZGVmYXVsdF9tZW51LCBwYWdlX2FjdGlvbiwgcGFnZV9udW1iZXIsIGNhbGxCYWNrICk7XG5cdH1cblxuXHR1cGRhdGVCYWRnZUNvdW50KCkge1xuXHRcdHRoaXMuZXZlbnRfYnVzLmVtaXQoICd0dF90b3BiYXInLCAncHJvZmlsZV9wZW5kaW5nX2NvdW50cycsIHsgLy9VcGRhdGUgXCJNeSBQcm9maWxlXCIgYmFkZ2UuXG5cdFx0XHRvYmplY3RfdHlwZXM6IFsgJ25vdGlmaWNhdGlvbicsICdleHBlbnNlX2F1dGhvcml6YXRpb24nIF1cblx0XHR9ICk7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdC8vU2V0IGN1cnJlbnQgZWRpdCByZWNvcmQgZGF0YSB0byBhbGwgd2lkZ2V0c1xuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkge1xuXG5cdFx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0ICkgKSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICd1c2VyX2lkJzpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZ3Jvc3NfYW1vdW50MSc6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50J10gKTtcblx0XHRcdFx0XHRcdC8vdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKHdpZGdldCk7IC8vVGhpcyBjYXVzZXMgb25Gb3JtSXRlbUNoYW5nZSgpIHRvIHRyaWdnZXIgZm9yIGdyb3NzX2Ftb3VudDEsIGNhdXNpbmcgdGhlIHJlbGF0ZWQgZXhwZW5zZSBwb2xpY2llcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbiB0aGUgdmlldyBhcHBlYXJzLiBTbyBpZiB0aGUgdXNlciBzcGVjaWZpZWQgY3VzdG9tIHRheGVzIHRoZXkgd2lsbCBnZXQgd2lwZWQgb3V0LlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZ3Jvc3NfYW1vdW50Jzpcblx0XHRcdFx0XHRjYXNlICduZXRfYW1vdW50Jzpcblx0XHRcdFx0XHRcdC8vIERvbid0IGRvIGFueXRoaW5nLlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnam9iX2lkJzpcblx0XHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdqb2JfaXRlbV9pZCc6XG5cdFx0XHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdFx0YXJncy5maWx0ZXJfZGF0YSA9IHsgam9iX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuam9iX2lkIH07XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXREZWZhdWx0QXJncyggYXJncyApO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwdW5jaF90YWdfaWQnOlxuXHRcdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5wcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV07XG5cblx0XHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdFx0YXJncy5maWx0ZXJfZGF0YSA9ICR0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnam9iX3F1aWNrX3NlYXJjaCc6XG4vL1x0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydqb2JfaWQnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2lkJ10gOiAwICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdqb2JfaXRlbV9xdWlja19zZWFyY2gnOlxuLy9cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2l0ZW1faWQnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2l0ZW1faWQnXSA6IDAgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0VUlEYXRhVG9DdXJyZW50RWRpdFJlY29yZCgpO1xuXG5cdFx0dGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5pc19jaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydyZWxhdGVkX2V4cGVuc2VzJ10gKSApIHtcblx0XHRcdHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsncmVsYXRlZF9leHBlbnNlcyddO1xuXHRcdFx0dGhpcy5zZXRSZWxhdGVkRXhwZW5zZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydyZWxhdGVkX2V4cGVuc2VzJ10gKTtcblx0XHR9XG5cblx0XHR0aGlzLmluaXRJbnNpZGVFZGl0b3JEYXRhKCk7XG5cdFx0QXV0aG9yaXphdGlvbkhpc3RvcnkuaW5pdCggdGhpcyApO1xuXHR9XG5cblx0aW5pdEluc2lkZUVkaXRvckRhdGEoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7fTtcblxuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0JHRoaXMuZWRpdG9yLnJlbW92ZUFsbFJvd3MoKTtcblx0XHRcdCR0aGlzLmVkaXRvci5nZXREZWZhdWx0RGF0YSgpO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEub2JqZWN0X3R5cGVfaWQgPSB0aGlzLmRvY3VtZW50X29iamVjdF90eXBlX2lkO1xuXHRcdFx0YXJncy5maWx0ZXJfZGF0YS5vYmplY3RfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2lkJ107XG5cblx0XHRcdCR0aGlzLmFwaVsnZ2V0QXR0YWNobWVudCddKCBhcmdzLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhJHRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgZGF0YSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHQkdGhpcy5lZGl0b3Iuc2V0VmFsdWUoIGRhdGEgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JTZXRWYWx1ZSggdmFsICkge1xuXHRcdHZhciBsZW4gPSB2YWwubGVuZ3RoO1xuXHRcdHRoaXMucmVtb3ZlQWxsUm93cygpO1xuXG5cdFx0aWYgKCBsZW4gPiAwICkge1xuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdmFsW2ldICkgKSB7XG5cdFx0XHRcdFx0dmFyIHJvdyA9IHZhbFtpXTtcblx0XHRcdFx0XHR0aGlzLmFkZFJvdyggcm93ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5nZXREZWZhdWx0RGF0YSgpO1xuXHRcdH1cblx0fVxuXG5cdGluc2lkZUVkaXRvckdldFZhbHVlKCkge1xuXG5cdFx0dmFyIGxlbiA9IHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDtcblxuXHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIHJvdyA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2ldO1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHJvdy5maWxlICkgKSB7XG5cdFx0XHRcdHZhciBkYXRhID0ge1xuXHRcdFx0XHRcdG5hbWU6IHJvdy5uYW1lLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0ZmlsZTogcm93LmZpbGUuZ2V0VmFsdWUoKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lID09PSAnTm8gRmlsZSBTZWxlY3RlZCcgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQucHVzaCggZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGluc2lkZUVkaXRvckFkZFJvdyggZGF0YSwgaW5kZXggKSB7XG5cblx0XHRpZiAoICFkYXRhICkge1xuXHRcdFx0dGhpcy5nZXREZWZhdWx0RGF0YSggaW5kZXggKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJvdyA9IHRoaXMuZ2V0Um93UmVuZGVyKCk7IC8vR2V0IFJvdyByZW5kZXJcblx0XHRcdHZhciByZW5kZXIgPSB0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgd2lkZ2V0cyA9IHt9OyAvL1NhdmUgZWFjaCByb3cncyB3aWRnZXRzXG5cblx0XHRcdC8vQnVpbGQgcm93IHdpZGdldHNcblxuXHRcdFx0Ly8gQXR0YWNobWVudCBOYW1lXG5cdFx0XHR2YXIgZm9ybV9pdGVtX2ZpbGVfbmFtZSA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2ZpbGVfbmFtZS5UVGV4dCggeyBmaWVsZDogJ25hbWUnLCB3aWR0aDogNDAwIH0gKTtcblx0XHRcdGZvcm1faXRlbV9maWxlX25hbWUuc2V0VmFsdWUoIGRhdGEubmFtZSA/IGRhdGEubmFtZSA6ICQuaTE4bi5fKCAnTm8gRmlsZSBTZWxlY3RlZCcgKSApO1xuXHRcdFx0Zm9ybV9pdGVtX2ZpbGVfbmFtZS5zZXRDbGFzc1N0eWxlKCBkYXRhLm5hbWUgPyB7ICdmb250LXdlaWdodCc6ICdib2xkJyB9IDogbnVsbCApO1xuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fZmlsZV9uYW1lLmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2ZpbGVfbmFtZTtcblx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAwICkuYXBwZW5kKCBmb3JtX2l0ZW1fZmlsZV9uYW1lICk7XG5cdFx0XHRmb3JtX2l0ZW1fZmlsZV9uYW1lLmF0dHIoICdkb2N1bWVudF9pZCcsICggZGF0YS5pZCAmJiB0aGlzLnBhcmVudF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSA/IGRhdGEuaWQgOiAnJyApO1xuXHRcdFx0Zm9ybV9pdGVtX2ZpbGVfbmFtZS5hdHRyKCAnZG9jdW1lbnRfcmV2aXNpb25faWQnLCAoIGRhdGEuZG9jdW1lbnRfcmV2aXNpb25faWQgJiYgdGhpcy5wYXJlbnRfY29udHJvbGxlci5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgPyBkYXRhLmRvY3VtZW50X3JldmlzaW9uX2lkIDogJycgKTtcblxuXHRcdFx0Ly8gQWN0aW9uXG5cdFx0XHRpZiAoIGRhdGEubmFtZSApIHtcblxuXHRcdFx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIGRvd25sb2FkID0gJCggJzxidXR0b24gdHlwZT1cXCdidXR0b25cXCcgY2xhc3M9XFwnIGRvd25sb2FkLWJ1dHRvbiB0LWJ1dHRvbiB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+JyArICQuaTE4bi5fKCAnRG93bmxvYWQnICkgKyAnPC9idXR0b24+JyApO1xuXHRcdFx0XHR2YXIgdmlldyA9ICQoICc8YnV0dG9uIHR5cGU9XFwnYnV0dG9uXFwnIGNsYXNzPVxcJyB2aWV3LWJ1dHRvbiB0LWJ1dHRvbiB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+JyArICQuaTE4bi5fKCAnVmlldycgKSArICc8L2J1dHRvbj4nICk7XG5cblx0XHRcdFx0ZG93bmxvYWQuYXR0cigge1xuXHRcdFx0XHRcdGRvY3VtZW50X2lkOiBkYXRhLmlkLFxuXHRcdFx0XHRcdGRvY3VtZW50X3JldmlzaW9uX2lkOiBkYXRhLmRvY3VtZW50X3JldmlzaW9uX2lkLFxuXHRcdFx0XHRcdG9iamVjdF90eXBlX2lkOiB0aGlzLnBhcmVudF9jb250cm9sbGVyLmRvY3VtZW50X29iamVjdF90eXBlX2lkXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0dmlldy5hdHRyKCB7XG5cdFx0XHRcdFx0ZG9jdW1lbnRfaWQ6IGRhdGEuaWQsXG5cdFx0XHRcdFx0ZG9jdW1lbnRfcmV2aXNpb25faWQ6IGRhdGEuZG9jdW1lbnRfcmV2aXNpb25faWQsXG5cdFx0XHRcdFx0b2JqZWN0X3R5cGVfaWQ6IHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWRcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdGRvd25sb2FkLmJpbmQoICdjbGljaycsIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZG93bmxvYWRGaWxlICk7XG5cdFx0XHRcdHZpZXcuYmluZCggJ2NsaWNrJywgdGhpcy5wYXJlbnRfY29udHJvbGxlci5kb3dubG9hZEZpbGUgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBkb3dubG9hZCApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB2aWV3ICk7XG5cblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9maWxlID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5JTUFHRV9CUk9XU0VSICk7XG5cblx0XHRcdFx0dmFyICR0aGlzID0gdGhpcy5maWxlX2Jyb3dzZXIgPSBmb3JtX2l0ZW1fZmlsZS5USW1hZ2VCcm93c2VyKCB7XG5cdFx0XHRcdFx0XHRmaWVsZDogJ2ZpbGUnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2ZpbGVkYXRhJyxcblx0XHRcdFx0XHRcdGFjY2VwdF9maWx0ZXI6ICcqJyxcblx0XHRcdFx0XHRcdGNoYW5nZUhhbmRsZXI6IGZ1bmN0aW9uKCBhICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZmlsZV9uYW1lID0gJCggdGhpcyApLmZpbmQoICcuYnJvd3NlcicgKVswXS5maWxlc1swXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRmb3JtX2l0ZW1fZmlsZV9uYW1lLnNldFZhbHVlKCBmaWxlX25hbWUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fZmlsZS5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9maWxlO1xuXHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX2ZpbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBlbmRcblxuXHRcdFx0aWYgKCB0eXBlb2YgaW5kZXggIT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdFx0cm93Lmluc2VydEFmdGVyKCAkKCByZW5kZXIgKS5maW5kKCAndHInICkuZXEoIGluZGV4ICkgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCAoIGluZGV4ICksIDAsIHdpZGdldHMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JCggcmVuZGVyICkuYXBwZW5kKCByb3cgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggd2lkZ2V0cyApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNfdmlld2luZyApIHtcblx0XHRcdFx0cm93LmZpbmQoICcuY29udHJvbC1pY29uJyApLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hZGRJY29uc0V2ZW50KCByb3cgKTsgLy9CaW5kIGV2ZW50IHRvIGFkZCBhbmQgbWludXMgaWNvblxuXHRcdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGRvd25sb2FkRmlsZSgpIHtcblxuXHRcdHZhciAkdGhpcyA9ICQoIHRoaXMgKTtcblx0XHR2YXIgZG9jdW1lbnRfYXR0YWNobWVudF9pZCA9ICR0aGlzLmF0dHIoICdkb2N1bWVudF9pZCcgKTtcblx0XHR2YXIgZG9jdW1lbnRfcmV2aXNpb25faWQgPSAkdGhpcy5hdHRyKCAnZG9jdW1lbnRfcmV2aXNpb25faWQnICk7XG5cdFx0dmFyIG9iamVjdF90eXBlX2lkID0gJHRoaXMuYXR0ciggJ29iamVjdF90eXBlX2lkJyApO1xuXG5cdFx0dmFyIHVybCA9IFNlcnZpY2VDYWxsZXIuZ2V0VVJMQnlPYmplY3RUeXBlKCAnZmlsZV9kb3dubG9hZCcgKSArICcmb2JqZWN0X3R5cGU9ZG9jdW1lbnQmcGFyZW50X2lkPScgKyBkb2N1bWVudF9hdHRhY2htZW50X2lkICsgJyZwYXJlbnRfb2JqZWN0X3R5cGVfaWQ9JyArIG9iamVjdF90eXBlX2lkICsgJyZvYmplY3RfaWQ9JyArIGRvY3VtZW50X3JldmlzaW9uX2lkO1xuXG5cdFx0R2xvYmFsLkFQSUZpbGVEb3dubG9hZCggbnVsbCwgbnVsbCwgbnVsbCwgdXJsICk7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JSZW1vdmVSb3coIHJvdyApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGluZGV4ID0gcm93WzBdLnJvd0luZGV4IC0gMTtcblx0XHR2YXIgcmVtb3ZlX2lkID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdLm5hbWUuYXR0ciggJ2RvY3VtZW50X2lkJyApO1xuXHRcdGlmICggVFRVVUlELmlzVVVJRCggcmVtb3ZlX2lkICkgJiYgcmVtb3ZlX2lkICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlbW92ZV9pZCAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93Q29uZmlybUFsZXJ0KCAnQXJlIHlvdSBzdXJlIHRvICcgKyB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF0ubmFtZS50ZXh0KCkgKyAnPycsIG51bGwsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFByb2dyZXNzQmFyLnNob3dPdmVybGF5KCk7XG5cdFx0XHRcdFx0JHRoaXMuYXBpWydkZWxldGUnICsgJHRoaXMuYXBpLmtleV9uYW1lXSggcmVtb3ZlX2lkLCB7XG5cdFx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cdFx0XHRcdFx0XHRcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyb3cucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMucm93c193aWRnZXRzX2FycmF5LnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGggPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5nZXREZWZhdWx0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyb3cucmVtb3ZlKCk7XG5cdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdH1cblxuXHRcdHRoaXMucmVtb3ZlTGFzdFJvd0xpbmUoKTtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0b25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR0aGlzLnNldElzQ2hhbmdlZCggdGFyZ2V0ICk7XG5cdFx0dGhpcy5zZXRNYXNzRWRpdGluZ0ZpZWxkc1doZW5Gb3JtQ2hhbmdlKCB0YXJnZXQgKTtcblxuXHRcdHZhciBrZXkgPSB0YXJnZXQuZ2V0RmllbGQoKTtcblx0XHR2YXIgY192YWx1ZSA9IHRhcmdldC5nZXRWYWx1ZSgpO1xuXG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBjX3ZhbHVlO1xuXG5cdFx0dmFyIGFtb3VudF9hcnIgPSBmYWxzZTtcblxuXHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdGNhc2UgJ2V4cGVuc2VfcG9saWN5X2lkJzpcblx0XHRcdGNhc2UgJ2dyb3NzX2Ftb3VudDEnOlxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddID8gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudCddO1xuXHRcdFx0XHR0aGlzLmFwaVsnY2FsY1JlbGF0ZWRFeHBlbnNlcyddKFxuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZXhwZW5zZV9wb2xpY3lfaWQnXSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10sIGFtb3VudF9hcnIsIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnaXNfcmVpbWJ1cnNhYmxlJ10sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnNldFJlbGF0ZWRFeHBlbnNlKCAkdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2lzX3JlaW1idXJzYWJsZSc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50J107XG5cdFx0XHRcdGFtb3VudF9hcnIgPSB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkgPyB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkgOiBmYWxzZTtcblx0XHRcdFx0dGhpcy5hcGlbJ2NhbGNSZWxhdGVkRXhwZW5zZXMnXShcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2V4cGVuc2VfcG9saWN5X2lkJ10sIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddLCBhbW91bnRfYXJyLCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2lzX3JlaW1idXJzYWJsZSddLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5ID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5zZXRSZWxhdGVkRXhwZW5zZSggJHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhbW91bnQnOlxuXHRcdFx0XHR2YXIgcmVsYXRlZF9leHBlbnNlX3BvbGljeV9pZCA9IHRhcmdldC5hdHRyKCAnaWQnICk7XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50J107XG5cdFx0XHRcdHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheVsndGF4ZXMnXVtyZWxhdGVkX2V4cGVuc2VfcG9saWN5X2lkXVsnYW1vdW50J10gPSBjX3ZhbHVlO1xuXHRcdFx0XHR0aGlzLmFwaVsnY2FsY1JlbGF0ZWRFeHBlbnNlcyddKFxuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZXhwZW5zZV9wb2xpY3lfaWQnXSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10sIHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydpc19yZWltYnVyc2FibGUnXSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc2V0UmVsYXRlZEV4cGVuc2VEYXRhKCAkdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5LCByZWxhdGVkX2V4cGVuc2VfcG9saWN5X2lkICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9pZCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snam9iX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5zZXRKb2JJdGVtVmFsdWVXaGVuSm9iQ2hhbmdlZCggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICksICdqb2JfaXRlbV9pZCcsIHsgam9iX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuam9iX2lkIH0gKTtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9xdWlja19zZWFyY2gnXS5zZXRDaGVja0JveCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdWYWx1ZXNXaGVuQ3JpdGVyaWFDaGFuZ2VkKCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2l0ZW1faWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfaXRlbV9xdWlja19zZWFyY2gnXS5zZXRDaGVja0JveCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdWYWx1ZXNXaGVuQ3JpdGVyaWFDaGFuZ2VkKCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX2lkJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBjX3ZhbHVlICE9PSBUVFVVSUQuemVyb19pZCAmJiBjX3ZhbHVlICE9PSBmYWxzZSAmJiBjX3ZhbHVlLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnUXVpY2tTZWFyY2hNYW51YWxJZHMoIHRhcmdldC5nZXRTZWxlY3RJdGVtcygpICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCAnJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkdGhpcy5wcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uID0gY192YWx1ZTtcblx0XHRcdFx0XHQvL1Jlc2V0IHNvdXJjZSBkYXRhIHRvIG1ha2Ugc3VyZSBjb3JyZWN0IHB1bmNoIHRhZ3MgYXJlIGFsd2F5cyBzaG93bi5cblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3B1bmNoX3RhZ19pZCddLnNldFNvdXJjZURhdGEoIG51bGwgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJfaWQnOlxuXHRcdFx0Y2FzZSAnYnJhbmNoX2lkJzpcblx0XHRcdGNhc2UgJ2RlcGFydG1lbnRfaWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9xdWlja19zZWFyY2gnOlxuXHRcdFx0Y2FzZSAnam9iX2l0ZW1fcXVpY2tfc2VhcmNoJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5vbkpvYlF1aWNrU2VhcmNoKCBrZXksIGNfdmFsdWUgKTtcblxuXHRcdFx0XHRcdC8vRG9uJ3QgdmFsaWRhdGUgaW1tZWRpYXRlbHkgYXMgb25Kb2JRdWlja1NlYXJjaCBpcyBkb2luZyBhc3luYyBBUEkgY2FsbHMsIGFuZCBpdCB3b3VsZCBjYXVzZSBhIGd1YXJhbnRlZWQgdmFsaWRhdGlvbiBmYWlsdXJlLlxuXHRcdFx0XHRcdGRvTm90VmFsaWRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdWYWx1ZXNXaGVuQ3JpdGVyaWFDaGFuZ2VkKCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMub25QdW5jaFRhZ1F1aWNrU2VhcmNoKCBjX3ZhbHVlLCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXG5cdFx0XHRcdFx0Ly9Eb24ndCB2YWxpZGF0ZSBpbW1lZGlhdGVseSBhcyBvblB1bmNoVGFnUXVpY2tTZWFyY2ggaXMgZG9pbmcgYXN5bmMgQVBJIGNhbGxzLCBhbmQgaXQgd291bGQgY2F1c2UgYSBndWFyYW50ZWVkIHZhbGlkYXRpb24gZmFpbHVyZS5cblx0XHRcdFx0XHRkb05vdFZhbGlkYXRlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblx0LyoqXG5cdCAqIHRoaXMganVzdCBzZXRzIHRoZSBzdWJmb3JtIGRhdGFcblx0ICogc2hvdWxkIGJlIGNhbGxlZCBpbiBtb3N0IGNhc2VzXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBlbnNlc1xuXHQgKi9cblx0c2V0UmVsYXRlZEV4cGVuc2VEYXRhKCBleHBlbnNlcywgc2VsZWN0ZWRfcmVsYXRlZF9leHBlbnNlX3BvbGljeV9pZCApIHtcblx0XHR2YXIgdGFiX2V4cGVuc2UgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfZXhwZW5zZScgKTtcblx0XHR2YXIgdGFiX2V4cGVuc2VfY29sdW1uMyA9IHRhYl9leHBlbnNlLmZpbmQoICcudGhpcmQtY29sdW1uJyApO1xuXG5cdFx0dGFiX2V4cGVuc2VfY29sdW1uMy5maW5kKCAnI25ldF9hbW91bnQnICkudmFsKCBleHBlbnNlc1snbmV0X2Ftb3VudCddICk7XG5cdFx0dGFiX2V4cGVuc2VfY29sdW1uMy5maW5kKCAnI2dyb3NzX2Ftb3VudCcgKS52YWwoIGV4cGVuc2VzWydncm9zc19hbW91bnQnXSApO1xuXHRcdHRhYl9leHBlbnNlX2NvbHVtbjMuZmluZCggJyNyZWltYnVyc2VfYW1vdW50JyApLnZhbCggZXhwZW5zZXNbJ3JlaW1idXJzZV9hbW91bnQnXSApO1xuXG5cdFx0dmFyIHRheF9pbnB1dHMgPSB0YWJfZXhwZW5zZV9jb2x1bW4zLmZpbmQoICcudGF4X2lucHV0JyApO1xuXHRcdGZvciAoIHZhciBuID0gMDsgbiA8IHRheF9pbnB1dHMubGVuZ3RoOyBuKysgKSB7XG5cdFx0XHR2YXIgZWwgPSAkKCB0YXhfaW5wdXRzW25dICk7XG5cdFx0XHRpZiAoIGVsLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHZhciBpZCA9IGVsLmF0dHIoICdpZCcgKTtcblx0XHRcdFx0aWYgKCAhc2VsZWN0ZWRfcmVsYXRlZF9leHBlbnNlX3BvbGljeV9pZCB8fCBzZWxlY3RlZF9yZWxhdGVkX2V4cGVuc2VfcG9saWN5X2lkICE9IGlkICkge1xuXHRcdFx0XHRcdGVsLnZhbCggZXhwZW5zZXNbJ3RheGVzJ11baWRdLmFtb3VudCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiByZWJ1aWxkcyB0aGUgZW50aXJlIHN1YmZvcm0gdWlcblx0ICogd2UgbmVlZCB0byBjYWxsIHRoaXMgd2hlbiB0eXBlIGNoYW5nZXMgb3IgcmVpbWJ1cnNlIGlzIGNoZWNrZWQgdG8gYWRkIGFuZCByZW1vdmUgZmllbGRzXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBlbnNlc1xuXHQgKi9cblx0c2V0UmVsYXRlZEV4cGVuc2UoIGV4cGVuc2VzICkge1xuXG5cdFx0Ly8gVGhpcmQgY29sdW1uIHN0YXJ0XG5cdFx0dmFyIHRhYl9leHBlbnNlID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2V4cGVuc2UnICk7XG5cdFx0dmFyIHRhYl9leHBlbnNlX2NvbHVtbjMgPSB0YWJfZXhwZW5zZS5maW5kKCAnLnRoaXJkLWNvbHVtbicgKS5lbXB0eSgpO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlld190YWJzWzBdLmxlbmd0aCA8IDMgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9leHBlbnNlX2NvbHVtbjMgKTtcblx0XHR9XG5cblx0XHRpZiAoICFleHBlbnNlcyApIHtcblx0XHRcdGV4cGVuc2VzID0geyBuZXRfYW1vdW50OiAwLCBncm9zc19hbW91bnQ6IDAsIHJlaW1idXJzZV9hbW91bnQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5yZWltYnVyc2VfYW1vdW50IH07XG5cdFx0fVxuXG5cdFx0aWYgKCBleHBlbnNlcyAmJiBleHBlbnNlc1sndGF4ZXMnXSAmJiBPYmplY3Qua2V5cyggZXhwZW5zZXNbJ3RheGVzJ10gKS5sZW5ndGggPiAwICkge1xuXHRcdFx0Ly8gTmV0IEFtb3VudFxuXHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICduZXRfYW1vdW50JyB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGV4cGVuc2VzWyduZXRfYW1vdW50J10gKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5hdHRyKCAnaWQnLCAnbmV0X2Ftb3VudCcgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdOZXQgQW1vdW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjMsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snbmV0X2Ftb3VudCddLmNzcyggJ29wYWNpdHknLCAxICk7XG5cblx0XHRcdGlmICggZXhwZW5zZXNbJ3RheGVzJ10gKSB7XG5cdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gZXhwZW5zZXNbJ3RheGVzJ10gKSB7XG5cdFx0XHRcdFx0dmFyIGl0ZW0gPSBleHBlbnNlc1sndGF4ZXMnXVtrZXldO1xuXG5cdFx0XHRcdFx0Ly8gdGF4ZXNcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2Ftb3VudCcgfSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggaXRlbVsnYW1vdW50J10gKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ2lkJywgaXRlbVsnZXhwZW5zZV9wb2xpY3lfaWQnXSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5hZGRDbGFzcyggJ3RheF9pbnB1dCcgKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggaXRlbVsnZXhwZW5zZV9wb2xpY3lfbmFtZSddICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMywgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYW1vdW50J10uY3NzKCAnb3BhY2l0eScsIDEgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFtb3VudFxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdncm9zc19hbW91bnQnIH0gKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZXhwZW5zZXNbJ2dyb3NzX2Ftb3VudCddICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ2lkJywgJ2dyb3NzX2Ftb3VudCcgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQW1vdW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjMsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZ3Jvc3NfYW1vdW50J10uY3NzKCAnb3BhY2l0eScsIDEgKTtcblx0XHR9XG5cblx0XHQvLyBSZWltYnVyc2UgQW1vdW50XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAncmVpbWJ1cnNlX2Ftb3VudCcgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZXhwZW5zZXNbJ3JlaW1idXJzZV9hbW91bnQnXSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5hdHRyKCAnaWQnLCAncmVpbWJ1cnNlX2Ftb3VudCcgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1JlaW1idXJzZSBBbW91bnQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMywgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncmVpbWJ1cnNlX2Ftb3VudCddLmNzcyggJ29wYWNpdHknLCAxICk7XG5cblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSggMCApO1xuXHR9XG5cblx0dW5pZm9ybVZhcmlhYmxlKCByZWNvcmRzICkge1xuXHRcdGlmICggdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5ICkge1xuXHRcdFx0cmVjb3Jkcy5yZWxhdGVkX2V4cGVuc2VzID0gdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5O1xuXHRcdFx0cmVjb3Jkcy5ncm9zc19hbW91bnQgPSB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkuZ3Jvc3NfYW1vdW50O1xuXHRcdFx0cmVjb3Jkcy5uZXRfYW1vdW50ID0gdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5Lm5ldF9hbW91bnQ7XG5cdFx0XHRyZWNvcmRzLnJlaW1idXJzZV9hbW91bnQgPSB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkucmVpbWJ1cnNlX2Ftb3VudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVjb3Jkcztcblx0fVxuXG5cdC8vIG9uU2F2ZUFuZENvbnRpbnVlUmVzdWx0KCByZXN1bHQgKSB7XG5cdC8vXG5cdC8vIFx0dmFyICR0aGlzID0gdGhpcztcblx0Ly8gXHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdC8vIFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdC8vIFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHQvLyBcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0Ly9cblx0Ly8gXHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHsgLy8gYXMgbmV3XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0Ly8gXHRcdH1cblx0Ly9cblx0Ly8gXHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHQvLyBcdFx0XHQkdGhpcy5vbkVkaXRDbGljayggJHRoaXMucmVmcmVzaF9pZCwgdHJ1ZSApO1xuXHQvL1xuXHQvLyBcdFx0XHQkdGhpcy5vblNhdmVBbmRDb250aW51ZURvbmUoIHJlc3VsdCApO1xuXHQvL1xuXHQvLyBcdFx0fSApO1xuXHQvL1xuXHQvLyBcdH0gZWxzZSB7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHQvLyBcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdC8vIFx0fVxuXHQvLyB9LFxuXG5cdC8vIG9uU2F2ZUFuZE5ld1Jlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0Ly8gXHR2YXIgJHRoaXMgPSB0aGlzO1xuXHQvLyBcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0Ly8gXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0Ly8gXHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXHQvL1xuXHQvLyBcdFx0fSBlbHNlIGlmICggVFRVVUlELmlzVVVJRCggcmVzdWx0X2RhdGEgKSAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQuemVyb19pZCAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkgeyAvLyBhcyBuZXdcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHQvLyBcdFx0fVxuXHQvL1xuXHQvLyBcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHQvLyBcdFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7XG5cdC8vIFx0XHRcdCR0aGlzLm9uQWRkQ2xpY2soIHRydWUgKTtcblx0Ly9cblx0Ly8gXHRcdH0gKTtcblx0Ly8gXHR9IGVsc2Uge1xuXHQvLyBcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHQvLyBcdH1cblx0Ly8gfSxcblxuXHRvbkNhbmNlbENsaWNrKCBmb3JjZV9ub19jb25maXJtLCBjYW5jZWxfYWxsLCBjYWxsYmFjayApIHtcblx0XHQvL1JlZnJlc2ggZ3JpZCBvbiBjYW5jZWwgYXMgaXRzIG5vdCBkb25lIGR1cmluZyBhdXRob3JpemUvZGVjbGluZSBhbnltb3JlLlxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0c3VwZXIub25DYW5jZWxDbGljayggZm9yY2Vfbm9fY29uZmlybSwgY2FuY2VsX2FsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL1NpbmNlIHdlIGFyZSBvdmVycmlkaW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHRoaXMuc2VhcmNoKCksIG1ha2Ugc3VyZSB0aGUgb3JpZ2luYWwgY2FsbGJhY2sgaXMgc3RpbGwgY2FsbGVkLlxuXHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0fSApO1xuXHR9XG5cblx0b25TYXZlQW5kQ29weVJlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblxuXHRcdFx0XHQkdGhpcy5vbkNvcHlBc05ld0NsaWNrKCk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gb25TYXZlQW5kTmV4dFJlc3VsdCggcmVzdWx0ICkge1xuXHQvLyBcdHZhciAkdGhpcyA9IHRoaXM7XG5cdC8vIFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHQvLyBcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHQvLyBcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdC8vXG5cdC8vIFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0Ly8gXHRcdH1cblx0Ly9cblx0Ly8gXHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdFx0JHRoaXMub25SaWdodEFycm93Q2xpY2soKTtcblx0Ly8gXHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHQvLyBcdFx0XHQkdGhpcy5vblNhdmVBbmROZXh0RG9uZSggcmVzdWx0ICk7XG5cdC8vXG5cdC8vIFx0XHR9ICk7XG5cdC8vXG5cdC8vIFx0fSBlbHNlIHtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0Ly8gXHR9XG5cdC8vIH0sXG5cblx0b25TYXZlUmVzdWx0KCByZXN1bHQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0XHRcdH0gKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0XHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cblx0XHR9XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdHNhdmVJbnNpZGVFZGl0b3JEYXRhKCBjYWxsQmFjayApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBkYXRhID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcblx0XHR2YXIgZmlsZXMgPSBkYXRhLmxlbmd0aDtcblx0XHRpZiAoIGZpbGVzID4gMCApIHtcblx0XHRcdHZhciBzdWNjZXNzID0gMDtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gZGF0YSApIHtcblx0XHRcdFx0dmFyIGZpbGVJdGVtID0gZGF0YVtrZXldO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggZmlsZUl0ZW0uZmlsZSApICkge1xuXG5cdFx0XHRcdFx0dmFyIGRvY3VtZW50X3JldmlzaW9uX2lkID0gdGhpcy5hcGkuYWRkQXR0YWNobWVudCggZmlsZUl0ZW0ubmFtZSwgdGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZCwgdGhpcy5yZWZyZXNoX2lkLCB7IGFzeW5jOiBmYWxzZSB9ICkuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0JHRoaXMuYXBpLnVwbG9hZEZpbGUoIGZpbGVJdGVtLmZpbGUsICdvYmplY3RfdHlwZT1kb2N1bWVudF9yZXZpc2lvbiZvYmplY3RfaWQ9JyArIGRvY3VtZW50X3JldmlzaW9uX2lkICsgJyZwYXJlbnRfb2JqZWN0X3R5cGVfaWQ9JyArIHRoaXMuZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQsIHt9ICk7XG5cblx0XHRcdFx0XHRzdWNjZXNzKys7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3VjY2VzcyA9PT0gZmlsZXMgKSB7XG5cdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FsbEJhY2soKTtcblx0XHR9XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdHVwbG9hZEZpbGUoIGRvY3VtZW50X3Jlc3VsdCwgZmlsZV9kYXRhICkge1xuXHRcdHZhciBkb2N1bWVudF9yZXZpc2lvbl9pZCA9IGRvY3VtZW50X3Jlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0JHRoaXMuYXBpLnVwbG9hZEZpbGUoIGZpbGVfZGF0YSwgJ29iamVjdF90eXBlPWRvY3VtZW50X3JldmlzaW9uJm9iamVjdF9pZD0nICsgZG9jdW1lbnRfcmV2aXNpb25faWQsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggdXBsb2FkX2ZpbGVfcmVzdWx0ICkge1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGdldEV4cGVuc2VBdXRob3JpemF0aW9uVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYDxkaXYgaWQ9XCJ0YWJfZXhwZW5zZVwiIGNsYXNzPVwiZWRpdC12aWV3LXRhYi1vdXRzaWRlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9leHBlbnNlX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlyc3QtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2Vjb25kLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRoaXJkLWNvbHVtbiBmdWxsLXdpZHRoLWNvbHVtbiBib3JkZXItY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zaWRlLWVkaXRvci1kaXYgZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhdXRoLWhpc3RvcnktY29sdW1uXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhdXRob3JpemF0aW9uLWdyaWQtZGl2IGluc2lkZS1ncmlkIGZ1bGwtd2lkdGgtY29sdW1uXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtdG9wLWJvcmRlclwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJncmlkLXRpdGxlIHNlcGFyYXRlZC1ib3hcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgaWQ9XCJncmlkXCI+PC90YWJsZT5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdlwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtYm90dG9tLWJvcmRlclwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5gO1xuXHR9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///936\n")}}]); |