"use strict"; class Dev_Modals { static on_app_ready() { if (!$('.Dev_Modals').exists()) return; Dev_Modals.init(); } static init() { // Simple Dialogs $('#test-alert').on('click', async () => { await Modal.alert('This is a simple alert message'); Dev_Modals.show_result('simple', 'Alert acknowledged'); }); $('#test-alert-title').on('click', async () => { await Modal.alert('Custom Title', 'This alert has a custom title'); Dev_Modals.show_result('simple', 'Alert with title acknowledged'); }); $('#test-confirm').on('click', async () => { const result = await Modal.confirm('Are you sure you want to proceed?'); Dev_Modals.show_result('simple', `Confirm result: ${result}`); }); $('#test-confirm-title').on('click', async () => { const result = await Modal.confirm('Delete Item', 'Are you sure you want to delete this item?'); Dev_Modals.show_result('simple', `Confirm with title result: ${result}`); }); $('#test-prompt').on('click', async () => { const result = await Modal.prompt('What is your name?'); Dev_Modals.show_result('simple', `Prompt result: ${result === false ? 'Cancelled' : result}`); }); $('#test-prompt-default').on('click', async () => { const result = await Modal.prompt('Enter your email:', null, 'user@example.com'); Dev_Modals.show_result('simple', `Prompt with default result: ${result === false ? 'Cancelled' : result}`); }); $('#test-prompt-multiline').on('click', async () => { const result = await Modal.prompt('Enter your feedback:', null, 'Type your feedback here...', true); Dev_Modals.show_result('simple', `Multiline prompt result: ${result === false ? 'Cancelled' : result}`); }); $('#test-prompt-rich').on('click', async () => { // Create rich formatted content above the input const $rich_content = $('
').html('Please enter your full name as it appears on your ' + 'official documents.')).append($('
').html('Required fields must be completed before submission.')).append($('
').text('Example: John Michael Smith')); const result = await Modal.prompt($rich_content, null, '', false); Dev_Modals.show_result('simple', `Rich text prompt result: ${result === false ? 'Cancelled' : result}`); }); $('#test-prompt-validation').on('click', async () => { // Demonstrate validation pattern: keep reopening until valid or cancelled let email = ''; let error = null; let valid = false; while (!valid) { email = await Modal.prompt('Email Validation', 'Please enter a valid email address:', email, false, error); // User cancelled if (email === false) { Dev_Modals.show_result('simple', 'Prompt cancelled'); return; } // Validate email (simple check) if (!email || email.trim() === '') { error = 'Email address is required'; } else if (!email.includes('@') || !email.includes('.')) { error = 'Please enter a valid email address (must contain @ and .)'; } else if (email.length < 5) { error = 'Email address is too short'; } else { // Valid! valid = true; } } Dev_Modals.show_result('simple', `Valid email entered: ${email}`); }); // Custom Modals $('#test-custom-2btn').on('click', async () => { const result = await Modal.show({ title: 'Custom Two Button Modal', body: 'This modal has two custom buttons with different values', buttons: [{ label: 'Option A', value: 'option_a', class: 'btn-secondary' }, { label: 'Option B', value: 'option_b', class: 'btn-primary', default: true }] }); Dev_Modals.show_result('custom', `Two button result: ${result}`); }); $('#test-custom-3btn').on('click', async () => { const result = await Modal.show({ title: 'Three Button Modal', body: 'Choose one of three options', buttons: [{ label: 'Cancel', value: false, class: 'btn-secondary' }, { label: 'Save Draft', value: 'draft', class: 'btn-info' }, { label: 'Publish', value: 'publish', class: 'btn-success', default: true }] }); Dev_Modals.show_result('custom', `Three button result: ${result}`); }); $('#test-custom-danger').on('click', async () => { const result = await Modal.show({ title: 'Dangerous Action', body: 'This action cannot be undone. Are you absolutely sure?', buttons: [{ label: 'Cancel', value: false, class: 'btn-secondary' }, { label: 'Delete Forever', value: true, class: 'btn-danger', default: true }] }); Dev_Modals.show_result('custom', `Dangerous action result: ${result}`); }); $('#test-custom-jquery').on('click', async () => { const $content = $('
').text('This modal body contains jQuery elements')).append($('
').html('Formatted text and styling')); const result = await Modal.show({ title: 'jQuery Content', body: $content, buttons: [{ label: 'Close', value: true, class: 'btn-primary', default: true }] }); Dev_Modals.show_result('custom', 'jQuery content modal closed'); }); $('#test-custom-wide').on('click', async () => { const result = await Modal.show({ title: 'Wide Modal (1200px)', body: 'This modal has a max width of 1200px, useful for forms or data tables that need more horizontal space.', max_width: 1200, buttons: [{ label: 'Close', value: true, class: 'btn-primary', default: true }] }); Dev_Modals.show_result('custom', 'Wide modal closed'); }); // Special Behaviors $('#test-unclosable').on('click', async () => { Modal.unclosable('Processing', 'Please wait while we process your request...'); // Simulate processing setTimeout(async () => { await Modal.close(); Dev_Modals.show_result('special', 'Unclosable modal was closed programmatically after 3 seconds'); }, 3000); }); $('#test-queue').on('click', async () => { // Queue 3 modals const promise1 = Modal.alert('First Modal', 'This is the first modal in the queue'); const promise2 = Modal.alert('Second Modal', 'This is the second modal in the queue'); const promise3 = Modal.alert('Third Modal', 'This is the third and final modal'); await Promise.all([promise1, promise2, promise3]); Dev_Modals.show_result('special', 'All 3 queued modals completed'); }); $('#test-error').on('click', async () => { const error_obj = { message: 'An error occurred while processing your request' }; await Modal.error(error_obj, 'Error'); Dev_Modals.show_result('special', 'Error modal shown'); }); $('#test-tall').on('click', async () => { let tall_content = '
Paragraph ${i}: This is a long paragraph that helps demonstrate scrolling behavior when content exceeds the 80% viewport height threshold.
`; } const result = await Modal.show({ title: 'Tall Content (Scrolling Test)', body: tall_content, buttons: [{ label: 'Close', value: true, class: 'btn-primary', default: true }] }); Dev_Modals.show_result('special', 'Tall content modal closed'); }); // Form Modals $('#test-form-simple').on('click', async () => { const result = await Modal.form({ title: 'User Registration', component: 'Test_Modal_Form', on_submit: async form => { // Get form values const values = form.vals(); // Simple validation - just check required fields if (!values.name || !values.email || !values.role) { Form_Utils.apply_form_errors(form.$, 'Please fill in all required fields'); return false; // Keep modal open } // Simulate saving await sleep(500); // Return data to close modal return values; } }); if (result) { Dev_Modals.show_result('form', `Form submitted: ${json_encode(result)}`); } else { Dev_Modals.show_result('form', 'Form cancelled'); } }); $('#test-form-validation').on('click', async () => { const result = await Modal.form({ title: 'User Registration (With Server Validation)', component: 'Test_Modal_Form', on_submit: async form => { // Get form values const values = form.vals(); // Simulate server-side validation await sleep(500); // Simulate validation errors const errors = {}; if (!values.name || values.name.length < 3) { errors.name = 'Name must be at least 3 characters'; } if (!values.email || !values.email.includes('@')) { errors.email = 'Please enter a valid email address'; } if (!values.role) { errors.role = 'Please select a role'; } // If there are errors, show them and keep modal open if (Object.keys(errors).length > 0) { Form_Utils.apply_form_errors(form.$, errors); return false; // Keep modal open } // Success - return data return values; } }); if (result) { Dev_Modals.show_result('form', `Form submitted successfully: ${json_encode(result)}`); } else { Dev_Modals.show_result('form', 'Form cancelled'); } }); $('#test-form-prefilled').on('click', async () => { const result = await Modal.form({ title: 'Edit User Profile', component: 'Test_Modal_Form', component_args: { data: { name: 'John Smith', email: 'john.smith@example.com', role: 'manager' } }, submit_label: 'Update', on_submit: async form => { const values = form.vals(); // Simple validation if (!values.name || !values.email || !values.role) { await Modal.alert('Please fill in all required fields'); return false; } // Simulate update await sleep(500); return values; } }); if (result) { Dev_Modals.show_result('form', `Profile updated: ${json_encode(result)}`); } else { Dev_Modals.show_result('form', 'Update cancelled'); } }); $('#test-form-pin').on('click', async () => { const result = await Modal.form({ title: 'Enter Verification Code', component: 'Pin_Verification_Form', submit_label: 'Verify', max_width: 450, on_submit: async form => { const pin = form.val(); // Validate PIN is complete if (pin.length !== 6) { Form_Utils.apply_form_errors(form.$, 'Please enter all 6 digits'); return false; } // Simulate PIN verification await sleep(800); // Simulate checking against correct PIN const correct_pin = '123456'; if (pin !== correct_pin) { Form_Utils.apply_form_errors(form.$, `Incorrect PIN. (Hint: try ${correct_pin})`); // Clear the PIN and refocus first input form.val(''); return false; } // Success return { pin: pin, verified: true }; } }); if (result) { Dev_Modals.show_result('form', `PIN verified successfully: ${result.pin}`); } else { Dev_Modals.show_result('form', 'PIN verification cancelled'); } }); // Modal State $('#check-state').on('click', () => { const state = { is_open: Modal.is_open(), current_modal: Modal.get_current() !== null ? 'Modal instance exists' : null }; const formatted = json_encode(state, null, 2); $('#state-result').show(); $('#state-result-text').text(formatted); }); $('#force-close').on('click', async () => { if (Modal.is_open()) { await Modal.close(); Dev_Modals.show_result('special', 'Modal was force closed'); } else { Dev_Modals.show_result('special', 'No modal is currently open'); } }); } static show_result(section, message) { const $result = $(`#${section}-result`); const $text = $(`#${section}-result-text`); $text.text(message); $result.show(); // Hide after 5 seconds setTimeout(() => { $result.fadeOut(); }, 5000); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZXZfTW9kYWxzIiwib25fYXBwX3JlYWR5IiwiJCIsImV4aXN0cyIsImluaXQiLCJvbiIsIk1vZGFsIiwiYWxlcnQiLCJzaG93X3Jlc3VsdCIsInJlc3VsdCIsImNvbmZpcm0iLCJwcm9tcHQiLCIkcmljaF9jb250ZW50IiwiYXBwZW5kIiwidGV4dCIsImh0bWwiLCJlbWFpbCIsImVycm9yIiwidmFsaWQiLCJ0cmltIiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJzaG93IiwidGl0bGUiLCJib2R5IiwiYnV0dG9ucyIsImxhYmVsIiwidmFsdWUiLCJjbGFzcyIsImRlZmF1bHQiLCIkY29udGVudCIsIm1heF93aWR0aCIsInVuY2xvc2FibGUiLCJzZXRUaW1lb3V0IiwiY2xvc2UiLCJwcm9taXNlMSIsInByb21pc2UyIiwicHJvbWlzZTMiLCJQcm9taXNlIiwiYWxsIiwiZXJyb3Jfb2JqIiwibWVzc2FnZSIsInRhbGxfY29udGVudCIsImkiLCJmb3JtIiwiY29tcG9uZW50Iiwib25fc3VibWl0IiwidmFsdWVzIiwidmFscyIsIm5hbWUiLCJyb2xlIiwiRm9ybV9VdGlscyIsImFwcGx5X2Zvcm1fZXJyb3JzIiwic2xlZXAiLCJqc29uX2VuY29kZSIsImVycm9ycyIsIk9iamVjdCIsImtleXMiLCJjb21wb25lbnRfYXJncyIsImRhdGEiLCJzdWJtaXRfbGFiZWwiLCJwaW4iLCJ2YWwiLCJjb3JyZWN0X3BpbiIsInZlcmlmaWVkIiwic3RhdGUiLCJpc19vcGVuIiwiY3VycmVudF9tb2RhbCIsImdldF9jdXJyZW50IiwiZm9ybWF0dGVkIiwic2VjdGlvbiIsIiRyZXN1bHQiLCIkdGV4dCIsImZhZGVPdXQiXSwic291cmNlcyI6WyJyc3gvYXBwL2Rldi9tb2RhbHMvZGV2X21vZGFscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBEZXZfTW9kYWxzIHtcbiAgICBzdGF0aWMgb25fYXBwX3JlYWR5KCkge1xuICAgICAgICBpZiAoISQoJy5EZXZfTW9kYWxzJykuZXhpc3RzKCkpIHJldHVybjtcbiAgICAgICAgRGV2X01vZGFscy5pbml0KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGluaXQoKSB7XG4gICAgICAgIC8vIFNpbXBsZSBEaWFsb2dzXG4gICAgICAgICQoJyN0ZXN0LWFsZXJ0Jykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgTW9kYWwuYWxlcnQoJ1RoaXMgaXMgYSBzaW1wbGUgYWxlcnQgbWVzc2FnZScpO1xuICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnc2ltcGxlJywgJ0FsZXJ0IGFja25vd2xlZGdlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1hbGVydC10aXRsZScpLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IE1vZGFsLmFsZXJ0KCdDdXN0b20gVGl0bGUnLCAnVGhpcyBhbGVydCBoYXMgYSBjdXN0b20gdGl0bGUnKTtcbiAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ3NpbXBsZScsICdBbGVydCB3aXRoIHRpdGxlIGFja25vd2xlZGdlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1jb25maXJtJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwuY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/Jyk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzaW1wbGUnLCBgQ29uZmlybSByZXN1bHQ6ICR7cmVzdWx0fWApO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1jb25maXJtLXRpdGxlJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwuY29uZmlybSgnRGVsZXRlIEl0ZW0nLCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGl0ZW0/Jyk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzaW1wbGUnLCBgQ29uZmlybSB3aXRoIHRpdGxlIHJlc3VsdDogJHtyZXN1bHR9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LXByb21wdCcpLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLnByb21wdCgnV2hhdCBpcyB5b3VyIG5hbWU/Jyk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzaW1wbGUnLCBgUHJvbXB0IHJlc3VsdDogJHtyZXN1bHQgPT09IGZhbHNlID8gJ0NhbmNlbGxlZCcgOiByZXN1bHR9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LXByb21wdC1kZWZhdWx0Jykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwucHJvbXB0KCdFbnRlciB5b3VyIGVtYWlsOicsIG51bGwsICd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzaW1wbGUnLCBgUHJvbXB0IHdpdGggZGVmYXVsdCByZXN1bHQ6ICR7cmVzdWx0ID09PSBmYWxzZSA/ICdDYW5jZWxsZWQnIDogcmVzdWx0fWApO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1wcm9tcHQtbXVsdGlsaW5lJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwucHJvbXB0KCdFbnRlciB5b3VyIGZlZWRiYWNrOicsIG51bGwsICdUeXBlIHlvdXIgZmVlZGJhY2sgaGVyZS4uLicsIHRydWUpO1xuICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnc2ltcGxlJywgYE11bHRpbGluZSBwcm9tcHQgcmVzdWx0OiAke3Jlc3VsdCA9PT0gZmFsc2UgPyAnQ2FuY2VsbGVkJyA6IHJlc3VsdH1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI3Rlc3QtcHJvbXB0LXJpY2gnKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgcmljaCBmb3JtYXR0ZWQgY29udGVudCBhYm92ZSB0aGUgaW5wdXRcbiAgICAgICAgICAgIGNvbnN0ICRyaWNoX2NvbnRlbnQgPSAkKCc8ZGl2PicpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aDUgc3R5bGU9XCJjb2xvcjogIzJjM2U1MDsgbWFyZ2luLWJvdHRvbTogMTVweDtcIj4nKS50ZXh0KCdVc2VyIFJlZ2lzdHJhdGlvbiBGb3JtJykpXG4gICAgICAgICAgICAgICAgLmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgJCgnPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4O1wiPicpLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGVudGVyIHlvdXIgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiAjZTc0YzNjO1wiPmZ1bGwgbmFtZTwvc3Ryb25nPiBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxlbSBzdHlsZT1cImNvbG9yOiAjMzQ5OGRiO1wiPm9mZmljaWFsIGRvY3VtZW50czwvZW0+LidcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAkKCc8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEwcHg7XCI+JykuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogIzI3YWU2MDtcIj5SZXF1aXJlZCBmaWVsZHM8L3NwYW4+IG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBzdWJtaXNzaW9uLidcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNjZDsgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZmZjMTA3OyBwYWRkaW5nOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAyMHB4O1wiPicpLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHN0cm9uZz7imqAgTm90ZTo8L3N0cm9uZz4gPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDE0cHg7XCI+WW91ciBuYW1lIHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mZmljaWFsIGNvcnJlc3BvbmRlbmNlLjwvc3Bhbj4nXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8cCBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDsgY29sb3I6ICM3ZjhjOGQ7IG1hcmdpbi1ib3R0b206IDI1cHg7XCI+JykudGV4dCgnRXhhbXBsZTogSm9obiBNaWNoYWVsIFNtaXRoJykpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNb2RhbC5wcm9tcHQoJHJpY2hfY29udGVudCwgbnVsbCwgJycsIGZhbHNlKTtcbiAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ3NpbXBsZScsIGBSaWNoIHRleHQgcHJvbXB0IHJlc3VsdDogJHtyZXN1bHQgPT09IGZhbHNlID8gJ0NhbmNlbGxlZCcgOiByZXN1bHR9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LXByb21wdC12YWxpZGF0aW9uJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRGVtb25zdHJhdGUgdmFsaWRhdGlvbiBwYXR0ZXJuOiBrZWVwIHJlb3BlbmluZyB1bnRpbCB2YWxpZCBvciBjYW5jZWxsZWRcbiAgICAgICAgICAgIGxldCBlbWFpbCA9ICcnO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB2YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB3aGlsZSAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgZW1haWwgPSBhd2FpdCBNb2RhbC5wcm9tcHQoJ0VtYWlsIFZhbGlkYXRpb24nLCAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzczonLCBlbWFpbCwgZmFsc2UsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgaWYgKGVtYWlsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzaW1wbGUnLCAnUHJvbXB0IGNhbmNlbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgZW1haWwgKHNpbXBsZSBjaGVjaylcbiAgICAgICAgICAgICAgICBpZiAoIWVtYWlsIHx8IGVtYWlsLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAnRW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSB8fCAhZW1haWwuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIChtdXN0IGNvbnRhaW4gQCBhbmQgLiknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW1haWwubGVuZ3RoIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICdFbWFpbCBhZGRyZXNzIGlzIHRvbyBzaG9ydCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWQhXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ3NpbXBsZScsIGBWYWxpZCBlbWFpbCBlbnRlcmVkOiAke2VtYWlsfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDdXN0b20gTW9kYWxzXG4gICAgICAgICQoJyN0ZXN0LWN1c3RvbS0yYnRuJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwuc2hvdyh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDdXN0b20gVHdvIEJ1dHRvbiBNb2RhbCcsXG4gICAgICAgICAgICAgICAgYm9keTogJ1RoaXMgbW9kYWwgaGFzIHR3byBjdXN0b20gYnV0dG9ucyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMnLFxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ09wdGlvbiBBJywgdmFsdWU6ICdvcHRpb25fYScsIGNsYXNzOiAnYnRuLXNlY29uZGFyeScgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ09wdGlvbiBCJywgdmFsdWU6ICdvcHRpb25fYicsIGNsYXNzOiAnYnRuLXByaW1hcnknLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnY3VzdG9tJywgYFR3byBidXR0b24gcmVzdWx0OiAke3Jlc3VsdH1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI3Rlc3QtY3VzdG9tLTNidG4nKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNb2RhbC5zaG93KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1RocmVlIEJ1dHRvbiBNb2RhbCcsXG4gICAgICAgICAgICAgICAgYm9keTogJ0Nob29zZSBvbmUgb2YgdGhyZWUgb3B0aW9ucycsXG4gICAgICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FuY2VsJywgdmFsdWU6IGZhbHNlLCBjbGFzczogJ2J0bi1zZWNvbmRhcnknIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdTYXZlIERyYWZ0JywgdmFsdWU6ICdkcmFmdCcsIGNsYXNzOiAnYnRuLWluZm8nIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdQdWJsaXNoJywgdmFsdWU6ICdwdWJsaXNoJywgY2xhc3M6ICdidG4tc3VjY2VzcycsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdjdXN0b20nLCBgVGhyZWUgYnV0dG9uIHJlc3VsdDogJHtyZXN1bHR9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LWN1c3RvbS1kYW5nZXInKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNb2RhbC5zaG93KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Rhbmdlcm91cyBBY3Rpb24nLFxuICAgICAgICAgICAgICAgIGJvZHk6ICdUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IGFic29sdXRlbHkgc3VyZT8nLFxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ0NhbmNlbCcsIHZhbHVlOiBmYWxzZSwgY2xhc3M6ICdidG4tc2Vjb25kYXJ5JyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVsZXRlIEZvcmV2ZXInLCB2YWx1ZTogdHJ1ZSwgY2xhc3M6ICdidG4tZGFuZ2VyJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2N1c3RvbScsIGBEYW5nZXJvdXMgYWN0aW9uIHJlc3VsdDogJHtyZXN1bHR9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LWN1c3RvbS1qcXVlcnknKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkY29udGVudCA9ICQoJzxkaXY+JylcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxwPicpLnRleHQoJ1RoaXMgbW9kYWwgYm9keSBjb250YWlucyBqUXVlcnkgZWxlbWVudHMnKSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAkKCc8dWw+JylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGxpPicpLnRleHQoJ0ZpcnN0IGl0ZW0nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGxpPicpLnRleHQoJ1NlY29uZCBpdGVtJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxsaT4nKS50ZXh0KCdUaGlyZCBpdGVtJykpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHA+JykuaHRtbCgnPHN0cm9uZz5Gb3JtYXR0ZWQgdGV4dDwvc3Ryb25nPiBhbmQgPGVtPnN0eWxpbmc8L2VtPicpKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwuc2hvdyh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdqUXVlcnkgQ29udGVudCcsXG4gICAgICAgICAgICAgICAgYm9keTogJGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgYnV0dG9uczogW3sgbGFiZWw6ICdDbG9zZScsIHZhbHVlOiB0cnVlLCBjbGFzczogJ2J0bi1wcmltYXJ5JywgZGVmYXVsdDogdHJ1ZSB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnY3VzdG9tJywgJ2pRdWVyeSBjb250ZW50IG1vZGFsIGNsb3NlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1jdXN0b20td2lkZScpLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLnNob3coe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnV2lkZSBNb2RhbCAoMTIwMHB4KScsXG4gICAgICAgICAgICAgICAgYm9keTogJ1RoaXMgbW9kYWwgaGFzIGEgbWF4IHdpZHRoIG9mIDEyMDBweCwgdXNlZnVsIGZvciBmb3JtcyBvciBkYXRhIHRhYmxlcyB0aGF0IG5lZWQgbW9yZSBob3Jpem9udGFsIHNwYWNlLicsXG4gICAgICAgICAgICAgICAgbWF4X3dpZHRoOiAxMjAwLFxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFt7IGxhYmVsOiAnQ2xvc2UnLCB2YWx1ZTogdHJ1ZSwgY2xhc3M6ICdidG4tcHJpbWFyeScsIGRlZmF1bHQ6IHRydWUgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2N1c3RvbScsICdXaWRlIG1vZGFsIGNsb3NlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTcGVjaWFsIEJlaGF2aW9yc1xuICAgICAgICAkKCcjdGVzdC11bmNsb3NhYmxlJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgTW9kYWwudW5jbG9zYWJsZSgnUHJvY2Vzc2luZycsICdQbGVhc2Ugd2FpdCB3aGlsZSB3ZSBwcm9jZXNzIHlvdXIgcmVxdWVzdC4uLicpO1xuXG4gICAgICAgICAgICAvLyBTaW11bGF0ZSBwcm9jZXNzaW5nXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBNb2RhbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ3NwZWNpYWwnLCAnVW5jbG9zYWJsZSBtb2RhbCB3YXMgY2xvc2VkIHByb2dyYW1tYXRpY2FsbHkgYWZ0ZXIgMyBzZWNvbmRzJyk7XG4gICAgICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI3Rlc3QtcXVldWUnKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBRdWV1ZSAzIG1vZGFsc1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZTEgPSBNb2RhbC5hbGVydCgnRmlyc3QgTW9kYWwnLCAnVGhpcyBpcyB0aGUgZmlyc3QgbW9kYWwgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlMiA9IE1vZGFsLmFsZXJ0KCdTZWNvbmQgTW9kYWwnLCAnVGhpcyBpcyB0aGUgc2Vjb25kIG1vZGFsIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZTMgPSBNb2RhbC5hbGVydCgnVGhpcmQgTW9kYWwnLCAnVGhpcyBpcyB0aGUgdGhpcmQgYW5kIGZpbmFsIG1vZGFsJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzXSk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzcGVjaWFsJywgJ0FsbCAzIHF1ZXVlZCBtb2RhbHMgY29tcGxldGVkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyN0ZXN0LWVycm9yJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyb3Jfb2JqID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHlvdXIgcmVxdWVzdCcsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCBNb2RhbC5lcnJvcihlcnJvcl9vYmosICdFcnJvcicpO1xuICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnc3BlY2lhbCcsICdFcnJvciBtb2RhbCBzaG93bicpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC10YWxsJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRhbGxfY29udGVudCA9ICc8aDY+U2Nyb2xsYWJsZSBDb250ZW50PC9oNj4nO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTA7IGkrKykge1xuICAgICAgICAgICAgICAgIHRhbGxfY29udGVudCArPSBgPHA+UGFyYWdyYXBoICR7aX06IFRoaXMgaXMgYSBsb25nIHBhcmFncmFwaCB0aGF0IGhlbHBzIGRlbW9uc3RyYXRlIHNjcm9sbGluZyBiZWhhdmlvciB3aGVuIGNvbnRlbnQgZXhjZWVkcyB0aGUgODAlIHZpZXdwb3J0IGhlaWdodCB0aHJlc2hvbGQuPC9wPmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLnNob3coe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnVGFsbCBDb250ZW50IChTY3JvbGxpbmcgVGVzdCknLFxuICAgICAgICAgICAgICAgIGJvZHk6IHRhbGxfY29udGVudCxcbiAgICAgICAgICAgICAgICBidXR0b25zOiBbeyBsYWJlbDogJ0Nsb3NlJywgdmFsdWU6IHRydWUsIGNsYXNzOiAnYnRuLXByaW1hcnknLCBkZWZhdWx0OiB0cnVlIH1dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdzcGVjaWFsJywgJ1RhbGwgY29udGVudCBtb2RhbCBjbG9zZWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRm9ybSBNb2RhbHNcbiAgICAgICAgJCgnI3Rlc3QtZm9ybS1zaW1wbGUnKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNb2RhbC5mb3JtKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1VzZXIgUmVnaXN0cmF0aW9uJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICdUZXN0X01vZGFsX0Zvcm0nLFxuICAgICAgICAgICAgICAgIG9uX3N1Ym1pdDogYXN5bmMgKGZvcm0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGZvcm0gdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm0udmFscygpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZSB2YWxpZGF0aW9uIC0ganVzdCBjaGVjayByZXF1aXJlZCBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMubmFtZSB8fCAhdmFsdWVzLmVtYWlsIHx8ICF2YWx1ZXMucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRm9ybV9VdGlscy5hcHBseV9mb3JtX2Vycm9ycyhmb3JtLiQsICdQbGVhc2UgZmlsbCBpbiBhbGwgcmVxdWlyZWQgZmllbGRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEtlZXAgbW9kYWwgb3BlblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgc2F2aW5nXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGRhdGEgdG8gY2xvc2UgbW9kYWxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdmb3JtJywgYEZvcm0gc3VibWl0dGVkOiAke2pzb25fZW5jb2RlKHJlc3VsdCl9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCAnRm9ybSBjYW5jZWxsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI3Rlc3QtZm9ybS12YWxpZGF0aW9uJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTW9kYWwuZm9ybSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdVc2VyIFJlZ2lzdHJhdGlvbiAoV2l0aCBTZXJ2ZXIgVmFsaWRhdGlvbiknLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ1Rlc3RfTW9kYWxfRm9ybScsXG4gICAgICAgICAgICAgICAgb25fc3VibWl0OiBhc3luYyAoZm9ybSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZm9ybSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybS52YWxzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgc2VydmVyLXNpZGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MDApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcy5uYW1lIHx8IHZhbHVlcy5uYW1lLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5uYW1lID0gJ05hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVzLmVtYWlsIHx8ICF2YWx1ZXMuZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmVtYWlsID0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVzLnJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5yb2xlID0gJ1BsZWFzZSBzZWxlY3QgYSByb2xlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBlcnJvcnMsIHNob3cgdGhlbSBhbmQga2VlcCBtb2RhbCBvcGVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1fVXRpbHMuYXBwbHlfZm9ybV9lcnJvcnMoZm9ybS4kLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBLZWVwIG1vZGFsIG9wZW5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgLSByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCBgRm9ybSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5OiAke2pzb25fZW5jb2RlKHJlc3VsdCl9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCAnRm9ybSBjYW5jZWxsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI3Rlc3QtZm9ybS1wcmVmaWxsZWQnKS5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNb2RhbC5mb3JtKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0VkaXQgVXNlciBQcm9maWxlJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICdUZXN0X01vZGFsX0Zvcm0nLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudF9hcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2huIFNtaXRoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiAnam9obi5zbWl0aEBleGFtcGxlLmNvbScsXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiAnbWFuYWdlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWJtaXRfbGFiZWw6ICdVcGRhdGUnLFxuICAgICAgICAgICAgICAgIG9uX3N1Ym1pdDogYXN5bmMgKGZvcm0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybS52YWxzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlIHZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMubmFtZSB8fCAhdmFsdWVzLmVtYWlsIHx8ICF2YWx1ZXMucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgTW9kYWwuYWxlcnQoJ1BsZWFzZSBmaWxsIGluIGFsbCByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCBgUHJvZmlsZSB1cGRhdGVkOiAke2pzb25fZW5jb2RlKHJlc3VsdCl9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCAnVXBkYXRlIGNhbmNlbGxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjdGVzdC1mb3JtLXBpbicpLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLmZvcm0oe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnRW50ZXIgVmVyaWZpY2F0aW9uIENvZGUnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ1Bpbl9WZXJpZmljYXRpb25fRm9ybScsXG4gICAgICAgICAgICAgICAgc3VibWl0X2xhYmVsOiAnVmVyaWZ5JyxcbiAgICAgICAgICAgICAgICBtYXhfd2lkdGg6IDQ1MCxcbiAgICAgICAgICAgICAgICBvbl9zdWJtaXQ6IGFzeW5jIChmb3JtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpbiA9IGZvcm0udmFsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgUElOIGlzIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChwaW4ubGVuZ3RoICE9PSA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGb3JtX1V0aWxzLmFwcGx5X2Zvcm1fZXJyb3JzKGZvcm0uJCwgJ1BsZWFzZSBlbnRlciBhbGwgNiBkaWdpdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIFBJTiB2ZXJpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoODAwKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBjaGVja2luZyBhZ2FpbnN0IGNvcnJlY3QgUElOXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RfcGluID0gJzEyMzQ1Nic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwaW4gIT09IGNvcnJlY3RfcGluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGb3JtX1V0aWxzLmFwcGx5X2Zvcm1fZXJyb3JzKGZvcm0uJCwgYEluY29ycmVjdCBQSU4uIChIaW50OiB0cnkgJHtjb3JyZWN0X3Bpbn0pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgUElOIGFuZCByZWZvY3VzIGZpcnN0IGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnZhbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBpbjogcGluLCB2ZXJpZmllZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ2Zvcm0nLCBgUElOIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseTogJHtyZXN1bHQucGlufWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBEZXZfTW9kYWxzLnNob3dfcmVzdWx0KCdmb3JtJywgJ1BJTiB2ZXJpZmljYXRpb24gY2FuY2VsbGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1vZGFsIFN0YXRlXG4gICAgICAgICQoJyNjaGVjay1zdGF0ZScpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGlzX29wZW46IE1vZGFsLmlzX29wZW4oKSxcbiAgICAgICAgICAgICAgICBjdXJyZW50X21vZGFsOiBNb2RhbC5nZXRfY3VycmVudCgpICE9PSBudWxsID8gJ01vZGFsIGluc3RhbmNlIGV4aXN0cycgOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0ganNvbl9lbmNvZGUoc3RhdGUsIG51bGwsIDIpO1xuICAgICAgICAgICAgJCgnI3N0YXRlLXJlc3VsdCcpLnNob3coKTtcbiAgICAgICAgICAgICQoJyNzdGF0ZS1yZXN1bHQtdGV4dCcpLnRleHQoZm9ybWF0dGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI2ZvcmNlLWNsb3NlJykub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKE1vZGFsLmlzX29wZW4oKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IE1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgRGV2X01vZGFscy5zaG93X3Jlc3VsdCgnc3BlY2lhbCcsICdNb2RhbCB3YXMgZm9yY2UgY2xvc2VkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERldl9Nb2RhbHMuc2hvd19yZXN1bHQoJ3NwZWNpYWwnLCAnTm8gbW9kYWwgaXMgY3VycmVudGx5IG9wZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dfcmVzdWx0KHNlY3Rpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgJHJlc3VsdCA9ICQoYCMke3NlY3Rpb259LXJlc3VsdGApO1xuICAgICAgICBjb25zdCAkdGV4dCA9ICQoYCMke3NlY3Rpb259LXJlc3VsdC10ZXh0YCk7XG5cbiAgICAgICAgJHRleHQudGV4dChtZXNzYWdlKTtcbiAgICAgICAgJHJlc3VsdC5zaG93KCk7XG5cbiAgICAgICAgLy8gSGlkZSBhZnRlciA1IHNlY29uZHNcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAkcmVzdWx0LmZhZGVPdXQoKTtcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU1BLFVBQVUsQ0FBQztFQUNiLE9BQU9DLFlBQVlBLENBQUEsRUFBRztJQUNsQixJQUFJLENBQUNDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsRUFBRTtJQUNoQ0gsVUFBVSxDQUFDSSxJQUFJLENBQUMsQ0FBQztFQUNyQjtFQUVBLE9BQU9BLElBQUlBLENBQUEsRUFBRztJQUNWO0lBQ0FGLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQ0csRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZO01BQ3JDLE1BQU1DLEtBQUssQ0FBQ0MsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO01BQ25EUCxVQUFVLENBQUNRLFdBQVcsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUM7SUFDMUQsQ0FBQyxDQUFDO0lBRUZOLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDRyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVk7TUFDM0Ms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