(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["feedback-TFeedback"],{8218:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("/* provided dependency */ var jQuery = __webpack_require__(9755);\n( function( $ ) {\n\n\t$.fn.TFeedback = function( _options ) {\n\t\tvar options = $.extend( {\n\t\t\tsource: '',\n\t\t\tforce_source: false, // does not prepend viewId to source value\n\t\t\tdelay: 0,\n\t\t\tmanual_trigger: false,\n\t\t\tprompt_for_feedback: false, // Default is false so that only manual trigger, custom functions, or server input will make the feedback popup appear.\n\t\t\treview_link: 'https://www.timetrex.com/r?id=review&product_edition_id=' + Global.getProductEdition()\n\t\t}, _options );\n\n\t\t// DOM references for containers and pages\n\t\tvar feedback_container = Global.loadWidgetByName( FormItemType.FEEDBACK_BOX ); // Note: There is a .feedback-overlay div at the root of feedback_container controlled by CSS.\n\t\tvar page_title = feedback_container.find( '.top-bar-title' );\n\t\tvar all_pages = feedback_container.find( '.feedback-page' );\n\t\tvar default_page = feedback_container.find( '.feedback-page.default' );\n\t\tvar positive_page = feedback_container.find( '.feedback-page.positive' );\n\t\tvar negative_page = feedback_container.find( '.feedback-page.negative' );\n\n\t\tvar api = TTAPI.APIUser;\n\n\t\tvar feedback = {\n\t\t\tPOSITIVE: 'postitive',\n\t\t\tNEUTRAL: 'neutral',\n\t\t\tNEGATIVE: 'negative'\n\t\t};\n\n\t\tfunction init() {\n\n\t\t\t// check the feedback prompt status set by API\n\t\t\tif ( LocalCacheData.getLoginUser() && LocalCacheData.getLoginUser().prompt_for_feedback == true ) {\n\t\t\t\toptions.prompt_for_feedback = true;\n\t\t\t\tLocalCacheData.getLoginUser().prompt_for_feedback = false;\n\t\t\t\t// TODO: API Call to save the new value\n\t\t\t}\n\n\t\t\tif ( options.prompt_for_feedback ) {\n\t\t\t\t// Append current view id to the source\n\t\t\t\tif ( !options.force_source ) {\n\t\t\t\t\toptions.source = LocalCacheData.current_open_view_id + '@' + options.source;\n\t\t\t\t}\n\n\t\t\t\t// Initialise the default page (not visible until showFeedbackContainer() is triggered.\n\t\t\t\tshowPage( 'default' );\n\n\t\t\t\t// Display feedback dialog either immediately or with a delay\n\t\t\t\tif ( options.delay && options.delay > 0 ) {\n\t\t\t\t\tdelayShowFeedbackContainer( options.delay );\n\t\t\t\t} else {\n\t\t\t\t\tshowFeedbackContainer();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction getFeedbackType() {\n\t\t\tif ( options.manual_trigger ) {\n\t\t\t\treturn 'click';\n\t\t\t} else {\n\t\t\t\treturn 'popup';\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t *\n\t\t * @param {number} duration - number of milliseconds to delay the feedback popup from showing.\n\t\t */\n\t\tfunction delayShowFeedbackContainer( duration ) {\n\t\t\tduration = duration || 0;\n\t\t\tDebug.Text( 'Setting feedback display delay to ' + duration, 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\tsetTimeout( function() {\n\t\t\t\tDebug.Text( 'Triggering delayed feedback display', 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\t\tshowFeedbackContainer();\n\t\t\t}, duration );\n\t\t}\n\n\t\tfunction showFeedbackContainer() {\n\t\t\tif ( $( '.feedback-container' ).length == 0 ) {\n\t\t\t\t$( 'body' ).append( feedback_container );\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'ERROR: Feedback container already exists, halting to prevent duplicate popups.', 'TFeedback.js', 'TFeedback', 'initDefaultPage', 1 );\n\t\t\t}\n\t\t}\n\n\t\tfunction removeFeedbackContainer() {\n\t\t\tif ( Global.isSet( feedback_container ) ) {\n\t\t\t\tfeedback_container.remove();\n\t\t\t}\n\t\t}\n\n\t\tfunction initDefaultPage() {\n\t\t\tpage_title.html( $.i18n._( 'Feedback' ) );\n\t\t\tdefault_page.find( '.page-text' ).text( $.i18n._( 'Tell us what you think about TimeTrex?' ) );\n\n\t\t\tdefault_page.find( '.positive-button' )\n\t\t\t\t.html( $.i18n._( 'It\\'s great!' ) )\n\t\t\t\t.bind( 'click', function() {\n\t\t\t\t\tshowPage( 'positive' );\n\t\t\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: ' + getFeedbackType() + ', Label: ' + getFeedbackType() + ':feedback:' + options.source + ':' + feedback.POSITIVE, 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', getFeedbackType(), getFeedbackType() + ':feedback:' + options.source + ':' + feedback.POSITIVE );\n\t\t\t\t\tsendDataToFeedbackAPI( feedback.POSITIVE, '' );\n\t\t\t\t} );\n\n\t\t\tdefault_page.find( '.negative-button' )\n\t\t\t\t.html( $.i18n._( 'Not so great' ) )\n\t\t\t\t.bind( 'click', function() {\n\t\t\t\t\tshowPage( 'negative' );\n\t\t\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: ' + getFeedbackType() + ', Label: ' + getFeedbackType() + ':feedback:' + options.source + ':' + feedback.NEGATIVE, 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', getFeedbackType(), getFeedbackType() + ':feedback:' + options.source + ':' + feedback.NEGATIVE );\n\t\t\t\t\tsendDataToFeedbackAPI( feedback.NEGATIVE, '' );\n\t\t\t\t} );\n\n\t\t\tvar cancel_text;\n\t\t\tif ( options.manual_trigger ) {\n\t\t\t\tcancel_text = $.i18n._( 'Close' );\n\t\t\t} else {\n\t\t\t\tvar cancel_text = $.i18n._( 'Ask me later' );\n\t\t\t}\n\n\t\t\tdefault_page.find( '.cancel-button' )\n\t\t\t\t.html( cancel_text )\n\t\t\t\t.click( function() {\n\t\t\t\t\tremoveFeedbackContainer();\n\t\t\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: ' + getFeedbackType() + ', Label: ' + getFeedbackType() + ':feedback:' + options.source + ':' + feedback.NEUTRAL, 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', getFeedbackType(), getFeedbackType() + ':feedback:' + options.source + ':' + feedback.NEUTRAL );\n\t\t\t\t\tsendDataToFeedbackAPI( feedback.NEUTRAL, '' );\n\t\t\t\t} );\n\n\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: ' + getFeedbackType() + ', Label: ' + getFeedbackType() + ':feedback:' + options.source, 'TFeedback.js', 'TFeedback', 'initDefaultPage', 10 );\n\t\t\tGlobal.sendAnalyticsEvent( 'feedback', getFeedbackType(), getFeedbackType() + ':feedback:' + options.source );\n\t\t}\n\n\t\tfunction initPositivePage() {\n\t\t\tvar feedback_rating = feedback.POSITIVE;\n\t\t\tpage_title.html( $.i18n._( 'Feedback' ) );\n\t\t\tpositive_page.find( '.page-text.block1' ).text( $.i18n._( 'It thrills us to hear you think TimeTrex is great!' ) );\n\t\t\tpositive_page.find( '.page-text.block2' ).text( $.i18n._( 'Share your experience and WIN a tasty lunch for your team!' ) );\n\t\t\tpositive_page.find( '.page-text.block3' ).text( $.i18n._( 'We\\'ll select one winner each month.' ) );\n\t\t\tpositive_page.find( '.openReviewPageButton' )\n\t\t\t\t.html( $.i18n._( 'Share experience' ) )\n\t\t\t\t.bind( 'click', function() {\n\t\t\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: ' + getFeedbackType() + '-Link, Label: submit:feedback:' + options.source + ':' + feedback_rating, 'TFeedback.js', 'TFeedback', 'initPositivePage', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', getFeedbackType() + '-link', 'submit:' + getFeedbackType() + ':feedback:' + options.source + ':' + feedback_rating );\n\t\t\t\t\tsendDataToFeedbackAPI( feedback_rating, '', false );\n\t\t\t\t\ttriggerFeedbackReviewAPI( 1, true );\n\t\t\t\t\twindow.open( options.review_link, '_blank', 'review_link' );\n\t\t\t\t} );\n\t\t\tpositive_page.find( '.cancel-button' )\n\t\t\t\t.html( $.i18n._( 'I\\'m not hungry' ) ) //Skip the Lunch\n\t\t\t\t.click( function() {\n\t\t\t\t\ttriggerFeedbackReviewAPI( 0, true );\n\t\t\t\t\tDebug.Text( 'Feedback: Category: feedback, Action: cancel, Label: cancel:feedback:' + options.source + ':' + feedback_rating, 'TFeedback.js', 'TFeedback', 'cancelButtonClick', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', 'cancel', 'cancel:feedback:' + options.source + ':' + feedback_rating );\n\t\t\t\t} );\n\t\t}\n\n\t\tfunction initNegativePage() {\n\t\t\tvar feedback_rating = feedback.NEGATIVE;\n\t\t\tvar user_contact = getUserContactDetails();\n\t\t\tvar form_messagebox = negative_page.find( '.feedback-messagebox' );\n\t\t\tvar form_email = negative_page.find( '.feedback-email' );\n\t\t\tvar form_phone = negative_page.find( '.feedback-phone' );\n\n\t\t\tpage_title.html( $.i18n._( 'Feedback' ) );\n\t\t\tnegative_page.find( '.page-text' ).html( $.i18n._( 'We\\'re all ears!
What improvements do you think we should make?' ) );\n\t\t\tnegative_page.find( '.contact-notice-text' ).html( $.i18n._( 'What is the best way to contact you?' ) );\n\t\t\tnegative_page.find( '.email-label-text' ).html( $.i18n._( 'Email' ) );\n\t\t\tnegative_page.find( '.phone-label-text' ).html( $.i18n._( 'Phone' ) );\n\t\t\tform_email.val( user_contact.user_email );\n\t\t\tform_phone.val( user_contact.user_phone );\n\n\t\t\tnegative_page.find( '.sendButton' )\n\t\t\t\t.html( $.i18n._( 'Send' ) )\n\t\t\t\t.click( _sendForm );\n\t\t\tnegative_page.find( '.cancel-button' )\n\t\t\t\t.html( $.i18n._( 'Back' ) )\n\t\t\t\t.click( function() {\n\t\t\t\t\tshowPage( 'default' );\n\t\t\t\t\tDebug.Text( 'Feedback: Category: feedback, Action: cancel, Label: cancel:feedback:' + options.source + ':' + feedback_rating, 'TFeedback.js', 'TFeedback', 'cancelButtonClick', 10 );\n\t\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', 'cancel', 'cancel:feedback:' + options.source + ':' + feedback_rating );\n\t\t\t\t} );\n\n\t\t\tfunction _sendForm() {\n\t\t\t\tvar message = '';\n\t\t\t\tif ( form_messagebox.val().length > 0 ) {\n\t\t\t\t\tmessage = form_messagebox.val() + '\\nEmail: ' + form_email.val() + '\\nPhone: ' + form_phone.val();\n\t\t\t\t}\n\t\t\t\tDebug.Text( 'Feedback Analytics: Category: feedback, Action: submit, Label: submit:feedback:' + options.source + ':' + feedback_rating, 'TFeedback.js', 'TFeedback', 'initNegativePage._sendForm', 10 );\n\t\t\t\tGlobal.sendAnalyticsEvent( 'feedback', 'submit', 'submit:feedback:' + options.source + ':' + feedback_rating );\n\n\t\t\t\tsendDataToFeedbackAPI( feedback_rating, message, true );\n\t\t\t}\n\t\t}\n\n\t\tfunction showPage( page ) {\n\t\t\t// Set i18n translation text and pre-populate any data fields for requested page, then load page.\n\t\t\tswitch ( page ) {\n\t\t\t\tcase 'positive':\n\t\t\t\t\tinitPositivePage();\n\t\t\t\t\tall_pages.hide();\n\t\t\t\t\tpositive_page.show();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'negative':\n\t\t\t\t\tinitNegativePage();\n\t\t\t\t\tall_pages.hide();\n\t\t\t\t\tnegative_page.show();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tinitDefaultPage();\n\t\t\t\t\tall_pages.hide();\n\t\t\t\t\tdefault_page.show();\n\t\t\t}\n\t\t}\n\n\t\tfunction getUserContactDetails() {\n\t\t\tvar current_user_api = TTAPI.APIAuthentication;\n\t\t\tvar user = current_user_api.getCurrentUser( { async: false } );\n\t\t\tuser = user.getResult();\n\t\t\tvar user_email;\n\t\t\tif ( user.work_email != false && user.work_email != '' ) {\n\t\t\t\tuser_email = user.work_email;\n\t\t\t} else if ( user.home_email != false ) {\n\t\t\t\tuser_email = user.home_email;\n\t\t\t}\n\t\t\tvar user_phone;\n\t\t\tif ( user.work_phone != false && user.work_phone != '' ) {\n\t\t\t\tuser_phone = user.work_phone;\n\t\t\t} else if ( user.home_phone != false ) {\n\t\t\t\tuser_phone = user.home_phone;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tuser_email: user_email,\n\t\t\t\tuser_phone: user_phone\n\t\t\t};\n\t\t}\n\n\t\tfunction sendDataToFeedbackAPI( feedback_rating, message, close_window ) {\n\t\t\tif ( options.source ) {\n\t\t\t\tmessage += '\\n\\nFeedback source: ' + options.source;\n\t\t\t}\n\n\t\t\tapi.setUserFeedbackRating( feedback_rating, message, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\tif ( close_window ) {\n\t\t\t\t\t\t\tremoveFeedbackContainer();\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}\n\n\t\tfunction triggerFeedbackReviewAPI( review_state, close_window ) {\n\t\t\tapi.setUserFeedbackReview( review_state, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\tif ( close_window ) {\n\t\t\t\t\t\t\tremoveFeedbackContainer();\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}\n\n\t\t// this.each is typical jQuery format to apply the actions to all elements in the jQuery selector. In this case, not needed as we attach manually to the body tag, and won't work on empty selectors.\n\t\t// this.each( function() {\n\t\t// \tinit();\n\t\t// } );\n\n\t\tinit();\n\n\t\treturn this;\n\t};\n\n\t$.fn.TFeedback.html_template = `\n\t
\n\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t

\n\t\t\t\t\t

\n\t\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\x3c!--
--\x3e\n\t\t\t\t\t\x3c!----\x3e\n\t\t\t\t\t\x3c!----\x3e\n\t\t\t\t\t\x3c!--
--\x3e\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\t`;\n\n} )( jQuery );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIxOC5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRCxlQUFlO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLDJGQUEyRjtBQUNuSyx3RUFBd0UsMkZBQTJGO0FBQ25LO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLEdBQUcsTUFBTSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2ludGVyZmFjZS9odG1sNS9nbG9iYWwvd2lkZ2V0cy9mZWVkYmFjay9URmVlZGJhY2suanM/MjJiNyJdLCJzb3VyY2VzQ29udGVudCI6WyIoIGZ1bmN0aW9uKCAkICkge1xuXG5cdCQuZm4uVEZlZWRiYWNrID0gZnVuY3Rpb24oIF9vcHRpb25zICkge1xuXHRcdHZhciBvcHRpb25zID0gJC5leHRlbmQoIHtcblx0XHRcdHNvdXJjZTogJycsXG5cdFx0XHRmb3JjZV9zb3VyY2U6IGZhbHNlLCAvLyBkb2VzIG5vdCBwcmVwZW5kIHZpZXdJZCB0byBzb3VyY2UgdmFsdWVcblx0XHRcdGRlbGF5OiAwLFxuXHRcdFx0bWFudWFsX3RyaWdnZXI6IGZhbHNlLFxuXHRcdFx0cHJvbXB0X2Zvcl9mZWVkYmFjazogZmFsc2UsIC8vIERlZmF1bHQgaXMgZmFsc2Ugc28gdGhhdCBvbmx5IG1hbnVhbCB0cmlnZ2VyLCBjdXN0b20gZnVuY3Rpb25zLCBvciBzZXJ2ZXIgaW5wdXQgd2lsbCBtYWtlIHRoZSBmZWVkYmFjayBwb3B1cCBhcHBlYXIuXG5cdFx0XHRyZXZpZXdfbGluazogJ2h0dHBzOi8vd3d3LnRpbWV0cmV4LmNvbS9yP2lkPXJldmlldyZwcm9kdWN0X2VkaXRpb25faWQ9JyArIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpXG5cdFx0fSwgX29wdGlvbnMgKTtcblxuXHRcdC8vIERPTSByZWZlcmVuY2VzIGZvciBjb250YWluZXJzIGFuZCBwYWdlc1xuXHRcdHZhciBmZWVkYmFja19jb250YWluZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkZFRURCQUNLX0JPWCApOyAvLyBOb3RlOiBUaGVyZSBpcyBhIC5mZWVkYmFjay1vdmVybGF5IGRpdiBhdCB0aGUgcm9vdCBvZiBmZWVkYmFja19jb250YWluZXIgY29udHJvbGxlZCBieSBDU1MuXG5cdFx0dmFyIHBhZ2VfdGl0bGUgPSBmZWVkYmFja19jb250YWluZXIuZmluZCggJy50b3AtYmFyLXRpdGxlJyApO1xuXHRcdHZhciBhbGxfcGFnZXMgPSBmZWVkYmFja19jb250YWluZXIuZmluZCggJy5mZWVkYmFjay1wYWdlJyApO1xuXHRcdHZhciBkZWZhdWx0X3BhZ2UgPSBmZWVkYmFja19jb250YWluZXIuZmluZCggJy5mZWVkYmFjay1wYWdlLmRlZmF1bHQnICk7XG5cdFx0dmFyIHBvc2l0aXZlX3BhZ2UgPSBmZWVkYmFja19jb250YWluZXIuZmluZCggJy5mZWVkYmFjay1wYWdlLnBvc2l0aXZlJyApO1xuXHRcdHZhciBuZWdhdGl2ZV9wYWdlID0gZmVlZGJhY2tfY29udGFpbmVyLmZpbmQoICcuZmVlZGJhY2stcGFnZS5uZWdhdGl2ZScgKTtcblxuXHRcdHZhciBhcGkgPSBUVEFQSS5BUElVc2VyO1xuXG5cdFx0dmFyIGZlZWRiYWNrID0ge1xuXHRcdFx0UE9TSVRJVkU6ICdwb3N0aXRpdmUnLFxuXHRcdFx0TkVVVFJBTDogJ25ldXRyYWwnLFxuXHRcdFx0TkVHQVRJVkU6ICduZWdhdGl2ZSdcblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdFx0Ly8gY2hlY2sgdGhlIGZlZWRiYWNrIHByb21wdCBzdGF0dXMgc2V0IGJ5IEFQSVxuXHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKSAmJiBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5wcm9tcHRfZm9yX2ZlZWRiYWNrID09IHRydWUgKSB7XG5cdFx0XHRcdG9wdGlvbnMucHJvbXB0X2Zvcl9mZWVkYmFjayA9IHRydWU7XG5cdFx0XHRcdExvY2FsQ2FjaGVEYXRhLmdldExvZ2luVXNlcigpLnByb21wdF9mb3JfZmVlZGJhY2sgPSBmYWxzZTtcblx0XHRcdFx0Ly8gVE9ETzogQVBJIENhbGwgdG8gc2F2ZSB0aGUgbmV3IHZhbHVlXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9ucy5wcm9tcHRfZm9yX2ZlZWRiYWNrICkge1xuXHRcdFx0XHQvLyBBcHBlbmQgY3VycmVudCB2aWV3IGlkIHRvIHRoZSBzb3VyY2Vcblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5mb3JjZV9zb3VyY2UgKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5zb3VyY2UgPSBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fdmlld19pZCArICdAJyArIG9wdGlvbnMuc291cmNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSW5pdGlhbGlzZSB0aGUgZGVmYXVsdCBwYWdlIChub3QgdmlzaWJsZSB1bnRpbCBzaG93RmVlZGJhY2tDb250YWluZXIoKSBpcyB0cmlnZ2VyZWQuXG5cdFx0XHRcdHNob3dQYWdlKCAnZGVmYXVsdCcgKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IGZlZWRiYWNrIGRpYWxvZyBlaXRoZXIgaW1tZWRpYXRlbHkgb3Igd2l0aCBhIGRlbGF5XG5cdFx0XHRcdGlmICggb3B0aW9ucy5kZWxheSAmJiBvcHRpb25zLmRlbGF5ID4gMCApIHtcblx0XHRcdFx0XHRkZWxheVNob3dGZWVkYmFja0NvbnRhaW5lciggb3B0aW9ucy5kZWxheSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNob3dGZWVkYmFja0NvbnRhaW5lcigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0RmVlZGJhY2tUeXBlKCkge1xuXHRcdFx0aWYgKCBvcHRpb25zLm1hbnVhbF90cmlnZ2VyICkge1xuXHRcdFx0XHRyZXR1cm4gJ2NsaWNrJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiAncG9wdXAnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSB0aGUgZmVlZGJhY2sgcG9wdXAgZnJvbSBzaG93aW5nLlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGRlbGF5U2hvd0ZlZWRiYWNrQ29udGFpbmVyKCBkdXJhdGlvbiApIHtcblx0XHRcdGR1cmF0aW9uID0gZHVyYXRpb24gfHwgMDtcblx0XHRcdERlYnVnLlRleHQoICdTZXR0aW5nIGZlZWRiYWNrIGRpc3BsYXkgZGVsYXkgdG8gJyArIGR1cmF0aW9uLCAnVEZlZWRiYWNrLmpzJywgJ1RGZWVkYmFjaycsICdpbml0RGVmYXVsdFBhZ2UnLCAxMCApO1xuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdERlYnVnLlRleHQoICdUcmlnZ2VyaW5nIGRlbGF5ZWQgZmVlZGJhY2sgZGlzcGxheScsICdURmVlZGJhY2suanMnLCAnVEZlZWRiYWNrJywgJ2luaXREZWZhdWx0UGFnZScsIDEwICk7XG5cdFx0XHRcdHNob3dGZWVkYmFja0NvbnRhaW5lcigpO1xuXHRcdFx0fSwgZHVyYXRpb24gKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaG93RmVlZGJhY2tDb250YWluZXIoKSB7XG5cdFx0XHRpZiAoICQoICcuZmVlZGJhY2stY29udGFpbmVyJyApLmxlbmd0aCA9PSAwICkge1xuXHRcdFx0XHQkKCAnYm9keScgKS5hcHBlbmQoIGZlZWRiYWNrX2NvbnRhaW5lciApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0RGVidWcuVGV4dCggJ0VSUk9SOiBGZWVkYmFjayBjb250YWluZXIgYWxyZWFkeSBleGlzdHMsIGhhbHRpbmcgdG8gcHJldmVudCBkdXBsaWNhdGUgcG9wdXBzLicsICdURmVlZGJhY2suanMnLCAnVEZlZWRiYWNrJywgJ2luaXREZWZhdWx0UGFnZScsIDEgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiByZW1vdmVGZWVkYmFja0NvbnRhaW5lcigpIHtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBmZWVkYmFja19jb250YWluZXIgKSApIHtcblx0XHRcdFx0ZmVlZGJhY2tfY29udGFpbmVyLnJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGluaXREZWZhdWx0UGFnZSgpIHtcblx0XHRcdHBhZ2VfdGl0bGUuaHRtbCggJC5pMThuLl8oICdGZWVkYmFjaycgKSApO1xuXHRcdFx0ZGVmYXVsdF9wYWdlLmZpbmQoICcucGFnZS10ZXh0JyApLnRleHQoICQuaTE4bi5fKCAnVGVsbCB1cyB3aGF0IHlvdSB0aGluayBhYm91dCBUaW1lVHJleD8nICkgKTtcblxuXHRcdFx0ZGVmYXVsdF9wYWdlLmZpbmQoICcucG9zaXRpdmUtYnV0dG9uJyApXG5cdFx0XHRcdC5odG1sKCAkLmkxOG4uXyggJ0l0XFwncyBncmVhdCEnICkgKVxuXHRcdFx0XHQuYmluZCggJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0c2hvd1BhZ2UoICdwb3NpdGl2ZScgKTtcblx0XHRcdFx0XHREZWJ1Zy5UZXh0KCAnRmVlZGJhY2sgQW5hbHl0aWNzOiBDYXRlZ29yeTogZmVlZGJhY2ssIEFjdGlvbjogJyArIGdldEZlZWRiYWNrVHlwZSgpICsgJywgTGFiZWw6ICcgKyBnZXRGZWVkYmFja1R5cGUoKSArICc6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICsgJzonICsgZmVlZGJhY2suUE9TSVRJVkUsICdURmVlZGJhY2suanMnLCAnVEZlZWRiYWNrJywgJ2luaXREZWZhdWx0UGFnZScsIDEwICk7XG5cdFx0XHRcdFx0R2xvYmFsLnNlbmRBbmFseXRpY3NFdmVudCggJ2ZlZWRiYWNrJywgZ2V0RmVlZGJhY2tUeXBlKCksIGdldEZlZWRiYWNrVHlwZSgpICsgJzpmZWVkYmFjazonICsgb3B0aW9ucy5zb3VyY2UgKyAnOicgKyBmZWVkYmFjay5QT1NJVElWRSApO1xuXHRcdFx0XHRcdHNlbmREYXRhVG9GZWVkYmFja0FQSSggZmVlZGJhY2suUE9TSVRJVkUsICcnICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0ZGVmYXVsdF9wYWdlLmZpbmQoICcubmVnYXRpdmUtYnV0dG9uJyApXG5cdFx0XHRcdC5odG1sKCAkLmkxOG4uXyggJ05vdCBzbyBncmVhdCcgKSApXG5cdFx0XHRcdC5iaW5kKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRzaG93UGFnZSggJ25lZ2F0aXZlJyApO1xuXHRcdFx0XHRcdERlYnVnLlRleHQoICdGZWVkYmFjayBBbmFseXRpY3M6IENhdGVnb3J5OiBmZWVkYmFjaywgQWN0aW9uOiAnICsgZ2V0RmVlZGJhY2tUeXBlKCkgKyAnLCBMYWJlbDogJyArIGdldEZlZWRiYWNrVHlwZSgpICsgJzpmZWVkYmFjazonICsgb3B0aW9ucy5zb3VyY2UgKyAnOicgKyBmZWVkYmFjay5ORUdBVElWRSwgJ1RGZWVkYmFjay5qcycsICdURmVlZGJhY2snLCAnaW5pdERlZmF1bHRQYWdlJywgMTAgKTtcblx0XHRcdFx0XHRHbG9iYWwuc2VuZEFuYWx5dGljc0V2ZW50KCAnZmVlZGJhY2snLCBnZXRGZWVkYmFja1R5cGUoKSwgZ2V0RmVlZGJhY2tUeXBlKCkgKyAnOmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSArICc6JyArIGZlZWRiYWNrLk5FR0FUSVZFICk7XG5cdFx0XHRcdFx0c2VuZERhdGFUb0ZlZWRiYWNrQVBJKCBmZWVkYmFjay5ORUdBVElWRSwgJycgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgY2FuY2VsX3RleHQ7XG5cdFx0XHRpZiAoIG9wdGlvbnMubWFudWFsX3RyaWdnZXIgKSB7XG5cdFx0XHRcdGNhbmNlbF90ZXh0ID0gJC5pMThuLl8oICdDbG9zZScgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBjYW5jZWxfdGV4dCA9ICQuaTE4bi5fKCAnQXNrIG1lIGxhdGVyJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0X3BhZ2UuZmluZCggJy5jYW5jZWwtYnV0dG9uJyApXG5cdFx0XHRcdC5odG1sKCBjYW5jZWxfdGV4dCApXG5cdFx0XHRcdC5jbGljayggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmVtb3ZlRmVlZGJhY2tDb250YWluZXIoKTtcblx0XHRcdFx0XHREZWJ1Zy5UZXh0KCAnRmVlZGJhY2sgQW5hbHl0aWNzOiBDYXRlZ29yeTogZmVlZGJhY2ssIEFjdGlvbjogJyArIGdldEZlZWRiYWNrVHlwZSgpICsgJywgTGFiZWw6ICcgKyBnZXRGZWVkYmFja1R5cGUoKSArICc6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICsgJzonICsgZmVlZGJhY2suTkVVVFJBTCwgJ1RGZWVkYmFjay5qcycsICdURmVlZGJhY2snLCAnaW5pdERlZmF1bHRQYWdlJywgMTAgKTtcblx0XHRcdFx0XHRHbG9iYWwuc2VuZEFuYWx5dGljc0V2ZW50KCAnZmVlZGJhY2snLCBnZXRGZWVkYmFja1R5cGUoKSwgZ2V0RmVlZGJhY2tUeXBlKCkgKyAnOmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSArICc6JyArIGZlZWRiYWNrLk5FVVRSQUwgKTtcblx0XHRcdFx0XHRzZW5kRGF0YVRvRmVlZGJhY2tBUEkoIGZlZWRiYWNrLk5FVVRSQUwsICcnICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0RGVidWcuVGV4dCggJ0ZlZWRiYWNrIEFuYWx5dGljczogQ2F0ZWdvcnk6IGZlZWRiYWNrLCBBY3Rpb246ICcgKyBnZXRGZWVkYmFja1R5cGUoKSArICcsIExhYmVsOiAnICsgZ2V0RmVlZGJhY2tUeXBlKCkgKyAnOmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSwgJ1RGZWVkYmFjay5qcycsICdURmVlZGJhY2snLCAnaW5pdERlZmF1bHRQYWdlJywgMTAgKTtcblx0XHRcdEdsb2JhbC5zZW5kQW5hbHl0aWNzRXZlbnQoICdmZWVkYmFjaycsIGdldEZlZWRiYWNrVHlwZSgpLCBnZXRGZWVkYmFja1R5cGUoKSArICc6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaW5pdFBvc2l0aXZlUGFnZSgpIHtcblx0XHRcdHZhciBmZWVkYmFja19yYXRpbmcgPSBmZWVkYmFjay5QT1NJVElWRTtcblx0XHRcdHBhZ2VfdGl0bGUuaHRtbCggJC5pMThuLl8oICdGZWVkYmFjaycgKSApO1xuXHRcdFx0cG9zaXRpdmVfcGFnZS5maW5kKCAnLnBhZ2UtdGV4dC5ibG9jazEnICkudGV4dCggJC5pMThuLl8oICdJdCB0aHJpbGxzIHVzIHRvIGhlYXIgeW91IHRoaW5rIFRpbWVUcmV4IGlzIGdyZWF0IScgKSApO1xuXHRcdFx0cG9zaXRpdmVfcGFnZS5maW5kKCAnLnBhZ2UtdGV4dC5ibG9jazInICkudGV4dCggJC5pMThuLl8oICdTaGFyZSB5b3VyIGV4cGVyaWVuY2UgYW5kIFdJTiBhIHRhc3R5IGx1bmNoIGZvciB5b3VyIHRlYW0hJyApICk7XG5cdFx0XHRwb3NpdGl2ZV9wYWdlLmZpbmQoICcucGFnZS10ZXh0LmJsb2NrMycgKS50ZXh0KCAkLmkxOG4uXyggJ1dlXFwnbGwgc2VsZWN0IG9uZSB3aW5uZXIgZWFjaCBtb250aC4nICkgKTtcblx0XHRcdHBvc2l0aXZlX3BhZ2UuZmluZCggJy5vcGVuUmV2aWV3UGFnZUJ1dHRvbicgKVxuXHRcdFx0XHQuaHRtbCggJC5pMThuLl8oICdTaGFyZSBleHBlcmllbmNlJyApIClcblx0XHRcdFx0LmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdERlYnVnLlRleHQoICdGZWVkYmFjayBBbmFseXRpY3M6IENhdGVnb3J5OiBmZWVkYmFjaywgQWN0aW9uOiAnICsgZ2V0RmVlZGJhY2tUeXBlKCkgKyAnLUxpbmssIExhYmVsOiBzdWJtaXQ6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICsgJzonICsgZmVlZGJhY2tfcmF0aW5nLCAnVEZlZWRiYWNrLmpzJywgJ1RGZWVkYmFjaycsICdpbml0UG9zaXRpdmVQYWdlJywgMTAgKTtcblx0XHRcdFx0XHRHbG9iYWwuc2VuZEFuYWx5dGljc0V2ZW50KCAnZmVlZGJhY2snLCBnZXRGZWVkYmFja1R5cGUoKSArICctbGluaycsICdzdWJtaXQ6JyArIGdldEZlZWRiYWNrVHlwZSgpICsgJzpmZWVkYmFjazonICsgb3B0aW9ucy5zb3VyY2UgKyAnOicgKyBmZWVkYmFja19yYXRpbmcgKTtcblx0XHRcdFx0XHRzZW5kRGF0YVRvRmVlZGJhY2tBUEkoIGZlZWRiYWNrX3JhdGluZywgJycsIGZhbHNlICk7XG5cdFx0XHRcdFx0dHJpZ2dlckZlZWRiYWNrUmV2aWV3QVBJKCAxLCB0cnVlICk7XG5cdFx0XHRcdFx0d2luZG93Lm9wZW4oIG9wdGlvbnMucmV2aWV3X2xpbmssICdfYmxhbmsnLCAncmV2aWV3X2xpbmsnICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdHBvc2l0aXZlX3BhZ2UuZmluZCggJy5jYW5jZWwtYnV0dG9uJyApXG5cdFx0XHRcdC5odG1sKCAkLmkxOG4uXyggJ0lcXCdtIG5vdCBodW5ncnknICkgKSAvL1NraXAgdGhlIEx1bmNoXG5cdFx0XHRcdC5jbGljayggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dHJpZ2dlckZlZWRiYWNrUmV2aWV3QVBJKCAwLCB0cnVlICk7XG5cdFx0XHRcdFx0RGVidWcuVGV4dCggJ0ZlZWRiYWNrOiBDYXRlZ29yeTogZmVlZGJhY2ssIEFjdGlvbjogY2FuY2VsLCBMYWJlbDogY2FuY2VsOmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSArICc6JyArIGZlZWRiYWNrX3JhdGluZywgJ1RGZWVkYmFjay5qcycsICdURmVlZGJhY2snLCAnY2FuY2VsQnV0dG9uQ2xpY2snLCAxMCApO1xuXHRcdFx0XHRcdEdsb2JhbC5zZW5kQW5hbHl0aWNzRXZlbnQoICdmZWVkYmFjaycsICdjYW5jZWwnLCAnY2FuY2VsOmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSArICc6JyArIGZlZWRiYWNrX3JhdGluZyApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaW5pdE5lZ2F0aXZlUGFnZSgpIHtcblx0XHRcdHZhciBmZWVkYmFja19yYXRpbmcgPSBmZWVkYmFjay5ORUdBVElWRTtcblx0XHRcdHZhciB1c2VyX2NvbnRhY3QgPSBnZXRVc2VyQ29udGFjdERldGFpbHMoKTtcblx0XHRcdHZhciBmb3JtX21lc3NhZ2Vib3ggPSBuZWdhdGl2ZV9wYWdlLmZpbmQoICcuZmVlZGJhY2stbWVzc2FnZWJveCcgKTtcblx0XHRcdHZhciBmb3JtX2VtYWlsID0gbmVnYXRpdmVfcGFnZS5maW5kKCAnLmZlZWRiYWNrLWVtYWlsJyApO1xuXHRcdFx0dmFyIGZvcm1fcGhvbmUgPSBuZWdhdGl2ZV9wYWdlLmZpbmQoICcuZmVlZGJhY2stcGhvbmUnICk7XG5cblx0XHRcdHBhZ2VfdGl0bGUuaHRtbCggJC5pMThuLl8oICdGZWVkYmFjaycgKSApO1xuXHRcdFx0bmVnYXRpdmVfcGFnZS5maW5kKCAnLnBhZ2UtdGV4dCcgKS5odG1sKCAkLmkxOG4uXyggJ1dlXFwncmUgYWxsIGVhcnMhPGJyPldoYXQgaW1wcm92ZW1lbnRzIGRvIHlvdSB0aGluayB3ZSBzaG91bGQgbWFrZT8nICkgKTtcblx0XHRcdG5lZ2F0aXZlX3BhZ2UuZmluZCggJy5jb250YWN0LW5vdGljZS10ZXh0JyApLmh0bWwoICQuaTE4bi5fKCAnV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29udGFjdCB5b3U/JyApICk7XG5cdFx0XHRuZWdhdGl2ZV9wYWdlLmZpbmQoICcuZW1haWwtbGFiZWwtdGV4dCcgKS5odG1sKCAkLmkxOG4uXyggJ0VtYWlsJyApICk7XG5cdFx0XHRuZWdhdGl2ZV9wYWdlLmZpbmQoICcucGhvbmUtbGFiZWwtdGV4dCcgKS5odG1sKCAkLmkxOG4uXyggJ1Bob25lJyApICk7XG5cdFx0XHRmb3JtX2VtYWlsLnZhbCggdXNlcl9jb250YWN0LnVzZXJfZW1haWwgKTtcblx0XHRcdGZvcm1fcGhvbmUudmFsKCB1c2VyX2NvbnRhY3QudXNlcl9waG9uZSApO1xuXG5cdFx0XHRuZWdhdGl2ZV9wYWdlLmZpbmQoICcuc2VuZEJ1dHRvbicgKVxuXHRcdFx0XHQuaHRtbCggJC5pMThuLl8oICdTZW5kJyApIClcblx0XHRcdFx0LmNsaWNrKCBfc2VuZEZvcm0gKTtcblx0XHRcdG5lZ2F0aXZlX3BhZ2UuZmluZCggJy5jYW5jZWwtYnV0dG9uJyApXG5cdFx0XHRcdC5odG1sKCAkLmkxOG4uXyggJ0JhY2snICkgKVxuXHRcdFx0XHQuY2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHNob3dQYWdlKCAnZGVmYXVsdCcgKTtcblx0XHRcdFx0XHREZWJ1Zy5UZXh0KCAnRmVlZGJhY2s6IENhdGVnb3J5OiBmZWVkYmFjaywgQWN0aW9uOiBjYW5jZWwsIExhYmVsOiBjYW5jZWw6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICsgJzonICsgZmVlZGJhY2tfcmF0aW5nLCAnVEZlZWRiYWNrLmpzJywgJ1RGZWVkYmFjaycsICdjYW5jZWxCdXR0b25DbGljaycsIDEwICk7XG5cdFx0XHRcdFx0R2xvYmFsLnNlbmRBbmFseXRpY3NFdmVudCggJ2ZlZWRiYWNrJywgJ2NhbmNlbCcsICdjYW5jZWw6ZmVlZGJhY2s6JyArIG9wdGlvbnMuc291cmNlICsgJzonICsgZmVlZGJhY2tfcmF0aW5nICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0ZnVuY3Rpb24gX3NlbmRGb3JtKCkge1xuXHRcdFx0XHR2YXIgbWVzc2FnZSA9ICcnO1xuXHRcdFx0XHRpZiAoIGZvcm1fbWVzc2FnZWJveC52YWwoKS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdG1lc3NhZ2UgPSBmb3JtX21lc3NhZ2Vib3gudmFsKCkgKyAnXFxuRW1haWw6ICcgKyBmb3JtX2VtYWlsLnZhbCgpICsgJ1xcblBob25lOiAnICsgZm9ybV9waG9uZS52YWwoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHREZWJ1Zy5UZXh0KCAnRmVlZGJhY2sgQW5hbHl0aWNzOiBDYXRlZ29yeTogZmVlZGJhY2ssIEFjdGlvbjogc3VibWl0LCBMYWJlbDogc3VibWl0OmZlZWRiYWNrOicgKyBvcHRpb25zLnNvdXJjZSArICc6JyArIGZlZWRiYWNrX3JhdGluZywgJ1RGZWVkYmFjay5qcycsICdURmVlZGJhY2snLCAnaW5pdE5lZ2F0aXZlUGFnZS5fc2VuZEZvcm0nLCAxMCApO1xuXHRcdFx0XHRHbG9iYWwuc2VuZEFuYWx5dGljc0V2ZW50KCAnZmVlZGJhY2snLCAnc3VibWl0JywgJ3N1Ym1pdDpmZWVkYmFjazonICsgb3B0aW9ucy5zb3VyY2UgKyAnOicgKyBmZWVkYmFja19yYXRpbmcgKTtcblxuXHRcdFx0XHRzZW5kRGF0YVRvRmVlZGJhY2tBUEkoIGZlZWRiYWNrX3JhdGluZywgbWVzc2FnZSwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dQYWdlKCBwYWdlICkge1xuXHRcdFx0Ly8gU2V0IGkxOG4gdHJhbnNsYXRpb24gdGV4dCBhbmQgcHJlLXBvcHVsYXRlIGFueSBkYXRhIGZpZWxkcyBmb3IgcmVxdWVzdGVkIHBhZ2UsIHRoZW4gbG9hZCBwYWdlLlxuXHRcdFx0c3dpdGNoICggcGFnZSApIHtcblx0XHRcdFx0Y2FzZSAncG9zaXRpdmUnOlxuXHRcdFx0XHRcdGluaXRQb3NpdGl2ZVBhZ2UoKTtcblx0XHRcdFx0XHRhbGxfcGFnZXMuaGlkZSgpO1xuXHRcdFx0XHRcdHBvc2l0aXZlX3BhZ2Uuc2hvdygpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICduZWdhdGl2ZSc6XG5cdFx0XHRcdFx0aW5pdE5lZ2F0aXZlUGFnZSgpO1xuXHRcdFx0XHRcdGFsbF9wYWdlcy5oaWRlKCk7XG5cdFx0XHRcdFx0bmVnYXRpdmVfcGFnZS5zaG93KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aW5pdERlZmF1bHRQYWdlKCk7XG5cdFx0XHRcdFx0YWxsX3BhZ2VzLmhpZGUoKTtcblx0XHRcdFx0XHRkZWZhdWx0X3BhZ2Uuc2hvdygpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFVzZXJDb250YWN0RGV0YWlscygpIHtcblx0XHRcdHZhciBjdXJyZW50X3VzZXJfYXBpID0gVFRBUEkuQVBJQXV0aGVudGljYXRpb247XG5cdFx0XHR2YXIgdXNlciA9IGN1cnJlbnRfdXNlcl9hcGkuZ2V0Q3VycmVudFVzZXIoIHsgYXN5bmM6IGZhbHNlIH0gKTtcblx0XHRcdHVzZXIgPSB1c2VyLmdldFJlc3VsdCgpO1xuXHRcdFx0dmFyIHVzZXJfZW1haWw7XG5cdFx0XHRpZiAoIHVzZXIud29ya19lbWFpbCAhPSBmYWxzZSAmJiB1c2VyLndvcmtfZW1haWwgIT0gJycgKSB7XG5cdFx0XHRcdHVzZXJfZW1haWwgPSB1c2VyLndvcmtfZW1haWw7XG5cdFx0XHR9IGVsc2UgaWYgKCB1c2VyLmhvbWVfZW1haWwgIT0gZmFsc2UgKSB7XG5cdFx0XHRcdHVzZXJfZW1haWwgPSB1c2VyLmhvbWVfZW1haWw7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdXNlcl9waG9uZTtcblx0XHRcdGlmICggdXNlci53b3JrX3Bob25lICE9IGZhbHNlICYmIHVzZXIud29ya19waG9uZSAhPSAnJyApIHtcblx0XHRcdFx0dXNlcl9waG9uZSA9IHVzZXIud29ya19waG9uZTtcblx0XHRcdH0gZWxzZSBpZiAoIHVzZXIuaG9tZV9waG9uZSAhPSBmYWxzZSApIHtcblx0XHRcdFx0dXNlcl9waG9uZSA9IHVzZXIuaG9tZV9waG9uZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dXNlcl9lbWFpbDogdXNlcl9lbWFpbCxcblx0XHRcdFx0dXNlcl9waG9uZTogdXNlcl9waG9uZVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZW5kRGF0YVRvRmVlZGJhY2tBUEkoIGZlZWRiYWNrX3JhdGluZywgbWVzc2FnZSwgY2xvc2Vfd2luZG93ICkge1xuXHRcdFx0aWYgKCBvcHRpb25zLnNvdXJjZSApIHtcblx0XHRcdFx0bWVzc2FnZSArPSAnXFxuXFxuRmVlZGJhY2sgc291cmNlOiAnICsgb3B0aW9ucy5zb3VyY2U7XG5cdFx0XHR9XG5cblx0XHRcdGFwaS5zZXRVc2VyRmVlZGJhY2tSYXRpbmcoIGZlZWRiYWNrX3JhdGluZywgbWVzc2FnZSwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNsb3NlX3dpbmRvdyApIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlRmVlZGJhY2tDb250YWluZXIoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlnZ2VyRmVlZGJhY2tSZXZpZXdBUEkoIHJldmlld19zdGF0ZSwgY2xvc2Vfd2luZG93ICkge1xuXHRcdFx0YXBpLnNldFVzZXJGZWVkYmFja1JldmlldyggcmV2aWV3X3N0YXRlLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdGlmICggcmVzLmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdGlmICggY2xvc2Vfd2luZG93ICkge1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVGZWVkYmFja0NvbnRhaW5lcigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIHRoaXMuZWFjaCBpcyB0eXBpY2FsIGpRdWVyeSBmb3JtYXQgdG8gYXBwbHkgdGhlIGFjdGlvbnMgdG8gYWxsIGVsZW1lbnRzIGluIHRoZSBqUXVlcnkgc2VsZWN0b3IuIEluIHRoaXMgY2FzZSwgbm90IG5lZWRlZCBhcyB3ZSBhdHRhY2ggbWFudWFsbHkgdG8gdGhlIGJvZHkgdGFnLCBhbmQgd29uJ3Qgd29yayBvbiBlbXB0eSBzZWxlY3RvcnMuXG5cdFx0Ly8gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHQvLyBcdGluaXQoKTtcblx0XHQvLyB9ICk7XG5cblx0XHRpbml0KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQkLmZuLlRGZWVkYmFjay5odG1sX3RlbXBsYXRlID0gYFxuXHQ8ZGl2IGNsYXNzPVwiZmVlZGJhY2stb3ZlcmxheVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJmZWVkYmFjay1jb250YWluZXJcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0b3AtYmFyLXRpdGxlXCI+PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGV4dC1ib3hcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZlZWRiYWNrLXBhZ2UgZGVmYXVsdFwiPlxuXHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJ0b3AtaW1hZ2VcIiBzcmM9XCJ0aGVtZS9kZWZhdWx0L2Nzcy9nbG9iYWwvd2lkZ2V0cy9mZWVkYmFjay9pbWFnZXMvZG9nc19saXN0ZW5pbmdfd2l0aF9oZWFkX3R1cm5lZF9vcHRpbWl6ZWQucG5nXCI+XG5cdFx0XHRcdFx0PHAgY2xhc3M9XCJwYWdlLXRleHRcIj48L3A+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImZlZWRiYWNrLWJ1dHRvbiBidG4gYnRuLXN1Y2Nlc3MgcG9zaXRpdmUtYnV0dG9uXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImZlZWRiYWNrLWJ1dHRvbiBidG4gbmVnYXRpdmUtYnV0dG9uXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImZlZWRiYWNrLWJ1dHRvbiBidG4gY2FuY2VsLWJ1dHRvblwiPjwvYnV0dG9uPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZlZWRiYWNrLXBhZ2UgcG9zaXRpdmVcIj5cblx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwidG9wLWltYWdlXCIgc3JjPVwidGhlbWUvZGVmYXVsdC9jc3MvZ2xvYmFsL3dpZGdldHMvZmVlZGJhY2svaW1hZ2VzL2RvZ193aXRoX2tuaWZlX2FuZF9mb3JrX3NtX29wdGltaXplZC5wbmdcIj5cblx0XHRcdFx0XHQ8cCBjbGFzcz1cInBhZ2UtdGV4dCBibG9jazFcIj48L3A+XG5cdFx0XHRcdFx0PHAgY2xhc3M9XCJwYWdlLXRleHQgYmxvY2syXCI+PC9wPlxuXHRcdFx0XHRcdDxwIGNsYXNzPVwicGFnZS10ZXh0IGJsb2NrM1wiPjwvcD5cblx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGJ0biBidG4tc3VjY2VzcyBwb3NpdGl2ZS1idXR0b24gb3BlblJldmlld1BhZ2VCdXR0b25cIj48L2J1dHRvbj5cblx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGJ0biBjYW5jZWwtYnV0dG9uXCI+PC9idXR0b24+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmVlZGJhY2stcGFnZSBuZWdhdGl2ZVwiPlxuXHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJ0b3AtaW1hZ2VcIiBzcmM9XCJ0aGVtZS9kZWZhdWx0L2Nzcy9nbG9iYWwvd2lkZ2V0cy9mZWVkYmFjay9pbWFnZXMvZG9nX3dpdGhfYmlnX2VhcnNfb3B0aW1pemVkLnBuZ1wiPlxuXHRcdFx0XHRcdDxwIGNsYXNzPVwicGFnZS10ZXh0XCI+PC9wPlxuXHRcdFx0XHRcdDx0ZXh0YXJlYSBjbGFzcz1cImZlZWRiYWNrLW1lc3NhZ2Vib3hcIj48L3RleHRhcmVhPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ1c2VyLWNvbnRhY3QtZGV0YWlsc1wiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbnRhY3Qtbm90aWNlLXRleHRcIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj48c3BhbiBjbGFzcz1cImVtYWlsLWxhYmVsLXRleHRcIiBzdHlsZT1cIndpZHRoOjQwcHg7XCI+PC9zcGFuPiA8aW5wdXQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJmZWVkYmFjay1lbWFpbFwiIHBsYWNlaG9sZGVyPVwiRW1haWxcIiBzdHlsZT1cIndpZHRoOjIwZW07bGluZS1oZWlnaHQ6MTVweFwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPjxzcGFuIGNsYXNzPVwicGhvbmUtbGFiZWwtdGV4dFwiIHN0eWxlPVwid2lkdGg6NDBweDtcIj48L3NwYW4+IDxpbnB1dCB0eXBlPVwicGhvbmVcIiBjbGFzcz1cImZlZWRiYWNrLXBob25lXCIgcGxhY2Vob2xkZXI9XCJQaG9uZVwiIHN0eWxlPVwid2lkdGg6MjBlbTtsaW5lLWhlaWdodDoxNXB4XCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImZlZWRiYWNrLWJ1dHRvbiBidG4gYnRuLXN1Y2Nlc3MgcG9zaXRpdmUtYnV0dG9uIHNlbmRCdXR0b25cIj48L2J1dHRvbj5cblx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGJ0biBjYW5jZWwtYnV0dG9uXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0PCEtLTxkaXYgY2xhc3M9XCJib3R0b20tYmFyXCI+LS0+XG5cdFx0XHRcdFx0PCEtLTxidXR0b24gY2xhc3M9XCJmZWVkYmFjay1idXR0b24gc2VuZEJ1dHRvblwiPjwvYnV0dG9uPi0tPlxuXHRcdFx0XHRcdDwhLS08YnV0dG9uIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGNhbmNlbC1idXR0b25cIj48L2J1dHRvbj4tLT5cblx0XHRcdFx0XHQ8IS0tPC9kaXY+LS0+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHRgO1xuXG59ICkoIGpRdWVyeSApO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8218\n")}}]);