| Server IP : 85.158.181.41 / Your IP : 216.73.217.12 Web Server : Apache System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64 User : moncbefd ( 1024) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/moncbefd/www.moneta.at/admin/html/assets/javascript/engine/compatibility/ |
Upload File : |
'use strict';
/* --------------------------------------------------------------
init_html_fixes.js 2016-02-10
Gambio GmbH
http://www.gambio.de
Copyright (c) 2016 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
/**
* ## Admin HTML Fixes
*
* This module will be executed in page load and will perform minor HTML fixes for each pages
* so that they don't have to be performed manually. Apply this module to the page wrapper element.
*
* @module Compatibility/init_html_fixes
*/
gx.compatibility.module('init_html_fixes', ['url_arguments'],
/** @lends module:Compatibility/init_html_fixes */
function (data) {
'use strict';
// ------------------------------------------------------------------------
// VARIABLES DEFINITION
// ------------------------------------------------------------------------
var
/**
* Module Selector
*
* @var {object}
*/
$this = $(this),
/**
* Array of callbacks.
*
* @type {array}
*/
fixes = [],
/**
* Default Options
*
* @type {object}
*/
defaults = {},
/**
* Final Options
*
* @var {object}
*/
options = $.extend(true, {}, defaults, data),
/**
* Module Object
*
* @type {object}
*/
module = {};
// ------------------------------------------------------------------------
// HTML FIXES
// ------------------------------------------------------------------------
/**
* Wrap main page content into container.
*/
fixes.push(function () {
$('.pageHeading').eq(1).removeClass('pageHeading');
$('.boxCenter:not(.no-wrap)').wrapInner('<div class="boxCenterWrapper"></div>');
$('.pageHeading:first-child').prependTo('.boxCenter');
$('.pageHeading').css('float', 'none');
var $firstChild = $($('.boxCenterWrapper').children()[0]);
if ($firstChild.is('br')) {
$firstChild.remove();
}
if ($('div.gx-configuration-box').length) {
$('.boxCenterWrapper').wrap('<div class="boxCenterAndConfigurationWrapper" style="overflow: auto"></div>');
$('.boxCenterAndConfigurationWrapper').append($('div.gx-configuration-box'));
}
});
/**
* Remove unnecessary <br> tag after page wrapper element.
*/
fixes.push(function () {
var $nextElement = $this.next(),
tagName = $nextElement.prop('tagName');
if (tagName === 'BR') {
$nextElement.remove();
}
});
/**
* Ensure that the left menu parent has the columnLeft2 class because there
* are some pages where this class is not defined and it will lead to styling issues.
*/
fixes.push(function () {
var $columnLeft2 = $('.main-left-menu').parent('td');
if (!$columnLeft2.hasClass('columnLeft2')) {
$columnLeft2.addClass('columnLeft2');
}
});
/**
* Remove width attribute from ".columnLeft2" element.
*/
fixes.push(function () {
$('.columnLeft2').removeAttr('width');
});
/**
* Move message stack container to correct place.
*/
fixes.push(function () {
var $messageStackContainer = $('.message_stack_container'),
$message = $messageStackContainer.find('.alert'),
$createNewWrapper = $('.create-new-wrapper');
if ($('.boxCenterWrapper').length > 0) {
$messageStackContainer.prependTo('.boxCenterWrapper').show();
} else {
$messageStackContainer.prependTo('.order-edit-content').show();
$messageStackContainer.prependTo('.dashboard-content').show();
}
/**
* Fix if there are more than one message stack container classes.
* This fix only work, if there are two containers.
* Improve it if you recognize pages with more than two container classes.
*/
if ($messageStackContainer.length > 1) {
$($messageStackContainer[0]).remove();
}
if ($message.length > 0 && $createNewWrapper.length > 0) {
$createNewWrapper.addClass('message-stack-active');
}
});
/**
* Changing behavior in the orders page.
*/
fixes.push(function () {
// Checks if current page is order and return immediately if its not the case
var isCurrentPage = window.location.href.indexOf('orders.php') > -1;
if (!isCurrentPage) {
return;
}
// Prepare customer link
var customerLinkPrefix = window.location.href.replace(window.location.search, '').replace('orders.php', 'customers.php?action=edit&cID=');
// Do the modifications on the table rows
var rowsSelectors = ['tr.gx-container.dataTableRowSelected', 'tr.gx-container.dataTableRow'].join(', ');
var $rows = $this.find(rowsSelectors);
// Remove the on click event on the entire row add special events
$rows.each(function (index, element) {
// Extract order link from element
var orderLink = $(element).find('td[onclick]:first').attr('onclick');
if (typeof orderLink !== 'undefined') {
orderLink.replace('document.location.href="', '').replace('&action=edit', '').slice(0, -1);
}
// Customer ID
var customerId = $(this).find('a[data-customer-id]').data('customerId');
// Remove onclick attributes from elements
$(element).find('[onclick]').removeAttr('onclick');
});
});
/**
* Remove inline class javascript changes.
*/
fixes.push(function () {
var selectors = ['.dataTableRow', '.dataTableRowSelected'];
$.each(selectors, function () {
$(this).each(function () {
if ($(this).attr('onmouseover') && $(this).attr('onmouseover').indexOf('this.className') > -1) {
$(this).removeAttr('onmouseover');
}
if ($(this).attr('onmouseout') && $(this).attr('onmouseout').indexOf('this.className') > -1) {
$(this).removeAttr('onmouseout');
}
});
});
});
/**
* Remove the old markup for editing or creating a new category
*/
fixes.push(function () {
$('#old-category-table').remove();
});
/**
* Orders form fix.
*/
fixes.push(function () {
var $headingBoxContainer = $('.orders_form');
$.each($headingBoxContainer.children(), function (index, element) {
$(element).addClass('hidden');
});
});
/**
* Fix margins and cell spacing of left menu
*/
fixes.push(function () {
$('.columnLeft2').parents('table:first').css({
'border-spacing': 0
});
});
fixes.push(function () {
var urlHelper = jse.libs.url_arguments;
if (urlHelper.getCurrentFile() === 'categories.php') {
$('.columnLeft2').parents('table:first').css('width', '');
}
});
fixes.push(function () {
var urlHelper = jse.libs.url_arguments;
var file = urlHelper.getCurrentFile(),
doParameter = urlHelper.getUrlParameters().do || '',
largePages = ['gm_emails.php'],
smallPages = ['gm_seo_boost.php', 'parcel_services.php'];
if ($.inArray(file, largePages) > -1 || file === 'admin.php' && $.inArray(doParameter, largePages) > -1) {
$('.boxCenterWrapper').addClass('breakpoint-large');
}
if ($.inArray(file, smallPages) > -1 || file === 'admin.php' && $.inArray(doParameter, smallPages) > -1) {
$('.boxCenterWrapper').addClass('breakpoint-small');
}
});
/**
* Helper to add css breakpoint classes to pages which use the controller mechanism.
* Extend whether the array 'largePages' or 'smallPages' to add the breakpoint class.
* Add as element the controller name (like in the url behind do=) and the action with trailing slash.
* (the action is the string in the 'do' argument behind the slash)
*/
fixes.push(function () {
var urlHelper = jse.libs.url_arguments,
currentFile = urlHelper.getCurrentFile(),
controllerAction = urlHelper.getUrlParameters().do,
largePages = [],
smallPages = ['JanolawModuleCenterModule/Config'];
if (currentFile === 'admin.php') {
if ($.inArray(controllerAction, largePages) > -1) {
$('#container').addClass('breakpoint-large');
}
if ($.inArray(controllerAction, smallPages) > -1) {
$('#container').addClass('breakpoint-small');
}
}
});
/**
* Cleans the header of the configuration box from tables
*/
fixes.push(function () {
var $contents = $('div.configuration-box-header h2 table.contentTable tr td > *');
$contents.each(function (index, elem) {
$('div.configuration-box-header h2').append(elem);
$('div.configuration-box-header h2').find('table.contentTable').remove();
});
});
/**
* Convert all the simple checkboxes to the JS Engine widget.
*
* This fix will fine-tune the html markup of the checkbox and then it will dynamically
* initialize the checkbox widget.
*/
fixes.push(function () {
var selectors = ['table .categories_view_data input:checkbox', 'table .dataTableHeadingRow td input:checkbox', 'table thead tr th:first input:checkbox', 'table.gx-orders-table tr:not(.dataTableHeadingRow) td:first-child input:checkbox', 'form[name="quantity_units"] input:checkbox', 'form[name="sliderset"] input:checkbox', 'form[name="featurecontrol"] input:checkbox:not(.checkbox-switcher)', '.feature-table tr td:last-child input:checkbox'];
if ($(selectors).length > 120) {
return;
}
$.each(selectors, function () {
$(this).each(function () {
if (!$(this).parent().hasClass('single-checkbox')) {
$(this).attr('data-single_checkbox', '').parent().attr('data-gx-widget', 'checkbox');
gx.widgets.init($(this).parent());
}
});
});
});
/**
* Make the top header bar clickable to activate the search bar
*/
fixes.push(function () {
var $topHeader = $('.top-header'),
$searchInput = $('input[name="admin_search"]');
$topHeader.on('click', function (event) {
if ($topHeader.is(event.target)) {
$searchInput.trigger('click');
}
});
});
// ------------------------------------------------------------------------
// INITIALIZATION
// ------------------------------------------------------------------------
module.init = function (done) {
// Execute all the existing fixes.
$.each(fixes, function () {
this();
});
done();
};
return module;
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluaXRfaHRtbF9maXhlcy5qcyJdLCJuYW1lcyI6WyJneCIsImNvbXBhdGliaWxpdHkiLCJtb2R1bGUiLCJkYXRhIiwiJHRoaXMiLCIkIiwiZml4ZXMiLCJkZWZhdWx0cyIsIm9wdGlvbnMiLCJleHRlbmQiLCJwdXNoIiwiZXEiLCJyZW1vdmVDbGFzcyIsIndyYXBJbm5lciIsInByZXBlbmRUbyIsImNzcyIsIiRmaXJzdENoaWxkIiwiY2hpbGRyZW4iLCJpcyIsInJlbW92ZSIsImxlbmd0aCIsIndyYXAiLCJhcHBlbmQiLCIkbmV4dEVsZW1lbnQiLCJuZXh0IiwidGFnTmFtZSIsInByb3AiLCIkY29sdW1uTGVmdDIiLCJwYXJlbnQiLCJoYXNDbGFzcyIsImFkZENsYXNzIiwicmVtb3ZlQXR0ciIsIiRtZXNzYWdlU3RhY2tDb250YWluZXIiLCIkbWVzc2FnZSIsImZpbmQiLCIkY3JlYXRlTmV3V3JhcHBlciIsInNob3ciLCJpc0N1cnJlbnRQYWdlIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiaW5kZXhPZiIsImN1c3RvbWVyTGlua1ByZWZpeCIsInJlcGxhY2UiLCJzZWFyY2giLCJyb3dzU2VsZWN0b3JzIiwiam9pbiIsIiRyb3dzIiwiZWFjaCIsImluZGV4IiwiZWxlbWVudCIsIm9yZGVyTGluayIsImF0dHIiLCJzbGljZSIsImN1c3RvbWVySWQiLCJzZWxlY3RvcnMiLCIkaGVhZGluZ0JveENvbnRhaW5lciIsInBhcmVudHMiLCJ1cmxIZWxwZXIiLCJqc2UiLCJsaWJzIiwidXJsX2FyZ3VtZW50cyIsImdldEN1cnJlbnRGaWxlIiwiZmlsZSIsImRvUGFyYW1ldGVyIiwiZ2V0VXJsUGFyYW1ldGVycyIsImRvIiwibGFyZ2VQYWdlcyIsInNtYWxsUGFnZXMiLCJpbkFycmF5IiwiY3VycmVudEZpbGUiLCJjb250cm9sbGVyQWN0aW9uIiwiJGNvbnRlbnRzIiwiZWxlbSIsIndpZGdldHMiLCJpbml0IiwiJHRvcEhlYWRlciIsIiRzZWFyY2hJbnB1dCIs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LE1BQU1DLE1BQXBCLENBQUosRUFBaUM7QUFDN0JILDZCQUFhSSxPQUFiLENBQXFCLE9BQXJCO0FBQ0g7QUFDSixTQUpEO0FBTUgsS0FWRDs7QUFZQTtBQUNBO0FBQ0E7O0FBRUEvRSxXQUFPeUUsSUFBUCxHQUFjLFVBQVVPLElBQVYsRUFBZ0I7QUFDMUI7QUFDQTdFLFVBQUUyQyxJQUFGLENBQU8xQyxLQUFQLEVBQWMsWUFBWTtBQUN0QjtBQUNILFNBRkQ7O0FBSUE0RTtBQUNILEtBUEQ7O0FBU0EsV0FBT2hGLE1BQVA7QUFDSCxDQWpYTCIsImZpbGUiOiJpbml0X2h0bWxfZml4ZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIGluaXRfaHRtbF9maXhlcy5qcyAyMDE2LTAyLTEwXG4gR2FtYmlvIEdtYkhcbiBodHRwOi8vd3d3LmdhbWJpby5kZVxuIENvcHlyaWdodCAoYykgMjAxNiBHYW1iaW8gR21iSFxuIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKVxuIFtodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXVxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiAjIyBBZG1pbiBIVE1MIEZpeGVzXG4gKlxuICogVGhpcyBtb2R1bGUgd2lsbCBiZSBleGVjdXRlZCBpbiBwYWdlIGxvYWQgYW5kIHdpbGwgcGVyZm9ybSBtaW5vciBIVE1MIGZpeGVzIGZvciBlYWNoIHBhZ2VzXG4gKiBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBwZXJmb3JtZWQgbWFudWFsbHkuIEFwcGx5IHRoaXMgbW9kdWxlIHRvIHRoZSBwYWdlIHdyYXBwZXIgZWxlbWVudC5cbiAqXG4gKiBAbW9kdWxlIENvbXBhdGliaWxpdHkvaW5pdF9odG1sX2ZpeGVzXG4gKi9cbmd4LmNvbXBhdGliaWxpdHkubW9kdWxlKFxuICAgICdpbml0X2h0bWxfZml4ZXMnLFxuXG4gICAgWyd1cmxfYXJndW1lbnRzJ10sXG5cbiAgICAvKiogIEBsZW5kcyBtb2R1bGU6Q29tcGF0aWJpbGl0eS9pbml0X2h0bWxfZml4ZXMgKi9cblxuICAgIGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBWQVJJQUJMRVMgREVGSU5JVElPTlxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICB2YXJcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTW9kdWxlIFNlbGVjdG9yXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHZhciB7b2JqZWN0fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAkdGhpcyA9ICQodGhpcyksXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQXJyYXkgb2YgY2FsbGJhY2tzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZml4ZXMgPSBbXSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEZWZhdWx0IE9wdGlvbnNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBkZWZhdWx0cyA9IHt9LFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpbmFsIE9wdGlvbnNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAdmFyIHtvYmplY3R9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZGVmYXVsdHMsIGRhdGEpLFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIE1vZHVsZSBPYmplY3RcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBtb2R1bGUgPSB7fTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gSFRNTCBGSVhFU1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICAvKipcbiAgICAgICAgICogV3JhcCBtYWluIHBhZ2UgY29udGVudCBpbnRvIGNvbnRhaW5lci5cbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCgnLnBhZ2VIZWFkaW5nJykuZXEoMSkucmVtb3ZlQ2xhc3MoJ3BhZ2VIZWFkaW5nJyk7XG4gICAgICAgICAgICAkKCcuYm94Q2VudGVyOm5vdCgubm8td3JhcCknKS53cmFwSW5uZXIoJzxkaXYgY2xhc3M9XCJib3hDZW50ZXJXcmFwcGVyXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAkKCcucGFnZUhlYWRpbmc6Zmlyc3QtY2hpbGQnKS5wcmVwZW5kVG8oJy5ib3hDZW50ZXInKTtcbiAgICAgICAgICAgICQoJy5wYWdlSGVhZGluZycpLmNzcygnZmxvYXQnLCAnbm9uZScpO1xuXG4gICAgICAgICAgICB2YXIgJGZpcnN0Q2hpbGQgPSAkKCQoJy5ib3hDZW50ZXJXcmFwcGVyJykuY2hpbGRyZW4oKVswXSk7XG5cbiAgICAgICAgICAgIGlmICgkZmlyc3RDaGlsZC5pcygnYnInKSkge1xuICAgICAgICAgICAgICAgICRmaXJzdENoaWxkLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJCgnZGl2Lmd4LWNvbmZpZ3VyYXRpb24tYm94JykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJCgnLmJveENlbnRlcldyYXBwZXInKS53cmFwKCc8ZGl2IGNsYXNzPVwiYm94Q2VudGVyQW5kQ29uZmlndXJhdGlvbldyYXBwZXJcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgJCgnLmJveENlbnRlckFuZENvbmZpZ3VyYXRpb25XcmFwcGVyJykuYXBwZW5kKCQoJ2Rpdi5neC1jb25maWd1cmF0aW9uLWJveCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZSB1bm5lY2Vzc2FyeSA8YnI+IHRhZyBhZnRlciBwYWdlIHdyYXBwZXIgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICRuZXh0RWxlbWVudCA9ICR0aGlzLm5leHQoKSxcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gJG5leHRFbGVtZW50LnByb3AoJ3RhZ05hbWUnKTtcblxuICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT09ICdCUicpIHtcbiAgICAgICAgICAgICAgICAkbmV4dEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnN1cmUgdGhhdCB0aGUgbGVmdCBtZW51IHBhcmVudCBoYXMgdGhlIGNvbHVtbkxlZnQyIGNsYXNzIGJlY2F1c2UgdGhlcmVcbiAgICAgICAgICogYXJlIHNvbWUgcGFnZXMgd2hlcmUgdGhpcyBjbGFzcyBpcyBub3QgZGVmaW5lZCBhbmQgaXQgd2lsbCBsZWFkIHRvIHN0eWxpbmcgaXNzdWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgJGNvbHVtbkxlZnQyID0gJCgnLm1haW4tbGVmdC1tZW51JykucGFyZW50KCd0ZCcpO1xuICAgICAgICAgICAgaWYgKCEkY29sdW1uTGVmdDIuaGFzQ2xhc3MoJ2NvbHVtbkxlZnQyJykpIHtcbiAgICAgICAgICAgICAgICAkY29sdW1uTGVmdDIuYWRkQ2xhc3MoJ2NvbHVtbkxlZnQyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmUgd2lkdGggYXR0cmlidXRlIGZyb20gXCIuY29sdW1uTGVmdDJcIiBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCcuY29sdW1uTGVmdDInKS5yZW1vdmVBdHRyKCd3aWR0aCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTW92ZSBtZXNzYWdlIHN0YWNrIGNvbnRhaW5lciB0byBjb3JyZWN0IHBsYWNlLlxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgJG1lc3NhZ2VTdGFja0NvbnRhaW5lciA9ICQoJy5tZXNzYWdlX3N0YWNrX2NvbnRhaW5lcicpLFxuICAgICAgICAgICAgICAgICRtZXNzYWdlID0gJG1lc3NhZ2VTdGFja0NvbnRhaW5lci5maW5kKCcuYWxlcnQnKSxcbiAgICAgICAgICAgICAgICAkY3JlYXRlTmV3V3JhcHBlciA9ICQoJy5jcmVhdGUtbmV3LXdyYXBwZXInKTtcblxuICAgICAgICAgICAgaWYgKCQoJy5ib3hDZW50ZXJXcmFwcGVyJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICRtZXNzYWdlU3RhY2tDb250YWluZXIucHJlcGVuZFRvKCcuYm94Q2VudGVyV3JhcHBlcicpLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJG1lc3NhZ2VTdGFja0NvbnRhaW5lci5wcmVwZW5kVG8oJy5vcmRlci1lZGl0LWNvbnRlbnQnKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJG1lc3NhZ2VTdGFja0NvbnRhaW5lci5wcmVwZW5kVG8oJy5kYXNoYm9hcmQtY29udGVudCcpLnNob3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGaXggaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSBzdGFjayBjb250YWluZXIgY2xhc3Nlcy5cbiAgICAgICAgICAgICAqIFRoaXMgZml4IG9ubHkgd29yaywgaWYgdGhlcmUgYXJlIHR3byBjb250YWluZXJzLlxuICAgICAgICAgICAgICogSW1wcm92ZSBpdCBpZiB5b3UgcmVjb2duaXplIHBhZ2VzIHdpdGggbW9yZSB0aGFuIHR3byBjb250YWluZXIgY2xhc3Nlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKCRtZXNzYWdlU3RhY2tDb250YWluZXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICQoJG1lc3NhZ2VTdGFja0NvbnRhaW5lclswXSkucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgkbWVzc2FnZS5sZW5ndGggPiAwICYmICRjcmVhdGVOZXdXcmFwcGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAkY3JlYXRlTmV3V3JhcHBlci5hZGRDbGFzcygnbWVzc2FnZS1zdGFjay1hY3RpdmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoYW5naW5nIGJlaGF2aW9yIGluIHRoZSBvcmRlcnMgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIGN1cnJlbnQgcGFnZSBpcyBvcmRlciBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIGl0cyBub3QgdGhlIGNhc2VcbiAgICAgICAgICAgIHZhciBpc0N1cnJlbnRQYWdlID0gKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ29yZGVycy5waHAnKSA+IC0xKTtcblxuICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcmVwYXJlIGN1c3RvbWVyIGxpbmtcbiAgICAgICAgICAgIHZhciBjdXN0b21lckxpbmtQcmVmaXggPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdvcmRlcnMucGhwJywgJ2N1c3RvbWVycy5waHA/YWN0aW9uPWVkaXQmY0lEPScpO1xuXG4gICAgICAgICAgICAvLyBEbyB0aGUgbW9kaWZpY2F0aW9ucyBvbiB0aGUgdGFibGUgcm93c1xuICAgICAgICAgICAgdmFyIHJvd3NTZWxlY3RvcnMgPSBbXG4gICAgICAgICAgICAgICAgJ3RyLmd4LWNvbnRhaW5lci5kYXRhVGFibGVSb3dTZWxlY3RlZCcsXG4gICAgICAgICAgICAgICAgJ3RyLmd4LWNvbnRhaW5lci5kYXRhVGFibGVSb3cnXG4gICAgICAgICAgICBdLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB2YXIgJHJvd3MgPSAkdGhpcy5maW5kKHJvd3NTZWxlY3RvcnMpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9uIGNsaWNrIGV2ZW50IG9uIHRoZSBlbnRpcmUgcm93IGFkZCBzcGVjaWFsIGV2ZW50c1xuICAgICAgICAgICAgJHJvd3MuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IG9yZGVyIGxpbmsgZnJvbSBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIG9yZGVyTGluayA9ICQoZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ3RkW29uY2xpY2tdOmZpcnN0JylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ29uY2xpY2snKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yZGVyTGluayAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnZG9jdW1lbnQubG9jYXRpb24uaHJlZj1cIicsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyZhY3Rpb249ZWRpdCcsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDdXN0b21lciBJRFxuICAgICAgICAgICAgICAgIHZhciBjdXN0b21lcklkID0gJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAuZmluZCgnYVtkYXRhLWN1c3RvbWVyLWlkXScpXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhKCdjdXN0b21lcklkJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgb25jbGljayBhdHRyaWJ1dGVzIGZyb20gZWxlbWVudHNcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKCdbb25jbGlja10nKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignb25jbGljaycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmUgaW5saW5lIGNsYXNzIGphdmFzY3JpcHQgY2hhbmdlcy5cbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IFtcbiAgICAgICAgICAgICAgICAnLmRhdGFUYWJsZVJvdycsXG4gICAgICAgICAgICAgICAgJy5kYXRhVGFibGVSb3dTZWxlY3RlZCdcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICQuZWFjaChzZWxlY3RvcnMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5hdHRyKCdvbm1vdXNlb3ZlcicpICYmICQodGhpcykuYXR0cignb25tb3VzZW92ZXInKS5pbmRleE9mKCd0aGlzLmNsYXNzTmFtZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQXR0cignb25tb3VzZW92ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ29ubW91c2VvdXQnKSAmJiAkKHRoaXMpLmF0dHIoJ29ubW91c2VvdXQnKS5pbmRleE9mKCd0aGlzLmNsYXNzTmFtZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQXR0cignb25tb3VzZW91dCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZSB0aGUgb2xkIG1hcmt1cCBmb3IgZWRpdGluZyBvciBjcmVhdGluZyBhIG5ldyBjYXRlZ29yeVxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCcjb2xkLWNhdGVnb3J5LXRhYmxlJykucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcmRlcnMgZm9ybSBmaXguXG4gICAgICAgICAqL1xuICAgICAgICBmaXhlcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkaGVhZGluZ0JveENvbnRhaW5lciA9ICQoJy5vcmRlcnNfZm9ybScpO1xuICAgICAgICAgICAgJC5lYWNoKCRoZWFkaW5nQm94Q29udGFpbmVyLmNoaWxkcmVuKCksIGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXggbWFyZ2lucyBhbmQgY2VsbCBzcGFjaW5nIG9mIGxlZnQgbWVudVxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCcuY29sdW1uTGVmdDInKVxuICAgICAgICAgICAgICAgIC5wYXJlbnRzKCd0YWJsZTpmaXJzdCcpXG4gICAgICAgICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICdib3JkZXItc3BhY2luZyc6IDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXJsSGVscGVyID0ganNlLmxpYnMudXJsX2FyZ3VtZW50cztcblxuICAgICAgICAgICAgaWYgKHVybEhlbHBlci5nZXRDdXJyZW50RmlsZSgpID09PSAnY2F0ZWdvcmllcy5waHAnKSB7XG4gICAgICAgICAgICAgICAgJCgnLmNvbHVtbkxlZnQyJylcbiAgICAgICAgICAgICAgICAgICAgLnBhcmVudHMoJ3RhYmxlOmZpcnN0JylcbiAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVybEhlbHBlciA9IGpzZS5saWJzLnVybF9hcmd1bWVudHM7XG4gICAgICAgICAgICB2YXIgZmlsZSA9IHVybEhlbHBlci5nZXRDdXJyZW50RmlsZSgpLFxuICAgICAgICAgICAgICAgIGRvUGFyYW1ldGVyID0gdXJsSGVscGVyLmdldFVybFBhcmFtZXRlcnMoKS5kbyB8fCAnJyxcbiAgICAgICAgICAgICAgICBsYXJnZVBhZ2VzID0gW1xuICAgICAgICAgICAgICAgICAgICAnZ21fZW1haWxzLnBocCdcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNtYWxsUGFnZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdnbV9zZW9fYm9vc3QucGhwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BhcmNlbF9zZXJ2aWNlcy5waHAnXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKCQuaW5BcnJheShmaWxlLCBsYXJnZVBhZ2VzKSA+IC0xXG4gICAgICAgICAgICAgICAgfHwgKGZpbGUgPT09ICdhZG1pbi5waHAnICYmICQuaW5BcnJheShkb1BhcmFtZXRlciwgbGFyZ2VQYWdlcykgPiAtMSkpIHtcbiAgICAgICAgICAgICAgICAkKCcuYm94Q2VudGVyV3JhcHBlcicpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYnJlYWtwb2ludC1sYXJnZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJC5pbkFycmF5KGZpbGUsIHNtYWxsUGFnZXMpID4gLTFcbiAgICAgICAgICAgICAgICB8fCAoZmlsZSA9PT0gJ2FkbWluLnBocCcgJiYgJC5pbkFycmF5KGRvUGFyYW1ldGVyLCBzbWFsbFBhZ2VzKSA+IC0xKSkge1xuICAgICAgICAgICAgICAgICQoJy5ib3hDZW50ZXJXcmFwcGVyJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdicmVha3BvaW50LXNtYWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIZWxwZXIgdG8gYWRkIGNzcyBicmVha3BvaW50IGNsYXNzZXMgdG8gcGFnZXMgd2hpY2ggdXNlIHRoZSBjb250cm9sbGVyIG1lY2hhbmlzbS5cbiAgICAgICAgICogRXh0ZW5kIHdoZXRoZXIgdGhlIGFycmF5ICdsYXJnZVBhZ2VzJyBvciAnc21hbGxQYWdlcycgdG8gYWRkIHRoZSBicmVha3BvaW50IGNsYXNzLlxuICAgICAgICAgKiBBZGQgYXMgZWxlbWVudCB0aGUgY29udHJvbGxlciBuYW1lIChsaWtlIGluIHRoZSB1cmwgYmVoaW5kIGRvPSkgYW5kIHRoZSBhY3Rpb24gd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgICogKHRoZSBhY3Rpb24gaXMgdGhlIHN0cmluZyBpbiB0aGUgJ2RvJyBhcmd1bWVudCBiZWhpbmQgdGhlIHNsYXNoKVxuICAgICAgICAgKi9cbiAgICAgICAgZml4ZXMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXJsSGVscGVyID0ganNlLmxpYnMudXJsX2FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IHVybEhlbHBlci5nZXRDdXJyZW50RmlsZSgpLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBY3Rpb24gPSB1cmxIZWxwZXIuZ2V0VXJsUGFyYW1ldGVycygpLmRvLFxuICAgICAgICAgICAgICAgIGxhcmdlUGFnZXMgPSBbXSxcbiAgICAgICAgICAgICAgICBzbWFsbFBhZ2VzID0gWydKYW5vbGF3TW9kdWxlQ2VudGVyTW9kdWxlL0NvbmZpZyddO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEZpbGUgPT09ICdhZG1pbi5waHAnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KGNvbnRyb2xsZXJBY3Rpb24sIGxhcmdlUGFnZXMpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnI2NvbnRhaW5lcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2JyZWFrcG9pbnQtbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KGNvbnRyb2xsZXJBY3Rpb24sIHNtYWxsUGFnZXMpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnI2NvbnRhaW5lcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2JyZWFrcG9pbnQtc21hbGwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDbGVhbnMgdGhlIGhlYWRlciBvZiB0aGUgY29uZmlndXJhdGlvbiBib3ggZnJvbSB0YWJsZXNcbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICRjb250ZW50cyA9ICQoJ2Rpdi5jb25maWd1cmF0aW9uLWJveC1oZWFkZXIgaDIgdGFibGUuY29udGVudFRhYmxlIHRyIHRkID4gKicpO1xuICAgICAgICAgICAgJGNvbnRlbnRzLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtKSB7XG4gICAgICAgICAgICAgICAgJCgnZGl2LmNvbmZpZ3VyYXRpb24tYm94LWhlYWRlciBoMicpLmFwcGVuZChlbGVtKTtcbiAgICAgICAgICAgICAgICAkKCdkaXYuY29uZmlndXJhdGlvbi1ib3gtaGVhZGVyIGgyJykuZmluZCgndGFibGUuY29udGVudFRhYmxlJykucmVtb3ZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlcnQgYWxsIHRoZSBzaW1wbGUgY2hlY2tib3hlcyB0byB0aGUgSlMgRW5naW5lIHdpZGdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBmaXggd2lsbCBmaW5lLXR1bmUgdGhlIGh0bWwgbWFya3VwIG9mIHRoZSBjaGVja2JveCBhbmQgdGhlbiBpdCB3aWxsIGR5bmFtaWNhbGx5XG4gICAgICAgICAqIGluaXRpYWxpemUgdGhlIGNoZWNrYm94IHdpZGdldC5cbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IFtcbiAgICAgICAgICAgICAgICAndGFibGUgLmNhdGVnb3JpZXNfdmlld19kYXRhIGlucHV0OmNoZWNrYm94JyxcbiAgICAgICAgICAgICAgICAndGFibGUgLmRhdGFUYWJsZUhlYWRpbmdSb3cgdGQgaW5wdXQ6Y2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICd0YWJsZSB0aGVhZCB0ciB0aDpmaXJzdCBpbnB1dDpjaGVja2JveCcsXG4gICAgICAgICAgICAgICAgJ3RhYmxlLmd4LW9yZGVycy10YWJsZSB0cjpub3QoLmRhdGFUYWJsZUhlYWRpbmdSb3cpIHRkOmZpcnN0LWNoaWxkIGlucHV0OmNoZWNrYm94JyxcbiAgICAgICAgICAgICAgICAnZm9ybVtuYW1lPVwicXVhbnRpdHlfdW5pdHNcIl0gaW5wdXQ6Y2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICdmb3JtW25hbWU9XCJzbGlkZXJzZXRcIl0gaW5wdXQ6Y2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICdmb3JtW25hbWU9XCJmZWF0dXJlY29udHJvbFwiXSBpbnB1dDpjaGVja2JveDpub3QoLmNoZWNrYm94LXN3aXRjaGVyKScsXG4gICAgICAgICAgICAgICAgJy5mZWF0dXJlLXRhYmxlIHRyIHRkOmxhc3QtY2hpbGQgaW5wdXQ6Y2hlY2tib3gnXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBpZiAoJChzZWxlY3RvcnMpLmxlbmd0aCA+IDEyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJC5lYWNoKHNlbGVjdG9ycywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygnc2luZ2xlLWNoZWNrYm94JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1zaW5nbGVfY2hlY2tib3gnLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyZW50KCkuYXR0cignZGF0YS1neC13aWRnZXQnLCAnY2hlY2tib3gnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGd4LndpZGdldHMuaW5pdCgkKHRoaXMpLnBhcmVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlIHRoZSB0b3AgaGVhZGVyIGJhciBjbGlja2FibGUgdG8gYWN0aXZhdGUgdGhlIHNlYXJjaCBiYXJcbiAgICAgICAgICovXG4gICAgICAgIGZpeGVzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyICR0b3BIZWFkZXIgPSAkKCcudG9wLWhlYWRlcicpLFxuICAgICAgICAgICAgICAgICRzZWFyY2hJbnB1dCA9ICQoJ2lucHV0W25hbWU9XCJhZG1pbl9zZWFyY2hcIl0nKTtcblxuICAgICAgICAgICAgJHRvcEhlYWRlci5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRvcEhlYWRlci5pcyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICRzZWFyY2hJbnB1dC50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBJTklUSUFMSVpBVElPTlxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlIGFsbCB0aGUgZXhpc3RpbmcgZml4ZXMuXG4gICAgICAgICAgICAkLmVhY2goZml4ZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgfSk7XG4iXX0=