URL | redeliver-parcel-au.firebaseapp.com/ |
IP | ![]() |
ASN | #54113 FASTLY |
UserAgent | Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0 |
Referer | |
Report completed | 2022-09-22 22:17:04 UTC |
Status | Loading report.. |
IDS alerts | 0 |
Blocklist alert | 5 |
urlquery alerts | No alerts detected |
Tags | None |
Fully Qualifying Domain Name | Rank | First Seen | Last Seen | IP | Comment |
---|---|---|---|---|---|
firefox.settings.services.mozilla.com (2) | 867 | 2020-06-04 20:08:41 UTC | 2022-09-22 17:04:12 UTC | ![]() |
|
redeliver-parcel-au.firebaseapp.com (1) | 0 | 2022-08-23 04:37:12 UTC | 2022-09-22 13:41:06 UTC | ![]() |
Unknown ranking |
content-signature-2.cdn.mozilla.net (1) | 1152 | 2020-11-03 12:26:46 UTC | 2022-09-22 05:24:31 UTC | ![]() |
|
ocsp.digicert.com (11) | 86 | 2012-05-21 07:02:23 UTC | 2022-09-22 14:06:31 UTC | ![]() |
|
ipwhois.app (1) | 234315 | 2020-06-10 18:52:00 UTC | 2022-09-21 08:55:27 UTC | ![]() |
|
dpm.demdex.net (3) | 204 | 2017-01-30 04:59:39 UTC | 2022-09-22 04:52:36 UTC | ![]() |
|
t.co (1) | 569 | 2012-07-25 19:09:44 UTC | 2022-09-22 04:52:31 UTC | ![]() |
|
ct.pinterest.com (3) | 852 | 2015-03-12 08:12:48 UTC | 2022-09-22 04:47:37 UTC | ![]() |
|
contile.services.mozilla.com (1) | 1114 | 2021-05-27 18:32:35 UTC | 2022-09-22 04:34:04 UTC | ![]() |
|
push.services.mozilla.com (1) | 2140 | 2015-09-03 10:29:36 UTC | 2022-09-22 05:01:22 UTC | ![]() |
|
ocsp.entrust.net (2) | 1208 | 2013-07-24 12:09:14 UTC | 2022-09-22 04:32:03 UTC | ![]() |
|
assets.adobedtm.com (2) | 512 | 2014-01-28 04:51:35 UTC | 2022-09-22 04:51:19 UTC | ![]() |
|
adservice.google.com (1) | 76 | 2021-02-20 16:10:48 UTC | 2022-09-22 18:05:53 UTC | ![]() |
|
analytics.tiktok.com (4) | 1182 | 2020-02-29 13:09:05 UTC | 2022-09-22 05:12:25 UTC | ![]() |
|
static.ads-twitter.com (1) | 614 | 2017-01-30 05:00:15 UTC | 2022-09-22 05:18:54 UTC | ![]() |
|
px.ads.linkedin.com (2) | 522 | 2017-08-08 16:28:50 UTC | 2022-09-22 16:31:57 UTC | ![]() |
|
analytics.twitter.com (1) | 526 | 2013-04-10 19:53:18 UTC | 2022-09-22 05:18:54 UTC | ![]() |
|
www.googletagmanager.com (1) | 75 | 2012-12-25 14:52:06 UTC | 2022-09-22 04:31:50 UTC | ![]() |
|
connect.facebook.net (1) | 139 | 2012-05-22 02:51:28 UTC | 2022-09-22 04:31:51 UTC | ![]() |
|
www.google.no (1) | 25607 | 2016-04-05 19:50:59 UTC | 2022-09-22 06:07:28 UTC | ![]() |
|
www.linkedin.com (1) | 608 | 2014-04-09 13:16:08 UTC | 2022-09-22 04:51:34 UTC | ![]() |
|
js-agent.newrelic.com (1) | 378 | 2017-01-30 05:00:15 UTC | 2022-09-22 05:01:51 UTC | ![]() |
|
ocsp.sca1b.amazontrust.com (2) | 1015 | 2017-03-03 15:20:51 UTC | 2019-03-27 04:05:54 UTC | ![]() |
|
auspost.com.au (27) | 32146 | 2020-10-22 08:52:04 UTC | 2022-09-22 10:31:22 UTC | ![]() |
|
ajax.googleapis.com (1) | 12905 | 2014-10-18 20:16:48 UTC | 2022-09-22 19:06:03 UTC | ![]() |
|
4621208.fls.doubleclick.net (1) | 0 | 2015-08-12 00:51:52 UTC | 2022-09-09 04:56:38 UTC | ![]() |
Domain (doubleclick.net) ranked at: 2267 |
adservice.google.no (1) | 96969 | 2017-09-26 14:23:08 UTC | 2022-09-22 04:32:08 UTC | ![]() |
|
www.google.com (1) | 7 | 2016-08-04 12:36:31 UTC | 2022-09-22 20:44:09 UTC | ![]() |
|
auspost.demdex.net (1) | 532161 | 2017-01-31 07:48:36 UTC | 2022-09-22 10:31:28 UTC | ![]() |
|
googleads.g.doubleclick.net (1) | 42 | 2021-02-20 15:43:32 UTC | 2022-09-22 18:11:52 UTC | ![]() |
|
cm.everesttech.net (1) | 996 | 2017-01-30 04:59:57 UTC | 2022-09-22 05:18:06 UTC | ![]() |
|
r3.o.lencr.org (6) | 344 | 2020-12-02 08:52:13 UTC | 2022-09-22 04:32:00 UTC | ![]() |
|
secure.adnxs.com (4) | 396 | 2012-05-22 16:37:37 UTC | 2022-09-22 04:31:50 UTC | ![]() |
|
au-gmtdmp.mookie1.com (1) | 232381 | 2015-04-10 07:51:10 UTC | 2022-09-21 18:19:29 UTC | ![]() |
|
app.link (1) | 6772 | 2017-03-14 20:36:16 UTC | 2022-09-22 13:11:40 UTC | ![]() |
|
s.pinimg.com (2) | 732 | 2017-01-13 22:40:08 UTC | 2022-09-22 10:55:59 UTC | ![]() |
|
www.facebook.com (1) | 99 | 2017-01-30 05:00:00 UTC | 2022-09-22 04:32:10 UTC | ![]() |
|
ocsp.pki.goog (15) | 175 | 2017-06-14 07:23:31 UTC | 2022-09-22 04:32:28 UTC | ![]() |
|
ocsp.usertrust.com (1) | 899 | 2012-05-21 15:43:18 UTC | 2022-09-22 04:34:37 UTC | ![]() |
|
region1.google-analytics.com (1) | 0 | 2022-03-17 11:26:33 UTC | 2022-09-22 05:38:43 UTC | ![]() |
Domain (google-analytics.com) ranked at: 8401 |
ssl.o.auspost.com.au (2) | 515455 | 2014-01-29 13:00:34 UTC | 2022-09-22 10:31:33 UTC | ![]() |
|
snap.licdn.com (1) | 1044 | 2014-10-06 08:43:45 UTC | 2022-09-22 04:33:40 UTC | ![]() |
|
target.auspost.com.au (1) | 513363 | 2020-10-07 16:44:55 UTC | 2022-09-22 10:31:26 UTC | ![]() |
|
bam.nr-data.net (2) | 630 | 2015-02-10 00:06:27 UTC | 2022-09-22 04:40:07 UTC | ![]() |
|
haytchapifullz.herokuapp.com (1) | 0 | 2022-08-24 08:33:32 UTC | 2022-09-07 21:47:06 UTC | ![]() |
Unknown ranking |
img-getpocket.cdn.mozilla.net (6) | 1631 | 2017-09-01 03:40:57 UTC | 2022-09-22 14:28:12 UTC | ![]() |
|
api2.branch.io (2) | 537 | 2020-06-27 01:56:30 UTC | 2022-09-22 19:37:00 UTC | ![]() |
|
geolocation-db.com (1) | 237326 | 2019-10-31 01:19:14 UTC | 2022-09-22 12:50:41 UTC | ![]() |
Scan Date | Severity | Indicator | Comment |
---|---|---|---|
2022-09-22 | 2 | redeliver-parcel-au.firebaseapp.com/ | Australia Post |
Scan Date | Severity | Indicator | Comment |
---|---|---|---|
2022-09-22 | 2 | redeliver-parcel-au.firebaseapp.com/ | Phishing |
Scan Date | Severity | Indicator | Comment |
---|---|---|---|
2022-09-22 | 2 | ipwhois.app | Sinkholed |
Scan Date | Severity | Indicator | Comment |
---|---|---|---|
2022-09-22 | 2 | redeliver-parcel-au.firebaseapp.com | Sinkholed |
2022-09-22 | 2 | ipwhois.app | Sinkholed |
Date | UQ / IDS / BL | URL | IP |
---|---|---|---|
0 - 0 - 6 | inform-01.firebaseapp.com/ | ![]() |
|
0 - 0 - 6 | infopostasinfo.web.app/ | ![]() |
|
0 - 0 - 6 | info-sg.firebaseapp.com/ | ![]() |
|
0 - 0 - 2 | bbgyu-eb375.firebaseapp.com/ | ![]() |
|
0 - 0 - 8 | hy-xi1.firebaseapp.com/ | ![]() |
Date | UQ / IDS / BL | URL | IP |
---|---|---|---|
0 - 0 - 6 | inform-01.firebaseapp.com/ | ![]() |
|
0 - 0 - 6 | infopostasinfo.web.app/ | ![]() |
|
0 - 0 - 6 | info-sg.firebaseapp.com/ | ![]() |
|
0 - 0 - 2 | bbgyu-eb375.firebaseapp.com/ | ![]() |
|
0 - 0 - 8 | hy-xi1.firebaseapp.com/ | ![]() |
Date | UQ / IDS / BL | URL | IP |
---|---|---|---|
0 - 0 - 7 | redeliver-parcel-au.firebaseapp.com/ | ![]() |
|
0 - 0 - 5 | redeliver-parcel-au.firebaseapp.com/ | ![]() |
|
0 - 0 - 8 | redeliver-parcel-au.firebaseapp.com/ | ![]() |
/*
Copyright � 2013 Adobe Systems Incorporated.
Licensed under the Apache License, Version 2.0 (the License);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an AS IS BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* See <a href="http://jquery.com">http://jquery.com</a>.
* @name jquery
* @class
* See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just
* documents the function and classes that are added to jQuery by this plug-in.
*/
/**
* See <a href="http://jquery.com">http://jquery.com</a>
* @name fn
* @class
* See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just
* documents the function and classes that are added to jQuery by this plug-in.
* @memberOf jquery
*/
/**
* @fileOverview accessibleMegaMenu plugin
*
*<p>Licensed under the Apache License, Version 2.0 (the License)
*<br />Copyright � 2013 Adobe Systems Incorporated.
*<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a>
* @version 0.1
* @author Michael Jordan
* @requires jquery
*/
/*jslint browser: true, devel: true, plusplus: true, nomen: true */
/*global jQuery */
(function($, window, document) {
"use strict";
var pluginName = "megaMenu",
defaults = {
uuidPrefix: "accessible-megamenu",
// unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby
menuClass: "accessible-megamenu",
// default css class used to define the megamenu styling
topNavItemClass: "accessible-megamenu-top-nav-item",
// default css class for a top-level navigation item in the megamenu
panelClass: "accessible-megamenu-panel",
// default css class for a megamenu panel
panelGroupClass: "accessible-megamenu-panel-group",
// default css class for a group of items within a megamenu panel
hoverClass: "hover",
// default css class for the hover state
focusClass: "focus",
// default css class for the focus state
openClass: "open" // default css class for the open state
},
Keyboard = {
BACKSPACE: 8,
COMMA: 188,
DELETE: 46,
DOWN: 40,
END: 35,
ENTER: 13,
ESCAPE: 27,
HOME: 36,
LEFT: 37,
PAGE_DOWN: 34,
PAGE_UP: 33,
PERIOD: 190,
RIGHT: 39,
SPACE: 32,
TAB: 9,
UP: 38,
keyMap: {
48: "0",
49: "1",
50: "2",
51: "3",
52: "4",
53: "5",
54: "6",
55: "7",
56: "8",
57: "9",
59: ";",
65: "a",
66: "b",
67: "c",
68: "d",
69: "e",
70: "f",
71: "g",
72: "h",
73: "i",
74: "j",
75: "k",
76: "l",
77: "m",
78: "n",
79: "o",
80: "p",
81: "q",
82: "r",
83: "s",
84: "t",
85: "u",
86: "v",
87: "w",
88: "x",
89: "y",
90: "z",
96: "0",
97: "1",
98: "2",
99: "3",
100: "4",
101: "5",
102: "6",
103: "7",
104: "8",
105: "9",
190: "."
}
};
/**
* @desc Creates a new accessible mega menu instance.
* @param {jquery} element
* @param {object} [options] Mega Menu options
* @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
* @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
* @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
* @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
* @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
* @param {string} [options.hoverClass=hover] - CSS class for the hover state
* @param {string} [options.focusClass=focus] - CSS class for the focus state
* @param {string} [options.openClass=open] - CSS class for the open state
* @constructor
*/
function AccessibleMegaMenu(element, options) {
this.element = element; // merge optional settings and defaults into settings
this.settings = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.mouseTimeoutID = null;
this.focusTimeoutID = null;
this.mouseFocused = false;
this.justFocused = false;
this.init();
}
AccessibleMegaMenu.prototype = function() {
/* private attributes and methods ------------------------ */
var uuid = 0,
keydownTimeoutDuration = 1000,
keydownSearchString = "",
isTouch = typeof window.hasOwnProperty === "function" && !!window.hasOwnProperty("ontouchstart"),
_getPlugin,
_addUniqueId,
_togglePanel,
_clickHandler,
_clickOutsideHandler,
_DOMAttrModifiedHandler,
_focusInHandler,
_focusOutHandler,
_keyDownHandler,
_mouseDownHandler,
_mouseOverHandler,
_mouseOutHandler,
_toggleExpandedEventHandlers;
/**
* @name jQuery.fn.accessibleMegaMenu~_getPlugin
* @desc Returns the parent accessibleMegaMenu instance for a given element
* @param {jQuery} element
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_getPlugin = function _getPlugin(element) {
return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName);
};
/**
* @name jQuery.fn.accessibleMegaMenu~_addUniqueId
* @desc Adds a unique id and element.
* The id string starts with the
* string defined in settings.uuidPrefix.
* @param {jQuery} element
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_addUniqueId = function _addUniqueId(element) {
element = $(element);
var settings = this.settings;
if (!element.attr("id")) {
element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid);
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_togglePanel
* @desc Toggle the display of mega menu panels in response to an event.
* The optional boolean value 'hide' forces all panels to hide.
* @param {event} event
* @param {Boolean} [hide] Hide all mega menu panels when true
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_togglePanel = function _togglePanel(event, hide) {
var target = $(event.target),
that = this,
settings = this.settings,
menu = this.menu,
topli = target.closest('.' + settings.topNavItemClass),
panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
newfocus;
_toggleExpandedEventHandlers.call(this, true);
if (window.matchMedia("(min-width: 970px)").matches) {
if (hide) {
topli = menu.find('.' + settings.topNavItemClass + ':visible .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass);
if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) {
if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) {
return;
}
topli.find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') {
newfocus = topli.find(':tabbable:first');
setTimeout(function() {
menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
newfocus.focus();
that.justFocused = false;
}, 99);
}
} else if (topli.length === 0) {
menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
}
} else {
clearTimeout(that.focusTimeoutID);
topli.siblings().find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
topli.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false');
if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
target.focus();
that.justFocused = false;
}
_toggleExpandedEventHandlers.call(that);
}
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_clickHandler
* @desc Handle click event on mega menu item
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_clickHandler = function _clickHandler(event) {
var target = $(event.currentTarget),
topli = target.closest('.' + this.settings.topNavItemClass),
panel = target.closest('.' + this.settings.panelClass);
if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) {
if (!target.hasClass(this.settings.openClass)) {
event.preventDefault();
event.stopPropagation();
_togglePanel.call(this, event);
this.justFocused = false;
} else {
if (this.justFocused) {
event.preventDefault();
event.stopPropagation();
this.justFocused = false;
} else if (isTouch) {
event.preventDefault();
event.stopPropagation();
_togglePanel.call(this, event, target.hasClass(this.settings.openClass));
}
}
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler
* @desc Handle click event outside of a the megamenu
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_clickOutsideHandler = function _clickOutsideHandler(event) {
if ($(event.target).closest(this.menu).length === 0) {
event.preventDefault();
event.stopPropagation();
_togglePanel.call(this, event, true);
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler
* @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) {
if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass)) {
event.preventDefault();
event.stopPropagation();
_togglePanel.call(this, event, true);
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_focusInHandler
* @desc Handle focusin event on mega menu item.
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_focusInHandler = function _focusInHandler(event) {
clearTimeout(this.focusTimeoutID);
var target = $(event.target),
panel = target.closest('.' + this.settings.panelClass);
target.addClass(this.settings.focusClass).on('click.accessible-megamenu', $.proxy(_clickHandler, this));
this.justFocused = !this.mouseFocused;
this.mouseFocused = false;
if (this.panels.not(panel).filter('.' + this.settings.openClass).length) {
_togglePanel.call(this, event);
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_focusOutHandler
* @desc Handle focusout event on mega menu item.
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_focusOutHandler = function _focusOutHandler(event) {
this.justFocused = false;
var that = this,
target = $(event.target),
topli = target.closest('.' + this.settings.topNavItemClass),
keepOpen = false;
target.removeClass(this.settings.focusClass).off('click.accessible-megamenu');
if (window.cvox) {
// If ChromeVox is running...
that.focusTimeoutID = setTimeout(function() {
window.cvox.Api.getCurrentNode(function(node) {
if (topli.has(node).length) {
// and the current node being voiced is in
// the mega menu, clearTimeout,
// so the panel stays open.
clearTimeout(that.focusTimeoutID);
} else {
that.focusTimeoutID = setTimeout(function(scope, event, hide) {
_togglePanel.call(scope, event, hide);
}, 275, that, event, true);
}
});
}, 25);
} else {
that.focusTimeoutID = setTimeout(function() {
_togglePanel.call(that, event, true);
}, 300);
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
* @desc Handle keydown event on mega menu.
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_keyDownHandler = function _keyDownHandler(event) {
var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this),
// determine the AccessibleMegaMenu plugin instance
settings = that.settings,
target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target),
// if the element is hovered the target is this, otherwise, its the focused element
menu = that.menu,
topnavitems = that.topnavitems,
topli = target.closest('.' + settings.topNavItemClass),
tabbables = menu.find(':tabbable'),
panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
panelGroups = panel.find('.' + settings.panelGroupClass),
currentPanelGroup = target.closest('.' + settings.panelGroupClass),
next,
keycode = event.keyCode || event.which,
start,
i,
o,
label,
found = false,
newString = Keyboard.keyMap[event.keyCode] || '',
regex,
isTopNavItem = topli.length === 1 && panel.length === 0;
if (target.is("input:focus, select:focus, textarea:focus, button:focus")) {
// if the event target is a form element we should handle keydown normally
return;
}
if (target.is('.' + settings.hoverClass + ':tabbable')) {
$('html').off('keydown.accessible-megamenu');
}
switch (keycode) {
case Keyboard.ESCAPE:
_togglePanel.call(that, event, true);
break;
case Keyboard.DOWN:
event.preventDefault();
if (isTopNavItem) {
_togglePanel.call(that, event);
found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1;
} else {
found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1;
}
if (!found && window.opera && opera.toString() === "[object Opera]" && (event.ctrlKey || event.metaKey)) {
tabbables = $(':tabbable');
i = tabbables.index(target);
found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
}
break;
case Keyboard.UP:
event.preventDefault();
if (isTopNavItem && target.hasClass(settings.openClass)) {
_togglePanel.call(that, event, true);
next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
if (next.children('.' + settings.panelClass).length) {
found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1;
}
} else if (!isTopNavItem) {
found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1;
}
if (!found && window.opera && opera.toString() === "[object Opera]" && (event.ctrlKey || event.metaKey)) {
tabbables = $(':tabbable');
i = tabbables.index(target);
found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
}
break;
case Keyboard.RIGHT:
event.preventDefault();
if (isTopNavItem) {
found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1;
} else {
if (panelGroups.length && currentPanelGroup.length) {
// if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group
found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1;
}
if (!found) {
found = topli.find(':tabbable:first').focus().length === 1;
}
}
break;
case Keyboard.LEFT:
event.preventDefault();
if (isTopNavItem) {
found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1;
} else {
if (panelGroups.length && currentPanelGroup.length) {
// if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group
found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1;
}
if (!found) {
found = topli.find(':tabbable:first').focus().length === 1;
}
}
break;
case Keyboard.TAB:
i = tabbables.index(target);
if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) {
_togglePanel.call(that, event, true);
next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
if (next.children('.' + settings.panelClass).length) {
found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus();
}
} else if (event.shiftKey && i > 0) {
found = tabbables.filter(':lt(' + i + '):last').focus().length === 1;
} else if (!event.shiftKey && i < tabbables.length - 1) {
found = tabbables.filter(':gt(' + i + '):first').focus().length === 1;
} else if (window.opera && opera.toString() === "[object Opera]") {
tabbables = $(':tabbable');
i = tabbables.index(target);
if (event.shiftKey) {
found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1;
} else {
found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
}
}
if (found) {
event.preventDefault();
}
break;
case Keyboard.SPACE:
if (isTopNavItem) {
event.preventDefault();
_clickHandler.call(that, event);
} else {
return true;
}
break;
case Keyboard.ENTER:
return true;
break;
default:
// alphanumeric filter
clearTimeout(this.keydownTimeoutID);
keydownSearchString += newString !== keydownSearchString ? newString : '';
if (keydownSearchString.length === 0) {
return;
}
this.keydownTimeoutID = setTimeout(function() {
keydownSearchString = '';
}, keydownTimeoutDuration);
if (isTopNavItem && !target.hasClass(settings.openClass)) {
tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)');
} else {
tabbables = topli.find(':tabbable');
}
if (event.shiftKey) {
tabbables = $(tabbables.get().reverse());
}
for (i = 0; i < tabbables.length; i++) {
o = tabbables.eq(i);
if (o.is(target)) {
start = keydownSearchString.length === 1 ? i + 1 : i;
break;
}
}
regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i');
for (i = start; i < tabbables.length; i++) {
o = tabbables.eq(i);
label = $.trim(o.text());
if (regex.test(label)) {
found = true;
o.focus();
break;
}
}
if (!found) {
for (i = 0; i < start; i++) {
o = tabbables.eq(i);
label = $.trim(o.text());
if (regex.test(label)) {
o.focus();
break;
}
}
}
break;
}
that.justFocused = false;
};
/**
* @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler
* @desc Handle mousedown event on mega menu.
* @param {event} Event object
* @memberof accessibleMegaMenu
* @inner
* @private
*/
_mouseDownHandler = function _mouseDownHandler(event) {
if ($(event.target).is(this.settings.panelClass) || $(event.target).closest(":focusable").length) {
this.mouseFocused = true;
}
this.mouseTimeoutID = setTimeout(function() {
clearTimeout(this.focusTimeoutID);
}, 1);
};
/**
* @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler
* @desc Handle mouseover event on mega menu.
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_mouseOverHandler = function _mouseOverHandler(event) {
clearTimeout(this.mouseTimeoutID);
$(event.target).addClass(this.settings.hoverClass);
_togglePanel.call(this, event);
if ($(event.target).is(':tabbable')) {
$('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
}
};
/**
* @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler
* @desc Handle mouseout event on mega menu.
* @param {event} Event object
* @memberof jQuery.fn.accessibleMegaMenu
* @inner
* @private
*/
_mouseOutHandler = function _mouseOutHandler(event) {
var that = this;
$(event.target).removeClass(that.settings.hoverClass);
that.mouseTimeoutID = setTimeout(function() {
_togglePanel.call(that, event, true);
}, 250);
if ($(event.target).is(':tabbable')) {
$('html').off('keydown.accessible-megamenu');
}
};
_toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) {
var menu = this.menu;
if (hide) {
$('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu');
menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
} else {
$('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this));
/* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click.
To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */
menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this));
}
};
/* public attributes and methods ------------------------- */
return {
constructor: AccessibleMegaMenu,
/**
* @lends jQuery.fn.accessibleMegaMenu
* @desc Initializes an instance of the accessibleMegaMenu plugins
* @memberof jQuery.fn.accessibleMegaMenu
* @instance
*/
init: function init() {
var settings = this.settings,
nav = $(this.element),
menu = nav.children('ul').first(),
topnavitems = menu.children();
this.start(settings, nav, menu, topnavitems);
},
start: function start(settings, nav, menu, topnavitems) {
var that = this;
var CLASS_PRIMARY_TOOLS_LIST = 'pn-link--tools';
var CLASS_PRIMARY_UTILITY_LIST = 'pn-link--utility';
this.settings = settings;
this.menu = menu;
this.topnavitems = topnavitems;
nav.attr("role", "navigation");
menu.addClass(settings.menuClass);
topnavitems.each(function(i, topnavitem) {
var topnavitemlink, topnavitempanel;
topnavitem = $(topnavitem);
topnavitem.addClass(settings.topNavItemClass);
topnavitemlink = topnavitem.find(":tabbable:first");
topnavitempanel = topnavitem.children(":not(:tabbable):last");
_addUniqueId.call(that, topnavitemlink);
if (topnavitempanel.length) {
_addUniqueId.call(that, topnavitempanel);
if (!topnavitempanel.hasClass('is-open')) {
//DTN-1565: Tools and Utility has no collapse/expand
if (!(topnavitemlink.hasClass(CLASS_PRIMARY_TOOLS_LIST) || topnavitemlink.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
topnavitemlink.attr({
"aria-expanded": false
});
}
} // only set aria-expanded and aria-hidden for panel that is not open.
// 'is-open' attribute is set on the aem sightly template (primary-nav.html)
// e.g. if we're on a page that is under Business, then dom for business panel is 'is-open'
if (!topnavitempanel.hasClass('is-open')) {
topnavitempanel.attr({
"role": "group",
"aria-expanded": false,
"aria-hidden": true
}).addClass(settings.panelClass);
}
}
});
this.panels = menu.find("." + settings.panelClass);
menu.on("focusin.accessible-megamenu", ":focusable, ." + settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this));
if (isTouch) {
menu.on("touchstart.accessible-megamenu", $.proxy(_clickHandler, this));
}
menu.find("hr").attr("role", "separator");
if ($(document.activeElement).closest(menu).length) {
$(document.activeElement).trigger("focusin.accessible-megamenu");
}
},
/**
* @desc Get default values
* @example $(selector).accessibleMegaMenu("getDefaults");
* @return {object}
* @memberof jQuery.fn.accessibleMegaMenu
* @instance
*/
getDefaults: function getDefaults() {
return this._defaults;
},
/**
* @desc Get any option set to plugin using its name (as string)
* @example $(selector).accessibleMegaMenu("getOption", some_option);
* @param {string} opt
* @return {string}
* @memberof jQuery.fn.accessibleMegaMenu
* @instance
*/
getOption: function getOption(opt) {
return this.settings[opt];
},
/**
* @desc Get all options
* @example $(selector).accessibleMegaMenu("getAllOptions");
* @return {object}
* @memberof jQuery.fn.accessibleMegaMenu
* @instance
*/
getAllOptions: function getAllOptions() {
return this.settings;
},
/**
* @desc Set option
* @example $(selector).accessibleMegaMenu("setOption", "option_name", "option_value", reinitialize);
* @param {string} opt - Option name
* @param {string} val - Option value
* @param {boolean} [reinitialize] - boolean to re-initialize the menu.
* @memberof jQuery.fn.accessibleMegaMenu
* @instance
*/
setOption: function setOption(opt, value, reinitialize) {
this.settings[opt] = value;
if (reinitialize) {
this.init();
}
}
};
}();
$.fn[pluginName] = function(options) {
return this.each(function() {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName, new $.fn[pluginName].AccessibleMegaMenu(this, options));
}
});
};
$.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu;
/**
* @private
*/
function visible(element) {
return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function() {
return $.css(this, "visibility") === "hidden";
}).length;
}
/**
* @private
*/
function _focusable(element, isTabIndexNotNaN) {
var map,
mapName,
img,
nodeName = element.nodeName.toLowerCase();
if ("area" === nodeName) {
map = element.parentNode;
mapName = map.name;
if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
return false;
}
img = $("img[usemap=#" + mapName + "]")[0];
return !!img && visible(img);
}
return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible
visible(element);
}
$.extend($.expr[":"], {
data: $.expr.createPseudo ? $.expr.createPseudo(function(dataName) {
return function(elem) {
return !!$.data(elem, dataName);
};
}) : // support: jQuery <1.8
function(elem, i, match) {
return !!$.data(elem, match[3]);
},
focusable: function focusable(element) {
return _focusable(element, !isNaN($.attr(element, "tabindex")));
},
tabbable: function tabbable(element) {
var tabIndex = $.attr(element, "tabindex"),
isTabIndexNaN = isNaN(tabIndex);
return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN);
}
});
})(jQuery, window, document); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwibmFtZXMiOlsiJCIsIndpbmRvdyIsImRvY3VtZW50IiwicGx1Z2luTmFtZSIsImRlZmF1bHRzIiwidXVpZFByZWZpeCIsIm1lbnVDbGFzcyIsInRvcE5hdkl0ZW1DbGFzcyIsInBhbmVsQ2xhc3MiLCJwYW5lbEdyb3VwQ2xhc3MiLCJob3ZlckNsYXNzIiwiZm9jdXNDbGFzcyIsIm9wZW5DbGFzcyIsIktleWJvYXJkIiwiQkFDS1NQQUNFIiwiQ09NTUEiLCJERUxFVEUiLCJET1dOIiwiRU5EIiwiRU5URVIiLCJFU0NBUEUiLCJIT01FIiwiTEVGVCIsIlBBR0VfRE9XTiIsIlBBR0VfVVAiLCJQRVJJT0QiLCJSSUdIVCIsIlNQQUNFIiwiVEFCIiwiVVAiLCJrZXlNYXAiLCJBY2Nlc3NpYmxlTWVnYU1lbnUiLCJlbGVtZW50Iiwib3B0aW9ucyIsInNldHRpbmdzIiwiZXh0ZW5kIiwiX2RlZmF1bHRzIiwiX25hbWUiLCJtb3VzZVRpbWVvdXRJRCIsImZvY3VzVGltZW91dElEIiwibW91c2VGb2N1c2VkIiwianVzdEZvY3VzZWQiLCJpbml0IiwicHJvdG90eXBlIiwidXVpZCIsImtleWRvd25UaW1lb3V0RHVyYXRpb24iLCJrZXlkb3duU2VhcmNoU3RyaW5nIiwiaXNUb3VjaCIsImhhc093blByb3BlcnR5IiwiX2dldFBsdWdpbiIsIl9hZGRVbmlxdWVJZCIsIl90b2dnbGVQYW5lbCIsIl9jbGlja0hhbmRsZXIiLCJfY2xpY2tPdXRzaWRlSGFuZGxlciIsIl9ET01BdHRyTW9kaWZpZWRIYW5kbGVyIiwiX2ZvY3VzSW5IYW5kbGVyIiwiX2ZvY3VzT3V0SGFuZGxlciIsIl9rZXlEb3duSGFuZGxlciIsIl9tb3VzZURvd25IYW5kbGVyIiwiX21vdXNlT3ZlckhhbmRsZXIiLCJfbW91c2VPdXRIYW5kbGVyIiwiX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycyIsImNsb3Nlc3QiLCJkYXRhIiwiYXR0ciIsIkRhdGUiLCJnZXRUaW1lIiwiZXZlbnQiLCJoaWRlIiwidGFyZ2V0IiwidGhhdCIsIm1lbnUiLCJ0b3BsaSIsInBhbmVsIiwiaGFzQ2xhc3MiLCJuZXdmb2N1cyIsImNhbGwiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsImZpbmQiLCJpcyIsInJlbGF0ZWRUYXJnZXQiLCJoYXMiLCJsZW5ndGgiLCJ0eXBlIiwiYWN0aXZlRWxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmlsdGVyIiwia2V5Q29kZSIsInNldFRpbWVvdXQiLCJvZmYiLCJmb2N1cyIsImNsZWFyVGltZW91dCIsInNpYmxpbmdzIiwiYWRkQ2xhc3MiLCJjdXJyZW50VGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJvcmlnaW5hbEV2ZW50IiwiYXR0ck5hbWUiLCJuZXdWYWx1ZSIsIm9uIiwicHJveHkiLCJwYW5lbHMiLCJub3QiLCJrZWVwT3BlbiIsImN2b3giLCJBcGkiLCJnZXRDdXJyZW50Tm9kZSIsIm5vZGUiLCJzY29wZSIsImNvbnN0cnVjdG9yIiwidG9wbmF2aXRlbXMiLCJ0YWJiYWJsZXMiLCJwYW5lbEdyb3VwcyIsImN1cnJlbnRQYW5lbEdyb3VwIiwibmV4dCIsImtleWNvZGUiLCJ3aGljaCIsInN0YXJ0IiwiaSIsIm8iLCJsYWJlbCIsImZvdW5kIiwibmV3U3RyaW5nIiwicmVnZXgiLCJpc1RvcE5hdkl0ZW0iLCJpbmRleCIsIm9wZXJhIiwidG9TdHJpbmciLCJjdHJsS2V5IiwibWV0YUtleSIsImNoaWxkcmVuIiwic2hpZnRLZXkiLCJrZXlkb3duVGltZW91dElEIiwiZ2V0IiwicmV2ZXJzZSIsImVxIiwiUmVnRXhwIiwicmVwbGFjZSIsInRyaW0iLCJ0ZXh0IiwidGVzdCIsIm5hdiIsImZpcnN0IiwiQ0xBU1NfUFJJTUFSWV9UT09MU19MSVNUIiwiQ0xBU1NfUFJJTUFSWV9VVElMSVRZX0xJU1QiLCJlYWNoIiwidG9wbmF2aXRlbSIsInRvcG5hdml0ZW1saW5rIiwidG9wbmF2aXRlbXBhbmVsIiwidHJpZ2dlciIsImdldERlZmF1bHRzIiwiZ2V0T3B0aW9uIiwib3B0IiwiZ2V0QWxsT3B0aW9ucyIsInNldE9wdGlvbiIsInZhbHVlIiwicmVpbml0aWFsaXplIiwiZm4iLCJ2aXNpYmxlIiwiZXhwciIsImZpbHRlcnMiLCJwYXJlbnRzIiwiYWRkQmFjayIsImNzcyIsImZvY3VzYWJsZSIsImlzVGFiSW5kZXhOb3ROYU4iLCJtYXAiLCJtYXBOYW1lIiwiaW1nIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsInBhcmVudE5vZGUiLCJuYW1lIiwiaHJlZiIsImRpc2FibGVkIiwiY3JlYXRlUHNldWRvIiwiZGF0YU5hbWUiLCJlbGVtIiwibWF0Y2giLCJpc05hTiIsInRhYmJhYmxlIiwidGFiSW5kZXgiLCJpc1RhYkluZGV4TmFOIiwialF1ZXJ5Il0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvdmVuZG9ycy9tZWdhbWVudS5qcz9kYjQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgwqkgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIOKAnExpY2Vuc2XigJ0pO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiDigJxBUyBJU+KAnSBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG4vKipcbiAqIFNlZSA8YSBocmVmPVwiaHR0cDovL2pxdWVyeS5jb21cIj5odHRwOi8vanF1ZXJ5LmNvbTwvYT4uXG4gKiBAbmFtZSBqcXVlcnlcbiAqIEBjbGFzc1xuICogU2VlIHRoZSBqUXVlcnkgTGlicmFyeSAgKDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPikgZm9yIGZ1bGwgZGV0YWlscy4gIFRoaXMganVzdFxuICogZG9jdW1lbnRzIHRoZSBmdW5jdGlvbiBhbmQgY2xhc3NlcyB0aGF0IGFyZSBhZGRlZCB0byBqUXVlcnkgYnkgdGhpcyBwbHVnLWluLlxuICovXG5cbi8qKlxuICogU2VlIDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPlxuICogQG5hbWUgZm5cbiAqIEBjbGFzc1xuICogU2VlIHRoZSBqUXVlcnkgTGlicmFyeSAgKDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPikgZm9yIGZ1bGwgZGV0YWlscy4gIFRoaXMganVzdFxuICogZG9jdW1lbnRzIHRoZSBmdW5jdGlvbiBhbmQgY2xhc3NlcyB0aGF0IGFyZSBhZGRlZCB0byBqUXVlcnkgYnkgdGhpcyBwbHVnLWluLlxuICogQG1lbWJlck9mIGpxdWVyeVxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlldyBhY2Nlc3NpYmxlTWVnYU1lbnUgcGx1Z2luXG4gKlxuICo8cD5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg4oCcTGljZW5zZeKAnSlcbiAqPGJyIC8+Q29weXJpZ2h0IMKpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuXG4gKjxiciAvPlByb2plY3QgcGFnZSA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2Fkb2JlLWFjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZS1NZWdhLU1lbnVcIj5odHRwczovL2dpdGh1Yi5jb20vYWRvYmUtYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlLU1lZ2EtTWVudTwvYT5cbiAqIEB2ZXJzaW9uIDAuMVxuICogQGF1dGhvciBNaWNoYWVsIEpvcmRhblxuICogQHJlcXVpcmVzIGpxdWVyeVxuICovXG5cbi8qanNsaW50IGJyb3dzZXI6IHRydWUsIGRldmVsOiB0cnVlLCBwbHVzcGx1czogdHJ1ZSwgbm9tZW46IHRydWUgKi9cbi8qZ2xvYmFsIGpRdWVyeSAqL1xuKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50KSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBwbHVnaW5OYW1lID0gXCJtZWdhTWVudVwiLFxuICAgICAgICBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIHV1aWRQcmVmaXg6IFwiYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAvLyB1bmlxdWUgSUQncyBhcmUgcmVxdWlyZWQgdG8gaW5kaWNhdGUgYXJpYS1vd25zLCBhcmlhLWNvbnRyb2xzIGFuZCBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgIG1lbnVDbGFzczogXCJhY2Nlc3NpYmxlLW1lZ2FtZW51XCIsIC8vIGRlZmF1bHQgY3NzIGNsYXNzIHVzZWQgdG8gZGVmaW5lIHRoZSBtZWdhbWVudSBzdHlsaW5nXG4gICAgICAgICAgICB0b3BOYXZJdGVtQ2xhc3M6IFwiYWNjZXNzaWJsZS1tZWdhbWVudS10b3AtbmF2LWl0ZW1cIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIGEgdG9wLWxldmVsIG5hdmlnYXRpb24gaXRlbSBpbiB0aGUgbWVnYW1lbnVcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwiYWNjZXNzaWJsZS1tZWdhbWVudS1wYW5lbFwiLCAvLyBkZWZhdWx0IGNzcyBjbGFzcyBmb3IgYSBtZWdhbWVudSBwYW5lbFxuICAgICAgICAgICAgcGFuZWxHcm91cENsYXNzOiBcImFjY2Vzc2libGUtbWVnYW1lbnUtcGFuZWwtZ3JvdXBcIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIGEgZ3JvdXAgb2YgaXRlbXMgd2l0aGluIGEgbWVnYW1lbnUgcGFuZWxcbiAgICAgICAgICAgIGhvdmVyQ2xhc3M6IFwiaG92ZXJcIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIHRoZSBob3ZlciBzdGF0ZVxuICAgICAgICAgICAgZm9jdXNDbGFzczogXCJmb2N1c1wiLCAvLyBkZWZhdWx0IGNzcyBjbGFzcyBmb3IgdGhlIGZvY3VzIHN0YXRlXG4gICAgICAgICAgICBvcGVuQ2xhc3M6IFwib3BlblwiIC8vIGRlZmF1bHQgY3NzIGNsYXNzIGZvciB0aGUgb3BlbiBzdGF0ZVxuICAgICAgICB9LFxuICAgICAgICBLZXlib2FyZCA9IHtcbiAgICAgICAgICAgIEJBQ0tTUEFDRTogOCxcbiAgICAgICAgICAgIENPTU1BOiAxODgsXG4gICAgICAgICAgICBERUxFVEU6IDQ2LFxuICAgICAgICAgICAgRE9XTjogNDAsXG4gICAgICAgICAgICBFTkQ6IDM1LFxuICAgICAgICAgICAgRU5URVI6IDEzLFxuICAgICAgICAgICAgRVNDQVBFOiAyNyxcbiAgICAgICAgICAgIEhPTUU6IDM2LFxuICAgICAgICAgICAgTEVGVDogMzcsXG4gICAgICAgICAgICBQQUdFX0RPV046IDM0LFxuICAgICAgICAgICAgUEFHRV9VUDogMzMsXG4gICAgICAgICAgICBQRVJJT0Q6IDE5MCxcbiAgICAgICAgICAgIFJJR0hUOiAzOSxcbiAgICAgICAgICAgIFNQQUNFOiAzMixcbiAgICAgICAgICAgIFRBQjogOSxcbiAgICAgICAgICAgIFVQOiAzOCxcbiAgICAgICAgICAgIGtleU1hcDoge1xuICAgICAgICAgICAgICAgIDQ4OiBcIjBcIixcbiAgICAgICAgICAgICAgICA0OTogXCIxXCIsXG4gICAgICAgICAgICAgICAgNTA6IFwiMlwiLFxuICAgICAgICAgICAgICAgIDUxOiBcIjNcIixcbiAgICAgICAgICAgICAgICA1MjogXCI0XCIsXG4gICAgICAgICAgICAgICAgNTM6IFwiNVwiLFxuICAgICAgICAgICAgICAgIDU0OiBcIjZcIixcbiAgICAgICAgICAgICAgICA1NTogXCI3XCIsXG4gICAgICAgICAgICAgICAgNTY6IFwiOFwiLFxuICAgICAgICAgICAgICAgIDU3OiBcIjlcIixcbiAgICAgICAgICAgICAgICA1OTogXCI7XCIsXG4gICAgICAgICAgICAgICAgNjU6IFwiYVwiLFxuICAgICAgICAgICAgICAgIDY2OiBcImJcIixcbiAgICAgICAgICAgICAgICA2NzogXCJjXCIsXG4gICAgICAgICAgICAgICAgNjg6IFwiZFwiLFxuICAgICAgICAgICAgICAgIDY5OiBcImVcIixcbiAgICAgICAgICAgICAgICA3MDogXCJmXCIsXG4gICAgICAgICAgICAgICAgNzE6IFwiZ1wiLFxuICAgICAgICAgICAgICAgIDcyOiBcImhcIixcbiAgICAgICAgICAgICAgICA3MzogXCJpXCIsXG4gICAgICAgICAgICAgICAgNzQ6IFwialwiLFxuICAgICAgICAgICAgICAgIDc1OiBcImtcIixcbiAgICAgICAgICAgICAgICA3NjogXCJsXCIsXG4gICAgICAgICAgICAgICAgNzc6IFwibVwiLFxuICAgICAgICAgICAgICAgIDc4OiBcIm5cIixcbiAgICAgICAgICAgICAgICA3OTogXCJvXCIsXG4gICAgICAgICAgICAgICAgODA6IFwicFwiLFxuICAgICAgICAgICAgICAgIDgxOiBcInFcIixcbiAgICAgICAgICAgICAgICA4MjogXCJyXCIsXG4gICAgICAgICAgICAgICAgODM6IFwic1wiLFxuICAgICAgICAgICAgICAgIDg0OiBcInRcIixcbiAgICAgICAgICAgICAgICA4NTogXCJ1XCIsXG4gICAgICAgICAgICAgICAgODY6IFwidlwiLFxuICAgICAgICAgICAgICAgIDg3OiBcIndcIixcbiAgICAgICAgICAgICAgICA4ODogXCJ4XCIsXG4gICAgICAgICAgICAgICAgODk6IFwieVwiLFxuICAgICAgICAgICAgICAgIDkwOiBcInpcIixcbiAgICAgICAgICAgICAgICA5NjogXCIwXCIsXG4gICAgICAgICAgICAgICAgOTc6IFwiMVwiLFxuICAgICAgICAgICAgICAgIDk4OiBcIjJcIixcbiAgICAgICAgICAgICAgICA5OTogXCIzXCIsXG4gICAgICAgICAgICAgICAgMTAwOiBcIjRcIixcbiAgICAgICAgICAgICAgICAxMDE6IFwiNVwiLFxuICAgICAgICAgICAgICAgIDEwMjogXCI2XCIsXG4gICAgICAgICAgICAgICAgMTAzOiBcIjdcIixcbiAgICAgICAgICAgICAgICAxMDQ6IFwiOFwiLFxuICAgICAgICAgICAgICAgIDEwNTogXCI5XCIsXG4gICAgICAgICAgICAgICAgMTkwOiBcIi5cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjIENyZWF0ZXMgYSBuZXcgYWNjZXNzaWJsZSBtZWdhIG1lbnUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtqcXVlcnl9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE1lZ2EgTWVudSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnV1aWRQcmVmaXg9YWNjZXNzaWJsZS1tZWdhbWVudV0gLSBQcmVmaXggZm9yIGdlbmVyYXRlZCB1bmlxdWUgaWQgYXR0cmlidXRlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGluZGljYXRlIGFyaWEtb3ducywgYXJpYS1jb250cm9scyBhbmQgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lbnVDbGFzcz1hY2Nlc3NpYmxlLW1lZ2FtZW51XSAtIENTUyBjbGFzcyB1c2VkIHRvIGRlZmluZSB0aGUgbWVnYW1lbnUgc3R5bGluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50b3BOYXZJdGVtQ2xhc3M9YWNjZXNzaWJsZS1tZWdhbWVudS10b3AtbmF2LWl0ZW1dIC0gQ1NTIGNsYXNzIGZvciBhIHRvcC1sZXZlbCBuYXZpZ2F0aW9uIGl0ZW0gaW4gdGhlIG1lZ2FtZW51XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBhbmVsQ2xhc3M9YWNjZXNzaWJsZS1tZWdhbWVudS1wYW5lbF0gLSBDU1MgY2xhc3MgZm9yIGEgbWVnYW1lbnUgcGFuZWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGFuZWxHcm91cENsYXNzPWFjY2Vzc2libGUtbWVnYW1lbnUtcGFuZWwtZ3JvdXBdIC0gQ1NTIGNsYXNzIGZvciBhIGdyb3VwIG9mIGl0ZW1zIHdpdGhpbiBhIG1lZ2FtZW51IHBhbmVsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmhvdmVyQ2xhc3M9aG92ZXJdIC0gQ1NTIGNsYXNzIGZvciB0aGUgaG92ZXIgc3RhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZm9jdXNDbGFzcz1mb2N1c10gLSBDU1MgY2xhc3MgZm9yIHRoZSBmb2N1cyBzdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vcGVuQ2xhc3M9b3Blbl0gLSBDU1MgY2xhc3MgZm9yIHRoZSBvcGVuIHN0YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gQWNjZXNzaWJsZU1lZ2FNZW51KGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAvLyBtZXJnZSBvcHRpb25hbCBzZXR0aW5ncyBhbmQgZGVmYXVsdHMgaW50byBzZXR0aW5nc1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgICAgICB0aGlzLl9uYW1lID0gcGx1Z2luTmFtZTtcblxuICAgICAgICB0aGlzLm1vdXNlVGltZW91dElEID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb2N1c1RpbWVvdXRJRCA9IG51bGw7XG4gICAgICAgIHRoaXMubW91c2VGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBBY2Nlc3NpYmxlTWVnYU1lbnUucHJvdG90eXBlID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvKiBwcml2YXRlIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICAgIHZhciB1dWlkID0gMCxcbiAgICAgICAgICAgIGtleWRvd25UaW1lb3V0RHVyYXRpb24gPSAxMDAwLFxuICAgICAgICAgICAga2V5ZG93blNlYXJjaFN0cmluZyA9IFwiXCIsXG4gICAgICAgICAgICBpc1RvdWNoID0gdHlwZW9mIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSA9PT0gXCJmdW5jdGlvblwiICYmICEhd2luZG93Lmhhc093blByb3BlcnR5KFwib250b3VjaHN0YXJ0XCIpLFxuICAgICAgICAgICAgX2dldFBsdWdpbixcbiAgICAgICAgICAgIF9hZGRVbmlxdWVJZCxcbiAgICAgICAgICAgIF90b2dnbGVQYW5lbCxcbiAgICAgICAgICAgIF9jbGlja0hhbmRsZXIsXG4gICAgICAgICAgICBfY2xpY2tPdXRzaWRlSGFuZGxlcixcbiAgICAgICAgICAgIF9ET01BdHRyTW9kaWZpZWRIYW5kbGVyLFxuICAgICAgICAgICAgX2ZvY3VzSW5IYW5kbGVyLFxuICAgICAgICAgICAgX2ZvY3VzT3V0SGFuZGxlcixcbiAgICAgICAgICAgIF9rZXlEb3duSGFuZGxlcixcbiAgICAgICAgICAgIF9tb3VzZURvd25IYW5kbGVyLFxuICAgICAgICAgICAgX21vdXNlT3ZlckhhbmRsZXIsXG4gICAgICAgICAgICBfbW91c2VPdXRIYW5kbGVyLFxuICAgICAgICAgICAgX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycztcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fZ2V0UGx1Z2luXG4gICAgICAgICAqIEBkZXNjIFJldHVybnMgdGhlIHBhcmVudCBhY2Nlc3NpYmxlTWVnYU1lbnUgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9nZXRQbHVnaW4gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICQoZWxlbWVudCkuY2xvc2VzdCgnOmRhdGEocGx1Z2luXycgKyBwbHVnaW5OYW1lICsgJyknKS5kYXRhKFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2FkZFVuaXF1ZUlkXG4gICAgICAgICAqIEBkZXNjIEFkZHMgYSB1bmlxdWUgaWQgYW5kIGVsZW1lbnQuXG4gICAgICAgICAqIFRoZSBpZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlXG4gICAgICAgICAqIHN0cmluZyBkZWZpbmVkIGluIHNldHRpbmdzLnV1aWRQcmVmaXguXG4gICAgICAgICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50XG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX2FkZFVuaXF1ZUlkID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5hdHRyKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIoXCJpZFwiLCBzZXR0aW5ncy51dWlkUHJlZml4ICsgXCItXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIFwiLVwiICsgKCsrdXVpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl90b2dnbGVQYW5lbFxuICAgICAgICAgKiBAZGVzYyBUb2dnbGUgdGhlIGRpc3BsYXkgb2YgbWVnYSBtZW51IHBhbmVscyBpbiByZXNwb25zZSB0byBhbiBldmVudC5cbiAgICAgICAgICogVGhlIG9wdGlvbmFsIGJvb2xlYW4gdmFsdWUgJ2hpZGUnIGZvcmNlcyBhbGwgcGFuZWxzIHRvIGhpZGUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2hpZGVdIEhpZGUgYWxsIG1lZ2EgbWVudSBwYW5lbHMgd2hlbiB0cnVlXG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX3RvZ2dsZVBhbmVsID0gZnVuY3Rpb24gKGV2ZW50LCBoaWRlKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLFxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBtZW51ID0gdGhpcy5tZW51LFxuICAgICAgICAgICAgICAgIHRvcGxpID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgc2V0dGluZ3MudG9wTmF2SXRlbUNsYXNzKSxcbiAgICAgICAgICAgICAgICBwYW5lbCA9IHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKSA/IHRhcmdldCA6IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLFxuICAgICAgICAgICAgICAgIG5ld2ZvY3VzO1xuXG4gICAgICAgICAgICBfdG9nZ2xlRXhwYW5kZWRFdmVudEhhbmRsZXJzLmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEoXCIobWluLXdpZHRoOiA5NzBweClcIikubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChoaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGxpID0gbWVudS5maW5kKCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyArICc6dmlzaWJsZSAuJyArIHNldHRpbmdzLm9wZW5DbGFzcyArICc6Zmlyc3QnKS5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRvcGxpLmlzKGV2ZW50LnJlbGF0ZWRUYXJnZXQpIHx8IHRvcGxpLmhhcyhldmVudC5yZWxhdGVkVGFyZ2V0KS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChldmVudC50eXBlID09PSAnbW91c2VvdXQnIHx8IGV2ZW50LnR5cGUgPT09ICdmb2N1c291dCcpICYmIHRvcGxpLmhhcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGkuZmluZCgnW2FyaWEtZXhwYW5kZWRdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nICYmIGV2ZW50LmtleUNvZGUgPT09IEtleWJvYXJkLkVTQ0FQRSkgfHwgZXZlbnQudHlwZSA9PT0gJ0RPTUF0dHJNb2RpZmllZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdmb2N1cyA9IHRvcGxpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LmZpbmQoJ1thcmlhLWV4cGFuZGVkXS4nICsgdGhhdC5zZXR0aW5ncy5wYW5lbENsYXNzKS5vZmYoJ0RPTUF0dHJNb2RpZmllZC5hY2Nlc3NpYmxlLW1lZ2FtZW51Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZvY3VzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA5OSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9wbGkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmZpbmQoJ1thcmlhLWV4cGFuZGVkPXRydWVdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGF0LmZvY3VzVGltZW91dElEKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbGkuc2libGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ1thcmlhLWV4cGFuZGVkXScpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcignLicgKyBzZXR0aW5ncy5wYW5lbENsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbGkuZmluZCgnW2FyaWEtZXhwYW5kZWRdJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoJy4nICsgc2V0dGluZ3MucGFuZWxDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlb3ZlcicgJiYgdGFyZ2V0LmlzKCc6dGFiYmFibGUnKSAmJiB0b3BsaS5sZW5ndGggPT09IDEgJiYgcGFuZWwubGVuZ3RoID09PSAwICYmIG1lbnUuaGFzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9jbGlja0hhbmRsZXJcbiAgICAgICAgICogQGRlc2MgSGFuZGxlIGNsaWNrIGV2ZW50IG9uIG1lZ2EgbWVudSBpdGVtXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9jbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICAgICAgICAgICAgICAgIHRvcGxpID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgdGhpcy5zZXR0aW5ncy50b3BOYXZJdGVtQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHBhbmVsID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgdGhpcy5zZXR0aW5ncy5wYW5lbENsYXNzKTtcbiAgICAgICAgICAgIGlmICh0b3BsaS5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFuZWwubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICYmIHRvcGxpLmZpbmQoJy4nICsgdGhpcy5zZXR0aW5ncy5wYW5lbENsYXNzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNDbGFzcyh0aGlzLnNldHRpbmdzLm9wZW5DbGFzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmp1c3RGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1c3RGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwodGhpcywgZXZlbnQsIHRhcmdldC5oYXNDbGFzcyh0aGlzLnNldHRpbmdzLm9wZW5DbGFzcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9jbGlja091dHNpZGVIYW5kbGVyXG4gICAgICAgICAqIEBkZXNjIEhhbmRsZSBjbGljayBldmVudCBvdXRzaWRlIG9mIGEgdGhlIG1lZ2FtZW51XG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9jbGlja091dHNpZGVIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmNsb3Nlc3QodGhpcy5tZW51KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fRE9NQXR0ck1vZGlmaWVkSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgRE9NQXR0ck1vZGlmaWVkIGV2ZW50IG9uIHBhbmVsIHRvIHJlc3BvbmQgdG8gV2luZG93cyA4IE5hcnJhdG9yIEV4cGFuZENvbGxhcHNlIHBhdHRlcm5cbiAgICAgICAgICogQHBhcmFtIHtldmVudH0gRXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX0RPTUF0dHJNb2RpZmllZEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LmF0dHJOYW1lID09PSAnYXJpYS1leHBhbmRlZCdcbiAgICAgICAgICAgICAgICAgICAgJiYgZXZlbnQub3JpZ2luYWxFdmVudC5uZXdWYWx1ZSA9PT0gJ2ZhbHNlJ1xuICAgICAgICAgICAgICAgICAgICAmJiAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBfdG9nZ2xlUGFuZWwuY2FsbCh0aGlzLCBldmVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2ZvY3VzSW5IYW5kbGVyXG4gICAgICAgICAqIEBkZXNjIEhhbmRsZSBmb2N1c2luIGV2ZW50IG9uIG1lZ2EgbWVudSBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfZm9jdXNJbkhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzVGltZW91dElEKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksXG4gICAgICAgICAgICAgICAgcGFuZWwgPSB0YXJnZXQuY2xvc2VzdCgnLicgKyB0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpO1xuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZm9jdXNDbGFzcylcbiAgICAgICAgICAgICAgICAub24oJ2NsaWNrLmFjY2Vzc2libGUtbWVnYW1lbnUnLCAkLnByb3h5KF9jbGlja0hhbmRsZXIsIHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSAhdGhpcy5tb3VzZUZvY3VzZWQ7XG4gICAgICAgICAgICB0aGlzLm1vdXNlRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxzLm5vdChwYW5lbCkuZmlsdGVyKCcuJyArIHRoaXMuc2V0dGluZ3Mub3BlbkNsYXNzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdG9nZ2xlUGFuZWwuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2ZvY3VzT3V0SGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgZm9jdXNvdXQgZXZlbnQgb24gbWVnYSBtZW51IGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9mb2N1c091dEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksXG4gICAgICAgICAgICAgICAgdG9wbGkgPSB0YXJnZXQuY2xvc2VzdCgnLicgKyB0aGlzLnNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyksXG4gICAgICAgICAgICAgICAga2VlcE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyh0aGlzLnNldHRpbmdzLmZvY3VzQ2xhc3MpXG4gICAgICAgICAgICAgICAgLm9mZignY2xpY2suYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmN2b3gpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBDaHJvbWVWb3ggaXMgcnVubmluZy4uLlxuICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmN2b3guQXBpLmdldEN1cnJlbnROb2RlKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wbGkuaGFzKG5vZGUpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBub2RlIGJlaW5nIHZvaWNlZCBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZWdhIG1lbnUsIGNsZWFyVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgcGFuZWwgc3RheXMgb3Blbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhhdC5mb2N1c1RpbWVvdXRJRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChzY29wZSwgZXZlbnQsIGhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwoc2NvcGUsIGV2ZW50LCBoaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNzUsIHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgMjUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmZvY3VzVGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9rZXlEb3duSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUga2V5ZG93biBldmVudCBvbiBtZWdhIG1lbnUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9rZXlEb3duSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQWNjZXNzaWJsZU1lZ2FNZW51KSA/IHRoaXMgOiBfZ2V0UGx1Z2luKHRoaXMpLCAvLyBkZXRlcm1pbmUgdGhlIEFjY2Vzc2libGVNZWdhTWVudSBwbHVnaW4gaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHRoYXQuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gJCgkKHRoaXMpLmlzKCcuJyArIHNldHRpbmdzLmhvdmVyQ2xhc3MgKyAnOnRhYmJhYmxlJykgPyB0aGlzIDogZXZlbnQudGFyZ2V0KSwgLy8gaWYgdGhlIGVsZW1lbnQgaXMgaG92ZXJlZCB0aGUgdGFyZ2V0IGlzIHRoaXMsIG90aGVyd2lzZSwgaXRzIHRoZSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBtZW51ID0gdGhhdC5tZW51LFxuICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1zID0gdGhhdC50b3BuYXZpdGVtcyxcbiAgICAgICAgICAgICAgICB0b3BsaSA9IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyksXG4gICAgICAgICAgICAgICAgdGFiYmFibGVzID0gbWVudS5maW5kKCc6dGFiYmFibGUnKSxcbiAgICAgICAgICAgICAgICBwYW5lbCA9IHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKSA/IHRhcmdldCA6IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHBhbmVsR3JvdXBzID0gcGFuZWwuZmluZCgnLicgKyBzZXR0aW5ncy5wYW5lbEdyb3VwQ2xhc3MpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYW5lbEdyb3VwID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgc2V0dGluZ3MucGFuZWxHcm91cENsYXNzKSxcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIGtleWNvZGUgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoLFxuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyA9IEtleWJvYXJkLmtleU1hcFtldmVudC5rZXlDb2RlXSB8fCAnJyxcbiAgICAgICAgICAgICAgICByZWdleCxcbiAgICAgICAgICAgICAgICBpc1RvcE5hdkl0ZW0gPSAodG9wbGkubGVuZ3RoID09PSAxICYmIHBhbmVsLmxlbmd0aCA9PT0gMCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoXCJpbnB1dDpmb2N1cywgc2VsZWN0OmZvY3VzLCB0ZXh0YXJlYTpmb2N1cywgYnV0dG9uOmZvY3VzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGV2ZW50IHRhcmdldCBpcyBhIGZvcm0gZWxlbWVudCB3ZSBzaG91bGQgaGFuZGxlIGtleWRvd24gbm9ybWFsbHlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoJy4nICsgc2V0dGluZ3MuaG92ZXJDbGFzcyArICc6dGFiYmFibGUnKSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ2tleWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRVNDQVBFOlxuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRE9XTjpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RvcE5hdkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwodGhhdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0b3BsaS5maW5kKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MgKyAnIDp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0YWJiYWJsZXMuZmlsdGVyKCc6Z3QoJyArIHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpICsgJyk6Zmlyc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiB3aW5kb3cub3BlcmEgJiYgb3BlcmEudG9TdHJpbmcoKSA9PT0gXCJbb2JqZWN0IE9wZXJhXVwiICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlcyA9ICQoJzp0YWJiYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBpID0gdGFiYmFibGVzLmluZGV4KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKCQoJzp0YWJiYWJsZTpndCgnICsgJCgnOnRhYmJhYmxlJykuaW5kZXgodGFyZ2V0KSArICcpOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuVVA6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUb3BOYXZJdGVtICYmIHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRvcG5hdml0ZW1zLmZpbHRlcignOmx0KCcgKyB0b3BuYXZpdGVtcy5pbmRleCh0b3BsaSkgKyAnKTpsYXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmNoaWxkcmVuKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAobmV4dC5jaGlsZHJlbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnOnRhYmJhYmxlOmxhc3QnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0YWJiYWJsZXMuZmlsdGVyKCc6bHQoJyArIHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpICsgJyk6bGFzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIHdpbmRvdy5vcGVyYSAmJiBvcGVyYS50b1N0cmluZygpID09PSBcIltvYmplY3QgT3BlcmFdXCIgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiYmFibGVzID0gJCgnOnRhYmJhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0YWJiYWJsZXMuaW5kZXgodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAoJCgnOnRhYmJhYmxlOmx0KCcgKyAkKCc6dGFiYmFibGUnKS5pbmRleCh0YXJnZXQpICsgJyk6Zmlyc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlib2FyZC5SSUdIVDpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RvcE5hdkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAodG9wbmF2aXRlbXMuZmlsdGVyKCc6Z3QoJyArIHRvcG5hdml0ZW1zLmluZGV4KHRvcGxpKSArICcpOmZpcnN0JykuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5lbEdyb3Vwcy5sZW5ndGggJiYgY3VycmVudFBhbmVsR3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBwYW5lbCBjb250YWlucyBwYW5lbCBncm91cHMsIGFuZCB3ZSBhcmUgYWJsZSB0byBmb2N1cyB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCBvZiB0aGUgbmV4dCBwYW5lbCBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAocGFuZWxHcm91cHMuZmlsdGVyKCc6Z3QoJyArIHBhbmVsR3JvdXBzLmluZGV4KGN1cnJlbnRQYW5lbEdyb3VwKSArICcpOmZpcnN0JykuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAodG9wbGkuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlib2FyZC5MRUZUOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0b3BuYXZpdGVtcy5maWx0ZXIoJzpsdCgnICsgdG9wbmF2aXRlbXMuaW5kZXgodG9wbGkpICsgJyk6bGFzdCcpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWxHcm91cHMubGVuZ3RoICYmIGN1cnJlbnRQYW5lbEdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgcGFuZWwgY29udGFpbnMgcGFuZWwgZ3JvdXBzLCBhbmQgd2UgYXJlIGFibGUgdG8gZm9jdXMgdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgb2YgdGhlIHByZXZpb3VzIHBhbmVsIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IChwYW5lbEdyb3Vwcy5maWx0ZXIoJzpsdCgnICsgcGFuZWxHcm91cHMuaW5kZXgoY3VycmVudFBhbmVsR3JvdXApICsgJyk6bGFzdCcpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRvcGxpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuVEFCOlxuICAgICAgICAgICAgICAgIGkgPSB0YWJiYWJsZXMuaW5kZXgodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgaXNUb3BOYXZJdGVtICYmIHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRvcG5hdml0ZW1zLmZpbHRlcignOmx0KCcgKyB0b3BuYXZpdGVtcy5pbmRleCh0b3BsaSkgKyAnKTpsYXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmNoaWxkcmVuKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBuZXh0LmNoaWxkcmVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoJy4nICsgc2V0dGluZ3MucGFuZWxDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCc6dGFiYmFibGU6bGFzdCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRhYmJhYmxlcy5maWx0ZXIoJzpsdCgnICsgaSArICcpOmxhc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgaSA8IHRhYmJhYmxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRhYmJhYmxlcy5maWx0ZXIoJzpndCgnICsgaSArICcpOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93Lm9wZXJhICYmIG9wZXJhLnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBPcGVyYV1cIikge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSAkKCc6dGFiYmFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKCQoJzp0YWJiYWJsZTpsdCgnICsgJCgnOnRhYmJhYmxlJykuaW5kZXgodGFyZ2V0KSArICcpOmxhc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICgkKCc6dGFiYmFibGU6Z3QoJyArICQoJzp0YWJiYWJsZScpLmluZGV4KHRhcmdldCkgKyAnKTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuU1BBQ0U6XG4gICAgICAgICAgICAgICAgaWYgKGlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBfY2xpY2tIYW5kbGVyLmNhbGwodGhhdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRU5URVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFscGhhbnVtZXJpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5rZXlkb3duVGltZW91dElEKTtcblxuICAgICAgICAgICAgICAgIGtleWRvd25TZWFyY2hTdHJpbmcgKz0gbmV3U3RyaW5nICE9PSBrZXlkb3duU2VhcmNoU3RyaW5nID8gbmV3U3RyaW5nIDogJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5ZG93blNlYXJjaFN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93blRpbWVvdXRJRCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBrZXlkb3duU2VhcmNoU3RyaW5nID0gJyc7XG4gICAgICAgICAgICAgICAgfSwga2V5ZG93blRpbWVvdXREdXJhdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUb3BOYXZJdGVtICYmICF0YXJnZXQuaGFzQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSB0YWJiYWJsZXMuZmlsdGVyKCc6bm90KC4nICsgc2V0dGluZ3MucGFuZWxDbGFzcyArICcgOnRhYmJhYmxlKScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlcyA9IHRvcGxpLmZpbmQoJzp0YWJiYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSAkKHRhYmJhYmxlcy5nZXQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBvID0gdGFiYmFibGVzLmVxKGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoby5pcyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChrZXlkb3duU2VhcmNoU3RyaW5nLmxlbmd0aCA9PT0gMSkgPyBpICsgMSA6IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBrZXlkb3duU2VhcmNoU3RyaW5nLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyksICdpJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHRhYmJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBvID0gdGFiYmFibGVzLmVxKGkpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQudHJpbShvLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgby5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHRhYmJhYmxlcy5lcShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJC50cmltKG8udGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoYXQuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fbW91c2VEb3duSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgbW91c2Vkb3duIGV2ZW50IG9uIG1lZ2EgbWVudS5cbiAgICAgICAgICogQHBhcmFtIHtldmVudH0gRXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBtZW1iZXJvZiBhY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbW91c2VEb3duSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5pcyh0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiOmZvY3VzYWJsZVwiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlRm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1vdXNlVGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNUaW1lb3V0SUQpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X21vdXNlT3ZlckhhbmRsZXJcbiAgICAgICAgICogQGRlc2MgSGFuZGxlIG1vdXNlb3ZlciBldmVudCBvbiBtZWdhIG1lbnUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9tb3VzZU92ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZVRpbWVvdXRJRCk7XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5ob3ZlckNsYXNzKTtcbiAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXMoJzp0YWJiYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCcpLm9uKCdrZXlkb3duLmFjY2Vzc2libGUtbWVnYW1lbnUnLCAkLnByb3h5KF9rZXlEb3duSGFuZGxlciwgZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X21vdXNlT3V0SGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgbW91c2VvdXQgZXZlbnQgb24gbWVnYSBtZW51LlxuICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbW91c2VPdXRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhhdC5zZXR0aW5ncy5ob3ZlckNsYXNzKTtcblxuICAgICAgICAgICAgdGhhdC5tb3VzZVRpbWVvdXRJRCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKCc6dGFiYmFibGUnKSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ2tleWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIF90b2dnbGVFeHBhbmRlZEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoaGlkZSkge1xuICAgICAgICAgICAgdmFyIG1lbnUgPSB0aGlzLm1lbnU7XG4gICAgICAgICAgICBpZiAoaGlkZSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ21vdXNldXAub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51LCB0b3VjaGVuZC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUsIG1zcG9pbnRlcnVwLm91dHNpZGUtYWNjZXNzaWJsZS1tZWdhbWVudSwgIHBvaW50ZXJ1cC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUnKTtcblxuICAgICAgICAgICAgICAgIG1lbnUuZmluZCgnW2FyaWEtZXhwYW5kZWRdLicgKyB0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpLm9mZignRE9NQXR0ck1vZGlmaWVkLmFjY2Vzc2libGUtbWVnYW1lbnUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCcpLm9uKCdtb3VzZXVwLm91dHNpZGUtYWNjZXNzaWJsZS1tZWdhbWVudSwgdG91Y2hlbmQub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51LCBtc3BvaW50ZXJ1cC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUsICBwb2ludGVydXAub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51JywgJC5wcm94eShfY2xpY2tPdXRzaWRlSGFuZGxlciwgdGhpcykpO1xuXG4gICAgICAgICAgICAgICAgLyogTmFycmF0b3IgaW4gV2luZG93cyA4IGF1dG9tYXRpY2FsbHkgdG9nZ2xlcyB0aGUgYXJpYS1leHBhbmRlZCBwcm9wZXJ0eSBvbiBkb3VibGUgdGFwIG9yIGNsaWNrLlxuICAgICAgICAgICAgICAgICAgIFRvIHJlc3BvbmQgdG8gdGhlIGNoYW5nZSB0byBjb2xsYXBzZSB0aGUgcGFuZWwsIHdlIG11c3QgYWRkIGEgbGlzdGVuZXIgZm9yIGEgRE9NQXR0ck1vZGlmaWVkIGV2ZW50LiAqL1xuICAgICAgICAgICAgICAgIG1lbnUuZmluZCgnW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0uJyArIHRoaXMuc2V0dGluZ3MucGFuZWxDbGFzcykub24oJ0RPTUF0dHJNb2RpZmllZC5hY2Nlc3NpYmxlLW1lZ2FtZW51JywgJC5wcm94eShfRE9NQXR0ck1vZGlmaWVkSGFuZGxlciwgdGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qIHB1YmxpYyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBBY2Nlc3NpYmxlTWVnYU1lbnUsXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGxlbmRzIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBkZXNjIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBhY2Nlc3NpYmxlTWVnYU1lbnUgcGx1Z2luc1xuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgbmF2ID0gJCh0aGlzLmVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBtZW51ID0gbmF2LmNoaWxkcmVuKCd1bCcpLmZpcnN0KCksXG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1zID0gbWVudS5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQoc2V0dGluZ3MsIG5hdiwgbWVudSwgdG9wbmF2aXRlbXMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKHNldHRpbmdzLCBuYXYsIG1lbnUsIHRvcG5hdml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGNvbnN0IENMQVNTX1BSSU1BUllfVE9PTFNfTElTVCA9ICdwbi1saW5rLS10b29scyc7XG4gICAgICAgICAgICAgICAgY29uc3QgQ0xBU1NfUFJJTUFSWV9VVElMSVRZX0xJU1QgPSAncG4tbGluay0tdXRpbGl0eSc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICAgICAgICAgIHRoaXMubWVudSA9IG1lbnU7XG4gICAgICAgICAgICAgICAgdGhpcy50b3BuYXZpdGVtcyA9IHRvcG5hdml0ZW1zO1xuXG4gICAgICAgICAgICAgICAgbmF2LmF0dHIoXCJyb2xlXCIsIFwibmF2aWdhdGlvblwiKTtcbiAgICAgICAgICAgICAgICBtZW51LmFkZENsYXNzKHNldHRpbmdzLm1lbnVDbGFzcyk7XG4gICAgICAgICAgICAgICAgdG9wbmF2aXRlbXMuZWFjaChmdW5jdGlvbiAoaSwgdG9wbmF2aXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wbmF2aXRlbWxpbmssIHRvcG5hdml0ZW1wYW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbSA9ICQodG9wbmF2aXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW0uYWRkQ2xhc3Moc2V0dGluZ3MudG9wTmF2SXRlbUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbWxpbmsgPSB0b3BuYXZpdGVtLmZpbmQoXCI6dGFiYmFibGU6Zmlyc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1wYW5lbCA9IHRvcG5hdml0ZW0uY2hpbGRyZW4oXCI6bm90KDp0YWJiYWJsZSk6bGFzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgX2FkZFVuaXF1ZUlkLmNhbGwodGhhdCwgdG9wbmF2aXRlbWxpbmspO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9wbmF2aXRlbXBhbmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FkZFVuaXF1ZUlkLmNhbGwodGhhdCwgdG9wbmF2aXRlbXBhbmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9wbmF2aXRlbXBhbmVsLmhhc0NsYXNzKCdpcy1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EVE4tMTU2NTogVG9vbHMgYW5kIFV0aWxpdHkgaGFzIG5vIGNvbGxhcHNlL2V4cGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0b3BuYXZpdGVtbGluay5oYXNDbGFzcyhDTEFTU19QUklNQVJZX1RPT0xTX0xJU1QpIHx8IHRvcG5hdml0ZW1saW5rLmhhc0NsYXNzKENMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BuYXZpdGVtbGluay5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBhcmlhLWV4cGFuZGVkIGFuZCBhcmlhLWhpZGRlbiBmb3IgcGFuZWwgdGhhdCBpcyBub3Qgb3Blbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICdpcy1vcGVuJyBhdHRyaWJ1dGUgaXMgc2V0IG9uIHRoZSBhZW0gc2lnaHRseSB0ZW1wbGF0ZSAocHJpbWFyeS1uYXYuaHRtbClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gaWYgd2UncmUgb24gYSBwYWdlIHRoYXQgaXMgdW5kZXIgQnVzaW5lc3MsIHRoZW4gZG9tIGZvciBidXNpbmVzcyBwYW5lbCBpcyAnaXMtb3BlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9wbmF2aXRlbXBhbmVsLmhhc0NsYXNzKCdpcy1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbXBhbmVsLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb2xlXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYW5lbHMgPSBtZW51LmZpbmQoXCIuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzKTtcblxuICAgICAgICAgICAgICAgIG1lbnUub24oXCJmb2N1c2luLmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgXCI6Zm9jdXNhYmxlLCAuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzLCAkLnByb3h5KF9mb2N1c0luSGFuZGxlciwgdGhpcykpXG4gICAgICAgICAgICAgICAgICAgIC5vbihcImZvY3Vzb3V0LmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgXCI6Zm9jdXNhYmxlLCAuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzLCAkLnByb3h5KF9mb2N1c091dEhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJrZXlkb3duLmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgJC5wcm94eShfa2V5RG93bkhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZW92ZXIuYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZU92ZXJIYW5kbGVyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uKFwibW91c2VvdXQuYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZU91dEhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZURvd25IYW5kbGVyLCB0aGlzKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICBtZW51Lm9uKFwidG91Y2hzdGFydC5hY2Nlc3NpYmxlLW1lZ2FtZW51XCIsICAkLnByb3h5KF9jbGlja0hhbmRsZXIsIHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtZW51LmZpbmQoXCJoclwiKS5hdHRyKFwicm9sZVwiLCBcInNlcGFyYXRvclwiKTtcblxuICAgICAgICAgICAgICAgIGlmICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmNsb3Nlc3QobWVudSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRyaWdnZXIoXCJmb2N1c2luLmFjY2Vzc2libGUtbWVnYW1lbnVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAZGVzYyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAqIEBleGFtcGxlICQoc2VsZWN0b3IpLmFjY2Vzc2libGVNZWdhTWVudShcImdldERlZmF1bHRzXCIpO1xuICAgICAgICAgICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXREZWZhdWx0czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0cztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGRlc2MgR2V0IGFueSBvcHRpb24gc2V0IHRvIHBsdWdpbiB1c2luZyBpdHMgbmFtZSAoYXMgc3RyaW5nKVxuICAgICAgICAgICAgICogQGV4YW1wbGUgJChzZWxlY3RvcikuYWNjZXNzaWJsZU1lZ2FNZW51KFwiZ2V0T3B0aW9uXCIsIHNvbWVfb3B0aW9uKTtcbiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRcbiAgICAgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0T3B0aW9uOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Nbb3B0XTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGRlc2MgR2V0IGFsbCBvcHRpb25zXG4gICAgICAgICAgICAgKiBAZXhhbXBsZSAkKHNlbGVjdG9yKS5hY2Nlc3NpYmxlTWVnYU1lbnUoXCJnZXRBbGxPcHRpb25zXCIpO1xuICAgICAgICAgICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXRBbGxPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBkZXNjIFNldCBvcHRpb25cbiAgICAgICAgICAgICAqIEBleGFtcGxlICQoc2VsZWN0b3IpLmFjY2Vzc2libGVNZWdhTWVudShcInNldE9wdGlvblwiLCBcIm9wdGlvbl9uYW1lXCIsICBcIm9wdGlvbl92YWx1ZVwiLCAgcmVpbml0aWFsaXplKTtcbiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHQgLSBPcHRpb24gbmFtZVxuICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIE9wdGlvbiB2YWx1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcmVpbml0aWFsaXplXSAtIGJvb2xlYW4gdG8gcmUtaW5pdGlhbGl6ZSB0aGUgbWVudS5cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0T3B0aW9uOiBmdW5jdGlvbiAob3B0LCB2YWx1ZSwgcmVpbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1tvcHRdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlaW5pdGlhbGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSgpKTtcblxuXG4gICAgJC5mbltwbHVnaW5OYW1lXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCEkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKSkge1xuICAgICAgICAgICAgICAgICQuZGF0YSh0aGlzLCBcInBsdWdpbl9cIiArIHBsdWdpbk5hbWUsIG5ldyAkLmZuW3BsdWdpbk5hbWVdLkFjY2Vzc2libGVNZWdhTWVudSh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkLmZuW3BsdWdpbk5hbWVdLkFjY2Vzc2libGVNZWdhTWVudSA9IEFjY2Vzc2libGVNZWdhTWVudTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmlzaWJsZShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAkLmV4cHIuZmlsdGVycy52aXNpYmxlKGVsZW1lbnQpICYmICEkKGVsZW1lbnQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkLmNzcyh0aGlzLCBcInZpc2liaWxpdHlcIikgPT09IFwiaGlkZGVuXCI7XG4gICAgICAgIH0pLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvY3VzYWJsZShlbGVtZW50LCBpc1RhYkluZGV4Tm90TmFOKSB7XG4gICAgICAgIHZhciBtYXAsIG1hcE5hbWUsIGltZyxcbiAgICAgICAgICAgIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXCJhcmVhXCIgPT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgICBtYXAgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBtYXBOYW1lID0gbWFwLm5hbWU7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaHJlZiB8fCAhbWFwTmFtZSB8fCBtYXAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJtYXBcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltZyA9ICQoXCJpbWdbdXNlbWFwPSNcIiArIG1hcE5hbWUgKyBcIl1cIilbMF07XG4gICAgICAgICAgICByZXR1cm4gISFpbWcgJiYgdmlzaWJsZShpbWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KG5vZGVOYW1lKSA/ICFlbGVtZW50LmRpc2FibGVkIDpcbiAgICAgICAgICAgICAgICBcImFcIiA9PT0gbm9kZU5hbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ocmVmIHx8IGlzVGFiSW5kZXhOb3ROYU4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWJJbmRleE5vdE5hTikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCBiZSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZShlbGVtZW50KTtcbiAgICB9XG5cbiAgICAkLmV4dGVuZCgkLmV4cHJbXCI6XCJdLCB7XG4gICAgICAgIGRhdGE6ICQuZXhwci5jcmVhdGVQc2V1ZG8gPyAkLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uIChkYXRhTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhJC5kYXRhKGVsZW0sIGRhdGFOYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pIDogLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjhcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWxlbSwgaSwgbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhJC5kYXRhKGVsZW0sIG1hdGNoWzNdKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgIGZvY3VzYWJsZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGUoZWxlbWVudCwgIWlzTmFOKCQuYXR0cihlbGVtZW50LCBcInRhYmluZGV4XCIpKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFiYmFibGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgdGFiSW5kZXggPSAkLmF0dHIoZWxlbWVudCwgXCJ0YWJpbmRleFwiKSxcbiAgICAgICAgICAgICAgICBpc1RhYkluZGV4TmFOID0gaXNOYU4odGFiSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIChpc1RhYkluZGV4TmFOIHx8IHRhYkluZGV4ID49IDApICYmIGZvY3VzYWJsZShlbGVtZW50LCAhaXNUYWJJbmRleE5hTik7XG4gICAgICAgIH1cbiAgICB9KTtcbn0oalF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUNBO0FBQ0MsV0FBVUEsQ0FBVixFQUFhQyxNQUFiLEVBQXFCQyxRQUFyQixFQUErQjtFQUU1Qjs7RUFFQSxJQUFJQyxVQUFVLEdBQUcsVUFBakI7RUFBQSxJQUNJQyxRQUFRLEdBQUc7SUFDUEMsVUFBVSxFQUFFLHFCQURMO0lBQzRCO0lBQ25DQyxTQUFTLEVBQUUscUJBRko7SUFFMkI7SUFDbENDLGVBQWUsRUFBRSxrQ0FIVjtJQUc4QztJQUNyREMsVUFBVSxFQUFFLDJCQUpMO0lBSWtDO0lBQ3pDQyxlQUFlLEVBQUUsaUNBTFY7SUFLNkM7SUFDcERDLFVBQVUsRUFBRSxPQU5MO0lBTWM7SUFDckJDLFVBQVUsRUFBRSxPQVBMO0lBT2M7SUFDckJDLFNBQVMsRUFBRSxNQVJKLENBUVc7O0VBUlgsQ0FEZjtFQUFBLElBV0lDLFFBQVEsR0FBRztJQUNQQyxTQUFTLEVBQUUsQ0FESjtJQUVQQyxLQUFLLEVBQUUsR0FGQTtJQUdQQyxNQUFNLEVBQUUsRUFIRDtJQUlQQyxJQUFJLEVBQUUsRUFKQztJQUtQQyxHQUFHLEVBQUUsRUFMRTtJQU1QQyxLQUFLLEVBQUUsRUFOQTtJQU9QQyxNQUFNLEVBQUUsRUFQRDtJQVFQQyxJQUFJLEVBQUUsRUFSQztJQVNQQyxJQUFJLEVBQUUsRUFUQztJQVVQQyxTQUFTLEVBQUUsRUFWSjtJQVdQQyxPQUFPLEVBQUUsRUFYRjtJQVlQQyxNQUFNLEVBQUUsR0FaRDtJQWFQQyxLQUFLLEVBQUUsRUFiQTtJQWNQQyxLQUFLLEVBQUUsRUFkQTtJQWVQQyxHQUFHLEVBQUUsQ0FmRTtJQWdCUEMsRUFBRSxFQUFFLEVBaEJHO0lBaUJQQyxNQUFNLEVBQUU7TUFDSixJQUFJLEdBREE7TUFFSixJQUFJLEdBRkE7TUFHSixJQUFJLEdBSEE7TUFJSixJQUFJLEdBSkE7TUFLSixJQUFJLEdBTEE7TUFNSixJQUFJLEdBTkE7TUFPSixJQUFJLEdBUEE7TUFRSixJQUFJLEdBUkE7TUFTSixJQUFJLEdBVEE7TUFVSixJQUFJLEdBVkE7TUFXSixJQUFJLEdBWEE7TUFZSixJQUFJLEdBWkE7TUFhSixJQUFJLEdBYkE7TUFjSixJQUFJLEdBZEE7TUFlSixJQUFJLEdBZkE7TUFnQkosSUFBSSxHQWhCQTtNQWlCSixJQUFJLEdBakJBO01Ba0JKLElBQUksR0FsQkE7TUFtQkosSUFBSSxHQW5CQTtNQW9CSixJQUFJLEdBcEJBO01BcUJKLElBQUksR0FyQkE7TUFzQkosSUFBSSxHQXRCQTtNQXVCSixJQUFJLEdBdkJBO01Bd0JKLElBQUksR0F4QkE7TUF5QkosSUFBSSxHQXpCQTtNQTBCSixJQUFJLEdBMUJBO01BMkJKLElBQUksR0EzQkE7TUE0QkosSUFBSSxHQTVCQTtNQTZCSixJQUFJLEdBN0JBO01BOEJKLElBQUksR0E5QkE7TUErQkosSUFBSSxHQS9CQTtNQWdDSixJQUFJLEdBaENBO01BaUNKLElBQUksR0FqQ0E7TUFrQ0osSUFBSSxHQWxDQTtNQW1DSixJQUFJLEdBbkNBO01Bb0NKLElBQUksR0FwQ0E7TUFxQ0osSUFBSSxHQXJDQTtNQXNDSixJQUFJLEdBdENBO01BdUNKLElBQUksR0F2Q0E7TUF3Q0osSUFBSSxHQXhDQTtNQXlDSixJQUFJLEdBekNBO01BMENKLEtBQUssR0ExQ0Q7TUEyQ0osS0FBSyxHQTNDRDtNQTRDSixLQUFLLEdBNUNEO01BNkNKLEtBQUssR0E3Q0Q7TUE4Q0osS0FBSyxHQTlDRDtNQStDSixLQUFLLEdBL0NEO01BZ0RKLEtBQUs7SUFoREQ7RUFqQkQsQ0FYZjtFQStFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUNJLFNBQVNDLGtCQUFULENBQTRCQyxPQUE1QixFQUFxQ0MsT0FBckMsRUFBOEM7SUFDMUMsS0FBS0QsT0FBTCxHQUFlQSxPQUFmLENBRDBDLENBRzFDOztJQUNBLEtBQUtFLFFBQUwsR0FBZ0JsQyxDQUFDLENBQUNtQyxNQUFGLENBQVMsRUFBVCxFQUFhL0IsUUFBYixFQUF1QjZCLE9BQXZCLENBQWhCO0lBRUEsS0FBS0csU0FBTCxHQUFpQmhDLFFBQWpCO0lBQ0EsS0FBS2lDLEtBQUwsR0FBYWxDLFVBQWI7SUFFQSxLQUFLbUMsY0FBTCxHQUFzQixJQUF0QjtJQUNBLEtBQUtDLGNBQUwsR0FBc0IsSUFBdEI7SUFDQSxLQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixLQUFuQjtJQUVBLEtBQUtDLElBQUw7RUFDSDs7RUFFRFgsa0JBQWtCLENBQUNZLFNBQW5CLEdBQWdDLFlBQVk7SUFFeEM7SUFDQSxJQUFJQyxJQUFJLEdBQUcsQ0FBWDtJQUFBLElBQ0lDLHNCQUFzQixHQUFHLElBRDdCO0lBQUEsSUFFSUMsbUJBQW1CLEdBQUcsRUFGMUI7SUFBQSxJQUdJQyxPQUFPLEdBQUcsT0FBTzlDLE1BQU0sQ0FBQytDLGNBQWQsS0FBaUMsVUFBakMsSUFBK0MsQ0FBQyxDQUFDL0MsTUFBTSxDQUFDK0MsY0FBUCxDQUFzQixjQUF0QixDQUgvRDtJQUFBLElBSUlDLFVBSko7SUFBQSxJQUtJQyxZQUxKO0lBQUEsSUFNSUMsWUFOSjtJQUFBLElBT0lDLGFBUEo7SUFBQSxJQVFJQyxvQkFSSjtJQUFBLElBU0lDLHVCQVRKO0lBQUEsSUFVSUMsZUFWSjtJQUFBLElBV0lDLGdCQVhKO0lBQUEsSUFZSUMsZUFaSjtJQUFBLElBYUlDLGlCQWJKO0lBQUEsSUFjSUMsaUJBZEo7SUFBQSxJQWVJQyxnQkFmSjtJQUFBLElBZ0JJQyw0QkFoQko7SUFrQkE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0lBQ1FaLFVBQVUsR0FBRyxvQkFBVWpCLE9BQVYsRUFBbUI7TUFDNUIsT0FBT2hDLENBQUMsQ0FBQ2dDLE9BQUQsQ0FBRCxDQUFXOEIsT0FBWCxDQUFtQixrQkFBa0IzRCxVQUFsQixHQUErQixHQUFsRCxFQUF1RDRELElBQXZELENBQTRELFlBQVk1RCxVQUF4RSxDQUFQO0lBQ0gsQ0FGRDtJQUlBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUStDLFlBQVksR0FBRyxzQkFBVWxCLE9BQVYsRUFBbUI7TUFDOUJBLE9BQU8sR0FBR2hDLENBQUMsQ0FBQ2dDLE9BQUQsQ0FBWDtNQUNBLElBQUlFLFFBQVEsR0FBRyxLQUFLQSxRQUFwQjs7TUFDQSxJQUFJLENBQUNGLE9BQU8sQ0FBQ2dDLElBQVIsQ0FBYSxJQUFiLENBQUwsRUFBeUI7UUFDckJoQyxPQUFPLENBQUNnQyxJQUFSLENBQWEsSUFBYixFQUFtQjlCLFFBQVEsQ0FBQzdCLFVBQVQsR0FBc0IsR0FBdEIsR0FBNEIsSUFBSTRELElBQUosR0FBV0MsT0FBWCxFQUE1QixHQUFtRCxHQUFuRCxHQUEwRCxFQUFFdEIsSUFBL0U7TUFDSDtJQUNKLENBTkQ7SUFRQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0lBQ1FPLFlBQVksR0FBRyxzQkFBVWdCLEtBQVYsRUFBaUJDLElBQWpCLEVBQXVCO01BQ2xDLElBQUlDLE1BQU0sR0FBR3JFLENBQUMsQ0FBQ21FLEtBQUssQ0FBQ0UsTUFBUCxDQUFkO01BQUEsSUFDSUMsSUFBSSxHQUFHLElBRFg7TUFBQSxJQUVJcEMsUUFBUSxHQUFHLEtBQUtBLFFBRnBCO01BQUEsSUFHSXFDLElBQUksR0FBRyxLQUFLQSxJQUhoQjtNQUFBLElBSUlDLEtBQUssR0FBR0gsTUFBTSxDQUFDUCxPQUFQLENBQWUsTUFBTTVCLFFBQVEsQ0FBQzNCLGVBQTlCLENBSlo7TUFBQSxJQUtJa0UsS0FBSyxHQUFHSixNQUFNLENBQUNLLFFBQVAsQ0FBZ0J4QyxRQUFRLENBQUMxQixVQUF6QixJQUF1QzZELE1BQXZDLEdBQWdEQSxNQUFNLENBQUNQLE9BQVAsQ0FBZSxNQUFNNUIsUUFBUSxDQUFDMUIsVUFBOUIsQ0FMNUQ7TUFBQSxJQU1JbUUsUUFOSjs7TUFRQWQsNEJBQTRCLENBQUNlLElBQTdCLENBQWtDLElBQWxDLEVBQXdDLElBQXhDOztNQUNBLElBQUkzRSxNQUFNLENBQUM0RSxVQUFQLENBQWtCLG9CQUFsQixFQUF3Q0MsT0FBNUMsRUFBcUQ7UUFDakQsSUFBSVYsSUFBSixFQUFVO1VBQ05JLEtBQUssR0FBR0QsSUFBSSxDQUFDUSxJQUFMLENBQVUsTUFBTTdDLFFBQVEsQ0FBQzNCLGVBQWYsR0FBaUMsWUFBakMsR0FBZ0QyQixRQUFRLENBQUN0QixTQUF6RCxHQUFxRSxRQUEvRSxFQUF5RmtELE9BQXpGLENBQWlHLE1BQU01QixRQUFRLENBQUMzQixlQUFoSCxDQUFSOztVQUNBLElBQUksRUFBRWlFLEtBQUssQ0FBQ1EsRUFBTixDQUFTYixLQUFLLENBQUNjLGFBQWYsS0FBaUNULEtBQUssQ0FBQ1UsR0FBTixDQUFVZixLQUFLLENBQUNjLGFBQWhCLEVBQStCRSxNQUEvQixHQUF3QyxDQUEzRSxDQUFKLEVBQW1GO1lBQy9FLElBQUksQ0FBQ2hCLEtBQUssQ0FBQ2lCLElBQU4sS0FBZSxVQUFmLElBQTZCakIsS0FBSyxDQUFDaUIsSUFBTixLQUFlLFVBQTdDLEtBQTREWixLQUFLLENBQUNVLEdBQU4sQ0FBVWhGLFFBQVEsQ0FBQ21GLGFBQW5CLEVBQWtDRixNQUFsQyxHQUEyQyxDQUEzRyxFQUE4RztjQUMxRztZQUNIOztZQUNEWCxLQUFLLENBQUNPLElBQU4sQ0FBVyxpQkFBWCxFQUNLZixJQURMLENBQ1UsZUFEVixFQUMyQixPQUQzQixFQUVLc0IsV0FGTCxDQUVpQnBELFFBQVEsQ0FBQ3RCLFNBRjFCLEVBR0syRSxNQUhMLENBR1ksTUFBTXJELFFBQVEsQ0FBQzFCLFVBSDNCLEVBSUt3RCxJQUpMLENBSVUsYUFKVixFQUl5QixNQUp6Qjs7WUFLQSxJQUFLRyxLQUFLLENBQUNpQixJQUFOLEtBQWUsU0FBZixJQUE0QmpCLEtBQUssQ0FBQ3FCLE9BQU4sS0FBa0IzRSxRQUFRLENBQUNPLE1BQXhELElBQW1FK0MsS0FBSyxDQUFDaUIsSUFBTixLQUFlLGlCQUF0RixFQUF5RztjQUNyR1QsUUFBUSxHQUFHSCxLQUFLLENBQUNPLElBQU4sQ0FBVyxpQkFBWCxDQUFYO2NBQ0FVLFVBQVUsQ0FBQyxZQUFZO2dCQUNuQmxCLElBQUksQ0FBQ1EsSUFBTCxDQUFVLHFCQUFxQlQsSUFBSSxDQUFDcEMsUUFBTCxDQUFjMUIsVUFBN0MsRUFBeURrRixHQUF6RCxDQUE2RCxxQ0FBN0Q7Z0JBQ0FmLFFBQVEsQ0FBQ2dCLEtBQVQ7Z0JBQ0FyQixJQUFJLENBQUM3QixXQUFMLEdBQW1CLEtBQW5CO2NBQ0gsQ0FKUyxFQUlQLEVBSk8sQ0FBVjtZQUtIO1VBQ0osQ0FqQkQsTUFpQk8sSUFBSStCLEtBQUssQ0FBQ1csTUFBTixLQUFpQixDQUFyQixFQUF3QjtZQUMzQlosSUFBSSxDQUFDUSxJQUFMLENBQVUsc0JBQVYsRUFDS2YsSUFETCxDQUNVLGVBRFYsRUFDMkIsT0FEM0IsRUFFS3NCLFdBRkwsQ0FFaUJwRCxRQUFRLENBQUN0QixTQUYxQixFQUdLMkUsTUFITCxDQUdZLE1BQU1yRCxRQUFRLENBQUMxQixVQUgzQixFQUlLd0QsSUFKTCxDQUlVLGFBSlYsRUFJeUIsTUFKekI7VUFLSDtRQUNKLENBMUJELE1BMEJPO1VBQ0g0QixZQUFZLENBQUN0QixJQUFJLENBQUMvQixjQUFOLENBQVo7VUFDQWlDLEtBQUssQ0FBQ3FCLFFBQU4sR0FDS2QsSUFETCxDQUNVLGlCQURWLEVBRUtmLElBRkwsQ0FFVSxlQUZWLEVBRTJCLE9BRjNCLEVBR0tzQixXQUhMLENBR2lCcEQsUUFBUSxDQUFDdEIsU0FIMUIsRUFJSzJFLE1BSkwsQ0FJWSxNQUFNckQsUUFBUSxDQUFDMUIsVUFKM0IsRUFLS3dELElBTEwsQ0FLVSxhQUxWLEVBS3lCLE1BTHpCO1VBTUFRLEtBQUssQ0FBQ08sSUFBTixDQUFXLGlCQUFYLEVBQ0tmLElBREwsQ0FDVSxlQURWLEVBQzJCLE1BRDNCLEVBRUs4QixRQUZMLENBRWM1RCxRQUFRLENBQUN0QixTQUZ2QixFQUdLMkUsTUFITCxDQUdZLE1BQU1yRCxRQUFRLENBQUMxQixVQUgzQixFQUlLd0QsSUFKTCxDQUlVLGFBSlYsRUFJeUIsT0FKekI7O1VBS0EsSUFBSUcsS0FBSyxDQUFDaUIsSUFBTixLQUFlLFdBQWYsSUFBOEJmLE1BQU0sQ0FBQ1csRUFBUCxDQUFVLFdBQVYsQ0FBOUIsSUFBd0RSLEtBQUssQ0FBQ1csTUFBTixLQUFpQixDQUF6RSxJQUE4RVYsS0FBSyxDQUFDVSxNQUFOLEtBQWlCLENBQS9GLElBQW9HWixJQUFJLENBQUNXLEdBQUwsQ0FBU2hGLFFBQVEsQ0FBQ21GLGFBQWxCLEVBQWlDRixNQUFqQyxHQUEwQyxDQUFsSixFQUFxSjtZQUNqSmQsTUFBTSxDQUFDc0IsS0FBUDtZQUNBckIsSUFBSSxDQUFDN0IsV0FBTCxHQUFtQixLQUFuQjtVQUNIOztVQUVEb0IsNEJBQTRCLENBQUNlLElBQTdCLENBQWtDTixJQUFsQztRQUNIO01BQ1I7SUFDQSxDQTFERDtJQTREQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUWxCLGFBQWEsR0FBRyx1QkFBVWUsS0FBVixFQUFpQjtNQUM3QixJQUFJRSxNQUFNLEdBQUdyRSxDQUFDLENBQUNtRSxLQUFLLENBQUM0QixhQUFQLENBQWQ7TUFBQSxJQUNJdkIsS0FBSyxHQUFHSCxNQUFNLENBQUNQLE9BQVAsQ0FBZSxNQUFNLEtBQUs1QixRQUFMLENBQWMzQixlQUFuQyxDQURaO01BQUEsSUFFSWtFLEtBQUssR0FBR0osTUFBTSxDQUFDUCxPQUFQLENBQWUsTUFBTSxLQUFLNUIsUUFBTCxDQUFjMUIsVUFBbkMsQ0FGWjs7TUFHQSxJQUFJZ0UsS0FBSyxDQUFDVyxNQUFOLEtBQWlCLENBQWpCLElBQ09WLEtBQUssQ0FBQ1UsTUFBTixLQUFpQixDQUR4QixJQUVPWCxLQUFLLENBQUNPLElBQU4sQ0FBVyxNQUFNLEtBQUs3QyxRQUFMLENBQWMxQixVQUEvQixFQUEyQzJFLE1BQTNDLEtBQXNELENBRmpFLEVBRW9FO1FBQ2hFLElBQUksQ0FBQ2QsTUFBTSxDQUFDSyxRQUFQLENBQWdCLEtBQUt4QyxRQUFMLENBQWN0QixTQUE5QixDQUFMLEVBQStDO1VBQzNDdUQsS0FBSyxDQUFDNkIsY0FBTjtVQUNBN0IsS0FBSyxDQUFDOEIsZUFBTjs7VUFDQTlDLFlBQVksQ0FBQ3lCLElBQWIsQ0FBa0IsSUFBbEIsRUFBd0JULEtBQXhCOztVQUNBLEtBQUsxQixXQUFMLEdBQW1CLEtBQW5CO1FBQ0gsQ0FMRCxNQUtPO1VBQ0gsSUFBSSxLQUFLQSxXQUFULEVBQXNCO1lBQ2xCMEIsS0FBSyxDQUFDNkIsY0FBTjtZQUNBN0IsS0FBSyxDQUFDOEIsZUFBTjtZQUNBLEtBQUt4RCxXQUFMLEdBQW1CLEtBQW5CO1VBQ0gsQ0FKRCxNQUlPLElBQUlNLE9BQUosRUFBYTtZQUNoQm9CLEtBQUssQ0FBQzZCLGNBQU47WUFDQTdCLEtBQUssQ0FBQzhCLGVBQU47O1lBQ0E5QyxZQUFZLENBQUN5QixJQUFiLENBQWtCLElBQWxCLEVBQXdCVCxLQUF4QixFQUErQkUsTUFBTSxDQUFDSyxRQUFQLENBQWdCLEtBQUt4QyxRQUFMLENBQWN0QixTQUE5QixDQUEvQjtVQUNIO1FBQ0o7TUFDSjtJQUNKLENBeEJEO0lBMEJBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztJQUNReUMsb0JBQW9CLEdBQUcsOEJBQVVjLEtBQVYsRUFBaUI7TUFDcEMsSUFBSW5FLENBQUMsQ0FBQ21FLEtBQUssQ0FBQ0UsTUFBUCxDQUFELENBQWdCUCxPQUFoQixDQUF3QixLQUFLUyxJQUE3QixFQUFtQ1ksTUFBbkMsS0FBOEMsQ0FBbEQsRUFBcUQ7UUFDakRoQixLQUFLLENBQUM2QixjQUFOO1FBQ0E3QixLQUFLLENBQUM4QixlQUFOOztRQUNBOUMsWUFBWSxDQUFDeUIsSUFBYixDQUFrQixJQUFsQixFQUF3QlQsS0FBeEIsRUFBK0IsSUFBL0I7TUFDSDtJQUNKLENBTkQ7SUFRQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUWIsdUJBQXVCLEdBQUcsaUNBQVVhLEtBQVYsRUFBaUI7TUFDdkMsSUFBSUEsS0FBSyxDQUFDK0IsYUFBTixDQUFvQkMsUUFBcEIsS0FBaUMsZUFBakMsSUFDT2hDLEtBQUssQ0FBQytCLGFBQU4sQ0FBb0JFLFFBQXBCLEtBQWlDLE9BRHhDLElBRU9wRyxDQUFDLENBQUNtRSxLQUFLLENBQUNFLE1BQVAsQ0FBRCxDQUFnQkssUUFBaEIsQ0FBeUIsS0FBS3hDLFFBQUwsQ0FBY3RCLFNBQXZDLENBRlgsRUFFOEQ7UUFDMUR1RCxLQUFLLENBQUM2QixjQUFOO1FBQ0E3QixLQUFLLENBQUM4QixlQUFOOztRQUNBOUMsWUFBWSxDQUFDeUIsSUFBYixDQUFrQixJQUFsQixFQUF3QlQsS0FBeEIsRUFBK0IsSUFBL0I7TUFDSDtJQUNKLENBUkQ7SUFVQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUVosZUFBZSxHQUFHLHlCQUFVWSxLQUFWLEVBQWlCO01BQy9CeUIsWUFBWSxDQUFDLEtBQUtyRCxjQUFOLENBQVo7TUFDQSxJQUFJOEIsTUFBTSxHQUFHckUsQ0FBQyxDQUFDbUUsS0FBSyxDQUFDRSxNQUFQLENBQWQ7TUFBQSxJQUNJSSxLQUFLLEdBQUdKLE1BQU0sQ0FBQ1AsT0FBUCxDQUFlLE1BQU0sS0FBSzVCLFFBQUwsQ0FBYzFCLFVBQW5DLENBRFo7TUFFQTZELE1BQU0sQ0FDRHlCLFFBREwsQ0FDYyxLQUFLNUQsUUFBTCxDQUFjdkIsVUFENUIsRUFFSzBGLEVBRkwsQ0FFUSwyQkFGUixFQUVxQ3JHLENBQUMsQ0FBQ3NHLEtBQUYsQ0FBUWxELGFBQVIsRUFBdUIsSUFBdkIsQ0FGckM7TUFHQSxLQUFLWCxXQUFMLEdBQW1CLENBQUMsS0FBS0QsWUFBekI7TUFDQSxLQUFLQSxZQUFMLEdBQW9CLEtBQXBCOztNQUNBLElBQUksS0FBSytELE1BQUwsQ0FBWUMsR0FBWixDQUFnQi9CLEtBQWhCLEVBQXVCYyxNQUF2QixDQUE4QixNQUFNLEtBQUtyRCxRQUFMLENBQWN0QixTQUFsRCxFQUE2RHVFLE1BQWpFLEVBQXlFO1FBQ3JFaEMsWUFBWSxDQUFDeUIsSUFBYixDQUFrQixJQUFsQixFQUF3QlQsS0FBeEI7TUFDSDtJQUNKLENBWkQ7SUFjQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUVgsZ0JBQWdCLEdBQUcsMEJBQVVXLEtBQVYsRUFBaUI7TUFDaEMsS0FBSzFCLFdBQUwsR0FBbUIsS0FBbkI7TUFDQSxJQUFJNkIsSUFBSSxHQUFHLElBQVg7TUFBQSxJQUNJRCxNQUFNLEdBQUdyRSxDQUFDLENBQUNtRSxLQUFLLENBQUNFLE1BQVAsQ0FEZDtNQUFBLElBRUlHLEtBQUssR0FBR0gsTUFBTSxDQUFDUCxPQUFQLENBQWUsTUFBTSxLQUFLNUIsUUFBTCxDQUFjM0IsZUFBbkMsQ0FGWjtNQUFBLElBR0lrRyxRQUFRLEdBQUcsS0FIZjtNQUlBcEMsTUFBTSxDQUNEaUIsV0FETCxDQUNpQixLQUFLcEQsUUFBTCxDQUFjdkIsVUFEL0IsRUFFSytFLEdBRkwsQ0FFUywyQkFGVDs7TUFJQSxJQUFJekYsTUFBTSxDQUFDeUcsSUFBWCxFQUFpQjtRQUNiO1FBQ0FwQyxJQUFJLENBQUMvQixjQUFMLEdBQXNCa0QsVUFBVSxDQUFDLFlBQVk7VUFDekN4RixNQUFNLENBQUN5RyxJQUFQLENBQVlDLEdBQVosQ0FBZ0JDLGNBQWhCLENBQStCLFVBQVVDLElBQVYsRUFBZ0I7WUFDM0MsSUFBSXJDLEtBQUssQ0FBQ1UsR0FBTixDQUFVMkIsSUFBVixFQUFnQjFCLE1BQXBCLEVBQTRCO2NBQ3hCO2NBQ0E7Y0FDQTtjQUNBUyxZQUFZLENBQUN0QixJQUFJLENBQUMvQixjQUFOLENBQVo7WUFDSCxDQUxELE1BS087Y0FDSCtCLElBQUksQ0FBQy9CLGNBQUwsR0FBc0JrRCxVQUFVLENBQUMsVUFBVXFCLEtBQVYsRUFBaUIzQyxLQUFqQixFQUF3QkMsSUFBeEIsRUFBOEI7Z0JBQzNEakIsWUFBWSxDQUFDeUIsSUFBYixDQUFrQmtDLEtBQWxCLEVBQXlCM0MsS0FBekIsRUFBZ0NDLElBQWhDO2NBQ0gsQ0FGK0IsRUFFN0IsR0FGNkIsRUFFeEJFLElBRndCLEVBRWxCSCxLQUZrQixFQUVYLElBRlcsQ0FBaEM7WUFHSDtVQUNKLENBWEQ7UUFZSCxDQWIrQixFQWE3QixFQWI2QixDQUFoQztNQWNILENBaEJELE1BZ0JPO1FBQ0hHLElBQUksQ0FBQy9CLGNBQUwsR0FBc0JrRCxVQUFVLENBQUMsWUFBWTtVQUN6Q3RDLFlBQVksQ0FBQ3lCLElBQWIsQ0FBa0JOLElBQWxCLEVBQXdCSCxLQUF4QixFQUErQixJQUEvQjtRQUNILENBRitCLEVBRTdCLEdBRjZCLENBQWhDO01BR0g7SUFDSixDQS9CRDtJQWlDQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUVYsZUFBZSxHQUFHLHlCQUFVVSxLQUFWLEVBQWlCO01BQy9CLElBQUlHLElBQUksR0FBSSxLQUFLeUMsV0FBTCxLQUFxQmhGLGtCQUF0QixHQUE0QyxJQUE1QyxHQUFtRGtCLFVBQVUsQ0FBQyxJQUFELENBQXhFO01BQUEsSUFBZ0Y7TUFDNUVmLFFBQVEsR0FBR29DLElBQUksQ0FBQ3BDLFFBRHBCO01BQUEsSUFFSW1DLE1BQU0sR0FBR3JFLENBQUMsQ0FBQ0EsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRZ0YsRUFBUixDQUFXLE1BQU05QyxRQUFRLENBQUN4QixVQUFmLEdBQTRCLFdBQXZDLElBQXNELElBQXRELEdBQTZEeUQsS0FBSyxDQUFDRSxNQUFwRSxDQUZkO01BQUEsSUFFMkY7TUFDdkZFLElBQUksR0FBR0QsSUFBSSxDQUFDQyxJQUhoQjtNQUFBLElBSUl5QyxXQUFXLEdBQUcxQyxJQUFJLENBQUMwQyxXQUp2QjtNQUFBLElBS0l4QyxLQUFLLEdBQUdILE1BQU0sQ0FBQ1AsT0FBUCxDQUFlLE1BQU01QixRQUFRLENBQUMzQixlQUE5QixDQUxaO01BQUEsSUFNSTBHLFNBQVMsR0FBRzFDLElBQUksQ0FBQ1EsSUFBTCxDQUFVLFdBQVYsQ0FOaEI7TUFBQSxJQU9JTixLQUFLLEdBQUdKLE1BQU0sQ0FBQ0ssUUFBUCxDQUFnQnhDLFFBQVEsQ0FBQzFCLFVBQXpCLElBQXVDNkQsTUFBdkMsR0FBZ0RBLE1BQU0sQ0FBQ1AsT0FBUCxDQUFlLE1BQU01QixRQUFRLENBQUMxQixVQUE5QixDQVA1RDtNQUFBLElBUUkwRyxXQUFXLEdBQUd6QyxLQUFLLENBQUNNLElBQU4sQ0FBVyxNQUFNN0MsUUFBUSxDQUFDekIsZUFBMUIsQ0FSbEI7TUFBQSxJQVNJMEcsaUJBQWlCLEdBQUc5QyxNQUFNLENBQUNQLE9BQVAsQ0FBZSxNQUFNNUIsUUFBUSxDQUFDekIsZUFBOUIsQ0FUeEI7TUFBQSxJQVVJMkcsSUFWSjtNQUFBLElBV0lDLE9BQU8sR0FBR2xELEtBQUssQ0FBQ3FCLE9BQU4sSUFBaUJyQixLQUFLLENBQUNtRCxLQVhyQztNQUFBLElBWUlDLEtBWko7TUFBQSxJQWFJQyxDQWJKO01BQUEsSUFjSUMsQ0FkSjtNQUFBLElBZUlDLEtBZko7TUFBQSxJQWdCSUMsS0FBSyxHQUFHLEtBaEJaO01BQUEsSUFpQklDLFNBQVMsR0FBRy9HLFFBQVEsQ0FBQ2lCLE1BQVQsQ0FBZ0JxQyxLQUFLLENBQUNxQixPQUF0QixLQUFrQyxFQWpCbEQ7TUFBQSxJQWtCSXFDLEtBbEJKO01BQUEsSUFtQklDLFlBQVksR0FBSXRELEtBQUssQ0FBQ1csTUFBTixLQUFpQixDQUFqQixJQUFzQlYsS0FBSyxDQUFDVSxNQUFOLEtBQWlCLENBbkIzRDs7TUFxQkEsSUFBSWQsTUFBTSxDQUFDVyxFQUFQLENBQVUseURBQVYsQ0FBSixFQUEwRTtRQUN0RTtRQUNBO01BQ0g7O01BRUQsSUFBSVgsTUFBTSxDQUFDVyxFQUFQLENBQVUsTUFBTTlDLFFBQVEsQ0FBQ3hCLFVBQWYsR0FBNEIsV0FBdEMsQ0FBSixFQUF3RDtRQUNwRFYsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVMEYsR0FBVixDQUFjLDZCQUFkO01BQ0g7O01BRUQsUUFBUTJCLE9BQVI7UUFDQSxLQUFLeEcsUUFBUSxDQUFDTyxNQUFkO1VBQ0krQixZQUFZLENBQUN5QixJQUFiLENBQWtCTixJQUFsQixFQUF3QkgsS0FBeEIsRUFBK0IsSUFBL0I7O1VBQ0E7O1FBQ0osS0FBS3RELFFBQVEsQ0FBQ0ksSUFBZDtVQUNJa0QsS0FBSyxDQUFDNkIsY0FBTjs7VUFDQSxJQUFJOEIsWUFBSixFQUFrQjtZQUNkM0UsWUFBWSxDQUFDeUIsSUFBYixDQUFrQk4sSUFBbEIsRUFBd0JILEtBQXhCOztZQUNBd0QsS0FBSyxHQUFJbkQsS0FBSyxDQUFDTyxJQUFOLENBQVcsTUFBTTdDLFFBQVEsQ0FBQzFCLFVBQWYsR0FBNEIsa0JBQXZDLEVBQTJEbUYsS0FBM0QsR0FBbUVSLE1BQW5FLEtBQThFLENBQXZGO1VBQ0gsQ0FIRCxNQUdPO1lBQ0h3QyxLQUFLLEdBQUlWLFNBQVMsQ0FBQzFCLE1BQVYsQ0FBaUIsU0FBUzBCLFNBQVMsQ0FBQ2MsS0FBVixDQUFnQjFELE1BQWhCLENBQVQsR0FBbUMsU0FBcEQsRUFBK0RzQixLQUEvRCxHQUF1RVIsTUFBdkUsS0FBa0YsQ0FBM0Y7VUFDSDs7VUFFRCxJQUFJLENBQUN3QyxLQUFELElBQVUxSCxNQUFNLENBQUMrSCxLQUFqQixJQUEwQkEsS0FBSyxDQUFDQyxRQUFOLE9BQXFCLGdCQUEvQyxLQUFvRTlELEtBQUssQ0FBQytELE9BQU4sSUFBaUIvRCxLQUFLLENBQUNnRSxPQUEzRixDQUFKLEVBQXlHO1lBQ3JHbEIsU0FBUyxHQUFHakgsQ0FBQyxDQUFDLFdBQUQsQ0FBYjtZQUNBd0gsQ0FBQyxHQUFHUCxTQUFTLENBQUNjLEtBQVYsQ0FBZ0IxRCxNQUFoQixDQUFKO1lBQ0FzRCxLQUFLLEdBQUkzSCxDQUFDLENBQUMsa0JBQWtCQSxDQUFDLENBQUMsV0FBRCxDQUFELENBQWUrSCxLQUFmLENBQXFCMUQsTUFBckIsQ0FBbEIsR0FBaUQsU0FBbEQsQ0FBRCxDQUE4RHNCLEtBQTlELEdBQXNFUixNQUF0RSxLQUFpRixDQUExRjtVQUNIOztVQUNEOztRQUNKLEtBQUt0RSxRQUFRLENBQUNnQixFQUFkO1VBQ0lzQyxLQUFLLENBQUM2QixjQUFOOztVQUNBLElBQUk4QixZQUFZLElBQUl6RCxNQUFNLENBQUNLLFFBQVAsQ0FBZ0J4QyxRQUFRLENBQUN0QixTQUF6QixDQUFwQixFQUF5RDtZQUNyRHVDLFlBQVksQ0FBQ3lCLElBQWIsQ0FBa0JOLElBQWxCLEVBQXdCSCxLQUF4QixFQUErQixJQUEvQjs7WUFDQWlELElBQUksR0FBR0osV0FBVyxDQUFDekIsTUFBWixDQUFtQixTQUFTeUIsV0FBVyxDQUFDZSxLQUFaLENBQWtCdkQsS0FBbEIsQ0FBVCxHQUFvQyxRQUF2RCxDQUFQOztZQUNBLElBQUk0QyxJQUFJLENBQUNnQixRQUFMLENBQWMsTUFBTWxHLFFBQVEsQ0FBQzFCLFVBQTdCLEVBQXlDMkUsTUFBN0MsRUFBcUQ7Y0FDakR3QyxLQUFLLEdBQUlQLElBQUksQ0FBQ2dCLFFBQUwsR0FDSnBFLElBREksQ0FDQyxlQURELEVBQ2tCLE1BRGxCLEVBRUo4QixRQUZJLENBRUs1RCxRQUFRLENBQUN0QixTQUZkLEVBR0oyRSxNQUhJLENBR0csTUFBTXJELFFBQVEsQ0FBQzFCLFVBSGxCLEVBSUp3RCxJQUpJLENBSUMsYUFKRCxFQUlnQixPQUpoQixFQUtKZSxJQUxJLENBS0MsZ0JBTEQsRUFNSlksS0FOSSxPQU1RLENBTmpCO1lBT0g7VUFDSixDQVpELE1BWU8sSUFBSSxDQUFDbUMsWUFBTCxFQUFtQjtZQUN0QkgsS0FBSyxHQUFJVixTQUFTLENBQUMxQixNQUFWLENBQWlCLFNBQVMwQixTQUFTLENBQUNjLEtBQVYsQ0FBZ0IxRCxNQUFoQixDQUFULEdBQW1DLFFBQXBELEVBQThEc0IsS0FBOUQsR0FBc0VSLE1BQXRFLEtBQWlGLENBQTFGO1VBQ0g7O1VBRUQsSUFBSSxDQUFDd0MsS0FBRCxJQUFVMUgsTUFBTSxDQUFDK0gsS0FBakIsSUFBMEJBLEtBQUssQ0FBQ0MsUUFBTixPQUFxQixnQkFBL0MsS0FBb0U5RCxLQUFLLENBQUMrRCxPQUFOLElBQWlCL0QsS0FBSyxDQUFDZ0UsT0FBM0YsQ0FBSixFQUF5RztZQUNyR2xCLFNBQVMsR0FBR2pILENBQUMsQ0FBQyxXQUFELENBQWI7WUFDQXdILENBQUMsR0FBR1AsU0FBUyxDQUFDYyxLQUFWLENBQWdCMUQsTUFBaEIsQ0FBSjtZQUNBc0QsS0FBSyxHQUFJM0gsQ0FBQyxDQUFDLGtCQUFrQkEsQ0FBQyxDQUFDLFdBQUQsQ0FBRCxDQUFlK0gsS0FBZixDQUFxQjFELE1BQXJCLENBQWxCLEdBQWlELFNBQWxELENBQUQsQ0FBOERzQixLQUE5RCxHQUFzRVIsTUFBdEUsS0FBaUYsQ0FBMUY7VUFDSDs7VUFDRDs7UUFDSixLQUFLdEUsUUFBUSxDQUFDYSxLQUFkO1VBQ0l5QyxLQUFLLENBQUM2QixjQUFOOztVQUNBLElBQUk4QixZQUFKLEVBQWtCO1lBQ2RILEtBQUssR0FBSVgsV0FBVyxDQUFDekIsTUFBWixDQUFtQixTQUFTeUIsV0FBVyxDQUFDZSxLQUFaLENBQWtCdkQsS0FBbEIsQ0FBVCxHQUFvQyxTQUF2RCxFQUFrRU8sSUFBbEUsQ0FBdUUsaUJBQXZFLEVBQTBGWSxLQUExRixHQUFrR1IsTUFBbEcsS0FBNkcsQ0FBdEg7VUFDSCxDQUZELE1BRU87WUFDSCxJQUFJK0IsV0FBVyxDQUFDL0IsTUFBWixJQUFzQmdDLGlCQUFpQixDQUFDaEMsTUFBNUMsRUFBb0Q7Y0FDaEQ7Y0FDQXdDLEtBQUssR0FBSVQsV0FBVyxDQUFDM0IsTUFBWixDQUFtQixTQUFTMkIsV0FBVyxDQUFDYSxLQUFaLENBQWtCWixpQkFBbEIsQ0FBVCxHQUFnRCxTQUFuRSxFQUE4RXBDLElBQTlFLENBQW1GLGlCQUFuRixFQUFzR1ksS0FBdEcsR0FBOEdSLE1BQTlHLEtBQXlILENBQWxJO1lBQ0g7O1lBRUQsSUFBSSxDQUFDd0MsS0FBTCxFQUFZO2NBQ1JBLEtBQUssR0FBSW5ELEtBQUssQ0FBQ08sSUFBTixDQUFXLGlCQUFYLEVBQThCWSxLQUE5QixHQUFzQ1IsTUFBdEMsS0FBaUQsQ0FBMUQ7WUFDSDtVQUNKOztVQUNEOztRQUNKLEtBQUt0RSxRQUFRLENBQUNTLElBQWQ7VUFDSTZDLEtBQUssQ0FBQzZCLGNBQU47O1VBQ0EsSUFBSThCLFlBQUosRUFBa0I7WUFDZEgsS0FBSyxHQUFJWCxXQUFXLENBQUN6QixNQUFaLENBQW1CLFNBQVN5QixXQUFXLENBQUNlLEtBQVosQ0FBa0J2RCxLQUFsQixDQUFULEdBQW9DLFFBQXZELEVBQWlFTyxJQUFqRSxDQUFzRSxpQkFBdEUsRUFBeUZZLEtBQXpGLEdBQWlHUixNQUFqRyxLQUE0RyxDQUFySDtVQUNILENBRkQsTUFFTztZQUNILElBQUkrQixXQUFXLENBQUMvQixNQUFaLElBQXNCZ0MsaUJBQWlCLENBQUNoQyxNQUE1QyxFQUFvRDtjQUNoRDtjQUNBd0MsS0FBSyxHQUFJVCxXQUFXLENBQUMzQixNQUFaLENBQW1CLFNBQVMyQixXQUFXLENBQUNhLEtBQVosQ0FBa0JaLGlCQUFsQixDQUFULEdBQWdELFFBQW5FLEVBQTZFcEMsSUFBN0UsQ0FBa0YsaUJBQWxGLEVBQXFHWSxLQUFyRyxHQUE2R1IsTUFBN0csS0FBd0gsQ0FBakk7WUFDSDs7WUFFRCxJQUFJLENBQUN3QyxLQUFMLEVBQVk7Y0FDUkEsS0FBSyxHQUFJbkQsS0FBSyxDQUFDTyxJQUFOLENBQVcsaUJBQVgsRUFBOEJZLEtBQTlCLEdBQXNDUixNQUF0QyxLQUFpRCxDQUExRDtZQUNIO1VBQ0o7O1VBQ0Q7O1FBQ0osS0FBS3RFLFFBQVEsQ0FBQ2UsR0FBZDtVQUNJNEYsQ0FBQyxHQUFHUCxTQUFTLENBQUNjLEtBQVYsQ0FBZ0IxRCxNQUFoQixDQUFKOztVQUNBLElBQUlGLEtBQUssQ0FBQ2tFLFFBQU4sSUFBa0JQLFlBQWxCLElBQWtDekQsTUFBTSxDQUFDSyxRQUFQLENBQWdCeEMsUUFBUSxDQUFDdEIsU0FBekIsQ0FBdEMsRUFBMkU7WUFDdkV1QyxZQUFZLENBQUN5QixJQUFiLENBQWtCTixJQUFsQixFQUF3QkgsS0FBeEIsRUFBK0IsSUFBL0I7O1lBQ0FpRCxJQUFJLEdBQUdKLFdBQVcsQ0FBQ3pCLE1BQVosQ0FBbUIsU0FBU3lCLFdBQVcsQ0FBQ2UsS0FBWixDQUFrQnZELEtBQWxCLENBQVQsR0FBb0MsUUFBdkQsQ0FBUDs7WUFDQSxJQUFJNEMsSUFBSSxDQUFDZ0IsUUFBTCxDQUFjLE1BQU1sRyxRQUFRLENBQUMxQixVQUE3QixFQUF5QzJFLE1BQTdDLEVBQXFEO2NBQ2pEd0MsS0FBSyxHQUFHUCxJQUFJLENBQUNnQixRQUFMLEdBQ0hwRSxJQURHLENBQ0UsZUFERixFQUNtQixNQURuQixFQUVIOEIsUUFGRyxDQUVNNUQsUUFBUSxDQUFDdEIsU0FGZixFQUdIMkUsTUFIRyxDQUdJLE1BQU1yRCxRQUFRLENBQUMxQixVQUhuQixFQUlId0QsSUFKRyxDQUlFLGFBSkYsRUFJaUIsT0FKakIsRUFLSGUsSUFMRyxDQUtFLGdCQUxGLEVBTUhZLEtBTkcsRUFBUjtZQU9IO1VBQ0osQ0FaRCxNQVlPLElBQUl4QixLQUFLLENBQUNrRSxRQUFOLElBQWtCYixDQUFDLEdBQUcsQ0FBMUIsRUFBNkI7WUFDaENHLEtBQUssR0FBSVYsU0FBUyxDQUFDMUIsTUFBVixDQUFpQixTQUFTaUMsQ0FBVCxHQUFhLFFBQTlCLEVBQXdDN0IsS0FBeEMsR0FBZ0RSLE1BQWhELEtBQTJELENBQXBFO1VBQ0gsQ0FGTSxNQUVBLElBQUksQ0FBQ2hCLEtBQUssQ0FBQ2tFLFFBQVAsSUFBbUJiLENBQUMsR0FBR1AsU0FBUyxDQUFDOUIsTUFBVixHQUFtQixDQUE5QyxFQUFpRDtZQUNwRHdDLEtBQUssR0FBSVYsU0FBUyxDQUFDMUIsTUFBVixDQUFpQixTQUFTaUMsQ0FBVCxHQUFhLFNBQTlCLEVBQXlDN0IsS0FBekMsR0FBaURSLE1BQWpELEtBQTRELENBQXJFO1VBQ0gsQ0FGTSxNQUVBLElBQUlsRixNQUFNLENBQUMrSCxLQUFQLElBQWdCQSxLQUFLLENBQUNDLFFBQU4sT0FBcUIsZ0JBQXpDLEVBQTJEO1lBQzlEaEIsU0FBUyxHQUFHakgsQ0FBQyxDQUFDLFdBQUQsQ0FBYjtZQUNBd0gsQ0FBQyxHQUFHUCxTQUFTLENBQUNjLEtBQVYsQ0FBZ0IxRCxNQUFoQixDQUFKOztZQUNBLElBQUlGLEtBQUssQ0FBQ2tFLFFBQVYsRUFBb0I7Y0FDaEJWLEtBQUssR0FBSTNILENBQUMsQ0FBQyxrQkFBa0JBLENBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZStILEtBQWYsQ0FBcUIxRCxNQUFyQixDQUFsQixHQUFpRCxRQUFsRCxDQUFELENBQTZEc0IsS0FBN0QsR0FBcUVSLE1BQXJFLEtBQWdGLENBQXpGO1lBQ0gsQ0FGRCxNQUVPO2NBQ0h3QyxLQUFLLEdBQUkzSCxDQUFDLENBQUMsa0JBQWtCQSxDQUFDLENBQUMsV0FBRCxDQUFELENBQWUrSCxLQUFmLENBQXFCMUQsTUFBckIsQ0FBbEIsR0FBaUQsU0FBbEQsQ0FBRCxDQUE4RHNCLEtBQTlELEdBQXNFUixNQUF0RSxLQUFpRixDQUExRjtZQUNIO1VBQ0o7O1VBRUQsSUFBSXdDLEtBQUosRUFBVztZQUNQeEQsS0FBSyxDQUFDNkIsY0FBTjtVQUNIOztVQUNEOztRQUNKLEtBQUtuRixRQUFRLENBQUNjLEtBQWQ7VUFDSSxJQUFJbUcsWUFBSixFQUFrQjtZQUNkM0QsS0FBSyxDQUFDNkIsY0FBTjs7WUFDQTVDLGFBQWEsQ0FBQ3dCLElBQWQsQ0FBbUJOLElBQW5CLEVBQXlCSCxLQUF6QjtVQUNILENBSEQsTUFHTztZQUNILE9BQU8sSUFBUDtVQUNIOztVQUNEOztRQUNKLEtBQUt0RCxRQUFRLENBQUNNLEtBQWQ7VUFDSSxPQUFPLElBQVA7VUFDQTs7UUFDSjtVQUNJO1VBQ0F5RSxZQUFZLENBQUMsS0FBSzBDLGdCQUFOLENBQVo7VUFFQXhGLG1CQUFtQixJQUFJOEUsU0FBUyxLQUFLOUUsbUJBQWQsR0FBb0M4RSxTQUFwQyxHQUFnRCxFQUF2RTs7VUFFQSxJQUFJOUUsbUJBQW1CLENBQUNxQyxNQUFwQixLQUErQixDQUFuQyxFQUFzQztZQUNsQztVQUNIOztVQUVELEtBQUttRCxnQkFBTCxHQUF3QjdDLFVBQVUsQ0FBQyxZQUFZO1lBQzNDM0MsbUJBQW1CLEdBQUcsRUFBdEI7VUFDSCxDQUZpQyxFQUUvQkQsc0JBRitCLENBQWxDOztVQUlBLElBQUlpRixZQUFZLElBQUksQ0FBQ3pELE1BQU0sQ0FBQ0ssUUFBUCxDQUFnQnhDLFFBQVEsQ0FBQ3RCLFNBQXpCLENBQXJCLEVBQTBEO1lBQ3REcUcsU0FBUyxHQUFHQSxTQUFTLENBQUMxQixNQUFWLENBQWlCLFdBQVdyRCxRQUFRLENBQUMxQixVQUFwQixHQUFpQyxhQUFsRCxDQUFaO1VBQ0gsQ0FGRCxNQUVPO1lBQ0h5RyxTQUFTLEdBQUd6QyxLQUFLLENBQUNPLElBQU4sQ0FBVyxXQUFYLENBQVo7VUFDSDs7VUFFRCxJQUFJWixLQUFLLENBQUNrRSxRQUFWLEVBQW9CO1lBQ2hCcEIsU0FBUyxHQUFHakgsQ0FBQyxDQUFDaUgsU0FBUyxDQUFDc0IsR0FBVixHQUNUQyxPQURTLEVBQUQsQ0FBYjtVQUVIOztVQUVELEtBQUtoQixDQUFDLEdBQUcsQ0FBVCxFQUFZQSxDQUFDLEdBQUdQLFNBQVMsQ0FBQzlCLE1BQTFCLEVBQWtDcUMsQ0FBQyxFQUFuQyxFQUF1QztZQUNuQ0MsQ0FBQyxHQUFHUixTQUFTLENBQUN3QixFQUFWLENBQWFqQixDQUFiLENBQUo7O1lBQ0EsSUFBSUMsQ0FBQyxDQUFDekMsRUFBRixDQUFLWCxNQUFMLENBQUosRUFBa0I7Y0FDZGtELEtBQUssR0FBSXpFLG1CQUFtQixDQUFDcUMsTUFBcEIsS0FBK0IsQ0FBaEMsR0FBcUNxQyxDQUFDLEdBQUcsQ0FBekMsR0FBNkNBLENBQXJEO2NBQ0E7WUFDSDtVQUNKOztVQUVESyxLQUFLLEdBQUcsSUFBSWEsTUFBSixDQUFXLE1BQU01RixtQkFBbUIsQ0FBQzZGLE9BQXBCLENBQTRCLDZCQUE1QixFQUEyRCxNQUEzRCxDQUFqQixFQUFxRixHQUFyRixDQUFSOztVQUVBLEtBQUtuQixDQUFDLEdBQUdELEtBQVQsRUFBZ0JDLENBQUMsR0FBR1AsU0FBUyxDQUFDOUIsTUFBOUIsRUFBc0NxQyxDQUFDLEVBQXZDLEVBQTJDO1lBQ3ZDQyxDQUFDLEdBQUdSLFNBQVMsQ0FBQ3dCLEVBQVYsQ0FBYWpCLENBQWIsQ0FBSjtZQUNBRSxLQUFLLEdBQUcxSCxDQUFDLENBQUM0SSxJQUFGLENBQU9uQixDQUFDLENBQUNvQixJQUFGLEVBQVAsQ0FBUjs7WUFDQSxJQUFJaEIsS0FBSyxDQUFDaUIsSUFBTixDQUFXcEIsS0FBWCxDQUFKLEVBQXVCO2NBQ25CQyxLQUFLLEdBQUcsSUFBUjtjQUNBRixDQUFDLENBQUM5QixLQUFGO2NBQ0E7WUFDSDtVQUNKOztVQUNELElBQUksQ0FBQ2dDLEtBQUwsRUFBWTtZQUNSLEtBQUtILENBQUMsR0FBRyxDQUFULEVBQVlBLENBQUMsR0FBR0QsS0FBaEIsRUFBdUJDLENBQUMsRUFBeEIsRUFBNEI7Y0FDeEJDLENBQUMsR0FBR1IsU0FBUyxDQUFDd0IsRUFBVixDQUFhakIsQ0FBYixDQUFKO2NBQ0FFLEtBQUssR0FBRzFILENBQUMsQ0FBQzRJLElBQUYsQ0FBT25CLENBQUMsQ0FBQ29CLElBQUYsRUFBUCxDQUFSOztjQUNBLElBQUloQixLQUFLLENBQUNpQixJQUFOLENBQVdwQixLQUFYLENBQUosRUFBdUI7Z0JBQ25CRCxDQUFDLENBQUM5QixLQUFGO2dCQUNBO2NBQ0g7WUFDSjtVQUNKOztVQUNEO01BMUtKOztNQTRLQXJCLElBQUksQ0FBQzdCLFdBQUwsR0FBbUIsS0FBbkI7SUFDSCxDQTVNRDtJQThNQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUWlCLGlCQUFpQixHQUFHLDJCQUFVUyxLQUFWLEVBQWlCO01BQ2pDLElBQUluRSxDQUFDLENBQUNtRSxLQUFLLENBQUNFLE1BQVAsQ0FBRCxDQUFnQlcsRUFBaEIsQ0FBbUIsS0FBSzlDLFFBQUwsQ0FBYzFCLFVBQWpDLEtBQWdEUixDQUFDLENBQUNtRSxLQUFLLENBQUNFLE1BQVAsQ0FBRCxDQUFnQlAsT0FBaEIsQ0FBd0IsWUFBeEIsRUFBc0NxQixNQUExRixFQUFrRztRQUM5RixLQUFLM0MsWUFBTCxHQUFvQixJQUFwQjtNQUNIOztNQUNELEtBQUtGLGNBQUwsR0FBc0JtRCxVQUFVLENBQUMsWUFBWTtRQUN6Q0csWUFBWSxDQUFDLEtBQUtyRCxjQUFOLENBQVo7TUFDSCxDQUYrQixFQUU3QixDQUY2QixDQUFoQztJQUdILENBUEQ7SUFTQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7SUFDUW9CLGlCQUFpQixHQUFHLDJCQUFVUSxLQUFWLEVBQWlCO01BQ2pDeUIsWUFBWSxDQUFDLEtBQUt0RCxjQUFOLENBQVo7TUFDQXRDLENBQUMsQ0FBQ21FLEtBQUssQ0FBQ0UsTUFBUCxDQUFELENBQ0t5QixRQURMLENBQ2MsS0FBSzVELFFBQUwsQ0FBY3hCLFVBRDVCOztNQUVBeUMsWUFBWSxDQUFDeUIsSUFBYixDQUFrQixJQUFsQixFQUF3QlQsS0FBeEI7O01BQ0EsSUFBSW5FLENBQUMsQ0FBQ21FLEtBQUssQ0FBQ0UsTUFBUCxDQUFELENBQWdCVyxFQUFoQixDQUFtQixXQUFuQixDQUFKLEVBQXFDO1FBQ2pDaEYsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVcUcsRUFBVixDQUFhLDZCQUFiLEVBQTRDckcsQ0FBQyxDQUFDc0csS0FBRixDQUFRN0MsZUFBUixFQUF5QlUsS0FBSyxDQUFDRSxNQUEvQixDQUE1QztNQUNIO0lBQ0osQ0FSRDtJQVVBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztJQUNRVCxnQkFBZ0IsR0FBRywwQkFBVU8sS0FBVixFQUFpQjtNQUNoQyxJQUFJRyxJQUFJLEdBQUcsSUFBWDtNQUNBdEUsQ0FBQyxDQUFDbUUsS0FBSyxDQUFDRSxNQUFQLENBQUQsQ0FDS2lCLFdBREwsQ0FDaUJoQixJQUFJLENBQUNwQyxRQUFMLENBQWN4QixVQUQvQjtNQUdBNEQsSUFBSSxDQUFDaEMsY0FBTCxHQUFzQm1ELFVBQVUsQ0FBQyxZQUFZO1FBQ3pDdEMsWUFBWSxDQUFDeUIsSUFBYixDQUFrQk4sSUFBbEIsRUFBd0JILEtBQXhCLEVBQStCLElBQS9CO01BQ0gsQ0FGK0IsRUFFN0IsR0FGNkIsQ0FBaEM7O01BR0EsSUFBSW5FLENBQUMsQ0FBQ21FLEtBQUssQ0FBQ0UsTUFBUCxDQUFELENBQWdCVyxFQUFoQixDQUFtQixXQUFuQixDQUFKLEVBQXFDO1FBQ2pDaEYsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVMEYsR0FBVixDQUFjLDZCQUFkO01BQ0g7SUFDSixDQVhEOztJQWFBN0IsNEJBQTRCLEdBQUcsc0NBQVVPLElBQVYsRUFBZ0I7TUFDM0MsSUFBSUcsSUFBSSxHQUFHLEtBQUtBLElBQWhCOztNQUNBLElBQUlILElBQUosRUFBVTtRQUNOcEUsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVMEYsR0FBVixDQUFjLDRKQUFkO1FBRUFuQixJQUFJLENBQUNRLElBQUwsQ0FBVSxxQkFBcUIsS0FBSzdDLFFBQUwsQ0FBYzFCLFVBQTdDLEVBQXlEa0YsR0FBekQsQ0FBNkQscUNBQTdEO01BQ0gsQ0FKRCxNQUlPO1FBQ0gxRixDQUFDLENBQUMsTUFBRCxDQUFELENBQVVxRyxFQUFWLENBQWEsNEpBQWIsRUFBMktyRyxDQUFDLENBQUNzRyxLQUFGLENBQVFqRCxvQkFBUixFQUE4QixJQUE5QixDQUEzSztRQUVBO0FBQ2hCOztRQUNnQmtCLElBQUksQ0FBQ1EsSUFBTCxDQUFVLDBCQUEwQixLQUFLN0MsUUFBTCxDQUFjMUIsVUFBbEQsRUFBOEQ2RixFQUE5RCxDQUFpRSxxQ0FBakUsRUFBd0dyRyxDQUFDLENBQUNzRyxLQUFGLENBQVFoRCx1QkFBUixFQUFpQyxJQUFqQyxDQUF4RztNQUNIO0lBQ0osQ0FiRDtJQWVBOzs7SUFDQSxPQUFPO01BQ0h5RCxXQUFXLEVBQUVoRixrQkFEVjs7TUFHSDtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDWVcsSUFBSSxFQUFFLGdCQUFZO1FBQ2QsSUFBSVIsUUFBUSxHQUFHLEtBQUtBLFFBQXBCO1FBQUEsSUFDSTZHLEdBQUcsR0FBRy9JLENBQUMsQ0FBQyxLQUFLZ0MsT0FBTixDQURYO1FBQUEsSUFFSXVDLElBQUksR0FBR3dFLEdBQUcsQ0FBQ1gsUUFBSixDQUFhLElBQWIsRUFBbUJZLEtBQW5CLEVBRlg7UUFBQSxJQUdJaEMsV0FBVyxHQUFHekMsSUFBSSxDQUFDNkQsUUFBTCxFQUhsQjtRQUlBLEtBQUtiLEtBQUwsQ0FBV3JGLFFBQVgsRUFBcUI2RyxHQUFyQixFQUEwQnhFLElBQTFCLEVBQWdDeUMsV0FBaEM7TUFDSCxDQWZFO01BaUJITyxLQUFLLEVBQUUsZUFBU3JGLFFBQVQsRUFBbUI2RyxHQUFuQixFQUF3QnhFLElBQXhCLEVBQThCeUMsV0FBOUIsRUFBMkM7UUFDOUMsSUFBSTFDLElBQUksR0FBRyxJQUFYO1FBQ0EsSUFBTTJFLHdCQUF3QixHQUFHLGdCQUFqQztRQUNBLElBQU1DLDBCQUEwQixHQUFHLGtCQUFuQztRQUNBLEtBQUtoSCxRQUFMLEdBQWdCQSxRQUFoQjtRQUNBLEtBQUtxQyxJQUFMLEdBQVlBLElBQVo7UUFDQSxLQUFLeUMsV0FBTCxHQUFtQkEsV0FBbkI7UUFFQStCLEdBQUcsQ0FBQy9FLElBQUosQ0FBUyxNQUFULEVBQWlCLFlBQWpCO1FBQ0FPLElBQUksQ0FBQ3VCLFFBQUwsQ0FBYzVELFFBQVEsQ0FBQzVCLFNBQXZCO1FBQ0EwRyxXQUFXLENBQUNtQyxJQUFaLENBQWlCLFVBQVUzQixDQUFWLEVBQWE0QixVQUFiLEVBQXlCO1VBQ3RDLElBQUlDLGNBQUosRUFBb0JDLGVBQXBCO1VBQ0FGLFVBQVUsR0FBR3BKLENBQUMsQ0FBQ29KLFVBQUQsQ0FBZDtVQUNBQSxVQUFVLENBQUN0RCxRQUFYLENBQW9CNUQsUUFBUSxDQUFDM0IsZUFBN0I7VUFDQThJLGNBQWMsR0FBR0QsVUFBVSxDQUFDckUsSUFBWCxDQUFnQixpQkFBaEIsQ0FBakI7VUFDQXVFLGVBQWUsR0FBR0YsVUFBVSxDQUFDaEIsUUFBWCxDQUFvQixzQkFBcEIsQ0FBbEI7O1VBQ0FsRixZQUFZLENBQUMwQixJQUFiLENBQWtCTixJQUFsQixFQUF3QitFLGNBQXhCOztVQUNBLElBQUlDLGVBQWUsQ0FBQ25FLE1BQXBCLEVBQTRCO1lBQ3hCakMsWUFBWSxDQUFDMEIsSUFBYixDQUFrQk4sSUFBbEIsRUFBd0JnRixlQUF4Qjs7WUFDQSxJQUFJLENBQUNBLGVBQWUsQ0FBQzVFLFFBQWhCLENBQXlCLFNBQXpCLENBQUwsRUFBMEM7Y0FDeEM7Y0FDQSxJQUFJLEVBQUUyRSxjQUFjLENBQUMzRSxRQUFmLENBQXdCdUUsd0JBQXhCLEtBQXFESSxjQUFjLENBQUMzRSxRQUFmLENBQXdCd0UsMEJBQXhCLENBQXZELENBQUosRUFBaUg7Z0JBQy9HRyxjQUFjLENBQUNyRixJQUFmLENBQW9CO2tCQUNsQixpQkFBaUI7Z0JBREMsQ0FBcEI7Y0FHRDtZQUNGLENBVHVCLENBV3hCO1lBQ0E7WUFDQTs7O1lBQ0EsSUFBSSxDQUFDc0YsZUFBZSxDQUFDNUUsUUFBaEIsQ0FBeUIsU0FBekIsQ0FBTCxFQUEwQztjQUN4QzRFLGVBQWUsQ0FBQ3RGLElBQWhCLENBQXFCO2dCQUNqQixRQUFRLE9BRFM7Z0JBRWpCLGlCQUFpQixLQUZBO2dCQUdqQixlQUFlO2NBSEUsQ0FBckIsRUFLRzhCLFFBTEgsQ0FLWTVELFFBQVEsQ0FBQzFCLFVBTHJCO1lBTUQ7VUFDSjtRQUNKLENBOUJEO1FBZ0NBLEtBQUsrRixNQUFMLEdBQWNoQyxJQUFJLENBQUNRLElBQUwsQ0FBVSxNQUFNN0MsUUFBUSxDQUFDMUIsVUFBekIsQ0FBZDtRQUVBK0QsSUFBSSxDQUFDOEIsRUFBTCxDQUFRLDZCQUFSLEVBQXVDLGtCQUFrQm5FLFFBQVEsQ0FBQzFCLFVBQWxFLEVBQThFUixDQUFDLENBQUNzRyxLQUFGLENBQVEvQyxlQUFSLEVBQXlCLElBQXpCLENBQTlFLEVBQ0s4QyxFQURMLENBQ1EsOEJBRFIsRUFDd0Msa0JBQWtCbkUsUUFBUSxDQUFDMUIsVUFEbkUsRUFDK0VSLENBQUMsQ0FBQ3NHLEtBQUYsQ0FBUTlDLGdCQUFSLEVBQTBCLElBQTFCLENBRC9FLEVBRUs2QyxFQUZMLENBRVEsNkJBRlIsRUFFdUNyRyxDQUFDLENBQUNzRyxLQUFGLENBQVE3QyxlQUFSLEVBQXlCLElBQXpCLENBRnZDLEVBR0s0QyxFQUhMLENBR1EsK0JBSFIsRUFHeUNyRyxDQUFDLENBQUNzRyxLQUFGLENBQVEzQyxpQkFBUixFQUEyQixJQUEzQixDQUh6QyxFQUlLMEMsRUFKTCxDQUlRLDhCQUpSLEVBSXdDckcsQ0FBQyxDQUFDc0csS0FBRixDQUFRMUMsZ0JBQVIsRUFBMEIsSUFBMUIsQ0FKeEMsRUFLS3lDLEVBTEwsQ0FLUSwrQkFMUixFQUt5Q3JHLENBQUMsQ0FBQ3NHLEtBQUYsQ0FBUTVDLGlCQUFSLEVBQTJCLElBQTNCLENBTHpDOztRQU9BLElBQUlYLE9BQUosRUFBYTtVQUNUd0IsSUFBSSxDQUFDOEIsRUFBTCxDQUFRLGdDQUFSLEVBQTJDckcsQ0FBQyxDQUFDc0csS0FBRixDQUFRbEQsYUFBUixFQUF1QixJQUF2QixDQUEzQztRQUNIOztRQUVEbUIsSUFBSSxDQUFDUSxJQUFMLENBQVUsSUFBVixFQUFnQmYsSUFBaEIsQ0FBcUIsTUFBckIsRUFBNkIsV0FBN0I7O1FBRUEsSUFBSWhFLENBQUMsQ0FBQ0UsUUFBUSxDQUFDbUYsYUFBVixDQUFELENBQTBCdkIsT0FBMUIsQ0FBa0NTLElBQWxDLEVBQXdDWSxNQUE1QyxFQUFvRDtVQUNsRG5GLENBQUMsQ0FBQ0UsUUFBUSxDQUFDbUYsYUFBVixDQUFELENBQTBCa0UsT0FBMUIsQ0FBa0MsNkJBQWxDO1FBQ0Q7TUFDSixDQTdFRTs7TUErRUg7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDWUMsV0FBVyxFQUFFLHVCQUFZO1FBQ3JCLE9BQU8sS0FBS3BILFNBQVo7TUFDSCxDQXhGRTs7TUEwRkg7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNZcUgsU0FBUyxFQUFFLG1CQUFVQyxHQUFWLEVBQWU7UUFDdEIsT0FBTyxLQUFLeEgsUUFBTCxDQUFjd0gsR0FBZCxDQUFQO01BQ0gsQ0FwR0U7O01Bc0dIO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ1lDLGFBQWEsRUFBRSx5QkFBWTtRQUN2QixPQUFPLEtBQUt6SCxRQUFaO01BQ0gsQ0EvR0U7O01BaUhIO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNZMEgsU0FBUyxFQUFFLG1CQUFVRixHQUFWLEVBQWVHLEtBQWYsRUFBc0JDLFlBQXRCLEVBQW9DO1FBQzNDLEtBQUs1SCxRQUFMLENBQWN3SCxHQUFkLElBQXFCRyxLQUFyQjs7UUFDQSxJQUFJQyxZQUFKLEVBQWtCO1VBQ2QsS0FBS3BILElBQUw7UUFDSDtNQUNKO0lBL0hFLENBQVA7RUFpSUgsQ0EzcEIrQixFQUFoQzs7RUE4cEJBMUMsQ0FBQyxDQUFDK0osRUFBRixDQUFLNUosVUFBTCxJQUFtQixVQUFVOEIsT0FBVixFQUFtQjtJQUNsQyxPQUFPLEtBQUtrSCxJQUFMLENBQVUsWUFBWTtNQUN6QixJQUFJLENBQUNuSixDQUFDLENBQUMrRCxJQUFGLENBQU8sSUFBUCxFQUFhLFlBQVk1RCxVQUF6QixDQUFMLEVBQTJDO1FBQ3ZDSCxDQUFDLENBQUMrRCxJQUFGLENBQU8sSUFBUCxFQUFhLFlBQVk1RCxVQUF6QixFQUFxQyxJQUFJSCxDQUFDLENBQUMrSixFQUFGLENBQUs1SixVQUFMLEVBQWlCNEIsa0JBQXJCLENBQXdDLElBQXhDLEVBQThDRSxPQUE5QyxDQUFyQztNQUNIO0lBQ0osQ0FKTSxDQUFQO0VBS0gsQ0FORDs7RUFRQWpDLENBQUMsQ0FBQytKLEVBQUYsQ0FBSzVKLFVBQUwsRUFBaUI0QixrQkFBakIsR0FBc0NBLGtCQUF0QztFQUVBO0FBQ0o7QUFDQTs7RUFDSSxTQUFTaUksT0FBVCxDQUFpQmhJLE9BQWpCLEVBQTBCO0lBQ3RCLE9BQU9oQyxDQUFDLENBQUNpSyxJQUFGLENBQU9DLE9BQVAsQ0FBZUYsT0FBZixDQUF1QmhJLE9BQXZCLEtBQW1DLENBQUNoQyxDQUFDLENBQUNnQyxPQUFELENBQUQsQ0FBV21JLE9BQVgsR0FBcUJDLE9BQXJCLEdBQStCN0UsTUFBL0IsQ0FBc0MsWUFBWTtNQUN6RixPQUFPdkYsQ0FBQyxDQUFDcUssR0FBRixDQUFNLElBQU4sRUFBWSxZQUFaLE1BQThCLFFBQXJDO0lBQ0gsQ0FGMEMsRUFFeENsRixNQUZIO0VBR0g7RUFFRDtBQUNKO0FBQ0E7OztFQUNJLFNBQVNtRixVQUFULENBQW1CdEksT0FBbkIsRUFBNEJ1SSxnQkFBNUIsRUFBOEM7SUFDMUMsSUFBSUMsR0FBSjtJQUFBLElBQVNDLE9BQVQ7SUFBQSxJQUFrQkMsR0FBbEI7SUFBQSxJQUNJQyxRQUFRLEdBQUczSSxPQUFPLENBQUMySSxRQUFSLENBQWlCQyxXQUFqQixFQURmOztJQUVBLElBQUksV0FBV0QsUUFBZixFQUF5QjtNQUNyQkgsR0FBRyxHQUFHeEksT0FBTyxDQUFDNkksVUFBZDtNQUNBSixPQUFPLEdBQUdELEdBQUcsQ0FBQ00sSUFBZDs7TUFDQSxJQUFJLENBQUM5SSxPQUFPLENBQUMrSSxJQUFULElBQWlCLENBQUNOLE9BQWxCLElBQTZCRCxHQUFHLENBQUNHLFFBQUosQ0FBYUMsV0FBYixPQUErQixLQUFoRSxFQUF1RTtRQUNuRSxPQUFPLEtBQVA7TUFDSDs7TUFDREYsR0FBRyxHQUFHMUssQ0FBQyxDQUFDLGlCQUFpQnlLLE9BQWpCLEdBQTJCLEdBQTVCLENBQUQsQ0FBa0MsQ0FBbEMsQ0FBTjtNQUNBLE9BQU8sQ0FBQyxDQUFDQyxHQUFGLElBQVNWLE9BQU8sQ0FBQ1UsR0FBRCxDQUF2QjtJQUNIOztJQUNELE9BQU8sQ0FBQyxzQ0FBc0M1QixJQUF0QyxDQUEyQzZCLFFBQTNDLElBQXVELENBQUMzSSxPQUFPLENBQUNnSixRQUFoRSxHQUNBLFFBQVFMLFFBQVIsR0FDUTNJLE9BQU8sQ0FBQytJLElBQVIsSUFBZ0JSLGdCQUR4QixHQUVRQSxnQkFIVCxLQUlhO0lBQ0FQLE9BQU8sQ0FBQ2hJLE9BQUQsQ0FMM0I7RUFNSDs7RUFFRGhDLENBQUMsQ0FBQ21DLE1BQUYsQ0FBU25DLENBQUMsQ0FBQ2lLLElBQUYsQ0FBTyxHQUFQLENBQVQsRUFBc0I7SUFDbEJsRyxJQUFJLEVBQUUvRCxDQUFDLENBQUNpSyxJQUFGLENBQU9nQixZQUFQLEdBQXNCakwsQ0FBQyxDQUFDaUssSUFBRixDQUFPZ0IsWUFBUCxDQUFvQixVQUFVQyxRQUFWLEVBQW9CO01BQ2hFLE9BQU8sVUFBVUMsSUFBVixFQUFnQjtRQUNuQixPQUFPLENBQUMsQ0FBQ25MLENBQUMsQ0FBQytELElBQUYsQ0FBT29ILElBQVAsRUFBYUQsUUFBYixDQUFUO01BQ0gsQ0FGRDtJQUdILENBSjJCLENBQXRCLEdBSUQ7SUFDRyxVQUFVQyxJQUFWLEVBQWdCM0QsQ0FBaEIsRUFBbUI0RCxLQUFuQixFQUEwQjtNQUN0QixPQUFPLENBQUMsQ0FBQ3BMLENBQUMsQ0FBQytELElBQUYsQ0FBT29ILElBQVAsRUFBYUMsS0FBSyxDQUFDLENBQUQsQ0FBbEIsQ0FBVDtJQUNILENBUlM7SUFVbEJkLFNBQVMsRUFBRSxtQkFBVXRJLE9BQVYsRUFBbUI7TUFDMUIsT0FBT3NJLFVBQVMsQ0FBQ3RJLE9BQUQsRUFBVSxDQUFDcUosS0FBSyxDQUFDckwsQ0FBQyxDQUFDZ0UsSUFBRixDQUFPaEMsT0FBUCxFQUFnQixVQUFoQixDQUFELENBQWhCLENBQWhCO0lBQ0gsQ0FaaUI7SUFjbEJzSixRQUFRLEVBQUUsa0JBQVV0SixPQUFWLEVBQW1CO01BQ3pCLElBQUl1SixRQUFRLEdBQUd2TCxDQUFDLENBQUNnRSxJQUFGLENBQU9oQyxPQUFQLEVBQWdCLFVBQWhCLENBQWY7TUFBQSxJQUNJd0osYUFBYSxHQUFHSCxLQUFLLENBQUNFLFFBQUQsQ0FEekI7TUFFQSxPQUFPLENBQUNDLGFBQWEsSUFBSUQsUUFBUSxJQUFJLENBQTlCLEtBQW9DakIsVUFBUyxDQUFDdEksT0FBRCxFQUFVLENBQUN3SixhQUFYLENBQXBEO0lBQ0g7RUFsQmlCLENBQXRCO0FBb0JILENBOTBCQSxFQTgwQkNDLE1BOTBCRCxFQTgwQlN4TCxNQTkwQlQsRUE4MEJpQkMsUUE5MEJqQixDQUFEIn0=
//# sourceURL=webpack-internal:///115
$(document).ready(function() {
var stickyOffset = 200;
var $sticky = $('.fbtn__button');
if ($('.fbtn__button').length) {
$(window).on('scroll', function() {
var scroll = $(window).scrollTop();
if (scroll > stickyOffset) {
$sticky.addClass('fbtn__button--show');
}
if (scroll < stickyOffset) {
$sticky.removeClass('fbtn__button--show');
}
});
}
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9mZWVkYmFjay1idXR0b24vY2xpZW50bGliL3NyYy9qcy9mZWVkYmFjay1idXR0b24uanM/ODYyYyJdLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsInN0aWNreU9mZnNldCIsIiRzdGlja3kiLCJsZW5ndGgiLCJ3aW5kb3ciLCJvbiIsInNjcm9sbCIsInNjcm9sbFRvcCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFhOztBQUNiQSxDQUFDLENBQUNDLFFBQUQsQ0FBRCxDQUFZQyxLQUFaLENBQWtCLFlBQU07RUFDdEIsSUFBSUMsWUFBWSxHQUFHLEdBQW5CO0VBQ0EsSUFBSUMsT0FBTyxHQUFHSixDQUFDLENBQUMsZUFBRCxDQUFmOztFQUVBLElBQUlBLENBQUMsQ0FBQyxlQUFELENBQUQsQ0FBbUJLLE1BQXZCLEVBQStCO0lBQzdCTCxDQUFDLENBQUNNLE1BQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsUUFBYixFQUF1QixZQUFXO01BQ2hDLElBQUlDLE1BQU0sR0FBR1IsQ0FBQyxDQUFDTSxNQUFELENBQUQsQ0FBVUcsU0FBVixFQUFiOztNQUNBLElBQUlELE1BQU0sR0FBR0wsWUFBYixFQUEyQjtRQUN6QkMsT0FBTyxDQUFDTSxRQUFSLENBQWlCLG9CQUFqQjtNQUNEOztNQUNELElBQUlGLE1BQU0sR0FBR0wsWUFBYixFQUEyQjtRQUN6QkMsT0FBTyxDQUFDTyxXQUFSLENBQW9CLG9CQUFwQjtNQUNEO0lBQ0YsQ0FSRDtFQVNEO0FBQ0YsQ0FmRCIsImZpbGUiOiIzNjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBsZXQgc3RpY2t5T2Zmc2V0ID0gMjAwO1xuICBsZXQgJHN0aWNreSA9ICQoJy5mYnRuX19idXR0b24nKTtcblxuICBpZiAoJCgnLmZidG5fX2J1dHRvbicpLmxlbmd0aCkge1xuICAgICQod2luZG93KS5vbignc2Nyb2xsJywgZnVuY3Rpb24oKSB7XG4gICAgICBsZXQgc2Nyb2xsID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpO1xuICAgICAgaWYgKHNjcm9sbCA+IHN0aWNreU9mZnNldCkge1xuICAgICAgICAkc3RpY2t5LmFkZENsYXNzKCdmYnRuX19idXR0b24tLXNob3cnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzY3JvbGwgPCBzdGlja3lPZmZzZXQpIHtcbiAgICAgICAgJHN0aWNreS5yZW1vdmVDbGFzcygnZmJ0bl9fYnV0dG9uLS1zaG93Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///3645
var __WEBPACK_AMD_DEFINE_RESULT__;
/*! picturefill - v3.0.2 - 2016-02-12
* https://scottjehl.github.io/picturefill/
* Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
*/
/*! Gecko-Picture - v1.0
* https://github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture
* Firefox's early picture implementation (prior to FF41) is static and does
* not react to viewport changes. This tiny module fixes this.
*/
(function(window) {
/*jshint eqnull:true */
var ua = navigator.userAgent;
if (window.HTMLPictureElement && ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 < 45)) {
addEventListener("resize", (function() {
var timer;
var dummySrc = document.createElement("source");
var fixRespimg = function(img) {
var source, sizes;
var picture = img.parentNode;
if (picture.nodeName.toUpperCase() === "PICTURE") {
source = dummySrc.cloneNode();
picture.insertBefore(source, picture.firstElementChild);
setTimeout(function() {
picture.removeChild(source);
});
} else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) {
img._pfLastSize = img.offsetWidth;
sizes = img.sizes;
img.sizes += ",100vw";
setTimeout(function() {
img.sizes = sizes;
});
}
};
var findPictureImgs = function() {
var i;
var imgs = document.querySelectorAll("picture > img, img[srcset][sizes]");
for (i = 0; i < imgs.length; i++) {
fixRespimg(imgs[i]);
}
};
var onResize = function() {
clearTimeout(timer);
timer = setTimeout(findPictureImgs, 99);
};
var mq = window.matchMedia && matchMedia("(orientation: landscape)");
var init = function() {
onResize();
if (mq && mq.addListener) {
mq.addListener(onResize);
}
};
dummySrc.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
if (/^[c|i]|d$/.test(document.readyState || "")) {
init();
} else {
document.addEventListener("DOMContentLoaded", init);
}
return onResize;
})());
}
})(window);
/*! Picturefill - v3.0.2
* http://scottjehl.github.io/picturefill
* Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt;
* License: MIT
*/
(function(window, document, undefined) {
// Enable strict mode
"use strict";
// HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)
document.createElement("picture");
var warn, eminpx, alwaysCheckWDescriptor, evalId;
// local object for method references and testing exposure
var pf = {};
var isSupportTestReady = false;
var noop = function() {};
var image = document.createElement("img");
var getImgAttr = image.getAttribute;
var setImgAttr = image.setAttribute;
var removeImgAttr = image.removeAttribute;
var docElem = document.documentElement;
var types = {};
var cfg = {
//resource selection:
algorithm: ""
};
var srcAttr = "data-pfsrc";
var srcsetAttr = srcAttr + "set";
// ua sniffing is done for undetectable img loading features,
// to do some non crucial perf optimizations
var ua = navigator.userAgent;
var supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35);
var curSrcProp = "currentSrc";
var regWDesc = /\s+\+?\d+(e\d+)?w/;
var regSize = /(\([^)]+\))?\s*(.+)/;
var setOptions = window.picturefillCFG;
/**
* Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests )
*/
// baseStyle also used by getEmValue (i.e.: width: 1em is important)
var baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)";
var fsCss = "font-size:100%!important;";
var isVwDirty = true;
var cssCache = {};
var sizeLengthCache = {};
var DPR = window.devicePixelRatio;
var units = {
px: 1,
"in": 96
};
var anchor = document.createElement("a");
/**
* alreadyRun flag used for setOptions. is it true setOptions will reevaluate
* @type {boolean}
*/
var alreadyRun = false;
// Reusable, non-"g" Regexes
// (Don't use \s, to avoid matching non-breaking space.)
var regexLeadingSpaces = /^[ \t\n\r\u000c]+/,
regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/,
regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/,
regexTrailingCommas = /[,]+$/,
regexNonNegativeInteger = /^\d+$/,
// ( Positive or negative or unsigned integers or decimals, without or without exponents.
// Must include at least one digit.
// According to spec tests any decimal point must be followed by a digit.
// No leading plus sign is allowed.)
// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number
regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;
var on = function(obj, evt, fn, capture) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, capture || false);
} else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
};
/**
* simple memoize function:
*/
var memoize = function(fn) {
var cache = {};
return function(input) {
if (!(input in cache)) {
cache[input] = fn(input);
}
return cache[input];
};
};
// UTILITY FUNCTIONS
// Manual is faster than RegEx
// http://jsperf.com/whitespace-character/5
function isSpace(c) {
return (c === "\u0020" || // space
c === "\u0009" || // horizontal tab
c === "\u000A" || // new line
c === "\u000C" || // form feed
c === "\u000D"); // carriage return
}
/**
* gets a mediaquery and returns a boolean or gets a css length and returns a number
* @param css mediaqueries or css length
* @returns {boolean|number}
*
* based on: https://gist.github.com/jonathantneal/db4f77009b155f083738
*/
var evalCSS = (function() {
var regLength = /^([\d\.]+)(em|vw|px)$/;
var replace = function() {
var args = arguments,
index = 0,
string = args[0];
while (++index in args) {
string = string.replace(args[index], args[++index]);
}
return string;
};
var buildStr = memoize(function(css) {
return "return " + replace((css || "").toLowerCase(),
// interpret `and`
/\band\b/g, "&&",
// interpret `,`
/,/g, "||",
// interpret `min-` as >=
/min-([a-z-\s]+):/g, "e.$1>=",
// interpret `max-` as <=
/max-([a-z-\s]+):/g, "e.$1<=",
//calc value
/calc([^)]+)/g, "($1)",
// interpret css values
/(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)",
//make eval less evil
/^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig, ""
) + ";";
});
return function(css, length) {
var parsedLength;
if (!(css in cssCache)) {
cssCache[css] = false;
if (length && (parsedLength = css.match(regLength))) {
cssCache[css] = parsedLength[1] * units[parsedLength[2]];
} else {
/*jshint evil:true */
try {
cssCache[css] = new Function("e", buildStr(css))(units);
} catch (e) {}
/*jshint evil:false */
}
}
return cssCache[css];
};
})();
var setResolution = function(candidate, sizesattr) {
if (candidate.w) { // h = means height: || descriptor.type === 'h' do not handle yet...
candidate.cWidth = pf.calcListLength(sizesattr || "100vw");
candidate.res = candidate.w / candidate.cWidth;
} else {
candidate.res = candidate.d;
}
return candidate;
};
/**
*
* @param opt
*/
var picturefill = function(opt) {
if (!isSupportTestReady) {
return;
}
var elements, i, plen;
var options = opt || {};
if (options.elements && options.elements.nodeType === 1) {
if (options.elements.nodeName.toUpperCase() === "IMG") {
options.elements = [options.elements];
} else {
options.context = options.elements;
options.elements = null;
}
}
elements = options.elements || pf.qsa((options.context || document), (options.reevaluate || options.reselect) ? pf.sel : pf.selShort);
if ((plen = elements.length)) {
pf.setupRun(options);
alreadyRun = true;
// Loop through all elements
for (i = 0; i < plen; i++) {
pf.fillImg(elements[i], options);
}
pf.teardownRun(options);
}
};
/**
* outputs a warning for the developer
* @param {message}
* @type {Function}
*/
warn = (window.console && console.warn) ?
function(message) {
console.warn(message);
} :
noop;
if (!(curSrcProp in image)) {
curSrcProp = "src";
}
// Add support for standard mime types.
types["image/jpeg"] = true;
types["image/gif"] = true;
types["image/png"] = true;
function detectTypeSupport(type, typeUri) {
// based on Modernizr's lossless img-webp test
// note: asynchronous
var image = new window.Image();
image.onerror = function() {
types[type] = false;
picturefill();
};
image.onload = function() {
types[type] = image.width === 1;
picturefill();
};
image.src = typeUri;
return "pending";
}
// test svg support
types["image/svg+xml"] = document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
/**
* updates the internal vW property with the current viewport width in px
*/
function updateMetrics() {
isVwDirty = false;
DPR = window.devicePixelRatio;
cssCache = {};
sizeLengthCache = {};
pf.DPR = DPR || 1;
units.width = Math.max(window.innerWidth || 0, docElem.clientWidth);
units.height = Math.max(window.innerHeight || 0, docElem.clientHeight);
units.vw = units.width / 100;
units.vh = units.height / 100;
evalId = [units.height, units.width, DPR].join("-");
units.em = pf.getEmValue();
units.rem = units.em;
}
function chooseLowRes(lowerValue, higherValue, dprValue, isCached) {
var bonusFactor, tooMuch, bonus, meanDensity;
//experimental
if (cfg.algorithm === "saveData") {
if (lowerValue > 2.7) {
meanDensity = dprValue + 1;
} else {
tooMuch = higherValue - dprValue;
bonusFactor = Math.pow(lowerValue - 0.6, 1.5);
bonus = tooMuch * bonusFactor;
if (isCached) {
bonus += 0.1 * bonusFactor;
}
meanDensity = lowerValue + bonus;
}
} else {
meanDensity = (dprValue > 1) ?
Math.sqrt(lowerValue * higherValue) :
lowerValue;
}
return meanDensity > dprValue;
}
function applyBestCandidate(img) {
var srcSetCandidates;
var matchingSet = pf.getSet(img);
var evaluated = false;
if (matchingSet !== "pending") {
evaluated = evalId;
if (matchingSet) {
srcSetCandidates = pf.setRes(matchingSet);
pf.applySetCandidate(srcSetCandidates, img);
}
}
img[pf.ns].evaled = evaluated;
}
function ascendingSort(a, b) {
return a.res - b.res;
}
function setSrcToCur(img, src, set) {
var candidate;
if (!set && src) {
set = img[pf.ns].sets;
set = set && set[set.length - 1];
}
candidate = getCandidateForSrc(src, set);
if (candidate) {
src = pf.makeUrl(src);
img[pf.ns].curSrc = src;
img[pf.ns].curCan = candidate;
if (!candidate.res) {
setResolution(candidate, candidate.set.sizes);
}
}
return candidate;
}
function getCandidateForSrc(src, set) {
var i, candidate, candidates;
if (src && set) {
candidates = pf.parseSet(set);
src = pf.makeUrl(src);
for (i = 0; i < candidates.length; i++) {
if (src === pf.makeUrl(candidates[i].url)) {
candidate = candidates[i];
break;
}
}
}
return candidate;
}
function getAllSourceElements(picture, candidates) {
var i, len, source, srcset;
// SPEC mismatch intended for size and perf:
// actually only source elements preceding the img should be used
// also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector
var sources = picture.getElementsByTagName("source");
for (i = 0, len = sources.length; i < len; i++) {
source = sources[i];
source[pf.ns] = true;
srcset = source.getAttribute("srcset");
// if source does not have a srcset attribute, skip
if (srcset) {
candidates.push({
srcset: srcset,
media: source.getAttribute("media"),
type: source.getAttribute("type"),
sizes: source.getAttribute("sizes")
});
}
}
}
/**
* Srcset Parser
* By Alex Bell | MIT License
*
* @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...]
*
* Based super duper closely on the reference algorithm at:
* https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute
*/
// 1. Let input be the value passed to this algorithm.
// (TO-DO : Explain what "set" argument is here. Maybe choose a more
// descriptive & more searchable name. Since passing the "set" in really has
// nothing to do with parsing proper, I would prefer this assignment eventually
// go in an external fn.)
function parseSrcset(input, set) {
function collectCharacters(regEx) {
var chars,
match = regEx.exec(input.substring(pos));
if (match) {
chars = match[0];
pos += chars.length;
return chars;
}
}
var inputLength = input.length,
url,
descriptors,
currentDescriptor,
state,
c,
// 2. Let position be a pointer into input, initially pointing at the start
// of the string.
pos = 0,
// 3. Let candidates be an initially empty source set.
candidates = [];
/**
* Adds descriptor properties to a candidate, pushes to the candidates array
* @return undefined
*/
// (Declared outside of the while loop so that it's only created once.
// (This fn is defined before it is used, in order to pass JSHINT.
// Unfortunately this breaks the sequencing of the spec comments. :/ )
function parseDescriptors() {
// 9. Descriptor parser: Let error be no.
var pError = false,
// 10. Let width be absent.
// 11. Let density be absent.
// 12. Let future-compat-h be absent. (We're implementing it now as h)
w, d, h, i,
candidate = {},
desc, lastChar, value, intVal, floatVal;
// 13. For each descriptor in descriptors, run the appropriate set of steps
// from the following list:
for (i = 0; i < descriptors.length; i++) {
desc = descriptors[i];
lastChar = desc[desc.length - 1];
value = desc.substring(0, desc.length - 1);
intVal = parseInt(value, 10);
floatVal = parseFloat(value);
// If the descriptor consists of a valid non-negative integer followed by
// a U+0077 LATIN SMALL LETTER W character
if (regexNonNegativeInteger.test(value) && (lastChar === "w")) {
// If width and density are not both absent, then let error be yes.
if (w || d) {
pError = true;
}
// Apply the rules for parsing non-negative integers to the descriptor.
// If the result is zero, let error be yes.
// Otherwise, let width be the result.
if (intVal === 0) {
pError = true;
} else {
w = intVal;
}
// If the descriptor consists of a valid floating-point number followed by
// a U+0078 LATIN SMALL LETTER X character
} else if (regexFloatingPoint.test(value) && (lastChar === "x")) {
// If width, density and future-compat-h are not all absent, then let error
// be yes.
if (w || d || h) {
pError = true;
}
// Apply the rules for parsing floating-point number values to the descriptor.
// If the result is less than zero, let error be yes. Otherwise, let density
// be the result.
if (floatVal < 0) {
pError = true;
} else {
d = floatVal;
}
// If the descriptor consists of a valid non-negative integer followed by
// a U+0068 LATIN SMALL LETTER H character
} else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) {
// If height and density are not both absent, then let error be yes.
if (h || d) {
pError = true;
}
// Apply the rules for parsing non-negative integers to the descriptor.
// If the result is zero, let error be yes. Otherwise, let future-compat-h
// be the result.
if (intVal === 0) {
pError = true;
} else {
h = intVal;
}
// Anything else, Let error be yes.
} else {
pError = true;
}
} // (close step 13 for loop)
// 15. If error is still no, then append a new image source to candidates whose
// URL is url, associated with a width width if not absent and a pixel
// density density if not absent. Otherwise, there is a parse error.
if (!pError) {
candidate.url = url;
if (w) {
candidate.w = w;
}
if (d) {
candidate.d = d;
}
if (h) {
candidate.h = h;
}
if (!h && !d && !w) {
candidate.d = 1;
}
if (candidate.d === 1) {
set.has1x = true;
}
candidate.set = set;
candidates.push(candidate);
}
} // (close parseDescriptors fn)
/**
* Tokenizes descriptor properties prior to parsing
* Returns undefined.
* (Again, this fn is defined before it is used, in order to pass JSHINT.
* Unfortunately this breaks the logical sequencing of the spec comments. :/ )
*/
function tokenize() {
// 8.1. Descriptor tokeniser: Skip whitespace
collectCharacters(regexLeadingSpaces);
// 8.2. Let current descriptor be the empty string.
currentDescriptor = "";
// 8.3. Let state be in descriptor.
state = "in descriptor";
while (true) {
// 8.4. Let c be the character at position.
c = input.charAt(pos);
// Do the following depending on the value of state.
// For the purpose of this step, "EOF" is a special character representing
// that position is past the end of input.
// In descriptor
if (state === "in descriptor") {
// Do the following, depending on the value of c:
// Space character
// If current descriptor is not empty, append current descriptor to
// descriptors and let current descriptor be the empty string.
// Set state to after descriptor.
if (isSpace(c)) {
if (currentDescriptor) {
descriptors.push(currentDescriptor);
currentDescriptor = "";
state = "after descriptor";
}
// U+002C COMMA (,)
// Advance position to the next character in input. If current descriptor
// is not empty, append current descriptor to descriptors. Jump to the step
// labeled descriptor parser.
} else if (c === ",") {
pos += 1;
if (currentDescriptor) {
descriptors.push(currentDescriptor);
}
parseDescriptors();
return;
// U+0028 LEFT PARENTHESIS (()
// Append c to current descriptor. Set state to in parens.
} else if (c === "\u0028") {
currentDescriptor = currentDescriptor + c;
state = "in parens";
// EOF
// If current descriptor is not empty, append current descriptor to
// descriptors. Jump to the step labeled descriptor parser.
} else if (c === "") {
if (currentDescriptor) {
descriptors.push(currentDescriptor);
}
parseDescriptors();
return;
// Anything else
// Append c to current descriptor.
} else {
currentDescriptor = currentDescriptor + c;
}
// (end "in descriptor"
// In parens
} else if (state === "in parens") {
// U+0029 RIGHT PARENTHESIS ())
// Append c to current descriptor. Set state to in descriptor.
if (c === ")") {
currentDescriptor = currentDescriptor + c;
state = "in descriptor";
// EOF
// Append current descriptor to descriptors. Jump to the step labeled
// descriptor parser.
} else if (c === "") {
descriptors.push(currentDescriptor);
parseDescriptors();
return;
// Anything else
// Append c to current descriptor.
} else {
currentDescriptor = currentDescriptor + c;
}
// After descriptor
} else if (state === "after descriptor") {
// Do the following, depending on the value of c:
// Space character: Stay in this state.
if (isSpace(c)) {
// EOF: Jump to the step labeled descriptor parser.
} else if (c === "") {
parseDescriptors();
return;
// Anything else
// Set state to in descriptor. Set position to the previous character in input.
} else {
state = "in descriptor";
pos -= 1;
}
}
// Advance position to the next character in input.
pos += 1;
// Repeat this step.
} // (close while true loop)
}
// 4. Splitting loop: Collect a sequence of characters that are space
// characters or U+002C COMMA characters. If any U+002C COMMA characters
// were collected, that is a parse error.
while (true) {
collectCharacters(regexLeadingCommasOrSpaces);
// 5. If position is past the end of input, return candidates and abort these steps.
if (pos >= inputLength) {
return candidates; // (we're done, this is the sole return path)
}
// 6. Collect a sequence of characters that are not space characters,
// and let that be url.
url = collectCharacters(regexLeadingNotSpaces);
// 7. Let descriptors be a new empty list.
descriptors = [];
// 8. If url ends with a U+002C COMMA character (,), follow these substeps:
// (1). Remove all trailing U+002C COMMA characters from url. If this removed
// more than one character, that is a parse error.
if (url.slice(-1) === ",") {
url = url.replace(regexTrailingCommas, "");
// (Jump ahead to step 9 to skip tokenization and just push the candidate).
parseDescriptors();
// Otherwise, follow these substeps:
} else {
tokenize();
} // (close else of step 8)
// 16. Return to the step labeled splitting loop.
} // (Close of big while loop.)
}
/*
* Sizes Parser
*
* By Alex Bell | MIT License
*
* Non-strict but accurate and lightweight JS Parser for the string value <img sizes="here">
*
* Reference algorithm at:
* https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute
*
* Most comments are copied in directly from the spec
* (except for comments in parens).
*
* Grammar is:
* <source-size-list> = <source-size># [ , <source-size-value> ]? | <source-size-value>
* <source-size> = <media-condition> <source-size-value>
* <source-size-value> = <length>
* http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes
*
* E.g. "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw"
* or "(min-width: 30em), calc(30vw - 15px)" or just "30vw"
*
* Returns the first valid <css-length> with a media condition that evaluates to true,
* or "100vw" if all valid media conditions evaluate to false.
*
*/
function parseSizes(strValue) {
// (Percentage CSS lengths are not allowed in this case, to avoid confusion:
// https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list
// CSS allows a single optional plus or minus sign:
// http://www.w3.org/TR/CSS2/syndata.html#numbers
// CSS is ASCII case-insensitive:
// http://www.w3.org/TR/CSS2/syndata.html#characters )
// Spec allows exponential notation for <number> type:
// http://dev.w3.org/csswg/css-values/#numbers
var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i;
// (This is a quick and lenient test. Because of optional unlimited-depth internal
// grouping parens and strict spacing rules, this could get very complicated.)
var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;
var i;
var unparsedSizesList;
var unparsedSizesListLength;
var unparsedSize;
var lastComponentValue;
var size;
// UTILITY FUNCTIONS
// (Toy CSS parser. The goals here are:
// 1) expansive test coverage without the weight of a full CSS parser.
// 2) Avoiding regex wherever convenient.
// Quick tests: http://jsfiddle.net/gtntL4gr/3/
// Returns an array of arrays.)
function parseComponentValues(str) {
var chrctr;
var component = "";
var componentArray = [];
var listArray = [];
var parenDepth = 0;
var pos = 0;
var inComment = false;
function pushComponent() {
if (component) {
componentArray.push(component);
component = "";
}
}
function pushComponentArray() {
if (componentArray[0]) {
listArray.push(componentArray);
componentArray = [];
}
}
// (Loop forwards from the beginning of the string.)
while (true) {
chrctr = str.charAt(pos);
if (chrctr === "") { // ( End of string reached.)
pushComponent();
pushComponentArray();
return listArray;
} else if (inComment) {
if ((chrctr === "*") && (str[pos + 1] === "/")) { // (At end of a comment.)
inComment = false;
pos += 2;
pushComponent();
continue;
} else {
pos += 1; // (Skip all characters inside comments.)
continue;
}
} else if (isSpace(chrctr)) {
// (If previous character in loop was also a space, or if
// at the beginning of the string, do not add space char to
// component.)
if ((str.charAt(pos - 1) && isSpace(str.charAt(pos - 1))) || !component) {
pos += 1;
continue;
} else if (parenDepth === 0) {
pushComponent();
pos += 1;
continue;
} else {
// (Replace any space character with a plain space for legibility.)
chrctr = " ";
}
} else if (chrctr === "(") {
parenDepth += 1;
} else if (chrctr === ")") {
parenDepth -= 1;
} else if (chrctr === ",") {
pushComponent();
pushComponentArray();
pos += 1;
continue;
} else if ((chrctr === "/") && (str.charAt(pos + 1) === "*")) {
inComment = true;
pos += 2;
continue;
}
component = component + chrctr;
pos += 1;
}
}
function isValidNonNegativeSourceSizeValue(s) {
if (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) {
return true;
}
if (regexCssCalc.test(s)) {
return true;
}
// ( http://www.w3.org/TR/CSS2/syndata.html#numbers says:
// "-0 is equivalent to 0 and is not a negative number." which means that
// unitless zero and unitless negative zero must be accepted as special cases.)
if ((s === "0") || (s === "-0") || (s === "+0")) {
return true;
}
return false;
}
// When asked to parse a sizes attribute from an element, parse a
// comma-separated list of component values from the value of the element's
// sizes attribute (or the empty string, if the attribute is absent), and let
// unparsed sizes list be the result.
// http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values
unparsedSizesList = parseComponentValues(strValue);
unparsedSizesListLength = unparsedSizesList.length;
// For each unparsed size in unparsed sizes list:
for (i = 0; i < unparsedSizesListLength; i++) {
unparsedSize = unparsedSizesList[i];
// 1. Remove all consecutive <whitespace-token>s from the end of unparsed size.
// ( parseComponentValues() already omits spaces outside of parens. )
// If unparsed size is now empty, that is a parse error; continue to the next
// iteration of this algorithm.
// ( parseComponentValues() won't push an empty array. )
// 2. If the last component value in unparsed size is a valid non-negative
// <source-size-value>, let size be its value and remove the component value
// from unparsed size. Any CSS function other than the calc() function is
// invalid. Otherwise, there is a parse error; continue to the next iteration
// of this algorithm.
// http://dev.w3.org/csswg/css-syntax/#parse-component-value
lastComponentValue = unparsedSize[unparsedSize.length - 1];
if (isValidNonNegativeSourceSizeValue(lastComponentValue)) {
size = lastComponentValue;
unparsedSize.pop();
} else {
continue;
}
// 3. Remove all consecutive <whitespace-token>s from the end of unparsed
// size. If unparsed size is now empty, return size and exit this algorithm.
// If this was not the last item in unparsed sizes list, that is a parse error.
if (unparsedSize.length === 0) {
return size;
}
// 4. Parse the remaining component values in unparsed size as a
// <media-condition>. If it does not parse correctly, or it does parse
// correctly but the <media-condition> evaluates to false, continue to the
// next iteration of this algorithm.
// (Parsing all possible compound media conditions in JS is heavy, complicated,
// and the payoff is unclear. Is there ever an situation where the
// media condition parses incorrectly but still somehow evaluates to true?
// Can we just rely on the browser/polyfill to do it?)
unparsedSize = unparsedSize.join(" ");
if (!(pf.matchesMedia(unparsedSize))) {
continue;
}
// 5. Return size and exit this algorithm.
return size;
}
// If the above algorithm exhausts unparsed sizes list without returning a
// size value, return 100vw.
return "100vw";
}
// namespace
pf.ns = ("pf" + new Date().getTime()).substr(0, 9);
// srcset support test
pf.supSrcset = "srcset" in image;
pf.supSizes = "sizes" in image;
pf.supPicture = !!window.HTMLPictureElement;
// UC browser does claim to support srcset and picture, but not sizes,
// this extended test reveals the browser does support nothing
if (pf.supSrcset && pf.supPicture && !pf.supSizes) {
(function(image2) {
image.srcset = "data:,a";
image2.src = "data:,a";
pf.supSrcset = image.complete === image2.complete;
pf.supPicture = pf.supSrcset && pf.supPicture;
})(document.createElement("img"));
}
// Safari9 has basic support for sizes, but does't expose the `sizes` idl attribute
if (pf.supSrcset && !pf.supSizes) {
(function() {
var width2 = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==";
var width1 = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
var img = document.createElement("img");
var test = function() {
var width = img.width;
if (width === 2) {
pf.supSizes = true;
}
alwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes;
isSupportTestReady = true;
// force async
setTimeout(picturefill);
};
img.onload = test;
img.onerror = test;
img.setAttribute("sizes", "9px");
img.srcset = width1 + " 1w," + width2 + " 9w";
img.src = width1;
})();
} else {
isSupportTestReady = true;
}
// using pf.qsa instead of dom traversing does scale much better,
// especially on sites mixing responsive and non-responsive images
pf.selShort = "picture>img,img[srcset]";
pf.sel = pf.selShort;
pf.cfg = cfg;
/**
* Shortcut property for `devicePixelRatio` ( for easy overriding in tests )
*/
pf.DPR = (DPR || 1);
pf.u = units;
// container of supported mime types that one might need to qualify before using
pf.types = types;
pf.setSize = noop;
/**
* Gets a string and returns the absolute URL
* @param src
* @returns {String} absolute URL
*/
pf.makeUrl = memoize(function(src) {
anchor.href = src;
return anchor.href;
});
/**
* Gets a DOM element or document and a selctor and returns the found matches
* Can be extended with jQuery/Sizzle for IE7 support
* @param context
* @param sel
* @returns {NodeList|Array}
*/
pf.qsa = function(context, sel) {
return ("querySelector" in context) ? context.querySelectorAll(sel) : [];
};
/**
* Shortcut method for matchMedia ( for easy overriding in tests )
* wether native or pf.mMQ is used will be decided lazy on first call
* @returns {boolean}
*/
pf.matchesMedia = function() {
if (window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches) {
pf.matchesMedia = function(media) {
return !media || (matchMedia(media).matches);
};
} else {
pf.matchesMedia = pf.mMQ;
}
return pf.matchesMedia.apply(this, arguments);
};
/**
* A simplified matchMedia implementation for IE8 and IE9
* handles only min-width/max-width with px or em values
* @param media
* @returns {boolean}
*/
pf.mMQ = function(media) {
return media ? evalCSS(media) : true;
};
/**
* Returns the calculated length in css pixel from the given sourceSizeValue
* http://dev.w3.org/csswg/css-values-3/#length-value
* intended Spec mismatches:
* * Does not check for invalid use of CSS functions
* * Does handle a computed length of 0 the same as a negative and therefore invalid value
* @param sourceSizeValue
* @returns {Number}
*/
pf.calcLength = function(sourceSizeValue) {
var value = evalCSS(sourceSizeValue, true) || false;
if (value < 0) {
value = false;
}
return value;
};
/**
* Takes a type string and checks if its supported
*/
pf.supportsType = function(type) {
return (type) ? types[type] : true;
};
/**
* Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length)
* @param sourceSizeStr
* @returns {*}
*/
pf.parseSize = memoize(function(sourceSizeStr) {
var match = (sourceSizeStr || "").match(regSize);
return {
media: match && match[1],
length: match && match[2]
};
});
pf.parseSet = function(set) {
if (!set.cands) {
set.cands = parseSrcset(set.srcset, set);
}
return set.cands;
};
/**
* returns 1em in css px for html/body default size
* function taken from respondjs
* @returns {*|number}
*/
pf.getEmValue = function() {
var body;
if (!eminpx && (body = document.body)) {
var div = document.createElement("div"),
originalHTMLCSS = docElem.style.cssText,
originalBodyCSS = body.style.cssText;
div.style.cssText = baseStyle;
// 1em in a media query is the value of the default font size of the browser
// reset docElem and body to ensure the correct value is returned
docElem.style.cssText = fsCss;
body.style.cssText = fsCss;
body.appendChild(div);
eminpx = div.offsetWidth;
body.removeChild(div);
//also update eminpx before returning
eminpx = parseFloat(eminpx, 10);
// restore the original values
docElem.style.cssText = originalHTMLCSS;
body.style.cssText = originalBodyCSS;
}
return eminpx || 16;
};
/**
* Takes a string of sizes and returns the width in pixels as a number
*/
pf.calcListLength = function(sourceSizeListStr) {
// Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%
//
// or (min-width:30em) calc(30% - 15px)
if (!(sourceSizeListStr in sizeLengthCache) || cfg.uT) {
var winningLength = pf.calcLength(parseSizes(sourceSizeListStr));
sizeLengthCache[sourceSizeListStr] = !winningLength ? units.width : winningLength;
}
return sizeLengthCache[sourceSizeListStr];
};
/**
* Takes a candidate object with a srcset property in the form of url/
* ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or
* "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or
* "images/pic-small.png"
* Get an array of image candidates in the form of
* {url: "/foo/bar.png", resolution: 1}
* where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value
* If sizes is specified, res is calculated
*/
pf.setRes = function(set) {
var candidates;
if (set) {
candidates = pf.parseSet(set);
for (var i = 0, len = candidates.length; i < len; i++) {
setResolution(candidates[i], set.sizes);
}
}
return candidates;
};
pf.setRes.res = setResolution;
pf.applySetCandidate = function(candidates, img) {
if (!candidates.length) {
return;
}
var candidate,
i,
j,
length,
bestCandidate,
curSrc,
curCan,
candidateSrc,
abortCurSrc;
var imageData = img[pf.ns];
var dpr = pf.DPR;
curSrc = imageData.curSrc || img[curSrcProp];
curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set);
// if we have a current source, we might either become lazy or give this source some advantage
if (curCan && curCan.set === candidates[0].set) {
// if browser can abort image request and the image has a higher pixel density than needed
// and this image isn't downloaded yet, we skip next part and try to save bandwidth
abortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr);
if (!abortCurSrc) {
curCan.cached = true;
// if current candidate is "best", "better" or "okay",
// set it to bestCandidate
if (curCan.res >= dpr) {
bestCandidate = curCan;
}
}
}
if (!bestCandidate) {
candidates.sort(ascendingSort);
length = candidates.length;
bestCandidate = candidates[length - 1];
for (i = 0; i < length; i++) {
candidate = candidates[i];
if (candidate.res >= dpr) {
j = i - 1;
// we have found the perfect candidate,
// but let's improve this a little bit with some assumptions ;-)
if (candidates[j] &&
(abortCurSrc || curSrc !== pf.makeUrl(candidate.url)) &&
chooseLowRes(candidates[j].res, candidate.res, dpr, candidates[j].cached)) {
bestCandidate = candidates[j];
} else {
bestCandidate = candidate;
}
break;
}
}
}
if (bestCandidate) {
candidateSrc = pf.makeUrl(bestCandidate.url);
imageData.curSrc = candidateSrc;
imageData.curCan = bestCandidate;
if (candidateSrc !== curSrc) {
pf.setSrc(img, bestCandidate);
}
pf.setSize(img);
}
};
pf.setSrc = function(img, bestCandidate) {
var origWidth;
img.src = bestCandidate.url;
// although this is a specific Safari issue, we don't want to take too much different code paths
if (bestCandidate.set.type === "image/svg+xml") {
origWidth = img.style.width;
img.style.width = (img.offsetWidth + 1) + "px";
// next line only should trigger a repaint
// if... is only done to trick dead code removal
if (img.offsetWidth + 1) {
img.style.width = origWidth;
}
}
};
pf.getSet = function(img) {
var i, set, supportsType;
var match = false;
var sets = img[pf.ns].sets;
for (i = 0; i < sets.length && !match; i++) {
set = sets[i];
if (!set.srcset || !pf.matchesMedia(set.media) || !(supportsType = pf.supportsType(set.type))) {
continue;
}
if (supportsType === "pending") {
set = supportsType;
}
match = set;
break;
}
return match;
};
pf.parseSets = function(element, parent, options) {
var srcsetAttribute, imageSet, isWDescripor, srcsetParsed;
var hasPicture = parent && parent.nodeName.toUpperCase() === "PICTURE";
var imageData = element[pf.ns];
if (imageData.src === undefined || options.src) {
imageData.src = getImgAttr.call(element, "src");
if (imageData.src) {
setImgAttr.call(element, srcAttr, imageData.src);
} else {
removeImgAttr.call(element, srcAttr);
}
}
if (imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset) {
srcsetAttribute = getImgAttr.call(element, "srcset");
imageData.srcset = srcsetAttribute;
srcsetParsed = true;
}
imageData.sets = [];
if (hasPicture) {
imageData.pic = true;
getAllSourceElements(parent, imageData.sets);
}
if (imageData.srcset) {
imageSet = {
srcset: imageData.srcset,
sizes: getImgAttr.call(element, "sizes")
};
imageData.sets.push(imageSet);
isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || "");
// add normal src as candidate, if source has no w descriptor
if (!isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x) {
imageSet.srcset += ", " + imageData.src;
imageSet.cands.push({
url: imageData.src,
d: 1,
set: imageSet
});
}
} else if (imageData.src) {
imageData.sets.push({
srcset: imageData.src,
sizes: null
});
}
imageData.curCan = null;
imageData.curSrc = undefined;
// if img has picture or the srcset was removed or has a srcset and does not support srcset at all
// or has a w descriptor (and does not support sizes) set support to false to evaluate
imageData.supported = !(hasPicture || (imageSet && !pf.supSrcset) || (isWDescripor && !pf.supSizes));
if (srcsetParsed && pf.supSrcset && !imageData.supported) {
if (srcsetAttribute) {
setImgAttr.call(element, srcsetAttr, srcsetAttribute);
element.srcset = "";
} else {
removeImgAttr.call(element, srcsetAttr);
}
}
if (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) {
if (imageData.src === null) {
element.removeAttribute("src");
} else {
element.src = imageData.src;
}
}
imageData.parsed = true;
};
pf.fillImg = function(element, options) {
var imageData;
var extreme = options.reselect || options.reevaluate;
// expando for caching data on the img
if (!element[pf.ns]) {
element[pf.ns] = {};
}
imageData = element[pf.ns];
// if the element has already been evaluated, skip it
// unless `options.reevaluate` is set to true ( this, for example,
// is set to true when running `picturefill` on `resize` ).
if (!extreme && imageData.evaled === evalId) {
return;
}
if (!imageData.parsed || options.reevaluate) {
pf.parseSets(element, element.parentNode, options);
}
if (!imageData.supported) {
applyBestCandidate(element);
} else {
imageData.evaled = evalId;
}
};
pf.setupRun = function() {
if (!alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio)) {
updateMetrics();
}
};
// If picture is supported, well, that's awesome.
if (pf.supPicture) {
picturefill = noop;
pf.fillImg = noop;
} else {
// Set up picture polyfill by polling the document
(function() {
var isDomReady;
var regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/;
var run = function() {
var readyState = document.readyState || "";
timerId = setTimeout(run, readyState === "loading" ? 200 : 999);
if (document.body) {
pf.fillImgs();
isDomReady = isDomReady || regReady.test(readyState);
if (isDomReady) {
clearTimeout(timerId);
}
}
};
var timerId = setTimeout(run, document.body ? 9 : 99);
// Also attach picturefill on resize and readystatechange
// http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html
var debounce = function(func, wait) {
var timeout, timestamp;
var later = function() {
var last = (new Date()) - timestamp;
if (last < wait) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
func();
}
};
return function() {
timestamp = new Date();
if (!timeout) {
timeout = setTimeout(later, wait);
}
};
};
var lastClientWidth = docElem.clientHeight;
var onResize = function() {
isVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth;
lastClientWidth = docElem.clientHeight;
if (isVwDirty) {
pf.fillImgs();
}
};
on(window, "resize", debounce(onResize, 99));
on(document, "readystatechange", run);
})();
}
pf.picturefill = picturefill;
//use this internally for easy monkey patching/performance testing
pf.fillImgs = picturefill;
pf.teardownRun = noop;
/* expose methods for testing */
picturefill._ = pf;
window.picturefillCFG = {
pf: pf,
push: function(args) {
var name = args.shift();
if (typeof pf[name] === "function") {
pf[name].apply(pf, args);
} else {
cfg[name] = args[0];
if (alreadyRun) {
pf.fillImgs({
reselect: true
});
}
}
}
};
while (setOptions && setOptions.length) {
window.picturefillCFG.push(setOptions.shift());
}
/* expose picturefill */
window.picturefill = picturefill;
/* expose picturefill */
if (true && typeof module.exports === "object") {
// CommonJS, just export
module.exports = picturefill;
} else if (true) {
// AMD support
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
return picturefill;
}).call(exports, __webpack_require__, exports, module),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
}
// IE8 evals this sync, so it must be the last thing we do
if (!pf.supPicture) {
types["image/webp"] = detectTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==");
}
})(window, document);
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvcGljdHVyZWZpbGwvZGlzdC9waWN0dXJlZmlsbC5qcz9lZWM4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLE9BQU8sa0JBQWtCLGNBQWMsVUFBVSxZQUFZLGNBQWMsVUFBVSxnQkFBZ0I7QUFDekksdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsU0FBUztBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFDQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBLGVBQWUsd0JBQXdCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWUsT0FBTzs7QUFFOUM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWUsT0FBTzs7QUFFOUM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlLE9BQU87O0FBRTlDO0FBQ0EsS0FBSyxPQUFPO0FBQ1osSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7QUFDWixZQUFZO0FBQ1osWUFBWTtBQUNaLHlCQUF5QjtBQUN6Qiw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGVBQWU7QUFDZjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUVBQWlFO0FBQ2pFLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQzs7QUFFQTtBQUNBOztBQUVBLDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNENBQTRDLFNBQVM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYywyQkFBMkI7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsbUJBQW1CLGlCQUFpQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBMEI7QUFDaEM7QUFDQTtBQUNBLEVBQUUsV0FBVyxJQUEwQztBQUN2RDtBQUNBLEVBQUUsbUNBQXVCLFlBQVksb0JBQW9CLEVBQUU7QUFBQSxrR0FBRTtBQUM3RDs7QUFFQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFOztBQUVBLENBQUMiLCJmaWxlIjoiNzIyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBwaWN0dXJlZmlsbCAtIHYzLjAuMiAtIDIwMTYtMDItMTJcbiAqIGh0dHBzOi8vc2NvdHRqZWhsLmdpdGh1Yi5pby9waWN0dXJlZmlsbC9cbiAqIENvcHlyaWdodCAoYykgMjAxNiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL3BpY3R1cmVmaWxsL2Jsb2IvbWFzdGVyL0F1dGhvcnMudHh0OyBMaWNlbnNlZCBNSVRcbiAqL1xuLyohIEdlY2tvLVBpY3R1cmUgLSB2MS4wXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL3BpY3R1cmVmaWxsL3RyZWUvMy4wL3NyYy9wbHVnaW5zL2dlY2tvLXBpY3R1cmVcbiAqIEZpcmVmb3gncyBlYXJseSBwaWN0dXJlIGltcGxlbWVudGF0aW9uIChwcmlvciB0byBGRjQxKSBpcyBzdGF0aWMgYW5kIGRvZXNcbiAqIG5vdCByZWFjdCB0byB2aWV3cG9ydCBjaGFuZ2VzLiBUaGlzIHRpbnkgbW9kdWxlIGZpeGVzIHRoaXMuXG4gKi9cbihmdW5jdGlvbih3aW5kb3cpIHtcblx0Lypqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0dmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuXHRpZiAoIHdpbmRvdy5IVE1MUGljdHVyZUVsZW1lbnQgJiYgKCgvZWNrby8pLnRlc3QodWEpICYmIHVhLm1hdGNoKC9ydlxcOihcXGQrKS8pICYmIFJlZ0V4cC4kMSA8IDQ1KSApIHtcblx0XHRhZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIChmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0aW1lcjtcblxuXHRcdFx0dmFyIGR1bW15U3JjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtcblxuXHRcdFx0dmFyIGZpeFJlc3BpbWcgPSBmdW5jdGlvbihpbWcpIHtcblx0XHRcdFx0dmFyIHNvdXJjZSwgc2l6ZXM7XG5cdFx0XHRcdHZhciBwaWN0dXJlID0gaW1nLnBhcmVudE5vZGU7XG5cblx0XHRcdFx0aWYgKHBpY3R1cmUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQSUNUVVJFXCIpIHtcblx0XHRcdFx0XHRzb3VyY2UgPSBkdW1teVNyYy5jbG9uZU5vZGUoKTtcblxuXHRcdFx0XHRcdHBpY3R1cmUuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgcGljdHVyZS5maXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHBpY3R1cmUucmVtb3ZlQ2hpbGQoc291cmNlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICghaW1nLl9wZkxhc3RTaXplIHx8IGltZy5vZmZzZXRXaWR0aCA+IGltZy5fcGZMYXN0U2l6ZSkge1xuXHRcdFx0XHRcdGltZy5fcGZMYXN0U2l6ZSA9IGltZy5vZmZzZXRXaWR0aDtcblx0XHRcdFx0XHRzaXplcyA9IGltZy5zaXplcztcblx0XHRcdFx0XHRpbWcuc2l6ZXMgKz0gXCIsMTAwdndcIjtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aW1nLnNpemVzID0gc2l6ZXM7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHZhciBmaW5kUGljdHVyZUltZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGk7XG5cdFx0XHRcdHZhciBpbWdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInBpY3R1cmUgPiBpbWcsIGltZ1tzcmNzZXRdW3NpemVzXVwiKTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGltZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRmaXhSZXNwaW1nKGltZ3NbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFyIG9uUmVzaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdHRpbWVyID0gc2V0VGltZW91dChmaW5kUGljdHVyZUltZ3MsIDk5KTtcblx0XHRcdH07XG5cdFx0XHR2YXIgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYSAmJiBtYXRjaE1lZGlhKFwiKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpXCIpO1xuXHRcdFx0dmFyIGluaXQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0b25SZXNpemUoKTtcblxuXHRcdFx0XHRpZiAobXEgJiYgbXEuYWRkTGlzdGVuZXIpIHtcblx0XHRcdFx0XHRtcS5hZGRMaXN0ZW5lcihvblJlc2l6ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGR1bW15U3JjLnNyY3NldCA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcblxuXHRcdFx0aWYgKC9eW2N8aV18ZCQvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSB8fCBcIlwiKSkge1xuXHRcdFx0XHRpbml0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9uUmVzaXplO1xuXHRcdH0pKCkpO1xuXHR9XG59KSh3aW5kb3cpO1xuXG4vKiEgUGljdHVyZWZpbGwgLSB2My4wLjJcbiAqIGh0dHA6Ly9zY290dGplaGwuZ2l0aHViLmlvL3BpY3R1cmVmaWxsXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0amVobC9waWN0dXJlZmlsbC9ibG9iL21hc3Rlci9BdXRob3JzLnR4dDtcbiAqICBMaWNlbnNlOiBNSVRcbiAqL1xuXG4oZnVuY3Rpb24oIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCApIHtcblx0Ly8gRW5hYmxlIHN0cmljdCBtb2RlXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdC8vIEhUTUwgc2hpbXx2IGl0IGZvciBvbGQgSUUgKElFOSB3aWxsIHN0aWxsIG5lZWQgdGhlIEhUTUwgdmlkZW8gdGFnIHdvcmthcm91bmQpXG5cdGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwicGljdHVyZVwiICk7XG5cblx0dmFyIHdhcm4sIGVtaW5weCwgYWx3YXlzQ2hlY2tXRGVzY3JpcHRvciwgZXZhbElkO1xuXHQvLyBsb2NhbCBvYmplY3QgZm9yIG1ldGhvZCByZWZlcmVuY2VzIGFuZCB0ZXN0aW5nIGV4cG9zdXJlXG5cdHZhciBwZiA9IHt9O1xuXHR2YXIgaXNTdXBwb3J0VGVzdFJlYWR5ID0gZmFsc2U7XG5cdHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbWdcIiApO1xuXHR2YXIgZ2V0SW1nQXR0ciA9IGltYWdlLmdldEF0dHJpYnV0ZTtcblx0dmFyIHNldEltZ0F0dHIgPSBpbWFnZS5zZXRBdHRyaWJ1dGU7XG5cdHZhciByZW1vdmVJbWdBdHRyID0gaW1hZ2UucmVtb3ZlQXR0cmlidXRlO1xuXHR2YXIgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0dmFyIHR5cGVzID0ge307XG5cdHZhciBjZmcgPSB7XG5cdFx0Ly9yZXNvdXJjZSBzZWxlY3Rpb246XG5cdFx0YWxnb3JpdGhtOiBcIlwiXG5cdH07XG5cdHZhciBzcmNBdHRyID0gXCJkYXRhLXBmc3JjXCI7XG5cdHZhciBzcmNzZXRBdHRyID0gc3JjQXR0ciArIFwic2V0XCI7XG5cdC8vIHVhIHNuaWZmaW5nIGlzIGRvbmUgZm9yIHVuZGV0ZWN0YWJsZSBpbWcgbG9hZGluZyBmZWF0dXJlcyxcblx0Ly8gdG8gZG8gc29tZSBub24gY3J1Y2lhbCBwZXJmIG9wdGltaXphdGlvbnNcblx0dmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblx0dmFyIHN1cHBvcnRBYm9ydCA9ICgvcmlkZW50LykudGVzdCh1YSkgfHwgKCgvZWNrby8pLnRlc3QodWEpICYmIHVhLm1hdGNoKC9ydlxcOihcXGQrKS8pICYmIFJlZ0V4cC4kMSA+IDM1ICk7XG5cdHZhciBjdXJTcmNQcm9wID0gXCJjdXJyZW50U3JjXCI7XG5cdHZhciByZWdXRGVzYyA9IC9cXHMrXFwrP1xcZCsoZVxcZCspP3cvO1xuXHR2YXIgcmVnU2l6ZSA9IC8oXFwoW14pXStcXCkpP1xccyooLispLztcblx0dmFyIHNldE9wdGlvbnMgPSB3aW5kb3cucGljdHVyZWZpbGxDRkc7XG5cdC8qKlxuXHQgKiBTaG9ydGN1dCBwcm9wZXJ0eSBmb3IgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy9zcGVjcy9taXhlZGNvbnRlbnQvI3Jlc3RyaWN0cy1taXhlZC1jb250ZW50ICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqL1xuXHQvLyBiYXNlU3R5bGUgYWxzbyB1c2VkIGJ5IGdldEVtVmFsdWUgKGkuZS46IHdpZHRoOiAxZW0gaXMgaW1wb3J0YW50KVxuXHR2YXIgYmFzZVN0eWxlID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dmlzaWJpbGl0eTpoaWRkZW47ZGlzcGxheTpibG9jaztwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW07b3ZlcmZsb3c6aGlkZGVuO2NsaXA6cmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXCI7XG5cdHZhciBmc0NzcyA9IFwiZm9udC1zaXplOjEwMCUhaW1wb3J0YW50O1wiO1xuXHR2YXIgaXNWd0RpcnR5ID0gdHJ1ZTtcblxuXHR2YXIgY3NzQ2FjaGUgPSB7fTtcblx0dmFyIHNpemVMZW5ndGhDYWNoZSA9IHt9O1xuXHR2YXIgRFBSID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cdHZhciB1bml0cyA9IHtcblx0XHRweDogMSxcblx0XHRcImluXCI6IDk2XG5cdH07XG5cdHZhciBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHQvKipcblx0ICogYWxyZWFkeVJ1biBmbGFnIHVzZWQgZm9yIHNldE9wdGlvbnMuIGlzIGl0IHRydWUgc2V0T3B0aW9ucyB3aWxsIHJlZXZhbHVhdGVcblx0ICogQHR5cGUge2Jvb2xlYW59XG5cdCAqL1xuXHR2YXIgYWxyZWFkeVJ1biA9IGZhbHNlO1xuXG5cdC8vIFJldXNhYmxlLCBub24tXCJnXCIgUmVnZXhlc1xuXG5cdC8vIChEb24ndCB1c2UgXFxzLCB0byBhdm9pZCBtYXRjaGluZyBub24tYnJlYWtpbmcgc3BhY2UuKVxuXHR2YXIgcmVnZXhMZWFkaW5nU3BhY2VzID0gL15bIFxcdFxcblxcclxcdTAwMGNdKy8sXG5cdCAgICByZWdleExlYWRpbmdDb21tYXNPclNwYWNlcyA9IC9eWywgXFx0XFxuXFxyXFx1MDAwY10rLyxcblx0ICAgIHJlZ2V4TGVhZGluZ05vdFNwYWNlcyA9IC9eW14gXFx0XFxuXFxyXFx1MDAwY10rLyxcblx0ICAgIHJlZ2V4VHJhaWxpbmdDb21tYXMgPSAvWyxdKyQvLFxuXHQgICAgcmVnZXhOb25OZWdhdGl2ZUludGVnZXIgPSAvXlxcZCskLyxcblxuXHQgICAgLy8gKCBQb3NpdGl2ZSBvciBuZWdhdGl2ZSBvciB1bnNpZ25lZCBpbnRlZ2VycyBvciBkZWNpbWFscywgd2l0aG91dCBvciB3aXRob3V0IGV4cG9uZW50cy5cblx0ICAgIC8vIE11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgZGlnaXQuXG5cdCAgICAvLyBBY2NvcmRpbmcgdG8gc3BlYyB0ZXN0cyBhbnkgZGVjaW1hbCBwb2ludCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGlnaXQuXG5cdCAgICAvLyBObyBsZWFkaW5nIHBsdXMgc2lnbiBpcyBhbGxvd2VkLilcblx0ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjdmFsaWQtZmxvYXRpbmctcG9pbnQtbnVtYmVyXG5cdCAgICByZWdleEZsb2F0aW5nUG9pbnQgPSAvXi0/KD86WzAtOV0rfFswLTldKlxcLlswLTldKykoPzpbZUVdWystXT9bMC05XSspPyQvO1xuXG5cdHZhciBvbiA9IGZ1bmN0aW9uKG9iaiwgZXZ0LCBmbiwgY2FwdHVyZSkge1xuXHRcdGlmICggb2JqLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRvYmouYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBjYXB0dXJlIHx8IGZhbHNlKTtcblx0XHR9IGVsc2UgaWYgKCBvYmouYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRvYmouYXR0YWNoRXZlbnQoIFwib25cIiArIGV2dCwgZm4pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogc2ltcGxlIG1lbW9pemUgZnVuY3Rpb246XG5cdCAqL1xuXG5cdHZhciBtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHR2YXIgY2FjaGUgPSB7fTtcblx0XHRyZXR1cm4gZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRcdGlmICggIShpbnB1dCBpbiBjYWNoZSkgKSB7XG5cdFx0XHRcdGNhY2hlWyBpbnB1dCBdID0gZm4oaW5wdXQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNhY2hlWyBpbnB1dCBdO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVVRJTElUWSBGVU5DVElPTlNcblxuXHQvLyBNYW51YWwgaXMgZmFzdGVyIHRoYW4gUmVnRXhcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vd2hpdGVzcGFjZS1jaGFyYWN0ZXIvNVxuXHRmdW5jdGlvbiBpc1NwYWNlKGMpIHtcblx0XHRyZXR1cm4gKGMgPT09IFwiXFx1MDAyMFwiIHx8IC8vIHNwYWNlXG5cdFx0ICAgICAgICBjID09PSBcIlxcdTAwMDlcIiB8fCAvLyBob3Jpem9udGFsIHRhYlxuXHRcdCAgICAgICAgYyA9PT0gXCJcXHUwMDBBXCIgfHwgLy8gbmV3IGxpbmVcblx0XHQgICAgICAgIGMgPT09IFwiXFx1MDAwQ1wiIHx8IC8vIGZvcm0gZmVlZFxuXHRcdCAgICAgICAgYyA9PT0gXCJcXHUwMDBEXCIpOyAgLy8gY2FycmlhZ2UgcmV0dXJuXG5cdH1cblxuXHQvKipcblx0ICogZ2V0cyBhIG1lZGlhcXVlcnkgYW5kIHJldHVybnMgYSBib29sZWFuIG9yIGdldHMgYSBjc3MgbGVuZ3RoIGFuZCByZXR1cm5zIGEgbnVtYmVyXG5cdCAqIEBwYXJhbSBjc3MgbWVkaWFxdWVyaWVzIG9yIGNzcyBsZW5ndGhcblx0ICogQHJldHVybnMge2Jvb2xlYW58bnVtYmVyfVxuXHQgKlxuXHQgKiBiYXNlZCBvbjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9kYjRmNzcwMDliMTU1ZjA4MzczOFxuXHQgKi9cblx0dmFyIGV2YWxDU1MgPSAoZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgcmVnTGVuZ3RoID0gL14oW1xcZFxcLl0rKShlbXx2d3xweCkkLztcblx0XHR2YXIgcmVwbGFjZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMsIGluZGV4ID0gMCwgc3RyaW5nID0gYXJnc1swXTtcblx0XHRcdHdoaWxlICgrK2luZGV4IGluIGFyZ3MpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoYXJnc1tpbmRleF0sIGFyZ3NbKytpbmRleF0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN0cmluZztcblx0XHR9O1xuXG5cdFx0dmFyIGJ1aWxkU3RyID0gbWVtb2l6ZShmdW5jdGlvbihjc3MpIHtcblxuXHRcdFx0cmV0dXJuIFwicmV0dXJuIFwiICsgcmVwbGFjZSgoY3NzIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdC8vIGludGVycHJldCBgYW5kYFxuXHRcdFx0XHQvXFxiYW5kXFxiL2csIFwiJiZcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgYCxgXG5cdFx0XHRcdC8sL2csIFwifHxcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgYG1pbi1gIGFzID49XG5cdFx0XHRcdC9taW4tKFthLXotXFxzXSspOi9nLCBcImUuJDE+PVwiLFxuXG5cdFx0XHRcdC8vIGludGVycHJldCBgbWF4LWAgYXMgPD1cblx0XHRcdFx0L21heC0oW2Etei1cXHNdKyk6L2csIFwiZS4kMTw9XCIsXG5cblx0XHRcdFx0Ly9jYWxjIHZhbHVlXG5cdFx0XHRcdC9jYWxjKFteKV0rKS9nLCBcIigkMSlcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgY3NzIHZhbHVlc1xuXHRcdFx0XHQvKFxcZCtbXFwuXSpbXFxkXSopKFthLXpdKykvZywgXCIoJDEgKiBlLiQyKVwiLFxuXHRcdFx0XHQvL21ha2UgZXZhbCBsZXNzIGV2aWxcblx0XHRcdFx0L14oPyEoZS5bYS16XXxbMC05XFwuJj18PjxcXCtcXC1cXCpcXChcXClcXC9dKSkuKi9pZywgXCJcIlxuXHRcdFx0KSArIFwiO1wiO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGNzcywgbGVuZ3RoKSB7XG5cdFx0XHR2YXIgcGFyc2VkTGVuZ3RoO1xuXHRcdFx0aWYgKCEoY3NzIGluIGNzc0NhY2hlKSkge1xuXHRcdFx0XHRjc3NDYWNoZVtjc3NdID0gZmFsc2U7XG5cdFx0XHRcdGlmIChsZW5ndGggJiYgKHBhcnNlZExlbmd0aCA9IGNzcy5tYXRjaCggcmVnTGVuZ3RoICkpKSB7XG5cdFx0XHRcdFx0Y3NzQ2FjaGVbY3NzXSA9IHBhcnNlZExlbmd0aFsgMSBdICogdW5pdHNbcGFyc2VkTGVuZ3RoWyAyIF1dO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qanNoaW50IGV2aWw6dHJ1ZSAqL1xuXHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdGNzc0NhY2hlW2Nzc10gPSBuZXcgRnVuY3Rpb24oXCJlXCIsIGJ1aWxkU3RyKGNzcykpKHVuaXRzKTtcblx0XHRcdFx0XHR9IGNhdGNoKGUpIHt9XG5cdFx0XHRcdFx0Lypqc2hpbnQgZXZpbDpmYWxzZSAqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3NzQ2FjaGVbY3NzXTtcblx0XHR9O1xuXHR9KSgpO1xuXG5cdHZhciBzZXRSZXNvbHV0aW9uID0gZnVuY3Rpb24oIGNhbmRpZGF0ZSwgc2l6ZXNhdHRyICkge1xuXHRcdGlmICggY2FuZGlkYXRlLncgKSB7IC8vIGggPSBtZWFucyBoZWlnaHQ6IHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ2gnIGRvIG5vdCBoYW5kbGUgeWV0Li4uXG5cdFx0XHRjYW5kaWRhdGUuY1dpZHRoID0gcGYuY2FsY0xpc3RMZW5ndGgoIHNpemVzYXR0ciB8fCBcIjEwMHZ3XCIgKTtcblx0XHRcdGNhbmRpZGF0ZS5yZXMgPSBjYW5kaWRhdGUudyAvIGNhbmRpZGF0ZS5jV2lkdGggO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW5kaWRhdGUucmVzID0gY2FuZGlkYXRlLmQ7XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH07XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBvcHRcblx0ICovXG5cdHZhciBwaWN0dXJlZmlsbCA9IGZ1bmN0aW9uKCBvcHQgKSB7XG5cblx0XHRpZiAoIWlzU3VwcG9ydFRlc3RSZWFkeSkge3JldHVybjt9XG5cblx0XHR2YXIgZWxlbWVudHMsIGksIHBsZW47XG5cblx0XHR2YXIgb3B0aW9ucyA9IG9wdCB8fCB7fTtcblxuXHRcdGlmICggb3B0aW9ucy5lbGVtZW50cyAmJiBvcHRpb25zLmVsZW1lbnRzLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCBvcHRpb25zLmVsZW1lbnRzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSU1HXCIgKSB7XG5cdFx0XHRcdG9wdGlvbnMuZWxlbWVudHMgPSAgWyBvcHRpb25zLmVsZW1lbnRzIF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmVsZW1lbnRzO1xuXHRcdFx0XHRvcHRpb25zLmVsZW1lbnRzID0gIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzIHx8IHBmLnFzYSggKG9wdGlvbnMuY29udGV4dCB8fCBkb2N1bWVudCksICggb3B0aW9ucy5yZWV2YWx1YXRlIHx8IG9wdGlvbnMucmVzZWxlY3QgKSA/IHBmLnNlbCA6IHBmLnNlbFNob3J0ICk7XG5cblx0XHRpZiAoIChwbGVuID0gZWxlbWVudHMubGVuZ3RoKSApIHtcblxuXHRcdFx0cGYuc2V0dXBSdW4oIG9wdGlvbnMgKTtcblx0XHRcdGFscmVhZHlSdW4gPSB0cnVlO1xuXG5cdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIGVsZW1lbnRzXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHBsZW47IGkrKyApIHtcblx0XHRcdFx0cGYuZmlsbEltZyhlbGVtZW50c1sgaSBdLCBvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0cGYudGVhcmRvd25SdW4oIG9wdGlvbnMgKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIG91dHB1dHMgYSB3YXJuaW5nIGZvciB0aGUgZGV2ZWxvcGVyXG5cdCAqIEBwYXJhbSB7bWVzc2FnZX1cblx0ICogQHR5cGUge0Z1bmN0aW9ufVxuXHQgKi9cblx0d2FybiA9ICggd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuICkgP1xuXHRcdGZ1bmN0aW9uKCBtZXNzYWdlICkge1xuXHRcdFx0Y29uc29sZS53YXJuKCBtZXNzYWdlICk7XG5cdFx0fSA6XG5cdFx0bm9vcFxuXHQ7XG5cblx0aWYgKCAhKGN1clNyY1Byb3AgaW4gaW1hZ2UpICkge1xuXHRcdGN1clNyY1Byb3AgPSBcInNyY1wiO1xuXHR9XG5cblx0Ly8gQWRkIHN1cHBvcnQgZm9yIHN0YW5kYXJkIG1pbWUgdHlwZXMuXG5cdHR5cGVzWyBcImltYWdlL2pwZWdcIiBdID0gdHJ1ZTtcblx0dHlwZXNbIFwiaW1hZ2UvZ2lmXCIgXSA9IHRydWU7XG5cdHR5cGVzWyBcImltYWdlL3BuZ1wiIF0gPSB0cnVlO1xuXG5cdGZ1bmN0aW9uIGRldGVjdFR5cGVTdXBwb3J0KCB0eXBlLCB0eXBlVXJpICkge1xuXHRcdC8vIGJhc2VkIG9uIE1vZGVybml6cidzIGxvc3NsZXNzIGltZy13ZWJwIHRlc3Rcblx0XHQvLyBub3RlOiBhc3luY2hyb25vdXNcblx0XHR2YXIgaW1hZ2UgPSBuZXcgd2luZG93LkltYWdlKCk7XG5cdFx0aW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dHlwZXNbIHR5cGUgXSA9IGZhbHNlO1xuXHRcdFx0cGljdHVyZWZpbGwoKTtcblx0XHR9O1xuXHRcdGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dHlwZXNbIHR5cGUgXSA9IGltYWdlLndpZHRoID09PSAxO1xuXHRcdFx0cGljdHVyZWZpbGwoKTtcblx0XHR9O1xuXHRcdGltYWdlLnNyYyA9IHR5cGVVcmk7XG5cdFx0cmV0dXJuIFwicGVuZGluZ1wiO1xuXHR9XG5cblx0Ly8gdGVzdCBzdmcgc3VwcG9ydFxuXHR0eXBlc1sgXCJpbWFnZS9zdmcreG1sXCIgXSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIFwiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNJbWFnZVwiLCBcIjEuMVwiICk7XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIGludGVybmFsIHZXIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdmlld3BvcnQgd2lkdGggaW4gcHhcblx0ICovXG5cdGZ1bmN0aW9uIHVwZGF0ZU1ldHJpY3MoKSB7XG5cblx0XHRpc1Z3RGlydHkgPSBmYWxzZTtcblx0XHREUFIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcblx0XHRjc3NDYWNoZSA9IHt9O1xuXHRcdHNpemVMZW5ndGhDYWNoZSA9IHt9O1xuXG5cdFx0cGYuRFBSID0gRFBSIHx8IDE7XG5cblx0XHR1bml0cy53aWR0aCA9IE1hdGgubWF4KHdpbmRvdy5pbm5lcldpZHRoIHx8IDAsIGRvY0VsZW0uY2xpZW50V2lkdGgpO1xuXHRcdHVuaXRzLmhlaWdodCA9IE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCB8fCAwLCBkb2NFbGVtLmNsaWVudEhlaWdodCk7XG5cblx0XHR1bml0cy52dyA9IHVuaXRzLndpZHRoIC8gMTAwO1xuXHRcdHVuaXRzLnZoID0gdW5pdHMuaGVpZ2h0IC8gMTAwO1xuXG5cdFx0ZXZhbElkID0gWyB1bml0cy5oZWlnaHQsIHVuaXRzLndpZHRoLCBEUFIgXS5qb2luKFwiLVwiKTtcblxuXHRcdHVuaXRzLmVtID0gcGYuZ2V0RW1WYWx1ZSgpO1xuXHRcdHVuaXRzLnJlbSA9IHVuaXRzLmVtO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2hvb3NlTG93UmVzKCBsb3dlclZhbHVlLCBoaWdoZXJWYWx1ZSwgZHByVmFsdWUsIGlzQ2FjaGVkICkge1xuXHRcdHZhciBib251c0ZhY3RvciwgdG9vTXVjaCwgYm9udXMsIG1lYW5EZW5zaXR5O1xuXG5cdFx0Ly9leHBlcmltZW50YWxcblx0XHRpZiAoY2ZnLmFsZ29yaXRobSA9PT0gXCJzYXZlRGF0YVwiICl7XG5cdFx0XHRpZiAoIGxvd2VyVmFsdWUgPiAyLjcgKSB7XG5cdFx0XHRcdG1lYW5EZW5zaXR5ID0gZHByVmFsdWUgKyAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG9vTXVjaCA9IGhpZ2hlclZhbHVlIC0gZHByVmFsdWU7XG5cdFx0XHRcdGJvbnVzRmFjdG9yID0gTWF0aC5wb3cobG93ZXJWYWx1ZSAtIDAuNiwgMS41KTtcblxuXHRcdFx0XHRib251cyA9IHRvb011Y2ggKiBib251c0ZhY3RvcjtcblxuXHRcdFx0XHRpZiAoaXNDYWNoZWQpIHtcblx0XHRcdFx0XHRib251cyArPSAwLjEgKiBib251c0ZhY3Rvcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1lYW5EZW5zaXR5ID0gbG93ZXJWYWx1ZSArIGJvbnVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZWFuRGVuc2l0eSA9IChkcHJWYWx1ZSA+IDEpID9cblx0XHRcdFx0TWF0aC5zcXJ0KGxvd2VyVmFsdWUgKiBoaWdoZXJWYWx1ZSkgOlxuXHRcdFx0XHRsb3dlclZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZWFuRGVuc2l0eSA+IGRwclZhbHVlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXBwbHlCZXN0Q2FuZGlkYXRlKCBpbWcgKSB7XG5cdFx0dmFyIHNyY1NldENhbmRpZGF0ZXM7XG5cdFx0dmFyIG1hdGNoaW5nU2V0ID0gcGYuZ2V0U2V0KCBpbWcgKTtcblx0XHR2YXIgZXZhbHVhdGVkID0gZmFsc2U7XG5cdFx0aWYgKCBtYXRjaGluZ1NldCAhPT0gXCJwZW5kaW5nXCIgKSB7XG5cdFx0XHRldmFsdWF0ZWQgPSBldmFsSWQ7XG5cdFx0XHRpZiAoIG1hdGNoaW5nU2V0ICkge1xuXHRcdFx0XHRzcmNTZXRDYW5kaWRhdGVzID0gcGYuc2V0UmVzKCBtYXRjaGluZ1NldCApO1xuXHRcdFx0XHRwZi5hcHBseVNldENhbmRpZGF0ZSggc3JjU2V0Q2FuZGlkYXRlcywgaW1nICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGltZ1sgcGYubnMgXS5ldmFsZWQgPSBldmFsdWF0ZWQ7XG5cdH1cblxuXHRmdW5jdGlvbiBhc2NlbmRpbmdTb3J0KCBhLCBiICkge1xuXHRcdHJldHVybiBhLnJlcyAtIGIucmVzO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U3JjVG9DdXIoIGltZywgc3JjLCBzZXQgKSB7XG5cdFx0dmFyIGNhbmRpZGF0ZTtcblx0XHRpZiAoICFzZXQgJiYgc3JjICkge1xuXHRcdFx0c2V0ID0gaW1nWyBwZi5ucyBdLnNldHM7XG5cdFx0XHRzZXQgPSBzZXQgJiYgc2V0W3NldC5sZW5ndGggLSAxXTtcblx0XHR9XG5cblx0XHRjYW5kaWRhdGUgPSBnZXRDYW5kaWRhdGVGb3JTcmMoc3JjLCBzZXQpO1xuXG5cdFx0aWYgKCBjYW5kaWRhdGUgKSB7XG5cdFx0XHRzcmMgPSBwZi5tYWtlVXJsKHNyYyk7XG5cdFx0XHRpbWdbIHBmLm5zIF0uY3VyU3JjID0gc3JjO1xuXHRcdFx0aW1nWyBwZi5ucyBdLmN1ckNhbiA9IGNhbmRpZGF0ZTtcblxuXHRcdFx0aWYgKCAhY2FuZGlkYXRlLnJlcyApIHtcblx0XHRcdFx0c2V0UmVzb2x1dGlvbiggY2FuZGlkYXRlLCBjYW5kaWRhdGUuc2V0LnNpemVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDYW5kaWRhdGVGb3JTcmMoIHNyYywgc2V0ICkge1xuXHRcdHZhciBpLCBjYW5kaWRhdGUsIGNhbmRpZGF0ZXM7XG5cdFx0aWYgKCBzcmMgJiYgc2V0ICkge1xuXHRcdFx0Y2FuZGlkYXRlcyA9IHBmLnBhcnNlU2V0KCBzZXQgKTtcblx0XHRcdHNyYyA9IHBmLm1ha2VVcmwoc3JjKTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBzcmMgPT09IHBmLm1ha2VVcmwoY2FuZGlkYXRlc1sgaSBdLnVybCkgKSB7XG5cdFx0XHRcdFx0Y2FuZGlkYXRlID0gY2FuZGlkYXRlc1sgaSBdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRBbGxTb3VyY2VFbGVtZW50cyggcGljdHVyZSwgY2FuZGlkYXRlcyApIHtcblx0XHR2YXIgaSwgbGVuLCBzb3VyY2UsIHNyY3NldDtcblxuXHRcdC8vIFNQRUMgbWlzbWF0Y2ggaW50ZW5kZWQgZm9yIHNpemUgYW5kIHBlcmY6XG5cdFx0Ly8gYWN0dWFsbHkgb25seSBzb3VyY2UgZWxlbWVudHMgcHJlY2VkaW5nIHRoZSBpbWcgc2hvdWxkIGJlIHVzZWRcblx0XHQvLyBhbHNvIG5vdGU6IGRvbid0IHVzZSBxc2EgaGVyZSwgYmVjYXVzZSBJRTggc29tZXRpbWVzIGRvZXNuJ3QgbGlrZSBzb3VyY2UgYXMgdGhlIGtleSBwYXJ0IGluIGEgc2VsZWN0b3Jcblx0XHR2YXIgc291cmNlcyA9IHBpY3R1cmUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwic291cmNlXCIgKTtcblxuXHRcdGZvciAoIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0c291cmNlID0gc291cmNlc1sgaSBdO1xuXHRcdFx0c291cmNlWyBwZi5ucyBdID0gdHJ1ZTtcblx0XHRcdHNyY3NldCA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwic3Jjc2V0XCIgKTtcblxuXHRcdFx0Ly8gaWYgc291cmNlIGRvZXMgbm90IGhhdmUgYSBzcmNzZXQgYXR0cmlidXRlLCBza2lwXG5cdFx0XHRpZiAoIHNyY3NldCApIHtcblx0XHRcdFx0Y2FuZGlkYXRlcy5wdXNoKCB7XG5cdFx0XHRcdFx0c3Jjc2V0OiBzcmNzZXQsXG5cdFx0XHRcdFx0bWVkaWE6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwibWVkaWFcIiApLFxuXHRcdFx0XHRcdHR5cGU6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICksXG5cdFx0XHRcdFx0c2l6ZXM6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwic2l6ZXNcIiApXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3Jjc2V0IFBhcnNlclxuXHQgKiBCeSBBbGV4IEJlbGwgfCAgTUlUIExpY2Vuc2Vcblx0ICpcblx0ICogQHJldHVybnMgQXJyYXkgW3t1cmw6IF8sIGQ6IF8sIHc6IF8sIGg6Xywgc2V0Ol8oPz8/Pyl9LCAuLi5dXG5cdCAqXG5cdCAqIEJhc2VkIHN1cGVyIGR1cGVyIGNsb3NlbHkgb24gdGhlIHJlZmVyZW5jZSBhbGdvcml0aG0gYXQ6XG5cdCAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNwYXJzZS1hLXNyY3NldC1hdHRyaWJ1dGVcblx0ICovXG5cblx0Ly8gMS4gTGV0IGlucHV0IGJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gdGhpcyBhbGdvcml0aG0uXG5cdC8vIChUTy1ETyA6IEV4cGxhaW4gd2hhdCBcInNldFwiIGFyZ3VtZW50IGlzIGhlcmUuIE1heWJlIGNob29zZSBhIG1vcmVcblx0Ly8gZGVzY3JpcHRpdmUgJiBtb3JlIHNlYXJjaGFibGUgbmFtZS4gIFNpbmNlIHBhc3NpbmcgdGhlIFwic2V0XCIgaW4gcmVhbGx5IGhhc1xuXHQvLyBub3RoaW5nIHRvIGRvIHdpdGggcGFyc2luZyBwcm9wZXIsIEkgd291bGQgcHJlZmVyIHRoaXMgYXNzaWdubWVudCBldmVudHVhbGx5XG5cdC8vIGdvIGluIGFuIGV4dGVybmFsIGZuLilcblx0ZnVuY3Rpb24gcGFyc2VTcmNzZXQoaW5wdXQsIHNldCkge1xuXG5cdFx0ZnVuY3Rpb24gY29sbGVjdENoYXJhY3RlcnMocmVnRXgpIHtcblx0XHRcdHZhciBjaGFycyxcblx0XHRcdCAgICBtYXRjaCA9IHJlZ0V4LmV4ZWMoaW5wdXQuc3Vic3RyaW5nKHBvcykpO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNoYXJzID0gbWF0Y2hbIDAgXTtcblx0XHRcdFx0cG9zICs9IGNoYXJzLmxlbmd0aDtcblx0XHRcdFx0cmV0dXJuIGNoYXJzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgdXJsLFxuXHRcdCAgICBkZXNjcmlwdG9ycyxcblx0XHQgICAgY3VycmVudERlc2NyaXB0b3IsXG5cdFx0ICAgIHN0YXRlLFxuXHRcdCAgICBjLFxuXG5cdFx0ICAgIC8vIDIuIExldCBwb3NpdGlvbiBiZSBhIHBvaW50ZXIgaW50byBpbnB1dCwgaW5pdGlhbGx5IHBvaW50aW5nIGF0IHRoZSBzdGFydFxuXHRcdCAgICAvLyAgICBvZiB0aGUgc3RyaW5nLlxuXHRcdCAgICBwb3MgPSAwLFxuXG5cdFx0ICAgIC8vIDMuIExldCBjYW5kaWRhdGVzIGJlIGFuIGluaXRpYWxseSBlbXB0eSBzb3VyY2Ugc2V0LlxuXHRcdCAgICBjYW5kaWRhdGVzID0gW107XG5cblx0XHQvKipcblx0XHQqIEFkZHMgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIHRvIGEgY2FuZGlkYXRlLCBwdXNoZXMgdG8gdGhlIGNhbmRpZGF0ZXMgYXJyYXlcblx0XHQqIEByZXR1cm4gdW5kZWZpbmVkXG5cdFx0Ki9cblx0XHQvLyAoRGVjbGFyZWQgb3V0c2lkZSBvZiB0aGUgd2hpbGUgbG9vcCBzbyB0aGF0IGl0J3Mgb25seSBjcmVhdGVkIG9uY2UuXG5cdFx0Ly8gKFRoaXMgZm4gaXMgZGVmaW5lZCBiZWZvcmUgaXQgaXMgdXNlZCwgaW4gb3JkZXIgdG8gcGFzcyBKU0hJTlQuXG5cdFx0Ly8gVW5mb3J0dW5hdGVseSB0aGlzIGJyZWFrcyB0aGUgc2VxdWVuY2luZyBvZiB0aGUgc3BlYyBjb21tZW50cy4gOi8gKVxuXHRcdGZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRvcnMoKSB7XG5cblx0XHRcdC8vIDkuIERlc2NyaXB0b3IgcGFyc2VyOiBMZXQgZXJyb3IgYmUgbm8uXG5cdFx0XHR2YXIgcEVycm9yID0gZmFsc2UsXG5cblx0XHRcdC8vIDEwLiBMZXQgd2lkdGggYmUgYWJzZW50LlxuXHRcdFx0Ly8gMTEuIExldCBkZW5zaXR5IGJlIGFic2VudC5cblx0XHRcdC8vIDEyLiBMZXQgZnV0dXJlLWNvbXBhdC1oIGJlIGFic2VudC4gKFdlJ3JlIGltcGxlbWVudGluZyBpdCBub3cgYXMgaClcblx0XHRcdCAgICB3LCBkLCBoLCBpLFxuXHRcdFx0ICAgIGNhbmRpZGF0ZSA9IHt9LFxuXHRcdFx0ICAgIGRlc2MsIGxhc3RDaGFyLCB2YWx1ZSwgaW50VmFsLCBmbG9hdFZhbDtcblxuXHRcdFx0Ly8gMTMuIEZvciBlYWNoIGRlc2NyaXB0b3IgaW4gZGVzY3JpcHRvcnMsIHJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzXG5cdFx0XHQvLyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcblx0XHRcdGZvciAoaSA9IDAgOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGVzYyA9IGRlc2NyaXB0b3JzWyBpIF07XG5cblx0XHRcdFx0bGFzdENoYXIgPSBkZXNjWyBkZXNjLmxlbmd0aCAtIDEgXTtcblx0XHRcdFx0dmFsdWUgPSBkZXNjLnN1YnN0cmluZygwLCBkZXNjLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRpbnRWYWwgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXHRcdFx0XHRmbG9hdFZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGEgdmFsaWQgbm9uLW5lZ2F0aXZlIGludGVnZXIgZm9sbG93ZWQgYnlcblx0XHRcdFx0Ly8gYSBVKzAwNzcgTEFUSU4gU01BTEwgTEVUVEVSIFcgY2hhcmFjdGVyXG5cdFx0XHRcdGlmIChyZWdleE5vbk5lZ2F0aXZlSW50ZWdlci50ZXN0KHZhbHVlKSAmJiAobGFzdENoYXIgPT09IFwid1wiKSkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2lkdGggYW5kIGRlbnNpdHkgYXJlIG5vdCBib3RoIGFic2VudCwgdGhlbiBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdGlmICh3IHx8IGQpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBub24tbmVnYXRpdmUgaW50ZWdlcnMgdG8gdGhlIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgbGV0IHdpZHRoIGJlIHRoZSByZXN1bHQuXG5cdFx0XHRcdFx0aWYgKGludFZhbCA9PT0gMCkge3BFcnJvciA9IHRydWU7fSBlbHNlIHt3ID0gaW50VmFsO31cblxuXHRcdFx0XHQvLyBJZiB0aGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIHZhbGlkIGZsb2F0aW5nLXBvaW50IG51bWJlciBmb2xsb3dlZCBieVxuXHRcdFx0XHQvLyBhIFUrMDA3OCBMQVRJTiBTTUFMTCBMRVRURVIgWCBjaGFyYWN0ZXJcblx0XHRcdFx0fSBlbHNlIGlmIChyZWdleEZsb2F0aW5nUG9pbnQudGVzdCh2YWx1ZSkgJiYgKGxhc3RDaGFyID09PSBcInhcIikpIHtcblxuXHRcdFx0XHRcdC8vIElmIHdpZHRoLCBkZW5zaXR5IGFuZCBmdXR1cmUtY29tcGF0LWggYXJlIG5vdCBhbGwgYWJzZW50LCB0aGVuIGxldCBlcnJvclxuXHRcdFx0XHRcdC8vIGJlIHllcy5cblx0XHRcdFx0XHRpZiAodyB8fCBkIHx8IGgpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBmbG9hdGluZy1wb2ludCBudW1iZXIgdmFsdWVzIHRvIHRoZSBkZXNjcmlwdG9yLlxuXHRcdFx0XHRcdC8vIElmIHRoZSByZXN1bHQgaXMgbGVzcyB0aGFuIHplcm8sIGxldCBlcnJvciBiZSB5ZXMuIE90aGVyd2lzZSwgbGV0IGRlbnNpdHlcblx0XHRcdFx0XHQvLyBiZSB0aGUgcmVzdWx0LlxuXHRcdFx0XHRcdGlmIChmbG9hdFZhbCA8IDApIHtwRXJyb3IgPSB0cnVlO30gZWxzZSB7ZCA9IGZsb2F0VmFsO31cblxuXHRcdFx0XHQvLyBJZiB0aGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIHZhbGlkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5XG5cdFx0XHRcdC8vIGEgVSswMDY4IExBVElOIFNNQUxMIExFVFRFUiBIIGNoYXJhY3RlclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZ2V4Tm9uTmVnYXRpdmVJbnRlZ2VyLnRlc3QodmFsdWUpICYmIChsYXN0Q2hhciA9PT0gXCJoXCIpKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBoZWlnaHQgYW5kIGRlbnNpdHkgYXJlIG5vdCBib3RoIGFic2VudCwgdGhlbiBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdGlmIChoIHx8IGQpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBub24tbmVnYXRpdmUgaW50ZWdlcnMgdG8gdGhlIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBsZXQgZXJyb3IgYmUgeWVzLiBPdGhlcndpc2UsIGxldCBmdXR1cmUtY29tcGF0LWhcblx0XHRcdFx0XHQvLyBiZSB0aGUgcmVzdWx0LlxuXHRcdFx0XHRcdGlmIChpbnRWYWwgPT09IDApIHtwRXJyb3IgPSB0cnVlO30gZWxzZSB7aCA9IGludFZhbDt9XG5cblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSwgTGV0IGVycm9yIGJlIHllcy5cblx0XHRcdFx0fSBlbHNlIHtwRXJyb3IgPSB0cnVlO31cblx0XHRcdH0gLy8gKGNsb3NlIHN0ZXAgMTMgZm9yIGxvb3ApXG5cblx0XHRcdC8vIDE1LiBJZiBlcnJvciBpcyBzdGlsbCBubywgdGhlbiBhcHBlbmQgYSBuZXcgaW1hZ2Ugc291cmNlIHRvIGNhbmRpZGF0ZXMgd2hvc2Vcblx0XHRcdC8vIFVSTCBpcyB1cmwsIGFzc29jaWF0ZWQgd2l0aCBhIHdpZHRoIHdpZHRoIGlmIG5vdCBhYnNlbnQgYW5kIGEgcGl4ZWxcblx0XHRcdC8vIGRlbnNpdHkgZGVuc2l0eSBpZiBub3QgYWJzZW50LiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgcGFyc2UgZXJyb3IuXG5cdFx0XHRpZiAoIXBFcnJvcikge1xuXHRcdFx0XHRjYW5kaWRhdGUudXJsID0gdXJsO1xuXG5cdFx0XHRcdGlmICh3KSB7IGNhbmRpZGF0ZS53ID0gdzt9XG5cdFx0XHRcdGlmIChkKSB7IGNhbmRpZGF0ZS5kID0gZDt9XG5cdFx0XHRcdGlmIChoKSB7IGNhbmRpZGF0ZS5oID0gaDt9XG5cdFx0XHRcdGlmICghaCAmJiAhZCAmJiAhdykge2NhbmRpZGF0ZS5kID0gMTt9XG5cdFx0XHRcdGlmIChjYW5kaWRhdGUuZCA9PT0gMSkge3NldC5oYXMxeCA9IHRydWU7fVxuXHRcdFx0XHRjYW5kaWRhdGUuc2V0ID0gc2V0O1xuXG5cdFx0XHRcdGNhbmRpZGF0ZXMucHVzaChjYW5kaWRhdGUpO1xuXHRcdFx0fVxuXHRcdH0gLy8gKGNsb3NlIHBhcnNlRGVzY3JpcHRvcnMgZm4pXG5cblx0XHQvKipcblx0XHQqIFRva2VuaXplcyBkZXNjcmlwdG9yIHByb3BlcnRpZXMgcHJpb3IgdG8gcGFyc2luZ1xuXHRcdCogUmV0dXJucyB1bmRlZmluZWQuXG5cdFx0KiAoQWdhaW4sIHRoaXMgZm4gaXMgZGVmaW5lZCBiZWZvcmUgaXQgaXMgdXNlZCwgaW4gb3JkZXIgdG8gcGFzcyBKU0hJTlQuXG5cdFx0KiBVbmZvcnR1bmF0ZWx5IHRoaXMgYnJlYWtzIHRoZSBsb2dpY2FsIHNlcXVlbmNpbmcgb2YgdGhlIHNwZWMgY29tbWVudHMuIDovIClcblx0XHQqL1xuXHRcdGZ1bmN0aW9uIHRva2VuaXplKCkge1xuXG5cdFx0XHQvLyA4LjEuIERlc2NyaXB0b3IgdG9rZW5pc2VyOiBTa2lwIHdoaXRlc3BhY2Vcblx0XHRcdGNvbGxlY3RDaGFyYWN0ZXJzKHJlZ2V4TGVhZGluZ1NwYWNlcyk7XG5cblx0XHRcdC8vIDguMi4gTGV0IGN1cnJlbnQgZGVzY3JpcHRvciBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuXHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBcIlwiO1xuXG5cdFx0XHQvLyA4LjMuIExldCBzdGF0ZSBiZSBpbiBkZXNjcmlwdG9yLlxuXHRcdFx0c3RhdGUgPSBcImluIGRlc2NyaXB0b3JcIjtcblxuXHRcdFx0d2hpbGUgKHRydWUpIHtcblxuXHRcdFx0XHQvLyA4LjQuIExldCBjIGJlIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24uXG5cdFx0XHRcdGMgPSBpbnB1dC5jaGFyQXQocG9zKTtcblxuXHRcdFx0XHQvLyAgRG8gdGhlIGZvbGxvd2luZyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHN0YXRlLlxuXHRcdFx0XHQvLyAgRm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3RlcCwgXCJFT0ZcIiBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyIHJlcHJlc2VudGluZ1xuXHRcdFx0XHQvLyAgdGhhdCBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQuXG5cblx0XHRcdFx0Ly8gSW4gZGVzY3JpcHRvclxuXHRcdFx0XHRpZiAoc3RhdGUgPT09IFwiaW4gZGVzY3JpcHRvclwiKSB7XG5cdFx0XHRcdFx0Ly8gRG8gdGhlIGZvbGxvd2luZywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjOlxuXG5cdFx0XHRcdCAgLy8gU3BhY2UgY2hhcmFjdGVyXG5cdFx0XHRcdCAgLy8gSWYgY3VycmVudCBkZXNjcmlwdG9yIGlzIG5vdCBlbXB0eSwgYXBwZW5kIGN1cnJlbnQgZGVzY3JpcHRvciB0b1xuXHRcdFx0XHQgIC8vIGRlc2NyaXB0b3JzIGFuZCBsZXQgY3VycmVudCBkZXNjcmlwdG9yIGJlIHRoZSBlbXB0eSBzdHJpbmcuXG5cdFx0XHRcdCAgLy8gU2V0IHN0YXRlIHRvIGFmdGVyIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0aWYgKGlzU3BhY2UoYykpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50RGVzY3JpcHRvcikge1xuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdG9ycy5wdXNoKGN1cnJlbnREZXNjcmlwdG9yKTtcblx0XHRcdFx0XHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IFwiYWZ0ZXIgZGVzY3JpcHRvclwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVSswMDJDIENPTU1BICgsKVxuXHRcdFx0XHRcdC8vIEFkdmFuY2UgcG9zaXRpb24gdG8gdGhlIG5leHQgY2hhcmFjdGVyIGluIGlucHV0LiBJZiBjdXJyZW50IGRlc2NyaXB0b3Jcblx0XHRcdFx0XHQvLyBpcyBub3QgZW1wdHksIGFwcGVuZCBjdXJyZW50IGRlc2NyaXB0b3IgdG8gZGVzY3JpcHRvcnMuIEp1bXAgdG8gdGhlIHN0ZXBcblx0XHRcdFx0XHQvLyBsYWJlbGVkIGRlc2NyaXB0b3IgcGFyc2VyLlxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYyA9PT0gXCIsXCIpIHtcblx0XHRcdFx0XHRcdHBvcyArPSAxO1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnREZXNjcmlwdG9yKSB7XG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0b3JzLnB1c2goY3VycmVudERlc2NyaXB0b3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFyc2VEZXNjcmlwdG9ycygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0Ly8gVSswMDI4IExFRlQgUEFSRU5USEVTSVMgKCgpXG5cdFx0XHRcdFx0Ly8gQXBwZW5kIGMgdG8gY3VycmVudCBkZXNjcmlwdG9yLiBTZXQgc3RhdGUgdG8gaW4gcGFyZW5zLlxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYyA9PT0gXCJcXHUwMDI4XCIpIHtcblx0XHRcdFx0XHRcdGN1cnJlbnREZXNjcmlwdG9yID0gY3VycmVudERlc2NyaXB0b3IgKyBjO1xuXHRcdFx0XHRcdFx0c3RhdGUgPSBcImluIHBhcmVuc1wiO1xuXG5cdFx0XHRcdFx0Ly8gRU9GXG5cdFx0XHRcdFx0Ly8gSWYgY3VycmVudCBkZXNjcmlwdG9yIGlzIG5vdCBlbXB0eSwgYXBwZW5kIGN1cnJlbnQgZGVzY3JpcHRvciB0b1xuXHRcdFx0XHRcdC8vIGRlc2NyaXB0b3JzLiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWQgZGVzY3JpcHRvciBwYXJzZXIuXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudERlc2NyaXB0b3IpIHtcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRvcnMucHVzaChjdXJyZW50RGVzY3JpcHRvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwYXJzZURlc2NyaXB0b3JzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlXG5cdFx0XHRcdFx0Ly8gQXBwZW5kIGMgdG8gY3VycmVudCBkZXNjcmlwdG9yLlxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RGVzY3JpcHRvciA9IGN1cnJlbnREZXNjcmlwdG9yICsgYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdC8vIChlbmQgXCJpbiBkZXNjcmlwdG9yXCJcblxuXHRcdFx0XHQvLyBJbiBwYXJlbnNcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJpbiBwYXJlbnNcIikge1xuXG5cdFx0XHRcdFx0Ly8gVSswMDI5IFJJR0hUIFBBUkVOVEhFU0lTICgpKVxuXHRcdFx0XHRcdC8vIEFwcGVuZCBjIHRvIGN1cnJlbnQgZGVzY3JpcHRvci4gU2V0IHN0YXRlIHRvIGluIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0aWYgKGMgPT09IFwiKVwiKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RGVzY3JpcHRvciA9IGN1cnJlbnREZXNjcmlwdG9yICsgYztcblx0XHRcdFx0XHRcdHN0YXRlID0gXCJpbiBkZXNjcmlwdG9yXCI7XG5cblx0XHRcdFx0XHQvLyBFT0Zcblx0XHRcdFx0XHQvLyBBcHBlbmQgY3VycmVudCBkZXNjcmlwdG9yIHRvIGRlc2NyaXB0b3JzLiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWRcblx0XHRcdFx0XHQvLyBkZXNjcmlwdG9yIHBhcnNlci5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGMgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0b3JzLnB1c2goY3VycmVudERlc2NyaXB0b3IpO1xuXHRcdFx0XHRcdFx0cGFyc2VEZXNjcmlwdG9ycygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZVxuXHRcdFx0XHRcdC8vIEFwcGVuZCBjIHRvIGN1cnJlbnQgZGVzY3JpcHRvci5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBjdXJyZW50RGVzY3JpcHRvciArIGM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFmdGVyIGRlc2NyaXB0b3Jcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJhZnRlciBkZXNjcmlwdG9yXCIpIHtcblxuXHRcdFx0XHRcdC8vIERvIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYzpcblx0XHRcdFx0XHQvLyBTcGFjZSBjaGFyYWN0ZXI6IFN0YXkgaW4gdGhpcyBzdGF0ZS5cblx0XHRcdFx0XHRpZiAoaXNTcGFjZShjKSkge1xuXG5cdFx0XHRcdFx0Ly8gRU9GOiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWQgZGVzY3JpcHRvciBwYXJzZXIuXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRwYXJzZURlc2NyaXB0b3JzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlXG5cdFx0XHRcdFx0Ly8gU2V0IHN0YXRlIHRvIGluIGRlc2NyaXB0b3IuIFNldCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGluIGlucHV0LlxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGF0ZSA9IFwiaW4gZGVzY3JpcHRvclwiO1xuXHRcdFx0XHRcdFx0cG9zIC09IDE7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZHZhbmNlIHBvc2l0aW9uIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBpbnB1dC5cblx0XHRcdFx0cG9zICs9IDE7XG5cblx0XHRcdC8vIFJlcGVhdCB0aGlzIHN0ZXAuXG5cdFx0XHR9IC8vIChjbG9zZSB3aGlsZSB0cnVlIGxvb3ApXG5cdFx0fVxuXG5cdFx0Ly8gNC4gU3BsaXR0aW5nIGxvb3A6IENvbGxlY3QgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNwYWNlXG5cdFx0Ly8gICAgY2hhcmFjdGVycyBvciBVKzAwMkMgQ09NTUEgY2hhcmFjdGVycy4gSWYgYW55IFUrMDAyQyBDT01NQSBjaGFyYWN0ZXJzXG5cdFx0Ly8gICAgd2VyZSBjb2xsZWN0ZWQsIHRoYXQgaXMgYSBwYXJzZSBlcnJvci5cblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0Y29sbGVjdENoYXJhY3RlcnMocmVnZXhMZWFkaW5nQ29tbWFzT3JTcGFjZXMpO1xuXG5cdFx0XHQvLyA1LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHJldHVybiBjYW5kaWRhdGVzIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cblx0XHRcdGlmIChwb3MgPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGNhbmRpZGF0ZXM7IC8vICh3ZSdyZSBkb25lLCB0aGlzIGlzIHRoZSBzb2xlIHJldHVybiBwYXRoKVxuXHRcdFx0fVxuXG5cdFx0XHQvLyA2LiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgc3BhY2UgY2hhcmFjdGVycyxcblx0XHRcdC8vICAgIGFuZCBsZXQgdGhhdCBiZSB1cmwuXG5cdFx0XHR1cmwgPSBjb2xsZWN0Q2hhcmFjdGVycyhyZWdleExlYWRpbmdOb3RTcGFjZXMpO1xuXG5cdFx0XHQvLyA3LiBMZXQgZGVzY3JpcHRvcnMgYmUgYSBuZXcgZW1wdHkgbGlzdC5cblx0XHRcdGRlc2NyaXB0b3JzID0gW107XG5cblx0XHRcdC8vIDguIElmIHVybCBlbmRzIHdpdGggYSBVKzAwMkMgQ09NTUEgY2hhcmFjdGVyICgsKSwgZm9sbG93IHRoZXNlIHN1YnN0ZXBzOlxuXHRcdFx0Ly9cdFx0KDEpLiBSZW1vdmUgYWxsIHRyYWlsaW5nIFUrMDAyQyBDT01NQSBjaGFyYWN0ZXJzIGZyb20gdXJsLiBJZiB0aGlzIHJlbW92ZWRcblx0XHRcdC8vICAgICAgICAgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsIHRoYXQgaXMgYSBwYXJzZSBlcnJvci5cblx0XHRcdGlmICh1cmwuc2xpY2UoLTEpID09PSBcIixcIikge1xuXHRcdFx0XHR1cmwgPSB1cmwucmVwbGFjZShyZWdleFRyYWlsaW5nQ29tbWFzLCBcIlwiKTtcblx0XHRcdFx0Ly8gKEp1bXAgYWhlYWQgdG8gc3RlcCA5IHRvIHNraXAgdG9rZW5pemF0aW9uIGFuZCBqdXN0IHB1c2ggdGhlIGNhbmRpZGF0ZSkuXG5cdFx0XHRcdHBhcnNlRGVzY3JpcHRvcnMoKTtcblxuXHRcdFx0Ly9cdE90aGVyd2lzZSwgZm9sbG93IHRoZXNlIHN1YnN0ZXBzOlxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG9rZW5pemUoKTtcblx0XHRcdH0gLy8gKGNsb3NlIGVsc2Ugb2Ygc3RlcCA4KVxuXG5cdFx0Ly8gMTYuIFJldHVybiB0byB0aGUgc3RlcCBsYWJlbGVkIHNwbGl0dGluZyBsb29wLlxuXHRcdH0gLy8gKENsb3NlIG9mIGJpZyB3aGlsZSBsb29wLilcblx0fVxuXG5cdC8qXG5cdCAqIFNpemVzIFBhcnNlclxuXHQgKlxuXHQgKiBCeSBBbGV4IEJlbGwgfCAgTUlUIExpY2Vuc2Vcblx0ICpcblx0ICogTm9uLXN0cmljdCBidXQgYWNjdXJhdGUgYW5kIGxpZ2h0d2VpZ2h0IEpTIFBhcnNlciBmb3IgdGhlIHN0cmluZyB2YWx1ZSA8aW1nIHNpemVzPVwiaGVyZVwiPlxuXHQgKlxuXHQgKiBSZWZlcmVuY2UgYWxnb3JpdGhtIGF0OlxuXHQgKiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjcGFyc2UtYS1zaXplcy1hdHRyaWJ1dGVcblx0ICpcblx0ICogTW9zdCBjb21tZW50cyBhcmUgY29waWVkIGluIGRpcmVjdGx5IGZyb20gdGhlIHNwZWNcblx0ICogKGV4Y2VwdCBmb3IgY29tbWVudHMgaW4gcGFyZW5zKS5cblx0ICpcblx0ICogR3JhbW1hciBpczpcblx0ICogPHNvdXJjZS1zaXplLWxpc3Q+ID0gPHNvdXJjZS1zaXplPiMgWyAsIDxzb3VyY2Utc2l6ZS12YWx1ZT4gXT8gfCA8c291cmNlLXNpemUtdmFsdWU+XG5cdCAqIDxzb3VyY2Utc2l6ZT4gPSA8bWVkaWEtY29uZGl0aW9uPiA8c291cmNlLXNpemUtdmFsdWU+XG5cdCAqIDxzb3VyY2Utc2l6ZS12YWx1ZT4gPSA8bGVuZ3RoPlxuXHQgKiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lbWJlZGRlZC1jb250ZW50Lmh0bWwjYXR0ci1pbWctc2l6ZXNcblx0ICpcblx0ICogRS5nLiBcIihtYXgtd2lkdGg6IDMwZW0pIDEwMHZ3LCAobWF4LXdpZHRoOiA1MGVtKSA3MHZ3LCAxMDB2d1wiXG5cdCAqIG9yIFwiKG1pbi13aWR0aDogMzBlbSksIGNhbGMoMzB2dyAtIDE1cHgpXCIgb3IganVzdCBcIjMwdndcIlxuXHQgKlxuXHQgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCA8Y3NzLWxlbmd0aD4gd2l0aCBhIG1lZGlhIGNvbmRpdGlvbiB0aGF0IGV2YWx1YXRlcyB0byB0cnVlLFxuXHQgKiBvciBcIjEwMHZ3XCIgaWYgYWxsIHZhbGlkIG1lZGlhIGNvbmRpdGlvbnMgZXZhbHVhdGUgdG8gZmFsc2UuXG5cdCAqXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHBhcnNlU2l6ZXMoc3RyVmFsdWUpIHtcblxuXHRcdC8vIChQZXJjZW50YWdlIENTUyBsZW5ndGhzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIGNhc2UsIHRvIGF2b2lkIGNvbmZ1c2lvbjpcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdmFsaWQtc291cmNlLXNpemUtbGlzdFxuXHRcdC8vIENTUyBhbGxvd3MgYSBzaW5nbGUgb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduOlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIvc3luZGF0YS5odG1sI251bWJlcnNcblx0XHQvLyBDU1MgaXMgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZTpcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyL3N5bmRhdGEuaHRtbCNjaGFyYWN0ZXJzIClcblx0XHQvLyBTcGVjIGFsbG93cyBleHBvbmVudGlhbCBub3RhdGlvbiBmb3IgPG51bWJlcj4gdHlwZTpcblx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLyNudW1iZXJzXG5cdFx0dmFyIHJlZ2V4Q3NzTGVuZ3RoV2l0aFVuaXRzID0gL14oPzpbKy1dP1swLTldK3xbMC05XSpcXC5bMC05XSspKD86W2VFXVsrLV0/WzAtOV0rKT8oPzpjaHxjbXxlbXxleHxpbnxtbXxwY3xwdHxweHxyZW18dmh8dm1pbnx2bWF4fHZ3KSQvaTtcblxuXHRcdC8vIChUaGlzIGlzIGEgcXVpY2sgYW5kIGxlbmllbnQgdGVzdC4gQmVjYXVzZSBvZiBvcHRpb25hbCB1bmxpbWl0ZWQtZGVwdGggaW50ZXJuYWxcblx0XHQvLyBncm91cGluZyBwYXJlbnMgYW5kIHN0cmljdCBzcGFjaW5nIHJ1bGVzLCB0aGlzIGNvdWxkIGdldCB2ZXJ5IGNvbXBsaWNhdGVkLilcblx0XHR2YXIgcmVnZXhDc3NDYWxjID0gL15jYWxjXFwoKD86WzAtOWEteiBcXC5cXCtcXC1cXCpcXC9cXChcXCldKylcXCkkL2k7XG5cblx0XHR2YXIgaTtcblx0XHR2YXIgdW5wYXJzZWRTaXplc0xpc3Q7XG5cdFx0dmFyIHVucGFyc2VkU2l6ZXNMaXN0TGVuZ3RoO1xuXHRcdHZhciB1bnBhcnNlZFNpemU7XG5cdFx0dmFyIGxhc3RDb21wb25lbnRWYWx1ZTtcblx0XHR2YXIgc2l6ZTtcblxuXHRcdC8vIFVUSUxJVFkgRlVOQ1RJT05TXG5cblx0XHQvLyAgKFRveSBDU1MgcGFyc2VyLiBUaGUgZ29hbHMgaGVyZSBhcmU6XG5cdFx0Ly8gIDEpIGV4cGFuc2l2ZSB0ZXN0IGNvdmVyYWdlIHdpdGhvdXQgdGhlIHdlaWdodCBvZiBhIGZ1bGwgQ1NTIHBhcnNlci5cblx0XHQvLyAgMikgQXZvaWRpbmcgcmVnZXggd2hlcmV2ZXIgY29udmVuaWVudC5cblx0XHQvLyAgUXVpY2sgdGVzdHM6IGh0dHA6Ly9qc2ZpZGRsZS5uZXQvZ3RudEw0Z3IvMy9cblx0XHQvLyAgUmV0dXJucyBhbiBhcnJheSBvZiBhcnJheXMuKVxuXHRcdGZ1bmN0aW9uIHBhcnNlQ29tcG9uZW50VmFsdWVzKHN0cikge1xuXHRcdFx0dmFyIGNocmN0cjtcblx0XHRcdHZhciBjb21wb25lbnQgPSBcIlwiO1xuXHRcdFx0dmFyIGNvbXBvbmVudEFycmF5ID0gW107XG5cdFx0XHR2YXIgbGlzdEFycmF5ID0gW107XG5cdFx0XHR2YXIgcGFyZW5EZXB0aCA9IDA7XG5cdFx0XHR2YXIgcG9zID0gMDtcblx0XHRcdHZhciBpbkNvbW1lbnQgPSBmYWxzZTtcblxuXHRcdFx0ZnVuY3Rpb24gcHVzaENvbXBvbmVudCgpIHtcblx0XHRcdFx0aWYgKGNvbXBvbmVudCkge1xuXHRcdFx0XHRcdGNvbXBvbmVudEFycmF5LnB1c2goY29tcG9uZW50KTtcblx0XHRcdFx0XHRjb21wb25lbnQgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIHB1c2hDb21wb25lbnRBcnJheSgpIHtcblx0XHRcdFx0aWYgKGNvbXBvbmVudEFycmF5WzBdKSB7XG5cdFx0XHRcdFx0bGlzdEFycmF5LnB1c2goY29tcG9uZW50QXJyYXkpO1xuXHRcdFx0XHRcdGNvbXBvbmVudEFycmF5ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gKExvb3AgZm9yd2FyZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuKVxuXHRcdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdFx0Y2hyY3RyID0gc3RyLmNoYXJBdChwb3MpO1xuXG5cdFx0XHRcdGlmIChjaHJjdHIgPT09IFwiXCIpIHsgLy8gKCBFbmQgb2Ygc3RyaW5nIHJlYWNoZWQuKVxuXHRcdFx0XHRcdHB1c2hDb21wb25lbnQoKTtcblx0XHRcdFx0XHRwdXNoQ29tcG9uZW50QXJyYXkoKTtcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEFycmF5O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGluQ29tbWVudCkge1xuXHRcdFx0XHRcdGlmICgoY2hyY3RyID09PSBcIipcIikgJiYgKHN0cltwb3MgKyAxXSA9PT0gXCIvXCIpKSB7IC8vIChBdCBlbmQgb2YgYSBjb21tZW50Lilcblx0XHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0cG9zICs9IDI7XG5cdFx0XHRcdFx0XHRwdXNoQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cG9zICs9IDE7IC8vIChTa2lwIGFsbCBjaGFyYWN0ZXJzIGluc2lkZSBjb21tZW50cy4pXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNTcGFjZShjaHJjdHIpKSB7XG5cdFx0XHRcdFx0Ly8gKElmIHByZXZpb3VzIGNoYXJhY3RlciBpbiBsb29wIHdhcyBhbHNvIGEgc3BhY2UsIG9yIGlmXG5cdFx0XHRcdFx0Ly8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCBkbyBub3QgYWRkIHNwYWNlIGNoYXIgdG9cblx0XHRcdFx0XHQvLyBjb21wb25lbnQuKVxuXHRcdFx0XHRcdGlmICggKHN0ci5jaGFyQXQocG9zIC0gMSkgJiYgaXNTcGFjZSggc3RyLmNoYXJBdChwb3MgLSAxKSApICkgfHwgIWNvbXBvbmVudCApIHtcblx0XHRcdFx0XHRcdHBvcyArPSAxO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJlbkRlcHRoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRwdXNoQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRwb3MgKz0xO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIChSZXBsYWNlIGFueSBzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHBsYWluIHNwYWNlIGZvciBsZWdpYmlsaXR5Lilcblx0XHRcdFx0XHRcdGNocmN0ciA9IFwiIFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChjaHJjdHIgPT09IFwiKFwiKSB7XG5cdFx0XHRcdFx0cGFyZW5EZXB0aCArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNocmN0ciA9PT0gXCIpXCIpIHtcblx0XHRcdFx0XHRwYXJlbkRlcHRoIC09IDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY2hyY3RyID09PSBcIixcIikge1xuXHRcdFx0XHRcdHB1c2hDb21wb25lbnQoKTtcblx0XHRcdFx0XHRwdXNoQ29tcG9uZW50QXJyYXkoKTtcblx0XHRcdFx0XHRwb3MgKz0gMTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fSBlbHNlIGlmICggKGNocmN0ciA9PT0gXCIvXCIpICYmIChzdHIuY2hhckF0KHBvcyArIDEpID09PSBcIipcIikgKSB7XG5cdFx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTtcblx0XHRcdFx0XHRwb3MgKz0gMjtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbXBvbmVudCA9IGNvbXBvbmVudCArIGNocmN0cjtcblx0XHRcdFx0cG9zICs9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaXNWYWxpZE5vbk5lZ2F0aXZlU291cmNlU2l6ZVZhbHVlKHMpIHtcblx0XHRcdGlmIChyZWdleENzc0xlbmd0aFdpdGhVbml0cy50ZXN0KHMpICYmIChwYXJzZUZsb2F0KHMpID49IDApKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0aWYgKHJlZ2V4Q3NzQ2FsYy50ZXN0KHMpKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0Ly8gKCBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyL3N5bmRhdGEuaHRtbCNudW1iZXJzIHNheXM6XG5cdFx0XHQvLyBcIi0wIGlzIGVxdWl2YWxlbnQgdG8gMCBhbmQgaXMgbm90IGEgbmVnYXRpdmUgbnVtYmVyLlwiIHdoaWNoIG1lYW5zIHRoYXRcblx0XHRcdC8vIHVuaXRsZXNzIHplcm8gYW5kIHVuaXRsZXNzIG5lZ2F0aXZlIHplcm8gbXVzdCBiZSBhY2NlcHRlZCBhcyBzcGVjaWFsIGNhc2VzLilcblx0XHRcdGlmICgocyA9PT0gXCIwXCIpIHx8IChzID09PSBcIi0wXCIpIHx8IChzID09PSBcIiswXCIpKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gYXNrZWQgdG8gcGFyc2UgYSBzaXplcyBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LCBwYXJzZSBhXG5cdFx0Ly8gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29tcG9uZW50IHZhbHVlcyBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCdzXG5cdFx0Ly8gc2l6ZXMgYXR0cmlidXRlIChvciB0aGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgYXR0cmlidXRlIGlzIGFic2VudCksIGFuZCBsZXRcblx0XHQvLyB1bnBhcnNlZCBzaXplcyBsaXN0IGJlIHRoZSByZXN1bHQuXG5cdFx0Ly8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLXN5bnRheC8jcGFyc2UtY29tbWEtc2VwYXJhdGVkLWxpc3Qtb2YtY29tcG9uZW50LXZhbHVlc1xuXG5cdFx0dW5wYXJzZWRTaXplc0xpc3QgPSBwYXJzZUNvbXBvbmVudFZhbHVlcyhzdHJWYWx1ZSk7XG5cdFx0dW5wYXJzZWRTaXplc0xpc3RMZW5ndGggPSB1bnBhcnNlZFNpemVzTGlzdC5sZW5ndGg7XG5cblx0XHQvLyBGb3IgZWFjaCB1bnBhcnNlZCBzaXplIGluIHVucGFyc2VkIHNpemVzIGxpc3Q6XG5cdFx0Zm9yIChpID0gMDsgaSA8IHVucGFyc2VkU2l6ZXNMaXN0TGVuZ3RoOyBpKyspIHtcblx0XHRcdHVucGFyc2VkU2l6ZSA9IHVucGFyc2VkU2l6ZXNMaXN0W2ldO1xuXG5cdFx0XHQvLyAxLiBSZW1vdmUgYWxsIGNvbnNlY3V0aXZlIDx3aGl0ZXNwYWNlLXRva2VuPnMgZnJvbSB0aGUgZW5kIG9mIHVucGFyc2VkIHNpemUuXG5cdFx0XHQvLyAoIHBhcnNlQ29tcG9uZW50VmFsdWVzKCkgYWxyZWFkeSBvbWl0cyBzcGFjZXMgb3V0c2lkZSBvZiBwYXJlbnMuIClcblxuXHRcdFx0Ly8gSWYgdW5wYXJzZWQgc2l6ZSBpcyBub3cgZW1wdHksIHRoYXQgaXMgYSBwYXJzZSBlcnJvcjsgY29udGludWUgdG8gdGhlIG5leHRcblx0XHRcdC8vIGl0ZXJhdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cblx0XHRcdC8vICggcGFyc2VDb21wb25lbnRWYWx1ZXMoKSB3b24ndCBwdXNoIGFuIGVtcHR5IGFycmF5LiApXG5cblx0XHRcdC8vIDIuIElmIHRoZSBsYXN0IGNvbXBvbmVudCB2YWx1ZSBpbiB1bnBhcnNlZCBzaXplIGlzIGEgdmFsaWQgbm9uLW5lZ2F0aXZlXG5cdFx0XHQvLyA8c291cmNlLXNpemUtdmFsdWU+LCBsZXQgc2l6ZSBiZSBpdHMgdmFsdWUgYW5kIHJlbW92ZSB0aGUgY29tcG9uZW50IHZhbHVlXG5cdFx0XHQvLyBmcm9tIHVucGFyc2VkIHNpemUuIEFueSBDU1MgZnVuY3Rpb24gb3RoZXIgdGhhbiB0aGUgY2FsYygpIGZ1bmN0aW9uIGlzXG5cdFx0XHQvLyBpbnZhbGlkLiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgcGFyc2UgZXJyb3I7IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGl0ZXJhdGlvblxuXHRcdFx0Ly8gb2YgdGhpcyBhbGdvcml0aG0uXG5cdFx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3Mtc3ludGF4LyNwYXJzZS1jb21wb25lbnQtdmFsdWVcblx0XHRcdGxhc3RDb21wb25lbnRWYWx1ZSA9IHVucGFyc2VkU2l6ZVt1bnBhcnNlZFNpemUubGVuZ3RoIC0gMV07XG5cblx0XHRcdGlmIChpc1ZhbGlkTm9uTmVnYXRpdmVTb3VyY2VTaXplVmFsdWUobGFzdENvbXBvbmVudFZhbHVlKSkge1xuXHRcdFx0XHRzaXplID0gbGFzdENvbXBvbmVudFZhbHVlO1xuXHRcdFx0XHR1bnBhcnNlZFNpemUucG9wKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gMy4gUmVtb3ZlIGFsbCBjb25zZWN1dGl2ZSA8d2hpdGVzcGFjZS10b2tlbj5zIGZyb20gdGhlIGVuZCBvZiB1bnBhcnNlZFxuXHRcdFx0Ly8gc2l6ZS4gSWYgdW5wYXJzZWQgc2l6ZSBpcyBub3cgZW1wdHksIHJldHVybiBzaXplIGFuZCBleGl0IHRoaXMgYWxnb3JpdGhtLlxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgbm90IHRoZSBsYXN0IGl0ZW0gaW4gdW5wYXJzZWQgc2l6ZXMgbGlzdCwgdGhhdCBpcyBhIHBhcnNlIGVycm9yLlxuXHRcdFx0aWYgKHVucGFyc2VkU2l6ZS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIHNpemU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIDQuIFBhcnNlIHRoZSByZW1haW5pbmcgY29tcG9uZW50IHZhbHVlcyBpbiB1bnBhcnNlZCBzaXplIGFzIGFcblx0XHRcdC8vIDxtZWRpYS1jb25kaXRpb24+LiBJZiBpdCBkb2VzIG5vdCBwYXJzZSBjb3JyZWN0bHksIG9yIGl0IGRvZXMgcGFyc2Vcblx0XHRcdC8vIGNvcnJlY3RseSBidXQgdGhlIDxtZWRpYS1jb25kaXRpb24+IGV2YWx1YXRlcyB0byBmYWxzZSwgY29udGludWUgdG8gdGhlXG5cdFx0XHQvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cblx0XHRcdC8vIChQYXJzaW5nIGFsbCBwb3NzaWJsZSBjb21wb3VuZCBtZWRpYSBjb25kaXRpb25zIGluIEpTIGlzIGhlYXZ5LCBjb21wbGljYXRlZCxcblx0XHRcdC8vIGFuZCB0aGUgcGF5b2ZmIGlzIHVuY2xlYXIuIElzIHRoZXJlIGV2ZXIgYW4gc2l0dWF0aW9uIHdoZXJlIHRoZVxuXHRcdFx0Ly8gbWVkaWEgY29uZGl0aW9uIHBhcnNlcyBpbmNvcnJlY3RseSBidXQgc3RpbGwgc29tZWhvdyBldmFsdWF0ZXMgdG8gdHJ1ZT9cblx0XHRcdC8vIENhbiB3ZSBqdXN0IHJlbHkgb24gdGhlIGJyb3dzZXIvcG9seWZpbGwgdG8gZG8gaXQ/KVxuXHRcdFx0dW5wYXJzZWRTaXplID0gdW5wYXJzZWRTaXplLmpvaW4oXCIgXCIpO1xuXHRcdFx0aWYgKCEocGYubWF0Y2hlc01lZGlhKCB1bnBhcnNlZFNpemUgKSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gNS4gUmV0dXJuIHNpemUgYW5kIGV4aXQgdGhpcyBhbGdvcml0aG0uXG5cdFx0XHRyZXR1cm4gc2l6ZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgYWJvdmUgYWxnb3JpdGhtIGV4aGF1c3RzIHVucGFyc2VkIHNpemVzIGxpc3Qgd2l0aG91dCByZXR1cm5pbmcgYVxuXHRcdC8vIHNpemUgdmFsdWUsIHJldHVybiAxMDB2dy5cblx0XHRyZXR1cm4gXCIxMDB2d1wiO1xuXHR9XG5cblx0Ly8gbmFtZXNwYWNlXG5cdHBmLm5zID0gKFwicGZcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKS5zdWJzdHIoMCwgOSk7XG5cblx0Ly8gc3Jjc2V0IHN1cHBvcnQgdGVzdFxuXHRwZi5zdXBTcmNzZXQgPSBcInNyY3NldFwiIGluIGltYWdlO1xuXHRwZi5zdXBTaXplcyA9IFwic2l6ZXNcIiBpbiBpbWFnZTtcblx0cGYuc3VwUGljdHVyZSA9ICEhd2luZG93LkhUTUxQaWN0dXJlRWxlbWVudDtcblxuXHQvLyBVQyBicm93c2VyIGRvZXMgY2xhaW0gdG8gc3VwcG9ydCBzcmNzZXQgYW5kIHBpY3R1cmUsIGJ1dCBub3Qgc2l6ZXMsXG5cdC8vIHRoaXMgZXh0ZW5kZWQgdGVzdCByZXZlYWxzIHRoZSBicm93c2VyIGRvZXMgc3VwcG9ydCBub3RoaW5nXG5cdGlmIChwZi5zdXBTcmNzZXQgJiYgcGYuc3VwUGljdHVyZSAmJiAhcGYuc3VwU2l6ZXMpIHtcblx0XHQoZnVuY3Rpb24oaW1hZ2UyKSB7XG5cdFx0XHRpbWFnZS5zcmNzZXQgPSBcImRhdGE6LGFcIjtcblx0XHRcdGltYWdlMi5zcmMgPSBcImRhdGE6LGFcIjtcblx0XHRcdHBmLnN1cFNyY3NldCA9IGltYWdlLmNvbXBsZXRlID09PSBpbWFnZTIuY29tcGxldGU7XG5cdFx0XHRwZi5zdXBQaWN0dXJlID0gcGYuc3VwU3Jjc2V0ICYmIHBmLnN1cFBpY3R1cmU7XG5cdFx0fSkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSk7XG5cdH1cblxuXHQvLyBTYWZhcmk5IGhhcyBiYXNpYyBzdXBwb3J0IGZvciBzaXplcywgYnV0IGRvZXMndCBleHBvc2UgdGhlIGBzaXplc2AgaWRsIGF0dHJpYnV0ZVxuXHRpZiAocGYuc3VwU3Jjc2V0ICYmICFwZi5zdXBTaXplcykge1xuXG5cdFx0KGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHdpZHRoMiA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQWdBQkFQQUFBUC8vL3dBQUFDSDVCQUFBQUFBQUxBQUFBQUFDQUFFQUFBSUNCQW9BT3c9PVwiO1xuXHRcdFx0dmFyIHdpZHRoMSA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcblx0XHRcdHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXHRcdFx0dmFyIHRlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHdpZHRoID0gaW1nLndpZHRoO1xuXG5cdFx0XHRcdGlmICh3aWR0aCA9PT0gMikge1xuXHRcdFx0XHRcdHBmLnN1cFNpemVzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFsd2F5c0NoZWNrV0Rlc2NyaXB0b3IgPSBwZi5zdXBTcmNzZXQgJiYgIXBmLnN1cFNpemVzO1xuXG5cdFx0XHRcdGlzU3VwcG9ydFRlc3RSZWFkeSA9IHRydWU7XG5cdFx0XHRcdC8vIGZvcmNlIGFzeW5jXG5cdFx0XHRcdHNldFRpbWVvdXQocGljdHVyZWZpbGwpO1xuXHRcdFx0fTtcblxuXHRcdFx0aW1nLm9ubG9hZCA9IHRlc3Q7XG5cdFx0XHRpbWcub25lcnJvciA9IHRlc3Q7XG5cdFx0XHRpbWcuc2V0QXR0cmlidXRlKFwic2l6ZXNcIiwgXCI5cHhcIik7XG5cblx0XHRcdGltZy5zcmNzZXQgPSB3aWR0aDEgKyBcIiAxdyxcIiArIHdpZHRoMiArIFwiIDl3XCI7XG5cdFx0XHRpbWcuc3JjID0gd2lkdGgxO1xuXHRcdH0pKCk7XG5cblx0fSBlbHNlIHtcblx0XHRpc1N1cHBvcnRUZXN0UmVhZHkgPSB0cnVlO1xuXHR9XG5cblx0Ly8gdXNpbmcgcGYucXNhIGluc3RlYWQgb2YgZG9tIHRyYXZlcnNpbmcgZG9lcyBzY2FsZSBtdWNoIGJldHRlcixcblx0Ly8gZXNwZWNpYWxseSBvbiBzaXRlcyBtaXhpbmcgcmVzcG9uc2l2ZSBhbmQgbm9uLXJlc3BvbnNpdmUgaW1hZ2VzXG5cdHBmLnNlbFNob3J0ID0gXCJwaWN0dXJlPmltZyxpbWdbc3Jjc2V0XVwiO1xuXHRwZi5zZWwgPSBwZi5zZWxTaG9ydDtcblx0cGYuY2ZnID0gY2ZnO1xuXG5cdC8qKlxuXHQgKiBTaG9ydGN1dCBwcm9wZXJ0eSBmb3IgYGRldmljZVBpeGVsUmF0aW9gICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqL1xuXHRwZi5EUFIgPSAoRFBSICB8fCAxICk7XG5cdHBmLnUgPSB1bml0cztcblxuXHQvLyBjb250YWluZXIgb2Ygc3VwcG9ydGVkIG1pbWUgdHlwZXMgdGhhdCBvbmUgbWlnaHQgbmVlZCB0byBxdWFsaWZ5IGJlZm9yZSB1c2luZ1xuXHRwZi50eXBlcyA9ICB0eXBlcztcblxuXHRwZi5zZXRTaXplID0gbm9vcDtcblxuXHQvKipcblx0ICogR2V0cyBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgYWJzb2x1dGUgVVJMXG5cdCAqIEBwYXJhbSBzcmNcblx0ICogQHJldHVybnMge1N0cmluZ30gYWJzb2x1dGUgVVJMXG5cdCAqL1xuXG5cdHBmLm1ha2VVcmwgPSBtZW1vaXplKGZ1bmN0aW9uKHNyYykge1xuXHRcdGFuY2hvci5ocmVmID0gc3JjO1xuXHRcdHJldHVybiBhbmNob3IuaHJlZjtcblx0fSk7XG5cblx0LyoqXG5cdCAqIEdldHMgYSBET00gZWxlbWVudCBvciBkb2N1bWVudCBhbmQgYSBzZWxjdG9yIGFuZCByZXR1cm5zIHRoZSBmb3VuZCBtYXRjaGVzXG5cdCAqIENhbiBiZSBleHRlbmRlZCB3aXRoIGpRdWVyeS9TaXp6bGUgZm9yIElFNyBzdXBwb3J0XG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqIEBwYXJhbSBzZWxcblx0ICogQHJldHVybnMge05vZGVMaXN0fEFycmF5fVxuXHQgKi9cblx0cGYucXNhID0gZnVuY3Rpb24oY29udGV4dCwgc2VsKSB7XG5cdFx0cmV0dXJuICggXCJxdWVyeVNlbGVjdG9yXCIgaW4gY29udGV4dCApID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkgOiBbXTtcblx0fTtcblxuXHQvKipcblx0ICogU2hvcnRjdXQgbWV0aG9kIGZvciBtYXRjaE1lZGlhICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqIHdldGhlciBuYXRpdmUgb3IgcGYubU1RIGlzIHVzZWQgd2lsbCBiZSBkZWNpZGVkIGxhenkgb24gZmlyc3QgY2FsbFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHBmLm1hdGNoZXNNZWRpYSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggd2luZG93Lm1hdGNoTWVkaWEgJiYgKG1hdGNoTWVkaWEoIFwiKG1pbi13aWR0aDogMC4xZW0pXCIgKSB8fCB7fSkubWF0Y2hlcyApIHtcblx0XHRcdHBmLm1hdGNoZXNNZWRpYSA9IGZ1bmN0aW9uKCBtZWRpYSApIHtcblx0XHRcdFx0cmV0dXJuICFtZWRpYSB8fCAoIG1hdGNoTWVkaWEoIG1lZGlhICkubWF0Y2hlcyApO1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGYubWF0Y2hlc01lZGlhID0gcGYubU1RO1xuXHRcdH1cblxuXHRcdHJldHVybiBwZi5tYXRjaGVzTWVkaWEuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBIHNpbXBsaWZpZWQgbWF0Y2hNZWRpYSBpbXBsZW1lbnRhdGlvbiBmb3IgSUU4IGFuZCBJRTlcblx0ICogaGFuZGxlcyBvbmx5IG1pbi13aWR0aC9tYXgtd2lkdGggd2l0aCBweCBvciBlbSB2YWx1ZXNcblx0ICogQHBhcmFtIG1lZGlhXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cGYubU1RID0gZnVuY3Rpb24oIG1lZGlhICkge1xuXHRcdHJldHVybiBtZWRpYSA/IGV2YWxDU1MobWVkaWEpIDogdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBsZW5ndGggaW4gY3NzIHBpeGVsIGZyb20gdGhlIGdpdmVuIHNvdXJjZVNpemVWYWx1ZVxuXHQgKiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLTMvI2xlbmd0aC12YWx1ZVxuXHQgKiBpbnRlbmRlZCBTcGVjIG1pc21hdGNoZXM6XG5cdCAqICogRG9lcyBub3QgY2hlY2sgZm9yIGludmFsaWQgdXNlIG9mIENTUyBmdW5jdGlvbnNcblx0ICogKiBEb2VzIGhhbmRsZSBhIGNvbXB1dGVkIGxlbmd0aCBvZiAwIHRoZSBzYW1lIGFzIGEgbmVnYXRpdmUgYW5kIHRoZXJlZm9yZSBpbnZhbGlkIHZhbHVlXG5cdCAqIEBwYXJhbSBzb3VyY2VTaXplVmFsdWVcblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdHBmLmNhbGNMZW5ndGggPSBmdW5jdGlvbiggc291cmNlU2l6ZVZhbHVlICkge1xuXG5cdFx0dmFyIHZhbHVlID0gZXZhbENTUyhzb3VyY2VTaXplVmFsdWUsIHRydWUpIHx8IGZhbHNlO1xuXHRcdGlmICh2YWx1ZSA8IDApIHtcblx0XHRcdHZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUYWtlcyBhIHR5cGUgc3RyaW5nIGFuZCBjaGVja3MgaWYgaXRzIHN1cHBvcnRlZFxuXHQgKi9cblxuXHRwZi5zdXBwb3J0c1R5cGUgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gKCB0eXBlICkgPyB0eXBlc1sgdHlwZSBdIDogdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogUGFyc2VzIGEgc291cmNlU2l6ZSBpbnRvIG1lZGlhQ29uZGl0aW9uIChtZWRpYSkgYW5kIHNvdXJjZVNpemVWYWx1ZSAobGVuZ3RoKVxuXHQgKiBAcGFyYW0gc291cmNlU2l6ZVN0clxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdHBmLnBhcnNlU2l6ZSA9IG1lbW9pemUoZnVuY3Rpb24oIHNvdXJjZVNpemVTdHIgKSB7XG5cdFx0dmFyIG1hdGNoID0gKCBzb3VyY2VTaXplU3RyIHx8IFwiXCIgKS5tYXRjaChyZWdTaXplKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVkaWE6IG1hdGNoICYmIG1hdGNoWzFdLFxuXHRcdFx0bGVuZ3RoOiBtYXRjaCAmJiBtYXRjaFsyXVxuXHRcdH07XG5cdH0pO1xuXG5cdHBmLnBhcnNlU2V0ID0gZnVuY3Rpb24oIHNldCApIHtcblx0XHRpZiAoICFzZXQuY2FuZHMgKSB7XG5cdFx0XHRzZXQuY2FuZHMgPSBwYXJzZVNyY3NldChzZXQuc3Jjc2V0LCBzZXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2V0LmNhbmRzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm5zIDFlbSBpbiBjc3MgcHggZm9yIGh0bWwvYm9keSBkZWZhdWx0IHNpemVcblx0ICogZnVuY3Rpb24gdGFrZW4gZnJvbSByZXNwb25kanNcblx0ICogQHJldHVybnMgeyp8bnVtYmVyfVxuXHQgKi9cblx0cGYuZ2V0RW1WYWx1ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBib2R5O1xuXHRcdGlmICggIWVtaW5weCAmJiAoYm9keSA9IGRvY3VtZW50LmJvZHkpICkge1xuXHRcdFx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRcdFx0b3JpZ2luYWxIVE1MQ1NTID0gZG9jRWxlbS5zdHlsZS5jc3NUZXh0LFxuXHRcdFx0XHRvcmlnaW5hbEJvZHlDU1MgPSBib2R5LnN0eWxlLmNzc1RleHQ7XG5cblx0XHRcdGRpdi5zdHlsZS5jc3NUZXh0ID0gYmFzZVN0eWxlO1xuXG5cdFx0XHQvLyAxZW0gaW4gYSBtZWRpYSBxdWVyeSBpcyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgZm9udCBzaXplIG9mIHRoZSBicm93c2VyXG5cdFx0XHQvLyByZXNldCBkb2NFbGVtIGFuZCBib2R5IHRvIGVuc3VyZSB0aGUgY29ycmVjdCB2YWx1ZSBpcyByZXR1cm5lZFxuXHRcdFx0ZG9jRWxlbS5zdHlsZS5jc3NUZXh0ID0gZnNDc3M7XG5cdFx0XHRib2R5LnN0eWxlLmNzc1RleHQgPSBmc0NzcztcblxuXHRcdFx0Ym9keS5hcHBlbmRDaGlsZCggZGl2ICk7XG5cdFx0XHRlbWlucHggPSBkaXYub2Zmc2V0V2lkdGg7XG5cdFx0XHRib2R5LnJlbW92ZUNoaWxkKCBkaXYgKTtcblxuXHRcdFx0Ly9hbHNvIHVwZGF0ZSBlbWlucHggYmVmb3JlIHJldHVybmluZ1xuXHRcdFx0ZW1pbnB4ID0gcGFyc2VGbG9hdCggZW1pbnB4LCAxMCApO1xuXG5cdFx0XHQvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdGRvY0VsZW0uc3R5bGUuY3NzVGV4dCA9IG9yaWdpbmFsSFRNTENTUztcblx0XHRcdGJvZHkuc3R5bGUuY3NzVGV4dCA9IG9yaWdpbmFsQm9keUNTUztcblxuXHRcdH1cblx0XHRyZXR1cm4gZW1pbnB4IHx8IDE2O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUYWtlcyBhIHN0cmluZyBvZiBzaXplcyBhbmQgcmV0dXJucyB0aGUgd2lkdGggaW4gcGl4ZWxzIGFzIGEgbnVtYmVyXG5cdCAqL1xuXHRwZi5jYWxjTGlzdExlbmd0aCA9IGZ1bmN0aW9uKCBzb3VyY2VTaXplTGlzdFN0ciApIHtcblx0XHQvLyBTcGxpdCB1cCBzb3VyY2Ugc2l6ZSBsaXN0LCBpZSAoIG1heC13aWR0aDogMzBlbSApIDEwMCUsICggbWF4LXdpZHRoOiA1MGVtICkgNTAlLCAzMyVcblx0XHQvL1xuXHRcdC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKG1pbi13aWR0aDozMGVtKSBjYWxjKDMwJSAtIDE1cHgpXG5cdFx0aWYgKCAhKHNvdXJjZVNpemVMaXN0U3RyIGluIHNpemVMZW5ndGhDYWNoZSkgfHwgY2ZnLnVUICkge1xuXHRcdFx0dmFyIHdpbm5pbmdMZW5ndGggPSBwZi5jYWxjTGVuZ3RoKCBwYXJzZVNpemVzKCBzb3VyY2VTaXplTGlzdFN0ciApICk7XG5cblx0XHRcdHNpemVMZW5ndGhDYWNoZVsgc291cmNlU2l6ZUxpc3RTdHIgXSA9ICF3aW5uaW5nTGVuZ3RoID8gdW5pdHMud2lkdGggOiB3aW5uaW5nTGVuZ3RoO1xuXHRcdH1cblxuXHRcdHJldHVybiBzaXplTGVuZ3RoQ2FjaGVbIHNvdXJjZVNpemVMaXN0U3RyIF07XG5cdH07XG5cblx0LyoqXG5cdCAqIFRha2VzIGEgY2FuZGlkYXRlIG9iamVjdCB3aXRoIGEgc3Jjc2V0IHByb3BlcnR5IGluIHRoZSBmb3JtIG9mIHVybC9cblx0ICogZXguIFwiaW1hZ2VzL3BpYy1tZWRpdW0ucG5nIDF4LCBpbWFnZXMvcGljLW1lZGl1bS0yeC5wbmcgMnhcIiBvclxuXHQgKiAgICAgXCJpbWFnZXMvcGljLW1lZGl1bS5wbmcgNDAwdywgaW1hZ2VzL3BpYy1tZWRpdW0tMngucG5nIDgwMHdcIiBvclxuXHQgKiAgICAgXCJpbWFnZXMvcGljLXNtYWxsLnBuZ1wiXG5cdCAqIEdldCBhbiBhcnJheSBvZiBpbWFnZSBjYW5kaWRhdGVzIGluIHRoZSBmb3JtIG9mXG5cdCAqICAgICAge3VybDogXCIvZm9vL2Jhci5wbmdcIiwgcmVzb2x1dGlvbjogMX1cblx0ICogd2hlcmUgcmVzb2x1dGlvbiBpcyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLTMvI3Jlc29sdXRpb24tdmFsdWVcblx0ICogSWYgc2l6ZXMgaXMgc3BlY2lmaWVkLCByZXMgaXMgY2FsY3VsYXRlZFxuXHQgKi9cblx0cGYuc2V0UmVzID0gZnVuY3Rpb24oIHNldCApIHtcblx0XHR2YXIgY2FuZGlkYXRlcztcblx0XHRpZiAoIHNldCApIHtcblxuXHRcdFx0Y2FuZGlkYXRlcyA9IHBmLnBhcnNlU2V0KCBzZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsZW4gPSBjYW5kaWRhdGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRzZXRSZXNvbHV0aW9uKCBjYW5kaWRhdGVzWyBpIF0sIHNldC5zaXplcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FuZGlkYXRlcztcblx0fTtcblxuXHRwZi5zZXRSZXMucmVzID0gc2V0UmVzb2x1dGlvbjtcblxuXHRwZi5hcHBseVNldENhbmRpZGF0ZSA9IGZ1bmN0aW9uKCBjYW5kaWRhdGVzLCBpbWcgKSB7XG5cdFx0aWYgKCAhY2FuZGlkYXRlcy5sZW5ndGggKSB7cmV0dXJuO31cblx0XHR2YXIgY2FuZGlkYXRlLFxuXHRcdFx0aSxcblx0XHRcdGosXG5cdFx0XHRsZW5ndGgsXG5cdFx0XHRiZXN0Q2FuZGlkYXRlLFxuXHRcdFx0Y3VyU3JjLFxuXHRcdFx0Y3VyQ2FuLFxuXHRcdFx0Y2FuZGlkYXRlU3JjLFxuXHRcdFx0YWJvcnRDdXJTcmM7XG5cblx0XHR2YXIgaW1hZ2VEYXRhID0gaW1nWyBwZi5ucyBdO1xuXHRcdHZhciBkcHIgPSBwZi5EUFI7XG5cblx0XHRjdXJTcmMgPSBpbWFnZURhdGEuY3VyU3JjIHx8IGltZ1tjdXJTcmNQcm9wXTtcblxuXHRcdGN1ckNhbiA9IGltYWdlRGF0YS5jdXJDYW4gfHwgc2V0U3JjVG9DdXIoaW1nLCBjdXJTcmMsIGNhbmRpZGF0ZXNbMF0uc2V0KTtcblxuXHRcdC8vIGlmIHdlIGhhdmUgYSBjdXJyZW50IHNvdXJjZSwgd2UgbWlnaHQgZWl0aGVyIGJlY29tZSBsYXp5IG9yIGdpdmUgdGhpcyBzb3VyY2Ugc29tZSBhZHZhbnRhZ2Vcblx0XHRpZiAoIGN1ckNhbiAmJiBjdXJDYW4uc2V0ID09PSBjYW5kaWRhdGVzWyAwIF0uc2V0ICkge1xuXG5cdFx0XHQvLyBpZiBicm93c2VyIGNhbiBhYm9ydCBpbWFnZSByZXF1ZXN0IGFuZCB0aGUgaW1hZ2UgaGFzIGEgaGlnaGVyIHBpeGVsIGRlbnNpdHkgdGhhbiBuZWVkZWRcblx0XHRcdC8vIGFuZCB0aGlzIGltYWdlIGlzbid0IGRvd25sb2FkZWQgeWV0LCB3ZSBza2lwIG5leHQgcGFydCBhbmQgdHJ5IHRvIHNhdmUgYmFuZHdpZHRoXG5cdFx0XHRhYm9ydEN1clNyYyA9IChzdXBwb3J0QWJvcnQgJiYgIWltZy5jb21wbGV0ZSAmJiBjdXJDYW4ucmVzIC0gMC4xID4gZHByKTtcblxuXHRcdFx0aWYgKCAhYWJvcnRDdXJTcmMgKSB7XG5cdFx0XHRcdGN1ckNhbi5jYWNoZWQgPSB0cnVlO1xuXG5cdFx0XHRcdC8vIGlmIGN1cnJlbnQgY2FuZGlkYXRlIGlzIFwiYmVzdFwiLCBcImJldHRlclwiIG9yIFwib2theVwiLFxuXHRcdFx0XHQvLyBzZXQgaXQgdG8gYmVzdENhbmRpZGF0ZVxuXHRcdFx0XHRpZiAoIGN1ckNhbi5yZXMgPj0gZHByICkge1xuXHRcdFx0XHRcdGJlc3RDYW5kaWRhdGUgPSBjdXJDYW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFiZXN0Q2FuZGlkYXRlICkge1xuXG5cdFx0XHRjYW5kaWRhdGVzLnNvcnQoIGFzY2VuZGluZ1NvcnQgKTtcblxuXHRcdFx0bGVuZ3RoID0gY2FuZGlkYXRlcy5sZW5ndGg7XG5cdFx0XHRiZXN0Q2FuZGlkYXRlID0gY2FuZGlkYXRlc1sgbGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRjYW5kaWRhdGUgPSBjYW5kaWRhdGVzWyBpIF07XG5cdFx0XHRcdGlmICggY2FuZGlkYXRlLnJlcyA+PSBkcHIgKSB7XG5cdFx0XHRcdFx0aiA9IGkgLSAxO1xuXG5cdFx0XHRcdFx0Ly8gd2UgaGF2ZSBmb3VuZCB0aGUgcGVyZmVjdCBjYW5kaWRhdGUsXG5cdFx0XHRcdFx0Ly8gYnV0IGxldCdzIGltcHJvdmUgdGhpcyBhIGxpdHRsZSBiaXQgd2l0aCBzb21lIGFzc3VtcHRpb25zIDstKVxuXHRcdFx0XHRcdGlmIChjYW5kaWRhdGVzWyBqIF0gJiZcblx0XHRcdFx0XHRcdChhYm9ydEN1clNyYyB8fCBjdXJTcmMgIT09IHBmLm1ha2VVcmwoIGNhbmRpZGF0ZS51cmwgKSkgJiZcblx0XHRcdFx0XHRcdGNob29zZUxvd1JlcyhjYW5kaWRhdGVzWyBqIF0ucmVzLCBjYW5kaWRhdGUucmVzLCBkcHIsIGNhbmRpZGF0ZXNbIGogXS5jYWNoZWQpKSB7XG5cblx0XHRcdFx0XHRcdGJlc3RDYW5kaWRhdGUgPSBjYW5kaWRhdGVzWyBqIF07XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmVzdENhbmRpZGF0ZSA9IGNhbmRpZGF0ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGJlc3RDYW5kaWRhdGUgKSB7XG5cblx0XHRcdGNhbmRpZGF0ZVNyYyA9IHBmLm1ha2VVcmwoIGJlc3RDYW5kaWRhdGUudXJsICk7XG5cblx0XHRcdGltYWdlRGF0YS5jdXJTcmMgPSBjYW5kaWRhdGVTcmM7XG5cdFx0XHRpbWFnZURhdGEuY3VyQ2FuID0gYmVzdENhbmRpZGF0ZTtcblxuXHRcdFx0aWYgKCBjYW5kaWRhdGVTcmMgIT09IGN1clNyYyApIHtcblx0XHRcdFx0cGYuc2V0U3JjKCBpbWcsIGJlc3RDYW5kaWRhdGUgKTtcblx0XHRcdH1cblx0XHRcdHBmLnNldFNpemUoIGltZyApO1xuXHRcdH1cblx0fTtcblxuXHRwZi5zZXRTcmMgPSBmdW5jdGlvbiggaW1nLCBiZXN0Q2FuZGlkYXRlICkge1xuXHRcdHZhciBvcmlnV2lkdGg7XG5cdFx0aW1nLnNyYyA9IGJlc3RDYW5kaWRhdGUudXJsO1xuXG5cdFx0Ly8gYWx0aG91Z2ggdGhpcyBpcyBhIHNwZWNpZmljIFNhZmFyaSBpc3N1ZSwgd2UgZG9uJ3Qgd2FudCB0byB0YWtlIHRvbyBtdWNoIGRpZmZlcmVudCBjb2RlIHBhdGhzXG5cdFx0aWYgKCBiZXN0Q2FuZGlkYXRlLnNldC50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIiApIHtcblx0XHRcdG9yaWdXaWR0aCA9IGltZy5zdHlsZS53aWR0aDtcblx0XHRcdGltZy5zdHlsZS53aWR0aCA9IChpbWcub2Zmc2V0V2lkdGggKyAxKSArIFwicHhcIjtcblxuXHRcdFx0Ly8gbmV4dCBsaW5lIG9ubHkgc2hvdWxkIHRyaWdnZXIgYSByZXBhaW50XG5cdFx0XHQvLyBpZi4uLiBpcyBvbmx5IGRvbmUgdG8gdHJpY2sgZGVhZCBjb2RlIHJlbW92YWxcblx0XHRcdGlmICggaW1nLm9mZnNldFdpZHRoICsgMSApIHtcblx0XHRcdFx0aW1nLnN0eWxlLndpZHRoID0gb3JpZ1dpZHRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRwZi5nZXRTZXQgPSBmdW5jdGlvbiggaW1nICkge1xuXHRcdHZhciBpLCBzZXQsIHN1cHBvcnRzVHlwZTtcblx0XHR2YXIgbWF0Y2ggPSBmYWxzZTtcblx0XHR2YXIgc2V0cyA9IGltZyBbIHBmLm5zIF0uc2V0cztcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgc2V0cy5sZW5ndGggJiYgIW1hdGNoOyBpKysgKSB7XG5cdFx0XHRzZXQgPSBzZXRzW2ldO1xuXG5cdFx0XHRpZiAoICFzZXQuc3Jjc2V0IHx8ICFwZi5tYXRjaGVzTWVkaWEoIHNldC5tZWRpYSApIHx8ICEoc3VwcG9ydHNUeXBlID0gcGYuc3VwcG9ydHNUeXBlKCBzZXQudHlwZSApKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3VwcG9ydHNUeXBlID09PSBcInBlbmRpbmdcIiApIHtcblx0XHRcdFx0c2V0ID0gc3VwcG9ydHNUeXBlO1xuXHRcdFx0fVxuXG5cdFx0XHRtYXRjaCA9IHNldDtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaDtcblx0fTtcblxuXHRwZi5wYXJzZVNldHMgPSBmdW5jdGlvbiggZWxlbWVudCwgcGFyZW50LCBvcHRpb25zICkge1xuXHRcdHZhciBzcmNzZXRBdHRyaWJ1dGUsIGltYWdlU2V0LCBpc1dEZXNjcmlwb3IsIHNyY3NldFBhcnNlZDtcblxuXHRcdHZhciBoYXNQaWN0dXJlID0gcGFyZW50ICYmIHBhcmVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlBJQ1RVUkVcIjtcblx0XHR2YXIgaW1hZ2VEYXRhID0gZWxlbWVudFsgcGYubnMgXTtcblxuXHRcdGlmICggaW1hZ2VEYXRhLnNyYyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuc3JjICkge1xuXHRcdFx0aW1hZ2VEYXRhLnNyYyA9IGdldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgXCJzcmNcIiApO1xuXHRcdFx0aWYgKCBpbWFnZURhdGEuc3JjICkge1xuXHRcdFx0XHRzZXRJbWdBdHRyLmNhbGwoIGVsZW1lbnQsIHNyY0F0dHIsIGltYWdlRGF0YS5zcmMgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZUltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3JjQXR0ciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggaW1hZ2VEYXRhLnNyY3NldCA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuc3Jjc2V0IHx8ICFwZi5zdXBTcmNzZXQgfHwgZWxlbWVudC5zcmNzZXQgKSB7XG5cdFx0XHRzcmNzZXRBdHRyaWJ1dGUgPSBnZXRJbWdBdHRyLmNhbGwoIGVsZW1lbnQsIFwic3Jjc2V0XCIgKTtcblx0XHRcdGltYWdlRGF0YS5zcmNzZXQgPSBzcmNzZXRBdHRyaWJ1dGU7XG5cdFx0XHRzcmNzZXRQYXJzZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGltYWdlRGF0YS5zZXRzID0gW107XG5cblx0XHRpZiAoIGhhc1BpY3R1cmUgKSB7XG5cdFx0XHRpbWFnZURhdGEucGljID0gdHJ1ZTtcblx0XHRcdGdldEFsbFNvdXJjZUVsZW1lbnRzKCBwYXJlbnQsIGltYWdlRGF0YS5zZXRzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpbWFnZURhdGEuc3Jjc2V0ICkge1xuXHRcdFx0aW1hZ2VTZXQgPSB7XG5cdFx0XHRcdHNyY3NldDogaW1hZ2VEYXRhLnNyY3NldCxcblx0XHRcdFx0c2l6ZXM6IGdldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgXCJzaXplc1wiIClcblx0XHRcdH07XG5cblx0XHRcdGltYWdlRGF0YS5zZXRzLnB1c2goIGltYWdlU2V0ICk7XG5cblx0XHRcdGlzV0Rlc2NyaXBvciA9IChhbHdheXNDaGVja1dEZXNjcmlwdG9yIHx8IGltYWdlRGF0YS5zcmMpICYmIHJlZ1dEZXNjLnRlc3QoaW1hZ2VEYXRhLnNyY3NldCB8fCBcIlwiKTtcblxuXHRcdFx0Ly8gYWRkIG5vcm1hbCBzcmMgYXMgY2FuZGlkYXRlLCBpZiBzb3VyY2UgaGFzIG5vIHcgZGVzY3JpcHRvclxuXHRcdFx0aWYgKCAhaXNXRGVzY3JpcG9yICYmIGltYWdlRGF0YS5zcmMgJiYgIWdldENhbmRpZGF0ZUZvclNyYyhpbWFnZURhdGEuc3JjLCBpbWFnZVNldCkgJiYgIWltYWdlU2V0LmhhczF4ICkge1xuXHRcdFx0XHRpbWFnZVNldC5zcmNzZXQgKz0gXCIsIFwiICsgaW1hZ2VEYXRhLnNyYztcblx0XHRcdFx0aW1hZ2VTZXQuY2FuZHMucHVzaCh7XG5cdFx0XHRcdFx0dXJsOiBpbWFnZURhdGEuc3JjLFxuXHRcdFx0XHRcdGQ6IDEsXG5cdFx0XHRcdFx0c2V0OiBpbWFnZVNldFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGltYWdlRGF0YS5zcmMgKSB7XG5cdFx0XHRpbWFnZURhdGEuc2V0cy5wdXNoKCB7XG5cdFx0XHRcdHNyY3NldDogaW1hZ2VEYXRhLnNyYyxcblx0XHRcdFx0c2l6ZXM6IG51bGxcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpbWFnZURhdGEuY3VyQ2FuID0gbnVsbDtcblx0XHRpbWFnZURhdGEuY3VyU3JjID0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gaWYgaW1nIGhhcyBwaWN0dXJlIG9yIHRoZSBzcmNzZXQgd2FzIHJlbW92ZWQgb3IgaGFzIGEgc3Jjc2V0IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNyY3NldCBhdCBhbGxcblx0XHQvLyBvciBoYXMgYSB3IGRlc2NyaXB0b3IgKGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNpemVzKSBzZXQgc3VwcG9ydCB0byBmYWxzZSB0byBldmFsdWF0ZVxuXHRcdGltYWdlRGF0YS5zdXBwb3J0ZWQgPSAhKCBoYXNQaWN0dXJlIHx8ICggaW1hZ2VTZXQgJiYgIXBmLnN1cFNyY3NldCApIHx8IChpc1dEZXNjcmlwb3IgJiYgIXBmLnN1cFNpemVzKSApO1xuXG5cdFx0aWYgKCBzcmNzZXRQYXJzZWQgJiYgcGYuc3VwU3Jjc2V0ICYmICFpbWFnZURhdGEuc3VwcG9ydGVkICkge1xuXHRcdFx0aWYgKCBzcmNzZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdHNldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3Jjc2V0QXR0ciwgc3Jjc2V0QXR0cmlidXRlICk7XG5cdFx0XHRcdGVsZW1lbnQuc3Jjc2V0ID0gXCJcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZUltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3Jjc2V0QXR0ciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbWFnZURhdGEuc3VwcG9ydGVkICYmICFpbWFnZURhdGEuc3Jjc2V0ICYmICgoIWltYWdlRGF0YS5zcmMgJiYgZWxlbWVudC5zcmMpIHx8ICBlbGVtZW50LnNyYyAhPT0gcGYubWFrZVVybChpbWFnZURhdGEuc3JjKSkpIHtcblx0XHRcdGlmIChpbWFnZURhdGEuc3JjID09PSBudWxsKSB7XG5cdFx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5zcmMgPSBpbWFnZURhdGEuc3JjO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGltYWdlRGF0YS5wYXJzZWQgPSB0cnVlO1xuXHR9O1xuXG5cdHBmLmZpbGxJbWcgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cdFx0dmFyIGltYWdlRGF0YTtcblx0XHR2YXIgZXh0cmVtZSA9IG9wdGlvbnMucmVzZWxlY3QgfHwgb3B0aW9ucy5yZWV2YWx1YXRlO1xuXG5cdFx0Ly8gZXhwYW5kbyBmb3IgY2FjaGluZyBkYXRhIG9uIHRoZSBpbWdcblx0XHRpZiAoICFlbGVtZW50WyBwZi5ucyBdICkge1xuXHRcdFx0ZWxlbWVudFsgcGYubnMgXSA9IHt9O1xuXHRcdH1cblxuXHRcdGltYWdlRGF0YSA9IGVsZW1lbnRbIHBmLm5zIF07XG5cblx0XHQvLyBpZiB0aGUgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZCwgc2tpcCBpdFxuXHRcdC8vIHVubGVzcyBgb3B0aW9ucy5yZWV2YWx1YXRlYCBpcyBzZXQgdG8gdHJ1ZSAoIHRoaXMsIGZvciBleGFtcGxlLFxuXHRcdC8vIGlzIHNldCB0byB0cnVlIHdoZW4gcnVubmluZyBgcGljdHVyZWZpbGxgIG9uIGByZXNpemVgICkuXG5cdFx0aWYgKCAhZXh0cmVtZSAmJiBpbWFnZURhdGEuZXZhbGVkID09PSBldmFsSWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhaW1hZ2VEYXRhLnBhcnNlZCB8fCBvcHRpb25zLnJlZXZhbHVhdGUgKSB7XG5cdFx0XHRwZi5wYXJzZVNldHMoIGVsZW1lbnQsIGVsZW1lbnQucGFyZW50Tm9kZSwgb3B0aW9ucyApO1xuXHRcdH1cblxuXHRcdGlmICggIWltYWdlRGF0YS5zdXBwb3J0ZWQgKSB7XG5cdFx0XHRhcHBseUJlc3RDYW5kaWRhdGUoIGVsZW1lbnQgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW1hZ2VEYXRhLmV2YWxlZCA9IGV2YWxJZDtcblx0XHR9XG5cdH07XG5cblx0cGYuc2V0dXBSdW4gPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoICFhbHJlYWR5UnVuIHx8IGlzVndEaXJ0eSB8fCAoRFBSICE9PSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKSB7XG5cdFx0XHR1cGRhdGVNZXRyaWNzKCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIElmIHBpY3R1cmUgaXMgc3VwcG9ydGVkLCB3ZWxsLCB0aGF0J3MgYXdlc29tZS5cblx0aWYgKCBwZi5zdXBQaWN0dXJlICkge1xuXHRcdHBpY3R1cmVmaWxsID0gbm9vcDtcblx0XHRwZi5maWxsSW1nID0gbm9vcDtcblx0fSBlbHNlIHtcblxuXHRcdCAvLyBTZXQgdXAgcGljdHVyZSBwb2x5ZmlsbCBieSBwb2xsaW5nIHRoZSBkb2N1bWVudFxuXHRcdChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpc0RvbVJlYWR5O1xuXHRcdFx0dmFyIHJlZ1JlYWR5ID0gd2luZG93LmF0dGFjaEV2ZW50ID8gL2QkfF5jLyA6IC9kJHxeY3xeaS87XG5cblx0XHRcdHZhciBydW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlIHx8IFwiXCI7XG5cblx0XHRcdFx0dGltZXJJZCA9IHNldFRpbWVvdXQocnVuLCByZWFkeVN0YXRlID09PSBcImxvYWRpbmdcIiA/IDIwMCA6ICA5OTkpO1xuXHRcdFx0XHRpZiAoIGRvY3VtZW50LmJvZHkgKSB7XG5cdFx0XHRcdFx0cGYuZmlsbEltZ3MoKTtcblx0XHRcdFx0XHRpc0RvbVJlYWR5ID0gaXNEb21SZWFkeSB8fCByZWdSZWFkeS50ZXN0KHJlYWR5U3RhdGUpO1xuXHRcdFx0XHRcdGlmICggaXNEb21SZWFkeSApIHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dCggdGltZXJJZCApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGltZXJJZCA9IHNldFRpbWVvdXQocnVuLCBkb2N1bWVudC5ib2R5ID8gOSA6IDk5KTtcblxuXHRcdFx0Ly8gQWxzbyBhdHRhY2ggcGljdHVyZWZpbGwgb24gcmVzaXplIGFuZCByZWFkeXN0YXRlY2hhbmdlXG5cdFx0XHQvLyBodHRwOi8vbW9kZXJuamF2YXNjcmlwdC5ibG9nc3BvdC5jb20vMjAxMy8wOC9idWlsZGluZy1iZXR0ZXItZGVib3VuY2UuaHRtbFxuXHRcdFx0dmFyIGRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCkge1xuXHRcdFx0XHR2YXIgdGltZW91dCwgdGltZXN0YW1wO1xuXHRcdFx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgbGFzdCA9IChuZXcgRGF0ZSgpKSAtIHRpbWVzdGFtcDtcblxuXHRcdFx0XHRcdGlmIChsYXN0IDwgd2FpdCkge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRcdFx0XHRmdW5jKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0XHRcdFx0aWYgKCF0aW1lb3V0KSB7XG5cdFx0XHRcdFx0XHR0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblx0XHRcdHZhciBsYXN0Q2xpZW50V2lkdGggPSBkb2NFbGVtLmNsaWVudEhlaWdodDtcblx0XHRcdHZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpc1Z3RGlydHkgPSBNYXRoLm1heCh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwLCBkb2NFbGVtLmNsaWVudFdpZHRoKSAhPT0gdW5pdHMud2lkdGggfHwgZG9jRWxlbS5jbGllbnRIZWlnaHQgIT09IGxhc3RDbGllbnRXaWR0aDtcblx0XHRcdFx0bGFzdENsaWVudFdpZHRoID0gZG9jRWxlbS5jbGllbnRIZWlnaHQ7XG5cdFx0XHRcdGlmICggaXNWd0RpcnR5ICkge1xuXHRcdFx0XHRcdHBmLmZpbGxJbWdzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdG9uKCB3aW5kb3csIFwicmVzaXplXCIsIGRlYm91bmNlKG9uUmVzaXplLCA5OSApICk7XG5cdFx0XHRvbiggZG9jdW1lbnQsIFwicmVhZHlzdGF0ZWNoYW5nZVwiLCBydW4gKTtcblx0XHR9KSgpO1xuXHR9XG5cblx0cGYucGljdHVyZWZpbGwgPSBwaWN0dXJlZmlsbDtcblx0Ly91c2UgdGhpcyBpbnRlcm5hbGx5IGZvciBlYXN5IG1vbmtleSBwYXRjaGluZy9wZXJmb3JtYW5jZSB0ZXN0aW5nXG5cdHBmLmZpbGxJbWdzID0gcGljdHVyZWZpbGw7XG5cdHBmLnRlYXJkb3duUnVuID0gbm9vcDtcblxuXHQvKiBleHBvc2UgbWV0aG9kcyBmb3IgdGVzdGluZyAqL1xuXHRwaWN0dXJlZmlsbC5fID0gcGY7XG5cblx0d2luZG93LnBpY3R1cmVmaWxsQ0ZHID0ge1xuXHRcdHBmOiBwZixcblx0XHRwdXNoOiBmdW5jdGlvbihhcmdzKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdGlmICh0eXBlb2YgcGZbbmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRwZltuYW1lXS5hcHBseShwZiwgYXJncyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjZmdbbmFtZV0gPSBhcmdzWzBdO1xuXHRcdFx0XHRpZiAoYWxyZWFkeVJ1bikge1xuXHRcdFx0XHRcdHBmLmZpbGxJbWdzKCB7IHJlc2VsZWN0OiB0cnVlIH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR3aGlsZSAoc2V0T3B0aW9ucyAmJiBzZXRPcHRpb25zLmxlbmd0aCkge1xuXHRcdHdpbmRvdy5waWN0dXJlZmlsbENGRy5wdXNoKHNldE9wdGlvbnMuc2hpZnQoKSk7XG5cdH1cblxuXHQvKiBleHBvc2UgcGljdHVyZWZpbGwgKi9cblx0d2luZG93LnBpY3R1cmVmaWxsID0gcGljdHVyZWZpbGw7XG5cblx0LyogZXhwb3NlIHBpY3R1cmVmaWxsICovXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gQ29tbW9uSlMsIGp1c3QgZXhwb3J0XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBwaWN0dXJlZmlsbDtcblx0fSBlbHNlIGlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdFx0Ly8gQU1EIHN1cHBvcnRcblx0XHRkZWZpbmUoIFwicGljdHVyZWZpbGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBwaWN0dXJlZmlsbDsgfSApO1xuXHR9XG5cblx0Ly8gSUU4IGV2YWxzIHRoaXMgc3luYywgc28gaXQgbXVzdCBiZSB0aGUgbGFzdCB0aGluZyB3ZSBkb1xuXHRpZiAoICFwZi5zdXBQaWN0dXJlICkge1xuXHRcdHR5cGVzWyBcImltYWdlL3dlYnBcIiBdID0gZGV0ZWN0VHlwZVN1cHBvcnQoXCJpbWFnZS93ZWJwXCIsIFwiZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmtvQUFBQlhSVUpRVmxBNFdBb0FBQUFRQUFBQUFBQUFBQUFBUVV4UVNBd0FBQUFCQnhBUi9ROUVSUDhEQUFCV1VEZ2dHQUFBQURBQkFKMEJLZ0VBQVFBREFEUWxwQUFEY0FEKysvMVFBQT09XCIgKTtcblx0fVxuXG59ICkoIHdpbmRvdywgZG9jdW1lbnQgKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///7229
/** @license React v17.0.1
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/*
Modernizr 3.0.0pre (Custom Build) | MIT
*/
var aa = __webpack_require__(7294),
m = __webpack_require__(7418),
r = __webpack_require__(3840);
function y(a) {
for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++) b += "&args[]=" + encodeURIComponent(arguments[c]);
return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."
}
if (!aa) throw Error(y(227));
var ba = new Set,
ca = {};
function da(a, b) {
ea(a, b);
ea(a + "Capture", b)
}
function ea(a, b) {
ca[a] = b;
for (a = 0; a < b.length; a++) ba.add(b[a])
}
var fa = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement),
ha = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,
ia = Object.prototype.hasOwnProperty,
ja = {},
ka = {};
function la(a) {
if (ia.call(ka, a)) return !0;
if (ia.call(ja, a)) return !1;
if (ha.test(a)) return ka[a] = !0;
ja[a] = !0;
return !1
}
function ma(a, b, c, d) {
if (null !== c && 0 === c.type) return !1;
switch (typeof b) {
case "function":
case "symbol":
return !0;
case "boolean":
if (d) return !1;
if (null !== c) return !c.acceptsBooleans;
a = a.toLowerCase().slice(0, 5);
return "data-" !== a && "aria-" !== a;
default:
return !1
}
}
function na(a, b, c, d) {
if (null === b || "undefined" === typeof b || ma(a, b, c, d)) return !0;
if (d) return !1;
if (null !== c) switch (c.type) {
case 3:
return !b;
case 4:
return !1 === b;
case 5:
return isNaN(b);
case 6:
return isNaN(b) || 1 > b
}
return !1
}
function B(a, b, c, d, e, f, g) {
this.acceptsBooleans = 2 === b || 3 === b || 4 === b;
this.attributeName = d;
this.attributeNamespace = e;
this.mustUseProperty = c;
this.propertyName = a;
this.type = b;
this.sanitizeURL = f;
this.removeEmptyString = g
}
var D = {};
"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) {
D[a] = new B(a, 0, !1, a, null, !1, !1)
});
[
["acceptCharset", "accept-charset"],
["className", "class"],
["htmlFor", "for"],
["httpEquiv", "http-equiv"]
].forEach(function(a) {
var b = a[0];
D[b] = new B(b, 1, !1, a[1], null, !1, !1)
});
["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) {
D[a] = new B(a, 2, !1, a.toLowerCase(), null, !1, !1)
});
["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) {
D[a] = new B(a, 2, !1, a, null, !1, !1)
});
"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) {
D[a] = new B(a, 3, !1, a.toLowerCase(), null, !1, !1)
});
["checked", "multiple", "muted", "selected"].forEach(function(a) {
D[a] = new B(a, 3, !0, a, null, !1, !1)
});
["capture", "download"].forEach(function(a) {
D[a] = new B(a, 4, !1, a, null, !1, !1)
});
["cols", "rows", "size", "span"].forEach(function(a) {
D[a] = new B(a, 6, !1, a, null, !1, !1)
});
["rowSpan", "start"].forEach(function(a) {
D[a] = new B(a, 5, !1, a.toLowerCase(), null, !1, !1)
});
var oa = /[\-:]([a-z])/g;
function pa(a) {
return a[1].toUpperCase()
}
"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) {
var b = a.replace(oa,
pa);
D[b] = new B(b, 1, !1, a, null, !1, !1)
});
"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) {
var b = a.replace(oa, pa);
D[b] = new B(b, 1, !1, a, "http://www.w3.org/1999/xlink", !1, !1)
});
["xml:base", "xml:lang", "xml:space"].forEach(function(a) {
var b = a.replace(oa, pa);
D[b] = new B(b, 1, !1, a, "http://www.w3.org/XML/1998/namespace", !1, !1)
});
["tabIndex", "crossOrigin"].forEach(function(a) {
D[a] = new B(a, 1, !1, a.toLowerCase(), null, !1, !1)
});
D.xlinkHref = new B("xlinkHref", 1, !1, "xlink:href", "http://www.w3.org/1999/xlink", !0, !1);
["src", "href", "action", "formAction"].forEach(function(a) {
D[a] = new B(a, 1, !1, a.toLowerCase(), null, !0, !0)
});
function qa(a, b, c, d) {
var e = D.hasOwnProperty(b) ? D[b] : null;
var f = null !== e ? 0 === e.type : d ? !1 : !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1] ? !1 : !0;
f || (na(b, c, e, d) && (c = null), d || null === e ? la(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? !1 : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && !0 === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))))
}
var ra = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
sa = 60103,
ta = 60106,
ua = 60107,
wa = 60108,
xa = 60114,
ya = 60109,
za = 60110,
Aa = 60112,
Ba = 60113,
Ca = 60120,
Da = 60115,
Ea = 60116,
Fa = 60121,
Ga = 60128,
Ha = 60129,
Ia = 60130,
Ja = 60131;
if ("function" === typeof Symbol && Symbol.for) {
var E = Symbol.for;
sa = E("react.element");
ta = E("react.portal");
ua = E("react.fragment");
wa = E("react.strict_mode");
xa = E("react.profiler");
ya = E("react.provider");
za = E("react.context");
Aa = E("react.forward_ref");
Ba = E("react.suspense");
Ca = E("react.suspense_list");
Da = E("react.memo");
Ea = E("react.lazy");
Fa = E("react.block");
E("react.scope");
Ga = E("react.opaque.id");
Ha = E("react.debug_trace_mode");
Ia = E("react.offscreen");
Ja = E("react.legacy_hidden")
}
var Ka = "function" === typeof Symbol && Symbol.iterator;
function La(a) {
if (null === a || "object" !== typeof a) return null;
a = Ka && a[Ka] || a["@@iterator"];
return "function" === typeof a ? a : null
}
var Ma;
function Na(a) {
if (void 0 === Ma) try {
throw Error();
} catch (c) {
var b = c.stack.trim().match(/\n( *(at )?)/);
Ma = b && b[1] || ""
}
return "\n" + Ma + a
}
var Oa = !1;
function Pa(a, b) {
if (!a || Oa) return "";
Oa = !0;
var c = Error.prepareStackTrace;
Error.prepareStackTrace = void 0;
try {
if (b)
if (b = function() {
throw Error();
}, Object.defineProperty(b.prototype, "props", {set: function() {
throw Error();
}
}), "object" === typeof Reflect && Reflect.construct) {
try {
Reflect.construct(b, [])
} catch (k) {
var d = k
}
Reflect.construct(a, [], b)
} else {
try {
b.call()
} catch (k) {
d = k
}
a.call(b.prototype)
} else {
try {
throw Error();
} catch (k) {
d = k
}
a()
}
} catch (k) {
if (k && d && "string" === typeof k.stack) {
for (var e = k.stack.split("\n"),
f = d.stack.split("\n"), g = e.length - 1, h = f.length - 1; 1 <= g && 0 <= h && e[g] !== f[h];) h--;
for (; 1 <= g && 0 <= h; g--, h--)
if (e[g] !== f[h]) {
if (1 !== g || 1 !== h) {
do
if (g--, h--, 0 > h || e[g] !== f[h]) return "\n" + e[g].replace(" at new ", " at ");
while (1 <= g && 0 <= h)
}
break
}
}
} finally {
Oa = !1, Error.prepareStackTrace = c
}
return (a = a ? a.displayName || a.name : "") ? Na(a) : ""
}
function Qa(a) {
switch (a.tag) {
case 5:
return Na(a.type);
case 16:
return Na("Lazy");
case 13:
return Na("Suspense");
case 19:
return Na("SuspenseList");
case 0:
case 2:
case 15:
return a = Pa(a.type, !1), a;
case 11:
return a = Pa(a.type.render, !1), a;
case 22:
return a = Pa(a.type._render, !1), a;
case 1:
return a = Pa(a.type, !0), a;
default:
return ""
}
}
function Ra(a) {
if (null == a) return null;
if ("function" === typeof a) return a.displayName || a.name || null;
if ("string" === typeof a) return a;
switch (a) {
case ua:
return "Fragment";
case ta:
return "Portal";
case xa:
return "Profiler";
case wa:
return "StrictMode";
case Ba:
return "Suspense";
case Ca:
return "SuspenseList"
}
if ("object" === typeof a) switch (a.$$typeof) {
case za:
return (a.displayName || "Context") + ".Consumer";
case ya:
return (a._context.displayName || "Context") + ".Provider";
case Aa:
var b = a.render;
b = b.displayName || b.name || "";
return a.displayName || ("" !== b ? "ForwardRef(" + b + ")" : "ForwardRef");
case Da:
return Ra(a.type);
case Fa:
return Ra(a._render);
case Ea:
b = a._payload;
a = a._init;
try {
return Ra(a(b))
} catch (c) {}
}
return null
}
function Sa(a) {
switch (typeof a) {
case "boolean":
case "number":
case "object":
case "string":
case "undefined":
return a;
default:
return ""
}
}
function Ta(a) {
var b = a.type;
return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b)
}
function Ua(a) {
var b = Ta(a) ? "checked" : "value",
c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b),
d = "" + a[b];
if (!a.hasOwnProperty(b) && "undefined" !== typeof c && "function" === typeof c.get && "function" === typeof c.set) {
var e = c.get,
f = c.set;
Object.defineProperty(a, b, {
configurable: !0,
get: function() {
return e.call(this)
},
set: function(a) {
d = "" + a;
f.call(this, a)
}
});
Object.defineProperty(a, b, {
enumerable: c.enumerable
});
return {
getValue: function() {
return d
},
setValue: function(a) {
d = "" + a
},
stopTracking: function() {
a._valueTracker =
null;
delete a[b]
}
}
}
}
function Va(a) {
a._valueTracker || (a._valueTracker = Ua(a))
}
function Wa(a) {
if (!a) return !1;
var b = a._valueTracker;
if (!b) return !0;
var c = b.getValue();
var d = "";
a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value);
a = d;
return a !== c ? (b.setValue(a), !0) : !1
}
function Xa(a) {
a = a || ("undefined" !== typeof document ? document : void 0);
if ("undefined" === typeof a) return null;
try {
return a.activeElement || a.body
} catch (b) {
return a.body
}
}
function Ya(a, b) {
var c = b.checked;
return m({}, b, {
defaultChecked: void 0,
defaultValue: void 0,
value: void 0,
checked: null != c ? c : a._wrapperState.initialChecked
})
}
function Za(a, b) {
var c = null == b.defaultValue ? "" : b.defaultValue,
d = null != b.checked ? b.checked : b.defaultChecked;
c = Sa(null != b.value ? b.value : c);
a._wrapperState = {
initialChecked: d,
initialValue: c,
controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value
}
}
function $a(a, b) {
b = b.checked;
null != b && qa(a, "checked", b, !1)
}
function ab(a, b) {
$a(a, b);
var c = Sa(b.value),
d = b.type;
if (null != c)
if ("number" === d) {
if (0 === c && "" === a.value || a.value != c) a.value = "" + c
} else a.value !== "" + c && (a.value = "" + c);
else if ("submit" === d || "reset" === d) {
a.removeAttribute("value");
return
}
b.hasOwnProperty("value") ? bb(a, b.type, c) : b.hasOwnProperty("defaultValue") && bb(a, b.type, Sa(b.defaultValue));
null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked)
}
function cb(a, b, c) {
if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) {
var d = b.type;
if (!("submit" !== d && "reset" !== d || void 0 !== b.value && null !== b.value)) return;
b = "" + a._wrapperState.initialValue;
c || b === a.value || (a.value = b);
a.defaultValue = b
}
c = a.name;
"" !== c && (a.name = "");
a.defaultChecked = !!a._wrapperState.initialChecked;
"" !== c && (a.name = c)
}
function bb(a, b, c) {
if ("number" !== b || Xa(a.ownerDocument) !== a) null == c ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c)
}
function db(a) {
var b = "";
aa.Children.forEach(a, function(a) {
null != a && (b += a)
});
return b
}
function eb(a, b) {
a = m({
children: void 0
}, b);
if (b = db(b.children)) a.children = b;
return a
}
function fb(a, b, c, d) {
a = a.options;
if (b) {
b = {};
for (var e = 0; e < c.length; e++) b["$" + c[e]] = !0;
for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = !0)
} else {
c = "" + Sa(c);
b = null;
for (e = 0; e < a.length; e++) {
if (a[e].value === c) {
a[e].selected = !0;
d && (a[e].defaultSelected = !0);
return
}
null !== b || a[e].disabled || (b = a[e])
}
null !== b && (b.selected = !0)
}
}
function gb(a, b) {
if (null != b.dangerouslySetInnerHTML) throw Error(y(91));
return m({}, b, {
value: void 0,
defaultValue: void 0,
children: "" + a._wrapperState.initialValue
})
}
function hb(a, b) {
var c = b.value;
if (null == c) {
c = b.children;
b = b.defaultValue;
if (null != c) {
if (null != b) throw Error(y(92));
if (Array.isArray(c)) {
if (!(1 >= c.length)) throw Error(y(93));
c = c[0]
}
b = c
}
null == b && (b = "");
c = b
}
a._wrapperState = {
initialValue: Sa(c)
}
}
function ib(a, b) {
var c = Sa(b.value),
d = Sa(b.defaultValue);
null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && a.defaultValue !== c && (a.defaultValue = c));
null != d && (a.defaultValue = "" + d)
}
function jb(a) {
var b = a.textContent;
b === a._wrapperState.initialValue && "" !== b && null !== b && (a.value = b)
}
var kb = {
html: "http://www.w3.org/1999/xhtml",
mathml: "http://www.w3.org/1998/Math/MathML",
svg: "http://www.w3.org/2000/svg"
};
function lb(a) {
switch (a) {
case "svg":
return "http://www.w3.org/2000/svg";
case "math":
return "http://www.w3.org/1998/Math/MathML";
default:
return "http://www.w3.org/1999/xhtml"
}
}
function mb(a, b) {
return null == a || "http://www.w3.org/1999/xhtml" === a ? lb(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a
}
var nb, ob = function(a) {
return "undefined" !== typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
MSApp.execUnsafeLocalFunction(function() {
return a(b, c, d, e)
})
} : a
}(function(a, b) {
if (a.namespaceURI !== kb.svg || "innerHTML" in a) a.innerHTML = b;
else {
nb = nb || document.createElement("div");
nb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>";
for (b = nb.firstChild; a.firstChild;) a.removeChild(a.firstChild);
for (; b.firstChild;) a.appendChild(b.firstChild)
}
});
function pb(a, b) {
if (b) {
var c = a.firstChild;
if (c && c === a.lastChild && 3 === c.nodeType) {
c.nodeValue = b;
return
}
}
a.textContent = b
}
var qb = {
animationIterationCount: !0,
borderImageOutset: !0,
borderImageSlice: !0,
borderImageWidth: !0,
boxFlex: !0,
boxFlexGroup: !0,
boxOrdinalGroup: !0,
columnCount: !0,
columns: !0,
flex: !0,
flexGrow: !0,
flexPositive: !0,
flexShrink: !0,
flexNegative: !0,
flexOrder: !0,
gridArea: !0,
gridRow: !0,
gridRowEnd: !0,
gridRowSpan: !0,
gridRowStart: !0,
gridColumn: !0,
gridColumnEnd: !0,
gridColumnSpan: !0,
gridColumnStart: !0,
fontWeight: !0,
lineClamp: !0,
lineHeight: !0,
opacity: !0,
order: !0,
orphans: !0,
tabSize: !0,
widows: !0,
zIndex: !0,
zoom: !0,
fillOpacity: !0,
floodOpacity: !0,
stopOpacity: !0,
strokeDasharray: !0,
strokeDashoffset: !0,
strokeMiterlimit: !0,
strokeOpacity: !0,
strokeWidth: !0
},
rb = ["Webkit", "ms", "Moz", "O"];
Object.keys(qb).forEach(function(a) {
rb.forEach(function(b) {
b = b + a.charAt(0).toUpperCase() + a.substring(1);
qb[b] = qb[a]
})
});
function sb(a, b, c) {
return null == b || "boolean" === typeof b || "" === b ? "" : c || "number" !== typeof b || 0 === b || qb.hasOwnProperty(a) && qb[a] ? ("" + b).trim() : b + "px"
}
function tb(a, b) {
a = a.style;
for (var c in b)
if (b.hasOwnProperty(c)) {
var d = 0 === c.indexOf("--"),
e = sb(c, b[c], d);
"float" === c && (c = "cssFloat");
d ? a.setProperty(c, e) : a[c] = e
}
}
var ub = m({
menuitem: !0
}, {
area: !0,
base: !0,
br: !0,
col: !0,
embed: !0,
hr: !0,
img: !0,
input: !0,
keygen: !0,
link: !0,
meta: !0,
param: !0,
source: !0,
track: !0,
wbr: !0
});
function vb(a, b) {
if (b) {
if (ub[a] && (null != b.children || null != b.dangerouslySetInnerHTML)) throw Error(y(137, a));
if (null != b.dangerouslySetInnerHTML) {
if (null != b.children) throw Error(y(60));
if (!("object" === typeof b.dangerouslySetInnerHTML && "__html" in b.dangerouslySetInnerHTML)) throw Error(y(61));
}
if (null != b.style && "object" !== typeof b.style) throw Error(y(62));
}
}
function wb(a, b) {
if (-1 === a.indexOf("-")) return "string" === typeof b.is;
switch (a) {
case "annotation-xml":
case "color-profile":
case "font-face":
case "font-face-src":
case "font-face-uri":
case "font-face-format":
case "font-face-name":
case "missing-glyph":
return !1;
default:
return !0
}
}
function xb(a) {
a = a.target || a.srcElement || window;
a.correspondingUseElement && (a = a.correspondingUseElement);
return 3 === a.nodeType ? a.parentNode : a
}
var yb = null,
zb = null,
Ab = null;
function Bb(a) {
if (a = Cb(a)) {
if ("function" !== typeof yb) throw Error(y(280));
var b = a.stateNode;
b && (b = Db(b), yb(a.stateNode, a.type, b))
}
}
function Eb(a) {
zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a
}
function Fb() {
if (zb) {
var a = zb,
b = Ab;
Ab = zb = null;
Bb(a);
if (b)
for (a = 0; a < b.length; a++) Bb(b[a])
}
}
function Gb(a, b) {
return a(b)
}
function Hb(a, b, c, d, e) {
return a(b, c, d, e)
}
function Ib() {}
var Jb = Gb,
Kb = !1,
Lb = !1;
function Mb() {
if (null !== zb || null !== Ab) Ib(), Fb()
}
function Nb(a, b, c) {
if (Lb) return a(b, c);
Lb = !0;
try {
return Jb(a, b, c)
} finally {
Lb = !1, Mb()
}
}
function Ob(a, b) {
var c = a.stateNode;
if (null === c) return null;
var d = Db(c);
if (null === d) return null;
c = d[b];
a: switch (b) {
case "onClick":
case "onClickCapture":
case "onDoubleClick":
case "onDoubleClickCapture":
case "onMouseDown":
case "onMouseDownCapture":
case "onMouseMove":
case "onMouseMoveCapture":
case "onMouseUp":
case "onMouseUpCapture":
case "onMouseEnter":
(d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a));
a = !d;
break a;
default:
a = !1
}
if (a) return null;
if (c && "function" !==
typeof c) throw Error(y(231, b, typeof c));
return c
}
var Pb = !1;
if (fa) try {
var Qb = {};
Object.defineProperty(Qb, "passive", {get: function() {
Pb = !0
}
});
window.addEventListener("test", Qb, Qb);
window.removeEventListener("test", Qb, Qb)
} catch (a) {
Pb = !1
}
function Rb(a, b, c, d, e, f, g, h, k) {
var l = Array.prototype.slice.call(arguments, 3);
try {
b.apply(c, l)
} catch (n) {
this.onError(n)
}
}
var Sb = !1,
Tb = null,
Ub = !1,
Vb = null,
Wb = {
onError: function(a) {
Sb = !0;
Tb = a
}
};
function Xb(a, b, c, d, e, f, g, h, k) {
Sb = !1;
Tb = null;
Rb.apply(Wb, arguments)
}
function Yb(a, b, c, d, e, f, g, h, k) {
Xb.apply(this, arguments);
if (Sb) {
if (Sb) {
var l = Tb;
Sb = !1;
Tb = null
} else throw Error(y(198));
Ub || (Ub = !0, Vb = l)
}
}
function Zb(a) {
var b = a,
c = a;
if (a.alternate)
for (; b.return;) b = b.return;
else {
a = b;
do b = a, 0 !== (b.flags & 1026) && (c = b.return), a = b.return; while (a)
}
return 3 === b.tag ? c : null
}
function $b(a) {
if (13 === a.tag) {
var b = a.memoizedState;
null === b && (a = a.alternate, null !== a && (b = a.memoizedState));
if (null !== b) return b.dehydrated
}
return null
}
function ac(a) {
if (Zb(a) !== a) throw Error(y(188));
}
function bc(a) {
var b = a.alternate;
if (!b) {
b = Zb(a);
if (null === b) throw Error(y(188));
return b !== a ? null : a
}
for (var c = a, d = b;;) {
var e = c.return;
if (null === e) break;
var f = e.alternate;
if (null === f) {
d = e.return;
if (null !== d) {
c = d;
continue
}
break
}
if (e.child === f.child) {
for (f = e.child; f;) {
if (f === c) return ac(e), a;
if (f === d) return ac(e), b;
f = f.sibling
}
throw Error(y(188));
}
if (c.return !== d.return) c = e, d = f;
else {
for (var g = !1, h = e.child; h;) {
if (h === c) {
g = !0;
c = e;
d = f;
break
}
if (h === d) {
g = !0;
d = e;
c = f;
break
}
h = h.sibling
}
if (!g) {
for (h = f.child; h;) {
if (h ===
c) {
g = !0;
c = f;
d = e;
break
}
if (h === d) {
g = !0;
d = f;
c = e;
break
}
h = h.sibling
}
if (!g) throw Error(y(189));
}
}
if (c.alternate !== d) throw Error(y(190));
}
if (3 !== c.tag) throw Error(y(188));
return c.stateNode.current === c ? a : b
}
function cc(a) {
a = bc(a);
if (!a) return null;
for (var b = a;;) {
if (5 === b.tag || 6 === b.tag) return b;
if (b.child) b.child.return = b, b = b.child;
else {
if (b === a) break;
for (; !b.sibling;) {
if (!b.return || b.return === a) return null;
b = b.return
}
b.sibling.return = b.return;
b = b.sibling
}
}
return null
}
function dc(a, b) {
for (var c = a.alternate; null !== b;) {
if (b === a || b === c) return !0;
b = b.return
}
return !1
}
var ec, fc, gc, hc, ic = !1,
jc = [],
kc = null,
lc = null,
mc = null,
nc = new Map,
oc = new Map,
pc = [],
qc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");
function rc(a, b, c, d, e) {
return {
blockedOn: a,
domEventName: b,
eventSystemFlags: c | 16,
nativeEvent: e,
targetContainers: [d]
}
}
function sc(a, b) {
switch (a) {
case "focusin":
case "focusout":
kc = null;
break;
case "dragenter":
case "dragleave":
lc = null;
break;
case "mouseover":
case "mouseout":
mc = null;
break;
case "pointerover":
case "pointerout":
nc.delete(b.pointerId);
break;
case "gotpointercapture":
case "lostpointercapture":
oc.delete(b.pointerId)
}
}
function tc(a, b, c, d, e, f) {
if (null === a || a.nativeEvent !== f) return a = rc(b, c, d, e, f), null !== b && (b = Cb(b), null !== b && fc(b)), a;
a.eventSystemFlags |= d;
b = a.targetContainers;
null !== e && -1 === b.indexOf(e) && b.push(e);
return a
}
function uc(a, b, c, d, e) {
switch (b) {
case "focusin":
return kc = tc(kc, a, b, c, d, e), !0;
case "dragenter":
return lc = tc(lc, a, b, c, d, e), !0;
case "mouseover":
return mc = tc(mc, a, b, c, d, e), !0;
case "pointerover":
var f = e.pointerId;
nc.set(f, tc(nc.get(f) || null, a, b, c, d, e));
return !0;
case "gotpointercapture":
return f = e.pointerId, oc.set(f, tc(oc.get(f) || null, a, b, c, d, e)), !0
}
return !1
}
function vc(a) {
var b = wc(a.target);
if (null !== b) {
var c = Zb(b);
if (null !== c)
if (b = c.tag, 13 === b) {
if (b = $b(c), null !== b) {
a.blockedOn = b;
hc(a.lanePriority, function() {
r.unstable_runWithPriority(a.priority, function() {
gc(c)
})
});
return
}
} else if (3 === b && c.stateNode.hydrate) {
a.blockedOn = 3 === c.tag ? c.stateNode.containerInfo : null;
return
}
}
a.blockedOn = null
}
function xc(a) {
if (null !== a.blockedOn) return !1;
for (var b = a.targetContainers; 0 < b.length;) {
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
if (null !== c) return b = Cb(c), null !== b && fc(b), a.blockedOn = c, !1;
b.shift()
}
return !0
}
function zc(a, b, c) {
xc(a) && c.delete(b)
}
function Ac() {
for (ic = !1; 0 < jc.length;) {
var a = jc[0];
if (null !== a.blockedOn) {
a = Cb(a.blockedOn);
null !== a && ec(a);
break
}
for (var b = a.targetContainers; 0 < b.length;) {
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
if (null !== c) {
a.blockedOn = c;
break
}
b.shift()
}
null === a.blockedOn && jc.shift()
}
null !== kc && xc(kc) && (kc = null);
null !== lc && xc(lc) && (lc = null);
null !== mc && xc(mc) && (mc = null);
nc.forEach(zc);
oc.forEach(zc)
}
function Bc(a, b) {
a.blockedOn === b && (a.blockedOn = null, ic || (ic = !0, r.unstable_scheduleCallback(r.unstable_NormalPriority, Ac)))
}
function Cc(a) {
function b(b) {
return Bc(b, a)
}
if (0 < jc.length) {
Bc(jc[0], a);
for (var c = 1; c < jc.length; c++) {
var d = jc[c];
d.blockedOn === a && (d.blockedOn = null)
}
}
null !== kc && Bc(kc, a);
null !== lc && Bc(lc, a);
null !== mc && Bc(mc, a);
nc.forEach(b);
oc.forEach(b);
for (c = 0; c < pc.length; c++) d = pc[c], d.blockedOn === a && (d.blockedOn = null);
for (; 0 < pc.length && (c = pc[0], null === c.blockedOn);) vc(c), null === c.blockedOn && pc.shift()
}
function Dc(a, b) {
var c = {};
c[a.toLowerCase()] = b.toLowerCase();
c["Webkit" + a] = "webkit" + b;
c["Moz" + a] = "moz" + b;
return c
}
var Ec = {
animationend: Dc("Animation", "AnimationEnd"),
animationiteration: Dc("Animation", "AnimationIteration"),
animationstart: Dc("Animation", "AnimationStart"),
transitionend: Dc("Transition", "TransitionEnd")
},
Fc = {},
Gc = {};
fa && (Gc = document.createElement("div").style, "AnimationEvent" in window || (delete Ec.animationend.animation, delete Ec.animationiteration.animation, delete Ec.animationstart.animation), "TransitionEvent" in window || delete Ec.transitionend.transition);
function Hc(a) {
if (Fc[a]) return Fc[a];
if (!Ec[a]) return a;
var b = Ec[a],
c;
for (c in b)
if (b.hasOwnProperty(c) && c in Gc) return Fc[a] = b[c];
return a
}
var Ic = Hc("animationend"),
Jc = Hc("animationiteration"),
Kc = Hc("animationstart"),
Lc = Hc("transitionend"),
Mc = new Map,
Nc = new Map,
Oc = ["abort", "abort", Ic, "animationEnd", Jc, "animationIteration", Kc, "animationStart", "canplay", "canPlay", "canplaythrough", "canPlayThrough", "durationchange", "durationChange", "emptied", "emptied", "encrypted", "encrypted", "ended", "ended", "error", "error", "gotpointercapture", "gotPointerCapture", "load", "load", "loadeddata", "loadedData", "loadedmetadata", "loadedMetadata", "loadstart", "loadStart",
"lostpointercapture", "lostPointerCapture", "playing", "playing", "progress", "progress", "seeking", "seeking", "stalled", "stalled", "suspend", "suspend", "timeupdate", "timeUpdate", Lc, "transitionEnd", "waiting", "waiting"
];
function Pc(a, b) {
for (var c = 0; c < a.length; c += 2) {
var d = a[c],
e = a[c + 1];
e = "on" + (e[0].toUpperCase() + e.slice(1));
Nc.set(d, b);
Mc.set(d, e);
da(e, [d])
}
}
var Qc = r.unstable_now;
Qc();
var F = 8;
function Rc(a) {
if (0 !== (1 & a)) return F = 15, 1;
if (0 !== (2 & a)) return F = 14, 2;
if (0 !== (4 & a)) return F = 13, 4;
var b = 24 & a;
if (0 !== b) return F = 12, b;
if (0 !== (a & 32)) return F = 11, 32;
b = 192 & a;
if (0 !== b) return F = 10, b;
if (0 !== (a & 256)) return F = 9, 256;
b = 3584 & a;
if (0 !== b) return F = 8, b;
if (0 !== (a & 4096)) return F = 7, 4096;
b = 4186112 & a;
if (0 !== b) return F = 6, b;
b = 62914560 & a;
if (0 !== b) return F = 5, b;
if (a & 67108864) return F = 4, 67108864;
if (0 !== (a & 134217728)) return F = 3, 134217728;
b = 805306368 & a;
if (0 !== b) return F = 2, b;
if (0 !== (1073741824 & a)) return F = 1, 1073741824;
F = 8;
return a
}
function Sc(a) {
switch (a) {
case 99:
return 15;
case 98:
return 10;
case 97:
case 96:
return 8;
case 95:
return 2;
default:
return 0
}
}
function Tc(a) {
switch (a) {
case 15:
case 14:
return 99;
case 13:
case 12:
case 11:
case 10:
return 98;
case 9:
case 8:
case 7:
case 6:
case 4:
case 5:
return 97;
case 3:
case 2:
case 1:
return 95;
case 0:
return 90;
default:
throw Error(y(358, a));
}
}
function Uc(a, b) {
var c = a.pendingLanes;
if (0 === c) return F = 0;
var d = 0,
e = 0,
f = a.expiredLanes,
g = a.suspendedLanes,
h = a.pingedLanes;
if (0 !== f) d = f, e = F = 15;
else if (f = c & 134217727, 0 !== f) {
var k = f & ~g;
0 !== k ? (d = Rc(k), e = F) : (h &= f, 0 !== h && (d = Rc(h), e = F))
} else f = c & ~g, 0 !== f ? (d = Rc(f), e = F) : 0 !== h && (d = Rc(h), e = F);
if (0 === d) return 0;
d = 31 - Vc(d);
d = c & ((0 > d ? 0 : 1 << d) << 1) - 1;
if (0 !== b && b !== d && 0 === (b & g)) {
Rc(b);
if (e <= F) return b;
F = e
}
b = a.entangledLanes;
if (0 !== b)
for (a = a.entanglements, b &= d; 0 < b;) c = 31 - Vc(b), e = 1 << c, d |= a[c], b &= ~e;
return d
}
function Wc(a) {
a = a.pendingLanes & -1073741825;
return 0 !== a ? a : a & 1073741824 ? 1073741824 : 0
}
function Xc(a, b) {
switch (a) {
case 15:
return 1;
case 14:
return 2;
case 12:
return a = Yc(24 & ~b), 0 === a ? Xc(10, b) : a;
case 10:
return a = Yc(192 & ~b), 0 === a ? Xc(8, b) : a;
case 8:
return a = Yc(3584 & ~b), 0 === a && (a = Yc(4186112 & ~b), 0 === a && (a = 512)), a;
case 2:
return b = Yc(805306368 & ~b), 0 === b && (b = 268435456), b
}
throw Error(y(358, a));
}
function Yc(a) {
return a & -a
}
function Zc(a) {
for (var b = [], c = 0; 31 > c; c++) b.push(a);
return b
}
function $c(a, b, c) {
a.pendingLanes |= b;
var d = b - 1;
a.suspendedLanes &= d;
a.pingedLanes &= d;
a = a.eventTimes;
b = 31 - Vc(b);
a[b] = c
}
var Vc = Math.clz32 ? Math.clz32 : ad,
bd = Math.log,
cd = Math.LN2;
function ad(a) {
return 0 === a ? 32 : 31 - (bd(a) / cd | 0) | 0
}
var dd = r.unstable_UserBlockingPriority,
ed = r.unstable_runWithPriority,
fd = !0;
function gd(a, b, c, d) {
Kb || Ib();
var e = hd,
f = Kb;
Kb = !0;
try {
Hb(e, a, b, c, d)
} finally {
(Kb = f) || Mb()
}
}
function id(a, b, c, d) {
ed(dd, hd.bind(null, a, b, c, d))
}
function hd(a, b, c, d) {
if (fd) {
var e;
if ((e = 0 === (b & 4)) && 0 < jc.length && -1 < qc.indexOf(a)) a = rc(null, a, b, c, d), jc.push(a);
else {
var f = yc(a, b, c, d);
if (null === f) e && sc(a, d);
else {
if (e) {
if (-1 < qc.indexOf(a)) {
a = rc(f, a, b, c, d);
jc.push(a);
return
}
if (uc(f, a, b, c, d)) return;
sc(a, d)
}
jd(a, b, d, null, c)
}
}
}
}
function yc(a, b, c, d) {
var e = xb(d);
e = wc(e);
if (null !== e) {
var f = Zb(e);
if (null === f) e = null;
else {
var g = f.tag;
if (13 === g) {
e = $b(f);
if (null !== e) return e;
e = null
} else if (3 === g) {
if (f.stateNode.hydrate) return 3 === f.tag ? f.stateNode.containerInfo : null;
e = null
} else f !== e && (e = null)
}
}
jd(a, b, d, e, c);
return null
}
var kd = null,
ld = null,
md = null;
function nd() {
if (md) return md;
var a, b = ld,
c = b.length,
d, e = "value" in kd ? kd.value : kd.textContent,
f = e.length;
for (a = 0; a < c && b[a] === e[a]; a++);
var g = c - a;
for (d = 1; d <= g && b[c - d] === e[f - d]; d++);
return md = e.slice(a, 1 < d ? 1 - d : void 0)
}
function od(a) {
var b = a.keyCode;
"charCode" in a ? (a = a.charCode, 0 === a && 13 === b && (a = 13)) : a = b;
10 === a && (a = 13);
return 32 <= a || 13 === a ? a : 0
}
function pd() {
return !0
}
function qd() {
return !1
}
function rd(a) {
function b(b, d, e, f, g) {
this._reactName = b;
this._targetInst = e;
this.type = d;
this.nativeEvent = f;
this.target = g;
this.currentTarget = null;
for (var c in a) a.hasOwnProperty(c) && (b = a[c], this[c] = b ? b(f) : f[c]);
this.isDefaultPrevented = (null != f.defaultPrevented ? f.defaultPrevented : !1 === f.returnValue) ? pd : qd;
this.isPropagationStopped = qd;
return this
}
m(b.prototype, {
preventDefault: function() {
this.defaultPrevented = !0;
var a = this.nativeEvent;
a && (a.preventDefault ? a.preventDefault() : "unknown" !== typeof a.returnValue &&
(a.returnValue = !1), this.isDefaultPrevented = pd)
},
stopPropagation: function() {
var a = this.nativeEvent;
a && (a.stopPropagation ? a.stopPropagation() : "unknown" !== typeof a.cancelBubble && (a.cancelBubble = !0), this.isPropagationStopped = pd)
},
persist: function() {},
isPersistent: pd
});
return b
}
var sd = {
eventPhase: 0,
bubbles: 0,
cancelable: 0,
timeStamp: function(a) {
return a.timeStamp || Date.now()
},
defaultPrevented: 0,
isTrusted: 0
},
td = rd(sd),
ud = m({}, sd, {
view: 0,
detail: 0
}),
vd = rd(ud),
wd, xd, yd, Ad = m({}, ud, {
screenX: 0,
screenY: 0,
clientX: 0,
clientY: 0,
pageX: 0,
pageY: 0,
ctrlKey: 0,
shiftKey: 0,
altKey: 0,
metaKey: 0,
getModifierState: zd,
button: 0,
buttons: 0,
relatedTarget: function(a) {
return void 0 === a.relatedTarget ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget
},
movementX: function(a) {
if ("movementX" in
a) return a.movementX;
a !== yd && (yd && "mousemove" === a.type ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a);
return wd
},
movementY: function(a) {
return "movementY" in a ? a.movementY : xd
}
}),
Bd = rd(Ad),
Cd = m({}, Ad, {
dataTransfer: 0
}),
Dd = rd(Cd),
Ed = m({}, ud, {
relatedTarget: 0
}),
Fd = rd(Ed),
Gd = m({}, sd, {
animationName: 0,
elapsedTime: 0,
pseudoElement: 0
}),
Hd = rd(Gd),
Id = m({}, sd, {
clipboardData: function(a) {
return "clipboardData" in a ? a.clipboardData : window.clipboardData
}
}),
Jd = rd(Id),
Kd = m({}, sd, {
data: 0
}),
Ld = rd(Kd),
Md = {
Esc: "Escape",
Spacebar: " ",
Left: "ArrowLeft",
Up: "ArrowUp",
Right: "ArrowRight",
Down: "ArrowDown",
Del: "Delete",
Win: "OS",
Menu: "ContextMenu",
Apps: "ContextMenu",
Scroll: "ScrollLock",
MozPrintableKey: "Unidentified"
},
Nd = {
8: "Backspace",
9: "Tab",
12: "Clear",
13: "Enter",
16: "Shift",
17: "Control",
18: "Alt",
19: "Pause",
20: "CapsLock",
27: "Escape",
32: " ",
33: "PageUp",
34: "PageDown",
35: "End",
36: "Home",
37: "ArrowLeft",
38: "ArrowUp",
39: "ArrowRight",
40: "ArrowDown",
45: "Insert",
46: "Delete",
112: "F1",
113: "F2",
114: "F3",
115: "F4",
116: "F5",
117: "F6",
118: "F7",
119: "F8",
120: "F9",
121: "F10",
122: "F11",
123: "F12",
144: "NumLock",
145: "ScrollLock",
224: "Meta"
},
Od = {
Alt: "altKey",
Control: "ctrlKey",
Meta: "metaKey",
Shift: "shiftKey"
};
function Pd(a) {
var b = this.nativeEvent;
return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : !1
}
function zd() {
return Pd
}
var Qd = m({}, ud, {
key: function(a) {
if (a.key) {
var b = Md[a.key] || a.key;
if ("Unidentified" !== b) return b
}
return "keypress" === a.type ? (a = od(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Nd[a.keyCode] || "Unidentified" : ""
},
code: 0,
location: 0,
ctrlKey: 0,
shiftKey: 0,
altKey: 0,
metaKey: 0,
repeat: 0,
locale: 0,
getModifierState: zd,
charCode: function(a) {
return "keypress" === a.type ? od(a) : 0
},
keyCode: function(a) {
return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0
},
which: function(a) {
return "keypress" ===
a.type ? od(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0
}
}),
Rd = rd(Qd),
Sd = m({}, Ad, {
pointerId: 0,
width: 0,
height: 0,
pressure: 0,
tangentialPressure: 0,
tiltX: 0,
tiltY: 0,
twist: 0,
pointerType: 0,
isPrimary: 0
}),
Td = rd(Sd),
Ud = m({}, ud, {
touches: 0,
targetTouches: 0,
changedTouches: 0,
altKey: 0,
metaKey: 0,
ctrlKey: 0,
shiftKey: 0,
getModifierState: zd
}),
Vd = rd(Ud),
Wd = m({}, sd, {
propertyName: 0,
elapsedTime: 0,
pseudoElement: 0
}),
Xd = rd(Wd),
Yd = m({}, Ad, {
deltaX: function(a) {
return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0
},
deltaY: function(a) {
return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0
},
deltaZ: 0,
deltaMode: 0
}),
Zd = rd(Yd),
$d = [9, 13, 27, 32],
ae = fa && "CompositionEvent" in window,
be = null;
fa && "documentMode" in document && (be = document.documentMode);
var ce = fa && "TextEvent" in window && !be,
de = fa && (!ae || be && 8 < be && 11 >= be),
ee = String.fromCharCode(32),
fe = !1;
function ge(a, b) {
switch (a) {
case "keyup":
return -1 !== $d.indexOf(b.keyCode);
case "keydown":
return 229 !== b.keyCode;
case "keypress":
case "mousedown":
case "focusout":
return !0;
default:
return !1
}
}
function he(a) {
a = a.detail;
return "object" === typeof a && "data" in a ? a.data : null
}
var ie = !1;
function je(a, b) {
switch (a) {
case "compositionend":
return he(b);
case "keypress":
if (32 !== b.which) return null;
fe = !0;
return ee;
case "textInput":
return a = b.data, a === ee && fe ? null : a;
default:
return null
}
}
function ke(a, b) {
if (ie) return "compositionend" === a || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = !1, a) : null;
switch (a) {
case "paste":
return null;
case "keypress":
if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
if (b.char && 1 < b.char.length) return b.char;
if (b.which) return String.fromCharCode(b.which)
}
return null;
case "compositionend":
return de && "ko" !== b.locale ? null : b.data;
default:
return null
}
}
var le = {
color: !0,
date: !0,
datetime: !0,
"datetime-local": !0,
email: !0,
month: !0,
number: !0,
password: !0,
range: !0,
search: !0,
tel: !0,
text: !0,
time: !0,
url: !0,
week: !0
};
function me(a) {
var b = a && a.nodeName && a.nodeName.toLowerCase();
return "input" === b ? !!le[a.type] : "textarea" === b ? !0 : !1
}
function ne(a, b, c, d) {
Eb(d);
b = oe(b, "onChange");
0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({
event: c,
listeners: b
}))
}
var pe = null,
qe = null;
function re(a) {
se(a, 0)
}
function te(a) {
var b = ue(a);
if (Wa(b)) return a
}
function ve(a, b) {
if ("change" === a) return b
}
var we = !1;
if (fa) {
var xe;
if (fa) {
var ye = "oninput" in document;
if (!ye) {
var ze = document.createElement("div");
ze.setAttribute("oninput", "return;");
ye = "function" === typeof ze.oninput
}
xe = ye
} else xe = !1;
we = xe && (!document.documentMode || 9 < document.documentMode)
}
function Ae() {
pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null)
}
function Be(a) {
if ("value" === a.propertyName && te(qe)) {
var b = [];
ne(b, qe, a, xb(a));
a = re;
if (Kb) a(b);
else {
Kb = !0;
try {
Gb(a, b)
} finally {
Kb = !1, Mb()
}
}
}
}
function Ce(a, b, c) {
"focusin" === a ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : "focusout" === a && Ae()
}
function De(a) {
if ("selectionchange" === a || "keyup" === a || "keydown" === a) return te(qe)
}
function Ee(a, b) {
if ("click" === a) return te(b)
}
function Fe(a, b) {
if ("input" === a || "change" === a) return te(b)
}
function Ge(a, b) {
return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b
}
var He = "function" === typeof Object.is ? Object.is : Ge,
Ie = Object.prototype.hasOwnProperty;
function Je(a, b) {
if (He(a, b)) return !0;
if ("object" !== typeof a || null === a || "object" !== typeof b || null === b) return !1;
var c = Object.keys(a),
d = Object.keys(b);
if (c.length !== d.length) return !1;
for (d = 0; d < c.length; d++)
if (!Ie.call(b, c[d]) || !He(a[c[d]], b[c[d]])) return !1;
return !0
}
function Ke(a) {
for (; a && a.firstChild;) a = a.firstChild;
return a
}
function Le(a, b) {
var c = Ke(a);
a = 0;
for (var d; c;) {
if (3 === c.nodeType) {
d = a + c.textContent.length;
if (a <= b && d >= b) return {
node: c,
offset: b - a
};
a = d
}
a: {
for (; c;) {
if (c.nextSibling) {
c = c.nextSibling;
break a
}
c = c.parentNode
}
c = void 0
}
c = Ke(c)
}
}
function Me(a, b) {
return a && b ? a === b ? !0 : a && 3 === a.nodeType ? !1 : b && 3 === b.nodeType ? Me(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : !1 : !1
}
function Ne() {
for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement;) {
try {
var c = "string" === typeof b.contentWindow.location.href
} catch (d) {
c = !1
}
if (c) a = b.contentWindow;
else break;
b = Xa(a.document)
}
return b
}
function Oe(a) {
var b = a && a.nodeName && a.nodeName.toLowerCase();
return b && ("input" === b && ("text" === a.type || "search" === a.type || "tel" === a.type || "url" === a.type || "password" === a.type) || "textarea" === b || "true" === a.contentEditable)
}
var Pe = fa && "documentMode" in document && 11 >= document.documentMode,
Qe = null,
Re = null,
Se = null,
Te = !1;
function Ue(a, b, c) {
var d = c.window === c ? c.document : 9 === c.nodeType ? c : c.ownerDocument;
Te || null == Qe || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Oe(d) ? d = {
start: d.selectionStart,
end: d.selectionEnd
} : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = {
anchorNode: d.anchorNode,
anchorOffset: d.anchorOffset,
focusNode: d.focusNode,
focusOffset: d.focusOffset
}), Se && Je(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({
event: b,
listeners: d
}), b.target = Qe)))
}
Pc("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),
0);
Pc("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "), 1);
Pc(Oc, 2);
for (var Ve = "change selectionchange textInput compositionstart compositionend compositionupdate".split(" "), We = 0; We < Ve.length; We++) Nc.set(Ve[We], 0);
ea("onMouseEnter", ["mouseout", "mouseover"]);
ea("onMouseLeave", ["mouseout", "mouseover"]);
ea("onPointerEnter", ["pointerout", "pointerover"]);
ea("onPointerLeave", ["pointerout", "pointerover"]);
da("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
da("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
da("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
da("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
da("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
da("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
var Xe = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),
Ye = new Set("cancel close invalid load scroll toggle".split(" ").concat(Xe));
function Ze(a, b, c) {
var d = a.type || "unknown-event";
a.currentTarget = c;
Yb(d, b, void 0, a);
a.currentTarget = null
}
function se(a, b) {
b = 0 !== (b & 4);
for (var c = 0; c < a.length; c++) {
var d = a[c],
e = d.event;
d = d.listeners;
a: {
var f = void 0;
if (b)
for (var g = d.length - 1; 0 <= g; g--) {
var h = d[g],
k = h.instance,
l = h.currentTarget;
h = h.listener;
if (k !== f && e.isPropagationStopped()) break a;
Ze(e, h, l);
f = k
} else
for (g = 0; g < d.length; g++) {
h = d[g];
k = h.instance;
l = h.currentTarget;
h = h.listener;
if (k !== f && e.isPropagationStopped()) break a;
Ze(e, h, l);
f = k
}
}
}
if (Ub) throw a = Vb, Ub = !1, Vb = null, a;
}
function G(a, b) {
var c = $e(b),
d = a + "__bubble";
c.has(d) || (af(b, a, 2, !1), c.add(d))
}
var bf = "_reactListening" + Math.random().toString(36).slice(2);
function cf(a) {
a[bf] || (a[bf] = !0, ba.forEach(function(b) {
Ye.has(b) || df(b, !1, a, null);
df(b, !0, a, null)
}))
}
function df(a, b, c, d) {
var e = 4 < arguments.length && void 0 !== arguments[4] ? arguments[4] : 0,
f = c;
"selectionchange" === a && 9 !== c.nodeType && (f = c.ownerDocument);
if (null !== d && !b && Ye.has(a)) {
if ("scroll" !== a) return;
e |= 2;
f = d
}
var g = $e(f),
h = a + "__" + (b ? "capture" : "bubble");
g.has(h) || (b && (e |= 4), af(f, a, e, b), g.add(h))
}
function af(a, b, c, d) {
var e = Nc.get(b);
switch (void 0 === e ? 2 : e) {
case 0:
e = gd;
break;
case 1:
e = id;
break;
default:
e = hd
}
c = e.bind(null, b, c, a);
e = void 0;
!Pb || "touchstart" !== b && "touchmove" !== b && "wheel" !== b || (e = !0);
d ? void 0 !== e ? a.addEventListener(b, c, {
capture: !0,
passive: e
}) : a.addEventListener(b, c, !0) : void 0 !== e ? a.addEventListener(b, c, {
passive: e
}) : a.addEventListener(b, c, !1)
}
function jd(a, b, c, d, e) {
var f = d;
if (0 === (b & 1) && 0 === (b & 2) && null !== d) a: for (;;) {
if (null === d) return;
var g = d.tag;
if (3 === g || 4 === g) {
var h = d.stateNode.containerInfo;
if (h === e || 8 === h.nodeType && h.parentNode === e) break;
if (4 === g)
for (g = d.return; null !== g;) {
var k = g.tag;
if (3 === k || 4 === k)
if (k = g.stateNode.containerInfo, k === e || 8 === k.nodeType && k.parentNode === e) return;
g = g.return
}
for (; null !== h;) {
g = wc(h);
if (null === g) return;
k = g.tag;
if (5 === k || 6 === k) {
d = f = g;
continue a
}
h = h.parentNode
}
}
d = d.return
}
Nb(function() {
var d = f,
e = xb(c),
g = [];
a: {
var h = Mc.get(a);
if (void 0 !== h) {
var k = td,
x = a;
switch (a) {
case "keypress":
if (0 === od(c)) break a;
case "keydown":
case "keyup":
k = Rd;
break;
case "focusin":
x = "focus";
k = Fd;
break;
case "focusout":
x = "blur";
k = Fd;
break;
case "beforeblur":
case "afterblur":
k = Fd;
break;
case "click":
if (2 === c.button) break a;
case "auxclick":
case "dblclick":
case "mousedown":
case "mousemove":
case "mouseup":
case "mouseout":
case "mouseover":
case "contextmenu":
k = Bd;
break;
case "drag":
case "dragend":
case "dragenter":
case "dragexit":
case "dragleave":
case "dragover":
case "dragstart":
case "drop":
k =
Dd;
break;
case "touchcancel":
case "touchend":
case "touchmove":
case "touchstart":
k = Vd;
break;
case Ic:
case Jc:
case Kc:
k = Hd;
break;
case Lc:
k = Xd;
break;
case "scroll":
k = vd;
break;
case "wheel":
k = Zd;
break;
case "copy":
case "cut":
case "paste":
k = Jd;
break;
case "gotpointercapture":
case "lostpointercapture":
case "pointercancel":
case "pointerdown":
case "pointermove":
case "pointerout":
case "pointerover":
case "pointerup":
k = Td
}
var w = 0 !== (b & 4),
z = !w && "scroll" === a,
u = w ? null !== h ? h + "Capture" : null : h;
w = [];
for (var t = d, q; null !==
t;) {
q = t;
var v = q.stateNode;
5 === q.tag && null !== v && (q = v, null !== u && (v = Ob(t, u), null != v && w.push(ef(t, v, q))));
if (z) break;
t = t.return
}
0 < w.length && (h = new k(h, x, null, c, e), g.push({
event: h,
listeners: w
}))
}
}
if (0 === (b & 7)) {
a: {
h = "mouseover" === a || "pointerover" === a;
k = "mouseout" === a || "pointerout" === a;
if (h && 0 === (b & 16) && (x = c.relatedTarget || c.fromElement) && (wc(x) || x[ff])) break a;
if (k || h) {
h = e.window === e ? e : (h = e.ownerDocument) ? h.defaultView || h.parentWindow : window;
if (k) {
if (x = c.relatedTarget || c.toElement, k = d, x = x ? wc(x) : null, null !==
x && (z = Zb(x), x !== z || 5 !== x.tag && 6 !== x.tag)) x = null
} else k = null, x = d;
if (k !== x) {
w = Bd;
v = "onMouseLeave";
u = "onMouseEnter";
t = "mouse";
if ("pointerout" === a || "pointerover" === a) w = Td, v = "onPointerLeave", u = "onPointerEnter", t = "pointer";
z = null == k ? h : ue(k);
q = null == x ? h : ue(x);
h = new w(v, t + "leave", k, c, e);
h.target = z;
h.relatedTarget = q;
v = null;
wc(e) === d && (w = new w(u, t + "enter", x, c, e), w.target = q, w.relatedTarget = z, v = w);
z = v;
if (k && x) b: {
w = k;
u = x;
t = 0;
for (q = w; q; q = gf(q)) t++;
q = 0;
for (v = u; v; v = gf(v)) q++;
for (; 0 < t - q;) w = gf(w), t--;
for (; 0 < q - t;) u =
gf(u), q--;
for (; t--;) {
if (w === u || null !== u && w === u.alternate) break b;
w = gf(w);
u = gf(u)
}
w = null
} else w = null;
null !== k && hf(g, h, k, w, !1);
null !== x && null !== z && hf(g, z, x, w, !0)
}
}
}
a: {
h = d ? ue(d) : window;
k = h.nodeName && h.nodeName.toLowerCase();
if ("select" === k || "input" === k && "file" === h.type) var J = ve;
else if (me(h))
if (we) J = Fe;
else {
J = De;
var K = Ce
} else(k = h.nodeName) && "input" === k.toLowerCase() && ("checkbox" === h.type || "radio" === h.type) && (J = Ee);
if (J && (J = J(a, d))) {
ne(g, J, c, e);
break a
}
K && K(a, h, d);
"focusout" === a && (K = h._wrapperState) &&
K.controlled && "number" === h.type && bb(h, "number", h.value)
}
K = d ? ue(d) : window;
switch (a) {
case "focusin":
if (me(K) || "true" === K.contentEditable) Qe = K, Re = d, Se = null;
break;
case "focusout":
Se = Re = Qe = null;
break;
case "mousedown":
Te = !0;
break;
case "contextmenu":
case "mouseup":
case "dragend":
Te = !1;
Ue(g, c, e);
break;
case "selectionchange":
if (Pe) break;
case "keydown":
case "keyup":
Ue(g, c, e)
}
var Q;
if (ae) b: {
switch (a) {
case "compositionstart":
var L = "onCompositionStart";
break b;
case "compositionend":
L = "onCompositionEnd";
break b;
case "compositionupdate":
L = "onCompositionUpdate";
break b
}
L = void 0
} else ie ? ge(a, c) && (L = "onCompositionEnd") : "keydown" === a && 229 === c.keyCode && (L = "onCompositionStart");L && (de && "ko" !== c.locale && (ie || "onCompositionStart" !== L ? "onCompositionEnd" === L && ie && (Q = nd()) : (kd = e, ld = "value" in kd ? kd.value : kd.textContent, ie = !0)), K = oe(d, L), 0 < K.length && (L = new Ld(L, a, null, c, e), g.push({
event: L,
listeners: K
}), Q ? L.data = Q : (Q = he(c), null !== Q && (L.data = Q))));
if (Q = ce ? je(a, c) : ke(a, c)) d = oe(d, "onBeforeInput"),
0 < d.length && (e = new Ld("onBeforeInput",
"beforeinput", null, c, e), g.push({
event: e,
listeners: d
}), e.data = Q)
}
se(g, b)
})
}
function ef(a, b, c) {
return {
instance: a,
listener: b,
currentTarget: c
}
}
function oe(a, b) {
for (var c = b + "Capture", d = []; null !== a;) {
var e = a,
f = e.stateNode;
5 === e.tag && null !== f && (e = f, f = Ob(a, c), null != f && d.unshift(ef(a, f, e)), f = Ob(a, b), null != f && d.push(ef(a, f, e)));
a = a.return
}
return d
}
function gf(a) {
if (null === a) return null;
do a = a.return; while (a && 5 !== a.tag);
return a ? a : null
}
function hf(a, b, c, d, e) {
for (var f = b._reactName, g = []; null !== c && c !== d;) {
var h = c,
k = h.alternate,
l = h.stateNode;
if (null !== k && k === d) break;
5 === h.tag && null !== l && (h = l, e ? (k = Ob(c, f), null != k && g.unshift(ef(c, k, h))) : e || (k = Ob(c, f), null != k && g.push(ef(c, k, h))));
c = c.return
}
0 !== g.length && a.push({
event: b,
listeners: g
})
}
function jf() {}
var kf = null,
lf = null;
function mf(a, b) {
switch (a) {
case "button":
case "input":
case "select":
case "textarea":
return !!b.autoFocus
}
return !1
}
function nf(a, b) {
return "textarea" === a || "option" === a || "noscript" === a || "string" === typeof b.children || "number" === typeof b.children || "object" === typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && null != b.dangerouslySetInnerHTML.__html
}
var of = "function" === typeof setTimeout ? setTimeout : void 0,
pf = "function" === typeof clearTimeout ? clearTimeout : void 0;
function qf(a) {
1 === a.nodeType ? a.textContent = "" : 9 === a.nodeType && (a = a.body, null != a && (a.textContent = ""))
}
function rf(a) {
for (; null != a; a = a.nextSibling) {
var b = a.nodeType;
if (1 === b || 3 === b) break
}
return a
}
function sf(a) {
a = a.previousSibling;
for (var b = 0; a;) {
if (8 === a.nodeType) {
var c = a.data;
if ("$" === c || "$!" === c || "$?" === c) {
if (0 === b) return a;
b--
} else "/$" === c && b++
}
a = a.previousSibling
}
return null
}
var tf = 0;
function uf(a) {
return {
$$typeof: Ga,
toString: a,
valueOf: a
}
}
var vf = Math.random().toString(36).slice(2),
wf = "__reactFiber$" + vf,
xf = "__reactProps$" + vf,
ff = "__reactContainer$" + vf,
yf = "__reactEvents$" + vf;
function wc(a) {
var b = a[wf];
if (b) return b;
for (var c = a.parentNode; c;) {
if (b = c[ff] || c[wf]) {
c = b.alternate;
if (null !== b.child || null !== c && null !== c.child)
for (a = sf(a); null !== a;) {
if (c = a[wf]) return c;
a = sf(a)
}
return b
}
a = c;
c = a.parentNode
}
return null
}
function Cb(a) {
a = a[wf] || a[ff];
return !a || 5 !== a.tag && 6 !== a.tag && 13 !== a.tag && 3 !== a.tag ? null : a
}
function ue(a) {
if (5 === a.tag || 6 === a.tag) return a.stateNode;
throw Error(y(33));
}
function Db(a) {
return a[xf] || null
}
function $e(a) {
var b = a[yf];
void 0 === b && (b = a[yf] = new Set);
return b
}
var zf = [],
Af = -1;
function Bf(a) {
return {
current: a
}
}
function H(a) {
0 > Af || (a.current = zf[Af], zf[Af] = null, Af--)
}
function I(a, b) {
Af++;
zf[Af] = a.current;
a.current = b
}
var Cf = {},
M = Bf(Cf),
N = Bf(!1),
Df = Cf;
function Ef(a, b) {
var c = a.type.contextTypes;
if (!c) return Cf;
var d = a.stateNode;
if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext;
var e = {},
f;
for (f in c) e[f] = b[f];
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e);
return e
}
function Ff(a) {
a = a.childContextTypes;
return null !== a && void 0 !== a
}
function Gf() {
H(N);
H(M)
}
function Hf(a, b, c) {
if (M.current !== Cf) throw Error(y(168));
I(M, b);
I(N, c)
}
function If(a, b, c) {
var d = a.stateNode;
a = b.childContextTypes;
if ("function" !== typeof d.getChildContext) return c;
d = d.getChildContext();
for (var e in d)
if (!(e in a)) throw Error(y(108, Ra(b) || "Unknown", e));
return m({}, c, d)
}
function Jf(a) {
a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Cf;
Df = M.current;
I(M, a);
I(N, N.current);
return !0
}
function Kf(a, b, c) {
var d = a.stateNode;
if (!d) throw Error(y(169));
c ? (a = If(a, b, Df), d.__reactInternalMemoizedMergedChildContext = a, H(N), H(M), I(M, a)) : H(N);
I(N, c)
}
var Lf = null,
Mf = null,
Nf = r.unstable_runWithPriority,
Of = r.unstable_scheduleCallback,
Pf = r.unstable_cancelCallback,
Qf = r.unstable_shouldYield,
Rf = r.unstable_requestPaint,
Sf = r.unstable_now,
Tf = r.unstable_getCurrentPriorityLevel,
Uf = r.unstable_ImmediatePriority,
Vf = r.unstable_UserBlockingPriority,
Wf = r.unstable_NormalPriority,
Xf = r.unstable_LowPriority,
Yf = r.unstable_IdlePriority,
Zf = {},
$f = void 0 !== Rf ? Rf : function() {},
ag = null,
bg = null,
cg = !1,
dg = Sf(),
O = 1E4 > dg ? Sf : function() {
return Sf() - dg
};
function eg() {
switch (Tf()) {
case Uf:
return 99;
case Vf:
return 98;
case Wf:
return 97;
case Xf:
return 96;
case Yf:
return 95;
default:
throw Error(y(332));
}
}
function fg(a) {
switch (a) {
case 99:
return Uf;
case 98:
return Vf;
case 97:
return Wf;
case 96:
return Xf;
case 95:
return Yf;
default:
throw Error(y(332));
}
}
function gg(a, b) {
a = fg(a);
return Nf(a, b)
}
function hg(a, b, c) {
a = fg(a);
return Of(a, b, c)
}
function ig() {
if (null !== bg) {
var a = bg;
bg = null;
Pf(a)
}
jg()
}
function jg() {
if (!cg && null !== ag) {
cg = !0;
var a = 0;
try {
var b = ag;
gg(99, function() {
for (; a < b.length; a++) {
var c = b[a];
do c = c(!0); while (null !== c)
}
});
ag = null
} catch (c) {
throw null !== ag && (ag = ag.slice(a + 1)), Of(Uf, ig), c;
} finally {
cg = !1
}
}
}
var kg = ra.ReactCurrentBatchConfig;
function lg(a, b) {
if (a && a.defaultProps) {
b = m({}, b);
a = a.defaultProps;
for (var c in a) void 0 === b[c] && (b[c] = a[c]);
return b
}
return b
}
var mg = Bf(null),
ng = null,
og = null,
pg = null;
function qg() {
pg = og = ng = null
}
function rg(a) {
var b = mg.current;
H(mg);
a.type._context._currentValue = b
}
function sg(a, b) {
for (; null !== a;) {
var c = a.alternate;
if ((a.childLanes & b) === b)
if (null === c || (c.childLanes & b) === b) break;
else c.childLanes |= b;
else a.childLanes |= b, null !== c && (c.childLanes |= b);
a = a.return
}
}
function tg(a, b) {
ng = a;
pg = og = null;
a = a.dependencies;
null !== a && null !== a.firstContext && (0 !== (a.lanes & b) && (ug = !0), a.firstContext = null)
}
function vg(a, b) {
if (pg !== a && !1 !== b && 0 !== b) {
if ("number" !== typeof b || 1073741823 === b) pg = a, b = 1073741823;
b = {
context: a,
observedBits: b,
next: null
};
if (null === og) {
if (null === ng) throw Error(y(308));
og = b;
ng.dependencies = {
lanes: 0,
firstContext: b,
responders: null
}
} else og = og.next = b
}
return a._currentValue
}
var wg = !1;
function xg(a) {
a.updateQueue = {
baseState: a.memoizedState,
firstBaseUpdate: null,
lastBaseUpdate: null,
shared: {
pending: null
},
effects: null
}
}
function yg(a, b) {
a = a.updateQueue;
b.updateQueue === a && (b.updateQueue = {
baseState: a.baseState,
firstBaseUpdate: a.firstBaseUpdate,
lastBaseUpdate: a.lastBaseUpdate,
shared: a.shared,
effects: a.effects
})
}
function zg(a, b) {
return {
eventTime: a,
lane: b,
tag: 0,
payload: null,
callback: null,
next: null
}
}
function Ag(a, b) {
a = a.updateQueue;
if (null !== a) {
a = a.shared;
var c = a.pending;
null === c ? b.next = b : (b.next = c.next, c.next = b);
a.pending = b
}
}
function Bg(a, b) {
var c = a.updateQueue,
d = a.alternate;
if (null !== d && (d = d.updateQueue, c === d)) {
var e = null,
f = null;
c = c.firstBaseUpdate;
if (null !== c) {
do {
var g = {
eventTime: c.eventTime,
lane: c.lane,
tag: c.tag,
payload: c.payload,
callback: c.callback,
next: null
};
null === f ? e = f = g : f = f.next = g;
c = c.next
} while (null !== c);
null === f ? e = f = b : f = f.next = b
} else e = f = b;
c = {
baseState: d.baseState,
firstBaseUpdate: e,
lastBaseUpdate: f,
shared: d.shared,
effects: d.effects
};
a.updateQueue = c;
return
}
a = c.lastBaseUpdate;
null === a ? c.firstBaseUpdate = b : a.next =
b;
c.lastBaseUpdate = b
}
function Cg(a, b, c, d) {
var e = a.updateQueue;
wg = !1;
var f = e.firstBaseUpdate,
g = e.lastBaseUpdate,
h = e.shared.pending;
if (null !== h) {
e.shared.pending = null;
var k = h,
l = k.next;
k.next = null;
null === g ? f = l : g.next = l;
g = k;
var n = a.alternate;
if (null !== n) {
n = n.updateQueue;
var A = n.lastBaseUpdate;
A !== g && (null === A ? n.firstBaseUpdate = l : A.next = l, n.lastBaseUpdate = k)
}
}
if (null !== f) {
A = e.baseState;
g = 0;
n = l = k = null;
do {
h = f.lane;
var p = f.eventTime;
if ((d & h) === h) {
null !== n && (n = n.next = {
eventTime: p,
lane: 0,
tag: f.tag,
payload: f.payload,
callback: f.callback,
next: null
});
a: {
var C = a,
x = f;
h = b;
p = c;
switch (x.tag) {
case 1:
C = x.payload;
if ("function" === typeof C) {
A = C.call(p, A, h);
break a
}
A = C;
break a;
case 3:
C.flags = C.flags & -4097 | 64;
case 0:
C = x.payload;
h = "function" === typeof C ? C.call(p, A, h) : C;
if (null === h || void 0 === h) break a;
A = m({}, A, h);
break a;
case 2:
wg = !0
}
}
null !== f.callback && (a.flags |= 32, h = e.effects, null === h ? e.effects = [f] : h.push(f))
} else p = {
eventTime: p,
lane: h,
tag: f.tag,
payload: f.payload,
callback: f.callback,
next: null
}, null === n ? (l = n = p, k = A) : n = n.next = p, g |= h;
f = f.next;
if (null ===
f)
if (h = e.shared.pending, null === h) break;
else f = h.next, h.next = null, e.lastBaseUpdate = h, e.shared.pending = null
} while (1);
null === n && (k = A);
e.baseState = k;
e.firstBaseUpdate = l;
e.lastBaseUpdate = n;
Dg |= g;
a.lanes = g;
a.memoizedState = A
}
}
function Eg(a, b, c) {
a = b.effects;
b.effects = null;
if (null !== a)
for (b = 0; b < a.length; b++) {
var d = a[b],
e = d.callback;
if (null !== e) {
d.callback = null;
d = c;
if ("function" !== typeof e) throw Error(y(191, e));
e.call(d)
}
}
}
var Fg = (new aa.Component).refs;
function Gg(a, b, c, d) {
b = a.memoizedState;
c = c(d, b);
c = null === c || void 0 === c ? b : m({}, b, c);
a.memoizedState = c;
0 === a.lanes && (a.updateQueue.baseState = c)
}
var Kg = {
isMounted: function(a) {
return (a = a._reactInternals) ? Zb(a) === a : !1
},
enqueueSetState: function(a, b, c) {
a = a._reactInternals;
var d = Hg(),
e = Ig(a),
f = zg(d, e);
f.payload = b;
void 0 !== c && null !== c && (f.callback = c);
Ag(a, f);
Jg(a, e, d)
},
enqueueReplaceState: function(a, b, c) {
a = a._reactInternals;
var d = Hg(),
e = Ig(a),
f = zg(d, e);
f.tag = 1;
f.payload = b;
void 0 !== c && null !== c && (f.callback = c);
Ag(a, f);
Jg(a, e, d)
},
enqueueForceUpdate: function(a, b) {
a = a._reactInternals;
var c = Hg(),
d = Ig(a),
e = zg(c, d);
e.tag = 2;
void 0 !== b && null !== b && (e.callback =
b);
Ag(a, e);
Jg(a, d, c)
}
};
function Lg(a, b, c, d, e, f, g) {
a = a.stateNode;
return "function" === typeof a.shouldComponentUpdate ? a.shouldComponentUpdate(d, f, g) : b.prototype && b.prototype.isPureReactComponent ? !Je(c, d) || !Je(e, f) : !0
}
function Mg(a, b, c) {
var d = !1,
e = Cf;
var f = b.contextType;
"object" === typeof f && null !== f ? f = vg(f) : (e = Ff(b) ? Df : M.current, d = b.contextTypes, f = (d = null !== d && void 0 !== d) ? Ef(a, e) : Cf);
b = new b(c, f);
a.memoizedState = null !== b.state && void 0 !== b.state ? b.state : null;
b.updater = Kg;
a.stateNode = b;
b._reactInternals = a;
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f);
return b
}
function Ng(a, b, c, d) {
a = b.state;
"function" === typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d);
"function" === typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d);
b.state !== a && Kg.enqueueReplaceState(b, b.state, null)
}
function Og(a, b, c, d) {
var e = a.stateNode;
e.props = c;
e.state = a.memoizedState;
e.refs = Fg;
xg(a);
var f = b.contextType;
"object" === typeof f && null !== f ? e.context = vg(f) : (f = Ff(b) ? Df : M.current, e.context = Ef(a, f));
Cg(a, c, e, d);
e.state = a.memoizedState;
f = b.getDerivedStateFromProps;
"function" === typeof f && (Gg(a, b, f, c), e.state = a.memoizedState);
"function" === typeof b.getDerivedStateFromProps || "function" === typeof e.getSnapshotBeforeUpdate || "function" !== typeof e.UNSAFE_componentWillMount && "function" !== typeof e.componentWillMount ||
(b = e.state, "function" === typeof e.componentWillMount && e.componentWillMount(), "function" === typeof e.UNSAFE_componentWillMount && e.UNSAFE_componentWillMount(), b !== e.state && Kg.enqueueReplaceState(e, e.state, null), Cg(a, c, e, d), e.state = a.memoizedState);
"function" === typeof e.componentDidMount && (a.flags |= 4)
}
var Pg = Array.isArray;
function Qg(a, b, c) {
a = c.ref;
if (null !== a && "function" !== typeof a && "object" !== typeof a) {
if (c._owner) {
c = c._owner;
if (c) {
if (1 !== c.tag) throw Error(y(309));
var d = c.stateNode
}
if (!d) throw Error(y(147, a));
var e = "" + a;
if (null !== b && null !== b.ref && "function" === typeof b.ref && b.ref._stringRef === e) return b.ref;
b = function(a) {
var b = d.refs;
b === Fg && (b = d.refs = {});
null === a ? delete b[e] : b[e] = a
};
b._stringRef = e;
return b
}
if ("string" !== typeof a) throw Error(y(284));
if (!c._owner) throw Error(y(290, a));
}
return a
}
function Rg(a, b) {
if ("textarea" !== a.type) throw Error(y(31, "[object Object]" === Object.prototype.toString.call(b) ? "object with keys {" + Object.keys(b).join(", ") + "}" : b));
}
function Sg(a) {
function b(b, c) {
if (a) {
var d = b.lastEffect;
null !== d ? (d.nextEffect = c, b.lastEffect = c) : b.firstEffect = b.lastEffect = c;
c.nextEffect = null;
c.flags = 8
}
}
function c(c, d) {
if (!a) return null;
for (; null !== d;) b(c, d), d = d.sibling;
return null
}
function d(a, b) {
for (a = new Map; null !== b;) null !== b.key ? a.set(b.key, b) : a.set(b.index, b), b = b.sibling;
return a
}
function e(a, b) {
a = Tg(a, b);
a.index = 0;
a.sibling = null;
return a
}
function f(b, c, d) {
b.index = d;
if (!a) return c;
d = b.alternate;
if (null !== d) return d = d.index, d < c ? (b.flags = 2,
c) : d;
b.flags = 2;
return c
}
function g(b) {
a && null === b.alternate && (b.flags = 2);
return b
}
function h(a, b, c, d) {
if (null === b || 6 !== b.tag) return b = Ug(c, a.mode, d), b.return = a, b;
b = e(b, c);
b.return = a;
return b
}
function k(a, b, c, d) {
if (null !== b && b.elementType === c.type) return d = e(b, c.props), d.ref = Qg(a, b, c), d.return = a, d;
d = Vg(c.type, c.key, c.props, null, a.mode, d);
d.ref = Qg(a, b, c);
d.return = a;
return d
}
function l(a, b, c, d) {
if (null === b || 4 !== b.tag || b.stateNode.containerInfo !== c.containerInfo || b.stateNode.implementation !== c.implementation) return b =
Wg(c, a.mode, d), b.return = a, b;
b = e(b, c.children || []);
b.return = a;
return b
}
function n(a, b, c, d, f) {
if (null === b || 7 !== b.tag) return b = Xg(c, a.mode, d, f), b.return = a, b;
b = e(b, c);
b.return = a;
return b
}
function A(a, b, c) {
if ("string" === typeof b || "number" === typeof b) return b = Ug("" + b, a.mode, c), b.return = a, b;
if ("object" === typeof b && null !== b) {
switch (b.$$typeof) {
case sa:
return c = Vg(b.type, b.key, b.props, null, a.mode, c), c.ref = Qg(a, null, b), c.return = a, c;
case ta:
return b = Wg(b, a.mode, c), b.return = a, b
}
if (Pg(b) || La(b)) return b = Xg(b,
a.mode, c, null), b.return = a, b;
Rg(a, b)
}
return null
}
function p(a, b, c, d) {
var e = null !== b ? b.key : null;
if ("string" === typeof c || "number" === typeof c) return null !== e ? null : h(a, b, "" + c, d);
if ("object" === typeof c && null !== c) {
switch (c.$$typeof) {
case sa:
return c.key === e ? c.type === ua ? n(a, b, c.props.children, d, e) : k(a, b, c, d) : null;
case ta:
return c.key === e ? l(a, b, c, d) : null
}
if (Pg(c) || La(c)) return null !== e ? null : n(a, b, c, d, null);
Rg(a, c)
}
return null
}
function C(a, b, c, d, e) {
if ("string" === typeof d || "number" === typeof d) return a = a.get(c) ||
null, h(b, a, "" + d, e);
if ("object" === typeof d && null !== d) {
switch (d.$$typeof) {
case sa:
return a = a.get(null === d.key ? c : d.key) || null, d.type === ua ? n(b, a, d.props.children, e, d.key) : k(b, a, d, e);
case ta:
return a = a.get(null === d.key ? c : d.key) || null, l(b, a, d, e)
}
if (Pg(d) || La(d)) return a = a.get(c) || null, n(b, a, d, e, null);
Rg(b, d)
}
return null
}
function x(e, g, h, k) {
for (var l = null, t = null, u = g, z = g = 0, q = null; null !== u && z < h.length; z++) {
u.index > z ? (q = u, u = null) : q = u.sibling;
var n = p(e, u, h[z], k);
if (null === n) {
null === u && (u = q);
break
}
a && u && null ===
n.alternate && b(e, u);
g = f(n, g, z);
null === t ? l = n : t.sibling = n;
t = n;
u = q
}
if (z === h.length) return c(e, u), l;
if (null === u) {
for (; z < h.length; z++) u = A(e, h[z], k), null !== u && (g = f(u, g, z), null === t ? l = u : t.sibling = u, t = u);
return l
}
for (u = d(e, u); z < h.length; z++) q = C(u, e, z, h[z], k), null !== q && (a && null !== q.alternate && u.delete(null === q.key ? z : q.key), g = f(q, g, z), null === t ? l = q : t.sibling = q, t = q);
a && u.forEach(function(a) {
return b(e, a)
});
return l
}
function w(e, g, h, k) {
var l = La(h);
if ("function" !== typeof l) throw Error(y(150));
h = l.call(h);
if (null ==
h) throw Error(y(151));
for (var t = l = null, u = g, z = g = 0, q = null, n = h.next(); null !== u && !n.done; z++, n = h.next()) {
u.index > z ? (q = u, u = null) : q = u.sibling;
var w = p(e, u, n.value, k);
if (null === w) {
null === u && (u = q);
break
}
a && u && null === w.alternate && b(e, u);
g = f(w, g, z);
null === t ? l = w : t.sibling = w;
t = w;
u = q
}
if (n.done) return c(e, u), l;
if (null === u) {
for (; !n.done; z++, n = h.next()) n = A(e, n.value, k), null !== n && (g = f(n, g, z), null === t ? l = n : t.sibling = n, t = n);
return l
}
for (u = d(e, u); !n.done; z++, n = h.next()) n = C(u, e, z, n.value, k), null !== n && (a && null !== n.alternate &&
u.delete(null === n.key ? z : n.key), g = f(n, g, z), null === t ? l = n : t.sibling = n, t = n);
a && u.forEach(function(a) {
return b(e, a)
});
return l
}
return function(a, d, f, h) {
var k = "object" === typeof f && null !== f && f.type === ua && null === f.key;
k && (f = f.props.children);
var l = "object" === typeof f && null !== f;
if (l) switch (f.$$typeof) {
case sa:
a: {
l = f.key;
for (k = d; null !== k;) {
if (k.key === l) {
switch (k.tag) {
case 7:
if (f.type === ua) {
c(a, k.sibling);
d = e(k, f.props.children);
d.return = a;
a = d;
break a
}
break;
default:
if (k.elementType === f.type) {
c(a, k.sibling);
d = e(k, f.props);
d.ref = Qg(a, k, f);
d.return = a;
a = d;
break a
}
}
c(a, k);
break
} else b(a, k);
k = k.sibling
}
f.type === ua ? (d = Xg(f.props.children, a.mode, h, f.key), d.return = a, a = d) : (h = Vg(f.type, f.key, f.props, null, a.mode, h), h.ref = Qg(a, d, f), h.return = a, a = h)
}
return g(a);
case ta:
a: {
for (k = f.key; null !== d;) {
if (d.key === k)
if (4 === d.tag && d.stateNode.containerInfo === f.containerInfo && d.stateNode.implementation === f.implementation) {
c(a, d.sibling);
d = e(d, f.children || []);
d.return = a;
a = d;
break a
} else {
c(a, d);
break
} else b(a, d);
d = d.sibling
}
d =
Wg(f, a.mode, h);
d.return = a;
a = d
}
return g(a)
}
if ("string" === typeof f || "number" === typeof f) return f = "" + f, null !== d && 6 === d.tag ? (c(a, d.sibling), d = e(d, f), d.return = a, a = d) : (c(a, d), d = Ug(f, a.mode, h), d.return = a, a = d), g(a);
if (Pg(f)) return x(a, d, f, h);
if (La(f)) return w(a, d, f, h);
l && Rg(a, f);
if ("undefined" === typeof f && !k) switch (a.tag) {
case 1:
case 22:
case 0:
case 11:
case 15:
throw Error(y(152, Ra(a.type) || "Component"));
}
return c(a, d)
}
}
var Yg = Sg(!0),
Zg = Sg(!1),
$g = {},
ah = Bf($g),
bh = Bf($g),
ch = Bf($g);
function dh(a) {
if (a === $g) throw Error(y(174));
return a
}
function eh(a, b) {
I(ch, b);
I(bh, a);
I(ah, $g);
a = b.nodeType;
switch (a) {
case 9:
case 11:
b = (b = b.documentElement) ? b.namespaceURI : mb(null, "");
break;
default:
a = 8 === a ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = mb(b, a)
}
H(ah);
I(ah, b)
}
function fh() {
H(ah);
H(bh);
H(ch)
}
function gh(a) {
dh(ch.current);
var b = dh(ah.current);
var c = mb(b, a.type);
b !== c && (I(bh, a), I(ah, c))
}
function hh(a) {
bh.current === a && (H(ah), H(bh))
}
var P = Bf(0);
function ih(a) {
for (var b = a; null !== b;) {
if (13 === b.tag) {
var c = b.memoizedState;
if (null !== c && (c = c.dehydrated, null === c || "$?" === c.data || "$!" === c.data)) return b
} else if (19 === b.tag && void 0 !== b.memoizedProps.revealOrder) {
if (0 !== (b.flags & 64)) return b
} else if (null !== b.child) {
b.child.return = b;
b = b.child;
continue
}
if (b === a) break;
for (; null === b.sibling;) {
if (null === b.return || b.return === a) return null;
b = b.return
}
b.sibling.return = b.return;
b = b.sibling
}
return null
}
var jh = null,
kh = null,
lh = !1;
function mh(a, b) {
var c = nh(5, null, null, 0);
c.elementType = "DELETED";
c.type = "DELETED";
c.stateNode = b;
c.return = a;
c.flags = 8;
null !== a.lastEffect ? (a.lastEffect.nextEffect = c, a.lastEffect = c) : a.firstEffect = a.lastEffect = c
}
function oh(a, b) {
switch (a.tag) {
case 5:
var c = a.type;
b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b;
return null !== b ? (a.stateNode = b, !0) : !1;
case 6:
return b = "" === a.pendingProps || 3 !== b.nodeType ? null : b, null !== b ? (a.stateNode = b, !0) : !1;
case 13:
return !1;
default:
return !1
}
}
function ph(a) {
if (lh) {
var b = kh;
if (b) {
var c = b;
if (!oh(a, b)) {
b = rf(c.nextSibling);
if (!b || !oh(a, b)) {
a.flags = a.flags & -1025 | 2;
lh = !1;
jh = a;
return
}
mh(jh, c)
}
jh = a;
kh = rf(b.firstChild)
} else a.flags = a.flags & -1025 | 2, lh = !1, jh = a
}
}
function qh(a) {
for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag && 13 !== a.tag;) a = a.return;
jh = a
}
function rh(a) {
if (a !== jh) return !1;
if (!lh) return qh(a), lh = !0, !1;
var b = a.type;
if (5 !== a.tag || "head" !== b && "body" !== b && !nf(b, a.memoizedProps))
for (b = kh; b;) mh(a, b), b = rf(b.nextSibling);
qh(a);
if (13 === a.tag) {
a = a.memoizedState;
a = null !== a ? a.dehydrated : null;
if (!a) throw Error(y(317));
a: {
a = a.nextSibling;
for (b = 0; a;) {
if (8 === a.nodeType) {
var c = a.data;
if ("/$" === c) {
if (0 === b) {
kh = rf(a.nextSibling);
break a
}
b--
} else "$" !== c && "$!" !== c && "$?" !== c || b++
}
a = a.nextSibling
}
kh = null
}
} else kh = jh ? rf(a.stateNode.nextSibling) : null;
return !0
}
function sh() {
kh = jh = null;
lh = !1
}
var th = [];
function uh() {
for (var a = 0; a < th.length; a++) th[a]._workInProgressVersionPrimary = null;
th.length = 0
}
var vh = ra.ReactCurrentDispatcher,
wh = ra.ReactCurrentBatchConfig,
xh = 0,
R = null,
S = null,
T = null,
yh = !1,
zh = !1;
function Ah() {
throw Error(y(321));
}
function Bh(a, b) {
if (null === b) return !1;
for (var c = 0; c < b.length && c < a.length; c++)
if (!He(a[c], b[c])) return !1;
return !0
}
function Ch(a, b, c, d, e, f) {
xh = f;
R = b;
b.memoizedState = null;
b.updateQueue = null;
b.lanes = 0;
vh.current = null === a || null === a.memoizedState ? Dh : Eh;
a = c(d, e);
if (zh) {
f = 0;
do {
zh = !1;
if (!(25 > f)) throw Error(y(301));
f += 1;
T = S = null;
b.updateQueue = null;
vh.current = Fh;
a = c(d, e)
} while (zh)
}
vh.current = Gh;
b = null !== S && null !== S.next;
xh = 0;
T = S = R = null;
yh = !1;
if (b) throw Error(y(300));
return a
}
function Hh() {
var a = {
memoizedState: null,
baseState: null,
baseQueue: null,
queue: null,
next: null
};
null === T ? R.memoizedState = T = a : T = T.next = a;
return T
}
function Ih() {
if (null === S) {
var a = R.alternate;
a = null !== a ? a.memoizedState : null
} else a = S.next;
var b = null === T ? R.memoizedState : T.next;
if (null !== b) T = b, S = a;
else {
if (null === a) throw Error(y(310));
S = a;
a = {
memoizedState: S.memoizedState,
baseState: S.baseState,
baseQueue: S.baseQueue,
queue: S.queue,
next: null
};
null === T ? R.memoizedState = T = a : T = T.next = a
}
return T
}
function Jh(a, b) {
return "function" === typeof b ? b(a) : b
}
function Kh(a) {
var b = Ih(),
c = b.queue;
if (null === c) throw Error(y(311));
c.lastRenderedReducer = a;
var d = S,
e = d.baseQueue,
f = c.pending;
if (null !== f) {
if (null !== e) {
var g = e.next;
e.next = f.next;
f.next = g
}
d.baseQueue = e = f;
c.pending = null
}
if (null !== e) {
e = e.next;
d = d.baseState;
var h = g = f = null,
k = e;
do {
var l = k.lane;
if ((xh & l) === l) null !== h && (h = h.next = {
lane: 0,
action: k.action,
eagerReducer: k.eagerReducer,
eagerState: k.eagerState,
next: null
}), d = k.eagerReducer === a ? k.eagerState : a(d, k.action);
else {
var n = {
lane: l,
action: k.action,
eagerReducer: k.eagerReducer,
eagerState: k.eagerState,
next: null
};
null === h ? (g = h = n, f = d) : h = h.next = n;
R.lanes |= l;
Dg |= l
}
k = k.next
} while (null !== k && k !== e);
null === h ? f = d : h.next = g;
He(d, b.memoizedState) || (ug = !0);
b.memoizedState = d;
b.baseState = f;
b.baseQueue = h;
c.lastRenderedState = d
}
return [b.memoizedState, c.dispatch]
}
function Lh(a) {
var b = Ih(),
c = b.queue;
if (null === c) throw Error(y(311));
c.lastRenderedReducer = a;
var d = c.dispatch,
e = c.pending,
f = b.memoizedState;
if (null !== e) {
c.pending = null;
var g = e = e.next;
do f = a(f, g.action), g = g.next; while (g !== e);
He(f, b.memoizedState) || (ug = !0);
b.memoizedState = f;
null === b.baseQueue && (b.baseState = f);
c.lastRenderedState = f
}
return [f, d]
}
function Mh(a, b, c) {
var d = b._getVersion;
d = d(b._source);
var e = b._workInProgressVersionPrimary;
if (null !== e) a = e === d;
else if (a = a.mutableReadLanes, a = (xh & a) === a) b._workInProgressVersionPrimary = d, th.push(b);
if (a) return c(b._source);
th.push(b);
throw Error(y(350));
}
function Nh(a, b, c, d) {
var e = U;
if (null === e) throw Error(y(349));
var f = b._getVersion,
g = f(b._source),
h = vh.current,
k = h.useState(function() {
return Mh(e, b, c)
}),
l = k[1],
n = k[0];
k = T;
var A = a.memoizedState,
p = A.refs,
C = p.getSnapshot,
x = A.source;
A = A.subscribe;
var w = R;
a.memoizedState = {
refs: p,
source: b,
subscribe: d
};
h.useEffect(function() {
p.getSnapshot = c;
p.setSnapshot = l;
var a = f(b._source);
if (!He(g, a)) {
a = c(b._source);
He(n, a) || (l(a), a = Ig(w), e.mutableReadLanes |= a & e.pendingLanes);
a = e.mutableReadLanes;
e.entangledLanes |= a;
for (var d =
e.entanglements, h = a; 0 < h;) {
var k = 31 - Vc(h),
v = 1 << k;
d[k] |= a;
h &= ~v
}
}
}, [c, b, d]);
h.useEffect(function() {
return d(b._source, function() {
var a = p.getSnapshot,
c = p.setSnapshot;
try {
c(a(b._source));
var d = Ig(w);
e.mutableReadLanes |= d & e.pendingLanes
} catch (q) {
c(function() {
throw q;
})
}
})
}, [b, d]);
He(C, c) && He(x, b) && He(A, d) || (a = {
pending: null,
dispatch: null,
lastRenderedReducer: Jh,
lastRenderedState: n
}, a.dispatch = l = Oh.bind(null, R, a), k.queue = a, k.baseQueue = null, n = Mh(e, b, c), k.memoizedState = k.baseState = n);
return n
}
function Ph(a, b, c) {
var d = Ih();
return Nh(d, a, b, c)
}
function Qh(a) {
var b = Hh();
"function" === typeof a && (a = a());
b.memoizedState = b.baseState = a;
a = b.queue = {
pending: null,
dispatch: null,
lastRenderedReducer: Jh,
lastRenderedState: a
};
a = a.dispatch = Oh.bind(null, R, a);
return [b.memoizedState, a]
}
function Rh(a, b, c, d) {
a = {
tag: a,
create: b,
destroy: c,
deps: d,
next: null
};
b = R.updateQueue;
null === b ? (b = {
lastEffect: null
}, R.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, null === c ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a));
return a
}
function Sh(a) {
var b = Hh();
a = {
current: a
};
return b.memoizedState = a
}
function Th() {
return Ih().memoizedState
}
function Uh(a, b, c, d) {
var e = Hh();
R.flags |= a;
e.memoizedState = Rh(1 | b, c, void 0, void 0 === d ? null : d)
}
function Vh(a, b, c, d) {
var e = Ih();
d = void 0 === d ? null : d;
var f = void 0;
if (null !== S) {
var g = S.memoizedState;
f = g.destroy;
if (null !== d && Bh(d, g.deps)) {
Rh(b, c, f, d);
return
}
}
R.flags |= a;
e.memoizedState = Rh(1 | b, c, f, d)
}
function Wh(a, b) {
return Uh(516, 4, a, b)
}
function Xh(a, b) {
return Vh(516, 4, a, b)
}
function Yh(a, b) {
return Vh(4, 2, a, b)
}
function Zh(a, b) {
if ("function" === typeof b) return a = a(), b(a),
function() {
b(null)
};
if (null !== b && void 0 !== b) return a = a(), b.current = a,
function() {
b.current = null
}
}
function $h(a, b, c) {
c = null !== c && void 0 !== c ? c.concat([a]) : null;
return Vh(4, 2, Zh.bind(null, b, a), c)
}
function ai() {}
function bi(a, b) {
var c = Ih();
b = void 0 === b ? null : b;
var d = c.memoizedState;
if (null !== d && null !== b && Bh(b, d[1])) return d[0];
c.memoizedState = [a, b];
return a
}
function ci(a, b) {
var c = Ih();
b = void 0 === b ? null : b;
var d = c.memoizedState;
if (null !== d && null !== b && Bh(b, d[1])) return d[0];
a = a();
c.memoizedState = [a, b];
return a
}
function di(a, b) {
var c = eg();
gg(98 > c ? 98 : c, function() {
a(!0)
});
gg(97 < c ? 97 : c, function() {
var c = wh.transition;
wh.transition = 1;
try {
a(!1), b()
} finally {
wh.transition = c
}
})
}
function Oh(a, b, c) {
var d = Hg(),
e = Ig(a),
f = {
lane: e,
action: c,
eagerReducer: null,
eagerState: null,
next: null
},
g = b.pending;
null === g ? f.next = f : (f.next = g.next, g.next = f);
b.pending = f;
g = a.alternate;
if (a === R || null !== g && g === R) zh = yh = !0;
else {
if (0 === a.lanes && (null === g || 0 === g.lanes) && (g = b.lastRenderedReducer, null !== g)) try {
var h = b.lastRenderedState,
k = g(h, c);
f.eagerReducer = g;
f.eagerState = k;
if (He(k, h)) return
} catch (l) {} finally {}
Jg(a, e, d)
}
}
var Gh = {
readContext: vg,
useCallback: Ah,
useContext: Ah,
useEffect: Ah,
useImperativeHandle: Ah,
useLayoutEffect: Ah,
useMemo: Ah,
useReducer: Ah,
useRef: Ah,
useState: Ah,
useDebugValue: Ah,
useDeferredValue: Ah,
useTransition: Ah,
useMutableSource: Ah,
useOpaqueIdentifier: Ah,
unstable_isNewReconciler: !1
},
Dh = {
readContext: vg,
useCallback: function(a, b) {
Hh().memoizedState = [a, void 0 === b ? null : b];
return a
},
useContext: vg,
useEffect: Wh,
useImperativeHandle: function(a, b, c) {
c = null !== c && void 0 !== c ? c.concat([a]) : null;
return Uh(4, 2, Zh.bind(null,
b, a), c)
},
useLayoutEffect: function(a, b) {
return Uh(4, 2, a, b)
},
useMemo: function(a, b) {
var c = Hh();
b = void 0 === b ? null : b;
a = a();
c.memoizedState = [a, b];
return a
},
useReducer: function(a, b, c) {
var d = Hh();
b = void 0 !== c ? c(b) : b;
d.memoizedState = d.baseState = b;
a = d.queue = {
pending: null,
dispatch: null,
lastRenderedReducer: a,
lastRenderedState: b
};
a = a.dispatch = Oh.bind(null, R, a);
return [d.memoizedState, a]
},
useRef: Sh,
useState: Qh,
useDebugValue: ai,
useDeferredValue: function(a) {
var b = Qh(a),
c = b[0],
d = b[1];
Wh(function() {
var b = wh.transition;
wh.transition = 1;
try {
d(a)
} finally {
wh.transition = b
}
}, [a]);
return c
},
useTransition: function() {
var a = Qh(!1),
b = a[0];
a = di.bind(null, a[1]);
Sh(a);
return [a, b]
},
useMutableSource: function(a, b, c) {
var d = Hh();
d.memoizedState = {
refs: {
getSnapshot: b,
setSnapshot: null
},
source: a,
subscribe: c
};
return Nh(d, a, b, c)
},
useOpaqueIdentifier: function() {
if (lh) {
var a = !1,
b = uf(function() {
a || (a = !0, c("r:" + (tf++).toString(36)));
throw Error(y(355));
}),
c = Qh(b)[1];
0 === (R.mode & 2) && (R.flags |= 516, Rh(5, function() {
c("r:" + (tf++).toString(36))
},
void 0, null));
return b
}
b = "r:" + (tf++).toString(36);
Qh(b);
return b
},
unstable_isNewReconciler: !1
},
Eh = {
readContext: vg,
useCallback: bi,
useContext: vg,
useEffect: Xh,
useImperativeHandle: $h,
useLayoutEffect: Yh,
useMemo: ci,
useReducer: Kh,
useRef: Th,
useState: function() {
return Kh(Jh)
},
useDebugValue: ai,
useDeferredValue: function(a) {
var b = Kh(Jh),
c = b[0],
d = b[1];
Xh(function() {
var b = wh.transition;
wh.transition = 1;
try {
d(a)
} finally {
wh.transition = b
}
}, [a]);
return c
},
useTransition: function() {
var a = Kh(Jh)[0];
return [Th().current,
a
]
},
useMutableSource: Ph,
useOpaqueIdentifier: function() {
return Kh(Jh)[0]
},
unstable_isNewReconciler: !1
},
Fh = {
readContext: vg,
useCallback: bi,
useContext: vg,
useEffect: Xh,
useImperativeHandle: $h,
useLayoutEffect: Yh,
useMemo: ci,
useReducer: Lh,
useRef: Th,
useState: function() {
return Lh(Jh)
},
useDebugValue: ai,
useDeferredValue: function(a) {
var b = Lh(Jh),
c = b[0],
d = b[1];
Xh(function() {
var b = wh.transition;
wh.transition = 1;
try {
d(a)
} finally {
wh.transition = b
}
}, [a]);
return c
},
useTransition: function() {
var a = Lh(Jh)[0];
return [Th().current,
a
]
},
useMutableSource: Ph,
useOpaqueIdentifier: function() {
return Lh(Jh)[0]
},
unstable_isNewReconciler: !1
},
ei = ra.ReactCurrentOwner,
ug = !1;
function fi(a, b, c, d) {
b.child = null === a ? Zg(b, null, c, d) : Yg(b, a.child, c, d)
}
function gi(a, b, c, d, e) {
c = c.render;
var f = b.ref;
tg(b, e);
d = Ch(a, b, c, d, f, e);
if (null !== a && !ug) return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi(a, b, e);
b.flags |= 1;
fi(a, b, d, e);
return b.child
}
function ii(a, b, c, d, e, f) {
if (null === a) {
var g = c.type;
if ("function" === typeof g && !ji(g) && void 0 === g.defaultProps && null === c.compare && void 0 === c.defaultProps) return b.tag = 15, b.type = g, ki(a, b, g, d, e, f);
a = Vg(c.type, null, d, b, b.mode, f);
a.ref = b.ref;
a.return = b;
return b.child = a
}
g = a.child;
if (0 === (e & f) && (e = g.memoizedProps, c = c.compare, c = null !== c ? c : Je, c(e, d) && a.ref === b.ref)) return hi(a, b, f);
b.flags |= 1;
a = Tg(g, d);
a.ref = b.ref;
a.return = b;
return b.child = a
}
function ki(a, b, c, d, e, f) {
if (null !== a && Je(a.memoizedProps, d) && a.ref === b.ref)
if (ug = !1, 0 !== (f & e)) 0 !== (a.flags & 16384) && (ug = !0);
else return b.lanes = a.lanes, hi(a, b, f);
return li(a, b, c, d, f)
}
function mi(a, b, c) {
var d = b.pendingProps,
e = d.children,
f = null !== a ? a.memoizedState : null;
if ("hidden" === d.mode || "unstable-defer-without-hiding" === d.mode)
if (0 === (b.mode & 4)) b.memoizedState = {
baseLanes: 0
}, ni(b, c);
else if (0 !== (c & 1073741824)) b.memoizedState = {
baseLanes: 0
}, ni(b, null !== f ? f.baseLanes : c);
else return a = null !== f ? f.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = {
baseLanes: a
}, ni(b, a), null;
else null !== f ? (d = f.baseLanes | c, b.memoizedState = null) : d = c, ni(b, d);
fi(a, b, e, c);
return b.child
}
function oi(a, b) {
var c = b.ref;
if (null === a && null !== c || null !== a && a.ref !== c) b.flags |= 128
}
function li(a, b, c, d, e) {
var f = Ff(c) ? Df : M.current;
f = Ef(b, f);
tg(b, e);
c = Ch(a, b, c, d, f, e);
if (null !== a && !ug) return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi(a, b, e);
b.flags |= 1;
fi(a, b, c, e);
return b.child
}
function pi(a, b, c, d, e) {
if (Ff(c)) {
var f = !0;
Jf(b)
} else f = !1;
tg(b, e);
if (null === b.stateNode) null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2), Mg(b, c, d), Og(b, c, d, e), d = !0;
else if (null === a) {
var g = b.stateNode,
h = b.memoizedProps;
g.props = h;
var k = g.context,
l = c.contextType;
"object" === typeof l && null !== l ? l = vg(l) : (l = Ff(c) ? Df : M.current, l = Ef(b, l));
var n = c.getDerivedStateFromProps,
A = "function" === typeof n || "function" === typeof g.getSnapshotBeforeUpdate;
A || "function" !== typeof g.UNSAFE_componentWillReceiveProps &&
"function" !== typeof g.componentWillReceiveProps || (h !== d || k !== l) && Ng(b, g, d, l);
wg = !1;
var p = b.memoizedState;
g.state = p;
Cg(b, d, g, e);
k = b.memoizedState;
h !== d || p !== k || N.current || wg ? ("function" === typeof n && (Gg(b, c, n, d), k = b.memoizedState), (h = wg || Lg(b, c, h, d, p, k, l)) ? (A || "function" !== typeof g.UNSAFE_componentWillMount && "function" !== typeof g.componentWillMount || ("function" === typeof g.componentWillMount && g.componentWillMount(), "function" === typeof g.UNSAFE_componentWillMount && g.UNSAFE_componentWillMount()), "function" ===
typeof g.componentDidMount && (b.flags |= 4)) : ("function" === typeof g.componentDidMount && (b.flags |= 4), b.memoizedProps = d, b.memoizedState = k), g.props = d, g.state = k, g.context = l, d = h) : ("function" === typeof g.componentDidMount && (b.flags |= 4), d = !1)
} else {
g = b.stateNode;
yg(a, b);
h = b.memoizedProps;
l = b.type === b.elementType ? h : lg(b.type, h);
g.props = l;
A = b.pendingProps;
p = g.context;
k = c.contextType;
"object" === typeof k && null !== k ? k = vg(k) : (k = Ff(c) ? Df : M.current, k = Ef(b, k));
var C = c.getDerivedStateFromProps;
(n = "function" === typeof C ||
"function" === typeof g.getSnapshotBeforeUpdate) || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== A || p !== k) && Ng(b, g, d, k);
wg = !1;
p = b.memoizedState;
g.state = p;
Cg(b, d, g, e);
var x = b.memoizedState;
h !== A || p !== x || N.current || wg ? ("function" === typeof C && (Gg(b, c, C, d), x = b.memoizedState), (l = wg || Lg(b, c, l, d, p, x, k)) ? (n || "function" !== typeof g.UNSAFE_componentWillUpdate && "function" !== typeof g.componentWillUpdate || ("function" === typeof g.componentWillUpdate && g.componentWillUpdate(d,
x, k), "function" === typeof g.UNSAFE_componentWillUpdate && g.UNSAFE_componentWillUpdate(d, x, k)), "function" === typeof g.componentDidUpdate && (b.flags |= 4), "function" === typeof g.getSnapshotBeforeUpdate && (b.flags |= 256)) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 256), b.memoizedProps = d, b.memoizedState = x), g.props = d, g.state = x, g.context = k, d = l) : ("function" !== typeof g.componentDidUpdate ||
h === a.memoizedProps && p === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 256), d = !1)
}
return qi(a, b, c, d, f, e)
}
function qi(a, b, c, d, e, f) {
oi(a, b);
var g = 0 !== (b.flags & 64);
if (!d && !g) return e && Kf(b, c, !1), hi(a, b, f);
d = b.stateNode;
ei.current = b;
var h = g && "function" !== typeof c.getDerivedStateFromError ? null : d.render();
b.flags |= 1;
null !== a && g ? (b.child = Yg(b, a.child, null, f), b.child = Yg(b, null, h, f)) : fi(a, b, h, f);
b.memoizedState = d.state;
e && Kf(b, c, !0);
return b.child
}
function ri(a) {
var b = a.stateNode;
b.pendingContext ? Hf(a, b.pendingContext, b.pendingContext !== b.context) : b.context && Hf(a, b.context, !1);
eh(a, b.containerInfo)
}
var si = {
dehydrated: null,
retryLane: 0
};
function ti(a, b, c) {
var d = b.pendingProps,
e = P.current,
f = !1,
g;
(g = 0 !== (b.flags & 64)) || (g = null !== a && null === a.memoizedState ? !1 : 0 !== (e & 2));
g ? (f = !0, b.flags &= -65) : null !== a && null === a.memoizedState || void 0 === d.fallback || !0 === d.unstable_avoidThisFallback || (e |= 1);
I(P, e & 1);
if (null === a) {
void 0 !== d.fallback && ph(b);
a = d.children;
e = d.fallback;
if (f) return a = ui(b, a, e, c), b.child.memoizedState = {
baseLanes: c
}, b.memoizedState = si, a;
if ("number" === typeof d.unstable_expectedLoadTime) return a = ui(b, a, e, c), b.child.memoizedState = {
baseLanes: c
},
b.memoizedState = si, b.lanes = 33554432, a;
c = vi({
mode: "visible",
children: a
}, b.mode, c, null);
c.return = b;
return b.child = c
}
if (null !== a.memoizedState) {
if (f) return d = wi(a, b, d.children, d.fallback, c), f = b.child, e = a.child.memoizedState, f.memoizedState = null === e ? {
baseLanes: c
} : {
baseLanes: e.baseLanes | c
}, f.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
c = xi(a, b, d.children, c);
b.memoizedState = null;
return c
}
if (f) return d = wi(a, b, d.children, d.fallback, c), f = b.child, e = a.child.memoizedState, f.memoizedState = null === e ? {
baseLanes: c
} : {
baseLanes: e.baseLanes | c
}, f.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
c = xi(a, b, d.children, c);
b.memoizedState = null;
return c
}
function ui(a, b, c, d) {
var e = a.mode,
f = a.child;
b = {
mode: "hidden",
children: b
};
0 === (e & 2) && null !== f ? (f.childLanes = 0, f.pendingProps = b) : f = vi(b, e, 0, null);
c = Xg(c, e, d, null);
f.return = a;
c.return = a;
f.sibling = c;
a.child = f;
return c
}
function xi(a, b, c, d) {
var e = a.child;
a = e.sibling;
c = Tg(e, {
mode: "visible",
children: c
});
0 === (b.mode & 2) && (c.lanes = d);
c.return = b;
c.sibling = null;
null !== a && (a.nextEffect = null, a.flags = 8, b.firstEffect = b.lastEffect = a);
return b.child = c
}
function wi(a, b, c, d, e) {
var f = b.mode,
g = a.child;
a = g.sibling;
var h = {
mode: "hidden",
children: c
};
0 === (f & 2) && b.child !== g ? (c = b.child, c.childLanes = 0, c.pendingProps = h, g = c.lastEffect, null !== g ? (b.firstEffect = c.firstEffect, b.lastEffect = g, g.nextEffect = null) : b.firstEffect = b.lastEffect = null) : c = Tg(g, h);
null !== a ? d = Tg(a, d) : (d = Xg(d, f, e, null), d.flags |= 2);
d.return = b;
c.return = b;
c.sibling = d;
b.child = c;
return d
}
function yi(a, b) {
a.lanes |= b;
var c = a.alternate;
null !== c && (c.lanes |= b);
sg(a.return, b)
}
function zi(a, b, c, d, e, f) {
var g = a.memoizedState;
null === g ? a.memoizedState = {
isBackwards: b,
rendering: null,
renderingStartTime: 0,
last: d,
tail: c,
tailMode: e,
lastEffect: f
} : (g.isBackwards = b, g.rendering = null, g.renderingStartTime = 0, g.last = d, g.tail = c, g.tailMode = e, g.lastEffect = f)
}
function Ai(a, b, c) {
var d = b.pendingProps,
e = d.revealOrder,
f = d.tail;
fi(a, b, d.children, c);
d = P.current;
if (0 !== (d & 2)) d = d & 1 | 2, b.flags |= 64;
else {
if (null !== a && 0 !== (a.flags & 64)) a: for (a = b.child; null !== a;) {
if (13 === a.tag) null !== a.memoizedState && yi(a, c);
else if (19 === a.tag) yi(a, c);
else if (null !== a.child) {
a.child.return = a;
a = a.child;
continue
}
if (a === b) break a;
for (; null === a.sibling;) {
if (null === a.return || a.return === b) break a;
a = a.return
}
a.sibling.return = a.return;
a = a.sibling
}
d &= 1
}
I(P, d);
if (0 === (b.mode & 2)) b.memoizedState =
null;
else switch (e) {
case "forwards":
c = b.child;
for (e = null; null !== c;) a = c.alternate, null !== a && null === ih(a) && (e = c), c = c.sibling;
c = e;
null === c ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null);
zi(b, !1, e, c, f, b.lastEffect);
break;
case "backwards":
c = null;
e = b.child;
for (b.child = null; null !== e;) {
a = e.alternate;
if (null !== a && null === ih(a)) {
b.child = e;
break
}
a = e.sibling;
e.sibling = c;
c = e;
e = a
}
zi(b, !0, c, null, f, b.lastEffect);
break;
case "together":
zi(b, !1, null, null, void 0, b.lastEffect);
break;
default:
b.memoizedState = null
}
return b.child
}
function hi(a, b, c) {
null !== a && (b.dependencies = a.dependencies);
Dg |= b.lanes;
if (0 !== (c & b.childLanes)) {
if (null !== a && b.child !== a.child) throw Error(y(153));
if (null !== b.child) {
a = b.child;
c = Tg(a, a.pendingProps);
b.child = c;
for (c.return = b; null !== a.sibling;) a = a.sibling, c = c.sibling = Tg(a, a.pendingProps), c.return = b;
c.sibling = null
}
return b.child
}
return null
}
var Bi, Ci, Di, Ei;
Bi = function(a, b) {
for (var c = b.child; null !== c;) {
if (5 === c.tag || 6 === c.tag) a.appendChild(c.stateNode);
else if (4 !== c.tag && null !== c.child) {
c.child.return = c;
c = c.child;
continue
}
if (c === b) break;
for (; null === c.sibling;) {
if (null === c.return || c.return === b) return;
c = c.return
}
c.sibling.return = c.return;
c = c.sibling
}
};
Ci = function() {};
Di = function(a, b, c, d) {
var e = a.memoizedProps;
if (e !== d) {
a = b.stateNode;
dh(ah.current);
var f = null;
switch (c) {
case "input":
e = Ya(a, e);
d = Ya(a, d);
f = [];
break;
case "option":
e = eb(a, e);
d = eb(a, d);
f = [];
break;
case "select":
e = m({}, e, {
value: void 0
});
d = m({}, d, {
value: void 0
});
f = [];
break;
case "textarea":
e = gb(a, e);
d = gb(a, d);
f = [];
break;
default:
"function" !== typeof e.onClick && "function" === typeof d.onClick && (a.onclick = jf)
}
vb(c, d);
var g;
c = null;
for (l in e)
if (!d.hasOwnProperty(l) && e.hasOwnProperty(l) && null != e[l])
if ("style" ===
l) {
var h = e[l];
for (g in h) h.hasOwnProperty(g) && (c || (c = {}), c[g] = "")
} else "dangerouslySetInnerHTML" !== l && "children" !== l && "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && "autoFocus" !== l && (ca.hasOwnProperty(l) ? f || (f = []) : (f = f || []).push(l, null));
for (l in d) {
var k = d[l];
h = null != e ? e[l] : void 0;
if (d.hasOwnProperty(l) && k !== h && (null != k || null != h))
if ("style" === l)
if (h) {
for (g in h) !h.hasOwnProperty(g) || k && k.hasOwnProperty(g) || (c || (c = {}), c[g] = "");
for (g in k) k.hasOwnProperty(g) && h[g] !== k[g] && (c ||
(c = {}), c[g] = k[g])
} else c || (f || (f = []), f.push(l, c)), c = k;
else "dangerouslySetInnerHTML" === l ? (k = k ? k.__html : void 0, h = h ? h.__html : void 0, null != k && h !== k && (f = f || []).push(l, k)) : "children" === l ? "string" !== typeof k && "number" !== typeof k || (f = f || []).push(l, "" + k) : "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && (ca.hasOwnProperty(l) ? (null != k && "onScroll" === l && G("scroll", a), f || h === k || (f = [])) : "object" === typeof k && null !== k && k.$$typeof === Ga ? k.toString() : (f = f || []).push(l, k))
}
c && (f = f || []).push("style",
c);
var l = f;
if (b.updateQueue = l) b.flags |= 4
}
};
Ei = function(a, b, c, d) {
c !== d && (b.flags |= 4)
};
function Fi(a, b) {
if (!lh) switch (a.tailMode) {
case "hidden":
b = a.tail;
for (var c = null; null !== b;) null !== b.alternate && (c = b), b = b.sibling;
null === c ? a.tail = null : c.sibling = null;
break;
case "collapsed":
c = a.tail;
for (var d = null; null !== c;) null !== c.alternate && (d = c), c = c.sibling;
null === d ? b || null === a.tail ? a.tail = null : a.tail.sibling = null : d.sibling = null
}
}
function Gi(a, b, c) {
var d = b.pendingProps;
switch (b.tag) {
case 2:
case 16:
case 15:
case 0:
case 11:
case 7:
case 8:
case 12:
case 9:
case 14:
return null;
case 1:
return Ff(b.type) && Gf(), null;
case 3:
fh();
H(N);
H(M);
uh();
d = b.stateNode;
d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null);
if (null === a || null === a.child) rh(b) ? b.flags |= 4 : d.hydrate || (b.flags |= 256);
Ci(b);
return null;
case 5:
hh(b);
var e = dh(ch.current);
c = b.type;
if (null !== a && null != b.stateNode) Di(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 128);
else {
if (!d) {
if (null ===
b.stateNode) throw Error(y(166));
return null
}
a = dh(ah.current);
if (rh(b)) {
d = b.stateNode;
c = b.type;
var f = b.memoizedProps;
d[wf] = b;
d[xf] = f;
switch (c) {
case "dialog":
G("cancel", d);
G("close", d);
break;
case "iframe":
case "object":
case "embed":
G("load", d);
break;
case "video":
case "audio":
for (a = 0; a < Xe.length; a++) G(Xe[a], d);
break;
case "source":
G("error", d);
break;
case "img":
case "image":
case "link":
G("error", d);
G("load", d);
break;
case "details":
G("toggle", d);
break;
case "input":
Za(d, f);
G("invalid", d);
break;
case "select":
d._wrapperState = {
wasMultiple: !!f.multiple
};
G("invalid", d);
break;
case "textarea":
hb(d, f), G("invalid", d)
}
vb(c, f);
a = null;
for (var g in f) f.hasOwnProperty(g) && (e = f[g], "children" === g ? "string" === typeof e ? d.textContent !== e && (a = ["children", e]) : "number" === typeof e && d.textContent !== "" + e && (a = ["children", "" + e]) : ca.hasOwnProperty(g) && null != e && "onScroll" === g && G("scroll", d));
switch (c) {
case "input":
Va(d);
cb(d, f, !0);
break;
case "textarea":
Va(d);
jb(d);
break;
case "select":
case "option":
break;
default:
"function" === typeof f.onClick && (d.onclick =
jf)
}
d = a;
b.updateQueue = d;
null !== d && (b.flags |= 4)
} else {
g = 9 === e.nodeType ? e : e.ownerDocument;
a === kb.html && (a = lb(c));
a === kb.html ? "script" === c ? (a = g.createElement("div"), a.innerHTML = "<script>\x3c/script>", a = a.removeChild(a.firstChild)) : "string" === typeof d.is ? a = g.createElement(c, {
is: d.is
}) : (a = g.createElement(c), "select" === c && (g = a, d.multiple ? g.multiple = !0 : d.size && (g.size = d.size))) : a = g.createElementNS(a, c);
a[wf] = b;
a[xf] = d;
Bi(a, b, !1, !1);
b.stateNode = a;
g = wb(c, d);
switch (c) {
case "dialog":
G("cancel", a);
G("close", a);
e = d;
break;
case "iframe":
case "object":
case "embed":
G("load", a);
e = d;
break;
case "video":
case "audio":
for (e = 0; e < Xe.length; e++) G(Xe[e], a);
e = d;
break;
case "source":
G("error", a);
e = d;
break;
case "img":
case "image":
case "link":
G("error", a);
G("load", a);
e = d;
break;
case "details":
G("toggle", a);
e = d;
break;
case "input":
Za(a, d);
e = Ya(a, d);
G("invalid", a);
break;
case "option":
e = eb(a, d);
break;
case "select":
a._wrapperState = {
wasMultiple: !!d.multiple
};
e = m({}, d, {
value: void 0
});
G("invalid", a);
break;
case "textarea":
hb(a, d);
e =
gb(a, d);
G("invalid", a);
break;
default:
e = d
}
vb(c, e);
var h = e;
for (f in h)
if (h.hasOwnProperty(f)) {
var k = h[f];
"style" === f ? tb(a, k) : "dangerouslySetInnerHTML" === f ? (k = k ? k.__html : void 0, null != k && ob(a, k)) : "children" === f ? "string" === typeof k ? ("textarea" !== c || "" !== k) && pb(a, k) : "number" === typeof k && pb(a, "" + k) : "suppressContentEditableWarning" !== f && "suppressHydrationWarning" !== f && "autoFocus" !== f && (ca.hasOwnProperty(f) ? null != k && "onScroll" === f && G("scroll", a) : null != k && qa(a, f, k, g))
}
switch (c) {
case "input":
Va(a);
cb(a, d, !1);
break;
case "textarea":
Va(a);
jb(a);
break;
case "option":
null != d.value && a.setAttribute("value", "" + Sa(d.value));
break;
case "select":
a.multiple = !!d.multiple;
f = d.value;
null != f ? fb(a, !!d.multiple, f, !1) : null != d.defaultValue && fb(a, !!d.multiple, d.defaultValue, !0);
break;
default:
"function" === typeof e.onClick && (a.onclick = jf)
}
mf(c, d) && (b.flags |= 4)
}
null !== b.ref && (b.flags |= 128)
}
return null;
case 6:
if (a && null != b.stateNode) Ei(a, b, a.memoizedProps, d);
else {
if ("string" !== typeof d && null === b.stateNode) throw Error(y(166));
c = dh(ch.current);
dh(ah.current);
rh(b) ? (d = b.stateNode, c = b.memoizedProps, d[wf] = b, d.nodeValue !== c && (b.flags |= 4)) : (d = (9 === c.nodeType ? c : c.ownerDocument).createTextNode(d), d[wf] = b, b.stateNode = d)
}
return null;
case 13:
H(P);
d = b.memoizedState;
if (0 !== (b.flags & 64)) return b.lanes = c, b;
d = null !== d;
c = !1;
null === a ? void 0 !== b.memoizedProps.fallback && rh(b) : c = null !== a.memoizedState;
if (d && !c && 0 !== (b.mode & 2))
if (null === a && !0 !== b.memoizedProps.unstable_avoidThisFallback || 0 !== (P.current & 1)) 0 === V && (V = 3);
else {
if (0 === V || 3 === V) V =
4;
null === U || 0 === (Dg & 134217727) && 0 === (Hi & 134217727) || Ii(U, W)
}
if (d || c) b.flags |= 4;
return null;
case 4:
return fh(), Ci(b), null === a && cf(b.stateNode.containerInfo), null;
case 10:
return rg(b), null;
case 17:
return Ff(b.type) && Gf(), null;
case 19:
H(P);
d = b.memoizedState;
if (null === d) return null;
f = 0 !== (b.flags & 64);
g = d.rendering;
if (null === g)
if (f) Fi(d, !1);
else {
if (0 !== V || null !== a && 0 !== (a.flags & 64))
for (a = b.child; null !== a;) {
g = ih(a);
if (null !== g) {
b.flags |= 64;
Fi(d, !1);
f = g.updateQueue;
null !== f && (b.updateQueue = f, b.flags |= 4);
null === d.lastEffect && (b.firstEffect = null);
b.lastEffect = d.lastEffect;
d = c;
for (c = b.child; null !== c;) f = c, a = d, f.flags &= 2, f.nextEffect = null, f.firstEffect = null, f.lastEffect = null, g = f.alternate, null === g ? (f.childLanes = 0, f.lanes = a, f.child = null, f.memoizedProps = null, f.memoizedState = null, f.updateQueue = null, f.dependencies = null, f.stateNode = null) : (f.childLanes = g.childLanes, f.lanes = g.lanes, f.child = g.child, f.memoizedProps = g.memoizedProps, f.memoizedState = g.memoizedState, f.updateQueue = g.updateQueue, f.type = g.type, a = g.dependencies,
f.dependencies = null === a ? null : {
lanes: a.lanes,
firstContext: a.firstContext
}), c = c.sibling;
I(P, P.current & 1 | 2);
return b.child
}
a = a.sibling
}
null !== d.tail && O() > Ji && (b.flags |= 64, f = !0, Fi(d, !1), b.lanes = 33554432)
} else {
if (!f)
if (a = ih(g), null !== a) {
if (b.flags |= 64, f = !0, c = a.updateQueue, null !== c && (b.updateQueue = c, b.flags |= 4), Fi(d, !0), null === d.tail && "hidden" === d.tailMode && !g.alternate && !lh) return b = b.lastEffect = d.lastEffect, null !== b && (b.nextEffect = null), null
} else 2 * O() - d.renderingStartTime > Ji && 1073741824 !== c && (b.flags |=
64, f = !0, Fi(d, !1), b.lanes = 33554432);
d.isBackwards ? (g.sibling = b.child, b.child = g) : (c = d.last, null !== c ? c.sibling = g : b.child = g, d.last = g)
}
return null !== d.tail ? (c = d.tail, d.rendering = c, d.tail = c.sibling, d.lastEffect = b.lastEffect, d.renderingStartTime = O(), c.sibling = null, b = P.current, I(P, f ? b & 1 | 2 : b & 1), c) : null;
case 23:
case 24:
return Ki(), null !== a && null !== a.memoizedState !== (null !== b.memoizedState) && "unstable-defer-without-hiding" !== d.mode && (b.flags |= 4), null
}
throw Error(y(156, b.tag));
}
function Li(a) {
switch (a.tag) {
case 1:
Ff(a.type) && Gf();
var b = a.flags;
return b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
case 3:
fh();
H(N);
H(M);
uh();
b = a.flags;
if (0 !== (b & 64)) throw Error(y(285));
a.flags = b & -4097 | 64;
return a;
case 5:
return hh(a), null;
case 13:
return H(P), b = a.flags, b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
case 19:
return H(P), null;
case 4:
return fh(), null;
case 10:
return rg(a), null;
case 23:
case 24:
return Ki(), null;
default:
return null
}
}
function Mi(a, b) {
try {
var c = "",
d = b;
do c += Qa(d), d = d.return; while (d);
var e = c
} catch (f) {
e = "\nError generating stack: " + f.message + "\n" + f.stack
}
return {
value: a,
source: b,
stack: e
}
}
function Ni(a, b) {
try {
console.error(b.value)
} catch (c) {
setTimeout(function() {
throw c;
})
}
}
var Oi = "function" === typeof WeakMap ? WeakMap : Map;
function Pi(a, b, c) {
c = zg(-1, c);
c.tag = 3;
c.payload = {
element: null
};
var d = b.value;
c.callback = function() {
Qi || (Qi = !0, Ri = d);
Ni(a, b)
};
return c
}
function Si(a, b, c) {
c = zg(-1, c);
c.tag = 3;
var d = a.type.getDerivedStateFromError;
if ("function" === typeof d) {
var e = b.value;
c.payload = function() {
Ni(a, b);
return d(e)
}
}
var f = a.stateNode;
null !== f && "function" === typeof f.componentDidCatch && (c.callback = function() {
"function" !== typeof d && (null === Ti ? Ti = new Set([this]) : Ti.add(this), Ni(a, b));
var c = b.stack;
this.componentDidCatch(b.value, {
componentStack: null !== c ? c : ""
})
});
return c
}
var Ui = "function" === typeof WeakSet ? WeakSet : Set;
function Vi(a) {
var b = a.ref;
if (null !== b)
if ("function" === typeof b) try {
b(null)
} catch (c) {
Wi(a, c)
} else b.current = null
}
function Xi(a, b) {
switch (b.tag) {
case 0:
case 11:
case 15:
case 22:
return;
case 1:
if (b.flags & 256 && null !== a) {
var c = a.memoizedProps,
d = a.memoizedState;
a = b.stateNode;
b = a.getSnapshotBeforeUpdate(b.elementType === b.type ? c : lg(b.type, c), d);
a.__reactInternalSnapshotBeforeUpdate = b
}
return;
case 3:
b.flags & 256 && qf(b.stateNode.containerInfo);
return;
case 5:
case 6:
case 4:
case 17:
return
}
throw Error(y(163));
}
function Yi(a, b, c) {
switch (c.tag) {
case 0:
case 11:
case 15:
case 22:
b = c.updateQueue;
b = null !== b ? b.lastEffect : null;
if (null !== b) {
a = b = b.next;
do {
if (3 === (a.tag & 3)) {
var d = a.create;
a.destroy = d()
}
a = a.next
} while (a !== b)
}
b = c.updateQueue;
b = null !== b ? b.lastEffect : null;
if (null !== b) {
a = b = b.next;
do {
var e = a;
d = e.next;
e = e.tag;
0 !== (e & 4) && 0 !== (e & 1) && (Zi(c, a), $i(c, a));
a = d
} while (a !== b)
}
return;
case 1:
a = c.stateNode;
c.flags & 4 && (null === b ? a.componentDidMount() : (d = c.elementType === c.type ? b.memoizedProps : lg(c.type, b.memoizedProps), a.componentDidUpdate(d,
b.memoizedState, a.__reactInternalSnapshotBeforeUpdate)));
b = c.updateQueue;
null !== b && Eg(c, b, a);
return;
case 3:
b = c.updateQueue;
if (null !== b) {
a = null;
if (null !== c.child) switch (c.child.tag) {
case 5:
a = c.child.stateNode;
break;
case 1:
a = c.child.stateNode
}
Eg(c, b, a)
}
return;
case 5:
a = c.stateNode;
null === b && c.flags & 4 && mf(c.type, c.memoizedProps) && a.focus();
return;
case 6:
return;
case 4:
return;
case 12:
return;
case 13:
null === c.memoizedState && (c = c.alternate, null !== c && (c = c.memoizedState, null !== c && (c = c.dehydrated, null !== c && Cc(c))));
return;
case 19:
case 17:
case 20:
case 21:
case 23:
case 24:
return
}
throw Error(y(163));
}
function aj(a, b) {
for (var c = a;;) {
if (5 === c.tag) {
var d = c.stateNode;
if (b) d = d.style, "function" === typeof d.setProperty ? d.setProperty("display", "none", "important") : d.display = "none";
else {
d = c.stateNode;
var e = c.memoizedProps.style;
e = void 0 !== e && null !== e && e.hasOwnProperty("display") ? e.display : null;
d.style.display = sb("display", e)
}
} else if (6 === c.tag) c.stateNode.nodeValue = b ? "" : c.memoizedProps;
else if ((23 !== c.tag && 24 !== c.tag || null === c.memoizedState || c === a) && null !== c.child) {
c.child.return = c;
c = c.child;
continue
}
if (c ===
a) break;
for (; null === c.sibling;) {
if (null === c.return || c.return === a) return;
c = c.return
}
c.sibling.return = c.return;
c = c.sibling
}
}
function bj(a, b) {
if (Mf && "function" === typeof Mf.onCommitFiberUnmount) try {
Mf.onCommitFiberUnmount(Lf, b)
} catch (f) {}
switch (b.tag) {
case 0:
case 11:
case 14:
case 15:
case 22:
a = b.updateQueue;
if (null !== a && (a = a.lastEffect, null !== a)) {
var c = a = a.next;
do {
var d = c,
e = d.destroy;
d = d.tag;
if (void 0 !== e)
if (0 !== (d & 4)) Zi(b, c);
else {
d = b;
try {
e()
} catch (f) {
Wi(d, f)
}
}
c = c.next
} while (c !== a)
}
break;
case 1:
Vi(b);
a = b.stateNode;
if ("function" === typeof a.componentWillUnmount) try {
a.props = b.memoizedProps, a.state = b.memoizedState, a.componentWillUnmount()
} catch (f) {
Wi(b,
f)
}
break;
case 5:
Vi(b);
break;
case 4:
cj(a, b)
}
}
function dj(a) {
a.alternate = null;
a.child = null;
a.dependencies = null;
a.firstEffect = null;
a.lastEffect = null;
a.memoizedProps = null;
a.memoizedState = null;
a.pendingProps = null;
a.return = null;
a.updateQueue = null
}
function ej(a) {
return 5 === a.tag || 3 === a.tag || 4 === a.tag
}
function fj(a) {
a: {
for (var b = a.return; null !== b;) {
if (ej(b)) break a;
b = b.return
}
throw Error(y(160));
}
var c = b;b = c.stateNode;
switch (c.tag) {
case 5:
var d = !1;
break;
case 3:
b = b.containerInfo;
d = !0;
break;
case 4:
b = b.containerInfo;
d = !0;
break;
default:
throw Error(y(161));
}
c.flags & 16 && (pb(b, ""), c.flags &= -17);a: b: for (c = a;;) {
for (; null === c.sibling;) {
if (null === c.return || ej(c.return)) {
c = null;
break a
}
c = c.return
}
c.sibling.return = c.return;
for (c = c.sibling; 5 !== c.tag && 6 !== c.tag && 18 !== c.tag;) {
if (c.flags & 2) continue b;
if (null ===
c.child || 4 === c.tag) continue b;
else c.child.return = c, c = c.child
}
if (!(c.flags & 2)) {
c = c.stateNode;
break a
}
}
d ? gj(a, c, b) : hj(a, c, b)
}
function gj(a, b, c) {
var d = a.tag,
e = 5 === d || 6 === d;
if (e) a = e ? a.stateNode : a.stateNode.instance, b ? 8 === c.nodeType ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (8 === c.nodeType ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, null !== c && void 0 !== c || null !== b.onclick || (b.onclick = jf));
else if (4 !== d && (a = a.child, null !== a))
for (gj(a, b, c), a = a.sibling; null !== a;) gj(a, b, c), a = a.sibling
}
function hj(a, b, c) {
var d = a.tag,
e = 5 === d || 6 === d;
if (e) a = e ? a.stateNode : a.stateNode.instance, b ? c.insertBefore(a, b) : c.appendChild(a);
else if (4 !== d && (a = a.child, null !== a))
for (hj(a, b, c), a = a.sibling; null !== a;) hj(a, b, c), a = a.sibling
}
function cj(a, b) {
for (var c = b, d = !1, e, f;;) {
if (!d) {
d = c.return;
a: for (;;) {
if (null === d) throw Error(y(160));
e = d.stateNode;
switch (d.tag) {
case 5:
f = !1;
break a;
case 3:
e = e.containerInfo;
f = !0;
break a;
case 4:
e = e.containerInfo;
f = !0;
break a
}
d = d.return
}
d = !0
}
if (5 === c.tag || 6 === c.tag) {
a: for (var g = a, h = c, k = h;;)
if (bj(g, k), null !== k.child && 4 !== k.tag) k.child.return = k, k = k.child;
else {
if (k === h) break a;
for (; null === k.sibling;) {
if (null === k.return || k.return === h) break a;
k = k.return
}
k.sibling.return = k.return;
k = k.sibling
}f ? (g = e, h = c.stateNode,
8 === g.nodeType ? g.parentNode.removeChild(h) : g.removeChild(h)) : e.removeChild(c.stateNode)
} else if (4 === c.tag) {
if (null !== c.child) {
e = c.stateNode.containerInfo;
f = !0;
c.child.return = c;
c = c.child;
continue
}
} else if (bj(a, c), null !== c.child) {
c.child.return = c;
c = c.child;
continue
}
if (c === b) break;
for (; null === c.sibling;) {
if (null === c.return || c.return === b) return;
c = c.return;
4 === c.tag && (d = !1)
}
c.sibling.return = c.return;
c = c.sibling
}
}
function ij(a, b) {
switch (b.tag) {
case 0:
case 11:
case 14:
case 15:
case 22:
var c = b.updateQueue;
c = null !== c ? c.lastEffect : null;
if (null !== c) {
var d = c = c.next;
do 3 === (d.tag & 3) && (a = d.destroy, d.destroy = void 0, void 0 !== a && a()), d = d.next; while (d !== c)
}
return;
case 1:
return;
case 5:
c = b.stateNode;
if (null != c) {
d = b.memoizedProps;
var e = null !== a ? a.memoizedProps : d;
a = b.type;
var f = b.updateQueue;
b.updateQueue = null;
if (null !== f) {
c[xf] = d;
"input" === a && "radio" === d.type && null != d.name && $a(c, d);
wb(a, e);
b = wb(a, d);
for (e = 0; e < f.length; e +=
2) {
var g = f[e],
h = f[e + 1];
"style" === g ? tb(c, h) : "dangerouslySetInnerHTML" === g ? ob(c, h) : "children" === g ? pb(c, h) : qa(c, g, h, b)
}
switch (a) {
case "input":
ab(c, d);
break;
case "textarea":
ib(c, d);
break;
case "select":
a = c._wrapperState.wasMultiple, c._wrapperState.wasMultiple = !!d.multiple, f = d.value, null != f ? fb(c, !!d.multiple, f, !1) : a !== !!d.multiple && (null != d.defaultValue ? fb(c, !!d.multiple, d.defaultValue, !0) : fb(c, !!d.multiple, d.multiple ? [] : "", !1))
}
}
}
return;
case 6:
if (null === b.stateNode) throw Error(y(162));
b.stateNode.nodeValue =
b.memoizedProps;
return;
case 3:
c = b.stateNode;
c.hydrate && (c.hydrate = !1, Cc(c.containerInfo));
return;
case 12:
return;
case 13:
null !== b.memoizedState && (jj = O(), aj(b.child, !0));
kj(b);
return;
case 19:
kj(b);
return;
case 17:
return;
case 23:
case 24:
aj(b, null !== b.memoizedState);
return
}
throw Error(y(163));
}
function kj(a) {
var b = a.updateQueue;
if (null !== b) {
a.updateQueue = null;
var c = a.stateNode;
null === c && (c = a.stateNode = new Ui);
b.forEach(function(b) {
var d = lj.bind(null, a, b);
c.has(b) || (c.add(b), b.then(d, d))
})
}
}
function mj(a, b) {
return null !== a && (a = a.memoizedState, null === a || null !== a.dehydrated) ? (b = b.memoizedState, null !== b && null === b.dehydrated) : !1
}
var nj = Math.ceil,
oj = ra.ReactCurrentDispatcher,
pj = ra.ReactCurrentOwner,
X = 0,
U = null,
Y = null,
W = 0,
qj = 0,
rj = Bf(0),
V = 0,
sj = null,
tj = 0,
Dg = 0,
Hi = 0,
uj = 0,
vj = null,
jj = 0,
Ji = Infinity;
function wj() {
Ji = O() + 500
}
var Z = null,
Qi = !1,
Ri = null,
Ti = null,
xj = !1,
yj = null,
zj = 90,
Aj = [],
Bj = [],
Cj = null,
Dj = 0,
Ej = null,
Fj = -1,
Gj = 0,
Hj = 0,
Ij = null,
Jj = !1;
function Hg() {
return 0 !== (X & 48) ? O() : -1 !== Fj ? Fj : Fj = O()
}
function Ig(a) {
a = a.mode;
if (0 === (a & 2)) return 1;
if (0 === (a & 4)) return 99 === eg() ? 1 : 2;
0 === Gj && (Gj = tj);
if (0 !== kg.transition) {
0 !== Hj && (Hj = null !== vj ? vj.pendingLanes : 0);
a = Gj;
var b = 4186112 & ~Hj;
b &= -b;
0 === b && (a = 4186112 & ~a, b = a & -a, 0 === b && (b = 8192));
return b
}
a = eg();
0 !== (X & 4) && 98 === a ? a = Xc(12, Gj) : (a = Sc(a), a = Xc(a, Gj));
return a
}
function Jg(a, b, c) {
if (50 < Dj) throw Dj = 0, Ej = null, Error(y(185));
a = Kj(a, b);
if (null === a) return null;
$c(a, b, c);
a === U && (Hi |= b, 4 === V && Ii(a, W));
var d = eg();
1 === b ? 0 !== (X & 8) && 0 === (X & 48) ? Lj(a) : (Mj(a, c), 0 === X && (wj(), ig())) : (0 === (X & 4) || 98 !== d && 99 !== d || (null === Cj ? Cj = new Set([a]) : Cj.add(a)), Mj(a, c));
vj = a
}
function Kj(a, b) {
a.lanes |= b;
var c = a.alternate;
null !== c && (c.lanes |= b);
c = a;
for (a = a.return; null !== a;) a.childLanes |= b, c = a.alternate, null !== c && (c.childLanes |= b), c = a, a = a.return;
return 3 === c.tag ? c.stateNode : null
}
function Mj(a, b) {
for (var c = a.callbackNode, d = a.suspendedLanes, e = a.pingedLanes, f = a.expirationTimes, g = a.pendingLanes; 0 < g;) {
var h = 31 - Vc(g),
k = 1 << h,
l = f[h];
if (-1 === l) {
if (0 === (k & d) || 0 !== (k & e)) {
l = b;
Rc(k);
var n = F;
f[h] = 10 <= n ? l + 250 : 6 <= n ? l + 5E3 : -1
}
} else l <= b && (a.expiredLanes |= k);
g &= ~k
}
d = Uc(a, a === U ? W : 0);
b = F;
if (0 === d) null !== c && (c !== Zf && Pf(c), a.callbackNode = null, a.callbackPriority = 0);
else {
if (null !== c) {
if (a.callbackPriority === b) return;
c !== Zf && Pf(c)
}
15 === b ? (c = Lj.bind(null, a), null === ag ? (ag = [c], bg = Of(Uf, jg)) : ag.push(c),
c = Zf) : 14 === b ? c = hg(99, Lj.bind(null, a)) : (c = Tc(b), c = hg(c, Nj.bind(null, a)));
a.callbackPriority = b;
a.callbackNode = c
}
}
function Nj(a) {
Fj = -1;
Hj = Gj = 0;
if (0 !== (X & 48)) throw Error(y(327));
var b = a.callbackNode;
if (Oj() && a.callbackNode !== b) return null;
var c = Uc(a, a === U ? W : 0);
if (0 === c) return null;
var d = c;
var e = X;
X |= 16;
var f = Pj();
if (U !== a || W !== d) wj(), Qj(a, d);
do try {
Rj();
break
} catch (h) {
Sj(a, h)
}
while (1);
qg();
oj.current = f;
X = e;
null !== Y ? d = 0 : (U = null, W = 0, d = V);
if (0 !== (tj & Hi)) Qj(a, 0);
else if (0 !== d) {
2 === d && (X |= 64, a.hydrate && (a.hydrate = !1, qf(a.containerInfo)), c = Wc(a), 0 !== c && (d = Tj(a, c)));
if (1 === d) throw b = sj, Qj(a, 0), Ii(a, c), Mj(a, O()), b;
a.finishedWork =
a.current.alternate;
a.finishedLanes = c;
switch (d) {
case 0:
case 1:
throw Error(y(345));
case 2:
Uj(a);
break;
case 3:
Ii(a, c);
if ((c & 62914560) === c && (d = jj + 500 - O(), 10 < d)) {
if (0 !== Uc(a, 0)) break;
e = a.suspendedLanes;
if ((e & c) !== c) {
Hg();
a.pingedLanes |= a.suspendedLanes & e;
break
}
a.timeoutHandle = of(Uj.bind(null, a), d);
break
}
Uj(a);
break;
case 4:
Ii(a, c);
if ((c & 4186112) === c) break;
d = a.eventTimes;
for (e = -1; 0 < c;) {
var g = 31 - Vc(c);
f = 1 << g;
g = d[g];
g > e && (e = g);
c &= ~f
}
c = e;
c = O() - c;
c = (120 > c ? 120 : 480 > c ? 480 : 1080 > c ? 1080 : 1920 > c ? 1920 : 3E3 > c ? 3E3 : 4320 >
c ? 4320 : 1960 * nj(c / 1960)) - c;
if (10 < c) {
a.timeoutHandle = of(Uj.bind(null, a), c);
break
}
Uj(a);
break;
case 5:
Uj(a);
break;
default:
throw Error(y(329));
}
}
Mj(a, O());
return a.callbackNode === b ? Nj.bind(null, a) : null
}
function Ii(a, b) {
b &= ~uj;
b &= ~Hi;
a.suspendedLanes |= b;
a.pingedLanes &= ~b;
for (a = a.expirationTimes; 0 < b;) {
var c = 31 - Vc(b),
d = 1 << c;
a[c] = -1;
b &= ~d
}
}
function Lj(a) {
if (0 !== (X & 48)) throw Error(y(327));
Oj();
if (a === U && 0 !== (a.expiredLanes & W)) {
var b = W;
var c = Tj(a, b);
0 !== (tj & Hi) && (b = Uc(a, b), c = Tj(a, b))
} else b = Uc(a, 0), c = Tj(a, b);
0 !== a.tag && 2 === c && (X |= 64, a.hydrate && (a.hydrate = !1, qf(a.containerInfo)), b = Wc(a), 0 !== b && (c = Tj(a, b)));
if (1 === c) throw c = sj, Qj(a, 0), Ii(a, b), Mj(a, O()), c;
a.finishedWork = a.current.alternate;
a.finishedLanes = b;
Uj(a);
Mj(a, O());
return null
}
function Vj() {
if (null !== Cj) {
var a = Cj;
Cj = null;
a.forEach(function(a) {
a.expiredLanes |= 24 & a.pendingLanes;
Mj(a, O())
})
}
ig()
}
function Wj(a, b) {
var c = X;
X |= 1;
try {
return a(b)
} finally {
X = c, 0 === X && (wj(), ig())
}
}
function Xj(a, b) {
var c = X;
X &= -2;
X |= 8;
try {
return a(b)
} finally {
X = c, 0 === X && (wj(), ig())
}
}
function ni(a, b) {
I(rj, qj);
qj |= b;
tj |= b
}
function Ki() {
qj = rj.current;
H(rj)
}
function Qj(a, b) {
a.finishedWork = null;
a.finishedLanes = 0;
var c = a.timeoutHandle; - 1 !== c && (a.timeoutHandle = -1, pf(c));
if (null !== Y)
for (c = Y.return; null !== c;) {
var d = c;
switch (d.tag) {
case 1:
d = d.type.childContextTypes;
null !== d && void 0 !== d && Gf();
break;
case 3:
fh();
H(N);
H(M);
uh();
break;
case 5:
hh(d);
break;
case 4:
fh();
break;
case 13:
H(P);
break;
case 19:
H(P);
break;
case 10:
rg(d);
break;
case 23:
case 24:
Ki()
}
c = c.return
}
U = a;
Y = Tg(a.current, null);
W = qj = tj = b;
V = 0;
sj = null;
uj = Hi = Dg = 0
}
function Sj(a, b) {
do {
var c = Y;
try {
qg();
vh.current = Gh;
if (yh) {
for (var d = R.memoizedState; null !== d;) {
var e = d.queue;
null !== e && (e.pending = null);
d = d.next
}
yh = !1
}
xh = 0;
T = S = R = null;
zh = !1;
pj.current = null;
if (null === c || null === c.return) {
V = 1;
sj = b;
Y = null;
break
}
a: {
var f = a,
g = c.return,
h = c,
k = b;
b = W;
h.flags |= 2048;
h.firstEffect = h.lastEffect = null;
if (null !== k && "object" === typeof k && "function" === typeof k.then) {
var l = k;
if (0 === (h.mode & 2)) {
var n = h.alternate;
n ? (h.updateQueue = n.updateQueue, h.memoizedState = n.memoizedState, h.lanes = n.lanes) :
(h.updateQueue = null, h.memoizedState = null)
}
var A = 0 !== (P.current & 1),
p = g;
do {
var C;
if (C = 13 === p.tag) {
var x = p.memoizedState;
if (null !== x) C = null !== x.dehydrated ? !0 : !1;
else {
var w = p.memoizedProps;
C = void 0 === w.fallback ? !1 : !0 !== w.unstable_avoidThisFallback ? !0 : A ? !1 : !0
}
}
if (C) {
var z = p.updateQueue;
if (null === z) {
var u = new Set;
u.add(l);
p.updateQueue = u
} else z.add(l);
if (0 === (p.mode & 2)) {
p.flags |= 64;
h.flags |= 16384;
h.flags &= -2981;
if (1 === h.tag)
if (null === h.alternate) h.tag = 17;
else {
var t = zg(-1, 1);
t.tag = 2;
Ag(h, t)
}
h.lanes |= 1;
break a
}
k =
void 0;
h = b;
var q = f.pingCache;
null === q ? (q = f.pingCache = new Oi, k = new Set, q.set(l, k)) : (k = q.get(l), void 0 === k && (k = new Set, q.set(l, k)));
if (!k.has(h)) {
k.add(h);
var v = Yj.bind(null, f, l, h);
l.then(v, v)
}
p.flags |= 4096;
p.lanes = b;
break a
}
p = p.return
} while (null !== p);
k = Error((Ra(h.type) || "A React component") + " suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")
}
5 !== V && (V = 2);
k = Mi(k, h);
p =
g;
do {
switch (p.tag) {
case 3:
f = k;
p.flags |= 4096;
b &= -b;
p.lanes |= b;
var J = Pi(p, f, b);
Bg(p, J);
break a;
case 1:
f = k;
var K = p.type,
Q = p.stateNode;
if (0 === (p.flags & 64) && ("function" === typeof K.getDerivedStateFromError || null !== Q && "function" === typeof Q.componentDidCatch && (null === Ti || !Ti.has(Q)))) {
p.flags |= 4096;
b &= -b;
p.lanes |= b;
var L = Si(p, f, b);
Bg(p, L);
break a
}
}
p = p.return
} while (null !== p)
}
Zj(c)
} catch (va) {
b = va;
Y === c && null !== c && (Y = c = c.return);
continue
}
break
} while (1)
}
function Pj() {
var a = oj.current;
oj.current = Gh;
return null === a ? Gh : a
}
function Tj(a, b) {
var c = X;
X |= 16;
var d = Pj();
U === a && W === b || Qj(a, b);
do try {
ak();
break
} catch (e) {
Sj(a, e)
}
while (1);
qg();
X = c;
oj.current = d;
if (null !== Y) throw Error(y(261));
U = null;
W = 0;
return V
}
function ak() {
for (; null !== Y;) bk(Y)
}
function Rj() {
for (; null !== Y && !Qf();) bk(Y)
}
function bk(a) {
var b = ck(a.alternate, a, qj);
a.memoizedProps = a.pendingProps;
null === b ? Zj(a) : Y = b;
pj.current = null
}
function Zj(a) {
var b = a;
do {
var c = b.alternate;
a = b.return;
if (0 === (b.flags & 2048)) {
c = Gi(c, b, qj);
if (null !== c) {
Y = c;
return
}
c = b;
if (24 !== c.tag && 23 !== c.tag || null === c.memoizedState || 0 !== (qj & 1073741824) || 0 === (c.mode & 4)) {
for (var d = 0, e = c.child; null !== e;) d |= e.lanes | e.childLanes, e = e.sibling;
c.childLanes = d
}
null !== a && 0 === (a.flags & 2048) && (null === a.firstEffect && (a.firstEffect = b.firstEffect), null !== b.lastEffect && (null !== a.lastEffect && (a.lastEffect.nextEffect = b.firstEffect), a.lastEffect = b.lastEffect), 1 < b.flags && (null !==
a.lastEffect ? a.lastEffect.nextEffect = b : a.firstEffect = b, a.lastEffect = b))
} else {
c = Li(b);
if (null !== c) {
c.flags &= 2047;
Y = c;
return
}
null !== a && (a.firstEffect = a.lastEffect = null, a.flags |= 2048)
}
b = b.sibling;
if (null !== b) {
Y = b;
return
}
Y = b = a
} while (null !== b);
0 === V && (V = 5)
}
function Uj(a) {
var b = eg();
gg(99, dk.bind(null, a, b));
return null
}
function dk(a, b) {
do Oj(); while (null !== yj);
if (0 !== (X & 48)) throw Error(y(327));
var c = a.finishedWork;
if (null === c) return null;
a.finishedWork = null;
a.finishedLanes = 0;
if (c === a.current) throw Error(y(177));
a.callbackNode = null;
var d = c.lanes | c.childLanes,
e = d,
f = a.pendingLanes & ~e;
a.pendingLanes = e;
a.suspendedLanes = 0;
a.pingedLanes = 0;
a.expiredLanes &= e;
a.mutableReadLanes &= e;
a.entangledLanes &= e;
e = a.entanglements;
for (var g = a.eventTimes, h = a.expirationTimes; 0 < f;) {
var k = 31 - Vc(f),
l = 1 << k;
e[k] = 0;
g[k] = -1;
h[k] = -1;
f &= ~l
}
null !==
Cj && 0 === (d & 24) && Cj.has(a) && Cj.delete(a);
a === U && (Y = U = null, W = 0);
1 < c.flags ? null !== c.lastEffect ? (c.lastEffect.nextEffect = c, d = c.firstEffect) : d = c : d = c.firstEffect;
if (null !== d) {
e = X;
X |= 32;
pj.current = null;
kf = fd;
g = Ne();
if (Oe(g)) {
if ("selectionStart" in g) h = {
start: g.selectionStart,
end: g.selectionEnd
};
else a: if (h = (h = g.ownerDocument) && h.defaultView || window, (l = h.getSelection && h.getSelection()) && 0 !== l.rangeCount) {
h = l.anchorNode;
f = l.anchorOffset;
k = l.focusNode;
l = l.focusOffset;
try {
h.nodeType, k.nodeType
} catch (va) {
h = null;
break a
}
var n = 0,
A = -1,
p = -1,
C = 0,
x = 0,
w = g,
z = null;
b: for (;;) {
for (var u;;) {
w !== h || 0 !== f && 3 !== w.nodeType || (A = n + f);
w !== k || 0 !== l && 3 !== w.nodeType || (p = n + l);
3 === w.nodeType && (n += w.nodeValue.length);
if (null === (u = w.firstChild)) break;
z = w;
w = u
}
for (;;) {
if (w === g) break b;
z === h && ++C === f && (A = n);
z === k && ++x === l && (p = n);
if (null !== (u = w.nextSibling)) break;
w = z;
z = w.parentNode
}
w = u
}
h = -1 === A || -1 === p ? null : {
start: A,
end: p
}
} else h = null;
h = h || {
start: 0,
end: 0
}
} else h = null;
lf = {
focusedElem: g,
selectionRange: h
};
fd = !1;
Ij = null;
Jj = !1;
Z = d;
do try {
ek()
} catch (va) {
if (null ===
Z) throw Error(y(330));
Wi(Z, va);
Z = Z.nextEffect
}
while (null !== Z);
Ij = null;
Z = d;
do try {
for (g = a; null !== Z;) {
var t = Z.flags;
t & 16 && pb(Z.stateNode, "");
if (t & 128) {
var q = Z.alternate;
if (null !== q) {
var v = q.ref;
null !== v && ("function" === typeof v ? v(null) : v.current = null)
}
}
switch (t & 1038) {
case 2:
fj(Z);
Z.flags &= -3;
break;
case 6:
fj(Z);
Z.flags &= -3;
ij(Z.alternate, Z);
break;
case 1024:
Z.flags &= -1025;
break;
case 1028:
Z.flags &= -1025;
ij(Z.alternate, Z);
break;
case 4:
ij(Z.alternate, Z);
break;
case 8:
h = Z;
cj(g, h);
var J = h.alternate;
dj(h);
null !==
J && dj(J)
}
Z = Z.nextEffect
}
} catch (va) {
if (null === Z) throw Error(y(330));
Wi(Z, va);
Z = Z.nextEffect
}
while (null !== Z);
v = lf;
q = Ne();
t = v.focusedElem;
g = v.selectionRange;
if (q !== t && t && t.ownerDocument && Me(t.ownerDocument.documentElement, t)) {
null !== g && Oe(t) && (q = g.start, v = g.end, void 0 === v && (v = q), "selectionStart" in t ? (t.selectionStart = q, t.selectionEnd = Math.min(v, t.value.length)) : (v = (q = t.ownerDocument || document) && q.defaultView || window, v.getSelection && (v = v.getSelection(), h = t.textContent.length, J = Math.min(g.start, h), g = void 0 ===
g.end ? J : Math.min(g.end, h), !v.extend && J > g && (h = g, g = J, J = h), h = Le(t, J), f = Le(t, g), h && f && (1 !== v.rangeCount || v.anchorNode !== h.node || v.anchorOffset !== h.offset || v.focusNode !== f.node || v.focusOffset !== f.offset) && (q = q.createRange(), q.setStart(h.node, h.offset), v.removeAllRanges(), J > g ? (v.addRange(q), v.extend(f.node, f.offset)) : (q.setEnd(f.node, f.offset), v.addRange(q))))));
q = [];
for (v = t; v = v.parentNode;) 1 === v.nodeType && q.push({
element: v,
left: v.scrollLeft,
top: v.scrollTop
});
"function" === typeof t.focus && t.focus();
for (t =
0; t < q.length; t++) v = q[t], v.element.scrollLeft = v.left, v.element.scrollTop = v.top
}
fd = !!kf;
lf = kf = null;
a.current = c;
Z = d;
do try {
for (t = a; null !== Z;) {
var K = Z.flags;
K & 36 && Yi(t, Z.alternate, Z);
if (K & 128) {
q = void 0;
var Q = Z.ref;
if (null !== Q) {
var L = Z.stateNode;
switch (Z.tag) {
case 5:
q = L;
break;
default:
q = L
}
"function" === typeof Q ? Q(q) : Q.current = q
}
}
Z = Z.nextEffect
}
} catch (va) {
if (null === Z) throw Error(y(330));
Wi(Z, va);
Z = Z.nextEffect
}
while (null !== Z);
Z = null;
$f();
X = e
} else a.current = c;
if (xj) xj = !1, yj = a, zj = b;
else
for (Z = d; null !== Z;) b =
Z.nextEffect, Z.nextEffect = null, Z.flags & 8 && (K = Z, K.sibling = null, K.stateNode = null), Z = b;
d = a.pendingLanes;
0 === d && (Ti = null);
1 === d ? a === Ej ? Dj++ : (Dj = 0, Ej = a) : Dj = 0;
c = c.stateNode;
if (Mf && "function" === typeof Mf.onCommitFiberRoot) try {
Mf.onCommitFiberRoot(Lf, c, void 0, 64 === (c.current.flags & 64))
} catch (va) {}
Mj(a, O());
if (Qi) throw Qi = !1, a = Ri, Ri = null, a;
if (0 !== (X & 8)) return null;
ig();
return null
}
function ek() {
for (; null !== Z;) {
var a = Z.alternate;
Jj || null === Ij || (0 !== (Z.flags & 8) ? dc(Z, Ij) && (Jj = !0) : 13 === Z.tag && mj(a, Z) && dc(Z, Ij) && (Jj = !0));
var b = Z.flags;
0 !== (b & 256) && Xi(a, Z);
0 === (b & 512) || xj || (xj = !0, hg(97, function() {
Oj();
return null
}));
Z = Z.nextEffect
}
}
function Oj() {
if (90 !== zj) {
var a = 97 < zj ? 97 : zj;
zj = 90;
return gg(a, fk)
}
return !1
}
function $i(a, b) {
Aj.push(b, a);
xj || (xj = !0, hg(97, function() {
Oj();
return null
}))
}
function Zi(a, b) {
Bj.push(b, a);
xj || (xj = !0, hg(97, function() {
Oj();
return null
}))
}
function fk() {
if (null === yj) return !1;
var a = yj;
yj = null;
if (0 !== (X & 48)) throw Error(y(331));
var b = X;
X |= 32;
var c = Bj;
Bj = [];
for (var d = 0; d < c.length; d += 2) {
var e = c[d],
f = c[d + 1],
g = e.destroy;
e.destroy = void 0;
if ("function" === typeof g) try {
g()
} catch (k) {
if (null === f) throw Error(y(330));
Wi(f, k)
}
}
c = Aj;
Aj = [];
for (d = 0; d < c.length; d += 2) {
e = c[d];
f = c[d + 1];
try {
var h = e.create;
e.destroy = h()
} catch (k) {
if (null === f) throw Error(y(330));
Wi(f, k)
}
}
for (h = a.current.firstEffect; null !== h;) a = h.nextEffect, h.nextEffect = null, h.flags & 8 && (h.sibling =
null, h.stateNode = null), h = a;
X = b;
ig();
return !0
}
function gk(a, b, c) {
b = Mi(c, b);
b = Pi(a, b, 1);
Ag(a, b);
b = Hg();
a = Kj(a, 1);
null !== a && ($c(a, 1, b), Mj(a, b))
}
function Wi(a, b) {
if (3 === a.tag) gk(a, a, b);
else
for (var c = a.return; null !== c;) {
if (3 === c.tag) {
gk(c, a, b);
break
} else if (1 === c.tag) {
var d = c.stateNode;
if ("function" === typeof c.type.getDerivedStateFromError || "function" === typeof d.componentDidCatch && (null === Ti || !Ti.has(d))) {
a = Mi(b, a);
var e = Si(c, a, 1);
Ag(c, e);
e = Hg();
c = Kj(c, 1);
if (null !== c) $c(c, 1, e), Mj(c, e);
else if ("function" === typeof d.componentDidCatch && (null === Ti || !Ti.has(d))) try {
d.componentDidCatch(b, a)
} catch (f) {}
break
}
}
c = c.return
}
}
function Yj(a, b, c) {
var d = a.pingCache;
null !== d && d.delete(b);
b = Hg();
a.pingedLanes |= a.suspendedLanes & c;
U === a && (W & c) === c && (4 === V || 3 === V && (W & 62914560) === W && 500 > O() - jj ? Qj(a, 0) : uj |= c);
Mj(a, b)
}
function lj(a, b) {
var c = a.stateNode;
null !== c && c.delete(b);
b = 0;
0 === b && (b = a.mode, 0 === (b & 2) ? b = 1 : 0 === (b & 4) ? b = 99 === eg() ? 1 : 2 : (0 === Gj && (Gj = tj), b = Yc(62914560 & ~Gj), 0 === b && (b = 4194304)));
c = Hg();
a = Kj(a, b);
null !== a && ($c(a, b, c), Mj(a, c))
}
var ck;
ck = function(a, b, c) {
var d = b.lanes;
if (null !== a)
if (a.memoizedProps !== b.pendingProps || N.current) ug = !0;
else if (0 !== (c & d)) ug = 0 !== (a.flags & 16384) ? !0 : !1;
else {
ug = !1;
switch (b.tag) {
case 3:
ri(b);
sh();
break;
case 5:
gh(b);
break;
case 1:
Ff(b.type) && Jf(b);
break;
case 4:
eh(b, b.stateNode.containerInfo);
break;
case 10:
d = b.memoizedProps.value;
var e = b.type._context;
I(mg, e._currentValue);
e._currentValue = d;
break;
case 13:
if (null !== b.memoizedState) {
if (0 !== (c & b.child.childLanes)) return ti(a, b, c);
I(P, P.current & 1);
b = hi(a, b, c);
return null !==
b ? b.sibling : null
}
I(P, P.current & 1);
break;
case 19:
d = 0 !== (c & b.childLanes);
if (0 !== (a.flags & 64)) {
if (d) return Ai(a, b, c);
b.flags |= 64
}
e = b.memoizedState;
null !== e && (e.rendering = null, e.tail = null, e.lastEffect = null);
I(P, P.current);
if (d) break;
else return null;
case 23:
case 24:
return b.lanes = 0, mi(a, b, c)
}
return hi(a, b, c)
} else ug = !1;
b.lanes = 0;
switch (b.tag) {
case 2:
d = b.type;
null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2);
a = b.pendingProps;
e = Ef(b, M.current);
tg(b, c);
e = Ch(null, b, d, a, e, c);
b.flags |= 1;
if ("object" ===
typeof e && null !== e && "function" === typeof e.render && void 0 === e.$$typeof) {
b.tag = 1;
b.memoizedState = null;
b.updateQueue = null;
if (Ff(d)) {
var f = !0;
Jf(b)
} else f = !1;
b.memoizedState = null !== e.state && void 0 !== e.state ? e.state : null;
xg(b);
var g = d.getDerivedStateFromProps;
"function" === typeof g && Gg(b, d, g, a);
e.updater = Kg;
b.stateNode = e;
e._reactInternals = b;
Og(b, d, a, c);
b = qi(null, b, d, !0, f, c)
} else b.tag = 0, fi(null, b, e, c), b = b.child;
return b;
case 16:
e = b.elementType;
a: {
null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2);
a = b.pendingProps;
f = e._init;
e = f(e._payload);
b.type = e;
f = b.tag = hk(e);
a = lg(e, a);
switch (f) {
case 0:
b = li(null, b, e, a, c);
break a;
case 1:
b = pi(null, b, e, a, c);
break a;
case 11:
b = gi(null, b, e, a, c);
break a;
case 14:
b = ii(null, b, e, lg(e.type, a), d, c);
break a
}
throw Error(y(306, e, ""));
}
return b;
case 0:
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), li(a, b, d, e, c);
case 1:
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), pi(a, b, d, e, c);
case 3:
ri(b);
d = b.updateQueue;
if (null === a || null === d) throw Error(y(282));
d = b.pendingProps;
e = b.memoizedState;
e = null !== e ? e.element : null;
yg(a, b);
Cg(b, d, null, c);
d = b.memoizedState.element;
if (d === e) sh(), b = hi(a, b, c);
else {
e = b.stateNode;
if (f = e.hydrate) kh = rf(b.stateNode.containerInfo.firstChild), jh = b, f = lh = !0;
if (f) {
a = e.mutableSourceEagerHydrationData;
if (null != a)
for (e = 0; e < a.length; e += 2) f = a[e], f._workInProgressVersionPrimary = a[e + 1], th.push(f);
c = Zg(b, null, d, c);
for (b.child = c; c;) c.flags = c.flags & -3 | 1024, c = c.sibling
} else fi(a, b, d, c), sh();
b = b.child
}
return b;
case 5:
return gh(b), null === a &&
ph(b), d = b.type, e = b.pendingProps, f = null !== a ? a.memoizedProps : null, g = e.children, nf(d, e) ? g = null : null !== f && nf(d, f) && (b.flags |= 16), oi(a, b), fi(a, b, g, c), b.child;
case 6:
return null === a && ph(b), null;
case 13:
return ti(a, b, c);
case 4:
return eh(b, b.stateNode.containerInfo), d = b.pendingProps, null === a ? b.child = Yg(b, null, d, c) : fi(a, b, d, c), b.child;
case 11:
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), gi(a, b, d, e, c);
case 7:
return fi(a, b, b.pendingProps, c), b.child;
case 8:
return fi(a, b, b.pendingProps.children,
c), b.child;
case 12:
return fi(a, b, b.pendingProps.children, c), b.child;
case 10:
a: {
d = b.type._context;
e = b.pendingProps;
g = b.memoizedProps;
f = e.value;
var h = b.type._context;
I(mg, h._currentValue);
h._currentValue = f;
if (null !== g)
if (h = g.value, f = He(h, f) ? 0 : ("function" === typeof d._calculateChangedBits ? d._calculateChangedBits(h, f) : 1073741823) | 0, 0 === f) {
if (g.children === e.children && !N.current) {
b = hi(a, b, c);
break a
}
} else
for (h = b.child, null !== h && (h.return = b); null !== h;) {
var k = h.dependencies;
if (null !== k) {
g = h.child;
for (var l =
k.firstContext; null !== l;) {
if (l.context === d && 0 !== (l.observedBits & f)) {
1 === h.tag && (l = zg(-1, c & -c), l.tag = 2, Ag(h, l));
h.lanes |= c;
l = h.alternate;
null !== l && (l.lanes |= c);
sg(h.return, c);
k.lanes |= c;
break
}
l = l.next
}
} else g = 10 === h.tag ? h.type === b.type ? null : h.child : h.child;
if (null !== g) g.return = h;
else
for (g = h; null !== g;) {
if (g === b) {
g = null;
break
}
h = g.sibling;
if (null !== h) {
h.return = g.return;
g = h;
break
}
g = g.return
}
h = g
}
fi(a, b, e.children, c);
b = b.child
}
return b;
case 9:
return e = b.type, f = b.pendingProps, d = f.children, tg(b, c), e = vg(e,
f.unstable_observedBits), d = d(e), b.flags |= 1, fi(a, b, d, c), b.child;
case 14:
return e = b.type, f = lg(e, b.pendingProps), f = lg(e.type, f), ii(a, b, e, f, d, c);
case 15:
return ki(a, b, b.type, b.pendingProps, d, c);
case 17:
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2), b.tag = 1, Ff(d) ? (a = !0, Jf(b)) : a = !1, tg(b, c), Mg(b, d, e), Og(b, d, e, c), qi(null, b, d, !0, a, c);
case 19:
return Ai(a, b, c);
case 23:
return mi(a, b, c);
case 24:
return mi(a, b, c)
}
throw Error(y(156, b.tag));
};
function ik(a, b, c, d) {
this.tag = a;
this.key = c;
this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
this.index = 0;
this.ref = null;
this.pendingProps = b;
this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
this.mode = d;
this.flags = 0;
this.lastEffect = this.firstEffect = this.nextEffect = null;
this.childLanes = this.lanes = 0;
this.alternate = null
}
function nh(a, b, c, d) {
return new ik(a, b, c, d)
}
function ji(a) {
a = a.prototype;
return !(!a || !a.isReactComponent)
}
function hk(a) {
if ("function" === typeof a) return ji(a) ? 1 : 0;
if (void 0 !== a && null !== a) {
a = a.$$typeof;
if (a === Aa) return 11;
if (a === Da) return 14
}
return 2
}
function Tg(a, b) {
var c = a.alternate;
null === c ? (c = nh(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.nextEffect = null, c.firstEffect = null, c.lastEffect = null);
c.childLanes = a.childLanes;
c.lanes = a.lanes;
c.child = a.child;
c.memoizedProps = a.memoizedProps;
c.memoizedState = a.memoizedState;
c.updateQueue = a.updateQueue;
b = a.dependencies;
c.dependencies = null === b ? null : {
lanes: b.lanes,
firstContext: b.firstContext
};
c.sibling = a.sibling;
c.index = a.index;
c.ref = a.ref;
return c
}
function Vg(a, b, c, d, e, f) {
var g = 2;
d = a;
if ("function" === typeof a) ji(a) && (g = 1);
else if ("string" === typeof a) g = 5;
else a: switch (a) {
case ua:
return Xg(c.children, e, f, b);
case Ha:
g = 8;
e |= 16;
break;
case wa:
g = 8;
e |= 1;
break;
case xa:
return a = nh(12, c, b, e | 8), a.elementType = xa, a.type = xa, a.lanes = f, a;
case Ba:
return a = nh(13, c, b, e), a.type = Ba, a.elementType = Ba, a.lanes = f, a;
case Ca:
return a = nh(19, c, b, e), a.elementType = Ca, a.lanes = f, a;
case Ia:
return vi(c, e, f, b);
case Ja:
return a = nh(24, c, b, e), a.elementType = Ja, a.lanes = f, a;
default:
if ("object" ===
typeof a && null !== a) switch (a.$$typeof) {
case ya:
g = 10;
break a;
case za:
g = 9;
break a;
case Aa:
g = 11;
break a;
case Da:
g = 14;
break a;
case Ea:
g = 16;
d = null;
break a;
case Fa:
g = 22;
break a
}
throw Error(y(130, null == a ? a : typeof a, ""));
}
b = nh(g, c, b, e);
b.elementType = a;
b.type = d;
b.lanes = f;
return b
}
function Xg(a, b, c, d) {
a = nh(7, a, d, b);
a.lanes = c;
return a
}
function vi(a, b, c, d) {
a = nh(23, a, d, b);
a.elementType = Ia;
a.lanes = c;
return a
}
function Ug(a, b, c) {
a = nh(6, a, null, b);
a.lanes = c;
return a
}
function Wg(a, b, c) {
b = nh(4, null !== a.children ? a.children : [], a.key, b);
b.lanes = c;
b.stateNode = {
containerInfo: a.containerInfo,
pendingChildren: null,
implementation: a.implementation
};
return b
}
function jk(a, b, c) {
this.tag = b;
this.containerInfo = a;
this.finishedWork = this.pingCache = this.current = this.pendingChildren = null;
this.timeoutHandle = -1;
this.pendingContext = this.context = null;
this.hydrate = c;
this.callbackNode = null;
this.callbackPriority = 0;
this.eventTimes = Zc(0);
this.expirationTimes = Zc(-1);
this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
this.entanglements = Zc(0);
this.mutableSourceEagerHydrationData = null
}
function kk(a, b, c) {
var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;
return {
$$typeof: ta,
key: null == d ? null : "" + d,
children: a,
containerInfo: b,
implementation: c
}
}
function lk(a, b, c, d) {
var e = b.current,
f = Hg(),
g = Ig(e);
a: if (c) {
c = c._reactInternals;
b: {
if (Zb(c) !== c || 1 !== c.tag) throw Error(y(170));
var h = c;
do {
switch (h.tag) {
case 3:
h = h.stateNode.context;
break b;
case 1:
if (Ff(h.type)) {
h = h.stateNode.__reactInternalMemoizedMergedChildContext;
break b
}
}
h = h.return
} while (null !== h);
throw Error(y(171));
}
if (1 === c.tag) {
var k = c.type;
if (Ff(k)) {
c = If(c, k, h);
break a
}
}
c = h
} else c = Cf;
null === b.context ? b.context = c : b.pendingContext = c;
b = zg(f, g);
b.payload = {
element: a
};
d = void 0 === d ? null : d;
null !==
d && (b.callback = d);
Ag(e, b);
Jg(e, g, f);
return g
}
function mk(a) {
a = a.current;
if (!a.child) return null;
switch (a.child.tag) {
case 5:
return a.child.stateNode;
default:
return a.child.stateNode
}
}
function nk(a, b) {
a = a.memoizedState;
if (null !== a && null !== a.dehydrated) {
var c = a.retryLane;
a.retryLane = 0 !== c && c < b ? c : b
}
}
function ok(a, b) {
nk(a, b);
(a = a.alternate) && nk(a, b)
}
function pk() {
return null
}
function qk(a, b, c) {
var d = null != c && null != c.hydrationOptions && c.hydrationOptions.mutableSources || null;
c = new jk(a, b, null != c && !0 === c.hydrate);
b = nh(3, null, null, 2 === b ? 7 : 1 === b ? 3 : 0);
c.current = b;
b.stateNode = c;
xg(b);
a[ff] = c.current;
cf(8 === a.nodeType ? a.parentNode : a);
if (d)
for (a = 0; a < d.length; a++) {
b = d[a];
var e = b._getVersion;
e = e(b._source);
null == c.mutableSourceEagerHydrationData ? c.mutableSourceEagerHydrationData = [b, e] : c.mutableSourceEagerHydrationData.push(b, e)
}
this._internalRoot = c
}
qk.prototype.render = function(a) {
lk(a, this._internalRoot, null, null)
};
qk.prototype.unmount = function() {
var a = this._internalRoot,
b = a.containerInfo;
lk(null, a, null, function() {
b[ff] = null
})
};
function rk(a) {
return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || " react-mount-point-unstable " !== a.nodeValue))
}
function sk(a, b) {
b || (b = a ? 9 === a.nodeType ? a.documentElement : a.firstChild : null, b = !(!b || 1 !== b.nodeType || !b.hasAttribute("data-reactroot")));
if (!b)
for (var c; c = a.lastChild;) a.removeChild(c);
return new qk(a, 0, b ? {
hydrate: !0
} : void 0)
}
function tk(a, b, c, d, e) {
var f = c._reactRootContainer;
if (f) {
var g = f._internalRoot;
if ("function" === typeof e) {
var h = e;
e = function() {
var a = mk(g);
h.call(a)
}
}
lk(b, g, a, e)
} else {
f = c._reactRootContainer = sk(c, d);
g = f._internalRoot;
if ("function" === typeof e) {
var k = e;
e = function() {
var a = mk(g);
k.call(a)
}
}
Xj(function() {
lk(b, g, a, e)
})
}
return mk(g)
}
ec = function(a) {
if (13 === a.tag) {
var b = Hg();
Jg(a, 4, b);
ok(a, 4)
}
};
fc = function(a) {
if (13 === a.tag) {
var b = Hg();
Jg(a, 67108864, b);
ok(a, 67108864)
}
};
gc = function(a) {
if (13 === a.tag) {
var b = Hg(),
c = Ig(a);
Jg(a, c, b);
ok(a, c)
}
};
hc = function(a, b) {
return b()
};
yb = function(a, b, c) {
switch (b) {
case "input":
ab(a, c);
b = c.name;
if ("radio" === c.type && null != b) {
for (c = a; c.parentNode;) c = c.parentNode;
c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]');
for (b = 0; b < c.length; b++) {
var d = c[b];
if (d !== a && d.form === a.form) {
var e = Db(d);
if (!e) throw Error(y(90));
Wa(d);
ab(d, e)
}
}
}
break;
case "textarea":
ib(a, c);
break;
case "select":
b = c.value, null != b && fb(a, !!c.multiple, b, !1)
}
};
Gb = Wj;
Hb = function(a, b, c, d, e) {
var f = X;
X |= 4;
try {
return gg(98, a.bind(null, b, c, d, e))
} finally {
X = f, 0 === X && (wj(), ig())
}
};
Ib = function() {
0 === (X & 49) && (Vj(), Oj())
};
Jb = function(a, b) {
var c = X;
X |= 2;
try {
return a(b)
} finally {
X = c, 0 === X && (wj(), ig())
}
};
function uk(a, b) {
var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;
if (!rk(b)) throw Error(y(200));
return kk(a, b, null, c)
}
var vk = {
Events: [Cb, ue, Db, Eb, Fb, Oj, {
current: !1
}]
},
wk = {
findFiberByHostInstance: wc,
bundleType: 0,
version: "17.0.1",
rendererPackageName: "react-dom"
};
var xk = {
bundleType: wk.bundleType,
version: wk.version,
rendererPackageName: wk.rendererPackageName,
rendererConfig: wk.rendererConfig,
overrideHookState: null,
overrideHookStateDeletePath: null,
overrideHookStateRenamePath: null,
overrideProps: null,
overridePropsDeletePath: null,
overridePropsRenamePath: null,
setSuspenseHandler: null,
scheduleUpdate: null,
currentDispatcherRef: ra.ReactCurrentDispatcher,
findHostInstanceByFiber: function(a) {
a = cc(a);
return null === a ? null : a.stateNode
},
findFiberByHostInstance: wk.findFiberByHostInstance ||
pk,
findHostInstancesForRefresh: null,
scheduleRefresh: null,
scheduleRoot: null,
setRefreshHandler: null,
getCurrentFiber: null
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var yk = __REACT_DEVTOOLS_GLOBAL_HOOK__;
if (!yk.isDisabled && yk.supportsFiber) try {
Lf = yk.inject(xk), Mf = yk
} catch (a) {}
}
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = vk;
exports.createPortal = uk;
exports.findDOMNode = function(a) {
if (null == a) return null;
if (1 === a.nodeType) return a;
var b = a._reactInternals;
if (void 0 === b) {
if ("function" === typeof a.render) throw Error(y(188));
throw Error(y(268, Object.keys(a)));
}
a = cc(b);
a = null === a ? null : a.stateNode;
return a
};
exports.flushSync = function(a, b) {
var c = X;
if (0 !== (c & 48)) return a(b);
X |= 1;
try {
if (a) return gg(99, a.bind(null, b))
} finally {
X = c, ig()
}
};
exports.hydrate = function(a, b, c) {
if (!rk(b)) throw Error(y(200));
return tk(null, a, b, !0, c)
};
exports.render = function(a, b, c) {
if (!rk(b)) throw Error(y(200));
return tk(null, a, b, !1, c)
};
exports.unmountComponentAtNode = function(a) {
if (!rk(a)) throw Error(y(40));
return a._reactRootContainer ? (Xj(function() {
tk(null, null, a, !1, function() {
a._reactRootContainer = null;
a[ff] = null
})
}), !0) : !1
};
exports.unstable_batchedUpdates = Wj;
exports.unstable_createPortal = function(a, b) {
return uk(a, b, 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null)
};
exports.unstable_renderSubtreeIntoContainer = function(a, b, c, d) {
if (!rk(c)) throw Error(y(200));
if (null == a || void 0 === a._reactInternals) throw Error(y(38));
return tk(a, b, c, !1, d)
};
exports.version = "17.0.1";
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanM/Y2E1ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2EsT0FBTyxtQkFBTyxDQUFDLElBQU8sSUFBSSxtQkFBTyxDQUFDLElBQWUsSUFBSSxtQkFBTyxDQUFDLElBQVcsRUFBRSxjQUFjLHlFQUF5RSxtQkFBbUIsbURBQW1ELG1DQUFtQyw0SEFBNEgsMkJBQTJCLHFCQUFxQixpQkFBaUIsUUFBUTtBQUM1ZCxpQkFBaUIsUUFBUSxRQUFRLFdBQVc7QUFDNUM7QUFDQSxLQUFLLE9BQU8sZUFBZSwwQkFBMEIsMEJBQTBCLDhCQUE4QixTQUFTLFNBQVMscUJBQXFCLGlDQUFpQyxpQkFBaUIsdUNBQXVDLDZCQUE2QixxQ0FBcUMsNkJBQTZCLCtCQUErQjtBQUMzVyxxQkFBcUIsMERBQTBELGNBQWMsMkJBQTJCLGdCQUFnQixvQkFBb0IsdUJBQXVCLDRCQUE0QixTQUFTLDBCQUEwQix5Q0FBeUMscUJBQXFCLDBCQUEwQix1QkFBdUIsb0JBQW9CLFlBQVksbUJBQW1CLHlCQUF5QjtBQUM3YSxzS0FBc0ssZ0NBQWdDLEVBQUUsNEhBQTRILFdBQVcsbUNBQW1DLEVBQUUseUVBQXlFLDhDQUE4QztBQUMzZSw0RkFBNEYsZ0NBQWdDLEVBQUUsNlFBQTZRLDhDQUE4QztBQUN6Yiw4REFBOEQsZ0NBQWdDLEVBQUUsMkNBQTJDLGdDQUFnQyxFQUFFLGtEQUFrRCxnQ0FBZ0MsRUFBRSx3Q0FBd0MsOENBQThDLEVBQUUsdUJBQXVCLGVBQWU7QUFDL1gseWxDQUF5bEM7QUFDemxDLElBQUksZ0NBQWdDLEVBQUUsMEdBQTBHLHVCQUF1QiwwREFBMEQsRUFBRSx3REFBd0QsdUJBQXVCLGtFQUFrRSxFQUFFLCtDQUErQyw4Q0FBOEM7QUFD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ZTtBQUN6VywyQ0FBMkMsbUJBQW1CLDhCQUE4QiwwREFBMEQsdUJBQXVCLGVBQWUiLCJmaWxlIjoiNDQ0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4xXG4gKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxtPXJlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpLHI9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiB5KGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifWlmKCFhYSl0aHJvdyBFcnJvcih5KDIyNykpO3ZhciBiYT1uZXcgU2V0LGNhPXt9O2Z1bmN0aW9uIGRhKGEsYil7ZWEoYSxiKTtlYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gZWEoYSxiKXtjYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYmEuYWRkKGJbYV0pfVxudmFyIGZhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxoYT0vXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJC8saWE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmphPXt9LGthPXt9O2Z1bmN0aW9uIGxhKGEpe2lmKGlhLmNhbGwoa2EsYSkpcmV0dXJuITA7aWYoaWEuY2FsbChqYSxhKSlyZXR1cm4hMTtpZihoYS50ZXN0KGEpKXJldHVybiBrYVthXT0hMDtqYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBtYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIG5hKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fG1hKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gQihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIEQ9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07RFtiXT1uZXcgQihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBvYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHBhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLFxucGEpO0RbYl09bmV3IEIoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuRC54bGlua0hyZWY9bmV3IEIoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gcWEoYSxiLGMsZCl7dmFyIGU9RC5oYXNPd25Qcm9wZXJ0eShiKT9EW2JdOm51bGw7dmFyIGY9bnVsbCE9PWU/MD09PWUudHlwZTpkPyExOiEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXT8hMTohMDtmfHwobmEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP2xhKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKSl9XG52YXIgcmE9YWEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsc2E9NjAxMDMsdGE9NjAxMDYsdWE9NjAxMDcsd2E9NjAxMDgseGE9NjAxMTQseWE9NjAxMDksemE9NjAxMTAsQWE9NjAxMTIsQmE9NjAxMTMsQ2E9NjAxMjAsRGE9NjAxMTUsRWE9NjAxMTYsRmE9NjAxMjEsR2E9NjAxMjgsSGE9NjAxMjksSWE9NjAxMzAsSmE9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgRT1TeW1ib2wuZm9yO3NhPUUoXCJyZWFjdC5lbGVtZW50XCIpO3RhPUUoXCJyZWFjdC5wb3J0YWxcIik7dWE9RShcInJlYWN0LmZyYWdtZW50XCIpO3dhPUUoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTt4YT1FKFwicmVhY3QucHJvZmlsZXJcIik7eWE9RShcInJlYWN0LnByb3ZpZGVyXCIpO3phPUUoXCJyZWFjdC5jb250ZXh0XCIpO0FhPUUoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTtCYT1FKFwicmVhY3Quc3VzcGVuc2VcIik7Q2E9RShcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7RGE9RShcInJlYWN0Lm1lbW9cIik7RWE9RShcInJlYWN0LmxhenlcIik7RmE9RShcInJlYWN0LmJsb2NrXCIpO0UoXCJyZWFjdC5zY29wZVwiKTtHYT1FKFwicmVhY3Qub3BhcXVlLmlkXCIpO0hhPUUoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO0lhPUUoXCJyZWFjdC5vZmZzY3JlZW5cIik7SmE9RShcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIil9XG52YXIgS2E9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIExhKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT1LYSYmYVtLYV18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH12YXIgTWE7ZnVuY3Rpb24gTmEoYSl7aWYodm9pZCAwPT09TWEpdHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGMpe3ZhciBiPWMuc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7TWE9YiYmYlsxXXx8XCJcIn1yZXR1cm5cIlxcblwiK01hK2F9dmFyIE9hPSExO1xuZnVuY3Rpb24gUGEoYSxiKXtpZighYXx8T2EpcmV0dXJuXCJcIjtPYT0hMDt2YXIgYz1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKGIpaWYoYj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsXCJwcm9wc1wiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO319KSxcIm9iamVjdFwiPT09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QoYixbXSl9Y2F0Y2goayl7dmFyIGQ9a31SZWZsZWN0LmNvbnN0cnVjdChhLFtdLGIpfWVsc2V7dHJ5e2IuY2FsbCgpfWNhdGNoKGspe2Q9a31hLmNhbGwoYi5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGspe2Q9a31hKCl9fWNhdGNoKGspe2lmKGsmJmQmJlwic3RyaW5nXCI9PT10eXBlb2Ygay5zdGFjayl7Zm9yKHZhciBlPWsuc3RhY2suc3BsaXQoXCJcXG5cIiksXG5mPWQuc3RhY2suc3BsaXQoXCJcXG5cIiksZz1lLmxlbmd0aC0xLGg9Zi5sZW5ndGgtMTsxPD1nJiYwPD1oJiZlW2ddIT09ZltoXTspaC0tO2Zvcig7MTw9ZyYmMDw9aDtnLS0saC0tKWlmKGVbZ10hPT1mW2hdKXtpZigxIT09Z3x8MSE9PWgpe2RvIGlmKGctLSxoLS0sMD5ofHxlW2ddIT09ZltoXSlyZXR1cm5cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO3doaWxlKDE8PWcmJjA8PWgpfWJyZWFrfX19ZmluYWxseXtPYT0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1jfXJldHVybihhPWE/YS5kaXNwbGF5TmFtZXx8YS5uYW1lOlwiXCIpP05hKGEpOlwiXCJ9XG5mdW5jdGlvbiBRYShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTpyZXR1cm4gTmEoYS50eXBlKTtjYXNlIDE2OnJldHVybiBOYShcIkxhenlcIik7Y2FzZSAxMzpyZXR1cm4gTmEoXCJTdXNwZW5zZVwiKTtjYXNlIDE5OnJldHVybiBOYShcIlN1c3BlbnNlTGlzdFwiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGE9UGEoYS50eXBlLCExKSxhO2Nhc2UgMTE6cmV0dXJuIGE9UGEoYS50eXBlLnJlbmRlciwhMSksYTtjYXNlIDIyOnJldHVybiBhPVBhKGEudHlwZS5fcmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1QYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFJhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgdWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2UgdGE6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIHhhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHdhOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgQmE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgQ2E6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgemE6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgeWE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgQWE6dmFyIGI9YS5yZW5kZXI7Yj1iLmRpc3BsYXlOYW1lfHxiLm5hbWV8fFwiXCI7XG5yZXR1cm4gYS5kaXNwbGF5TmFtZXx8KFwiXCIhPT1iP1wiRm9yd2FyZFJlZihcIitiK1wiKVwiOlwiRm9yd2FyZFJlZlwiKTtjYXNlIERhOnJldHVybiBSYShhLnR5cGUpO2Nhc2UgRmE6cmV0dXJuIFJhKGEuX3JlbmRlcik7Y2FzZSBFYTpiPWEuX3BheWxvYWQ7YT1hLl9pbml0O3RyeXtyZXR1cm4gUmEoYShiKSl9Y2F0Y2goYyl7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwic3RyaW5nXCI6Y2FzZSBcInVuZGVmaW5lZFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19ZnVuY3Rpb24gVGEoYSl7dmFyIGI9YS50eXBlO3JldHVybihhPWEubm9kZU5hbWUpJiZcImlucHV0XCI9PT1hLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1ifHxcInJhZGlvXCI9PT1iKX1cbmZ1bmN0aW9uIFVhKGEpe3ZhciBiPVRhKGEpP1wiY2hlY2tlZFwiOlwidmFsdWVcIixjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsYiksZD1cIlwiK2FbYl07aWYoIWEuaGFzT3duUHJvcGVydHkoYikmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZ2V0JiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5zZXQpe3ZhciBlPWMuZ2V0LGY9Yy5zZXQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihhKXtkPVwiXCIrYTtmLmNhbGwodGhpcyxhKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZX0pO3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBkfSxzZXRWYWx1ZTpmdW5jdGlvbihhKXtkPVwiXCIrYX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7YS5fdmFsdWVUcmFja2VyPVxubnVsbDtkZWxldGUgYVtiXX19fX1mdW5jdGlvbiBWYShhKXthLl92YWx1ZVRyYWNrZXJ8fChhLl92YWx1ZVRyYWNrZXI9VWEoYSkpfWZ1bmN0aW9uIFdhKGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEuX3ZhbHVlVHJhY2tlcjtpZighYilyZXR1cm4hMDt2YXIgYz1iLmdldFZhbHVlKCk7dmFyIGQ9XCJcIjthJiYoZD1UYShhKT9hLmNoZWNrZWQ/XCJ0cnVlXCI6XCJmYWxzZVwiOmEudmFsdWUpO2E9ZDtyZXR1cm4gYSE9PWM/KGIuc2V0VmFsdWUoYSksITApOiExfWZ1bmN0aW9uIFhhKGEpe2E9YXx8KFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR8fGEuYm9keX1jYXRjaChiKXtyZXR1cm4gYS5ib2R5fX1cbmZ1bmN0aW9uIFlhKGEsYil7dmFyIGM9Yi5jaGVja2VkO3JldHVybiBtKHt9LGIse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm51bGwhPWM/YzphLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBaYShhLGIpe3ZhciBjPW51bGw9PWIuZGVmYXVsdFZhbHVlP1wiXCI6Yi5kZWZhdWx0VmFsdWUsZD1udWxsIT1iLmNoZWNrZWQ/Yi5jaGVja2VkOmIuZGVmYXVsdENoZWNrZWQ7Yz1TYShudWxsIT1iLnZhbHVlP2IudmFsdWU6Yyk7YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpkLGluaXRpYWxWYWx1ZTpjLGNvbnRyb2xsZWQ6XCJjaGVja2JveFwiPT09Yi50eXBlfHxcInJhZGlvXCI9PT1iLnR5cGU/bnVsbCE9Yi5jaGVja2VkOm51bGwhPWIudmFsdWV9fWZ1bmN0aW9uICRhKGEsYil7Yj1iLmNoZWNrZWQ7bnVsbCE9YiYmcWEoYSxcImNoZWNrZWRcIixiLCExKX1cbmZ1bmN0aW9uIGFiKGEsYil7JGEoYSxiKTt2YXIgYz1TYShiLnZhbHVlKSxkPWIudHlwZTtpZihudWxsIT1jKWlmKFwibnVtYmVyXCI9PT1kKXtpZigwPT09YyYmXCJcIj09PWEudmFsdWV8fGEudmFsdWUhPWMpYS52YWx1ZT1cIlwiK2N9ZWxzZSBhLnZhbHVlIT09XCJcIitjJiYoYS52YWx1ZT1cIlwiK2MpO2Vsc2UgaWYoXCJzdWJtaXRcIj09PWR8fFwicmVzZXRcIj09PWQpe2EucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7cmV0dXJufWIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKT9iYihhLGIudHlwZSxjKTpiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpJiZiYihhLGIudHlwZSxTYShiLmRlZmF1bHRWYWx1ZSkpO251bGw9PWIuY2hlY2tlZCYmbnVsbCE9Yi5kZWZhdWx0Q2hlY2tlZCYmKGEuZGVmYXVsdENoZWNrZWQ9ISFiLmRlZmF1bHRDaGVja2VkKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihiLmhhc093blByb3BlcnR5KFwidmFsdWVcIil8fGIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpe3ZhciBkPWIudHlwZTtpZighKFwic3VibWl0XCIhPT1kJiZcInJlc2V0XCIhPT1kfHx2b2lkIDAhPT1iLnZhbHVlJiZudWxsIT09Yi52YWx1ZSkpcmV0dXJuO2I9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlO2N8fGI9PT1hLnZhbHVlfHwoYS52YWx1ZT1iKTthLmRlZmF1bHRWYWx1ZT1ifWM9YS5uYW1lO1wiXCIhPT1jJiYoYS5uYW1lPVwiXCIpO2EuZGVmYXVsdENoZWNrZWQ9ISFhLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XCJcIiE9PWMmJihhLm5hbWU9Yyl9XG5mdW5jdGlvbiBiYihhLGIsYyl7aWYoXCJudW1iZXJcIiE9PWJ8fFhhKGEub3duZXJEb2N1bWVudCkhPT1hKW51bGw9PWM/YS5kZWZhdWx0VmFsdWU9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmEuZGVmYXVsdFZhbHVlIT09XCJcIitjJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitjKX1mdW5jdGlvbiBkYihhKXt2YXIgYj1cIlwiO2FhLkNoaWxkcmVuLmZvckVhY2goYSxmdW5jdGlvbihhKXtudWxsIT1hJiYoYis9YSl9KTtyZXR1cm4gYn1mdW5jdGlvbiBlYihhLGIpe2E9bSh7Y2hpbGRyZW46dm9pZCAwfSxiKTtpZihiPWRiKGIuY2hpbGRyZW4pKWEuY2hpbGRyZW49YjtyZXR1cm4gYX1cbmZ1bmN0aW9uIGZiKGEsYixjLGQpe2E9YS5vcHRpb25zO2lmKGIpe2I9e307Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYltcIiRcIitjW2VdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWU9Yi5oYXNPd25Qcm9wZXJ0eShcIiRcIithW2NdLnZhbHVlKSxhW2NdLnNlbGVjdGVkIT09ZSYmKGFbY10uc2VsZWN0ZWQ9ZSksZSYmZCYmKGFbY10uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2M9XCJcIitTYShjKTtiPW51bGw7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKyl7aWYoYVtlXS52YWx1ZT09PWMpe2FbZV0uc2VsZWN0ZWQ9ITA7ZCYmKGFbZV0uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59bnVsbCE9PWJ8fGFbZV0uZGlzYWJsZWR8fChiPWFbZV0pfW51bGwhPT1iJiYoYi5zZWxlY3RlZD0hMCl9fVxuZnVuY3Rpb24gZ2IoYSxiKXtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXRocm93IEVycm9yKHkoOTEpKTtyZXR1cm4gbSh7fSxiLHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjpcIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBoYihhLGIpe3ZhciBjPWIudmFsdWU7aWYobnVsbD09Yyl7Yz1iLmNoaWxkcmVuO2I9Yi5kZWZhdWx0VmFsdWU7aWYobnVsbCE9Yyl7aWYobnVsbCE9Yil0aHJvdyBFcnJvcih5KDkyKSk7aWYoQXJyYXkuaXNBcnJheShjKSl7aWYoISgxPj1jLmxlbmd0aCkpdGhyb3cgRXJyb3IoeSg5MykpO2M9Y1swXX1iPWN9bnVsbD09YiYmKGI9XCJcIik7Yz1ifWEuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOlNhKGMpfX1cbmZ1bmN0aW9uIGliKGEsYil7dmFyIGM9U2EoYi52YWx1ZSksZD1TYShiLmRlZmF1bHRWYWx1ZSk7bnVsbCE9YyYmKGM9XCJcIitjLGMhPT1hLnZhbHVlJiYoYS52YWx1ZT1jKSxudWxsPT1iLmRlZmF1bHRWYWx1ZSYmYS5kZWZhdWx0VmFsdWUhPT1jJiYoYS5kZWZhdWx0VmFsdWU9YykpO251bGwhPWQmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2QpfWZ1bmN0aW9uIGpiKGEpe3ZhciBiPWEudGV4dENvbnRlbnQ7Yj09PWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJlwiXCIhPT1iJiZudWxsIT09YiYmKGEudmFsdWU9Yil9dmFyIGtiPXtodG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiLG1hdGhtbDpcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIixzdmc6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wifTtcbmZ1bmN0aW9uIGxiKGEpe3N3aXRjaChhKXtjYXNlIFwic3ZnXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2Nhc2UgXCJtYXRoXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7ZGVmYXVsdDpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIn19ZnVuY3Rpb24gbWIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2xiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG5iLG9iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihhLm5hbWVzcGFjZVVSSSE9PWtiLnN2Z3x8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle25iPW5ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO25iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW5iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIHBiKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcWI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLFxuZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scmI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHFiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cWJbYl09cWJbYV19KX0pO2Z1bmN0aW9uIHNiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxxYi5oYXNPd25Qcm9wZXJ0eShhKSYmcWJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gdGIoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9c2IoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdWI9bSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHZiKGEsYil7aWYoYil7aWYodWJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcih5KDYwKSk7aWYoIShcIm9iamVjdFwiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJlwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcih5KDYyKSk7fX1cbmZ1bmN0aW9uIHdiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX1mdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHkoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKGEsYixjLGQsZSl7cmV0dXJuIGEoYixjLGQsZSl9ZnVuY3Rpb24gSWIoKXt9dmFyIEpiPUdiLEtiPSExLExiPSExO2Z1bmN0aW9uIE1iKCl7aWYobnVsbCE9PXpifHxudWxsIT09QWIpSWIoKSxGYigpfVxuZnVuY3Rpb24gTmIoYSxiLGMpe2lmKExiKXJldHVybiBhKGIsYyk7TGI9ITA7dHJ5e3JldHVybiBKYihhLGIsYyl9ZmluYWxseXtMYj0hMSxNYigpfX1cbmZ1bmN0aW9uIE9iKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9RGIoYyk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgXCJvbkNsaWNrXCI6Y2FzZSBcIm9uQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpjYXNlIFwib25Eb3VibGVDbGlja0NhcHR1cmVcIjpjYXNlIFwib25Nb3VzZURvd25cIjpjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlVXBcIjpjYXNlIFwib25Nb3VzZVVwQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRW50ZXJcIjooZD0hZC5kaXNhYmxlZCl8fChhPWEudHlwZSxkPSEoXCJidXR0b25cIj09PWF8fFwiaW5wdXRcIj09PWF8fFwic2VsZWN0XCI9PT1hfHxcInRleHRhcmVhXCI9PT1hKSk7YT0hZDticmVhayBhO2RlZmF1bHQ6YT0hMX1pZihhKXJldHVybiBudWxsO2lmKGMmJlwiZnVuY3Rpb25cIiE9PVxudHlwZW9mIGMpdGhyb3cgRXJyb3IoeSgyMzEsYix0eXBlb2YgYykpO3JldHVybiBjfXZhciBQYj0hMTtpZihmYSl0cnl7dmFyIFFiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShRYixcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7UGI9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsUWIsUWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLFFiLFFiKX1jYXRjaChhKXtQYj0hMX1mdW5jdGlvbiBSYihhLGIsYyxkLGUsZixnLGgsayl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtiLmFwcGx5KGMsbCl9Y2F0Y2gobil7dGhpcy5vbkVycm9yKG4pfX12YXIgU2I9ITEsVGI9bnVsbCxVYj0hMSxWYj1udWxsLFdiPXtvbkVycm9yOmZ1bmN0aW9uKGEpe1NiPSEwO1RiPWF9fTtmdW5jdGlvbiBYYihhLGIsYyxkLGUsZixnLGgsayl7U2I9ITE7VGI9bnVsbDtSYi5hcHBseShXYixhcmd1bWVudHMpfVxuZnVuY3Rpb24gWWIoYSxiLGMsZCxlLGYsZyxoLGspe1hiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihTYil7aWYoU2Ipe3ZhciBsPVRiO1NiPSExO1RiPW51bGx9ZWxzZSB0aHJvdyBFcnJvcih5KDE5OCkpO1VifHwoVWI9ITAsVmI9bCl9fWZ1bmN0aW9uIFpiKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5mbGFncyYxMDI2KSYmKGM9Yi5yZXR1cm4pLGE9Yi5yZXR1cm47d2hpbGUoYSl9cmV0dXJuIDM9PT1iLnRhZz9jOm51bGx9ZnVuY3Rpb24gJGIoYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9YS5tZW1vaXplZFN0YXRlO251bGw9PT1iJiYoYT1hLmFsdGVybmF0ZSxudWxsIT09YSYmKGI9YS5tZW1vaXplZFN0YXRlKSk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhYyhhKXtpZihaYihhKSE9PWEpdGhyb3cgRXJyb3IoeSgxODgpKTt9XG5mdW5jdGlvbiBiYyhhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYil7Yj1aYihhKTtpZihudWxsPT09Yil0aHJvdyBFcnJvcih5KDE4OCkpO3JldHVybiBiIT09YT9udWxsOmF9Zm9yKHZhciBjPWEsZD1iOzspe3ZhciBlPWMucmV0dXJuO2lmKG51bGw9PT1lKWJyZWFrO3ZhciBmPWUuYWx0ZXJuYXRlO2lmKG51bGw9PT1mKXtkPWUucmV0dXJuO2lmKG51bGwhPT1kKXtjPWQ7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PWYuY2hpbGQpe2ZvcihmPWUuY2hpbGQ7Zjspe2lmKGY9PT1jKXJldHVybiBhYyhlKSxhO2lmKGY9PT1kKXJldHVybiBhYyhlKSxiO2Y9Zi5zaWJsaW5nfXRocm93IEVycm9yKHkoMTg4KSk7fWlmKGMucmV0dXJuIT09ZC5yZXR1cm4pYz1lLGQ9ZjtlbHNle2Zvcih2YXIgZz0hMSxoPWUuY2hpbGQ7aDspe2lmKGg9PT1jKXtnPSEwO2M9ZTtkPWY7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1lO2M9ZjticmVha31oPWguc2libGluZ31pZighZyl7Zm9yKGg9Zi5jaGlsZDtoOyl7aWYoaD09PVxuYyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpdGhyb3cgRXJyb3IoeSgxODkpKTt9fWlmKGMuYWx0ZXJuYXRlIT09ZCl0aHJvdyBFcnJvcih5KDE5MCkpO31pZigzIT09Yy50YWcpdGhyb3cgRXJyb3IoeSgxODgpKTtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIGNjKGEpe2E9YmMoYSk7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKHZhciBiPWE7Oyl7aWYoNT09PWIudGFnfHw2PT09Yi50YWcpcmV0dXJuIGI7aWYoYi5jaGlsZCliLmNoaWxkLnJldHVybj1iLGI9Yi5jaGlsZDtlbHNle2lmKGI9PT1hKWJyZWFrO2Zvcig7IWIuc2libGluZzspe2lmKCFiLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBkYyhhLGIpe2Zvcih2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09Yjspe2lmKGI9PT1hfHxiPT09YylyZXR1cm4hMDtiPWIucmV0dXJufXJldHVybiExfXZhciBlYyxmYyxnYyxoYyxpYz0hMSxqYz1bXSxrYz1udWxsLGxjPW51bGwsbWM9bnVsbCxuYz1uZXcgTWFwLG9jPW5ldyBNYXAscGM9W10scWM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gcmMoYSxiLGMsZCxlKXtyZXR1cm57YmxvY2tlZE9uOmEsZG9tRXZlbnROYW1lOmIsZXZlbnRTeXN0ZW1GbGFnczpjfDE2LG5hdGl2ZUV2ZW50OmUsdGFyZ2V0Q29udGFpbmVyczpbZF19fWZ1bmN0aW9uIHNjKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6Y2FzZSBcImZvY3Vzb3V0XCI6a2M9bnVsbDticmVhaztjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmxjPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJtb3VzZW91dFwiOm1jPW51bGw7YnJlYWs7Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpuYy5kZWxldGUoYi5wb2ludGVySWQpO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpvYy5kZWxldGUoYi5wb2ludGVySWQpfX1cbmZ1bmN0aW9uIHRjKGEsYixjLGQsZSxmKXtpZihudWxsPT09YXx8YS5uYXRpdmVFdmVudCE9PWYpcmV0dXJuIGE9cmMoYixjLGQsZSxmKSxudWxsIT09YiYmKGI9Q2IoYiksbnVsbCE9PWImJmZjKGIpKSxhO2EuZXZlbnRTeXN0ZW1GbGFnc3w9ZDtiPWEudGFyZ2V0Q29udGFpbmVycztudWxsIT09ZSYmLTE9PT1iLmluZGV4T2YoZSkmJmIucHVzaChlKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHVjKGEsYixjLGQsZSl7c3dpdGNoKGIpe2Nhc2UgXCJmb2N1c2luXCI6cmV0dXJuIGtjPXRjKGtjLGEsYixjLGQsZSksITA7Y2FzZSBcImRyYWdlbnRlclwiOnJldHVybiBsYz10YyhsYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJtb3VzZW92ZXJcIjpyZXR1cm4gbWM9dGMobWMsYSxiLGMsZCxlKSwhMDtjYXNlIFwicG9pbnRlcm92ZXJcIjp2YXIgZj1lLnBvaW50ZXJJZDtuYy5zZXQoZix0YyhuYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSk7cmV0dXJuITA7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6cmV0dXJuIGY9ZS5wb2ludGVySWQsb2Muc2V0KGYsdGMob2MuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpLCEwfXJldHVybiExfVxuZnVuY3Rpb24gdmMoYSl7dmFyIGI9d2MoYS50YXJnZXQpO2lmKG51bGwhPT1iKXt2YXIgYz1aYihiKTtpZihudWxsIT09YylpZihiPWMudGFnLDEzPT09Yil7aWYoYj0kYihjKSxudWxsIT09Yil7YS5ibG9ja2VkT249YjtoYyhhLmxhbmVQcmlvcml0eSxmdW5jdGlvbigpe3IudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KGEucHJpb3JpdHksZnVuY3Rpb24oKXtnYyhjKX0pfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5oeWRyYXRlKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1cbmZ1bmN0aW9uIHhjKGEpe2lmKG51bGwhPT1hLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz15YyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09YylyZXR1cm4gYj1DYihjKSxudWxsIT09YiYmZmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gemMoYSxiLGMpe3hjKGEpJiZjLmRlbGV0ZShiKX1cbmZ1bmN0aW9uIEFjKCl7Zm9yKGljPSExOzA8amMubGVuZ3RoOyl7dmFyIGE9amNbMF07aWYobnVsbCE9PWEuYmxvY2tlZE9uKXthPUNiKGEuYmxvY2tlZE9uKTtudWxsIT09YSYmZWMoYSk7YnJlYWt9Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9eWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbCE9PWMpe2EuYmxvY2tlZE9uPWM7YnJlYWt9Yi5zaGlmdCgpfW51bGw9PT1hLmJsb2NrZWRPbiYmamMuc2hpZnQoKX1udWxsIT09a2MmJnhjKGtjKSYmKGtjPW51bGwpO251bGwhPT1sYyYmeGMobGMpJiYobGM9bnVsbCk7bnVsbCE9PW1jJiZ4YyhtYykmJihtYz1udWxsKTtuYy5mb3JFYWNoKHpjKTtvYy5mb3JFYWNoKHpjKX1cbmZ1bmN0aW9uIEJjKGEsYil7YS5ibG9ja2VkT249PT1iJiYoYS5ibG9ja2VkT249bnVsbCxpY3x8KGljPSEwLHIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEFjKSkpfVxuZnVuY3Rpb24gQ2MoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gQmMoYixhKX1pZigwPGpjLmxlbmd0aCl7QmMoamNbMF0sYSk7Zm9yKHZhciBjPTE7YzxqYy5sZW5ndGg7YysrKXt2YXIgZD1qY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PWtjJiZCYyhrYyxhKTtudWxsIT09bGMmJkJjKGxjLGEpO251bGwhPT1tYyYmQmMobWMsYSk7bmMuZm9yRWFjaChiKTtvYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxwYy5sZW5ndGg7YysrKWQ9cGNbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPHBjLmxlbmd0aCYmKGM9cGNbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspdmMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZwYy5zaGlmdCgpfVxuZnVuY3Rpb24gRGMoYSxiKXt2YXIgYz17fTtjW2EudG9Mb3dlckNhc2UoKV09Yi50b0xvd2VyQ2FzZSgpO2NbXCJXZWJraXRcIithXT1cIndlYmtpdFwiK2I7Y1tcIk1velwiK2FdPVwibW96XCIrYjtyZXR1cm4gY312YXIgRWM9e2FuaW1hdGlvbmVuZDpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uRW5kXCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uSXRlcmF0aW9uXCIpLGFuaW1hdGlvbnN0YXJ0OkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25TdGFydFwiKSx0cmFuc2l0aW9uZW5kOkRjKFwiVHJhbnNpdGlvblwiLFwiVHJhbnNpdGlvbkVuZFwiKX0sRmM9e30sR2M9e307XG5mYSYmKEdjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJBbmltYXRpb25FdmVudFwiaW4gd2luZG93fHwoZGVsZXRlIEVjLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksXCJUcmFuc2l0aW9uRXZlbnRcImluIHdpbmRvd3x8ZGVsZXRlIEVjLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gSGMoYSl7aWYoRmNbYV0pcmV0dXJuIEZjW2FdO2lmKCFFY1thXSlyZXR1cm4gYTt2YXIgYj1FY1thXSxjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSYmYyBpbiBHYylyZXR1cm4gRmNbYV09YltjXTtyZXR1cm4gYX1cbnZhciBJYz1IYyhcImFuaW1hdGlvbmVuZFwiKSxKYz1IYyhcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxLYz1IYyhcImFuaW1hdGlvbnN0YXJ0XCIpLExjPUhjKFwidHJhbnNpdGlvbmVuZFwiKSxNYz1uZXcgTWFwLE5jPW5ldyBNYXAsT2M9W1wiYWJvcnRcIixcImFib3J0XCIsSWMsXCJhbmltYXRpb25FbmRcIixKYyxcImFuaW1hdGlvbkl0ZXJhdGlvblwiLEtjLFwiYW5pbWF0aW9uU3RhcnRcIixcImNhbnBsYXlcIixcImNhblBsYXlcIixcImNhbnBsYXl0aHJvdWdoXCIsXCJjYW5QbGF5VGhyb3VnaFwiLFwiZHVyYXRpb25jaGFuZ2VcIixcImR1cmF0aW9uQ2hhbmdlXCIsXCJlbXB0aWVkXCIsXCJlbXB0aWVkXCIsXCJlbmNyeXB0ZWRcIixcImVuY3J5cHRlZFwiLFwiZW5kZWRcIixcImVuZGVkXCIsXCJlcnJvclwiLFwiZXJyb3JcIixcImdvdHBvaW50ZXJjYXB0dXJlXCIsXCJnb3RQb2ludGVyQ2FwdHVyZVwiLFwibG9hZFwiLFwibG9hZFwiLFwibG9hZGVkZGF0YVwiLFwibG9hZGVkRGF0YVwiLFwibG9hZGVkbWV0YWRhdGFcIixcImxvYWRlZE1ldGFkYXRhXCIsXCJsb2Fkc3RhcnRcIixcImxvYWRTdGFydFwiLFxuXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcImxvc3RQb2ludGVyQ2FwdHVyZVwiLFwicGxheWluZ1wiLFwicGxheWluZ1wiLFwicHJvZ3Jlc3NcIixcInByb2dyZXNzXCIsXCJzZWVraW5nXCIsXCJzZWVraW5nXCIsXCJzdGFsbGVkXCIsXCJzdGFsbGVkXCIsXCJzdXNwZW5kXCIsXCJzdXNwZW5kXCIsXCJ0aW1ldXBkYXRlXCIsXCJ0aW1lVXBkYXRlXCIsTGMsXCJ0cmFuc2l0aW9uRW5kXCIsXCJ3YWl0aW5nXCIsXCJ3YWl0aW5nXCJdO2Z1bmN0aW9uIFBjKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKz0yKXt2YXIgZD1hW2NdLGU9YVtjKzFdO2U9XCJvblwiKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSk7TmMuc2V0KGQsYik7TWMuc2V0KGQsZSk7ZGEoZSxbZF0pfX12YXIgUWM9ci51bnN0YWJsZV9ub3c7UWMoKTt2YXIgRj04O1xuZnVuY3Rpb24gUmMoYSl7aWYoMCE9PSgxJmEpKXJldHVybiBGPTE1LDE7aWYoMCE9PSgyJmEpKXJldHVybiBGPTE0LDI7aWYoMCE9PSg0JmEpKXJldHVybiBGPTEzLDQ7dmFyIGI9MjQmYTtpZigwIT09YilyZXR1cm4gRj0xMixiO2lmKDAhPT0oYSYzMikpcmV0dXJuIEY9MTEsMzI7Yj0xOTImYTtpZigwIT09YilyZXR1cm4gRj0xMCxiO2lmKDAhPT0oYSYyNTYpKXJldHVybiBGPTksMjU2O2I9MzU4NCZhO2lmKDAhPT1iKXJldHVybiBGPTgsYjtpZigwIT09KGEmNDA5NikpcmV0dXJuIEY9Nyw0MDk2O2I9NDE4NjExMiZhO2lmKDAhPT1iKXJldHVybiBGPTYsYjtiPTYyOTE0NTYwJmE7aWYoMCE9PWIpcmV0dXJuIEY9NSxiO2lmKGEmNjcxMDg4NjQpcmV0dXJuIEY9NCw2NzEwODg2NDtpZigwIT09KGEmMTM0MjE3NzI4KSlyZXR1cm4gRj0zLDEzNDIxNzcyODtiPTgwNTMwNjM2OCZhO2lmKDAhPT1iKXJldHVybiBGPTIsYjtpZigwIT09KDEwNzM3NDE4MjQmYSkpcmV0dXJuIEY9MSwxMDczNzQxODI0O1xuRj04O3JldHVybiBhfWZ1bmN0aW9uIFNjKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiAxNTtjYXNlIDk4OnJldHVybiAxMDtjYXNlIDk3OmNhc2UgOTY6cmV0dXJuIDg7Y2FzZSA5NTpyZXR1cm4gMjtkZWZhdWx0OnJldHVybiAwfX1mdW5jdGlvbiBUYyhhKXtzd2l0Y2goYSl7Y2FzZSAxNTpjYXNlIDE0OnJldHVybiA5OTtjYXNlIDEzOmNhc2UgMTI6Y2FzZSAxMTpjYXNlIDEwOnJldHVybiA5ODtjYXNlIDk6Y2FzZSA4OmNhc2UgNzpjYXNlIDY6Y2FzZSA0OmNhc2UgNTpyZXR1cm4gOTc7Y2FzZSAzOmNhc2UgMjpjYXNlIDE6cmV0dXJuIDk1O2Nhc2UgMDpyZXR1cm4gOTA7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDM1OCxhKSk7fX1cbmZ1bmN0aW9uIFVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIEY9MDt2YXIgZD0wLGU9MCxmPWEuZXhwaXJlZExhbmVzLGc9YS5zdXNwZW5kZWRMYW5lcyxoPWEucGluZ2VkTGFuZXM7aWYoMCE9PWYpZD1mLGU9Rj0xNTtlbHNlIGlmKGY9YyYxMzQyMTc3MjcsMCE9PWYpe3ZhciBrPWYmfmc7MCE9PWs/KGQ9UmMoayksZT1GKTooaCY9ZiwwIT09aCYmKGQ9UmMoaCksZT1GKSl9ZWxzZSBmPWMmfmcsMCE9PWY/KGQ9UmMoZiksZT1GKTowIT09aCYmKGQ9UmMoaCksZT1GKTtpZigwPT09ZClyZXR1cm4gMDtkPTMxLVZjKGQpO2Q9YyYoKDA+ZD8wOjE8PGQpPDwxKS0xO2lmKDAhPT1iJiZiIT09ZCYmMD09PShiJmcpKXtSYyhiKTtpZihlPD1GKXJldHVybiBiO0Y9ZX1iPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLVZjKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gV2MoYSl7YT1hLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNTtyZXR1cm4gMCE9PWE/YTphJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIFhjKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTU6cmV0dXJuIDE7Y2FzZSAxNDpyZXR1cm4gMjtjYXNlIDEyOnJldHVybiBhPVljKDI0Jn5iKSwwPT09YT9YYygxMCxiKTphO2Nhc2UgMTA6cmV0dXJuIGE9WWMoMTkyJn5iKSwwPT09YT9YYyg4LGIpOmE7Y2FzZSA4OnJldHVybiBhPVljKDM1ODQmfmIpLDA9PT1hJiYoYT1ZYyg0MTg2MTEyJn5iKSwwPT09YSYmKGE9NTEyKSksYTtjYXNlIDI6cmV0dXJuIGI9WWMoODA1MzA2MzY4Jn5iKSwwPT09YiYmKGI9MjY4NDM1NDU2KSxifXRocm93IEVycm9yKHkoMzU4LGEpKTt9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGEmLWF9ZnVuY3Rpb24gWmMoYSl7Zm9yKHZhciBiPVtdLGM9MDszMT5jO2MrKyliLnB1c2goYSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiAkYyhhLGIsYyl7YS5wZW5kaW5nTGFuZXN8PWI7dmFyIGQ9Yi0xO2Euc3VzcGVuZGVkTGFuZXMmPWQ7YS5waW5nZWRMYW5lcyY9ZDthPWEuZXZlbnRUaW1lcztiPTMxLVZjKGIpO2FbYl09Y312YXIgVmM9TWF0aC5jbHozMj9NYXRoLmNsejMyOmFkLGJkPU1hdGgubG9nLGNkPU1hdGguTE4yO2Z1bmN0aW9uIGFkKGEpe3JldHVybiAwPT09YT8zMjozMS0oYmQoYSkvY2R8MCl8MH12YXIgZGQ9ci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxlZD1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxmZD0hMDtmdW5jdGlvbiBnZChhLGIsYyxkKXtLYnx8SWIoKTt2YXIgZT1oZCxmPUtiO0tiPSEwO3RyeXtIYihlLGEsYixjLGQpfWZpbmFsbHl7KEtiPWYpfHxNYigpfX1mdW5jdGlvbiBpZChhLGIsYyxkKXtlZChkZCxoZC5iaW5kKG51bGwsYSxiLGMsZCkpfVxuZnVuY3Rpb24gaGQoYSxiLGMsZCl7aWYoZmQpe3ZhciBlO2lmKChlPTA9PT0oYiY0KSkmJjA8amMubGVuZ3RoJiYtMTxxYy5pbmRleE9mKGEpKWE9cmMobnVsbCxhLGIsYyxkKSxqYy5wdXNoKGEpO2Vsc2V7dmFyIGY9eWMoYSxiLGMsZCk7aWYobnVsbD09PWYpZSYmc2MoYSxkKTtlbHNle2lmKGUpe2lmKC0xPHFjLmluZGV4T2YoYSkpe2E9cmMoZixhLGIsYyxkKTtqYy5wdXNoKGEpO3JldHVybn1pZih1YyhmLGEsYixjLGQpKXJldHVybjtzYyhhLGQpfWpkKGEsYixkLG51bGwsYyl9fX19XG5mdW5jdGlvbiB5YyhhLGIsYyxkKXt2YXIgZT14YihkKTtlPXdjKGUpO2lmKG51bGwhPT1lKXt2YXIgZj1aYihlKTtpZihudWxsPT09ZillPW51bGw7ZWxzZXt2YXIgZz1mLnRhZztpZigxMz09PWcpe2U9JGIoZik7aWYobnVsbCE9PWUpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYoMz09PWcpe2lmKGYuc3RhdGVOb2RlLmh5ZHJhdGUpcmV0dXJuIDM9PT1mLnRhZz9mLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgZiE9PWUmJihlPW51bGwpfX1qZChhLGIsZCxlLGMpO3JldHVybiBudWxsfXZhciBrZD1udWxsLGxkPW51bGwsbWQ9bnVsbDtcbmZ1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1mdW5jdGlvbiBvZChhKXt2YXIgYj1hLmtleUNvZGU7XCJjaGFyQ29kZVwiaW4gYT8oYT1hLmNoYXJDb2RlLDA9PT1hJiYxMz09PWImJihhPTEzKSk6YT1iOzEwPT09YSYmKGE9MTMpO3JldHVybiAzMjw9YXx8MTM9PT1hP2E6MH1mdW5jdGlvbiBwZCgpe3JldHVybiEwfWZ1bmN0aW9uIHFkKCl7cmV0dXJuITF9XG5mdW5jdGlvbiByZChhKXtmdW5jdGlvbiBiKGIsZCxlLGYsZyl7dGhpcy5fcmVhY3ROYW1lPWI7dGhpcy5fdGFyZ2V0SW5zdD1lO3RoaXMudHlwZT1kO3RoaXMubmF0aXZlRXZlbnQ9Zjt0aGlzLnRhcmdldD1nO3RoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihiPWFbY10sdGhpc1tjXT1iP2IoZik6ZltjXSk7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG51bGwhPWYuZGVmYXVsdFByZXZlbnRlZD9mLmRlZmF1bHRQcmV2ZW50ZWQ6ITE9PT1mLnJldHVyblZhbHVlKT9wZDpxZDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFkO3JldHVybiB0aGlzfW0oYi5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOlwidW5rbm93blwiIT09dHlwZW9mIGEucmV0dXJuVmFsdWUmJlxuKGEucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXBkKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5zdG9wUHJvcGFnYXRpb24/YS5zdG9wUHJvcGFnYXRpb24oKTpcInVua25vd25cIiE9PXR5cGVvZiBhLmNhbmNlbEJ1YmJsZSYmKGEuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXBkKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OnBkfSk7cmV0dXJuIGJ9XG52YXIgc2Q9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sdGQ9cmQoc2QpLHVkPW0oe30sc2Qse3ZpZXc6MCxkZXRhaWw6MH0pLHZkPXJkKHVkKSx3ZCx4ZCx5ZCxBZD1tKHt9LHVkLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkLGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hLnJlbGF0ZWRUYXJnZXQ/YS5mcm9tRWxlbWVudD09PWEuc3JjRWxlbWVudD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50OmEucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGEpe2lmKFwibW92ZW1lbnRYXCJpblxuYSlyZXR1cm4gYS5tb3ZlbWVudFg7YSE9PXlkJiYoeWQmJlwibW91c2Vtb3ZlXCI9PT1hLnR5cGU/KHdkPWEuc2NyZWVuWC15ZC5zY3JlZW5YLHhkPWEuc2NyZWVuWS15ZC5zY3JlZW5ZKTp4ZD13ZD0wLHlkPWEpO3JldHVybiB3ZH0sbW92ZW1lbnRZOmZ1bmN0aW9uKGEpe3JldHVyblwibW92ZW1lbnRZXCJpbiBhP2EubW92ZW1lbnRZOnhkfX0pLEJkPXJkKEFkKSxDZD1tKHt9LEFkLHtkYXRhVHJhbnNmZXI6MH0pLERkPXJkKENkKSxFZD1tKHt9LHVkLHtyZWxhdGVkVGFyZ2V0OjB9KSxGZD1yZChFZCksR2Q9bSh7fSxzZCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksSGQ9cmQoR2QpLElkPW0oe30sc2Qse2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuXCJjbGlwYm9hcmREYXRhXCJpbiBhP2EuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxKZD1yZChJZCksS2Q9bSh7fSxzZCx7ZGF0YTowfSksTGQ9cmQoS2QpLE1kPXtFc2M6XCJFc2NhcGVcIixcblNwYWNlYmFyOlwiIFwiLExlZnQ6XCJBcnJvd0xlZnRcIixVcDpcIkFycm93VXBcIixSaWdodDpcIkFycm93UmlnaHRcIixEb3duOlwiQXJyb3dEb3duXCIsRGVsOlwiRGVsZXRlXCIsV2luOlwiT1NcIixNZW51OlwiQ29udGV4dE1lbnVcIixBcHBzOlwiQ29udGV4dE1lbnVcIixTY3JvbGw6XCJTY3JvbGxMb2NrXCIsTW96UHJpbnRhYmxlS2V5OlwiVW5pZGVudGlmaWVkXCJ9LE5kPXs4OlwiQmFja3NwYWNlXCIsOTpcIlRhYlwiLDEyOlwiQ2xlYXJcIiwxMzpcIkVudGVyXCIsMTY6XCJTaGlmdFwiLDE3OlwiQ29udHJvbFwiLDE4OlwiQWx0XCIsMTk6XCJQYXVzZVwiLDIwOlwiQ2Fwc0xvY2tcIiwyNzpcIkVzY2FwZVwiLDMyOlwiIFwiLDMzOlwiUGFnZVVwXCIsMzQ6XCJQYWdlRG93blwiLDM1OlwiRW5kXCIsMzY6XCJIb21lXCIsMzc6XCJBcnJvd0xlZnRcIiwzODpcIkFycm93VXBcIiwzOTpcIkFycm93UmlnaHRcIiw0MDpcIkFycm93RG93blwiLDQ1OlwiSW5zZXJ0XCIsNDY6XCJEZWxldGVcIiwxMTI6XCJGMVwiLDExMzpcIkYyXCIsMTE0OlwiRjNcIiwxMTU6XCJGNFwiLDExNjpcIkY1XCIsMTE3OlwiRjZcIiwxMTg6XCJGN1wiLFxuMTE5OlwiRjhcIiwxMjA6XCJGOVwiLDEyMTpcIkYxMFwiLDEyMjpcIkYxMVwiLDEyMzpcIkYxMlwiLDE0NDpcIk51bUxvY2tcIiwxNDU6XCJTY3JvbGxMb2NrXCIsMjI0OlwiTWV0YVwifSxPZD17QWx0OlwiYWx0S2V5XCIsQ29udHJvbDpcImN0cmxLZXlcIixNZXRhOlwibWV0YUtleVwiLFNoaWZ0Olwic2hpZnRLZXlcIn07ZnVuY3Rpb24gUGQoYSl7dmFyIGI9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gYi5nZXRNb2RpZmllclN0YXRlP2IuZ2V0TW9kaWZpZXJTdGF0ZShhKTooYT1PZFthXSk/ISFiW2FdOiExfWZ1bmN0aW9uIHpkKCl7cmV0dXJuIFBkfVxudmFyIFFkPW0oe30sdWQse2tleTpmdW5jdGlvbihhKXtpZihhLmtleSl7dmFyIGI9TWRbYS5rZXldfHxhLmtleTtpZihcIlVuaWRlbnRpZmllZFwiIT09YilyZXR1cm4gYn1yZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/KGE9b2QoYSksMTM9PT1hP1wiRW50ZXJcIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP05kW2Eua2V5Q29kZV18fFwiVW5pZGVudGlmaWVkXCI6XCJcIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6emQsY2hhckNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlP29kKGEpOjB9LGtleUNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09XG5hLnR5cGU/b2QoYSk6XCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH19KSxSZD1yZChRZCksU2Q9bSh7fSxBZCx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxUZD1yZChTZCksVWQ9bSh7fSx1ZCx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkfSksVmQ9cmQoVWQpLFdkPW0oe30sc2Qse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksWGQ9cmQoV2QpLFlkPW0oe30sQWQse2RlbHRhWDpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWFwiaW4gYT9hLmRlbHRhWDpcIndoZWVsRGVsdGFYXCJpbiBhPy1hLndoZWVsRGVsdGFYOjB9LFxuZGVsdGFZOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFZXCJpbiBhP2EuZGVsdGFZOlwid2hlZWxEZWx0YVlcImluIGE/LWEud2hlZWxEZWx0YVk6XCJ3aGVlbERlbHRhXCJpbiBhPy1hLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxaZD1yZChZZCksJGQ9WzksMTMsMjcsMzJdLGFlPWZhJiZcIkNvbXBvc2l0aW9uRXZlbnRcImluIHdpbmRvdyxiZT1udWxsO2ZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJihiZT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBjZT1mYSYmXCJUZXh0RXZlbnRcImluIHdpbmRvdyYmIWJlLGRlPWZhJiYoIWFlfHxiZSYmODxiZSYmMTE+PWJlKSxlZT1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxmZT0hMTtcbmZ1bmN0aW9uIGdlKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJrZXl1cFwiOnJldHVybi0xIT09JGQuaW5kZXhPZihiLmtleUNvZGUpO2Nhc2UgXCJrZXlkb3duXCI6cmV0dXJuIDIyOSE9PWIua2V5Q29kZTtjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcImZvY3Vzb3V0XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gaGUoYSl7YT1hLmRldGFpbDtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJlwiZGF0YVwiaW4gYT9hLmRhdGE6bnVsbH12YXIgaWU9ITE7ZnVuY3Rpb24gamUoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIGhlKGIpO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKDMyIT09Yi53aGljaClyZXR1cm4gbnVsbDtmZT0hMDtyZXR1cm4gZWU7Y2FzZSBcInRleHRJbnB1dFwiOnJldHVybiBhPWIuZGF0YSxhPT09ZWUmJmZlP251bGw6YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbmZ1bmN0aW9uIGtlKGEsYil7aWYoaWUpcmV0dXJuXCJjb21wb3NpdGlvbmVuZFwiPT09YXx8IWFlJiZnZShhLGIpPyhhPW5kKCksbWQ9bGQ9a2Q9bnVsbCxpZT0hMSxhKTpudWxsO3N3aXRjaChhKXtjYXNlIFwicGFzdGVcIjpyZXR1cm4gbnVsbDtjYXNlIFwia2V5cHJlc3NcIjppZighKGIuY3RybEtleXx8Yi5hbHRLZXl8fGIubWV0YUtleSl8fGIuY3RybEtleSYmYi5hbHRLZXkpe2lmKGIuY2hhciYmMTxiLmNoYXIubGVuZ3RoKXJldHVybiBiLmNoYXI7aWYoYi53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiLndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gZGUmJlwia29cIiE9PWIubG9jYWxlP251bGw6Yi5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxudmFyIGxlPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLFwiZGF0ZXRpbWUtbG9jYWxcIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIG1lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT1iPyEhbGVbYS50eXBlXTpcInRleHRhcmVhXCI9PT1iPyEwOiExfWZ1bmN0aW9uIG5lKGEsYixjLGQpe0ViKGQpO2I9b2UoYixcIm9uQ2hhbmdlXCIpOzA8Yi5sZW5ndGgmJihjPW5ldyB0ZChcIm9uQ2hhbmdlXCIsXCJjaGFuZ2VcIixudWxsLGMsZCksYS5wdXNoKHtldmVudDpjLGxpc3RlbmVyczpifSkpfXZhciBwZT1udWxsLHFlPW51bGw7ZnVuY3Rpb24gcmUoYSl7c2UoYSwwKX1mdW5jdGlvbiB0ZShhKXt2YXIgYj11ZShhKTtpZihXYShiKSlyZXR1cm4gYX1cbmZ1bmN0aW9uIHZlKGEsYil7aWYoXCJjaGFuZ2VcIj09PWEpcmV0dXJuIGJ9dmFyIHdlPSExO2lmKGZhKXt2YXIgeGU7aWYoZmEpe3ZhciB5ZT1cIm9uaW5wdXRcImluIGRvY3VtZW50O2lmKCF5ZSl7dmFyIHplPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7emUuc2V0QXR0cmlidXRlKFwib25pbnB1dFwiLFwicmV0dXJuO1wiKTt5ZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgemUub25pbnB1dH14ZT15ZX1lbHNlIHhlPSExO3dlPXhlJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpfWZ1bmN0aW9uIEFlKCl7cGUmJihwZS5kZXRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkscWU9cGU9bnVsbCl9ZnVuY3Rpb24gQmUoYSl7aWYoXCJ2YWx1ZVwiPT09YS5wcm9wZXJ0eU5hbWUmJnRlKHFlKSl7dmFyIGI9W107bmUoYixxZSxhLHhiKGEpKTthPXJlO2lmKEtiKWEoYik7ZWxzZXtLYj0hMDt0cnl7R2IoYSxiKX1maW5hbGx5e0tiPSExLE1iKCl9fX19XG5mdW5jdGlvbiBDZShhLGIsYyl7XCJmb2N1c2luXCI9PT1hPyhBZSgpLHBlPWIscWU9YyxwZS5hdHRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkpOlwiZm9jdXNvdXRcIj09PWEmJkFlKCl9ZnVuY3Rpb24gRGUoYSl7aWYoXCJzZWxlY3Rpb25jaGFuZ2VcIj09PWF8fFwia2V5dXBcIj09PWF8fFwia2V5ZG93blwiPT09YSlyZXR1cm4gdGUocWUpfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJjbGlja1wiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gRmUoYSxiKXtpZihcImlucHV0XCI9PT1hfHxcImNoYW5nZVwiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gR2UoYSxiKXtyZXR1cm4gYT09PWImJigwIT09YXx8MS9hPT09MS9iKXx8YSE9PWEmJmIhPT1ifXZhciBIZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpHZSxJZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gSmUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIUllLmNhbGwoYixjW2RdKXx8IUhlKGFbY1tkXV0sYltjW2RdXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gS2UoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gTGUoYSxiKXt2YXIgYz1LZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1LZShjKX19ZnVuY3Rpb24gTWUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9NZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBOZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBPZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxudmFyIFBlPWZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsUWU9bnVsbCxSZT1udWxsLFNlPW51bGwsVGU9ITE7XG5mdW5jdGlvbiBVZShhLGIsYyl7dmFyIGQ9Yy53aW5kb3c9PT1jP2MuZG9jdW1lbnQ6OT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQ7VGV8fG51bGw9PVFlfHxRZSE9PVhhKGQpfHwoZD1RZSxcInNlbGVjdGlvblN0YXJ0XCJpbiBkJiZPZShkKT9kPXtzdGFydDpkLnNlbGVjdGlvblN0YXJ0LGVuZDpkLnNlbGVjdGlvbkVuZH06KGQ9KGQub3duZXJEb2N1bWVudCYmZC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLGQ9e2FuY2hvck5vZGU6ZC5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpkLmFuY2hvck9mZnNldCxmb2N1c05vZGU6ZC5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6ZC5mb2N1c09mZnNldH0pLFNlJiZKZShTZSxkKXx8KFNlPWQsZD1vZShSZSxcIm9uU2VsZWN0XCIpLDA8ZC5sZW5ndGgmJihiPW5ldyB0ZChcIm9uU2VsZWN0XCIsXCJzZWxlY3RcIixudWxsLGIsYyksYS5wdXNoKHtldmVudDpiLGxpc3RlbmVyczpkfSksYi50YXJnZXQ9UWUpKSl9XG5QYyhcImNhbmNlbCBjYW5jZWwgY2xpY2sgY2xpY2sgY2xvc2UgY2xvc2UgY29udGV4dG1lbnUgY29udGV4dE1lbnUgY29weSBjb3B5IGN1dCBjdXQgYXV4Y2xpY2sgYXV4Q2xpY2sgZGJsY2xpY2sgZG91YmxlQ2xpY2sgZHJhZ2VuZCBkcmFnRW5kIGRyYWdzdGFydCBkcmFnU3RhcnQgZHJvcCBkcm9wIGZvY3VzaW4gZm9jdXMgZm9jdXNvdXQgYmx1ciBpbnB1dCBpbnB1dCBpbnZhbGlkIGludmFsaWQga2V5ZG93biBrZXlEb3duIGtleXByZXNzIGtleVByZXNzIGtleXVwIGtleVVwIG1vdXNlZG93biBtb3VzZURvd24gbW91c2V1cCBtb3VzZVVwIHBhc3RlIHBhc3RlIHBhdXNlIHBhdXNlIHBsYXkgcGxheSBwb2ludGVyY2FuY2VsIHBvaW50ZXJDYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlckRvd24gcG9pbnRlcnVwIHBvaW50ZXJVcCByYXRlY2hhbmdlIHJhdGVDaGFuZ2UgcmVzZXQgcmVzZXQgc2Vla2VkIHNlZWtlZCBzdWJtaXQgc3VibWl0IHRvdWNoY2FuY2VsIHRvdWNoQ2FuY2VsIHRvdWNoZW5kIHRvdWNoRW5kIHRvdWNoc3RhcnQgdG91Y2hTdGFydCB2b2x1bWVjaGFuZ2Ugdm9sdW1lQ2hhbmdlXCIuc3BsaXQoXCIgXCIpLFxuMCk7UGMoXCJkcmFnIGRyYWcgZHJhZ2VudGVyIGRyYWdFbnRlciBkcmFnZXhpdCBkcmFnRXhpdCBkcmFnbGVhdmUgZHJhZ0xlYXZlIGRyYWdvdmVyIGRyYWdPdmVyIG1vdXNlbW92ZSBtb3VzZU1vdmUgbW91c2VvdXQgbW91c2VPdXQgbW91c2VvdmVyIG1vdXNlT3ZlciBwb2ludGVybW92ZSBwb2ludGVyTW92ZSBwb2ludGVyb3V0IHBvaW50ZXJPdXQgcG9pbnRlcm92ZXIgcG9pbnRlck92ZXIgc2Nyb2xsIHNjcm9sbCB0b2dnbGUgdG9nZ2xlIHRvdWNobW92ZSB0b3VjaE1vdmUgd2hlZWwgd2hlZWxcIi5zcGxpdChcIiBcIiksMSk7UGMoT2MsMik7Zm9yKHZhciBWZT1cImNoYW5nZSBzZWxlY3Rpb25jaGFuZ2UgdGV4dElucHV0IGNvbXBvc2l0aW9uc3RhcnQgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb251cGRhdGVcIi5zcGxpdChcIiBcIiksV2U9MDtXZTxWZS5sZW5ndGg7V2UrKylOYy5zZXQoVmVbV2VdLDApO2VhKFwib25Nb3VzZUVudGVyXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7XG5lYShcIm9uTW91c2VMZWF2ZVwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2VhKFwib25Qb2ludGVyRW50ZXJcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZWEoXCJvblBvaW50ZXJMZWF2ZVwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtkYShcIm9uQ2hhbmdlXCIsXCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZGEoXCJvblNlbGVjdFwiLFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtkYShcIm9uQmVmb3JlSW5wdXRcIixbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl0pO2RhKFwib25Db21wb3NpdGlvbkVuZFwiLFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO1xuZGEoXCJvbkNvbXBvc2l0aW9uU3RhcnRcIixcImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO2RhKFwib25Db21wb3NpdGlvblVwZGF0ZVwiLFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO3ZhciBYZT1cImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2Ugc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmdcIi5zcGxpdChcIiBcIiksWWU9bmV3IFNldChcImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZVwiLnNwbGl0KFwiIFwiKS5jb25jYXQoWGUpKTtcbmZ1bmN0aW9uIFplKGEsYixjKXt2YXIgZD1hLnR5cGV8fFwidW5rbm93bi1ldmVudFwiO2EuY3VycmVudFRhcmdldD1jO1liKGQsYix2b2lkIDAsYSk7YS5jdXJyZW50VGFyZ2V0PW51bGx9XG5mdW5jdGlvbiBzZShhLGIpe2I9MCE9PShiJjQpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdLGU9ZC5ldmVudDtkPWQubGlzdGVuZXJzO2E6e3ZhciBmPXZvaWQgMDtpZihiKWZvcih2YXIgZz1kLmxlbmd0aC0xOzA8PWc7Zy0tKXt2YXIgaD1kW2ddLGs9aC5pbnN0YW5jZSxsPWguY3VycmVudFRhcmdldDtoPWgubGlzdGVuZXI7aWYoayE9PWYmJmUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBhO1plKGUsaCxsKTtmPWt9ZWxzZSBmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKXtoPWRbZ107az1oLmluc3RhbmNlO2w9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7WmUoZSxoLGwpO2Y9a319fWlmKFViKXRocm93IGE9VmIsVWI9ITEsVmI9bnVsbCxhO31cbmZ1bmN0aW9uIEcoYSxiKXt2YXIgYz0kZShiKSxkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwoYWYoYixhLDIsITEpLGMuYWRkKGQpKX12YXIgYmY9XCJfcmVhY3RMaXN0ZW5pbmdcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBjZihhKXthW2JmXXx8KGFbYmZdPSEwLGJhLmZvckVhY2goZnVuY3Rpb24oYil7WWUuaGFzKGIpfHxkZihiLCExLGEsbnVsbCk7ZGYoYiwhMCxhLG51bGwpfSkpfVxuZnVuY3Rpb24gZGYoYSxiLGMsZCl7dmFyIGU9NDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsZj1jO1wic2VsZWN0aW9uY2hhbmdlXCI9PT1hJiY5IT09Yy5ub2RlVHlwZSYmKGY9Yy5vd25lckRvY3VtZW50KTtpZihudWxsIT09ZCYmIWImJlllLmhhcyhhKSl7aWYoXCJzY3JvbGxcIiE9PWEpcmV0dXJuO2V8PTI7Zj1kfXZhciBnPSRlKGYpLGg9YStcIl9fXCIrKGI/XCJjYXB0dXJlXCI6XCJidWJibGVcIik7Zy5oYXMoaCl8fChiJiYoZXw9NCksYWYoZixhLGUsYiksZy5hZGQoaCkpfVxuZnVuY3Rpb24gYWYoYSxiLGMsZCl7dmFyIGU9TmMuZ2V0KGIpO3N3aXRjaCh2b2lkIDA9PT1lPzI6ZSl7Y2FzZSAwOmU9Z2Q7YnJlYWs7Y2FzZSAxOmU9aWQ7YnJlYWs7ZGVmYXVsdDplPWhkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFQYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBqZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPXdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1OYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9TWMuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLHg9YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6eD1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjp4PVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSBJYzpjYXNlIEpjOmNhc2UgS2M6az1IZDticmVhaztjYXNlIExjOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHc9MCE9PShiJjQpLHo9IXcmJlwic2Nyb2xsXCI9PT1hLHU9dz9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt3PVtdO2Zvcih2YXIgdD1kLHE7bnVsbCE9PVxudDspe3E9dDt2YXIgdj1xLnN0YXRlTm9kZTs1PT09cS50YWcmJm51bGwhPT12JiYocT12LG51bGwhPT11JiYodj1PYih0LHUpLG51bGwhPXYmJncucHVzaChlZih0LHYscSkpKSk7aWYoeilicmVhazt0PXQucmV0dXJufTA8dy5sZW5ndGgmJihoPW5ldyBrKGgseCxudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp3fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmMD09PShiJjE2KSYmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLmZyb21FbGVtZW50KSYmKHdjKHgpfHx4W2ZmXSkpYnJlYWsgYTtpZihrfHxoKXtoPWUud2luZG93PT09ZT9lOihoPWUub3duZXJEb2N1bWVudCk/aC5kZWZhdWx0Vmlld3x8aC5wYXJlbnRXaW5kb3c6d2luZG93O2lmKGspe2lmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLnRvRWxlbWVudCxrPWQseD14P3djKHgpOm51bGwsbnVsbCE9PVxueCYmKHo9WmIoeCkseCE9PXp8fDUhPT14LnRhZyYmNiE9PXgudGFnKSl4PW51bGx9ZWxzZSBrPW51bGwseD1kO2lmKGshPT14KXt3PUJkO3Y9XCJvbk1vdXNlTGVhdmVcIjt1PVwib25Nb3VzZUVudGVyXCI7dD1cIm1vdXNlXCI7aWYoXCJwb2ludGVyb3V0XCI9PT1hfHxcInBvaW50ZXJvdmVyXCI9PT1hKXc9VGQsdj1cIm9uUG9pbnRlckxlYXZlXCIsdT1cIm9uUG9pbnRlckVudGVyXCIsdD1cInBvaW50ZXJcIjt6PW51bGw9PWs/aDp1ZShrKTtxPW51bGw9PXg/aDp1ZSh4KTtoPW5ldyB3KHYsdCtcImxlYXZlXCIsayxjLGUpO2gudGFyZ2V0PXo7aC5yZWxhdGVkVGFyZ2V0PXE7dj1udWxsO3djKGUpPT09ZCYmKHc9bmV3IHcodSx0K1wiZW50ZXJcIix4LGMsZSksdy50YXJnZXQ9cSx3LnJlbGF0ZWRUYXJnZXQ9eix2PXcpO3o9djtpZihrJiZ4KWI6e3c9azt1PXg7dD0wO2ZvcihxPXc7cTtxPWdmKHEpKXQrKztxPTA7Zm9yKHY9dTt2O3Y9Z2YodikpcSsrO2Zvcig7MDx0LXE7KXc9Z2YodyksdC0tO2Zvcig7MDxxLXQ7KXU9XG5nZih1KSxxLS07Zm9yKDt0LS07KXtpZih3PT09dXx8bnVsbCE9PXUmJnc9PT11LmFsdGVybmF0ZSlicmVhayBiO3c9Z2Yodyk7dT1nZih1KX13PW51bGx9ZWxzZSB3PW51bGw7bnVsbCE9PWsmJmhmKGcsaCxrLHcsITEpO251bGwhPT14JiZudWxsIT09eiYmaGYoZyx6LHgsdywhMCl9fX1hOntoPWQ/dWUoZCk6d2luZG93O2s9aC5ub2RlTmFtZSYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKFwic2VsZWN0XCI9PT1rfHxcImlucHV0XCI9PT1rJiZcImZpbGVcIj09PWgudHlwZSl2YXIgSj12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKUo9RmU7ZWxzZXtKPURlO3ZhciBLPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYoSj1FZSk7aWYoSiYmKEo9SihhLGQpKSl7bmUoZyxKLGMsZSk7YnJlYWsgYX1LJiZLKGEsaCxkKTtcImZvY3Vzb3V0XCI9PT1hJiYoSz1oLl93cmFwcGVyU3RhdGUpJiZcbksuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmYmIoaCxcIm51bWJlclwiLGgudmFsdWUpfUs9ZD91ZShkKTp3aW5kb3c7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6aWYobWUoSyl8fFwidHJ1ZVwiPT09Sy5jb250ZW50RWRpdGFibGUpUWU9SyxSZT1kLFNlPW51bGw7YnJlYWs7Y2FzZSBcImZvY3Vzb3V0XCI6U2U9UmU9UWU9bnVsbDticmVhaztjYXNlIFwibW91c2Vkb3duXCI6VGU9ITA7YnJlYWs7Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwiZHJhZ2VuZFwiOlRlPSExO1VlKGcsYyxlKTticmVhaztjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6aWYoUGUpYnJlYWs7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjpVZShnLGMsZSl9dmFyIFE7aWYoYWUpYjp7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbnN0YXJ0XCI6dmFyIEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOkw9XCJvbkNvbXBvc2l0aW9uRW5kXCI7YnJlYWsgYjtcbmNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOkw9XCJvbkNvbXBvc2l0aW9uVXBkYXRlXCI7YnJlYWsgYn1MPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihMPVwib25Db21wb3NpdGlvbkVuZFwiKTpcImtleWRvd25cIj09PWEmJjIyOT09PWMua2V5Q29kZSYmKEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIik7TCYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09TD9cIm9uQ29tcG9zaXRpb25FbmRcIj09PUwmJmllJiYoUT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLEs9b2UoZCxMKSwwPEsubGVuZ3RoJiYoTD1uZXcgTGQoTCxhLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OkwsbGlzdGVuZXJzOkt9KSxRP0wuZGF0YT1ROihRPWhlKGMpLG51bGwhPT1RJiYoTC5kYXRhPVEpKSkpO2lmKFE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksMDxkLmxlbmd0aCYmKGU9bmV3IExkKFwib25CZWZvcmVJbnB1dFwiLFxuXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9USl9c2UoZyxiKX0pfWZ1bmN0aW9uIGVmKGEsYixjKXtyZXR1cm57aW5zdGFuY2U6YSxsaXN0ZW5lcjpiLGN1cnJlbnRUYXJnZXQ6Y319ZnVuY3Rpb24gb2UoYSxiKXtmb3IodmFyIGM9YitcIkNhcHR1cmVcIixkPVtdO251bGwhPT1hOyl7dmFyIGU9YSxmPWUuc3RhdGVOb2RlOzU9PT1lLnRhZyYmbnVsbCE9PWYmJihlPWYsZj1PYihhLGMpLG51bGwhPWYmJmQudW5zaGlmdChlZihhLGYsZSkpLGY9T2IoYSxiKSxudWxsIT1mJiZkLnB1c2goZWYoYSxmLGUpKSk7YT1hLnJldHVybn1yZXR1cm4gZH1mdW5jdGlvbiBnZihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDtkbyBhPWEucmV0dXJuO3doaWxlKGEmJjUhPT1hLnRhZyk7cmV0dXJuIGE/YTpudWxsfVxuZnVuY3Rpb24gaGYoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yi5fcmVhY3ROYW1lLGc9W107bnVsbCE9PWMmJmMhPT1kOyl7dmFyIGg9YyxrPWguYWx0ZXJuYXRlLGw9aC5zdGF0ZU5vZGU7aWYobnVsbCE9PWsmJms9PT1kKWJyZWFrOzU9PT1oLnRhZyYmbnVsbCE9PWwmJihoPWwsZT8oaz1PYihjLGYpLG51bGwhPWsmJmcudW5zaGlmdChlZihjLGssaCkpKTplfHwoaz1PYihjLGYpLG51bGwhPWsmJmcucHVzaChlZihjLGssaCkpKSk7Yz1jLnJldHVybn0wIT09Zy5sZW5ndGgmJmEucHVzaCh7ZXZlbnQ6YixsaXN0ZW5lcnM6Z30pfWZ1bmN0aW9uIGpmKCl7fXZhciBrZj1udWxsLGxmPW51bGw7ZnVuY3Rpb24gbWYoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjpyZXR1cm4hIWIuYXV0b0ZvY3VzfXJldHVybiExfVxuZnVuY3Rpb24gbmYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm9wdGlvblwiPT09YXx8XCJub3NjcmlwdFwiPT09YXx8XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNoaWxkcmVufHxcIm51bWJlclwiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwib2JqZWN0XCI9PT10eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9PWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sfXZhciBvZj1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnZvaWQgMCxwZj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDp2b2lkIDA7ZnVuY3Rpb24gcWYoYSl7MT09PWEubm9kZVR5cGU/YS50ZXh0Q29udGVudD1cIlwiOjk9PT1hLm5vZGVUeXBlJiYoYT1hLmJvZHksbnVsbCE9YSYmKGEudGV4dENvbnRlbnQ9XCJcIikpfVxuZnVuY3Rpb24gcmYoYSl7Zm9yKDtudWxsIT1hO2E9YS5uZXh0U2libGluZyl7dmFyIGI9YS5ub2RlVHlwZTtpZigxPT09Ynx8Mz09PWIpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gc2YoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHRmPTA7ZnVuY3Rpb24gdWYoYSl7cmV0dXJueyQkdHlwZW9mOkdhLHRvU3RyaW5nOmEsdmFsdWVPZjphfX12YXIgdmY9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksd2Y9XCJfX3JlYWN0RmliZXIkXCIrdmYseGY9XCJfX3JlYWN0UHJvcHMkXCIrdmYsZmY9XCJfX3JlYWN0Q29udGFpbmVyJFwiK3ZmLHlmPVwiX19yZWFjdEV2ZW50cyRcIit2ZjtcbmZ1bmN0aW9uIHdjKGEpe3ZhciBiPWFbd2ZdO2lmKGIpcmV0dXJuIGI7Zm9yKHZhciBjPWEucGFyZW50Tm9kZTtjOyl7aWYoYj1jW2ZmXXx8Y1t3Zl0pe2M9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWIuY2hpbGR8fG51bGwhPT1jJiZudWxsIT09Yy5jaGlsZClmb3IoYT1zZihhKTtudWxsIT09YTspe2lmKGM9YVt3Zl0pcmV0dXJuIGM7YT1zZihhKX1yZXR1cm4gYn1hPWM7Yz1hLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQ2IoYSl7YT1hW3dmXXx8YVtmZl07cmV0dXJuIWF8fDUhPT1hLnRhZyYmNiE9PWEudGFnJiYxMyE9PWEudGFnJiYzIT09YS50YWc/bnVsbDphfWZ1bmN0aW9uIHVlKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhLnN0YXRlTm9kZTt0aHJvdyBFcnJvcih5KDMzKSk7fWZ1bmN0aW9uIERiKGEpe3JldHVybiBhW3hmXXx8bnVsbH1cbmZ1bmN0aW9uICRlKGEpe3ZhciBiPWFbeWZdO3ZvaWQgMD09PWImJihiPWFbeWZdPW5ldyBTZXQpO3JldHVybiBifXZhciB6Zj1bXSxBZj0tMTtmdW5jdGlvbiBCZihhKXtyZXR1cm57Y3VycmVudDphfX1mdW5jdGlvbiBIKGEpezA+QWZ8fChhLmN1cnJlbnQ9emZbQWZdLHpmW0FmXT1udWxsLEFmLS0pfWZ1bmN0aW9uIEkoYSxiKXtBZisrO3pmW0FmXT1hLmN1cnJlbnQ7YS5jdXJyZW50PWJ9dmFyIENmPXt9LE09QmYoQ2YpLE49QmYoITEpLERmPUNmO1xuZnVuY3Rpb24gRWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBDZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1mdW5jdGlvbiBGZihhKXthPWEuY2hpbGRDb250ZXh0VHlwZXM7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfWZ1bmN0aW9uIEdmKCl7SChOKTtIKE0pfWZ1bmN0aW9uIEhmKGEsYixjKXtpZihNLmN1cnJlbnQhPT1DZil0aHJvdyBFcnJvcih5KDE2OCkpO0koTSxiKTtJKE4sYyl9XG5mdW5jdGlvbiBJZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7YT1iLmNoaWxkQ29udGV4dFR5cGVzO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBkLmdldENoaWxkQ29udGV4dClyZXR1cm4gYztkPWQuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBlIGluIGQpaWYoIShlIGluIGEpKXRocm93IEVycm9yKHkoMTA4LFJhKGIpfHxcIlVua25vd25cIixlKSk7cmV0dXJuIG0oe30sYyxkKX1mdW5jdGlvbiBKZihhKXthPShhPWEuc3RhdGVOb2RlKSYmYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8Q2Y7RGY9TS5jdXJyZW50O0koTSxhKTtJKE4sTi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBLZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IoeSgxNjkpKTtjPyhhPUlmKGEsYixEZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEgoTiksSChNKSxJKE0sYSkpOkgoTik7SShOLGMpfVxudmFyIExmPW51bGwsTWY9bnVsbCxOZj1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxPZj1yLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssUGY9ci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxRZj1yLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFJmPXIudW5zdGFibGVfcmVxdWVzdFBhaW50LFNmPXIudW5zdGFibGVfbm93LFRmPXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsVWY9ci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxWZj1yLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LFdmPXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksWGY9ci51bnN0YWJsZV9Mb3dQcmlvcml0eSxZZj1yLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxaZj17fSwkZj12b2lkIDAhPT1SZj9SZjpmdW5jdGlvbigpe30sYWc9bnVsbCxiZz1udWxsLGNnPSExLGRnPVNmKCksTz0xRTQ+ZGc/U2Y6ZnVuY3Rpb24oKXtyZXR1cm4gU2YoKS1kZ307XG5mdW5jdGlvbiBlZygpe3N3aXRjaChUZigpKXtjYXNlIFVmOnJldHVybiA5OTtjYXNlIFZmOnJldHVybiA5ODtjYXNlIFdmOnJldHVybiA5NztjYXNlIFhmOnJldHVybiA5NjtjYXNlIFlmOnJldHVybiA5NTtkZWZhdWx0OnRocm93IEVycm9yKHkoMzMyKSk7fX1mdW5jdGlvbiBmZyhhKXtzd2l0Y2goYSl7Y2FzZSA5OTpyZXR1cm4gVWY7Y2FzZSA5ODpyZXR1cm4gVmY7Y2FzZSA5NzpyZXR1cm4gV2Y7Y2FzZSA5NjpyZXR1cm4gWGY7Y2FzZSA5NTpyZXR1cm4gWWY7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDMzMikpO319ZnVuY3Rpb24gZ2coYSxiKXthPWZnKGEpO3JldHVybiBOZihhLGIpfWZ1bmN0aW9uIGhnKGEsYixjKXthPWZnKGEpO3JldHVybiBPZihhLGIsYyl9ZnVuY3Rpb24gaWcoKXtpZihudWxsIT09Ymcpe3ZhciBhPWJnO2JnPW51bGw7UGYoYSl9amcoKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWNnJiZudWxsIT09YWcpe2NnPSEwO3ZhciBhPTA7dHJ5e3ZhciBiPWFnO2dnKDk5LGZ1bmN0aW9uKCl7Zm9yKDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9YlthXTtkbyBjPWMoITApO3doaWxlKG51bGwhPT1jKX19KTthZz1udWxsfWNhdGNoKGMpe3Rocm93IG51bGwhPT1hZyYmKGFnPWFnLnNsaWNlKGErMSkpLE9mKFVmLGlnKSxjO31maW5hbGx5e2NnPSExfX19dmFyIGtnPXJhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIGxnKGEsYil7aWYoYSYmYS5kZWZhdWx0UHJvcHMpe2I9bSh7fSxiKTthPWEuZGVmYXVsdFByb3BzO2Zvcih2YXIgYyBpbiBhKXZvaWQgMD09PWJbY10mJihiW2NdPWFbY10pO3JldHVybiBifXJldHVybiBifXZhciBtZz1CZihudWxsKSxuZz1udWxsLG9nPW51bGwscGc9bnVsbDtmdW5jdGlvbiBxZygpe3BnPW9nPW5nPW51bGx9XG5mdW5jdGlvbiByZyhhKXt2YXIgYj1tZy5jdXJyZW50O0gobWcpO2EudHlwZS5fY29udGV4dC5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gc2coYSxiKXtmb3IoO251bGwhPT1hOyl7dmFyIGM9YS5hbHRlcm5hdGU7aWYoKGEuY2hpbGRMYW5lcyZiKT09PWIpaWYobnVsbD09PWN8fChjLmNoaWxkTGFuZXMmYik9PT1iKWJyZWFrO2Vsc2UgYy5jaGlsZExhbmVzfD1iO2Vsc2UgYS5jaGlsZExhbmVzfD1iLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKTthPWEucmV0dXJufX1mdW5jdGlvbiB0ZyhhLGIpe25nPWE7cGc9b2c9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJih1Zz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiB2ZyhhLGIpe2lmKHBnIT09YSYmITEhPT1iJiYwIT09Yil7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBifHwxMDczNzQxODIzPT09YilwZz1hLGI9MTA3Mzc0MTgyMztiPXtjb250ZXh0OmEsb2JzZXJ2ZWRCaXRzOmIsbmV4dDpudWxsfTtpZihudWxsPT09b2cpe2lmKG51bGw9PT1uZyl0aHJvdyBFcnJvcih5KDMwOCkpO29nPWI7bmcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDpiLHJlc3BvbmRlcnM6bnVsbH19ZWxzZSBvZz1vZy5uZXh0PWJ9cmV0dXJuIGEuX2N1cnJlbnRWYWx1ZX12YXIgd2c9ITE7ZnVuY3Rpb24geGcoYSl7YS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24geWcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmEuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmEubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gemcoYSxiKXtyZXR1cm57ZXZlbnRUaW1lOmEsbGFuZTpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gQWcoYSxiKXthPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWEpe2E9YS5zaGFyZWQ7dmFyIGM9YS5wZW5kaW5nO251bGw9PT1jP2IubmV4dD1iOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKTthLnBlbmRpbmc9Yn19XG5mdW5jdGlvbiBCZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWUsZD1hLmFsdGVybmF0ZTtpZihudWxsIT09ZCYmKGQ9ZC51cGRhdGVRdWV1ZSxjPT09ZCkpe3ZhciBlPW51bGwsZj1udWxsO2M9Yy5maXJzdEJhc2VVcGRhdGU7aWYobnVsbCE9PWMpe2Rve3ZhciBnPXtldmVudFRpbWU6Yy5ldmVudFRpbWUsbGFuZTpjLmxhbmUsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOmMuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Zj9lPWY9ZzpmPWYubmV4dD1nO2M9Yy5uZXh0fXdoaWxlKG51bGwhPT1jKTtudWxsPT09Zj9lPWY9YjpmPWYubmV4dD1ifWVsc2UgZT1mPWI7Yz17YmFzZVN0YXRlOmQuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOmYsc2hhcmVkOmQuc2hhcmVkLGVmZmVjdHM6ZC5lZmZlY3RzfTthLnVwZGF0ZVF1ZXVlPWM7cmV0dXJufWE9Yy5sYXN0QmFzZVVwZGF0ZTtudWxsPT09YT9jLmZpcnN0QmFzZVVwZGF0ZT1iOmEubmV4dD1cbmI7Yy5sYXN0QmFzZVVwZGF0ZT1ifVxuZnVuY3Rpb24gQ2coYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt3Zz0hMTt2YXIgZj1lLmZpcnN0QmFzZVVwZGF0ZSxnPWUubGFzdEJhc2VVcGRhdGUsaD1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1oKXtlLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGs9aCxsPWsubmV4dDtrLm5leHQ9bnVsbDtudWxsPT09Zz9mPWw6Zy5uZXh0PWw7Zz1rO3ZhciBuPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1uKXtuPW4udXBkYXRlUXVldWU7dmFyIEE9bi5sYXN0QmFzZVVwZGF0ZTtBIT09ZyYmKG51bGw9PT1BP24uZmlyc3RCYXNlVXBkYXRlPWw6QS5uZXh0PWwsbi5sYXN0QmFzZVVwZGF0ZT1rKX19aWYobnVsbCE9PWYpe0E9ZS5iYXNlU3RhdGU7Zz0wO249bD1rPW51bGw7ZG97aD1mLmxhbmU7dmFyIHA9Zi5ldmVudFRpbWU7aWYoKGQmaCk9PT1oKXtudWxsIT09biYmKG49bi5uZXh0PXtldmVudFRpbWU6cCxsYW5lOjAsdGFnOmYudGFnLHBheWxvYWQ6Zi5wYXlsb2FkLGNhbGxiYWNrOmYuY2FsbGJhY2ssXG5uZXh0Om51bGx9KTthOnt2YXIgQz1hLHg9ZjtoPWI7cD1jO3N3aXRjaCh4LnRhZyl7Y2FzZSAxOkM9eC5wYXlsb2FkO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBDKXtBPUMuY2FsbChwLEEsaCk7YnJlYWsgYX1BPUM7YnJlYWsgYTtjYXNlIDM6Qy5mbGFncz1DLmZsYWdzJi00MDk3fDY0O2Nhc2UgMDpDPXgucGF5bG9hZDtoPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDP0MuY2FsbChwLEEsaCk6QztpZihudWxsPT09aHx8dm9pZCAwPT09aClicmVhayBhO0E9bSh7fSxBLGgpO2JyZWFrIGE7Y2FzZSAyOndnPSEwfX1udWxsIT09Zi5jYWxsYmFjayYmKGEuZmxhZ3N8PTMyLGg9ZS5lZmZlY3RzLG51bGw9PT1oP2UuZWZmZWN0cz1bZl06aC5wdXNoKGYpKX1lbHNlIHA9e2V2ZW50VGltZTpwLGxhbmU6aCx0YWc6Zi50YWcscGF5bG9hZDpmLnBheWxvYWQsY2FsbGJhY2s6Zi5jYWxsYmFjayxuZXh0Om51bGx9LG51bGw9PT1uPyhsPW49cCxrPUEpOm49bi5uZXh0PXAsZ3w9aDtmPWYubmV4dDtpZihudWxsPT09XG5mKWlmKGg9ZS5zaGFyZWQucGVuZGluZyxudWxsPT09aClicmVhaztlbHNlIGY9aC5uZXh0LGgubmV4dD1udWxsLGUubGFzdEJhc2VVcGRhdGU9aCxlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSk7bnVsbD09PW4mJihrPUEpO2UuYmFzZVN0YXRlPWs7ZS5maXJzdEJhc2VVcGRhdGU9bDtlLmxhc3RCYXNlVXBkYXRlPW47RGd8PWc7YS5sYW5lcz1nO2EubWVtb2l6ZWRTdGF0ZT1BfX1mdW5jdGlvbiBFZyhhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGUpdGhyb3cgRXJyb3IoeSgxOTEsZSkpO2UuY2FsbChkKX19fXZhciBGZz0obmV3IGFhLkNvbXBvbmVudCkucmVmcztcbmZ1bmN0aW9uIEdnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjptKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEubGFuZXMmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBLZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxzKT9aYihhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO0pnKGEsZSxkKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YudGFnPTE7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO0FnKGEsZik7SmcoYSxlLGQpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oYSxiKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBjPUhnKCksZD1JZyhhKSxlPXpnKGMsZCk7ZS50YWc9Mjt2b2lkIDAhPT1iJiZudWxsIT09YiYmKGUuY2FsbGJhY2s9XG5iKTtBZyhhLGUpO0pnKGEsZCxjKX19O2Z1bmN0aW9uIExnKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IUplKGMsZCl8fCFKZShlLGYpOiEwfVxuZnVuY3Rpb24gTWcoYSxiLGMpe3ZhciBkPSExLGU9Q2Y7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9dmcoZik6KGU9RmYoYik/RGY6TS5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/RWYoYSxlKTpDZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPUtnO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbHM9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gTmcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gT2coYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1GZzt4ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXZnKGYpOihmPUZmKGIpP0RmOk0uY3VycmVudCxlLmNvbnRleHQ9RWYoYSxmKSk7Q2coYSxjLGUsZCk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKEdnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fFxuKGI9ZS5zdGF0ZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLENnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZmxhZ3N8PTQpfXZhciBQZz1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gUWcoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHkoMTQ3LGEpKTt2YXIgZT1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZSlyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1kLnJlZnM7Yj09PUZnJiYoYj1kLnJlZnM9e30pO251bGw9PT1hP2RlbGV0ZSBiW2VdOmJbZV09YX07Yi5fc3RyaW5nUmVmPWU7cmV0dXJuIGJ9aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKHkoMjg0KSk7aWYoIWMuX293bmVyKXRocm93IEVycm9yKHkoMjkwLGEpKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiBSZyhhLGIpe2lmKFwidGV4dGFyZWFcIiE9PWEudHlwZSl0aHJvdyBFcnJvcih5KDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhiKS5qb2luKFwiLCBcIikrXCJ9XCI6YikpO31cbmZ1bmN0aW9uIFNnKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmxhc3RFZmZlY3Q7bnVsbCE9PWQ/KGQubmV4dEVmZmVjdD1jLGIubGFzdEVmZmVjdD1jKTpiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1jO2MubmV4dEVmZmVjdD1udWxsO2MuZmxhZ3M9OH19ZnVuY3Rpb24gYyhjLGQpe2lmKCFhKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWQ7KWIoYyxkKSxkPWQuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGEsYil7Zm9yKGE9bmV3IE1hcDtudWxsIT09YjspbnVsbCE9PWIua2V5P2Euc2V0KGIua2V5LGIpOmEuc2V0KGIuaW5kZXgsYiksYj1iLnNpYmxpbmc7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2E9VGcoYSxiKTthLmluZGV4PTA7YS5zaWJsaW5nPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gZihiLGMsZCl7Yi5pbmRleD1kO2lmKCFhKXJldHVybiBjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZmxhZ3M9MixcbmMpOmQ7Yi5mbGFncz0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmbnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5mbGFncz0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9VWcoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXtpZihudWxsIT09YiYmYi5lbGVtZW50VHlwZT09PWMudHlwZSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9UWcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVZnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPVFnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPVxuV2coYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG4oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVhnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gQShhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9VWcoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGM9VmcoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksYy5yZWY9UWcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlIHRhOnJldHVybiBiPVdnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYn1pZihQZyhiKXx8TGEoYikpcmV0dXJuIGI9WGcoYixcbmEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtSZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGMua2V5PT09ZT9jLnR5cGU9PT11YT9uKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsZSk6ayhhLGIsYyxkKTpudWxsO2Nhc2UgdGE6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGx9aWYoUGcoYyl8fExhKGMpKXJldHVybiBudWxsIT09ZT9udWxsOm4oYSxiLGMsZCxudWxsKTtSZyhhLGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIEMoYSxiLGMsZCxlKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1hLmdldChjKXx8XG5udWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsZC50eXBlPT09dWE/bihiLGEsZC5wcm9wcy5jaGlsZHJlbixlLGQua2V5KTprKGIsYSxkLGUpO2Nhc2UgdGE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGwoYixhLGQsZSl9aWYoUGcoZCl8fExhKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLG4oYixhLGQsZSxudWxsKTtSZyhiLGQpfXJldHVybiBudWxsfWZ1bmN0aW9uIHgoZSxnLGgsayl7Zm9yKHZhciBsPW51bGwsdD1udWxsLHU9Zyx6PWc9MCxxPW51bGw7bnVsbCE9PXUmJno8aC5sZW5ndGg7eisrKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciBuPXAoZSx1LGhbel0sayk7aWYobnVsbD09PW4pe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09XG5uLmFsdGVybmF0ZSYmYihlLHUpO2c9ZihuLGcseik7bnVsbD09PXQ/bD1uOnQuc2libGluZz1uO3Q9bjt1PXF9aWYoej09PWgubGVuZ3RoKXJldHVybiBjKGUsdSksbDtpZihudWxsPT09dSl7Zm9yKDt6PGgubGVuZ3RoO3orKyl1PUEoZSxoW3pdLGspLG51bGwhPT11JiYoZz1mKHUsZyx6KSxudWxsPT09dD9sPXU6dC5zaWJsaW5nPXUsdD11KTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7ejxoLmxlbmd0aDt6KyspcT1DKHUsZSx6LGhbel0sayksbnVsbCE9PXEmJihhJiZudWxsIT09cS5hbHRlcm5hdGUmJnUuZGVsZXRlKG51bGw9PT1xLmtleT96OnEua2V5KSxnPWYocSxnLHopLG51bGw9PT10P2w9cTp0LnNpYmxpbmc9cSx0PXEpO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGx9ZnVuY3Rpb24gdyhlLGcsaCxrKXt2YXIgbD1MYShoKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgbCl0aHJvdyBFcnJvcih5KDE1MCkpO2g9bC5jYWxsKGgpO2lmKG51bGw9PVxuaCl0aHJvdyBFcnJvcih5KDE1MSkpO2Zvcih2YXIgdD1sPW51bGwsdT1nLHo9Zz0wLHE9bnVsbCxuPWgubmV4dCgpO251bGwhPT11JiYhbi5kb25lO3orKyxuPWgubmV4dCgpKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciB3PXAoZSx1LG4udmFsdWUsayk7aWYobnVsbD09PXcpe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09dy5hbHRlcm5hdGUmJmIoZSx1KTtnPWYodyxnLHopO251bGw9PT10P2w9dzp0LnNpYmxpbmc9dzt0PXc7dT1xfWlmKG4uZG9uZSlyZXR1cm4gYyhlLHUpLGw7aWYobnVsbD09PXUpe2Zvcig7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUEoZSxuLnZhbHVlLGspLG51bGwhPT1uJiYoZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUModSxlLHosbi52YWx1ZSxrKSxudWxsIT09biYmKGEmJm51bGwhPT1uLmFsdGVybmF0ZSYmXG51LmRlbGV0ZShudWxsPT09bi5rZXk/ejpuLmtleSksZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTthJiZ1LmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO3JldHVybiBsfXJldHVybiBmdW5jdGlvbihhLGQsZixoKXt2YXIgaz1cIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLnR5cGU9PT11YSYmbnVsbD09PWYua2V5O2smJihmPWYucHJvcHMuY2hpbGRyZW4pO3ZhciBsPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY7aWYobClzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSBzYTphOntsPWYua2V5O2ZvcihrPWQ7bnVsbCE9PWs7KXtpZihrLmtleT09PWwpe3N3aXRjaChrLnRhZyl7Y2FzZSA3OmlmKGYudHlwZT09PXVhKXtjKGEsay5zaWJsaW5nKTtkPWUoayxmLnByb3BzLmNoaWxkcmVuKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWJyZWFrO2RlZmF1bHQ6aWYoay5lbGVtZW50VHlwZT09PWYudHlwZSl7YyhhLGsuc2libGluZyk7XG5kPWUoayxmLnByb3BzKTtkLnJlZj1RZyhhLGssZik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX19YyhhLGspO2JyZWFrfWVsc2UgYihhLGspO2s9ay5zaWJsaW5nfWYudHlwZT09PXVhPyhkPVhnKGYucHJvcHMuY2hpbGRyZW4sYS5tb2RlLGgsZi5rZXkpLGQucmV0dXJuPWEsYT1kKTooaD1WZyhmLnR5cGUsZi5rZXksZi5wcm9wcyxudWxsLGEubW9kZSxoKSxoLnJlZj1RZyhhLGQsZiksaC5yZXR1cm49YSxhPWgpfXJldHVybiBnKGEpO2Nhc2UgdGE6YTp7Zm9yKGs9Zi5rZXk7bnVsbCE9PWQ7KXtpZihkLmtleT09PWspaWYoND09PWQudGFnJiZkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09Zi5jb250YWluZXJJbmZvJiZkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWYuaW1wbGVtZW50YXRpb24pe2MoYSxkLnNpYmxpbmcpO2Q9ZShkLGYuY2hpbGRyZW58fFtdKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWVsc2V7YyhhLGQpO2JyZWFrfWVsc2UgYihhLGQpO2Q9ZC5zaWJsaW5nfWQ9XG5XZyhmLGEubW9kZSxoKTtkLnJldHVybj1hO2E9ZH1yZXR1cm4gZyhhKX1pZihcInN0cmluZ1wiPT09dHlwZW9mIGZ8fFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZj1cIlwiK2YsbnVsbCE9PWQmJjY9PT1kLnRhZz8oYyhhLGQuc2libGluZyksZD1lKGQsZiksZC5yZXR1cm49YSxhPWQpOihjKGEsZCksZD1VZyhmLGEubW9kZSxoKSxkLnJldHVybj1hLGE9ZCksZyhhKTtpZihQZyhmKSlyZXR1cm4geChhLGQsZixoKTtpZihMYShmKSlyZXR1cm4gdyhhLGQsZixoKTtsJiZSZyhhLGYpO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmIWspc3dpdGNoKGEudGFnKXtjYXNlIDE6Y2FzZSAyMjpjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnRocm93IEVycm9yKHkoMTUyLFJhKGEudHlwZSl8fFwiQ29tcG9uZW50XCIpKTt9cmV0dXJuIGMoYSxkKX19dmFyIFlnPVNnKCEwKSxaZz1TZyghMSksJGc9e30sYWg9QmYoJGcpLGJoPUJmKCRnKSxjaD1CZigkZyk7XG5mdW5jdGlvbiBkaChhKXtpZihhPT09JGcpdGhyb3cgRXJyb3IoeSgxNzQpKTtyZXR1cm4gYX1mdW5jdGlvbiBlaChhLGIpe0koY2gsYik7SShiaCxhKTtJKGFoLCRnKTthPWIubm9kZVR5cGU7c3dpdGNoKGEpe2Nhc2UgOTpjYXNlIDExOmI9KGI9Yi5kb2N1bWVudEVsZW1lbnQpP2IubmFtZXNwYWNlVVJJOm1iKG51bGwsXCJcIik7YnJlYWs7ZGVmYXVsdDphPTg9PT1hP2IucGFyZW50Tm9kZTpiLGI9YS5uYW1lc3BhY2VVUkl8fG51bGwsYT1hLnRhZ05hbWUsYj1tYihiLGEpfUgoYWgpO0koYWgsYil9ZnVuY3Rpb24gZmgoKXtIKGFoKTtIKGJoKTtIKGNoKX1mdW5jdGlvbiBnaChhKXtkaChjaC5jdXJyZW50KTt2YXIgYj1kaChhaC5jdXJyZW50KTt2YXIgYz1tYihiLGEudHlwZSk7YiE9PWMmJihJKGJoLGEpLEkoYWgsYykpfWZ1bmN0aW9uIGhoKGEpe2JoLmN1cnJlbnQ9PT1hJiYoSChhaCksSChiaCkpfXZhciBQPUJmKDApO1xuZnVuY3Rpb24gaWgoYSl7Zm9yKHZhciBiPWE7bnVsbCE9PWI7KXtpZigxMz09PWIudGFnKXt2YXIgYz1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsPT09Y3x8XCIkP1wiPT09Yy5kYXRhfHxcIiQhXCI9PT1jLmRhdGEpKXJldHVybiBifWVsc2UgaWYoMTk9PT1iLnRhZyYmdm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKXtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH12YXIgamg9bnVsbCxraD1udWxsLGxoPSExO1xuZnVuY3Rpb24gbWgoYSxiKXt2YXIgYz1uaCg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2MudHlwZT1cIkRFTEVURURcIjtjLnN0YXRlTm9kZT1iO2MucmV0dXJuPWE7Yy5mbGFncz04O251bGwhPT1hLmxhc3RFZmZlY3Q/KGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWMsYS5sYXN0RWZmZWN0PWMpOmEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PWN9ZnVuY3Rpb24gb2goYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgNjpyZXR1cm4gYj1cIlwiPT09YS5wZW5kaW5nUHJvcHN8fDMhPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHBoKGEpe2lmKGxoKXt2YXIgYj1raDtpZihiKXt2YXIgYz1iO2lmKCFvaChhLGIpKXtiPXJmKGMubmV4dFNpYmxpbmcpO2lmKCFifHwhb2goYSxiKSl7YS5mbGFncz1hLmZsYWdzJi0xMDI1fDI7bGg9ITE7amg9YTtyZXR1cm59bWgoamgsYyl9amg9YTtraD1yZihiLmZpcnN0Q2hpbGQpfWVsc2UgYS5mbGFncz1hLmZsYWdzJi0xMDI1fDIsbGg9ITEsamg9YX19ZnVuY3Rpb24gcWgoYSl7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWEmJjUhPT1hLnRhZyYmMyE9PWEudGFnJiYxMyE9PWEudGFnOylhPWEucmV0dXJuO2poPWF9XG5mdW5jdGlvbiByaChhKXtpZihhIT09amgpcmV0dXJuITE7aWYoIWxoKXJldHVybiBxaChhKSxsaD0hMCwhMTt2YXIgYj1hLnR5cGU7aWYoNSE9PWEudGFnfHxcImhlYWRcIiE9PWImJlwiYm9keVwiIT09YiYmIW5mKGIsYS5tZW1vaXplZFByb3BzKSlmb3IoYj1raDtiOyltaChhLGIpLGI9cmYoYi5uZXh0U2libGluZyk7cWgoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcih5KDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXtraD1yZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfWtoPW51bGx9fWVsc2Uga2g9amg/cmYoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9XG5mdW5jdGlvbiBzaCgpe2toPWpoPW51bGw7bGg9ITF9dmFyIHRoPVtdO2Z1bmN0aW9uIHVoKCl7Zm9yKHZhciBhPTA7YTx0aC5sZW5ndGg7YSsrKXRoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7dGgubGVuZ3RoPTB9dmFyIHZoPXJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsd2g9cmEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcseGg9MCxSPW51bGwsUz1udWxsLFQ9bnVsbCx5aD0hMSx6aD0hMTtmdW5jdGlvbiBBaCgpe3Rocm93IEVycm9yKHkoMzIxKSk7fWZ1bmN0aW9uIEJoKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoIUhlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBDaChhLGIsYyxkLGUsZil7eGg9ZjtSPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IubGFuZXM9MDt2aC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP0RoOkVoO2E9YyhkLGUpO2lmKHpoKXtmPTA7ZG97emg9ITE7aWYoISgyNT5mKSl0aHJvdyBFcnJvcih5KDMwMSkpO2YrPTE7VD1TPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO3ZoLmN1cnJlbnQ9Rmg7YT1jKGQsZSl9d2hpbGUoemgpfXZoLmN1cnJlbnQ9R2g7Yj1udWxsIT09UyYmbnVsbCE9PVMubmV4dDt4aD0wO1Q9Uz1SPW51bGw7eWg9ITE7aWYoYil0aHJvdyBFcnJvcih5KDMwMCkpO3JldHVybiBhfWZ1bmN0aW9uIEhoKCl7dmFyIGE9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlPVQ9YTpUPVQubmV4dD1hO3JldHVybiBUfVxuZnVuY3Rpb24gSWgoKXtpZihudWxsPT09Uyl7dmFyIGE9Ui5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Uy5uZXh0O3ZhciBiPW51bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZTpULm5leHQ7aWYobnVsbCE9PWIpVD1iLFM9YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHkoMzEwKSk7Uz1hO2E9e21lbW9pemVkU3RhdGU6Uy5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpTLmJhc2VTdGF0ZSxiYXNlUXVldWU6Uy5iYXNlUXVldWUscXVldWU6Uy5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZT1UPWE6VD1ULm5leHQ9YX1yZXR1cm4gVH1mdW5jdGlvbiBKaChhLGIpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yn1cbmZ1bmN0aW9uIEtoKGEpe3ZhciBiPUloKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHkoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9UyxlPWQuYmFzZVF1ZXVlLGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXtpZihudWxsIT09ZSl7dmFyIGc9ZS5uZXh0O2UubmV4dD1mLm5leHQ7Zi5uZXh0PWd9ZC5iYXNlUXVldWU9ZT1mO2MucGVuZGluZz1udWxsfWlmKG51bGwhPT1lKXtlPWUubmV4dDtkPWQuYmFzZVN0YXRlO3ZhciBoPWc9Zj1udWxsLGs9ZTtkb3t2YXIgbD1rLmxhbmU7aWYoKHhoJmwpPT09bCludWxsIT09aCYmKGg9aC5uZXh0PXtsYW5lOjAsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixlYWdlclN0YXRlOmsuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxkPWsuZWFnZXJSZWR1Y2VyPT09YT9rLmVhZ2VyU3RhdGU6YShkLGsuYWN0aW9uKTtlbHNle3ZhciBuPXtsYW5lOmwsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixcbmVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH07bnVsbD09PWg/KGc9aD1uLGY9ZCk6aD1oLm5leHQ9bjtSLmxhbmVzfD1sO0RnfD1sfWs9ay5uZXh0fXdoaWxlKG51bGwhPT1rJiZrIT09ZSk7bnVsbD09PWg/Zj1kOmgubmV4dD1nO0hlKGQsYi5tZW1vaXplZFN0YXRlKXx8KHVnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZDtiLmJhc2VTdGF0ZT1mO2IuYmFzZVF1ZXVlPWg7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1kfXJldHVybltiLm1lbW9pemVkU3RhdGUsYy5kaXNwYXRjaF19XG5mdW5jdGlvbiBMaChhKXt2YXIgYj1JaCgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcih5KDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPWMuZGlzcGF0Y2gsZT1jLnBlbmRpbmcsZj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWUpe2MucGVuZGluZz1udWxsO3ZhciBnPWU9ZS5uZXh0O2RvIGY9YShmLGcuYWN0aW9uKSxnPWcubmV4dDt3aGlsZShnIT09ZSk7SGUoZixiLm1lbW9pemVkU3RhdGUpfHwodWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1mO251bGw9PT1iLmJhc2VRdWV1ZSYmKGIuYmFzZVN0YXRlPWYpO2MubGFzdFJlbmRlcmVkU3RhdGU9Zn1yZXR1cm5bZixkXX1cbmZ1bmN0aW9uIE1oKGEsYixjKXt2YXIgZD1iLl9nZXRWZXJzaW9uO2Q9ZChiLl9zb3VyY2UpO3ZhciBlPWIuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7aWYobnVsbCE9PWUpYT1lPT09ZDtlbHNlIGlmKGE9YS5tdXRhYmxlUmVhZExhbmVzLGE9KHhoJmEpPT09YSliLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PWQsdGgucHVzaChiKTtpZihhKXJldHVybiBjKGIuX3NvdXJjZSk7dGgucHVzaChiKTt0aHJvdyBFcnJvcih5KDM1MCkpO31cbmZ1bmN0aW9uIE5oKGEsYixjLGQpe3ZhciBlPVU7aWYobnVsbD09PWUpdGhyb3cgRXJyb3IoeSgzNDkpKTt2YXIgZj1iLl9nZXRWZXJzaW9uLGc9ZihiLl9zb3VyY2UpLGg9dmguY3VycmVudCxrPWgudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gTWgoZSxiLGMpfSksbD1rWzFdLG49a1swXTtrPVQ7dmFyIEE9YS5tZW1vaXplZFN0YXRlLHA9QS5yZWZzLEM9cC5nZXRTbmFwc2hvdCx4PUEuc291cmNlO0E9QS5zdWJzY3JpYmU7dmFyIHc9UjthLm1lbW9pemVkU3RhdGU9e3JlZnM6cCxzb3VyY2U6YixzdWJzY3JpYmU6ZH07aC51c2VFZmZlY3QoZnVuY3Rpb24oKXtwLmdldFNuYXBzaG90PWM7cC5zZXRTbmFwc2hvdD1sO3ZhciBhPWYoYi5fc291cmNlKTtpZighSGUoZyxhKSl7YT1jKGIuX3NvdXJjZSk7SGUobixhKXx8KGwoYSksYT1JZyh3KSxlLm11dGFibGVSZWFkTGFuZXN8PWEmZS5wZW5kaW5nTGFuZXMpO2E9ZS5tdXRhYmxlUmVhZExhbmVzO2UuZW50YW5nbGVkTGFuZXN8PWE7Zm9yKHZhciBkPVxuZS5lbnRhbmdsZW1lbnRzLGg9YTswPGg7KXt2YXIgaz0zMS1WYyhoKSx2PTE8PGs7ZFtrXXw9YTtoJj1+dn19fSxbYyxiLGRdKTtoLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBkKGIuX3NvdXJjZSxmdW5jdGlvbigpe3ZhciBhPXAuZ2V0U25hcHNob3QsYz1wLnNldFNuYXBzaG90O3RyeXtjKGEoYi5fc291cmNlKSk7dmFyIGQ9SWcodyk7ZS5tdXRhYmxlUmVhZExhbmVzfD1kJmUucGVuZGluZ0xhbmVzfWNhdGNoKHEpe2MoZnVuY3Rpb24oKXt0aHJvdyBxO30pfX0pfSxbYixkXSk7SGUoQyxjKSYmSGUoeCxiKSYmSGUoQSxkKXx8KGE9e3BlbmRpbmc6bnVsbCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6SmgsbGFzdFJlbmRlcmVkU3RhdGU6bn0sYS5kaXNwYXRjaD1sPU9oLmJpbmQobnVsbCxSLGEpLGsucXVldWU9YSxrLmJhc2VRdWV1ZT1udWxsLG49TWgoZSxiLGMpLGsubWVtb2l6ZWRTdGF0ZT1rLmJhc2VTdGF0ZT1uKTtyZXR1cm4gbn1cbmZ1bmN0aW9uIFBoKGEsYixjKXt2YXIgZD1JaCgpO3JldHVybiBOaChkLGEsYixjKX1mdW5jdGlvbiBRaChhKXt2YXIgYj1IaCgpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiYoYT1hKCkpO2IubWVtb2l6ZWRTdGF0ZT1iLmJhc2VTdGF0ZT1hO2E9Yi5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpKaCxsYXN0UmVuZGVyZWRTdGF0ZTphfTthPWEuZGlzcGF0Y2g9T2guYmluZChudWxsLFIsYSk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxhXX1cbmZ1bmN0aW9uIFJoKGEsYixjLGQpe2E9e3RhZzphLGNyZWF0ZTpiLGRlc3Ryb3k6YyxkZXBzOmQsbmV4dDpudWxsfTtiPVIudXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbH0sUi51cGRhdGVRdWV1ZT1iLGIubGFzdEVmZmVjdD1hLm5leHQ9YSk6KGM9Yi5sYXN0RWZmZWN0LG51bGw9PT1jP2IubGFzdEVmZmVjdD1hLm5leHQ9YTooZD1jLm5leHQsYy5uZXh0PWEsYS5uZXh0PWQsYi5sYXN0RWZmZWN0PWEpKTtyZXR1cm4gYX1mdW5jdGlvbiBTaChhKXt2YXIgYj1IaCgpO2E9e2N1cnJlbnQ6YX07cmV0dXJuIGIubWVtb2l6ZWRTdGF0ZT1hfWZ1bmN0aW9uIFRoKCl7cmV0dXJuIEloKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiBVaChhLGIsYyxkKXt2YXIgZT1IaCgpO1IuZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPVJoKDF8YixjLHZvaWQgMCx2b2lkIDA9PT1kP251bGw6ZCl9XG5mdW5jdGlvbiBWaChhLGIsYyxkKXt2YXIgZT1JaCgpO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGY9dm9pZCAwO2lmKG51bGwhPT1TKXt2YXIgZz1TLm1lbW9pemVkU3RhdGU7Zj1nLmRlc3Ryb3k7aWYobnVsbCE9PWQmJkJoKGQsZy5kZXBzKSl7UmgoYixjLGYsZCk7cmV0dXJufX1SLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1SaCgxfGIsYyxmLGQpfWZ1bmN0aW9uIFdoKGEsYil7cmV0dXJuIFVoKDUxNiw0LGEsYil9ZnVuY3Rpb24gWGgoYSxiKXtyZXR1cm4gVmgoNTE2LDQsYSxiKX1mdW5jdGlvbiBZaChhLGIpe3JldHVybiBWaCg0LDIsYSxiKX1mdW5jdGlvbiBaaChhLGIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBhPWEoKSxiKGEpLGZ1bmN0aW9uKCl7YihudWxsKX07aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpcmV0dXJuIGE9YSgpLGIuY3VycmVudD1hLGZ1bmN0aW9uKCl7Yi5jdXJyZW50PW51bGx9fVxuZnVuY3Rpb24gJGgoYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBWaCg0LDIsWmguYmluZChudWxsLGIsYSksYyl9ZnVuY3Rpb24gYWkoKXt9ZnVuY3Rpb24gYmkoYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9ZnVuY3Rpb24gY2koYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTthPWEoKTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9XG5mdW5jdGlvbiBkaShhLGIpe3ZhciBjPWVnKCk7Z2coOTg+Yz85ODpjLGZ1bmN0aW9uKCl7YSghMCl9KTtnZyg5NzxjPzk3OmMsZnVuY3Rpb24oKXt2YXIgYz13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7YSghMSksYigpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1jfX0pfVxuZnVuY3Rpb24gT2goYSxiLGMpe3ZhciBkPUhnKCksZT1JZyhhKSxmPXtsYW5lOmUsYWN0aW9uOmMsZWFnZXJSZWR1Y2VyOm51bGwsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH0sZz1iLnBlbmRpbmc7bnVsbD09PWc/Zi5uZXh0PWY6KGYubmV4dD1nLm5leHQsZy5uZXh0PWYpO2IucGVuZGluZz1mO2c9YS5hbHRlcm5hdGU7aWYoYT09PVJ8fG51bGwhPT1nJiZnPT09Uil6aD15aD0hMDtlbHNle2lmKDA9PT1hLmxhbmVzJiYobnVsbD09PWd8fDA9PT1nLmxhbmVzKSYmKGc9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1nKSl0cnl7dmFyIGg9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxrPWcoaCxjKTtmLmVhZ2VyUmVkdWNlcj1nO2YuZWFnZXJTdGF0ZT1rO2lmKEhlKGssaCkpcmV0dXJufWNhdGNoKGwpe31maW5hbGx5e31KZyhhLGUsZCl9fVxudmFyIEdoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpBaCx1c2VDb250ZXh0OkFoLHVzZUVmZmVjdDpBaCx1c2VJbXBlcmF0aXZlSGFuZGxlOkFoLHVzZUxheW91dEVmZmVjdDpBaCx1c2VNZW1vOkFoLHVzZVJlZHVjZXI6QWgsdXNlUmVmOkFoLHVzZVN0YXRlOkFoLHVzZURlYnVnVmFsdWU6QWgsdXNlRGVmZXJyZWRWYWx1ZTpBaCx1c2VUcmFuc2l0aW9uOkFoLHVzZU11dGFibGVTb3VyY2U6QWgsdXNlT3BhcXVlSWRlbnRpZmllcjpBaCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LERoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpe0hoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OldoLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBVaCg0LDIsWmguYmluZChudWxsLFxuYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFVoKDQsMixhLGIpfSx1c2VNZW1vOmZ1bmN0aW9uKGEsYil7dmFyIGM9SGgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX0sdXNlUmVkdWNlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9SGgoKTtiPXZvaWQgMCE9PWM/YyhiKTpiO2QubWVtb2l6ZWRTdGF0ZT1kLmJhc2VTdGF0ZT1iO2E9ZC5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjphLGxhc3RSZW5kZXJlZFN0YXRlOmJ9O2E9YS5kaXNwYXRjaD1PaC5iaW5kKG51bGwsUixhKTtyZXR1cm5bZC5tZW1vaXplZFN0YXRlLGFdfSx1c2VSZWY6U2gsdXNlU3RhdGU6UWgsdXNlRGVidWdWYWx1ZTphaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVFoKGEpLGM9YlswXSxkPWJbMV07V2goZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO1xud2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPVFoKCExKSxiPWFbMF07YT1kaS5iaW5kKG51bGwsYVsxXSk7U2goYSk7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUhoKCk7ZC5tZW1vaXplZFN0YXRlPXtyZWZzOntnZXRTbmFwc2hvdDpiLHNldFNuYXBzaG90Om51bGx9LHNvdXJjZTphLHN1YnNjcmliZTpjfTtyZXR1cm4gTmgoZCxhLGIsYyl9LHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtpZihsaCl7dmFyIGE9ITEsYj11ZihmdW5jdGlvbigpe2F8fChhPSEwLGMoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpKTt0aHJvdyBFcnJvcih5KDM1NSkpO30pLGM9UWgoYilbMV07MD09PShSLm1vZGUmMikmJihSLmZsYWdzfD01MTYsUmgoNSxmdW5jdGlvbigpe2MoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpfSxcbnZvaWQgMCxudWxsKSk7cmV0dXJuIGJ9Yj1cInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KTtRaChiKTtyZXR1cm4gYn0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxFaD17cmVhZENvbnRleHQ6dmcsdXNlQ2FsbGJhY2s6YmksdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6WGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTokaCx1c2VMYXlvdXRFZmZlY3Q6WWgsdXNlTWVtbzpjaSx1c2VSZWR1Y2VyOktoLHVzZVJlZjpUaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBLaChKaCl9LHVzZURlYnVnVmFsdWU6YWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1LaChKaCksYz1iWzBdLGQ9YlsxXTtYaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPUtoKEpoKVswXTtyZXR1cm5bVGgoKS5jdXJyZW50LFxuYV19LHVzZU11dGFibGVTb3VyY2U6UGgsdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe3JldHVybiBLaChKaClbMF19LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sRmg9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOmJpLHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OlhoLHVzZUltcGVyYXRpdmVIYW5kbGU6JGgsdXNlTGF5b3V0RWZmZWN0OlloLHVzZU1lbW86Y2ksdXNlUmVkdWNlcjpMaCx1c2VSZWY6VGgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpfSx1c2VEZWJ1Z1ZhbHVlOmFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9TGgoSmgpLGM9YlswXSxkPWJbMV07WGgoZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7ZChhKX1maW5hbGx5e3doLnRyYW5zaXRpb249Yn19LFthXSk7cmV0dXJuIGN9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1MaChKaClbMF07cmV0dXJuW1RoKCkuY3VycmVudCxcbmFdfSx1c2VNdXRhYmxlU291cmNlOlBoLHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpWzBdfSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGVpPXJhLlJlYWN0Q3VycmVudE93bmVyLHVnPSExO2Z1bmN0aW9uIGZpKGEsYixjLGQpe2IuY2hpbGQ9bnVsbD09PWE/WmcoYixudWxsLGMsZCk6WWcoYixhLmNoaWxkLGMsZCl9ZnVuY3Rpb24gZ2koYSxiLGMsZCxlKXtjPWMucmVuZGVyO3ZhciBmPWIucmVmO3RnKGIsZSk7ZD1DaChhLGIsYyxkLGYsZSk7aWYobnVsbCE9PWEmJiF1ZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS01MTcsYS5sYW5lcyY9fmUsaGkoYSxiLGUpO2IuZmxhZ3N8PTE7ZmkoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBpaShhLGIsYyxkLGUsZil7aWYobnVsbD09PWEpe3ZhciBnPWMudHlwZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmIWppKGcpJiZ2b2lkIDA9PT1nLmRlZmF1bHRQcm9wcyYmbnVsbD09PWMuY29tcGFyZSYmdm9pZCAwPT09Yy5kZWZhdWx0UHJvcHMpcmV0dXJuIGIudGFnPTE1LGIudHlwZT1nLGtpKGEsYixnLGQsZSxmKTthPVZnKGMudHlwZSxudWxsLGQsYixiLm1vZGUsZik7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfWc9YS5jaGlsZDtpZigwPT09KGUmZikmJihlPWcubWVtb2l6ZWRQcm9wcyxjPWMuY29tcGFyZSxjPW51bGwhPT1jP2M6SmUsYyhlLGQpJiZhLnJlZj09PWIucmVmKSlyZXR1cm4gaGkoYSxiLGYpO2IuZmxhZ3N8PTE7YT1UZyhnLGQpO2EucmVmPWIucmVmO2EucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9YX1cbmZ1bmN0aW9uIGtpKGEsYixjLGQsZSxmKXtpZihudWxsIT09YSYmSmUoYS5tZW1vaXplZFByb3BzLGQpJiZhLnJlZj09PWIucmVmKWlmKHVnPSExLDAhPT0oZiZlKSkwIT09KGEuZmxhZ3MmMTYzODQpJiYodWc9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxoaShhLGIsZik7cmV0dXJuIGxpKGEsYixjLGQsZil9XG5mdW5jdGlvbiBtaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZXx8XCJ1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZ1wiPT09ZC5tb2RlKWlmKDA9PT0oYi5tb2RlJjQpKWIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjB9LG5pKGIsYyk7ZWxzZSBpZigwIT09KGMmMTA3Mzc0MTgyNCkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MH0sbmkoYixudWxsIT09Zj9mLmJhc2VMYW5lczpjKTtlbHNlIHJldHVybiBhPW51bGwhPT1mP2YuYmFzZUxhbmVzfGM6YyxiLmxhbmVzPWIuY2hpbGRMYW5lcz0xMDczNzQxODI0LGIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmF9LG5pKGIsYSksbnVsbDtlbHNlIG51bGwhPT1mPyhkPWYuYmFzZUxhbmVzfGMsYi5tZW1vaXplZFN0YXRlPW51bGwpOmQ9YyxuaShiLGQpO2ZpKGEsYixlLGMpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gb2koYSxiKXt2YXIgYz1iLnJlZjtpZihudWxsPT09YSYmbnVsbCE9PWN8fG51bGwhPT1hJiZhLnJlZiE9PWMpYi5mbGFnc3w9MTI4fWZ1bmN0aW9uIGxpKGEsYixjLGQsZSl7dmFyIGY9RmYoYyk/RGY6TS5jdXJyZW50O2Y9RWYoYixmKTt0ZyhiLGUpO2M9Q2goYSxiLGMsZCxmLGUpO2lmKG51bGwhPT1hJiYhdWcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmZsYWdzJj0tNTE3LGEubGFuZXMmPX5lLGhpKGEsYixlKTtiLmZsYWdzfD0xO2ZpKGEsYixjLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gcGkoYSxiLGMsZCxlKXtpZihGZihjKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO3RnKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKW51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpLE1nKGIsYyxkKSxPZyhiLGMsZCxlKSxkPSEwO2Vsc2UgaWYobnVsbD09PWEpe3ZhciBnPWIuc3RhdGVOb2RlLGg9Yi5tZW1vaXplZFByb3BzO2cucHJvcHM9aDt2YXIgaz1nLmNvbnRleHQsbD1jLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgbCYmbnVsbCE9PWw/bD12ZyhsKToobD1GZihjKT9EZjpNLmN1cnJlbnQsbD1FZihiLGwpKTt2YXIgbj1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxBPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBufHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtBfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXG5cImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PWR8fGshPT1sKSYmTmcoYixnLGQsbCk7d2c9ITE7dmFyIHA9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cDtDZyhiLGQsZyxlKTtrPWIubWVtb2l6ZWRTdGF0ZTtoIT09ZHx8cCE9PWt8fE4uY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuJiYoR2coYixjLG4sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXdnfHxMZyhiLGMsaCxkLHAsayxsKSk/KEF8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTt5ZyhhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmxnKGIudHlwZSxoKTtnLnByb3BzPWw7QT1iLnBlbmRpbmdQcm9wcztwPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPXZnKGspOihrPUZmKGMpP0RmOk0uY3VycmVudCxrPUVmKGIsaykpO3ZhciBDPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDfHxcblwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09QXx8cCE9PWspJiZOZyhiLGcsZCxrKTt3Zz0hMTtwPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXA7Q2coYixkLGcsZSk7dmFyIHg9Yi5tZW1vaXplZFN0YXRlO2ghPT1BfHxwIT09eHx8Ti5jdXJyZW50fHx3Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIEMmJihHZyhiLGMsQyxkKSx4PWIubWVtb2l6ZWRTdGF0ZSksKGw9d2d8fExnKGIsYyxsLGQscCx4LGspKT8obnx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGV8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiZnLmNvbXBvbmVudFdpbGxVcGRhdGUoZCxcbngsayksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoZCx4LGspKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUmJihiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSYmKGIuZmxhZ3N8PTI1NikpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksYi5tZW1vaXplZFByb3BzPWQsYi5tZW1vaXplZFN0YXRlPXgpLGcucHJvcHM9ZCxnLnN0YXRlPXgsZy5jb250ZXh0PWssZD1sKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxcbmg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksZD0hMSl9cmV0dXJuIHFpKGEsYixjLGQsZixlKX1cbmZ1bmN0aW9uIHFpKGEsYixjLGQsZSxmKXtvaShhLGIpO3ZhciBnPTAhPT0oYi5mbGFncyY2NCk7aWYoIWQmJiFnKXJldHVybiBlJiZLZihiLGMsITEpLGhpKGEsYixmKTtkPWIuc3RhdGVOb2RlO2VpLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9WWcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1ZZyhiLG51bGwsaCxmKSk6ZmkoYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmS2YoYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiByaShhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0P0hmKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJkhmKGEsYi5jb250ZXh0LCExKTtlaChhLGIuY29udGFpbmVySW5mbyl9XG52YXIgc2k9e2RlaHlkcmF0ZWQ6bnVsbCxyZXRyeUxhbmU6MH07XG5mdW5jdGlvbiB0aShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1QLmN1cnJlbnQsZj0hMSxnOyhnPTAhPT0oYi5mbGFncyY2NCkpfHwoZz1udWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZT8hMTowIT09KGUmMikpO2c/KGY9ITAsYi5mbGFncyY9LTY1KTpudWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZXx8dm9pZCAwPT09ZC5mYWxsYmFja3x8ITA9PT1kLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwoZXw9MSk7SShQLGUmMSk7aWYobnVsbD09PWEpe3ZvaWQgMCE9PWQuZmFsbGJhY2smJnBoKGIpO2E9ZC5jaGlsZHJlbjtlPWQuZmFsbGJhY2s7aWYoZilyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxiLm1lbW9pemVkU3RhdGU9c2ksYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQudW5zdGFibGVfZXhwZWN0ZWRMb2FkVGltZSlyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxcbmIubWVtb2l6ZWRTdGF0ZT1zaSxiLmxhbmVzPTMzNTU0NDMyLGE7Yz12aSh7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjphfSxiLm1vZGUsYyxudWxsKTtjLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWN9aWYobnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSl7aWYoZilyZXR1cm4gZD13aShhLGIsZC5jaGlsZHJlbixkLmZhbGxiYWNrLGMpLGY9Yi5jaGlsZCxlPWEuY2hpbGQubWVtb2l6ZWRTdGF0ZSxmLm1lbW9pemVkU3RhdGU9bnVsbD09PWU/e2Jhc2VMYW5lczpjfTp7YmFzZUxhbmVzOmUuYmFzZUxhbmVzfGN9LGYuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmMsYi5tZW1vaXplZFN0YXRlPXNpLGQ7Yz14aShhLGIsZC5jaGlsZHJlbixjKTtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gY31pZihmKXJldHVybiBkPXdpKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLGYubWVtb2l6ZWRTdGF0ZT1udWxsPT09ZT97YmFzZUxhbmVzOmN9Olxue2Jhc2VMYW5lczplLmJhc2VMYW5lc3xjfSxmLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzJn5jLGIubWVtb2l6ZWRTdGF0ZT1zaSxkO2M9eGkoYSxiLGQuY2hpbGRyZW4sYyk7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGN9ZnVuY3Rpb24gdWkoYSxiLGMsZCl7dmFyIGU9YS5tb2RlLGY9YS5jaGlsZDtiPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46Yn07MD09PShlJjIpJiZudWxsIT09Zj8oZi5jaGlsZExhbmVzPTAsZi5wZW5kaW5nUHJvcHM9Yik6Zj12aShiLGUsMCxudWxsKTtjPVhnKGMsZSxkLG51bGwpO2YucmV0dXJuPWE7Yy5yZXR1cm49YTtmLnNpYmxpbmc9YzthLmNoaWxkPWY7cmV0dXJuIGN9XG5mdW5jdGlvbiB4aShhLGIsYyxkKXt2YXIgZT1hLmNoaWxkO2E9ZS5zaWJsaW5nO2M9VGcoZSx7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpjfSk7MD09PShiLm1vZGUmMikmJihjLmxhbmVzPWQpO2MucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGw7bnVsbCE9PWEmJihhLm5leHRFZmZlY3Q9bnVsbCxhLmZsYWdzPTgsYi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9YSk7cmV0dXJuIGIuY2hpbGQ9Y31cbmZ1bmN0aW9uIHdpKGEsYixjLGQsZSl7dmFyIGY9Yi5tb2RlLGc9YS5jaGlsZDthPWcuc2libGluZzt2YXIgaD17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmN9OzA9PT0oZiYyKSYmYi5jaGlsZCE9PWc/KGM9Yi5jaGlsZCxjLmNoaWxkTGFuZXM9MCxjLnBlbmRpbmdQcm9wcz1oLGc9Yy5sYXN0RWZmZWN0LG51bGwhPT1nPyhiLmZpcnN0RWZmZWN0PWMuZmlyc3RFZmZlY3QsYi5sYXN0RWZmZWN0PWcsZy5uZXh0RWZmZWN0PW51bGwpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PW51bGwpOmM9VGcoZyxoKTtudWxsIT09YT9kPVRnKGEsZCk6KGQ9WGcoZCxmLGUsbnVsbCksZC5mbGFnc3w9Mik7ZC5yZXR1cm49YjtjLnJldHVybj1iO2Muc2libGluZz1kO2IuY2hpbGQ9YztyZXR1cm4gZH1mdW5jdGlvbiB5aShhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtzZyhhLnJldHVybixiKX1cbmZ1bmN0aW9uIHppKGEsYixjLGQsZSxmKXt2YXIgZz1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWc/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZSxsYXN0RWZmZWN0OmZ9OihnLmlzQmFja3dhcmRzPWIsZy5yZW5kZXJpbmc9bnVsbCxnLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGcubGFzdD1kLGcudGFpbD1jLGcudGFpbE1vZGU9ZSxnLmxhc3RFZmZlY3Q9Zil9XG5mdW5jdGlvbiBBaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLnJldmVhbE9yZGVyLGY9ZC50YWlsO2ZpKGEsYixkLmNoaWxkcmVuLGMpO2Q9UC5jdXJyZW50O2lmKDAhPT0oZCYyKSlkPWQmMXwyLGIuZmxhZ3N8PTY0O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyY2NCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZ5aShhLGMpO2Vsc2UgaWYoMTk9PT1hLnRhZyl5aShhLGMpO2Vsc2UgaWYobnVsbCE9PWEuY2hpbGQpe2EuY2hpbGQucmV0dXJuPWE7YT1hLmNoaWxkO2NvbnRpbnVlfWlmKGE9PT1iKWJyZWFrIGE7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxhLnJldHVybj09PWIpYnJlYWsgYTthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47YT1hLnNpYmxpbmd9ZCY9MX1JKFAsZCk7aWYoMD09PShiLm1vZGUmMikpYi5tZW1vaXplZFN0YXRlPVxubnVsbDtlbHNlIHN3aXRjaChlKXtjYXNlIFwiZm9yd2FyZHNcIjpjPWIuY2hpbGQ7Zm9yKGU9bnVsbDtudWxsIT09YzspYT1jLmFsdGVybmF0ZSxudWxsIT09YSYmbnVsbD09PWloKGEpJiYoZT1jKSxjPWMuc2libGluZztjPWU7bnVsbD09PWM/KGU9Yi5jaGlsZCxiLmNoaWxkPW51bGwpOihlPWMuc2libGluZyxjLnNpYmxpbmc9bnVsbCk7emkoYiwhMSxlLGMsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09aWgoYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfXppKGIsITAsYyxudWxsLGYsYi5sYXN0RWZmZWN0KTticmVhaztjYXNlIFwidG9nZXRoZXJcIjp6aShiLCExLG51bGwsbnVsbCx2b2lkIDAsYi5sYXN0RWZmZWN0KTticmVhaztkZWZhdWx0OmIubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gaGkoYSxiLGMpe251bGwhPT1hJiYoYi5kZXBlbmRlbmNpZXM9YS5kZXBlbmRlbmNpZXMpO0RnfD1iLmxhbmVzO2lmKDAhPT0oYyZiLmNoaWxkTGFuZXMpKXtpZihudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQpdGhyb3cgRXJyb3IoeSgxNTMpKTtpZihudWxsIT09Yi5jaGlsZCl7YT1iLmNoaWxkO2M9VGcoYSxhLnBlbmRpbmdQcm9wcyk7Yi5jaGlsZD1jO2ZvcihjLnJldHVybj1iO251bGwhPT1hLnNpYmxpbmc7KWE9YS5zaWJsaW5nLGM9Yy5zaWJsaW5nPVRnKGEsYS5wZW5kaW5nUHJvcHMpLGMucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGx9cmV0dXJuIGIuY2hpbGR9cmV0dXJuIG51bGx9dmFyIEJpLENpLERpLEVpO1xuQmk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O0NpPWZ1bmN0aW9uKCl7fTtcbkRpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtkaChhaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVlhKGEsZSk7ZD1ZYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZWIoYSxlKTtkPWViKGEsZCk7Zj1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6ZT1tKHt9LGUse3ZhbHVlOnZvaWQgMH0pO2Q9bSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtmPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmU9Z2IoYSxlKTtkPWdiKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfXZiKGMsZCk7dmFyIGc7Yz1udWxsO2ZvcihsIGluIGUpaWYoIWQuaGFzT3duUHJvcGVydHkobCkmJmUuaGFzT3duUHJvcGVydHkobCkmJm51bGwhPWVbbF0paWYoXCJzdHlsZVwiPT09XG5sKXt2YXIgaD1lW2xdO2ZvcihnIGluIGgpaC5oYXNPd25Qcm9wZXJ0eShnKSYmKGN8fChjPXt9KSxjW2ddPVwiXCIpfWVsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1sJiZcImNoaWxkcmVuXCIhPT1sJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJlwiYXV0b0ZvY3VzXCIhPT1sJiYoY2EuaGFzT3duUHJvcGVydHkobCk/Znx8KGY9W10pOihmPWZ8fFtdKS5wdXNoKGwsbnVsbCkpO2ZvcihsIGluIGQpe3ZhciBrPWRbbF07aD1udWxsIT1lP2VbbF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkobCkmJmshPT1oJiYobnVsbCE9a3x8bnVsbCE9aCkpaWYoXCJzdHlsZVwiPT09bClpZihoKXtmb3IoZyBpbiBoKSFoLmhhc093blByb3BlcnR5KGcpfHxrJiZrLmhhc093blByb3BlcnR5KGcpfHwoY3x8KGM9e30pLGNbZ109XCJcIik7Zm9yKGcgaW4gaylrLmhhc093blByb3BlcnR5KGcpJiZoW2ddIT09a1tnXSYmKGN8fFxuKGM9e30pLGNbZ109a1tnXSl9ZWxzZSBjfHwoZnx8KGY9W10pLGYucHVzaChsLGMpKSxjPWs7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWw/KGs9az9rLl9faHRtbDp2b2lkIDAsaD1oP2guX19odG1sOnZvaWQgMCxudWxsIT1rJiZoIT09ayYmKGY9Znx8W10pLnB1c2gobCxrKSk6XCJjaGlsZHJlblwiPT09bD9cInN0cmluZ1wiIT09dHlwZW9mIGsmJlwibnVtYmVyXCIhPT10eXBlb2Yga3x8KGY9Znx8W10pLnB1c2gobCxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmKGNhLmhhc093blByb3BlcnR5KGwpPyhudWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1sJiZHKFwic2Nyb2xsXCIsYSksZnx8aD09PWt8fChmPVtdKSk6XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09ayYmay4kJHR5cGVvZj09PUdhP2sudG9TdHJpbmcoKTooZj1mfHxbXSkucHVzaChsLGspKX1jJiYoZj1mfHxbXSkucHVzaChcInN0eWxlXCIsXG5jKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07RWk9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07ZnVuY3Rpb24gRmkoYSxiKXtpZighbGgpc3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIEdpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcztzd2l0Y2goYi50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBudWxsO2Nhc2UgMTpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2Q9Yi5zdGF0ZU5vZGU7ZC5wZW5kaW5nQ29udGV4dCYmKGQuY29udGV4dD1kLnBlbmRpbmdDb250ZXh0LGQucGVuZGluZ0NvbnRleHQ9bnVsbCk7aWYobnVsbD09PWF8fG51bGw9PT1hLmNoaWxkKXJoKGIpP2IuZmxhZ3N8PTQ6ZC5oeWRyYXRlfHwoYi5mbGFnc3w9MjU2KTtDaShiKTtyZXR1cm4gbnVsbDtjYXNlIDU6aGgoYik7dmFyIGU9ZGgoY2guY3VycmVudCk7Yz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKURpKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTEyOCk7ZWxzZXtpZighZCl7aWYobnVsbD09PVxuYi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtyZXR1cm4gbnVsbH1hPWRoKGFoLmN1cnJlbnQpO2lmKHJoKGIpKXtkPWIuc3RhdGVOb2RlO2M9Yi50eXBlO3ZhciBmPWIubWVtb2l6ZWRQcm9wcztkW3dmXT1iO2RbeGZdPWY7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsZCk7RyhcImNsb3NlXCIsZCk7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihhPTA7YTxYZS5sZW5ndGg7YSsrKUcoWGVbYV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkcoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGQpO0coXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpHKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WmEoZCxmKTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9XG57d2FzTXVsdGlwbGU6ISFmLm11bHRpcGxlfTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGQsZiksRyhcImludmFsaWRcIixkKX12YihjLGYpO2E9bnVsbDtmb3IodmFyIGcgaW4gZilmLmhhc093blByb3BlcnR5KGcpJiYoZT1mW2ddLFwiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBlP2QudGV4dENvbnRlbnQhPT1lJiYoYT1bXCJjaGlsZHJlblwiLGVdKTpcIm51bWJlclwiPT09dHlwZW9mIGUmJmQudGV4dENvbnRlbnQhPT1cIlwiK2UmJihhPVtcImNoaWxkcmVuXCIsXCJcIitlXSk6Y2EuaGFzT3duUHJvcGVydHkoZykmJm51bGwhPWUmJlwib25TY3JvbGxcIj09PWcmJkcoXCJzY3JvbGxcIixkKSk7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGQpO2NiKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoZCk7amIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJihkLm9uY2xpY2s9XG5qZil9ZD1hO2IudXBkYXRlUXVldWU9ZDtudWxsIT09ZCYmKGIuZmxhZ3N8PTQpfWVsc2V7Zz05PT09ZS5ub2RlVHlwZT9lOmUub3duZXJEb2N1bWVudDthPT09a2IuaHRtbCYmKGE9bGIoYykpO2E9PT1rYi5odG1sP1wic2NyaXB0XCI9PT1jPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVt3Zl09YjthW3hmXT1kO0JpKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTtnPXdiKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsYSk7RyhcImNsb3NlXCIsYSk7XG5lPWQ7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGEpO2U9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8WGUubGVuZ3RoO2UrKylHKFhlW2VdLGEpO2U9ZDticmVhaztjYXNlIFwic291cmNlXCI6RyhcImVycm9yXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGEpO0coXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RyhcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpaYShhLGQpO2U9WWEoYSxkKTtHKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWViKGEsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPW0oe30sZCx7dmFsdWU6dm9pZCAwfSk7RyhcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGQpO2U9XG5nYihhLGQpO0coXCJpbnZhbGlkXCIsYSk7YnJlYWs7ZGVmYXVsdDplPWR9dmIoYyxlKTt2YXIgaD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3RiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZvYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09Y3x8XCJcIiE9PWspJiZwYihhLGspOlwibnVtYmVyXCI9PT10eXBlb2YgayYmcGIoYSxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1mJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09ZiYmXCJhdXRvRm9jdXNcIiE9PWYmJihjYS5oYXNPd25Qcm9wZXJ0eShmKT9udWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1mJiZHKFwic2Nyb2xsXCIsYSk6bnVsbCE9ayYmcWEoYSxmLGssZykpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpWYShhKTtjYihhLGQsITEpO1xuYnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoYSk7amIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1NhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZmIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmZiKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfW1mKGMsZCkmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD0xMjgpfXJldHVybiBudWxsO2Nhc2UgNjppZihhJiZudWxsIT1iLnN0YXRlTm9kZSlFaShhLGIsYS5tZW1vaXplZFByb3BzLGQpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBkJiZudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtcbmM9ZGgoY2guY3VycmVudCk7ZGgoYWguY3VycmVudCk7cmgoYik/KGQ9Yi5zdGF0ZU5vZGUsYz1iLm1lbW9pemVkUHJvcHMsZFt3Zl09YixkLm5vZGVWYWx1ZSE9PWMmJihiLmZsYWdzfD00KSk6KGQ9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxkW3dmXT1iLGIuc3RhdGVOb2RlPWQpfXJldHVybiBudWxsO2Nhc2UgMTM6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBiLmxhbmVzPWMsYjtkPW51bGwhPT1kO2M9ITE7bnVsbD09PWE/dm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLmZhbGxiYWNrJiZyaChiKTpjPW51bGwhPT1hLm1lbW9pemVkU3RhdGU7aWYoZCYmIWMmJjAhPT0oYi5tb2RlJjIpKWlmKG51bGw9PT1hJiYhMCE9PWIubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFja3x8MCE9PShQLmN1cnJlbnQmMSkpMD09PVYmJihWPTMpO2Vsc2V7aWYoMD09PVZ8fDM9PT1WKVY9XG40O251bGw9PT1VfHwwPT09KERnJjEzNDIxNzcyNykmJjA9PT0oSGkmMTM0MjE3NzI3KXx8SWkoVSxXKX1pZihkfHxjKWIuZmxhZ3N8PTQ7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiBmaCgpLENpKGIpLG51bGw9PT1hJiZjZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHJnKGIpLG51bGw7Y2FzZSAxNzpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMTk6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtmPTAhPT0oYi5mbGFncyY2NCk7Zz1kLnJlbmRlcmluZztpZihudWxsPT09ZylpZihmKUZpKGQsITEpO2Vsc2V7aWYoMCE9PVZ8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmNjQpKWZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtnPWloKGEpO2lmKG51bGwhPT1nKXtiLmZsYWdzfD02NDtGaShkLCExKTtmPWcudXBkYXRlUXVldWU7bnVsbCE9PWYmJihiLnVwZGF0ZVF1ZXVlPWYsYi5mbGFnc3w9NCk7XG5udWxsPT09ZC5sYXN0RWZmZWN0JiYoYi5maXJzdEVmZmVjdD1udWxsKTtiLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0O2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTIsZi5uZXh0RWZmZWN0PW51bGwsZi5maXJzdEVmZmVjdD1udWxsLGYubGFzdEVmZmVjdD1udWxsLGc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPW51bGwsZi5tZW1vaXplZFByb3BzPW51bGwsZi5tZW1vaXplZFN0YXRlPW51bGwsZi51cGRhdGVRdWV1ZT1udWxsLGYuZGVwZW5kZW5jaWVzPW51bGwsZi5zdGF0ZU5vZGU9bnVsbCk6KGYuY2hpbGRMYW5lcz1nLmNoaWxkTGFuZXMsZi5sYW5lcz1nLmxhbmVzLGYuY2hpbGQ9Zy5jaGlsZCxmLm1lbW9pemVkUHJvcHM9Zy5tZW1vaXplZFByb3BzLGYubWVtb2l6ZWRTdGF0ZT1nLm1lbW9pemVkU3RhdGUsZi51cGRhdGVRdWV1ZT1nLnVwZGF0ZVF1ZXVlLGYudHlwZT1nLnR5cGUsYT1nLmRlcGVuZGVuY2llcyxcbmYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7SShQLFAuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9YS5zaWJsaW5nfW51bGwhPT1kLnRhaWwmJk8oKT5KaSYmKGIuZmxhZ3N8PTY0LGY9ITAsRmkoZCwhMSksYi5sYW5lcz0zMzU1NDQzMil9ZWxzZXtpZighZilpZihhPWloKGcpLG51bGwhPT1hKXtpZihiLmZsYWdzfD02NCxmPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxGaShkLCEwKSxudWxsPT09ZC50YWlsJiZcImhpZGRlblwiPT09ZC50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhbGgpcmV0dXJuIGI9Yi5sYXN0RWZmZWN0PWQubGFzdEVmZmVjdCxudWxsIT09YiYmKGIubmV4dEVmZmVjdD1udWxsKSxudWxsfWVsc2UgMipPKCktZC5yZW5kZXJpbmdTdGFydFRpbWU+SmkmJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9XG42NCxmPSEwLEZpKGQsITEpLGIubGFuZXM9MzM1NTQ0MzIpO2QuaXNCYWNrd2FyZHM/KGcuc2libGluZz1iLmNoaWxkLGIuY2hpbGQ9Zyk6KGM9ZC5sYXN0LG51bGwhPT1jP2Muc2libGluZz1nOmIuY2hpbGQ9ZyxkLmxhc3Q9Zyl9cmV0dXJuIG51bGwhPT1kLnRhaWw/KGM9ZC50YWlsLGQucmVuZGVyaW5nPWMsZC50YWlsPWMuc2libGluZyxkLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0LGQucmVuZGVyaW5nU3RhcnRUaW1lPU8oKSxjLnNpYmxpbmc9bnVsbCxiPVAuY3VycmVudCxJKFAsZj9iJjF8MjpiJjEpLGMpOm51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBLaSgpLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09KG51bGwhPT1iLm1lbW9pemVkU3RhdGUpJiZcInVuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nXCIhPT1kLm1vZGUmJihiLmZsYWdzfD00KSxudWxsfXRocm93IEVycm9yKHkoMTU2LGIudGFnKSk7fVxuZnVuY3Rpb24gTGkoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDE6RmYoYS50eXBlKSYmR2YoKTt2YXIgYj1hLmZsYWdzO3JldHVybiBiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2I9YS5mbGFncztpZigwIT09KGImNjQpKXRocm93IEVycm9yKHkoMjg1KSk7YS5mbGFncz1iJi00MDk3fDY0O3JldHVybiBhO2Nhc2UgNTpyZXR1cm4gaGgoYSksbnVsbDtjYXNlIDEzOnJldHVybiBIKFApLGI9YS5mbGFncyxiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEgoUCksbnVsbDtjYXNlIDQ6cmV0dXJuIGZoKCksbnVsbDtjYXNlIDEwOnJldHVybiByZyhhKSxudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gS2koKSxudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24gTWkoYSxiKXt0cnl7dmFyIGM9XCJcIixkPWI7ZG8gYys9UWEoZCksZD1kLnJldHVybjt3aGlsZShkKTt2YXIgZT1jfWNhdGNoKGYpe2U9XCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIitmLm1lc3NhZ2UrXCJcXG5cIitmLnN0YWNrfXJldHVybnt2YWx1ZTphLHNvdXJjZTpiLHN0YWNrOmV9fWZ1bmN0aW9uIE5pKGEsYil7dHJ5e2NvbnNvbGUuZXJyb3IoYi52YWx1ZSl9Y2F0Y2goYyl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGM7fSl9fXZhciBPaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha01hcD9XZWFrTWFwOk1hcDtmdW5jdGlvbiBQaShhLGIsYyl7Yz16ZygtMSxjKTtjLnRhZz0zO2MucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgZD1iLnZhbHVlO2MuY2FsbGJhY2s9ZnVuY3Rpb24oKXtRaXx8KFFpPSEwLFJpPWQpO05pKGEsYil9O3JldHVybiBjfVxuZnVuY3Rpb24gU2koYSxiLGMpe2M9emcoLTEsYyk7Yy50YWc9Mzt2YXIgZD1hLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZT1iLnZhbHVlO2MucGF5bG9hZD1mdW5jdGlvbigpe05pKGEsYik7cmV0dXJuIGQoZSl9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCIhPT10eXBlb2YgZCYmKG51bGw9PT1UaT9UaT1uZXcgU2V0KFt0aGlzXSk6VGkuYWRkKHRoaXMpLE5pKGEsYikpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfXZhciBVaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha1NldD9XZWFrU2V0OlNldDtcbmZ1bmN0aW9uIFZpKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXRyeXtiKG51bGwpfWNhdGNoKGMpe1dpKGEsYyl9ZWxzZSBiLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBYaShhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOnJldHVybjtjYXNlIDE6aWYoYi5mbGFncyYyNTYmJm51bGwhPT1hKXt2YXIgYz1hLm1lbW9pemVkUHJvcHMsZD1hLm1lbW9pemVkU3RhdGU7YT1iLnN0YXRlTm9kZTtiPWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoYi5lbGVtZW50VHlwZT09PWIudHlwZT9jOmxnKGIudHlwZSxjKSxkKTthLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPWJ9cmV0dXJuO2Nhc2UgMzpiLmZsYWdzJjI1NiYmcWYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7cmV0dXJuO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fVxuZnVuY3Rpb24gWWkoYSxiLGMpe3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOmI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve2lmKDM9PT0oYS50YWcmMykpe3ZhciBkPWEuY3JlYXRlO2EuZGVzdHJveT1kKCl9YT1hLm5leHR9d2hpbGUoYSE9PWIpfWI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve3ZhciBlPWE7ZD1lLm5leHQ7ZT1lLnRhZzswIT09KGUmNCkmJjAhPT0oZSYxKSYmKFppKGMsYSksJGkoYyxhKSk7YT1kfXdoaWxlKGEhPT1iKX1yZXR1cm47Y2FzZSAxOmE9Yy5zdGF0ZU5vZGU7Yy5mbGFncyY0JiYobnVsbD09PWI/YS5jb21wb25lbnREaWRNb3VudCgpOihkPWMuZWxlbWVudFR5cGU9PT1jLnR5cGU/Yi5tZW1vaXplZFByb3BzOmxnKGMudHlwZSxiLm1lbW9pemVkUHJvcHMpLGEuY29tcG9uZW50RGlkVXBkYXRlKGQsXG5iLm1lbW9pemVkU3RhdGUsYS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSkpKTtiPWMudXBkYXRlUXVldWU7bnVsbCE9PWImJkVnKGMsYixhKTtyZXR1cm47Y2FzZSAzOmI9Yy51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YT1udWxsO2lmKG51bGwhPT1jLmNoaWxkKXN3aXRjaChjLmNoaWxkLnRhZyl7Y2FzZSA1OmE9Yy5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmE9Yy5jaGlsZC5zdGF0ZU5vZGV9RWcoYyxiLGEpfXJldHVybjtjYXNlIDU6YT1jLnN0YXRlTm9kZTtudWxsPT09YiYmYy5mbGFncyY0JiZtZihjLnR5cGUsYy5tZW1vaXplZFByb3BzKSYmYS5mb2N1cygpO3JldHVybjtjYXNlIDY6cmV0dXJuO2Nhc2UgNDpyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsPT09Yy5tZW1vaXplZFN0YXRlJiYoYz1jLmFsdGVybmF0ZSxudWxsIT09YyYmKGM9Yy5tZW1vaXplZFN0YXRlLG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbCE9PWMmJkNjKGMpKSkpO1xucmV0dXJuO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIwOmNhc2UgMjE6Y2FzZSAyMzpjYXNlIDI0OnJldHVybn10aHJvdyBFcnJvcih5KDE2MykpO31cbmZ1bmN0aW9uIGFqKGEsYil7Zm9yKHZhciBjPWE7Oyl7aWYoNT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihiKWQ9ZC5zdHlsZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5zZXRQcm9wZXJ0eT9kLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwibm9uZVwiLFwiaW1wb3J0YW50XCIpOmQuZGlzcGxheT1cIm5vbmVcIjtlbHNle2Q9Yy5zdGF0ZU5vZGU7dmFyIGU9Yy5tZW1vaXplZFByb3BzLnN0eWxlO2U9dm9pZCAwIT09ZSYmbnVsbCE9PWUmJmUuaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5XCIpP2UuZGlzcGxheTpudWxsO2Quc3R5bGUuZGlzcGxheT1zYihcImRpc3BsYXlcIixlKX19ZWxzZSBpZig2PT09Yy50YWcpYy5zdGF0ZU5vZGUubm9kZVZhbHVlPWI/XCJcIjpjLm1lbW9pemVkUHJvcHM7ZWxzZSBpZigoMjMhPT1jLnRhZyYmMjQhPT1jLnRhZ3x8bnVsbD09PWMubWVtb2l6ZWRTdGF0ZXx8Yz09PWEpJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PVxuYSlicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YSlyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGJqKGEsYil7aWYoTWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBNZi5vbkNvbW1pdEZpYmVyVW5tb3VudCl0cnl7TWYub25Db21taXRGaWJlclVubW91bnQoTGYsYil9Y2F0Y2goZil7fXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMjI6YT1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1hJiYoYT1hLmxhc3RFZmZlY3QsbnVsbCE9PWEpKXt2YXIgYz1hPWEubmV4dDtkb3t2YXIgZD1jLGU9ZC5kZXN0cm95O2Q9ZC50YWc7aWYodm9pZCAwIT09ZSlpZigwIT09KGQmNCkpWmkoYixjKTtlbHNle2Q9Yjt0cnl7ZSgpfWNhdGNoKGYpe1dpKGQsZil9fWM9Yy5uZXh0fXdoaWxlKGMhPT1hKX1icmVhaztjYXNlIDE6VmkoYik7YT1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7YS5wcm9wcz1iLm1lbW9pemVkUHJvcHMsYS5zdGF0ZT1iLm1lbW9pemVkU3RhdGUsYS5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGYpe1dpKGIsXG5mKX1icmVhaztjYXNlIDU6VmkoYik7YnJlYWs7Y2FzZSA0OmNqKGEsYil9fWZ1bmN0aW9uIGRqKGEpe2EuYWx0ZXJuYXRlPW51bGw7YS5jaGlsZD1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5maXJzdEVmZmVjdD1udWxsO2EubGFzdEVmZmVjdD1udWxsO2EubWVtb2l6ZWRQcm9wcz1udWxsO2EubWVtb2l6ZWRTdGF0ZT1udWxsO2EucGVuZGluZ1Byb3BzPW51bGw7YS5yZXR1cm49bnVsbDthLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gZWooYSl7cmV0dXJuIDU9PT1hLnRhZ3x8Mz09PWEudGFnfHw0PT09YS50YWd9XG5mdW5jdGlvbiBmaihhKXthOntmb3IodmFyIGI9YS5yZXR1cm47bnVsbCE9PWI7KXtpZihlaihiKSlicmVhayBhO2I9Yi5yZXR1cm59dGhyb3cgRXJyb3IoeSgxNjApKTt9dmFyIGM9YjtiPWMuc3RhdGVOb2RlO3N3aXRjaChjLnRhZyl7Y2FzZSA1OnZhciBkPSExO2JyZWFrO2Nhc2UgMzpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2Nhc2UgNDpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgxNjEpKTt9Yy5mbGFncyYxNiYmKHBiKGIsXCJcIiksYy5mbGFncyY9LTE3KTthOmI6Zm9yKGM9YTs7KXtmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGVqKGMucmV0dXJuKSl7Yz1udWxsO2JyZWFrIGF9Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2ZvcihjPWMuc2libGluZzs1IT09Yy50YWcmJjYhPT1jLnRhZyYmMTghPT1jLnRhZzspe2lmKGMuZmxhZ3MmMiljb250aW51ZSBiO2lmKG51bGw9PT1cbmMuY2hpbGR8fDQ9PT1jLnRhZyljb250aW51ZSBiO2Vsc2UgYy5jaGlsZC5yZXR1cm49YyxjPWMuY2hpbGR9aWYoIShjLmZsYWdzJjIpKXtjPWMuc3RhdGVOb2RlO2JyZWFrIGF9fWQ/Z2ooYSxjLGIpOmhqKGEsYyxiKX1cbmZ1bmN0aW9uIGdqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiPzg9PT1jLm5vZGVUeXBlP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKTpjLmluc2VydEJlZm9yZShhLGIpOig4PT09Yy5ub2RlVHlwZT8oYj1jLnBhcmVudE5vZGUsYi5pbnNlcnRCZWZvcmUoYSxjKSk6KGI9YyxiLmFwcGVuZENoaWxkKGEpKSxjPWMuX3JlYWN0Um9vdENvbnRhaW5lcixudWxsIT09YyYmdm9pZCAwIT09Y3x8bnVsbCE9PWIub25jbGlja3x8KGIub25jbGljaz1qZikpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihnaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KWdqKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIGhqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiP2MuaW5zZXJ0QmVmb3JlKGEsYik6Yy5hcHBlbmRDaGlsZChhKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoaGooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOyloaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBjaihhLGIpe2Zvcih2YXIgYz1iLGQ9ITEsZSxmOzspe2lmKCFkKXtkPWMucmV0dXJuO2E6Zm9yKDs7KXtpZihudWxsPT09ZCl0aHJvdyBFcnJvcih5KDE2MCkpO2U9ZC5zdGF0ZU5vZGU7c3dpdGNoKGQudGFnKXtjYXNlIDU6Zj0hMTticmVhayBhO2Nhc2UgMzplPWUuY29udGFpbmVySW5mbztmPSEwO2JyZWFrIGE7Y2FzZSA0OmU9ZS5jb250YWluZXJJbmZvO2Y9ITA7YnJlYWsgYX1kPWQucmV0dXJufWQ9ITB9aWYoNT09PWMudGFnfHw2PT09Yy50YWcpe2E6Zm9yKHZhciBnPWEsaD1jLGs9aDs7KWlmKGJqKGcsayksbnVsbCE9PWsuY2hpbGQmJjQhPT1rLnRhZylrLmNoaWxkLnJldHVybj1rLGs9ay5jaGlsZDtlbHNle2lmKGs9PT1oKWJyZWFrIGE7Zm9yKDtudWxsPT09ay5zaWJsaW5nOyl7aWYobnVsbD09PWsucmV0dXJufHxrLnJldHVybj09PWgpYnJlYWsgYTtrPWsucmV0dXJufWsuc2libGluZy5yZXR1cm49ay5yZXR1cm47az1rLnNpYmxpbmd9Zj8oZz1lLGg9Yy5zdGF0ZU5vZGUsXG44PT09Zy5ub2RlVHlwZT9nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCk6Zy5yZW1vdmVDaGlsZChoKSk6ZS5yZW1vdmVDaGlsZChjLnN0YXRlTm9kZSl9ZWxzZSBpZig0PT09Yy50YWcpe2lmKG51bGwhPT1jLmNoaWxkKXtlPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Zj0hMDtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX19ZWxzZSBpZihiaihhLGMpLG51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybjs0PT09Yy50YWcmJihkPSExKX1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGlqKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjp2YXIgYz1iLnVwZGF0ZVF1ZXVlO2M9bnVsbCE9PWM/Yy5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWMpe3ZhciBkPWM9Yy5uZXh0O2RvIDM9PT0oZC50YWcmMykmJihhPWQuZGVzdHJveSxkLmRlc3Ryb3k9dm9pZCAwLHZvaWQgMCE9PWEmJmEoKSksZD1kLm5leHQ7d2hpbGUoZCE9PWMpfXJldHVybjtjYXNlIDE6cmV0dXJuO2Nhc2UgNTpjPWIuc3RhdGVOb2RlO2lmKG51bGwhPWMpe2Q9Yi5tZW1vaXplZFByb3BzO3ZhciBlPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpkO2E9Yi50eXBlO3ZhciBmPWIudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKG51bGwhPT1mKXtjW3hmXT1kO1wiaW5wdXRcIj09PWEmJlwicmFkaW9cIj09PWQudHlwZSYmbnVsbCE9ZC5uYW1lJiYkYShjLGQpO3diKGEsZSk7Yj13YihhLGQpO2ZvcihlPTA7ZTxmLmxlbmd0aDtlKz1cbjIpe3ZhciBnPWZbZV0saD1mW2UrMV07XCJzdHlsZVwiPT09Zz90YihjLGgpOlwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWc/b2IoYyxoKTpcImNoaWxkcmVuXCI9PT1nP3BiKGMsaCk6cWEoYyxnLGgsYil9c3dpdGNoKGEpe2Nhc2UgXCJpbnB1dFwiOmFiKGMsZCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYyxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YT1jLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUsYy5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhZC5tdWx0aXBsZSxmPWQudmFsdWUsbnVsbCE9Zj9mYihjLCEhZC5tdWx0aXBsZSxmLCExKTphIT09ISFkLm11bHRpcGxlJiYobnVsbCE9ZC5kZWZhdWx0VmFsdWU/ZmIoYywhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApOmZiKGMsISFkLm11bHRpcGxlLGQubXVsdGlwbGU/W106XCJcIiwhMSkpfX19cmV0dXJuO2Nhc2UgNjppZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjIpKTtiLnN0YXRlTm9kZS5ub2RlVmFsdWU9XG5iLm1lbW9pemVkUHJvcHM7cmV0dXJuO2Nhc2UgMzpjPWIuc3RhdGVOb2RlO2MuaHlkcmF0ZSYmKGMuaHlkcmF0ZT0hMSxDYyhjLmNvbnRhaW5lckluZm8pKTtyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsIT09Yi5tZW1vaXplZFN0YXRlJiYoamo9TygpLGFqKGIuY2hpbGQsITApKTtraihiKTtyZXR1cm47Y2FzZSAxOTpraihiKTtyZXR1cm47Y2FzZSAxNzpyZXR1cm47Y2FzZSAyMzpjYXNlIDI0OmFqKGIsbnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSk7cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fWZ1bmN0aW9uIGtqKGEpe3ZhciBiPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWIpe2EudXBkYXRlUXVldWU9bnVsbDt2YXIgYz1hLnN0YXRlTm9kZTtudWxsPT09YyYmKGM9YS5zdGF0ZU5vZGU9bmV3IFVpKTtiLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9bGouYmluZChudWxsLGEsYik7Yy5oYXMoYil8fChjLmFkZChiKSxiLnRoZW4oZCxkKSl9KX19XG5mdW5jdGlvbiBtaihhLGIpe3JldHVybiBudWxsIT09YSYmKGE9YS5tZW1vaXplZFN0YXRlLG51bGw9PT1hfHxudWxsIT09YS5kZWh5ZHJhdGVkKT8oYj1iLm1lbW9pemVkU3RhdGUsbnVsbCE9PWImJm51bGw9PT1iLmRlaHlkcmF0ZWQpOiExfXZhciBuaj1NYXRoLmNlaWwsb2o9cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixwaj1yYS5SZWFjdEN1cnJlbnRPd25lcixYPTAsVT1udWxsLFk9bnVsbCxXPTAscWo9MCxyaj1CZigwKSxWPTAsc2o9bnVsbCx0aj0wLERnPTAsSGk9MCx1aj0wLHZqPW51bGwsamo9MCxKaT1JbmZpbml0eTtmdW5jdGlvbiB3aigpe0ppPU8oKSs1MDB9dmFyIFo9bnVsbCxRaT0hMSxSaT1udWxsLFRpPW51bGwseGo9ITEseWo9bnVsbCx6aj05MCxBaj1bXSxCaj1bXSxDaj1udWxsLERqPTAsRWo9bnVsbCxGaj0tMSxHaj0wLEhqPTAsSWo9bnVsbCxKaj0hMTtmdW5jdGlvbiBIZygpe3JldHVybiAwIT09KFgmNDgpP08oKTotMSE9PUZqP0ZqOkZqPU8oKX1cbmZ1bmN0aW9uIElnKGEpe2E9YS5tb2RlO2lmKDA9PT0oYSYyKSlyZXR1cm4gMTtpZigwPT09KGEmNCkpcmV0dXJuIDk5PT09ZWcoKT8xOjI7MD09PUdqJiYoR2o9dGopO2lmKDAhPT1rZy50cmFuc2l0aW9uKXswIT09SGomJihIaj1udWxsIT09dmo/dmoucGVuZGluZ0xhbmVzOjApO2E9R2o7dmFyIGI9NDE4NjExMiZ+SGo7YiY9LWI7MD09PWImJihhPTQxODYxMTImfmEsYj1hJi1hLDA9PT1iJiYoYj04MTkyKSk7cmV0dXJuIGJ9YT1lZygpOzAhPT0oWCY0KSYmOTg9PT1hP2E9WGMoMTIsR2opOihhPVNjKGEpLGE9WGMoYSxHaikpO3JldHVybiBhfVxuZnVuY3Rpb24gSmcoYSxiLGMpe2lmKDUwPERqKXRocm93IERqPTAsRWo9bnVsbCxFcnJvcih5KDE4NSkpO2E9S2ooYSxiKTtpZihudWxsPT09YSlyZXR1cm4gbnVsbDskYyhhLGIsYyk7YT09PVUmJihIaXw9Yiw0PT09ViYmSWkoYSxXKSk7dmFyIGQ9ZWcoKTsxPT09Yj8wIT09KFgmOCkmJjA9PT0oWCY0OCk/TGooYSk6KE1qKGEsYyksMD09PVgmJih3aigpLGlnKCkpKTooMD09PShYJjQpfHw5OCE9PWQmJjk5IT09ZHx8KG51bGw9PT1Daj9Daj1uZXcgU2V0KFthXSk6Q2ouYWRkKGEpKSxNaihhLGMpKTt2aj1hfWZ1bmN0aW9uIEtqKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO2M9YTtmb3IoYT1hLnJldHVybjtudWxsIT09YTspYS5jaGlsZExhbmVzfD1iLGM9YS5hbHRlcm5hdGUsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpLGM9YSxhPWEucmV0dXJuO3JldHVybiAzPT09Yy50YWc/Yy5zdGF0ZU5vZGU6bnVsbH1cbmZ1bmN0aW9uIE1qKGEsYil7Zm9yKHZhciBjPWEuY2FsbGJhY2tOb2RlLGQ9YS5zdXNwZW5kZWRMYW5lcyxlPWEucGluZ2VkTGFuZXMsZj1hLmV4cGlyYXRpb25UaW1lcyxnPWEucGVuZGluZ0xhbmVzOzA8Zzspe3ZhciBoPTMxLVZjKGcpLGs9MTw8aCxsPWZbaF07aWYoLTE9PT1sKXtpZigwPT09KGsmZCl8fDAhPT0oayZlKSl7bD1iO1JjKGspO3ZhciBuPUY7ZltoXT0xMDw9bj9sKzI1MDo2PD1uP2wrNUUzOi0xfX1lbHNlIGw8PWImJihhLmV4cGlyZWRMYW5lc3w9ayk7ZyY9fmt9ZD1VYyhhLGE9PT1VP1c6MCk7Yj1GO2lmKDA9PT1kKW51bGwhPT1jJiYoYyE9PVpmJiZQZihjKSxhLmNhbGxiYWNrTm9kZT1udWxsLGEuY2FsbGJhY2tQcmlvcml0eT0wKTtlbHNle2lmKG51bGwhPT1jKXtpZihhLmNhbGxiYWNrUHJpb3JpdHk9PT1iKXJldHVybjtjIT09WmYmJlBmKGMpfTE1PT09Yj8oYz1Mai5iaW5kKG51bGwsYSksbnVsbD09PWFnPyhhZz1bY10sYmc9T2YoVWYsamcpKTphZy5wdXNoKGMpLFxuYz1aZik6MTQ9PT1iP2M9aGcoOTksTGouYmluZChudWxsLGEpKTooYz1UYyhiKSxjPWhnKGMsTmouYmluZChudWxsLGEpKSk7YS5jYWxsYmFja1ByaW9yaXR5PWI7YS5jYWxsYmFja05vZGU9Y319XG5mdW5jdGlvbiBOaihhKXtGaj0tMTtIaj1Haj0wO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYj1hLmNhbGxiYWNrTm9kZTtpZihPaigpJiZhLmNhbGxiYWNrTm9kZSE9PWIpcmV0dXJuIG51bGw7dmFyIGM9VWMoYSxhPT09VT9XOjApO2lmKDA9PT1jKXJldHVybiBudWxsO3ZhciBkPWM7dmFyIGU9WDtYfD0xNjt2YXIgZj1QaigpO2lmKFUhPT1hfHxXIT09ZCl3aigpLFFqKGEsZCk7ZG8gdHJ5e1JqKCk7YnJlYWt9Y2F0Y2goaCl7U2ooYSxoKX13aGlsZSgxKTtxZygpO29qLmN1cnJlbnQ9ZjtYPWU7bnVsbCE9PVk/ZD0wOihVPW51bGwsVz0wLGQ9Vik7aWYoMCE9PSh0aiZIaSkpUWooYSwwKTtlbHNlIGlmKDAhPT1kKXsyPT09ZCYmKFh8PTY0LGEuaHlkcmF0ZSYmKGEuaHlkcmF0ZT0hMSxxZihhLmNvbnRhaW5lckluZm8pKSxjPVdjKGEpLDAhPT1jJiYoZD1UaihhLGMpKSk7aWYoMT09PWQpdGhyb3cgYj1zaixRaihhLDApLElpKGEsYyksTWooYSxPKCkpLGI7YS5maW5pc2hlZFdvcms9XG5hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRMYW5lcz1jO3N3aXRjaChkKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHkoMzQ1KSk7Y2FzZSAyOlVqKGEpO2JyZWFrO2Nhc2UgMzpJaShhLGMpO2lmKChjJjYyOTE0NTYwKT09PWMmJihkPWpqKzUwMC1PKCksMTA8ZCkpe2lmKDAhPT1VYyhhLDApKWJyZWFrO2U9YS5zdXNwZW5kZWRMYW5lcztpZigoZSZjKSE9PWMpe0hnKCk7YS5waW5nZWRMYW5lc3w9YS5zdXNwZW5kZWRMYW5lcyZlO2JyZWFrfWEudGltZW91dEhhbmRsZT1vZihVai5iaW5kKG51bGwsYSksZCk7YnJlYWt9VWooYSk7YnJlYWs7Y2FzZSA0OklpKGEsYyk7aWYoKGMmNDE4NjExMik9PT1jKWJyZWFrO2Q9YS5ldmVudFRpbWVzO2ZvcihlPS0xOzA8Yzspe3ZhciBnPTMxLVZjKGMpO2Y9MTw8ZztnPWRbZ107Zz5lJiYoZT1nKTtjJj1+Zn1jPWU7Yz1PKCktYztjPSgxMjA+Yz8xMjA6NDgwPmM/NDgwOjEwODA+Yz8xMDgwOjE5MjA+Yz8xOTIwOjNFMz5jPzNFMzo0MzIwPlxuYz80MzIwOjE5NjAqbmooYy8xOTYwKSktYztpZigxMDxjKXthLnRpbWVvdXRIYW5kbGU9b2YoVWouYmluZChudWxsLGEpLGMpO2JyZWFrfVVqKGEpO2JyZWFrO2Nhc2UgNTpVaihhKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHkoMzI5KSk7fX1NaihhLE8oKSk7cmV0dXJuIGEuY2FsbGJhY2tOb2RlPT09Yj9Oai5iaW5kKG51bGwsYSk6bnVsbH1mdW5jdGlvbiBJaShhLGIpe2ImPX51ajtiJj1+SGk7YS5zdXNwZW5kZWRMYW5lc3w9YjthLnBpbmdlZExhbmVzJj1+Yjtmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGI7KXt2YXIgYz0zMS1WYyhiKSxkPTE8PGM7YVtjXT0tMTtiJj1+ZH19XG5mdW5jdGlvbiBMaihhKXtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzI3KSk7T2ooKTtpZihhPT09VSYmMCE9PShhLmV4cGlyZWRMYW5lcyZXKSl7dmFyIGI9Vzt2YXIgYz1UaihhLGIpOzAhPT0odGomSGkpJiYoYj1VYyhhLGIpLGM9VGooYSxiKSl9ZWxzZSBiPVVjKGEsMCksYz1UaihhLGIpOzAhPT1hLnRhZyYmMj09PWMmJihYfD02NCxhLmh5ZHJhdGUmJihhLmh5ZHJhdGU9ITEscWYoYS5jb250YWluZXJJbmZvKSksYj1XYyhhKSwwIT09YiYmKGM9VGooYSxiKSkpO2lmKDE9PT1jKXRocm93IGM9c2osUWooYSwwKSxJaShhLGIpLE1qKGEsTygpKSxjO2EuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWI7VWooYSk7TWooYSxPKCkpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gVmooKXtpZihudWxsIT09Q2ope3ZhciBhPUNqO0NqPW51bGw7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZXhwaXJlZExhbmVzfD0yNCZhLnBlbmRpbmdMYW5lcztNaihhLE8oKSl9KX1pZygpfWZ1bmN0aW9uIFdqKGEsYil7dmFyIGM9WDtYfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIFhqKGEsYil7dmFyIGM9WDtYJj0tMjtYfD04O3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIG5pKGEsYil7SShyaixxaik7cWp8PWI7dGp8PWJ9ZnVuY3Rpb24gS2koKXtxaj1yai5jdXJyZW50O0gocmopfVxuZnVuY3Rpb24gUWooYSxiKXthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO3ZhciBjPWEudGltZW91dEhhbmRsZTstMSE9PWMmJihhLnRpbWVvdXRIYW5kbGU9LTEscGYoYykpO2lmKG51bGwhPT1ZKWZvcihjPVkucmV0dXJuO251bGwhPT1jOyl7dmFyIGQ9Yztzd2l0Y2goZC50YWcpe2Nhc2UgMTpkPWQudHlwZS5jaGlsZENvbnRleHRUeXBlcztudWxsIT09ZCYmdm9pZCAwIT09ZCYmR2YoKTticmVhaztjYXNlIDM6ZmgoKTtIKE4pO0goTSk7dWgoKTticmVhaztjYXNlIDU6aGgoZCk7YnJlYWs7Y2FzZSA0OmZoKCk7YnJlYWs7Y2FzZSAxMzpIKFApO2JyZWFrO2Nhc2UgMTk6SChQKTticmVhaztjYXNlIDEwOnJnKGQpO2JyZWFrO2Nhc2UgMjM6Y2FzZSAyNDpLaSgpfWM9Yy5yZXR1cm59VT1hO1k9VGcoYS5jdXJyZW50LG51bGwpO1c9cWo9dGo9YjtWPTA7c2o9bnVsbDt1aj1IaT1EZz0wfVxuZnVuY3Rpb24gU2ooYSxiKXtkb3t2YXIgYz1ZO3RyeXtxZygpO3ZoLmN1cnJlbnQ9R2g7aWYoeWgpe2Zvcih2YXIgZD1SLm1lbW9pemVkU3RhdGU7bnVsbCE9PWQ7KXt2YXIgZT1kLnF1ZXVlO251bGwhPT1lJiYoZS5wZW5kaW5nPW51bGwpO2Q9ZC5uZXh0fXloPSExfXhoPTA7VD1TPVI9bnVsbDt6aD0hMTtwai5jdXJyZW50PW51bGw7aWYobnVsbD09PWN8fG51bGw9PT1jLnJldHVybil7Vj0xO3NqPWI7WT1udWxsO2JyZWFrfWE6e3ZhciBmPWEsZz1jLnJldHVybixoPWMsaz1iO2I9VztoLmZsYWdzfD0yMDQ4O2guZmlyc3RFZmZlY3Q9aC5sYXN0RWZmZWN0PW51bGw7aWYobnVsbCE9PWsmJlwib2JqZWN0XCI9PT10eXBlb2YgayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGsudGhlbil7dmFyIGw9aztpZigwPT09KGgubW9kZSYyKSl7dmFyIG49aC5hbHRlcm5hdGU7bj8oaC51cGRhdGVRdWV1ZT1uLnVwZGF0ZVF1ZXVlLGgubWVtb2l6ZWRTdGF0ZT1uLm1lbW9pemVkU3RhdGUsaC5sYW5lcz1uLmxhbmVzKTpcbihoLnVwZGF0ZVF1ZXVlPW51bGwsaC5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBBPTAhPT0oUC5jdXJyZW50JjEpLHA9Zztkb3t2YXIgQztpZihDPTEzPT09cC50YWcpe3ZhciB4PXAubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09eClDPW51bGwhPT14LmRlaHlkcmF0ZWQ/ITA6ITE7ZWxzZXt2YXIgdz1wLm1lbW9pemVkUHJvcHM7Qz12b2lkIDA9PT13LmZhbGxiYWNrPyExOiEwIT09dy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjaz8hMDpBPyExOiEwfX1pZihDKXt2YXIgej1wLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT16KXt2YXIgdT1uZXcgU2V0O3UuYWRkKGwpO3AudXBkYXRlUXVldWU9dX1lbHNlIHouYWRkKGwpO2lmKDA9PT0ocC5tb2RlJjIpKXtwLmZsYWdzfD02NDtoLmZsYWdzfD0xNjM4NDtoLmZsYWdzJj0tMjk4MTtpZigxPT09aC50YWcpaWYobnVsbD09PWguYWx0ZXJuYXRlKWgudGFnPTE3O2Vsc2V7dmFyIHQ9emcoLTEsMSk7dC50YWc9MjtBZyhoLHQpfWgubGFuZXN8PTE7YnJlYWsgYX1rPVxudm9pZCAwO2g9Yjt2YXIgcT1mLnBpbmdDYWNoZTtudWxsPT09cT8ocT1mLnBpbmdDYWNoZT1uZXcgT2ksaz1uZXcgU2V0LHEuc2V0KGwsaykpOihrPXEuZ2V0KGwpLHZvaWQgMD09PWsmJihrPW5ldyBTZXQscS5zZXQobCxrKSkpO2lmKCFrLmhhcyhoKSl7ay5hZGQoaCk7dmFyIHY9WWouYmluZChudWxsLGYsbCxoKTtsLnRoZW4odix2KX1wLmZsYWdzfD00MDk2O3AubGFuZXM9YjticmVhayBhfXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApO2s9RXJyb3IoKFJhKGgudHlwZSl8fFwiQSBSZWFjdCBjb21wb25lbnRcIikrXCIgc3VzcGVuZGVkIHdoaWxlIHJlbmRlcmluZywgYnV0IG5vIGZhbGxiYWNrIFVJIHdhcyBzcGVjaWZpZWQuXFxuXFxuQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byBwcm92aWRlIGEgbG9hZGluZyBpbmRpY2F0b3Igb3IgcGxhY2Vob2xkZXIgdG8gZGlzcGxheS5cIil9NSE9PVYmJihWPTIpO2s9TWkoayxoKTtwPVxuZztkb3tzd2l0Y2gocC50YWcpe2Nhc2UgMzpmPWs7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBKPVBpKHAsZixiKTtCZyhwLEopO2JyZWFrIGE7Y2FzZSAxOmY9azt2YXIgSz1wLnR5cGUsUT1wLnN0YXRlTm9kZTtpZigwPT09KHAuZmxhZ3MmNjQpJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxudWxsIT09USYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFEuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoUSkpKSl7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBMPVNpKHAsZixiKTtCZyhwLEwpO2JyZWFrIGF9fXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApfVpqKGMpfWNhdGNoKHZhKXtiPXZhO1k9PT1jJiZudWxsIT09YyYmKFk9Yz1jLnJldHVybik7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9XG5mdW5jdGlvbiBQaigpe3ZhciBhPW9qLmN1cnJlbnQ7b2ouY3VycmVudD1HaDtyZXR1cm4gbnVsbD09PWE/R2g6YX1mdW5jdGlvbiBUaihhLGIpe3ZhciBjPVg7WHw9MTY7dmFyIGQ9UGooKTtVPT09YSYmVz09PWJ8fFFqKGEsYik7ZG8gdHJ5e2FrKCk7YnJlYWt9Y2F0Y2goZSl7U2ooYSxlKX13aGlsZSgxKTtxZygpO1g9Yztvai5jdXJyZW50PWQ7aWYobnVsbCE9PVkpdGhyb3cgRXJyb3IoeSgyNjEpKTtVPW51bGw7Vz0wO3JldHVybiBWfWZ1bmN0aW9uIGFrKCl7Zm9yKDtudWxsIT09WTspYmsoWSl9ZnVuY3Rpb24gUmooKXtmb3IoO251bGwhPT1ZJiYhUWYoKTspYmsoWSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Y2soYS5hbHRlcm5hdGUsYSxxaik7YS5tZW1vaXplZFByb3BzPWEucGVuZGluZ1Byb3BzO251bGw9PT1iP1pqKGEpOlk9Yjtwai5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBaaihhKXt2YXIgYj1hO2Rve3ZhciBjPWIuYWx0ZXJuYXRlO2E9Yi5yZXR1cm47aWYoMD09PShiLmZsYWdzJjIwNDgpKXtjPUdpKGMsYixxaik7aWYobnVsbCE9PWMpe1k9YztyZXR1cm59Yz1iO2lmKDI0IT09Yy50YWcmJjIzIT09Yy50YWd8fG51bGw9PT1jLm1lbW9pemVkU3RhdGV8fDAhPT0ocWomMTA3Mzc0MTgyNCl8fDA9PT0oYy5tb2RlJjQpKXtmb3IodmFyIGQ9MCxlPWMuY2hpbGQ7bnVsbCE9PWU7KWR8PWUubGFuZXN8ZS5jaGlsZExhbmVzLGU9ZS5zaWJsaW5nO2MuY2hpbGRMYW5lcz1kfW51bGwhPT1hJiYwPT09KGEuZmxhZ3MmMjA0OCkmJihudWxsPT09YS5maXJzdEVmZmVjdCYmKGEuZmlyc3RFZmZlY3Q9Yi5maXJzdEVmZmVjdCksbnVsbCE9PWIubGFzdEVmZmVjdCYmKG51bGwhPT1hLmxhc3RFZmZlY3QmJihhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1iLmZpcnN0RWZmZWN0KSxhLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0KSwxPGIuZmxhZ3MmJihudWxsIT09XG5hLmxhc3RFZmZlY3Q/YS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YjphLmZpcnN0RWZmZWN0PWIsYS5sYXN0RWZmZWN0PWIpKX1lbHNle2M9TGkoYik7aWYobnVsbCE9PWMpe2MuZmxhZ3MmPTIwNDc7WT1jO3JldHVybn1udWxsIT09YSYmKGEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PW51bGwsYS5mbGFnc3w9MjA0OCl9Yj1iLnNpYmxpbmc7aWYobnVsbCE9PWIpe1k9YjtyZXR1cm59WT1iPWF9d2hpbGUobnVsbCE9PWIpOzA9PT1WJiYoVj01KX1mdW5jdGlvbiBVaihhKXt2YXIgYj1lZygpO2dnKDk5LGRrLmJpbmQobnVsbCxhLGIpKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGRrKGEsYil7ZG8gT2ooKTt3aGlsZShudWxsIT09eWopO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYz1hLmZpbmlzaGVkV29yaztpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IoeSgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO3ZhciBkPWMubGFuZXN8Yy5jaGlsZExhbmVzLGU9ZCxmPWEucGVuZGluZ0xhbmVzJn5lO2EucGVuZGluZ0xhbmVzPWU7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9ZTthLm11dGFibGVSZWFkTGFuZXMmPWU7YS5lbnRhbmdsZWRMYW5lcyY9ZTtlPWEuZW50YW5nbGVtZW50cztmb3IodmFyIGc9YS5ldmVudFRpbWVzLGg9YS5leHBpcmF0aW9uVGltZXM7MDxmOyl7dmFyIGs9MzEtVmMoZiksbD0xPDxrO2Vba109MDtnW2tdPS0xO2hba109LTE7ZiY9fmx9bnVsbCE9PVxuQ2omJjA9PT0oZCYyNCkmJkNqLmhhcyhhKSYmQ2ouZGVsZXRlKGEpO2E9PT1VJiYoWT1VPW51bGwsVz0wKTsxPGMuZmxhZ3M/bnVsbCE9PWMubGFzdEVmZmVjdD8oYy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxkPWMuZmlyc3RFZmZlY3QpOmQ9YzpkPWMuZmlyc3RFZmZlY3Q7aWYobnVsbCE9PWQpe2U9WDtYfD0zMjtwai5jdXJyZW50PW51bGw7a2Y9ZmQ7Zz1OZSgpO2lmKE9lKGcpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBnKWg9e3N0YXJ0Omcuc2VsZWN0aW9uU3RhcnQsZW5kOmcuc2VsZWN0aW9uRW5kfTtlbHNlIGE6aWYoaD0oaD1nLm93bmVyRG9jdW1lbnQpJiZoLmRlZmF1bHRWaWV3fHx3aW5kb3csKGw9aC5nZXRTZWxlY3Rpb24mJmguZ2V0U2VsZWN0aW9uKCkpJiYwIT09bC5yYW5nZUNvdW50KXtoPWwuYW5jaG9yTm9kZTtmPWwuYW5jaG9yT2Zmc2V0O2s9bC5mb2N1c05vZGU7bD1sLmZvY3VzT2Zmc2V0O3RyeXtoLm5vZGVUeXBlLGsubm9kZVR5cGV9Y2F0Y2godmEpe2g9bnVsbDtcbmJyZWFrIGF9dmFyIG49MCxBPS0xLHA9LTEsQz0wLHg9MCx3PWcsej1udWxsO2I6Zm9yKDs7KXtmb3IodmFyIHU7Oyl7dyE9PWh8fDAhPT1mJiYzIT09dy5ub2RlVHlwZXx8KEE9bitmKTt3IT09a3x8MCE9PWwmJjMhPT13Lm5vZGVUeXBlfHwocD1uK2wpOzM9PT13Lm5vZGVUeXBlJiYobis9dy5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHU9dy5maXJzdENoaWxkKSlicmVhazt6PXc7dz11fWZvcig7Oyl7aWYodz09PWcpYnJlYWsgYjt6PT09aCYmKytDPT09ZiYmKEE9bik7ej09PWsmJisreD09PWwmJihwPW4pO2lmKG51bGwhPT0odT13Lm5leHRTaWJsaW5nKSlicmVhazt3PXo7ej13LnBhcmVudE5vZGV9dz11fWg9LTE9PT1BfHwtMT09PXA/bnVsbDp7c3RhcnQ6QSxlbmQ6cH19ZWxzZSBoPW51bGw7aD1ofHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBoPW51bGw7bGY9e2ZvY3VzZWRFbGVtOmcsc2VsZWN0aW9uUmFuZ2U6aH07ZmQ9ITE7SWo9bnVsbDtKaj0hMTtaPWQ7ZG8gdHJ5e2VrKCl9Y2F0Y2godmEpe2lmKG51bGw9PT1cblopdGhyb3cgRXJyb3IoeSgzMzApKTtXaShaLHZhKTtaPVoubmV4dEVmZmVjdH13aGlsZShudWxsIT09Wik7SWo9bnVsbDtaPWQ7ZG8gdHJ5e2ZvcihnPWE7bnVsbCE9PVo7KXt2YXIgdD1aLmZsYWdzO3QmMTYmJnBiKFouc3RhdGVOb2RlLFwiXCIpO2lmKHQmMTI4KXt2YXIgcT1aLmFsdGVybmF0ZTtpZihudWxsIT09cSl7dmFyIHY9cS5yZWY7bnVsbCE9PXYmJihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdj92KG51bGwpOnYuY3VycmVudD1udWxsKX19c3dpdGNoKHQmMTAzOCl7Y2FzZSAyOmZqKFopO1ouZmxhZ3MmPS0zO2JyZWFrO2Nhc2UgNjpmaihaKTtaLmZsYWdzJj0tMztpaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDEwMjQ6Wi5mbGFncyY9LTEwMjU7YnJlYWs7Y2FzZSAxMDI4OlouZmxhZ3MmPS0xMDI1O2lqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgNDppaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDg6aD1aO2NqKGcsaCk7dmFyIEo9aC5hbHRlcm5hdGU7ZGooaCk7bnVsbCE9PVxuSiYmZGooSil9Wj1aLm5leHRFZmZlY3R9fWNhdGNoKHZhKXtpZihudWxsPT09Wil0aHJvdyBFcnJvcih5KDMzMCkpO1dpKFosdmEpO1o9Wi5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1aKTt2PWxmO3E9TmUoKTt0PXYuZm9jdXNlZEVsZW07Zz12LnNlbGVjdGlvblJhbmdlO2lmKHEhPT10JiZ0JiZ0Lm93bmVyRG9jdW1lbnQmJk1lKHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdCkpe251bGwhPT1nJiZPZSh0KSYmKHE9Zy5zdGFydCx2PWcuZW5kLHZvaWQgMD09PXYmJih2PXEpLFwic2VsZWN0aW9uU3RhcnRcImluIHQ/KHQuc2VsZWN0aW9uU3RhcnQ9cSx0LnNlbGVjdGlvbkVuZD1NYXRoLm1pbih2LHQudmFsdWUubGVuZ3RoKSk6KHY9KHE9dC5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnEuZGVmYXVsdFZpZXd8fHdpbmRvdyx2LmdldFNlbGVjdGlvbiYmKHY9di5nZXRTZWxlY3Rpb24oKSxoPXQudGV4dENvbnRlbnQubGVuZ3RoLEo9TWF0aC5taW4oZy5zdGFydCxoKSxnPXZvaWQgMD09PVxuZy5lbmQ/SjpNYXRoLm1pbihnLmVuZCxoKSwhdi5leHRlbmQmJko+ZyYmKGg9ZyxnPUosSj1oKSxoPUxlKHQsSiksZj1MZSh0LGcpLGgmJmYmJigxIT09di5yYW5nZUNvdW50fHx2LmFuY2hvck5vZGUhPT1oLm5vZGV8fHYuYW5jaG9yT2Zmc2V0IT09aC5vZmZzZXR8fHYuZm9jdXNOb2RlIT09Zi5ub2RlfHx2LmZvY3VzT2Zmc2V0IT09Zi5vZmZzZXQpJiYocT1xLmNyZWF0ZVJhbmdlKCkscS5zZXRTdGFydChoLm5vZGUsaC5vZmZzZXQpLHYucmVtb3ZlQWxsUmFuZ2VzKCksSj5nPyh2LmFkZFJhbmdlKHEpLHYuZXh0ZW5kKGYubm9kZSxmLm9mZnNldCkpOihxLnNldEVuZChmLm5vZGUsZi5vZmZzZXQpLHYuYWRkUmFuZ2UocSkpKSkpKTtxPVtdO2Zvcih2PXQ7dj12LnBhcmVudE5vZGU7KTE9PT12Lm5vZGVUeXBlJiZxLnB1c2goe2VsZW1lbnQ6dixsZWZ0OnYuc2Nyb2xsTGVmdCx0b3A6di5zY3JvbGxUb3B9KTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgdC5mb2N1cyYmdC5mb2N1cygpO2Zvcih0PVxuMDt0PHEubGVuZ3RoO3QrKyl2PXFbdF0sdi5lbGVtZW50LnNjcm9sbExlZnQ9di5sZWZ0LHYuZWxlbWVudC5zY3JvbGxUb3A9di50b3B9ZmQ9ISFrZjtsZj1rZj1udWxsO2EuY3VycmVudD1jO1o9ZDtkbyB0cnl7Zm9yKHQ9YTtudWxsIT09Wjspe3ZhciBLPVouZmxhZ3M7SyYzNiYmWWkodCxaLmFsdGVybmF0ZSxaKTtpZihLJjEyOCl7cT12b2lkIDA7dmFyIFE9Wi5yZWY7aWYobnVsbCE9PVEpe3ZhciBMPVouc3RhdGVOb2RlO3N3aXRjaChaLnRhZyl7Y2FzZSA1OnE9TDticmVhaztkZWZhdWx0OnE9TH1cImZ1bmN0aW9uXCI9PT10eXBlb2YgUT9RKHEpOlEuY3VycmVudD1xfX1aPVoubmV4dEVmZmVjdH19Y2F0Y2godmEpe2lmKG51bGw9PT1aKXRocm93IEVycm9yKHkoMzMwKSk7V2koWix2YSk7Wj1aLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVopO1o9bnVsbDskZigpO1g9ZX1lbHNlIGEuY3VycmVudD1jO2lmKHhqKXhqPSExLHlqPWEsemo9YjtlbHNlIGZvcihaPWQ7bnVsbCE9PVo7KWI9XG5aLm5leHRFZmZlY3QsWi5uZXh0RWZmZWN0PW51bGwsWi5mbGFncyY4JiYoSz1aLEsuc2libGluZz1udWxsLEsuc3RhdGVOb2RlPW51bGwpLFo9YjtkPWEucGVuZGluZ0xhbmVzOzA9PT1kJiYoVGk9bnVsbCk7MT09PWQ/YT09PUVqP0RqKys6KERqPTAsRWo9YSk6RGo9MDtjPWMuc3RhdGVOb2RlO2lmKE1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgTWYub25Db21taXRGaWJlclJvb3QpdHJ5e01mLm9uQ29tbWl0RmliZXJSb290KExmLGMsdm9pZCAwLDY0PT09KGMuY3VycmVudC5mbGFncyY2NCkpfWNhdGNoKHZhKXt9TWooYSxPKCkpO2lmKFFpKXRocm93IFFpPSExLGE9UmksUmk9bnVsbCxhO2lmKDAhPT0oWCY4KSlyZXR1cm4gbnVsbDtpZygpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gZWsoKXtmb3IoO251bGwhPT1aOyl7dmFyIGE9Wi5hbHRlcm5hdGU7Smp8fG51bGw9PT1Janx8KDAhPT0oWi5mbGFncyY4KT9kYyhaLElqKSYmKEpqPSEwKToxMz09PVoudGFnJiZtaihhLFopJiZkYyhaLElqKSYmKEpqPSEwKSk7dmFyIGI9Wi5mbGFnczswIT09KGImMjU2KSYmWGkoYSxaKTswPT09KGImNTEyKXx8eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSk7Wj1aLm5leHRFZmZlY3R9fWZ1bmN0aW9uIE9qKCl7aWYoOTAhPT16ail7dmFyIGE9OTc8emo/OTc6emo7emo9OTA7cmV0dXJuIGdnKGEsZmspfXJldHVybiExfWZ1bmN0aW9uICRpKGEsYil7QWoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfWZ1bmN0aW9uIFppKGEsYil7QmoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfVxuZnVuY3Rpb24gZmsoKXtpZihudWxsPT09eWopcmV0dXJuITE7dmFyIGE9eWo7eWo9bnVsbDtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzMxKSk7dmFyIGI9WDtYfD0zMjt2YXIgYz1CajtCaj1bXTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrPTIpe3ZhciBlPWNbZF0sZj1jW2QrMV0sZz1lLmRlc3Ryb3k7ZS5kZXN0cm95PXZvaWQgMDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyl0cnl7ZygpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Yz1BajtBaj1bXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7ZT1jW2RdO2Y9Y1tkKzFdO3RyeXt2YXIgaD1lLmNyZWF0ZTtlLmRlc3Ryb3k9aCgpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Zm9yKGg9YS5jdXJyZW50LmZpcnN0RWZmZWN0O251bGwhPT1oOylhPWgubmV4dEVmZmVjdCxoLm5leHRFZmZlY3Q9bnVsbCxoLmZsYWdzJjgmJihoLnNpYmxpbmc9XG5udWxsLGguc3RhdGVOb2RlPW51bGwpLGg9YTtYPWI7aWcoKTtyZXR1cm4hMH1mdW5jdGlvbiBnayhhLGIsYyl7Yj1NaShjLGIpO2I9UGkoYSxiLDEpO0FnKGEsYik7Yj1IZygpO2E9S2ooYSwxKTtudWxsIT09YSYmKCRjKGEsMSxiKSxNaihhLGIpKX1cbmZ1bmN0aW9uIFdpKGEsYil7aWYoMz09PWEudGFnKWdrKGEsYSxiKTtlbHNlIGZvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKDM9PT1jLnRhZyl7Z2soYyxhLGIpO2JyZWFrfWVsc2UgaWYoMT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoZCkpKXthPU1pKGIsYSk7dmFyIGU9U2koYyxhLDEpO0FnKGMsZSk7ZT1IZygpO2M9S2ooYywxKTtpZihudWxsIT09YykkYyhjLDEsZSksTWooYyxlKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PVRpfHwhVGkuaGFzKGQpKSl0cnl7ZC5jb21wb25lbnREaWRDYXRjaChiLGEpfWNhdGNoKGYpe31icmVha319Yz1jLnJldHVybn19XG5mdW5jdGlvbiBZaihhLGIsYyl7dmFyIGQ9YS5waW5nQ2FjaGU7bnVsbCE9PWQmJmQuZGVsZXRlKGIpO2I9SGcoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmM7VT09PWEmJihXJmMpPT09YyYmKDQ9PT1WfHwzPT09ViYmKFcmNjI5MTQ1NjApPT09VyYmNTAwPk8oKS1qaj9RaihhLDApOnVqfD1jKTtNaihhLGIpfWZ1bmN0aW9uIGxqKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbCE9PWMmJmMuZGVsZXRlKGIpO2I9MDswPT09YiYmKGI9YS5tb2RlLDA9PT0oYiYyKT9iPTE6MD09PShiJjQpP2I9OTk9PT1lZygpPzE6MjooMD09PUdqJiYoR2o9dGopLGI9WWMoNjI5MTQ1NjAmfkdqKSwwPT09YiYmKGI9NDE5NDMwNCkpKTtjPUhnKCk7YT1LaihhLGIpO251bGwhPT1hJiYoJGMoYSxiLGMpLE1qKGEsYykpfXZhciBjaztcbmNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmxhbmVzO2lmKG51bGwhPT1hKWlmKGEubWVtb2l6ZWRQcm9wcyE9PWIucGVuZGluZ1Byb3BzfHxOLmN1cnJlbnQpdWc9ITA7ZWxzZSBpZigwIT09KGMmZCkpdWc9MCE9PShhLmZsYWdzJjE2Mzg0KT8hMDohMTtlbHNle3VnPSExO3N3aXRjaChiLnRhZyl7Y2FzZSAzOnJpKGIpO3NoKCk7YnJlYWs7Y2FzZSA1OmdoKGIpO2JyZWFrO2Nhc2UgMTpGZihiLnR5cGUpJiZKZihiKTticmVhaztjYXNlIDQ6ZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOmQ9Yi5tZW1vaXplZFByb3BzLnZhbHVlO3ZhciBlPWIudHlwZS5fY29udGV4dDtJKG1nLGUuX2N1cnJlbnRWYWx1ZSk7ZS5fY3VycmVudFZhbHVlPWQ7YnJlYWs7Y2FzZSAxMzppZihudWxsIT09Yi5tZW1vaXplZFN0YXRlKXtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gdGkoYSxiLGMpO0koUCxQLmN1cnJlbnQmMSk7Yj1oaShhLGIsYyk7cmV0dXJuIG51bGwhPT1cbmI/Yi5zaWJsaW5nOm51bGx9SShQLFAuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmQ9MCE9PShjJmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjY0KSl7aWYoZClyZXR1cm4gQWkoYSxiLGMpO2IuZmxhZ3N8PTY0fWU9Yi5tZW1vaXplZFN0YXRlO251bGwhPT1lJiYoZS5yZW5kZXJpbmc9bnVsbCxlLnRhaWw9bnVsbCxlLmxhc3RFZmZlY3Q9bnVsbCk7SShQLFAuY3VycmVudCk7aWYoZClicmVhaztlbHNlIHJldHVybiBudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gYi5sYW5lcz0wLG1pKGEsYixjKX1yZXR1cm4gaGkoYSxiLGMpfWVsc2UgdWc9ITE7Yi5sYW5lcz0wO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7ZT1FZihiLE0uY3VycmVudCk7dGcoYixjKTtlPUNoKG51bGwsYixkLGEsZSxjKTtiLmZsYWdzfD0xO2lmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mKXtiLnRhZz0xO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtpZihGZihkKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO2IubWVtb2l6ZWRTdGF0ZT1udWxsIT09ZS5zdGF0ZSYmdm9pZCAwIT09ZS5zdGF0ZT9lLnN0YXRlOm51bGw7eGcoYik7dmFyIGc9ZC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XCJmdW5jdGlvblwiPT09dHlwZW9mIGcmJkdnKGIsZCxnLGEpO2UudXBkYXRlcj1LZztiLnN0YXRlTm9kZT1lO2UuX3JlYWN0SW50ZXJuYWxzPWI7T2coYixkLGEsYyk7Yj1xaShudWxsLGIsZCwhMCxmLGMpfWVsc2UgYi50YWc9MCxmaShudWxsLGIsZSxjKSxiPWIuY2hpbGQ7cmV0dXJuIGI7Y2FzZSAxNjplPWIuZWxlbWVudFR5cGU7YTp7bnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9Mik7XG5hPWIucGVuZGluZ1Byb3BzO2Y9ZS5faW5pdDtlPWYoZS5fcGF5bG9hZCk7Yi50eXBlPWU7Zj1iLnRhZz1oayhlKTthPWxnKGUsYSk7c3dpdGNoKGYpe2Nhc2UgMDpiPWxpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1waShudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPWdpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9aWkobnVsbCxiLGUsbGcoZS50eXBlLGEpLGQsYyk7YnJlYWsgYX10aHJvdyBFcnJvcih5KDMwNixlLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGxpKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLHBpKGEsYixkLGUsYyk7Y2FzZSAzOnJpKGIpO2Q9Yi51cGRhdGVRdWV1ZTtpZihudWxsPT09YXx8bnVsbD09PWQpdGhyb3cgRXJyb3IoeSgyODIpKTtcbmQ9Yi5wZW5kaW5nUHJvcHM7ZT1iLm1lbW9pemVkU3RhdGU7ZT1udWxsIT09ZT9lLmVsZW1lbnQ6bnVsbDt5ZyhhLGIpO0NnKGIsZCxudWxsLGMpO2Q9Yi5tZW1vaXplZFN0YXRlLmVsZW1lbnQ7aWYoZD09PWUpc2goKSxiPWhpKGEsYixjKTtlbHNle2U9Yi5zdGF0ZU5vZGU7aWYoZj1lLmh5ZHJhdGUpa2g9cmYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxqaD1iLGY9bGg9ITA7aWYoZil7YT1lLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7aWYobnVsbCE9YSlmb3IoZT0wO2U8YS5sZW5ndGg7ZSs9MilmPWFbZV0sZi5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1hW2UrMV0sdGgucHVzaChmKTtjPVpnKGIsbnVsbCxkLGMpO2ZvcihiLmNoaWxkPWM7YzspYy5mbGFncz1jLmZsYWdzJi0zfDEwMjQsYz1jLnNpYmxpbmd9ZWxzZSBmaShhLGIsZCxjKSxzaCgpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIGdoKGIpLG51bGw9PT1hJiZcbnBoKGIpLGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZj1udWxsIT09YT9hLm1lbW9pemVkUHJvcHM6bnVsbCxnPWUuY2hpbGRyZW4sbmYoZCxlKT9nPW51bGw6bnVsbCE9PWYmJm5mKGQsZikmJihiLmZsYWdzfD0xNiksb2koYSxiKSxmaShhLGIsZyxjKSxiLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWEmJnBoKGIpLG51bGw7Y2FzZSAxMzpyZXR1cm4gdGkoYSxiLGMpO2Nhc2UgNDpyZXR1cm4gZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxkPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hP2IuY2hpbGQ9WWcoYixudWxsLGQsYyk6ZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGdpKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBmaShhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIGZpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbmMpLGIuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZmkoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMDphOntkPWIudHlwZS5fY29udGV4dDtlPWIucGVuZGluZ1Byb3BzO2c9Yi5tZW1vaXplZFByb3BzO2Y9ZS52YWx1ZTt2YXIgaD1iLnR5cGUuX2NvbnRleHQ7SShtZyxoLl9jdXJyZW50VmFsdWUpO2guX2N1cnJlbnRWYWx1ZT1mO2lmKG51bGwhPT1nKWlmKGg9Zy52YWx1ZSxmPUhlKGgsZik/MDooXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzP2QuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzKGgsZik6MTA3Mzc0MTgyMyl8MCwwPT09Zil7aWYoZy5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFOLmN1cnJlbnQpe2I9aGkoYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGg9Yi5jaGlsZCxudWxsIT09aCYmKGgucmV0dXJuPWIpO251bGwhPT1oOyl7dmFyIGs9aC5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PWspe2c9aC5jaGlsZDtmb3IodmFyIGw9XG5rLmZpcnN0Q29udGV4dDtudWxsIT09bDspe2lmKGwuY29udGV4dD09PWQmJjAhPT0obC5vYnNlcnZlZEJpdHMmZikpezE9PT1oLnRhZyYmKGw9emcoLTEsYyYtYyksbC50YWc9MixBZyhoLGwpKTtoLmxhbmVzfD1jO2w9aC5hbHRlcm5hdGU7bnVsbCE9PWwmJihsLmxhbmVzfD1jKTtzZyhoLnJldHVybixjKTtrLmxhbmVzfD1jO2JyZWFrfWw9bC5uZXh0fX1lbHNlIGc9MTA9PT1oLnRhZz9oLnR5cGU9PT1iLnR5cGU/bnVsbDpoLmNoaWxkOmguY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49aDtlbHNlIGZvcihnPWg7bnVsbCE9PWc7KXtpZihnPT09Yil7Zz1udWxsO2JyZWFrfWg9Zy5zaWJsaW5nO2lmKG51bGwhPT1oKXtoLnJldHVybj1nLnJldHVybjtnPWg7YnJlYWt9Zz1nLnJldHVybn1oPWd9ZmkoYSxiLGUuY2hpbGRyZW4sYyk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgOTpyZXR1cm4gZT1iLnR5cGUsZj1iLnBlbmRpbmdQcm9wcyxkPWYuY2hpbGRyZW4sdGcoYixjKSxlPXZnKGUsXG5mLnVuc3RhYmxlX29ic2VydmVkQml0cyksZD1kKGUpLGIuZmxhZ3N8PTEsZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDE0OnJldHVybiBlPWIudHlwZSxmPWxnKGUsYi5wZW5kaW5nUHJvcHMpLGY9bGcoZS50eXBlLGYpLGlpKGEsYixlLGYsZCxjKTtjYXNlIDE1OnJldHVybiBraShhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGQsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6bGcoZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKSxiLnRhZz0xLEZmKGQpPyhhPSEwLEpmKGIpKTphPSExLHRnKGIsYyksTWcoYixkLGUpLE9nKGIsZCxlLGMpLHFpKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4gQWkoYSxiLGMpO2Nhc2UgMjM6cmV0dXJuIG1pKGEsYixjKTtjYXNlIDI0OnJldHVybiBtaShhLGIsYyl9dGhyb3cgRXJyb3IoeSgxNTYsYi50YWcpKTtcbn07ZnVuY3Rpb24gaWsoYSxiLGMsZCl7dGhpcy50YWc9YTt0aGlzLmtleT1jO3RoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGw7dGhpcy5pbmRleD0wO3RoaXMucmVmPW51bGw7dGhpcy5wZW5kaW5nUHJvcHM9Yjt0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbDt0aGlzLm1vZGU9ZDt0aGlzLmZsYWdzPTA7dGhpcy5sYXN0RWZmZWN0PXRoaXMuZmlyc3RFZmZlY3Q9dGhpcy5uZXh0RWZmZWN0PW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIG5oKGEsYixjLGQpe3JldHVybiBuZXcgaWsoYSxiLGMsZCl9ZnVuY3Rpb24gamkoYSl7YT1hLnByb3RvdHlwZTtyZXR1cm4hKCFhfHwhYS5pc1JlYWN0Q29tcG9uZW50KX1cbmZ1bmN0aW9uIGhrKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBqaShhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09QWEpcmV0dXJuIDExO2lmKGE9PT1EYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBUZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPW5oKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMubmV4dEVmZmVjdD1udWxsLGMuZmlyc3RFZmZlY3Q9bnVsbCxjLmxhc3RFZmZlY3Q9bnVsbCk7Yy5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcztjLmxhbmVzPWEubGFuZXM7Yy5jaGlsZD1hLmNoaWxkO2MubWVtb2l6ZWRQcm9wcz1hLm1lbW9pemVkUHJvcHM7Yy5tZW1vaXplZFN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtjLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWU7Yj1hLmRlcGVuZGVuY2llcztjLmRlcGVuZGVuY2llcz1udWxsPT09Yj9udWxsOntsYW5lczpiLmxhbmVzLGZpcnN0Q29udGV4dDpiLmZpcnN0Q29udGV4dH07XG5jLnNpYmxpbmc9YS5zaWJsaW5nO2MuaW5kZXg9YS5pbmRleDtjLnJlZj1hLnJlZjtyZXR1cm4gY31cbmZ1bmN0aW9uIFZnKGEsYixjLGQsZSxmKXt2YXIgZz0yO2Q9YTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlqaShhKSYmKGc9MSk7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpZz01O2Vsc2UgYTpzd2l0Y2goYSl7Y2FzZSB1YTpyZXR1cm4gWGcoYy5jaGlsZHJlbixlLGYsYik7Y2FzZSBIYTpnPTg7ZXw9MTY7YnJlYWs7Y2FzZSB3YTpnPTg7ZXw9MTticmVhaztjYXNlIHhhOnJldHVybiBhPW5oKDEyLGMsYixlfDgpLGEuZWxlbWVudFR5cGU9eGEsYS50eXBlPXhhLGEubGFuZXM9ZixhO2Nhc2UgQmE6cmV0dXJuIGE9bmgoMTMsYyxiLGUpLGEudHlwZT1CYSxhLmVsZW1lbnRUeXBlPUJhLGEubGFuZXM9ZixhO2Nhc2UgQ2E6cmV0dXJuIGE9bmgoMTksYyxiLGUpLGEuZWxlbWVudFR5cGU9Q2EsYS5sYW5lcz1mLGE7Y2FzZSBJYTpyZXR1cm4gdmkoYyxlLGYsYik7Y2FzZSBKYTpyZXR1cm4gYT1uaCgyNCxjLGIsZSksYS5lbGVtZW50VHlwZT1KYSxhLmxhbmVzPWYsYTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBhJiZudWxsIT09YSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSB5YTpnPTEwO2JyZWFrIGE7Y2FzZSB6YTpnPTk7YnJlYWsgYTtjYXNlIEFhOmc9MTE7YnJlYWsgYTtjYXNlIERhOmc9MTQ7YnJlYWsgYTtjYXNlIEVhOmc9MTY7ZD1udWxsO2JyZWFrIGE7Y2FzZSBGYTpnPTIyO2JyZWFrIGF9dGhyb3cgRXJyb3IoeSgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1uaChnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIFhnKGEsYixjLGQpe2E9bmgoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHZpKGEsYixjLGQpe2E9bmgoMjMsYSxkLGIpO2EuZWxlbWVudFR5cGU9SWE7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIFVnKGEsYixjKXthPW5oKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIFdnKGEsYixjKXtiPW5oKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gamsoYSxiLGMpe3RoaXMudGFnPWI7dGhpcy5jb250YWluZXJJbmZvPWE7dGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5oeWRyYXRlPWM7dGhpcy5jYWxsYmFja05vZGU9bnVsbDt0aGlzLmNhbGxiYWNrUHJpb3JpdHk9MDt0aGlzLmV2ZW50VGltZXM9WmMoMCk7dGhpcy5leHBpcmF0aW9uVGltZXM9WmMoLTEpO3RoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5maW5pc2hlZExhbmVzPXRoaXMubXV0YWJsZVJlYWRMYW5lcz10aGlzLmV4cGlyZWRMYW5lcz10aGlzLnBpbmdlZExhbmVzPXRoaXMuc3VzcGVuZGVkTGFuZXM9dGhpcy5wZW5kaW5nTGFuZXM9MDt0aGlzLmVudGFuZ2xlbWVudHM9WmMoMCk7dGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9XG5mdW5jdGlvbiBrayhhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnRhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gbGsoYSxiLGMsZCl7dmFyIGU9Yi5jdXJyZW50LGY9SGcoKSxnPUlnKGUpO2E6aWYoYyl7Yz1jLl9yZWFjdEludGVybmFscztiOntpZihaYihjKSE9PWN8fDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDE3MCkpO3ZhciBoPWM7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aD1oLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGI7Y2FzZSAxOmlmKEZmKGgudHlwZSkpe2g9aC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYn19aD1oLnJldHVybn13aGlsZShudWxsIT09aCk7dGhyb3cgRXJyb3IoeSgxNzEpKTt9aWYoMT09PWMudGFnKXt2YXIgaz1jLnR5cGU7aWYoRmYoaykpe2M9SWYoYyxrLGgpO2JyZWFrIGF9fWM9aH1lbHNlIGM9Q2Y7bnVsbD09PWIuY29udGV4dD9iLmNvbnRleHQ9YzpiLnBlbmRpbmdDb250ZXh0PWM7Yj16ZyhmLGcpO2IucGF5bG9hZD17ZWxlbWVudDphfTtkPXZvaWQgMD09PWQ/bnVsbDpkO251bGwhPT1cbmQmJihiLmNhbGxiYWNrPWQpO0FnKGUsYik7SmcoZSxnLGYpO3JldHVybiBnfWZ1bmN0aW9uIG1rKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gbmsoYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIG9rKGEsYil7bmsoYSxiKTsoYT1hLmFsdGVybmF0ZSkmJm5rKGEsYil9ZnVuY3Rpb24gcGsoKXtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIHFrKGEsYixjKXt2YXIgZD1udWxsIT1jJiZudWxsIT1jLmh5ZHJhdGlvbk9wdGlvbnMmJmMuaHlkcmF0aW9uT3B0aW9ucy5tdXRhYmxlU291cmNlc3x8bnVsbDtjPW5ldyBqayhhLGIsbnVsbCE9YyYmITA9PT1jLmh5ZHJhdGUpO2I9bmgoMyxudWxsLG51bGwsMj09PWI/NzoxPT09Yj8zOjApO2MuY3VycmVudD1iO2Iuc3RhdGVOb2RlPWM7eGcoYik7YVtmZl09Yy5jdXJyZW50O2NmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspe2I9ZFthXTt2YXIgZT1iLl9nZXRWZXJzaW9uO2U9ZShiLl9zb3VyY2UpO251bGw9PWMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT9jLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W2IsZV06Yy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2goYixlKX10aGlzLl9pbnRlcm5hbFJvb3Q9Y31cbnFrLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7bGsoYSx0aGlzLl9pbnRlcm5hbFJvb3QsbnVsbCxudWxsKX07cWsucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9pbnRlcm5hbFJvb3QsYj1hLmNvbnRhaW5lckluZm87bGsobnVsbCxhLG51bGwsZnVuY3Rpb24oKXtiW2ZmXT1udWxsfSl9O2Z1bmN0aW9uIHJrKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1cbmZ1bmN0aW9uIHNrKGEsYil7Ynx8KGI9YT85PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLmZpcnN0Q2hpbGQ6bnVsbCxiPSEoIWJ8fDEhPT1iLm5vZGVUeXBlfHwhYi5oYXNBdHRyaWJ1dGUoXCJkYXRhLXJlYWN0cm9vdFwiKSkpO2lmKCFiKWZvcih2YXIgYztjPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGMpO3JldHVybiBuZXcgcWsoYSwwLGI/e2h5ZHJhdGU6ITB9OnZvaWQgMCl9XG5mdW5jdGlvbiB0ayhhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPW1rKGcpO2guY2FsbChhKX19bGsoYixnLGEsZSl9ZWxzZXtmPWMuX3JlYWN0Um9vdENvbnRhaW5lcj1zayhjLGQpO2c9Zi5faW50ZXJuYWxSb290O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaz1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1tayhnKTtrLmNhbGwoYSl9fVhqKGZ1bmN0aW9uKCl7bGsoYixnLGEsZSl9KX1yZXR1cm4gbWsoZyl9ZWM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKTtKZyhhLDQsYik7b2soYSw0KX19O2ZjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPUhnKCk7SmcoYSw2NzEwODg2NCxiKTtvayhhLDY3MTA4ODY0KX19O1xuZ2M9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKSxjPUlnKGEpO0pnKGEsYyxiKTtvayhhLGMpfX07aGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYigpfTtcbnliPWZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYil7Y2FzZSBcImlucHV0XCI6YWIoYSxjKTtiPWMubmFtZTtpZihcInJhZGlvXCI9PT1jLnR5cGUmJm51bGwhPWIpe2ZvcihjPWE7Yy5wYXJlbnROb2RlOyljPWMucGFyZW50Tm9kZTtjPWMucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9XCIrSlNPTi5zdHJpbmdpZnkoXCJcIitiKSsnXVt0eXBlPVwicmFkaW9cIl0nKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdO2lmKGQhPT1hJiZkLmZvcm09PT1hLmZvcm0pe3ZhciBlPURiKGQpO2lmKCFlKXRocm93IEVycm9yKHkoOTApKTtXYShkKTthYihkLGUpfX19YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYSxjKTticmVhaztjYXNlIFwic2VsZWN0XCI6Yj1jLnZhbHVlLG51bGwhPWImJmZiKGEsISFjLm11bHRpcGxlLGIsITEpfX07R2I9V2o7XG5IYj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPVg7WHw9NDt0cnl7cmV0dXJuIGdnKDk4LGEuYmluZChudWxsLGIsYyxkLGUpKX1maW5hbGx5e1g9ZiwwPT09WCYmKHdqKCksaWcoKSl9fTtJYj1mdW5jdGlvbigpezA9PT0oWCY0OSkmJihWaigpLE9qKCkpfTtKYj1mdW5jdGlvbihhLGIpe3ZhciBjPVg7WHw9Mjt0cnl7cmV0dXJuIGEoYil9ZmluYWxseXtYPWMsMD09PVgmJih3aigpLGlnKCkpfX07ZnVuY3Rpb24gdWsoYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4ga2soYSxiLG51bGwsYyl9dmFyIHZrPXtFdmVudHM6W0NiLHVlLERiLEViLEZiLE9qLHtjdXJyZW50OiExfV19LHdrPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp3YyxidW5kbGVUeXBlOjAsdmVyc2lvbjpcIjE3LjAuMVwiLHJlbmRlcmVyUGFja2FnZU5hbWU6XCJyZWFjdC1kb21cIn07XG52YXIgeGs9e2J1bmRsZVR5cGU6d2suYnVuZGxlVHlwZSx2ZXJzaW9uOndrLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTp3ay5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOndrLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oYSl7YT1jYyhhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6d2suZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fFxucGssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbH07aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciB5az1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXlrLmlzRGlzYWJsZWQmJnlrLnN1cHBvcnRzRmliZXIpdHJ5e0xmPXlrLmluamVjdCh4ayksTWY9eWt9Y2F0Y2goYSl7fX1leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXZrO2V4cG9ydHMuY3JlYXRlUG9ydGFsPXVrO1xuZXhwb3J0cy5maW5kRE9NTm9kZT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKDE9PT1hLm5vZGVUeXBlKXJldHVybiBhO3ZhciBiPWEuX3JlYWN0SW50ZXJuYWxzO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcih5KDE4OCkpO3Rocm93IEVycm9yKHkoMjY4LE9iamVjdC5rZXlzKGEpKSk7fWE9Y2MoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhLGIpe3ZhciBjPVg7aWYoMCE9PShjJjQ4KSlyZXR1cm4gYShiKTtYfD0xO3RyeXtpZihhKXJldHVybiBnZyg5OSxhLmJpbmQobnVsbCxiKSl9ZmluYWxseXtYPWMsaWcoKX19O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIXJrKGIpKXRocm93IEVycm9yKHkoMjAwKSk7cmV0dXJuIHRrKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMucmVuZGVyPWZ1bmN0aW9uKGEsYixjKXtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4gdGsobnVsbCxhLGIsITEsYyl9O2V4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihhKXtpZighcmsoYSkpdGhyb3cgRXJyb3IoeSg0MCkpO3JldHVybiBhLl9yZWFjdFJvb3RDb250YWluZXI/KFhqKGZ1bmN0aW9uKCl7dGsobnVsbCxudWxsLGEsITEsZnVuY3Rpb24oKXthLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbDthW2ZmXT1udWxsfSl9KSwhMCk6ITF9O2V4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9V2o7ZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdWsoYSxiLDI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsKX07XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFyayhjKSl0aHJvdyBFcnJvcih5KDIwMCkpO2lmKG51bGw9PWF8fHZvaWQgMD09PWEuX3JlYWN0SW50ZXJuYWxzKXRocm93IEVycm9yKHkoMzgpKTtyZXR1cm4gdGsoYSxiLGMsITEsZCl9O2V4cG9ydHMudmVyc2lvbj1cIjE3LjAuMVwiO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///4448
/** @license React v0.20.1
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var f, g, h, k;
if ("object" === typeof performance && "function" === typeof performance.now) {
var l = performance;
exports.unstable_now = function() {
return l.now()
}
} else {
var p = Date,
q = p.now();
exports.unstable_now = function() {
return p.now() - q
}
}
if ("undefined" === typeof window || "function" !== typeof MessageChannel) {
var t = null,
u = null,
w = function() {
if (null !== t) try {
var a = exports.unstable_now();
t(!0, a);
t = null
} catch (b) {
throw setTimeout(w, 0), b;
}
};
f = function(a) {
null !== t ? setTimeout(f, 0, a) : (t = a, setTimeout(w, 0))
};
g = function(a, b) {
u = setTimeout(a, b)
};
h = function() {
clearTimeout(u)
};
exports.unstable_shouldYield = function() {
return !1
};
k = exports.unstable_forceFrameRate = function() {}
} else {
var x = window.setTimeout,
y = window.clearTimeout;
if ("undefined" !== typeof console) {
var z =
window.cancelAnimationFrame;
"function" !== typeof window.requestAnimationFrame && console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
"function" !== typeof z && console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")
}
var A = !1,
B = null,
C = -1,
D = 5,
E = 0;
exports.unstable_shouldYield = function() {
return exports.unstable_now() >=
E
};
k = function() {};
exports.unstable_forceFrameRate = function(a) {
0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : D = 0 < a ? Math.floor(1E3 / a) : 5
};
var F = new MessageChannel,
G = F.port2;
F.port1.onmessage = function() {
if (null !== B) {
var a = exports.unstable_now();
E = a + D;
try {
B(!0, a) ? G.postMessage(null) : (A = !1, B = null)
} catch (b) {
throw G.postMessage(null), b;
}
} else A = !1
};
f = function(a) {
B = a;
A || (A = !0, G.postMessage(null))
};
g = function(a, b) {
C =
x(function() {
a(exports.unstable_now())
}, b)
};
h = function() {
y(C);
C = -1
}
}
function H(a, b) {
var c = a.length;
a.push(b);
a: for (;;) {
var d = c - 1 >>> 1,
e = a[d];
if (void 0 !== e && 0 < I(e, b)) a[d] = b, a[c] = e, c = d;
else break a
}
}
function J(a) {
a = a[0];
return void 0 === a ? null : a
}
function K(a) {
var b = a[0];
if (void 0 !== b) {
var c = a.pop();
if (c !== b) {
a[0] = c;
a: for (var d = 0, e = a.length; d < e;) {
var m = 2 * (d + 1) - 1,
n = a[m],
v = m + 1,
r = a[v];
if (void 0 !== n && 0 > I(n, c)) void 0 !== r && 0 > I(r, n) ? (a[d] = r, a[v] = c, d = v) : (a[d] = n, a[m] = c, d = m);
else if (void 0 !== r && 0 > I(r, c)) a[d] = r, a[v] = c, d = v;
else break a
}
}
return b
}
return null
}
function I(a, b) {
var c = a.sortIndex - b.sortIndex;
return 0 !== c ? c : a.id - b.id
}
var L = [],
M = [],
N = 1,
O = null,
P = 3,
Q = !1,
R = !1,
S = !1;
function T(a) {
for (var b = J(M); null !== b;) {
if (null === b.callback) K(M);
else if (b.startTime <= a) K(M), b.sortIndex = b.expirationTime, H(L, b);
else break;
b = J(M)
}
}
function U(a) {
S = !1;
T(a);
if (!R)
if (null !== J(L)) R = !0, f(V);
else {
var b = J(M);
null !== b && g(U, b.startTime - a)
}
}
function V(a, b) {
R = !1;
S && (S = !1, h());
Q = !0;
var c = P;
try {
T(b);
for (O = J(L); null !== O && (!(O.expirationTime > b) || a && !exports.unstable_shouldYield());) {
var d = O.callback;
if ("function" === typeof d) {
O.callback = null;
P = O.priorityLevel;
var e = d(O.expirationTime <= b);
b = exports.unstable_now();
"function" === typeof e ? O.callback = e : O === J(L) && K(L);
T(b)
} else K(L);
O = J(L)
}
if (null !== O) var m = !0;
else {
var n = J(M);
null !== n && g(U, n.startTime - b);
m = !1
}
return m
} finally {
O = null, P = c, Q = !1
}
}
var W = k;
exports.unstable_IdlePriority = 5;
exports.unstable_ImmediatePriority = 1;
exports.unstable_LowPriority = 4;
exports.unstable_NormalPriority = 3;
exports.unstable_Profiling = null;
exports.unstable_UserBlockingPriority = 2;
exports.unstable_cancelCallback = function(a) {
a.callback = null
};
exports.unstable_continueExecution = function() {
R || Q || (R = !0, f(V))
};
exports.unstable_getCurrentPriorityLevel = function() {
return P
};
exports.unstable_getFirstCallbackNode = function() {
return J(L)
};
exports.unstable_next = function(a) {
switch (P) {
case 1:
case 2:
case 3:
var b = 3;
break;
default:
b = P
}
var c = P;
P = b;
try {
return a()
} finally {
P = c
}
};
exports.unstable_pauseExecution = function() {};
exports.unstable_requestPaint = W;
exports.unstable_runWithPriority = function(a, b) {
switch (a) {
case 1:
case 2:
case 3:
case 4:
case 5:
break;
default:
a = 3
}
var c = P;
P = a;
try {
return b()
} finally {
P = c
}
};
exports.unstable_scheduleCallback = function(a, b, c) {
var d = exports.unstable_now();
"object" === typeof c && null !== c ? (c = c.delay, c = "number" === typeof c && 0 < c ? d + c : d) : c = d;
switch (a) {
case 1:
var e = -1;
break;
case 2:
e = 250;
break;
case 5:
e = 1073741823;
break;
case 4:
e = 1E4;
break;
default:
e = 5E3
}
e = c + e;
a = {
id: N++,
callback: b,
priorityLevel: a,
startTime: c,
expirationTime: e,
sortIndex: -1
};
c > d ? (a.sortIndex = c, H(M, a), null === J(L) && a === J(M) && (S ? h() : S = !0, g(U, c - d))) : (a.sortIndex = e, H(L, a), R || Q || (R = !0, f(V)));
return a
};
exports.unstable_wrapCallback = function(a) {
var b = P;
return function() {
var c = P;
P = b;
try {
return a.apply(this, arguments)
} finally {
P = c
}
}
};
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanM/ZmIwNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2EsWUFBWSx1RUFBdUUsa0JBQWtCLG9CQUFvQixZQUFZLGdCQUFnQixLQUFLLHFCQUFxQixvQkFBb0IsWUFBWTtBQUM1TixvRUFBb0UsK0JBQStCLGdCQUFnQiw2QkFBNkIsUUFBUSxPQUFPLFNBQVMsMkJBQTJCLGNBQWMsa0RBQWtELGdCQUFnQixtQkFBbUIsYUFBYSxpQkFBaUIsNEJBQTRCLFlBQVksVUFBVSxFQUFFLCtCQUErQixjQUFjLEtBQUssOENBQThDLGlDQUFpQztBQUN6Ziw0QkFBNEIsc05BQXNOLDBMQUEwTCw2QkFBNkIsNEJBQTRCLFlBQVk7QUFDamYsR0FBRyxlQUFlLCtCQUErQixhQUFhLHVLQUF1SyxtQ0FBbUMsNkJBQTZCLGFBQWEsNkJBQTZCLE1BQU0sSUFBSSwwQ0FBMEMsU0FBUyw4QkFBOEIsV0FBVyxjQUFjLElBQUksK0JBQStCLGdCQUFnQjtBQUN0ZixhQUFhLDBCQUEwQixLQUFLLGFBQWEsS0FBSyxNQUFNLGdCQUFnQixlQUFlLFVBQVUsUUFBUSxFQUFFLHFCQUFxQiwwQ0FBMEMsY0FBYyxjQUFjLE9BQU87QUFDek4sY0FBYyxXQUFXLGVBQWUsY0FBYyxVQUFVLE9BQU8seUJBQXlCLElBQUksRUFBRSxvQ0FBb0MscUZBQXFGLCtDQUErQyxjQUFjLFNBQVMsWUFBWSxnQkFBZ0IsOEJBQThCLHlCQUF5QjtBQUN4WCxjQUFjLGVBQWUsU0FBUyxFQUFFLDBCQUEwQixnRUFBZ0UsV0FBVyxRQUFRLGNBQWMsS0FBSyxLQUFLLCtCQUErQixLQUFLLFdBQVc7QUFDNU4sZ0JBQWdCLEtBQUssY0FBYyxLQUFLLFFBQVEsSUFBSSxLQUFLLFdBQVcsc0VBQXNFLEVBQUUsaUJBQWlCLDBCQUEwQixnQkFBZ0Isa0JBQWtCLDZCQUE2Qix5QkFBeUIsa0RBQWtELEtBQUssVUFBVSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsNkJBQTZCLEtBQUssU0FBUyxRQUFRLGlCQUFpQixRQUFRLDZCQUE2QjtBQUNyZSxrQ0FBa0MsR0FBRyw0QkFBNEIsR0FBRywrQkFBK0IsR0FBRywwQkFBMEIsTUFBTSxxQ0FBcUMsR0FBRywrQkFBK0IsYUFBYSxpQkFBaUIsa0NBQWtDLFlBQVksbUJBQW1CLHdDQUF3QyxZQUFZLFVBQVUscUNBQXFDLFlBQVk7QUFDM1oscUJBQXFCLGFBQWEsVUFBVSw2QkFBNkIsTUFBTSxZQUFZLFFBQVEsSUFBSSxJQUFJLFdBQVcsUUFBUSxNQUFNLCtCQUErQixjQUFjLDZCQUE2QixHQUFHLGdDQUFnQyxlQUFlLFVBQVUseUNBQXlDLFlBQVksUUFBUSxJQUFJLElBQUksV0FBVyxRQUFRO0FBQ2xXLGlDQUFpQyxpQkFBaUIsNkJBQTZCLCtFQUErRSxVQUFVLGdCQUFnQixNQUFNLGFBQWEsTUFBTSxvQkFBb0IsTUFBTSxhQUFhLE1BQU0sY0FBYyxNQUFNLEdBQUcsNkVBQTZFLGlIQUFpSDtBQUNuZCw2QkFBNkIsYUFBYSxRQUFRLGtCQUFrQixRQUFRLElBQUksSUFBSSwrQkFBK0IsUUFBUSIsImZpbGUiOiI1My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MC4yMC4xXG4gKiBzY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBmLGcsaCxrO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgcGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3cpe3ZhciBsPXBlcmZvcm1hbmNlO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCl9fWVsc2V7dmFyIHA9RGF0ZSxxPXAubm93KCk7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcC5ub3coKS1xfX1cbmlmKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93fHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgTWVzc2FnZUNoYW5uZWwpe3ZhciB0PW51bGwsdT1udWxsLHc9ZnVuY3Rpb24oKXtpZihudWxsIT09dCl0cnl7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTt0KCEwLGEpO3Q9bnVsbH1jYXRjaChiKXt0aHJvdyBzZXRUaW1lb3V0KHcsMCksYjt9fTtmPWZ1bmN0aW9uKGEpe251bGwhPT10P3NldFRpbWVvdXQoZiwwLGEpOih0PWEsc2V0VGltZW91dCh3LDApKX07Zz1mdW5jdGlvbihhLGIpe3U9c2V0VGltZW91dChhLGIpfTtoPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHUpfTtleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2s9ZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbigpe319ZWxzZXt2YXIgeD13aW5kb3cuc2V0VGltZW91dCx5PXdpbmRvdy5jbGVhclRpbWVvdXQ7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjb25zb2xlKXt2YXIgej1cbndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZTtcImZ1bmN0aW9uXCIhPT10eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzXCIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiB6JiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjYW5jZWxBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxsc1wiKX12YXIgQT0hMSxCPW51bGwsQz0tMSxEPTUsRT0wO2V4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKT49XG5FfTtrPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGEpezA+YXx8MTI1PGE/Y29uc29sZS5lcnJvcihcImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZFwiKTpEPTA8YT9NYXRoLmZsb29yKDFFMy9hKTo1fTt2YXIgRj1uZXcgTWVzc2FnZUNoYW5uZWwsRz1GLnBvcnQyO0YucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PUIpe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7RT1hK0Q7dHJ5e0IoITAsYSk/Ry5wb3N0TWVzc2FnZShudWxsKTooQT0hMSxCPW51bGwpfWNhdGNoKGIpe3Rocm93IEcucG9zdE1lc3NhZ2UobnVsbCksYjt9fWVsc2UgQT0hMX07Zj1mdW5jdGlvbihhKXtCPWE7QXx8KEE9ITAsRy5wb3N0TWVzc2FnZShudWxsKSl9O2c9ZnVuY3Rpb24oYSxiKXtDPVxueChmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfTtoPWZ1bmN0aW9uKCl7eShDKTtDPS0xfX1mdW5jdGlvbiBIKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDs7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZih2b2lkIDAhPT1lJiYwPEkoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIEooYSl7YT1hWzBdO3JldHVybiB2b2lkIDA9PT1hP251bGw6YX1cbmZ1bmN0aW9uIEsoYSl7dmFyIGI9YVswXTtpZih2b2lkIDAhPT1iKXt2YXIgYz1hLnBvcCgpO2lmKGMhPT1iKXthWzBdPWM7YTpmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTspe3ZhciBtPTIqKGQrMSktMSxuPWFbbV0sdj1tKzEscj1hW3ZdO2lmKHZvaWQgMCE9PW4mJjA+SShuLGMpKXZvaWQgMCE9PXImJjA+SShyLG4pPyhhW2RdPXIsYVt2XT1jLGQ9dik6KGFbZF09bixhW21dPWMsZD1tKTtlbHNlIGlmKHZvaWQgMCE9PXImJjA+SShyLGMpKWFbZF09cixhW3ZdPWMsZD12O2Vsc2UgYnJlYWsgYX19cmV0dXJuIGJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSShhLGIpe3ZhciBjPWEuc29ydEluZGV4LWIuc29ydEluZGV4O3JldHVybiAwIT09Yz9jOmEuaWQtYi5pZH12YXIgTD1bXSxNPVtdLE49MSxPPW51bGwsUD0zLFE9ITEsUj0hMSxTPSExO1xuZnVuY3Rpb24gVChhKXtmb3IodmFyIGI9SihNKTtudWxsIT09Yjspe2lmKG51bGw9PT1iLmNhbGxiYWNrKUsoTSk7ZWxzZSBpZihiLnN0YXJ0VGltZTw9YSlLKE0pLGIuc29ydEluZGV4PWIuZXhwaXJhdGlvblRpbWUsSChMLGIpO2Vsc2UgYnJlYWs7Yj1KKE0pfX1mdW5jdGlvbiBVKGEpe1M9ITE7VChhKTtpZighUilpZihudWxsIT09SihMKSlSPSEwLGYoVik7ZWxzZXt2YXIgYj1KKE0pO251bGwhPT1iJiZnKFUsYi5zdGFydFRpbWUtYSl9fVxuZnVuY3Rpb24gVihhLGIpe1I9ITE7UyYmKFM9ITEsaCgpKTtRPSEwO3ZhciBjPVA7dHJ5e1QoYik7Zm9yKE89SihMKTtudWxsIT09TyYmKCEoTy5leHBpcmF0aW9uVGltZT5iKXx8YSYmIWV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQoKSk7KXt2YXIgZD1PLmNhbGxiYWNrO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXtPLmNhbGxiYWNrPW51bGw7UD1PLnByaW9yaXR5TGV2ZWw7dmFyIGU9ZChPLmV4cGlyYXRpb25UaW1lPD1iKTtiPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/Ty5jYWxsYmFjaz1lOk89PT1KKEwpJiZLKEwpO1QoYil9ZWxzZSBLKEwpO089SihMKX1pZihudWxsIT09Tyl2YXIgbT0hMDtlbHNle3ZhciBuPUooTSk7bnVsbCE9PW4mJmcoVSxuLnN0YXJ0VGltZS1iKTttPSExfXJldHVybiBtfWZpbmFsbHl7Tz1udWxsLFA9YyxRPSExfX12YXIgVz1rO2V4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7ZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eT00O2V4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MztleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2V4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGEpe2EuY2FsbGJhY2s9bnVsbH07ZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe1J8fFF8fChSPSEwLGYoVikpfTtleHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFB9O2V4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gSihMKX07XG5leHBvcnRzLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oYSl7c3dpdGNoKFApe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBiPTM7YnJlYWs7ZGVmYXVsdDpiPVB9dmFyIGM9UDtQPWI7dHJ5e3JldHVybiBhKCl9ZmluYWxseXtQPWN9fTtleHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludD1XO2V4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDphPTN9dmFyIGM9UDtQPWE7dHJ5e3JldHVybiBiKCl9ZmluYWxseXtQPWN9fTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcIm9iamVjdFwiPT09dHlwZW9mIGMmJm51bGwhPT1jPyhjPWMuZGVsYXksYz1cIm51bWJlclwiPT09dHlwZW9mIGMmJjA8Yz9kK2M6ZCk6Yz1kO3N3aXRjaChhKXtjYXNlIDE6dmFyIGU9LTE7YnJlYWs7Y2FzZSAyOmU9MjUwO2JyZWFrO2Nhc2UgNTplPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0OmU9MUU0O2JyZWFrO2RlZmF1bHQ6ZT01RTN9ZT1jK2U7YT17aWQ6TisrLGNhbGxiYWNrOmIscHJpb3JpdHlMZXZlbDphLHN0YXJ0VGltZTpjLGV4cGlyYXRpb25UaW1lOmUsc29ydEluZGV4Oi0xfTtjPmQ/KGEuc29ydEluZGV4PWMsSChNLGEpLG51bGw9PT1KKEwpJiZhPT09SihNKSYmKFM/aCgpOlM9ITAsZyhVLGMtZCkpKTooYS5zb3J0SW5kZXg9ZSxIKEwsYSksUnx8UXx8KFI9ITAsZihWKSkpO3JldHVybiBhfTtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPVA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9UDtQPWI7dHJ5e3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e1A9Y319fTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///53
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/variables/constants.js
var CONSTANTS = {
HASH_CHAR_LIMIT: 50,
CLASSES: {
HIDDEN: 'is-hidden',
ACTIVE: 'is-active',
CURRENT: 'is-current',
FOCUSED: 'is-focused',
ERROR: 'is-error',
OPEN: 'is-open',
DISABLED: 'is-disabled',
HAS_ERROR: 'has-error'
},
KEYBOARD: {
BACKSPACE: 8,
TAB: 9,
ENTER: 13,
ESCAPE: 27,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
DELETE: 46,
FORWARD_SLASH: 191
},
ATTRIBUTES: {
DISABLED: 'disabled',
READONLY: 'readonly',
REQUIRED: 'required',
MAX: 'max',
MIN: 'min'
},
BREAKPOINTS: {
XSM: 0,
SM: 480,
MD: 680,
LG: 970,
XL: 1170,
XXL: 1600
}
};; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/debounce.js
/**
* debounce - Debounce helper method
* Based on https://github.com/rhysbrettbowen/debounce/blob/master/debounce.js
*
* @param {Function} func target function to be called
* @param {string} wait wait time after the last call of target function before it is called
* @return {Function}
*/
function debounce(func, wait) {
// we need to save these in the closure
var timeout, args, context, timestamp;
return function() {
var _debouncedFunc, last; // save details of latest call
context = this;
args = [].slice.call(arguments, 0);
timestamp = new Date(); // this is where the magic happens
_debouncedFunc = function debouncedFunc() {
// how long ago was the last call
last = new Date() - timestamp; // if the latest call was less that the wait period ago
// then we reset the timeout to wait for the difference
if (last < wait) {
timeout = setTimeout(_debouncedFunc, wait - last);
} else {
// or if not we can null out the timer and run the latest
timeout = null;
func.apply(context, args);
}
}; // we only need to set the timer now if one isn't already running
if (!timeout) {
timeout = setTimeout(_debouncedFunc, wait);
}
};
}; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/restrictFocus.js
function set(namespace, $container) {
var eventType = 'focusin.' + namespace;
$container.attr('tabindex', '0');
$(document).on(eventType, function(event) {
if (!$container[0].contains(event.target)) {
event.stopPropagation();
$container.focus();
}
});
}
function unset(namespace, $container) {
var eventType = 'focusin.' + namespace;
$container.attr('tabindex', '-1');
$(document).off(eventType);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/corp-site/search/search-form-component/clientlib/src/js/search-form-component.js
// type ahead keys
var KEYCODE_TAB = CONSTANTS.KEYBOARD.TAB;
var KEYCODE_ENTER = CONSTANTS.KEYBOARD.ENTER;
var KEYCODE_ESCAPE = CONSTANTS.KEYBOARD.ESCAPE;
var KEYCODE_UP = CONSTANTS.KEYBOARD.UP;
var KEYCODE_DOWN = CONSTANTS.KEYBOARD.DOWN; // type ahead classes and states
var CLASS_WRAPPER = '.js-search-form-input-wrap';
var CLASS_INPUT = '.js-search-form-input';
var CLASS_TYPEAHEAD = '.search-typeahead';
var IS_RESULTS_PAGE = $('.wrapper-body').hasClass('has-search-results');
var CHAR_THRESHOLD = 3;
var AUTO_SUGGEST_DEBOUNCE_WAIT = 200; // search drawer classes
var CLASS_DRAWER_OPEN = 'is-open';
var CLASS_NO_SCROLL = 'no-scroll'; // search drawer view elements
var CLASS_CTA_SEARCH_OPEN = 'cta-search-form-open';
var CLASS_CTA_SEARCH_CLOSE = 'cta-search-form-close';
var CLASS_CTA_SEARCH_OVERLAYS = 'search-overlay';
var $body = $('body'); // List holding instance level global data for all instances
var _instancesData = [];
/**
* _updateTypeahead - takes data from the suggestions api and updates the dom with results as
* well as making the typeahead visible.
*
* @param {object} data object containing raw results from the api
* @param {object} $input jQuery object representing the current input in use.
*/
function _updateTypeahead(data, $input) {
if (data && data.results && data.results.length) {
var resultsList = data.results;
var $typeahead = $input.siblings(CLASS_TYPEAHEAD);
var formAction = $input.parents('form').attr('action');
var listHtml = '';
for (var i = 0; i < resultsList.length; i++) {
// build the html to add to the dom.
var suggestion = resultsList[i];
var encodedSuggestion = encodeURI(suggestion);
var link = "".concat(formAction, "?q=").concat(encodedSuggestion, "&ref=auto");
listHtml += "<li role=\"option\" aria-selected=\"false\"><a href=\"".concat(link, "\" data-query=\"").concat(suggestion, "\" title=\"Search for ").concat(suggestion, "\">").concat(suggestion, "</a></li>\n");
}
$typeahead.removeClass('is-hidden').attr('aria-expanded', true).find('ul').html(listHtml);
} else {
// if there are no suggestions clear the typeahead ui.
_clearTypeahead($input);
}
}
/**
* _clearTypeahead - clears the typeahead results and hides it.
*
* @param {object} $input jQuery object representing the current input in use.
* @return {Boolean} allow event to propagate.
*/
function _clearTypeahead($input) {
var $typeahead = $input.siblings(CLASS_TYPEAHEAD);
$typeahead.addClass('is-hidden').attr('aria-expanded', false).find('ul').empty();
return true;
}
/**
* _getMatchingSuggestionsList - creates a list of matching suggestions from the data pool
*
* @param {String} inputValue the value of the input as a trimmed string
* @param {Object} $input the $input element jQuery object
* @returns {Array} list of matching suggestions from input query against auto suggest result data pool
*/
function _getMatchingSuggestionsList(inputValue, $input) {
var maxSuggestCount = $input.attr('data-max-suggestions');
var instanceId = parseInt($input.attr('data-instance-id'), 10);
var instanceData = _instancesData[instanceId - 1] || {};
var autoSuggestPoolData = instanceData.autoSuggestData || [];
var matchingSuggestions = [];
for (var i = 0; i < autoSuggestPoolData.length; i++) {
var suggestion = autoSuggestPoolData[i];
if (suggestion.toLowerCase().indexOf(inputValue.trim().toLowerCase()) === 0) {
matchingSuggestions.push(suggestion);
if (matchingSuggestions.length >= maxSuggestCount) {
break;
}
}
}
return matchingSuggestions;
}
/**
* _findSuggestions - makes the request to the suggestions api and acts accordingly through
* callback functions.
*
* @param {String} inputValue the value of the input as a trimmed string.
* @param {object} $input jQuery object representing the current input in use.
*/
function _findSuggestions(inputValue, $input) {
// TODO: update to get suggestion results list from S&P endpoint once the JSON feed is ready
// prep suggestion data for view updates
var suggestionsData = {
results: _getMatchingSuggestionsList(inputValue, $input)
}; // this function cleans up the typeahead if no results are returned or if an error has
// occurred, so no error callback is required.
_updateTypeahead(suggestionsData, $input);
}
/**
* _keyboardNavigation - allows keyboard navigation through and out of the typeahead. this is
* used by functions bound to both the input and the typeahead.
*
* @param {object} $input jQuery object representing the current input in use.
* @param {object} $typeahead jQuery object representing the current typeahead displayed.
* @param {object} event the keydown event
* @return {boolean} prevent default event behaviour
*/
function _keyboardNavigation($input, $typeahead, event) {
var inputIsFocussed = $input.is(':focus');
var $suggestions = $typeahead.find('a');
var numSuggestions = $suggestions.length; // if the input focussed jump to either end of the typeahead suggestions.
if (inputIsFocussed && $.inArray(event.keyCode, [KEYCODE_UP, KEYCODE_DOWN]) > -1) {
var selectIndex = event.keyCode === KEYCODE_DOWN ? 0 : numSuggestions - 1;
_updateSelectedSuggestion($suggestions, selectIndex);
return false; // if the user hits enter on a typeahead suggestion, redirect them to the search results, as
// long as they aren't currently on the results page.
}
if (event.keyCode === KEYCODE_ENTER && !IS_RESULTS_PAGE && !inputIsFocussed) {
window.location = event.currentTarget.href;
return false; // if they are using arrow or tab navigation move them to the next appropriate result.
}
if ($.inArray(event.keyCode, [KEYCODE_TAB, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
var currentIndex = $suggestions.index(event.currentTarget); // go down an index for up arrow or shift-tab, otherwise up.
var indexOffset = event.keyCode === KEYCODE_UP || event.shiftKey && event.keyCode === KEYCODE_TAB ? -1 : 1;
var _selectIndex = currentIndex + indexOffset;
if (_selectIndex === -1 || _selectIndex === numSuggestions) {
// if not an index within the range focus the input
$input.focus();
_updateSelectedSuggestion($suggestions);
} else {
// otherwise navigate the typeahead.
_updateSelectedSuggestion($suggestions, _selectIndex);
}
return false;
}
if (!inputIsFocussed && event.keyCode === KEYCODE_ESCAPE) {
$input.focus();
return _clearTypeahead($input);
}
}
/**
* _updateSelectedSuggestion - update auto suggestion item selected states on view
*
* @param {object} $suggestions jquery collection of all suggestion anchor items
* @param {object} selectIndex current selected item index
* @return {void}
*/
function _updateSelectedSuggestion($suggestions) {
var selectIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
$suggestions.each(function(idx, ele) {
var $suggestion = $(ele);
var $suggestionWrapper = $suggestion.parent('li');
if (idx === selectIndex) {
$suggestion.focus();
$suggestionWrapper.attr('aria-selected', 'true');
} else {
$suggestionWrapper.attr('aria-selected', 'false');
}
});
}
/**
* _inputKeyBindings - monitor keyboard events on the search input and trigger appropriate behaviour.
*
* @param {object} event the keyup event.
*/
function _inputKeyBindings(event) {
var $input = $(event.currentTarget);
var inputValue = event.currentTarget.value.trim(); // prevent arrow keys from keyboard nav from re-rendering the suggestions.
if ($.inArray(event.keyCode, [KEYCODE_ENTER, KEYCODE_TAB, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
return;
}
if (inputValue.length >= CHAR_THRESHOLD) {
// try to provide suggestions in the typeahead dropdown
_findSuggestions(inputValue, $input);
} else {
// clean up and close the typeahead.
return _clearTypeahead($input);
}
}
/**
* _inputNavBindings - allow the user to enter the typeahead using arrow keys.
*
* @param {object} event the keydown event.
* @return {boolean} prevent default behaviour.
*/
function _inputNavBindings(event) {
var $input = $(event.currentTarget);
var $typeahead = $input.siblings(CLASS_TYPEAHEAD); // up and down arrows will enter the typeahead.
if ($.inArray(event.keyCode, [KEYCODE_ESCAPE, KEYCODE_ENTER, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
// if the typeahead isn't visible, don't hijack the keyboard.
if (!$typeahead.is(':visible')) {
return;
} // keyboard navigation into and out of typeahead from input.
return _keyboardNavigation($input, $typeahead, event);
}
}
/**
* _typeaheadKeyBindings - setting up handling of keyboard navigation within the typeahead.
*
* @param {object} event the keydown event.
*/
function _typeaheadKeyBindings(event) {
var $typeahead = $(event.currentTarget).closest(CLASS_TYPEAHEAD);
var $input = $typeahead.siblings(CLASS_INPUT);
return _keyboardNavigation($input, $typeahead, event);
}
/**
* _handleFormSubmission - hijacks the form submission so the query string can be uri encoded
* before being manually redirected to the results page.
*
* @param {object} event the submit event
* @return {boolean} prevent default form submission.
*/
function _handleFormSubmission(event) {
var $form = $(event.target);
var $input = $form.find(CLASS_INPUT);
var query = $input.val().trim();
window.location = "".concat($form.attr('action'), "?q=").concat(encodeURIComponent(query));
return false;
}
/**
* _handleSearchFieldFocusChange - update presentational focus state when search field focus state changes
*
* @param {object} event the focus change events
* @return {void}
*/
function _handleSearchFieldFocusChange(event) {
var $inputWrapper = $(event.target).closest(CLASS_WRAPPER);
if (event.type === 'focus') {
$inputWrapper.addClass(CONSTANTS.CLASSES.FOCUSED);
} else if (event.type === 'blur') {
$inputWrapper.removeClass(CONSTANTS.CLASSES.FOCUSED);
}
}
/**
* _closeTypeaheadOnBlur - dismiss all typeaheads when click out of the search input
*
* @return {boolean} do not prevent propagation.
*/
function _closeTypeaheadOnBlur(event) {
var clickedOutsideSearchForm = !$(event.target).closest(CLASS_WRAPPER).length;
if (clickedOutsideSearchForm) {
$("".concat(CLASS_INPUT, "[data-typeahead=true]")).each(function($element) {
_clearTypeahead($($element));
});
}
return true;
}
/**
* _initTypeahead - set up various event bindings to control the typeahead.
*/
function _initTypeahead() {
$(document) // bind to key events on the inputs.
.on('input', "".concat(CLASS_INPUT, "[data-typeahead=true]"), debounce(_inputKeyBindings, AUTO_SUGGEST_DEBOUNCE_WAIT)).on('keydown', "".concat(CLASS_INPUT, "[data-typeahead=true]"), _inputNavBindings).on('internal-search', "".concat(CLASS_INPUT, "[data-typeahead=true]"), function(e) {
_clearTypeahead($(e.target));
}) // bind key events to the typeahead anchors.
.on('keydown', "".concat(CLASS_TYPEAHEAD, " a"), _typeaheadKeyBindings).on('click', _closeTypeaheadOnBlur);
}
/**
* _bindEvents - bind search form events
*
* Note: this method supports handling per individual search form component instances
*/
function _bindEvents() {
$(CLASS_INPUT).on('blur focus', _handleSearchFieldFocusChange); // TODO: probably need to move 'IS_RESULTS_PAGE' flag into AEM as component config
if (!IS_RESULTS_PAGE) {
// submit search form only if not already on search results page
$(document).on('submit', '.search-form', _handleFormSubmission);
}
}
/**
* _openDrawer - opens up the search drawer.
*/
function _openDrawer(e) {
var $searchWrapper = $(e.target).closest('.header-wrap');
var $searchOverlay = $searchWrapper.find(".".concat(CLASS_CTA_SEARCH_OVERLAYS));
var $searchContainer = $searchOverlay.siblings('.search-form-container');
var $searchinput = $searchContainer.find(CLASS_INPUT);
$searchContainer.addClass(CLASS_DRAWER_OPEN);
$searchinput.focus();
$searchOverlay.addClass(CLASS_DRAWER_OPEN);
$body.addClass(CLASS_NO_SCROLL);
$(".".concat(CLASS_CTA_SEARCH_OPEN)).attr('aria-expanded', true);
set('searchbar', $searchContainer);
}
/**
* _closeDrawer - close the search drawer
*/
function _closeDrawer(e) {
var $searchWrapper = $(e.target).closest('.header-wrap');
var $searchOverlay = $searchWrapper.find(".".concat(CLASS_CTA_SEARCH_OVERLAYS));
var $searchContainer = $searchOverlay.siblings('.search-form-container');
var $searchOpenButton = $searchWrapper.find('.cta-search-form-open');
$searchContainer.removeClass(CLASS_DRAWER_OPEN);
$searchOpenButton.focus();
$searchOverlay.removeClass(CLASS_DRAWER_OPEN);
$body.removeClass(CLASS_NO_SCROLL);
$(".".concat(CLASS_CTA_SEARCH_OPEN)).attr('aria-expanded', false);
unset('searchbar', $searchContainer);
return false;
}
/**
* _initDrawer - set up various bindings to control the search drawer.
*
* Note: this method assumes there's only one instance of search form component that's coupled with top nav
*/
function _initDrawer() {
// if you click on the search button, open the search modal.
$(".".concat(CLASS_CTA_SEARCH_OPEN)).on('click', function(e) {
return _openDrawer(e);
});
$(".".concat(CLASS_CTA_SEARCH_CLOSE)).on('click', function(e) {
return _closeDrawer(e);
});
$(".".concat(CLASS_CTA_SEARCH_OVERLAYS)).on('click', function(e) {
return _closeDrawer(e);
});
}
function _prepInstancesAndData() {
var $allSearchInputs = $(CLASS_INPUT); // Populate instance level global data array for all instances
$allSearchInputs.each(function(idx, ele) {
var $input = $(ele);
var instanceId = idx + 1;
var autoSuggestEndpoint = $input.attr('data-api-base') || '';
var instanceData = {
id: instanceId,
autoSuggestEndpoint: autoSuggestEndpoint,
autoSuggestPromise: null,
autoSuggestData: null
}; // update global instances data list
_instancesData.push(instanceData); // update instance id to view
var autoSuggestListId = "search-form-auto-suggestions-".concat(instanceId);
var $autoSuggestList = $input.closest(CLASS_WRAPPER).find("".concat(CLASS_TYPEAHEAD, " > ul"));
$input.attr({
'data-instance-id': instanceId,
'aria-owns': autoSuggestListId
});
$autoSuggestList.attr('id', autoSuggestListId); // check auto suggest pool endpoint
if (!autoSuggestEndpoint.length) {
console.warn('[SF]', 'Invalid auto suggest data endpoint for instance:', instanceId, autoSuggestEndpoint);
return;
} // check if current instance's endpoint is the same as previous one to save unnecessary remote calls
for (var i = idx; i > 0; i--) {
var previousInstanceIndex = idx - 1;
var previousInstanceData = _instancesData[previousInstanceIndex] || {};
var previousInstanceAutoSuggestEndpoint = previousInstanceData.autoSuggestEndpoint;
if (autoSuggestEndpoint.length && autoSuggestEndpoint === previousInstanceAutoSuggestEndpoint) {
// reference to previous auto suggest request promise if endpoint matches
instanceData.autoSuggestPromise = previousInstanceData.autoSuggestPromise;
}
} // if no same endpoint request found from other instances, create new
if (instanceData.autoSuggestPromise === null) {
instanceData.autoSuggestPromise = $.get(autoSuggestEndpoint);
} // retrieve basic auto suggest results pool data
instanceData.autoSuggestPromise.done(function(dataString) {
if (typeof dataString !== 'string') {
console.warn('[SF]', 'Invalid auto suggest data string:', instanceId, dataString);
return;
} // Note: S&P auto complete data source returns in deprecated JSONP string format,
// need clean-up before parse it
var jsonString = dataString.trim().slice(1, -1);
try {
instanceData.autoSuggestData = JSON.parse(jsonString.trim());
} catch (e) {
instanceData.autoSuggestData = null;
console.warn('[SF]', 'Invalid auto suggest JSON string:', instanceId, jsonString, e);
}
}).fail(function() {
console.warn('[SF]', 'Error getting auto suggest results pool data', instanceId);
});
});
}
function init() {
var _$;
_bindEvents();
_initDrawer(); // update individual instance element DOM and prep instance data
// this will get '_instancesData' list ready
_prepInstancesAndData(); // only init type ahead when all instances have resolve their remote requests
var allInstancesPromises = [];
_instancesData.forEach(function(instanceData) {
if (instanceData.autoSuggestPromise !== null) {
allInstancesPromises.push(instanceData.autoSuggestPromise);
}
});
(_$ = $).when.apply(_$, allInstancesPromises).then(function() {
_initTypeahead();
});
}
$(document).ready(function() {
init();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvdmFyaWFibGVzL2NvbnN0YW50cy5qcz9hZTFjIiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmZyb250ZW5kL3NyYy9tYWluL2dsb2JhbC9qcy9oZWxwZXJzL2RlYm91bmNlLmpzP2QwMTciLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL2hlbHBlcnMvcmVzdHJpY3RGb2N1cy5qcz83M2Q2Iiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL2NvcnAtc2l0ZS9zZWFyY2gvc2VhcmNoLWZvcm0tY29tcG9uZW50L2NsaWVudGxpYi9zcmMvanMvc2VhcmNoLWZvcm0tY29tcG9uZW50LmpzPzE5YjYiXSwibmFtZXMiOlsiQ09OU1RBTlRTIiwiSEFTSF9DSEFSX0xJTUlUIiwiQ0xBU1NFUyIsIkhJRERFTiIsIkFDVElWRSIsIkNVUlJFTlQiLCJGT0NVU0VEIiwiRVJST1IiLCJPUEVOIiwiRElTQUJMRUQiLCJIQVNfRVJST1IiLCJLRVlCT0FSRCIsIkJBQ0tTUEFDRSIsIlRBQiIsIkVOVEVSIiwiRVNDQVBFIiwiTEVGVCIsIlVQIiwiUklHSFQiLCJET1dOIiwiREVMRVRFIiwiRk9SV0FSRF9TTEFTSCIsIkFUVFJJQlVURVMiLCJSRUFET05MWSIsIlJFUVVJUkVEIiwiTUFYIiwiTUlOIiwiQlJFQUtQT0lOVFMiLCJYU00iLCJTTSIsIk1EIiwiTEciLCJYTCIsIlhYTCIsImRlYm91bmNlIiwiZnVuYyIsIndhaXQiLCJ0aW1lb3V0IiwiYXJncyIsImNvbnRleHQiLCJ0aW1lc3RhbXAiLCJkZWJvdW5jZWRGdW5jIiwibGFzdCIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsIkRhdGUiLCJzZXRUaW1lb3V0IiwiYXBwbHkiLCJzZXQiLCJuYW1lc3BhY2UiLCIkY29udGFpbmVyIiwiZXZlbnRUeXBlIiwiYXR0ciIsIiQiLCJkb2N1bWVudCIsIm9uIiwiZXZlbnQiLCJjb250YWlucyIsInRhcmdldCIsInN0b3BQcm9wYWdhdGlvbiIsImZvY3VzIiwidW5zZXQiLCJvZmYiLCJLRVlDT0RFX1RBQiIsIktFWUNPREVfRU5URVIiLCJLRVlDT0RFX0VTQ0FQRSIsIktFWUNPREVfVVAiLCJLRVlDT0RFX0RPV04iLCJDTEFTU19XUkFQUEVSIiwiQ0xBU1NfSU5QVVQiLCJDTEFTU19UWVBFQUhFQUQiLCJJU19SRVNVTFRTX1BBR0UiLCJoYXNDbGFzcyIsIkNIQVJfVEhSRVNIT0xEIiwiQVVUT19TVUdHRVNUX0RFQk9VTkNFX1dBSVQiLCJDTEFTU19EUkFXRVJfT1BFTiIsIkNMQVNTX05PX1NDUk9MTCIsIkNMQVNTX0NUQV9TRUFSQ0hfT1BFTiIsIkNMQVNTX0NUQV9TRUFSQ0hfQ0xPU0UiLCJDTEFTU19DVEFfU0VBUkNIX09WRVJMQVlTIiwiJGJvZHkiLCJfaW5zdGFuY2VzRGF0YSIsIl91cGRhdGVUeXBlYWhlYWQiLCJkYXRhIiwiJGlucHV0IiwicmVzdWx0cyIsImxlbmd0aCIsInJlc3VsdHNMaXN0IiwiJHR5cGVhaGVhZCIsInNpYmxpbmdzIiwiZm9ybUFjdGlvbiIsInBhcmVudHMiLCJsaXN0SHRtbCIsImkiLCJzdWdnZXN0aW9uIiwiZW5jb2RlZFN1Z2dlc3Rpb24iLCJlbmNvZGVVUkkiLCJsaW5rIiwicmVtb3ZlQ2xhc3MiLCJmaW5kIiwiaHRtbCIsIl9jbGVhclR5cGVhaGVhZCIsImFkZENsYXNzIiwiZW1wdHkiLCJfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QiLCJpbnB1dFZhbHVlIiwibWF4U3VnZ2VzdENvdW50IiwiaW5zdGFuY2VJZCIsInBhcnNlSW50IiwiaW5zdGFuY2VEYXRhIiwiYXV0b1N1Z2dlc3RQb29sRGF0YSIsImF1dG9TdWdnZXN0RGF0YSIsIm1hdGNoaW5nU3VnZ2VzdGlvbnMiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJ0cmltIiwicHVzaCIsIl9maW5kU3VnZ2VzdGlvbnMiLCJzdWdnZXN0aW9uc0RhdGEiLCJfa2V5Ym9hcmROYXZpZ2F0aW9uIiwiaW5wdXRJc0ZvY3Vzc2VkIiwiaXMiLCIkc3VnZ2VzdGlvbnMiLCJudW1TdWdnZXN0aW9ucyIsImluQXJyYXkiLCJrZXlDb2RlIiwic2VsZWN0SW5kZXgiLCJfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uIiwid2luZG93IiwibG9jYXRpb24iLCJjdXJyZW50VGFyZ2V0IiwiaHJlZiIsImN1cnJlbnRJbmRleCIsImluZGV4IiwiaW5kZXhPZmZzZXQiLCJzaGlmdEtleSIsImVhY2giLCJpZHgiLCJlbGUiLCIkc3VnZ2VzdGlvbiIsIiRzdWdnZXN0aW9uV3JhcHBlciIsInBhcmVudCIsIl9pbnB1dEtleUJpbmRpbmdzIiwidmFsdWUiLCJfaW5wdXROYXZCaW5kaW5ncyIsIl90eXBlYWhlYWRLZXlCaW5kaW5ncyIsImNsb3Nlc3QiLCJfaGFuZGxlRm9ybVN1Ym1pc3Npb24iLCIkZm9ybSIsInF1ZXJ5IiwidmFsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiX2hhbmRsZVNlYXJjaEZpZWxkRm9jdXNDaGFuZ2UiLCIkaW5wdXRXcmFwcGVyIiwidHlwZSIsIl9jbG9zZVR5cGVhaGVhZE9uQmx1ciIsImNsaWNrZWRPdXRzaWRlU2VhcmNoRm9ybSIsIiRlbGVtZW50IiwiX2luaXRUeXBlYWhlYWQiLCJlIiwiX2JpbmRFdmVudHMiLCJfb3BlbkRyYXdlciIsIiRzZWFyY2hXcmFwcGVyIiwiJHNlYXJjaE92ZXJsYXkiLCIkc2VhcmNoQ29udGFpbmVyIiwiJHNlYXJjaGlucHV0Iiwic2V0UmVzdHJpY3RGb2N1cyIsIl9jbG9zZURyYXdlciIsIiRzZWFyY2hPcGVuQnV0dG9uIiwidW5zZXRSZXN0cmljdEZvY3VzIiwiX2luaXREcmF3ZXIiLCJfcHJlcEluc3RhbmNlc0FuZERhdGEiLCIkYWxsU2VhcmNoSW5wdXRzIiwiYXV0b1N1Z2dlc3RFbmRwb2ludCIsImlkIiwiYXV0b1N1Z2dlc3RQcm9taXNlIiwiYXV0b1N1Z2dlc3RMaXN0SWQiLCIkYXV0b1N1Z2dlc3RMaXN0IiwiY29uc29sZSIsIndhcm4iLCJwcmV2aW91c0luc3RhbmNlSW5kZXgiLCJwcmV2aW91c0luc3RhbmNlRGF0YSIsInByZXZpb3VzSW5zdGFuY2VBdXRvU3VnZ2VzdEVuZHBvaW50IiwiZ2V0IiwiZG9uZSIsImRhdGFTdHJpbmciLCJqc29uU3RyaW5nIiwiSlNPTiIsInBhcnNlIiwiZmFpbCIsImluaXQiLCJhbGxJbnN0YW5jZXNQcm9taXNlcyIsImZvckVhY2giLCJ3aGVuIiwidGhlbiIsInJlYWR5Il0sIm1hcHBpbmdzIjoiOztBQUFPLElBQU1BLFNBQVMsR0FBRztFQUN2QkMsZUFBZSxFQUFFLEVBRE07RUFHdkJDLE9BQU8sRUFBRTtJQUNQQyxNQUFNLEVBQUUsV0FERDtJQUVQQyxNQUFNLEVBQUUsV0FGRDtJQUdQQyxPQUFPLEVBQUUsWUFIRjtJQUlQQyxPQUFPLEVBQUUsWUFKRjtJQUtQQyxLQUFLLEVBQUUsVUFMQTtJQU1QQyxJQUFJLEVBQUUsU0FOQztJQU9QQyxRQUFRLEVBQUUsYUFQSDtJQVFQQyxTQUFTLEVBQUU7RUFSSixDQUhjO0VBY3ZCQyxRQUFRLEVBQUU7SUFDUkMsU0FBUyxFQUFFLENBREg7SUFFUkMsR0FBRyxFQUFFLENBRkc7SUFHUkMsS0FBSyxFQUFFLEVBSEM7SUFJUkMsTUFBTSxFQUFFLEVBSkE7SUFLUkMsSUFBSSxFQUFFLEVBTEU7SUFNUkMsRUFBRSxFQUFFLEVBTkk7SUFPUkMsS0FBSyxFQUFFLEVBUEM7SUFRUkMsSUFBSSxFQUFFLEVBUkU7SUFTUkMsTUFBTSxFQUFFLEVBVEE7SUFVUkMsYUFBYSxFQUFFO0VBVlAsQ0FkYTtFQTJCdkJDLFVBQVUsRUFBRTtJQUNWYixRQUFRLEVBQUUsVUFEQTtJQUVWYyxRQUFRLEVBQUUsVUFGQTtJQUdWQyxRQUFRLEVBQUUsVUFIQTtJQUlWQyxHQUFHLEVBQUUsS0FKSztJQUtWQyxHQUFHLEVBQUU7RUFMSyxDQTNCVztFQW1DdkJDLFdBQVcsRUFBRTtJQUNYQyxHQUFHLEVBQUUsQ0FETTtJQUVYQyxFQUFFLEVBQUUsR0FGTztJQUdYQyxFQUFFLEVBQUUsR0FITztJQUlYQyxFQUFFLEVBQUUsR0FKTztJQUtYQyxFQUFFLEVBQUUsSUFMTztJQU1YQyxHQUFHLEVBQUU7RUFOTTtBQW5DVSxDQUFsQixDOztBQ0FQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFULENBQWtCQyxJQUFsQixFQUF3QkMsSUFBeEIsRUFBOEI7RUFDbkM7RUFDQSxJQUFJQyxPQUFKLEVBQWFDLElBQWIsRUFBbUJDLE9BQW5CLEVBQTRCQyxTQUE1QjtFQUVBLE9BQU8sWUFBVztJQUNoQixJQUFJQyxjQUFKLEVBQW1CQyxJQUFuQixDQURnQixDQUdoQjs7O0lBQ0FILE9BQU8sR0FBRyxJQUFWO0lBQ0FELElBQUksR0FBRyxHQUFHSyxLQUFILENBQVNDLElBQVQsQ0FBY0MsU0FBZCxFQUF5QixDQUF6QixDQUFQO0lBQ0FMLFNBQVMsR0FBRyxJQUFJTSxJQUFKLEVBQVosQ0FOZ0IsQ0FRaEI7O0lBQ0FMLGNBQWEsR0FBRyx5QkFBVztNQUN6QjtNQUNBQyxJQUFJLEdBQUksSUFBSUksSUFBSixFQUFELEdBQWVOLFNBQXRCLENBRnlCLENBSXpCO01BQ0E7O01BQ0EsSUFBSUUsSUFBSSxHQUFHTixJQUFYLEVBQWlCO1FBQ2ZDLE9BQU8sR0FBR1UsVUFBVSxDQUFDTixjQUFELEVBQWdCTCxJQUFJLEdBQUdNLElBQXZCLENBQXBCO01BQ0QsQ0FGRCxNQUVPO1FBQ0w7UUFDQUwsT0FBTyxHQUFHLElBQVY7UUFDQUYsSUFBSSxDQUFDYSxLQUFMLENBQVdULE9BQVgsRUFBb0JELElBQXBCO01BQ0Q7SUFDRixDQWJELENBVGdCLENBd0JoQjs7O0lBQ0EsSUFBSSxDQUFDRCxPQUFMLEVBQWM7TUFDWkEsT0FBTyxHQUFHVSxVQUFVLENBQUNOLGNBQUQsRUFBZ0JMLElBQWhCLENBQXBCO0lBQ0Q7RUFDRixDQTVCRDtBQTZCRCxDOztBQ3pDTSxTQUFTYSxHQUFULENBQWFDLFNBQWIsRUFBd0JDLFVBQXhCLEVBQW9DO0VBQ3pDLElBQUlDLFNBQVMsR0FBRyxhQUFhRixTQUE3QjtFQUVBQyxVQUFVLENBQUNFLElBQVgsQ0FBZ0IsVUFBaEIsRUFBNEIsR0FBNUI7RUFFQUMsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlSixTQUFmLEVBQTBCLFVBQVNLLEtBQVQsRUFBZ0I7SUFDeEMsSUFBSSxDQUFDTixVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWNPLFFBQWQsQ0FBdUJELEtBQUssQ0FBQ0UsTUFBN0IsQ0FBTCxFQUEyQztNQUN6Q0YsS0FBSyxDQUFDRyxlQUFOO01BQ0FULFVBQVUsQ0FBQ1UsS0FBWDtJQUNEO0VBQ0YsQ0FMRDtBQU1EO0FBRU0sU0FBU0MsS0FBVCxDQUFlWixTQUFmLEVBQTBCQyxVQUExQixFQUFzQztFQUMzQyxJQUFJQyxTQUFTLEdBQUcsYUFBYUYsU0FBN0I7RUFFQUMsVUFBVSxDQUFDRSxJQUFYLENBQWdCLFVBQWhCLEVBQTRCLElBQTVCO0VBRUFDLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlRLEdBQVosQ0FBZ0JYLFNBQWhCO0FBQ0QsQzs7QUNuQkQ7QUFDQTtDQUdBOztBQUNBLElBQU1ZLFdBQVcsR0FBR2hFLHNCQUFwQjtBQUNBLElBQU1pRSxhQUFhLEdBQUdqRSx3QkFBdEI7QUFDQSxJQUFNa0UsY0FBYyxHQUFHbEUseUJBQXZCO0FBQ0EsSUFBTW1FLFVBQVUsR0FBR25FLHFCQUFuQjtBQUNBLElBQU1vRSxZQUFZLEdBQUdwRSx1QkFBckIsQyxDQUVBOztBQUNBLElBQU1xRSxhQUFhLEdBQUcsNEJBQXRCO0FBQ0EsSUFBTUMsV0FBVyxHQUFHLHVCQUFwQjtBQUNBLElBQU1DLGVBQWUsR0FBRyxtQkFBeEI7QUFDQSxJQUFNQyxlQUFlLEdBQUdsQixDQUFDLENBQUMsZUFBRCxDQUFELENBQW1CbUIsUUFBbkIsQ0FBNEIsb0JBQTVCLENBQXhCO0FBQ0EsSUFBTUMsY0FBYyxHQUFHLENBQXZCO0FBQ0EsSUFBTUMsMEJBQTBCLEdBQUcsR0FBbkMsQyxDQUVBOztBQUNBLElBQU1DLGlCQUFpQixHQUFHLFNBQTFCO0FBQ0EsSUFBTUMsZUFBZSxHQUFHLFdBQXhCLEMsQ0FFQTs7QUFDQSxJQUFNQyxxQkFBcUIsR0FBRyxzQkFBOUI7QUFDQSxJQUFNQyxzQkFBc0IsR0FBRyx1QkFBL0I7QUFDQSxJQUFNQyx5QkFBeUIsR0FBRyxnQkFBbEM7QUFDQSxJQUFNQyxLQUFLLEdBQUczQixDQUFDLENBQUMsTUFBRCxDQUFmLEMsQ0FFQTs7QUFDQSxJQUFNNEIsY0FBYyxHQUFHLEVBQXZCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDQyxNQUFoQyxFQUF3QztFQUN0QyxJQUFJRCxJQUFJLElBQUlBLElBQUksQ0FBQ0UsT0FBYixJQUF3QkYsSUFBSSxDQUFDRSxPQUFMLENBQWFDLE1BQXpDLEVBQWlEO0lBQy9DLElBQU1DLFdBQVcsR0FBR0osSUFBSSxDQUFDRSxPQUF6QjtJQUNBLElBQU1HLFVBQVUsR0FBR0osTUFBTSxDQUFDSyxRQUFQLENBQWdCbkIsZUFBaEIsQ0FBbkI7SUFDQSxJQUFNb0IsVUFBVSxHQUFHTixNQUFNLENBQUNPLE9BQVAsQ0FBZSxNQUFmLEVBQXVCdkMsSUFBdkIsQ0FBNEIsUUFBNUIsQ0FBbkI7SUFDQSxJQUFJd0MsUUFBUSxHQUFHLEVBQWY7O0lBRUEsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHTixXQUFXLENBQUNELE1BQWhDLEVBQXdDTyxDQUFDLEVBQXpDLEVBQTZDO01BQzNDO01BQ0EsSUFBTUMsVUFBVSxHQUFHUCxXQUFXLENBQUNNLENBQUQsQ0FBOUI7TUFDQSxJQUFNRSxpQkFBaUIsR0FBR0MsU0FBUyxDQUFDRixVQUFELENBQW5DO01BQ0EsSUFBTUcsSUFBSSxhQUFNUCxVQUFOLGdCQUFzQkssaUJBQXRCLGNBQVY7TUFFQUgsUUFBUSxvRUFBd0RLLElBQXhELDZCQUE2RUgsVUFBN0UsbUNBQThHQSxVQUE5RyxnQkFBNkhBLFVBQTdILGdCQUFSO0lBQ0Q7O0lBRUROLFVBQVUsQ0FDUFUsV0FESCxDQUNlLFdBRGYsRUFFRzlDLElBRkgsQ0FFUSxlQUZSLEVBRXlCLElBRnpCLEVBR0crQyxJQUhILENBR1EsSUFIUixFQUlHQyxJQUpILENBSVFSLFFBSlI7RUFLRCxDQXBCRCxNQW9CTztJQUNMO0lBQ0FTLGVBQWUsQ0FBQ2pCLE1BQUQsQ0FBZjtFQUNEO0FBQ0Y7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNpQixlQUFULENBQXlCakIsTUFBekIsRUFBaUM7RUFDL0IsSUFBTUksVUFBVSxHQUFHSixNQUFNLENBQUNLLFFBQVAsQ0FBZ0JuQixlQUFoQixDQUFuQjtFQUVBa0IsVUFBVSxDQUNQYyxRQURILENBQ1ksV0FEWixFQUVHbEQsSUFGSCxDQUVRLGVBRlIsRUFFeUIsS0FGekIsRUFHRytDLElBSEgsQ0FHUSxJQUhSLEVBSUdJLEtBSkg7RUFNQSxPQUFPLElBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQywyQkFBVCxDQUFxQ0MsVUFBckMsRUFBaURyQixNQUFqRCxFQUF5RDtFQUN2RCxJQUFNc0IsZUFBZSxHQUFHdEIsTUFBTSxDQUFDaEMsSUFBUCxDQUFZLHNCQUFaLENBQXhCO0VBQ0EsSUFBTXVELFVBQVUsR0FBR0MsUUFBUSxDQUFDeEIsTUFBTSxDQUFDaEMsSUFBUCxDQUFZLGtCQUFaLENBQUQsRUFBa0MsRUFBbEMsQ0FBM0I7RUFDQSxJQUFNeUQsWUFBWSxHQUFHNUIsY0FBYyxDQUFDMEIsVUFBVSxHQUFHLENBQWQsQ0FBZCxJQUFrQyxFQUF2RDtFQUNBLElBQU1HLG1CQUFtQixHQUFHRCxZQUFZLENBQUNFLGVBQWIsSUFBZ0MsRUFBNUQ7RUFDQSxJQUFNQyxtQkFBbUIsR0FBRyxFQUE1Qjs7RUFFQSxLQUFLLElBQUluQixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHaUIsbUJBQW1CLENBQUN4QixNQUF4QyxFQUFnRE8sQ0FBQyxFQUFqRCxFQUFxRDtJQUNuRCxJQUFNQyxVQUFVLEdBQUdnQixtQkFBbUIsQ0FBQ2pCLENBQUQsQ0FBdEM7O0lBQ0EsSUFBSUMsVUFBVSxDQUFDbUIsV0FBWCxHQUF5QkMsT0FBekIsQ0FBaUNULFVBQVUsQ0FBQ1UsSUFBWCxHQUFrQkYsV0FBbEIsRUFBakMsTUFBc0UsQ0FBMUUsRUFBNkU7TUFDM0VELG1CQUFtQixDQUFDSSxJQUFwQixDQUF5QnRCLFVBQXpCOztNQUNBLElBQUlrQixtQkFBbUIsQ0FBQzFCLE1BQXBCLElBQThCb0IsZUFBbEMsRUFBbUQ7UUFDakQ7TUFDRDtJQUNGO0VBQ0Y7O0VBRUQsT0FBT00sbUJBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSyxnQkFBVCxDQUEwQlosVUFBMUIsRUFBc0NyQixNQUF0QyxFQUE4QztFQUM1QztFQUVBO0VBQ0EsSUFBTWtDLGVBQWUsR0FBRztJQUN0QmpDLE9BQU8sRUFBRW1CLDJCQUEyQixDQUFDQyxVQUFELEVBQWFyQixNQUFiO0VBRGQsQ0FBeEIsQ0FKNEMsQ0FRNUM7RUFDQTs7RUFDQUYsZ0JBQWdCLENBQUNvQyxlQUFELEVBQWtCbEMsTUFBbEIsQ0FBaEI7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU21DLG1CQUFULENBQTZCbkMsTUFBN0IsRUFBcUNJLFVBQXJDLEVBQWlEaEMsS0FBakQsRUFBd0Q7RUFDdEQsSUFBTWdFLGVBQWUsR0FBR3BDLE1BQU0sQ0FBQ3FDLEVBQVAsQ0FBVSxRQUFWLENBQXhCO0VBQ0EsSUFBTUMsWUFBWSxHQUFHbEMsVUFBVSxDQUFDVyxJQUFYLENBQWdCLEdBQWhCLENBQXJCO0VBQ0EsSUFBTXdCLGNBQWMsR0FBR0QsWUFBWSxDQUFDcEMsTUFBcEMsQ0FIc0QsQ0FLdEQ7O0VBQ0EsSUFBSWtDLGVBQWUsSUFBSW5FLENBQUMsQ0FBQ3VFLE9BQUYsQ0FBVXBFLEtBQUssQ0FBQ3FFLE9BQWhCLEVBQXlCLENBQUMzRCxVQUFELEVBQzlDQyxZQUQ4QyxDQUF6QixJQUNKLENBQUMsQ0FEcEIsRUFDdUI7SUFDckIsSUFBTTJELFdBQVcsR0FBSXRFLEtBQUssQ0FBQ3FFLE9BQU4sS0FBa0IxRCxZQUFuQixHQUFtQyxDQUFuQyxHQUF1Q3dELGNBQWMsR0FBRyxDQUE1RTs7SUFDQUkseUJBQXlCLENBQUNMLFlBQUQsRUFBZUksV0FBZixDQUF6Qjs7SUFDQSxPQUFPLEtBQVAsQ0FIcUIsQ0FLdkI7SUFDQTtFQUNDOztFQUFDLElBQUl0RSxLQUFLLENBQUNxRSxPQUFOLEtBQWtCN0QsYUFBbEIsSUFBbUMsQ0FBQ08sZUFBcEMsSUFBdUQsQ0FBQ2lELGVBQTVELEVBQTZFO0lBQzdFUSxNQUFNLENBQUNDLFFBQVAsR0FBa0J6RSxLQUFLLENBQUMwRSxhQUFOLENBQW9CQyxJQUF0QztJQUNBLE9BQU8sS0FBUCxDQUY2RSxDQUkvRTtFQUNDOztFQUFDLElBQUk5RSxDQUFDLENBQUN1RSxPQUFGLENBQVVwRSxLQUFLLENBQUNxRSxPQUFoQixFQUF5QixDQUFDOUQsV0FBRCxFQUM3QkcsVUFENkIsRUFFN0JDLFlBRjZCLENBQXpCLElBRWEsQ0FBQyxDQUZsQixFQUVxQjtJQUNyQixJQUFNaUUsWUFBWSxHQUFHVixZQUFZLENBQUNXLEtBQWIsQ0FBbUI3RSxLQUFLLENBQUMwRSxhQUF6QixDQUFyQixDQURxQixDQUVyQjs7SUFDQSxJQUFNSSxXQUFXLEdBQUk5RSxLQUFLLENBQUNxRSxPQUFOLEtBQWtCM0QsVUFBbEIsSUFDQ1YsS0FBSyxDQUFDK0UsUUFBTixJQUFrQi9FLEtBQUssQ0FBQ3FFLE9BQU4sS0FBa0I5RCxXQUR0QyxHQUNzRCxDQUFDLENBRHZELEdBQzJELENBRC9FOztJQUVBLElBQU0rRCxZQUFXLEdBQUdNLFlBQVksR0FBR0UsV0FBbkM7O0lBRUEsSUFBSVIsWUFBVyxLQUFLLENBQUMsQ0FBakIsSUFBc0JBLFlBQVcsS0FBS0gsY0FBMUMsRUFBMEQ7TUFDeEQ7TUFDQXZDLE1BQU0sQ0FBQ3hCLEtBQVA7O01BQ0FtRSx5QkFBeUIsQ0FBQ0wsWUFBRCxDQUF6QjtJQUNELENBSkQsTUFJTztNQUNMO01BQ0FLLHlCQUF5QixDQUFDTCxZQUFELEVBQWVJLFlBQWYsQ0FBekI7SUFDRDs7SUFFRCxPQUFPLEtBQVA7RUFDRDs7RUFBQyxJQUFJLENBQUNOLGVBQUQsSUFBb0JoRSxLQUFLLENBQUNxRSxPQUFOLEtBQWtCNUQsY0FBMUMsRUFBMEQ7SUFDMURtQixNQUFNLENBQUN4QixLQUFQO0lBQ0EsT0FBT3lDLGVBQWUsQ0FBQ2pCLE1BQUQsQ0FBdEI7RUFDRDtBQUNGO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVMyQyx5QkFBVCxDQUFtQ0wsWUFBbkMsRUFBbUU7RUFBQSxJQUFsQkksV0FBa0IsdUVBQUosQ0FBQyxDQUFHO0VBQ2pFSixZQUFZLENBQUNjLElBQWIsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQWM7SUFDOUIsSUFBTUMsV0FBVyxHQUFHdEYsQ0FBQyxDQUFDcUYsR0FBRCxDQUFyQjtJQUNBLElBQU1FLGtCQUFrQixHQUFHRCxXQUFXLENBQUNFLE1BQVosQ0FBbUIsSUFBbkIsQ0FBM0I7O0lBQ0EsSUFBSUosR0FBRyxLQUFLWCxXQUFaLEVBQXlCO01BQ3ZCYSxXQUFXLENBQUMvRSxLQUFaO01BQ0FnRixrQkFBa0IsQ0FBQ3hGLElBQW5CLENBQXdCLGVBQXhCLEVBQXlDLE1BQXpDO0lBQ0QsQ0FIRCxNQUdPO01BQ0x3RixrQkFBa0IsQ0FBQ3hGLElBQW5CLENBQXdCLGVBQXhCLEVBQXlDLE9BQXpDO0lBQ0Q7RUFDRixDQVREO0FBVUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTMEYsaUJBQVQsQ0FBMkJ0RixLQUEzQixFQUFrQztFQUNoQyxJQUFNNEIsTUFBTSxHQUFHL0IsQ0FBQyxDQUFDRyxLQUFLLENBQUMwRSxhQUFQLENBQWhCO0VBQ0EsSUFBTXpCLFVBQVUsR0FBR2pELEtBQUssQ0FBQzBFLGFBQU4sQ0FBb0JhLEtBQXBCLENBQTBCNUIsSUFBMUIsRUFBbkIsQ0FGZ0MsQ0FJaEM7O0VBQ0EsSUFBSTlELENBQUMsQ0FBQ3VFLE9BQUYsQ0FBVXBFLEtBQUssQ0FBQ3FFLE9BQWhCLEVBQXlCLENBQUM3RCxhQUFELEVBQzNCRCxXQUQyQixFQUUzQkcsVUFGMkIsRUFHM0JDLFlBSDJCLENBQXpCLElBR2UsQ0FBQyxDQUhwQixFQUd1QjtJQUNyQjtFQUNEOztFQUVELElBQUlzQyxVQUFVLENBQUNuQixNQUFYLElBQXFCYixjQUF6QixFQUF5QztJQUN2QztJQUNBNEMsZ0JBQWdCLENBQUNaLFVBQUQsRUFBYXJCLE1BQWIsQ0FBaEI7RUFDRCxDQUhELE1BR087SUFDTDtJQUNBLE9BQU9pQixlQUFlLENBQUNqQixNQUFELENBQXRCO0VBQ0Q7QUFDRjtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBUzRELGlCQUFULENBQTJCeEYsS0FBM0IsRUFBa0M7RUFDaEMsSUFBTTRCLE1BQU0sR0FBRy9CLENBQUMsQ0FBQ0csS0FBSyxDQUFDMEUsYUFBUCxDQUFoQjtFQUNBLElBQU0xQyxVQUFVLEdBQUdKLE1BQU0sQ0FBQ0ssUUFBUCxDQUFnQm5CLGVBQWhCLENBQW5CLENBRmdDLENBSWhDOztFQUNBLElBQUlqQixDQUFDLENBQUN1RSxPQUFGLENBQVVwRSxLQUFLLENBQUNxRSxPQUFoQixFQUF5QixDQUFDNUQsY0FBRCxFQUMzQkQsYUFEMkIsRUFFM0JFLFVBRjJCLEVBRzNCQyxZQUgyQixDQUF6QixJQUdlLENBQUMsQ0FIcEIsRUFHdUI7SUFDckI7SUFDQSxJQUFJLENBQUNxQixVQUFVLENBQUNpQyxFQUFYLENBQWMsVUFBZCxDQUFMLEVBQWdDO01BQzlCO0lBQ0QsQ0FKb0IsQ0FNckI7OztJQUNBLE9BQU9GLG1CQUFtQixDQUFDbkMsTUFBRCxFQUFTSSxVQUFULEVBQXFCaEMsS0FBckIsQ0FBMUI7RUFDRDtBQUNGO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU3lGLHFCQUFULENBQStCekYsS0FBL0IsRUFBc0M7RUFDcEMsSUFBTWdDLFVBQVUsR0FBR25DLENBQUMsQ0FBQ0csS0FBSyxDQUFDMEUsYUFBUCxDQUFELENBQXVCZ0IsT0FBdkIsQ0FBK0I1RSxlQUEvQixDQUFuQjtFQUNBLElBQU1jLE1BQU0sR0FBR0ksVUFBVSxDQUFDQyxRQUFYLENBQW9CcEIsV0FBcEIsQ0FBZjtFQUVBLE9BQU9rRCxtQkFBbUIsQ0FBQ25DLE1BQUQsRUFBU0ksVUFBVCxFQUFxQmhDLEtBQXJCLENBQTFCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBUzJGLHFCQUFULENBQStCM0YsS0FBL0IsRUFBc0M7RUFDcEMsSUFBTTRGLEtBQUssR0FBRy9GLENBQUMsQ0FBQ0csS0FBSyxDQUFDRSxNQUFQLENBQWY7RUFDQSxJQUFNMEIsTUFBTSxHQUFHZ0UsS0FBSyxDQUFDakQsSUFBTixDQUFXOUIsV0FBWCxDQUFmO0VBQ0EsSUFBTWdGLEtBQUssR0FBR2pFLE1BQU0sQ0FBQ2tFLEdBQVAsR0FBYW5DLElBQWIsRUFBZDtFQUNBYSxNQUFNLENBQUNDLFFBQVAsYUFBcUJtQixLQUFLLENBQUNoRyxJQUFOLENBQVcsUUFBWCxDQUFyQixnQkFBK0NtRyxrQkFBa0IsQ0FBQ0YsS0FBRCxDQUFqRTtFQUVBLE9BQU8sS0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTRyw2QkFBVCxDQUF1Q2hHLEtBQXZDLEVBQThDO0VBQzVDLElBQU1pRyxhQUFhLEdBQUdwRyxDQUFDLENBQUNHLEtBQUssQ0FBQ0UsTUFBUCxDQUFELENBQWdCd0YsT0FBaEIsQ0FBd0I5RSxhQUF4QixDQUF0Qjs7RUFDQSxJQUFJWixLQUFLLENBQUNrRyxJQUFOLEtBQWUsT0FBbkIsRUFBNEI7SUFDMUJELGFBQWEsQ0FBQ25ELFFBQWQsQ0FBdUJ2Ryx5QkFBdkI7RUFDRCxDQUZELE1BRU8sSUFBSXlELEtBQUssQ0FBQ2tHLElBQU4sS0FBZSxNQUFuQixFQUEyQjtJQUNoQ0QsYUFBYSxDQUFDdkQsV0FBZCxDQUEwQm5HLHlCQUExQjtFQUNEO0FBQ0Y7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTNEoscUJBQVQsQ0FBK0JuRyxLQUEvQixFQUFzQztFQUNwQyxJQUFNb0csd0JBQXdCLEdBQUcsQ0FBQ3ZHLENBQUMsQ0FBQ0csS0FBSyxDQUFDRSxNQUFQLENBQUQsQ0FBZ0J3RixPQUFoQixDQUF3QjlFLGFBQXhCLEVBQXVDa0IsTUFBekU7O0VBRUEsSUFBSXNFLHdCQUFKLEVBQThCO0lBQzVCdkcsQ0FBQyxXQUFJZ0IsV0FBSiwyQkFBRCxDQUF5Q21FLElBQXpDLENBQThDLFVBQUNxQixRQUFELEVBQWM7TUFDMUR4RCxlQUFlLENBQUNoRCxDQUFDLENBQUN3RyxRQUFELENBQUYsQ0FBZjtJQUNELENBRkQ7RUFHRDs7RUFFRCxPQUFPLElBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0MsY0FBVCxHQUEwQjtFQUN4QnpHLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQ0U7RUFERixDQUVHQyxFQUZILENBRU0sT0FGTixZQUVrQmMsV0FGbEIsNEJBRXNEcEMsUUFBUSxDQUFDNkcsaUJBQUQsRUFBb0JwRSwwQkFBcEIsQ0FGOUQsRUFHR25CLEVBSEgsQ0FHTSxTQUhOLFlBR29CYyxXQUhwQiw0QkFHd0QyRSxpQkFIeEQsRUFJR3pGLEVBSkgsQ0FJTSxpQkFKTixZQUk0QmMsV0FKNUIsNEJBSWdFLFVBQUMwRixDQUFELEVBQU87SUFDbkUxRCxlQUFlLENBQUNoRCxDQUFDLENBQUMwRyxDQUFDLENBQUNyRyxNQUFILENBQUYsQ0FBZjtFQUNELENBTkgsRUFRRTtFQVJGLENBU0dILEVBVEgsQ0FTTSxTQVROLFlBU29CZSxlQVRwQixTQVN5QzJFLHFCQVR6QyxFQVVHMUYsRUFWSCxDQVVNLE9BVk4sRUFVZW9HLHFCQVZmO0FBV0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSyxXQUFULEdBQXVCO0VBQ3JCM0csQ0FBQyxDQUFDZ0IsV0FBRCxDQUFELENBQWVkLEVBQWYsQ0FBa0IsWUFBbEIsRUFBZ0NpRyw2QkFBaEMsRUFEcUIsQ0FHckI7O0VBQ0EsSUFBSSxDQUFDakYsZUFBTCxFQUFzQjtJQUNwQjtJQUNBbEIsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlLFFBQWYsRUFBeUIsY0FBekIsRUFBeUM0RixxQkFBekM7RUFDRDtBQUNGO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTYyxXQUFULENBQXFCRixDQUFyQixFQUF3QjtFQUN0QixJQUFNRyxjQUFjLEdBQUc3RyxDQUFDLENBQUMwRyxDQUFDLENBQUNyRyxNQUFILENBQUQsQ0FBWXdGLE9BQVosQ0FBb0IsY0FBcEIsQ0FBdkI7RUFDQSxJQUFNaUIsY0FBYyxHQUFHRCxjQUFjLENBQUMvRCxJQUFmLFlBQXdCcEIseUJBQXhCLEVBQXZCO0VBQ0EsSUFBTXFGLGdCQUFnQixHQUFHRCxjQUFjLENBQUMxRSxRQUFmLENBQXdCLHdCQUF4QixDQUF6QjtFQUNBLElBQU00RSxZQUFZLEdBQUdELGdCQUFnQixDQUFDakUsSUFBakIsQ0FBc0I5QixXQUF0QixDQUFyQjtFQUVBK0YsZ0JBQWdCLENBQUM5RCxRQUFqQixDQUEwQjNCLGlCQUExQjtFQUNBMEYsWUFBWSxDQUFDekcsS0FBYjtFQUNBdUcsY0FBYyxDQUFDN0QsUUFBZixDQUF3QjNCLGlCQUF4QjtFQUNBSyxLQUFLLENBQUNzQixRQUFOLENBQWUxQixlQUFmO0VBQ0F2QixDQUFDLFlBQUt3QixxQkFBTCxFQUFELENBQStCekIsSUFBL0IsQ0FBb0MsZUFBcEMsRUFBcUQsSUFBckQ7RUFDQWtILEdBQWdCLENBQUMsV0FBRCxFQUFjRixnQkFBZCxDQUFoQjtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTRyxZQUFULENBQXNCUixDQUF0QixFQUF5QjtFQUN2QixJQUFNRyxjQUFjLEdBQUc3RyxDQUFDLENBQUMwRyxDQUFDLENBQUNyRyxNQUFILENBQUQsQ0FBWXdGLE9BQVosQ0FBb0IsY0FBcEIsQ0FBdkI7RUFDQSxJQUFNaUIsY0FBYyxHQUFHRCxjQUFjLENBQUMvRCxJQUFmLFlBQXdCcEIseUJBQXhCLEVBQXZCO0VBQ0EsSUFBTXFGLGdCQUFnQixHQUFHRCxjQUFjLENBQUMxRSxRQUFmLENBQXdCLHdCQUF4QixDQUF6QjtFQUNBLElBQU0rRSxpQkFBaUIsR0FBR04sY0FBYyxDQUFDL0QsSUFBZixDQUFvQix1QkFBcEIsQ0FBMUI7RUFFQWlFLGdCQUFnQixDQUFDbEUsV0FBakIsQ0FBNkJ2QixpQkFBN0I7RUFDQTZGLGlCQUFpQixDQUFDNUcsS0FBbEI7RUFDQXVHLGNBQWMsQ0FBQ2pFLFdBQWYsQ0FBMkJ2QixpQkFBM0I7RUFDQUssS0FBSyxDQUFDa0IsV0FBTixDQUFrQnRCLGVBQWxCO0VBQ0F2QixDQUFDLFlBQUt3QixxQkFBTCxFQUFELENBQStCekIsSUFBL0IsQ0FBb0MsZUFBcEMsRUFBcUQsS0FBckQ7RUFDQXFILEtBQWtCLENBQUMsV0FBRCxFQUFjTCxnQkFBZCxDQUFsQjtFQUNBLE9BQU8sS0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU00sV0FBVCxHQUF1QjtFQUNyQjtFQUNBckgsQ0FBQyxZQUFLd0IscUJBQUwsRUFBRCxDQUErQnRCLEVBQS9CLENBQWtDLE9BQWxDLEVBQTJDLFVBQUN3RyxDQUFEO0lBQUEsT0FBT0UsV0FBVyxDQUFDRixDQUFELENBQWxCO0VBQUEsQ0FBM0M7RUFDQTFHLENBQUMsWUFBS3lCLHNCQUFMLEVBQUQsQ0FBZ0N2QixFQUFoQyxDQUFtQyxPQUFuQyxFQUE0QyxVQUFDd0csQ0FBRDtJQUFBLE9BQU9RLFlBQVksQ0FBQ1IsQ0FBRCxDQUFuQjtFQUFBLENBQTVDO0VBQ0ExRyxDQUFDLFlBQUswQix5QkFBTCxFQUFELENBQW1DeEIsRUFBbkMsQ0FBc0MsT0FBdEMsRUFBK0MsVUFBQ3dHLENBQUQ7SUFBQSxPQUFPUSxZQUFZLENBQUNSLENBQUQsQ0FBbkI7RUFBQSxDQUEvQztBQUNEOztBQUVELFNBQVNZLHFCQUFULEdBQWlDO0VBQy9CLElBQU1DLGdCQUFnQixHQUFHdkgsQ0FBQyxDQUFDZ0IsV0FBRCxDQUExQixDQUQrQixDQUcvQjs7RUFDQXVHLGdCQUFnQixDQUFDcEMsSUFBakIsQ0FBc0IsVUFBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQWM7SUFDbEMsSUFBTXRELE1BQU0sR0FBRy9CLENBQUMsQ0FBQ3FGLEdBQUQsQ0FBaEI7SUFDQSxJQUFNL0IsVUFBVSxHQUFHOEIsR0FBRyxHQUFHLENBQXpCO0lBQ0EsSUFBTW9DLG1CQUFtQixHQUFHekYsTUFBTSxDQUFDaEMsSUFBUCxDQUFZLGVBQVosS0FBZ0MsRUFBNUQ7SUFDQSxJQUFNeUQsWUFBWSxHQUFHO01BQ25CaUUsRUFBRSxFQUFFbkUsVUFEZTtNQUVuQmtFLG1CQUFtQixFQUFuQkEsbUJBRm1CO01BR25CRSxrQkFBa0IsRUFBRSxJQUhEO01BSW5CaEUsZUFBZSxFQUFFO0lBSkUsQ0FBckIsQ0FKa0MsQ0FXbEM7O0lBQ0E5QixjQUFjLENBQUNtQyxJQUFmLENBQW9CUCxZQUFwQixFQVprQyxDQWNsQzs7O0lBQ0EsSUFBTW1FLGlCQUFpQiwwQ0FBbUNyRSxVQUFuQyxDQUF2QjtJQUNBLElBQU1zRSxnQkFBZ0IsR0FBRzdGLE1BQU0sQ0FBQzhELE9BQVAsQ0FBZTlFLGFBQWYsRUFBOEIrQixJQUE5QixXQUFzQzdCLGVBQXRDLFdBQXpCO0lBQ0FjLE1BQU0sQ0FDSGhDLElBREgsQ0FDUTtNQUNKLG9CQUFvQnVELFVBRGhCO01BRUosYUFBYXFFO0lBRlQsQ0FEUjtJQUtBQyxnQkFBZ0IsQ0FBQzdILElBQWpCLENBQXNCLElBQXRCLEVBQTRCNEgsaUJBQTVCLEVBdEJrQyxDQXdCbEM7O0lBQ0EsSUFBSSxDQUFDSCxtQkFBbUIsQ0FBQ3ZGLE1BQXpCLEVBQWlDO01BQy9CNEYsT0FBTyxDQUFDQyxJQUFSLENBQWEsTUFBYixFQUFxQixrREFBckIsRUFBeUV4RSxVQUF6RSxFQUFxRmtFLG1CQUFyRjtNQUNBO0lBQ0QsQ0E1QmlDLENBOEJsQzs7O0lBQ0EsS0FBSyxJQUFJaEYsQ0FBQyxHQUFHNEMsR0FBYixFQUFrQjVDLENBQUMsR0FBRyxDQUF0QixFQUF5QkEsQ0FBQyxFQUExQixFQUE4QjtNQUM1QixJQUFNdUYscUJBQXFCLEdBQUczQyxHQUFHLEdBQUcsQ0FBcEM7TUFDQSxJQUFNNEMsb0JBQW9CLEdBQUdwRyxjQUFjLENBQUNtRyxxQkFBRCxDQUFkLElBQXlDLEVBQXRFO01BQ0EsSUFBTUUsbUNBQW1DLEdBQUdELG9CQUFvQixDQUFDUixtQkFBakU7O01BQ0EsSUFBSUEsbUJBQW1CLENBQUN2RixNQUFwQixJQUE4QnVGLG1CQUFtQixLQUFLUyxtQ0FBMUQsRUFBK0Y7UUFDN0Y7UUFDQXpFLFlBQVksQ0FBQ2tFLGtCQUFiLEdBQWtDTSxvQkFBb0IsQ0FBQ04sa0JBQXZEO01BQ0Q7SUFDRixDQXZDaUMsQ0F5Q2xDOzs7SUFDQSxJQUFJbEUsWUFBWSxDQUFDa0Usa0JBQWIsS0FBb0MsSUFBeEMsRUFBOEM7TUFDNUNsRSxZQUFZLENBQUNrRSxrQkFBYixHQUFrQzFILENBQUMsQ0FBQ2tJLEdBQUYsQ0FBTVYsbUJBQU4sQ0FBbEM7SUFDRCxDQTVDaUMsQ0E4Q2xDOzs7SUFDQWhFLFlBQVksQ0FBQ2tFLGtCQUFiLENBQ0dTLElBREgsQ0FDUSxVQUFDQyxVQUFELEVBQWdCO01BQ3BCLElBQUksT0FBT0EsVUFBUCxLQUFzQixRQUExQixFQUFvQztRQUNsQ1AsT0FBTyxDQUFDQyxJQUFSLENBQWEsTUFBYixFQUFxQixtQ0FBckIsRUFBMER4RSxVQUExRCxFQUFzRThFLFVBQXRFO1FBQ0E7TUFDRCxDQUptQixDQU1wQjtNQUNBOzs7TUFDQSxJQUFNQyxVQUFVLEdBQUdELFVBQVUsQ0FBQ3RFLElBQVgsR0FBa0J6RSxLQUFsQixDQUF3QixDQUF4QixFQUEyQixDQUFDLENBQTVCLENBQW5COztNQUNBLElBQUk7UUFDRm1FLFlBQVksQ0FBQ0UsZUFBYixHQUErQjRFLElBQUksQ0FBQ0MsS0FBTCxDQUFXRixVQUFVLENBQUN2RSxJQUFYLEVBQVgsQ0FBL0I7TUFDRCxDQUZELENBRUUsT0FBTzRDLENBQVAsRUFBVTtRQUNWbEQsWUFBWSxDQUFDRSxlQUFiLEdBQStCLElBQS9CO1FBQ0FtRSxPQUFPLENBQUNDLElBQVIsQ0FBYSxNQUFiLEVBQXFCLG1DQUFyQixFQUEwRHhFLFVBQTFELEVBQXNFK0UsVUFBdEUsRUFBa0YzQixDQUFsRjtNQUNEO0lBQ0YsQ0FoQkgsRUFpQkc4QixJQWpCSCxDQWlCUSxZQUFNO01BQ1ZYLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLE1BQWIsRUFBcUIsOENBQXJCLEVBQXFFeEUsVUFBckU7SUFDRCxDQW5CSDtFQW9CRCxDQW5FRDtBQW9FRDs7QUFFRCxTQUFTbUYsSUFBVCxHQUFnQjtFQUFBOztFQUNkOUIsV0FBVzs7RUFDWFUsV0FBVyxHQUZHLENBSWQ7RUFDQTs7O0VBQ0FDLHFCQUFxQixHQU5QLENBUWQ7OztFQUNBLElBQU1vQixvQkFBb0IsR0FBRyxFQUE3Qjs7RUFDQTlHLGNBQWMsQ0FBQytHLE9BQWYsQ0FBdUIsVUFBQ25GLFlBQUQsRUFBa0I7SUFDdkMsSUFBSUEsWUFBWSxDQUFDa0Usa0JBQWIsS0FBb0MsSUFBeEMsRUFBOEM7TUFDNUNnQixvQkFBb0IsQ0FBQzNFLElBQXJCLENBQTBCUCxZQUFZLENBQUNrRSxrQkFBdkM7SUFDRDtFQUNGLENBSkQ7O0VBS0EsTUFBQTFILENBQUMsRUFBQzRJLElBQUYsV0FBVUYsb0JBQVYsRUFBZ0NHLElBQWhDLENBQXFDLFlBQU07SUFDekNwQyxjQUFjO0VBQ2YsQ0FGRDtBQUdEOztBQUVEekcsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWTZJLEtBQVosQ0FBa0IsWUFBTTtFQUN0QkwsSUFBSTtBQUNMLENBRkQiLCJmaWxlIjoiNzg3Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT05TVEFOVFMgPSB7XG4gIEhBU0hfQ0hBUl9MSU1JVDogNTAsXG5cbiAgQ0xBU1NFUzoge1xuICAgIEhJRERFTjogJ2lzLWhpZGRlbicsXG4gICAgQUNUSVZFOiAnaXMtYWN0aXZlJyxcbiAgICBDVVJSRU5UOiAnaXMtY3VycmVudCcsXG4gICAgRk9DVVNFRDogJ2lzLWZvY3VzZWQnLFxuICAgIEVSUk9SOiAnaXMtZXJyb3InLFxuICAgIE9QRU46ICdpcy1vcGVuJyxcbiAgICBESVNBQkxFRDogJ2lzLWRpc2FibGVkJyxcbiAgICBIQVNfRVJST1I6ICdoYXMtZXJyb3InXG4gIH0sXG5cbiAgS0VZQk9BUkQ6IHtcbiAgICBCQUNLU1BBQ0U6IDgsXG4gICAgVEFCOiA5LFxuICAgIEVOVEVSOiAxMyxcbiAgICBFU0NBUEU6IDI3LFxuICAgIExFRlQ6IDM3LFxuICAgIFVQOiAzOCxcbiAgICBSSUdIVDogMzksXG4gICAgRE9XTjogNDAsXG4gICAgREVMRVRFOiA0NixcbiAgICBGT1JXQVJEX1NMQVNIOiAxOTFcbiAgfSxcblxuICBBVFRSSUJVVEVTOiB7XG4gICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgUkVBRE9OTFk6ICdyZWFkb25seScsXG4gICAgUkVRVUlSRUQ6ICdyZXF1aXJlZCcsXG4gICAgTUFYOiAnbWF4JyxcbiAgICBNSU46ICdtaW4nXG4gIH0sXG5cbiAgQlJFQUtQT0lOVFM6IHtcbiAgICBYU006IDAsXG4gICAgU006IDQ4MCxcbiAgICBNRDogNjgwLFxuICAgIExHOiA5NzAsXG4gICAgWEw6IDExNzAsXG4gICAgWFhMOiAxNjAwXG4gIH1cbn07XG4iLCIvKipcbiAqIGRlYm91bmNlIC0gRGVib3VuY2UgaGVscGVyIG1ldGhvZFxuICogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3JoeXNicmV0dGJvd2VuL2RlYm91bmNlL2Jsb2IvbWFzdGVyL2RlYm91bmNlLmpzXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZ1bmMgIHRhcmdldCBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSAge3N0cmluZ30gd2FpdCAgICB3YWl0IHRpbWUgYWZ0ZXIgdGhlIGxhc3QgY2FsbCBvZiB0YXJnZXQgZnVuY3Rpb24gYmVmb3JlIGl0IGlzIGNhbGxlZFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0KSB7XG4gIC8vIHdlIG5lZWQgdG8gc2F2ZSB0aGVzZSBpbiB0aGUgY2xvc3VyZVxuICB2YXIgdGltZW91dCwgYXJncywgY29udGV4dCwgdGltZXN0YW1wO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGVib3VuY2VkRnVuYywgbGFzdDtcblxuICAgIC8vIHNhdmUgZGV0YWlscyBvZiBsYXRlc3QgY2FsbFxuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdGltZXN0YW1wID0gbmV3IERhdGUoKTtcblxuICAgIC8vIHRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnNcbiAgICBkZWJvdW5jZWRGdW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBob3cgbG9uZyBhZ28gd2FzIHRoZSBsYXN0IGNhbGxcbiAgICAgIGxhc3QgPSAobmV3IERhdGUoKSkgLSB0aW1lc3RhbXA7XG5cbiAgICAgIC8vIGlmIHRoZSBsYXRlc3QgY2FsbCB3YXMgbGVzcyB0aGF0IHRoZSB3YWl0IHBlcmlvZCBhZ29cbiAgICAgIC8vIHRoZW4gd2UgcmVzZXQgdGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIGRpZmZlcmVuY2VcbiAgICAgIGlmIChsYXN0IDwgd2FpdCkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChkZWJvdW5jZWRGdW5jLCB3YWl0IC0gbGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvciBpZiBub3Qgd2UgY2FuIG51bGwgb3V0IHRoZSB0aW1lciBhbmQgcnVuIHRoZSBsYXRlc3RcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHdlIG9ubHkgbmVlZCB0byBzZXQgdGhlIHRpbWVyIG5vdyBpZiBvbmUgaXNuJ3QgYWxyZWFkeSBydW5uaW5nXG4gICAgaWYgKCF0aW1lb3V0KSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChkZWJvdW5jZWRGdW5jLCB3YWl0KTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXQobmFtZXNwYWNlLCAkY29udGFpbmVyKSB7XG4gIHZhciBldmVudFR5cGUgPSAnZm9jdXNpbi4nICsgbmFtZXNwYWNlO1xuXG4gICRjb250YWluZXIuYXR0cigndGFiaW5kZXgnLCAnMCcpO1xuXG4gICQoZG9jdW1lbnQpLm9uKGV2ZW50VHlwZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoISRjb250YWluZXJbMF0uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAkY29udGFpbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0KG5hbWVzcGFjZSwgJGNvbnRhaW5lcikge1xuICB2YXIgZXZlbnRUeXBlID0gJ2ZvY3VzaW4uJyArIG5hbWVzcGFjZTtcblxuICAkY29udGFpbmVyLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG5cbiAgJChkb2N1bWVudCkub2ZmKGV2ZW50VHlwZSk7XG59XG4iLCJpbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICdDb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnSGVscGVycy9kZWJvdW5jZSc7XG5pbXBvcnQgeyBzZXQgYXMgc2V0UmVzdHJpY3RGb2N1cywgdW5zZXQgYXMgdW5zZXRSZXN0cmljdEZvY3VzIH0gZnJvbSAnSGVscGVycy9yZXN0cmljdEZvY3VzJztcblxuLy8gdHlwZSBhaGVhZCBrZXlzXG5jb25zdCBLRVlDT0RFX1RBQiA9IENPTlNUQU5UUy5LRVlCT0FSRC5UQUI7XG5jb25zdCBLRVlDT0RFX0VOVEVSID0gQ09OU1RBTlRTLktFWUJPQVJELkVOVEVSO1xuY29uc3QgS0VZQ09ERV9FU0NBUEUgPSBDT05TVEFOVFMuS0VZQk9BUkQuRVNDQVBFO1xuY29uc3QgS0VZQ09ERV9VUCA9IENPTlNUQU5UUy5LRVlCT0FSRC5VUDtcbmNvbnN0IEtFWUNPREVfRE9XTiA9IENPTlNUQU5UUy5LRVlCT0FSRC5ET1dOO1xuXG4vLyB0eXBlIGFoZWFkIGNsYXNzZXMgYW5kIHN0YXRlc1xuY29uc3QgQ0xBU1NfV1JBUFBFUiA9ICcuanMtc2VhcmNoLWZvcm0taW5wdXQtd3JhcCc7XG5jb25zdCBDTEFTU19JTlBVVCA9ICcuanMtc2VhcmNoLWZvcm0taW5wdXQnO1xuY29uc3QgQ0xBU1NfVFlQRUFIRUFEID0gJy5zZWFyY2gtdHlwZWFoZWFkJztcbmNvbnN0IElTX1JFU1VMVFNfUEFHRSA9ICQoJy53cmFwcGVyLWJvZHknKS5oYXNDbGFzcygnaGFzLXNlYXJjaC1yZXN1bHRzJyk7XG5jb25zdCBDSEFSX1RIUkVTSE9MRCA9IDM7XG5jb25zdCBBVVRPX1NVR0dFU1RfREVCT1VOQ0VfV0FJVCA9IDIwMDtcblxuLy8gc2VhcmNoIGRyYXdlciBjbGFzc2VzXG5jb25zdCBDTEFTU19EUkFXRVJfT1BFTiA9ICdpcy1vcGVuJztcbmNvbnN0IENMQVNTX05PX1NDUk9MTCA9ICduby1zY3JvbGwnO1xuXG4vLyBzZWFyY2ggZHJhd2VyIHZpZXcgZWxlbWVudHNcbmNvbnN0IENMQVNTX0NUQV9TRUFSQ0hfT1BFTiA9ICdjdGEtc2VhcmNoLWZvcm0tb3Blbic7XG5jb25zdCBDTEFTU19DVEFfU0VBUkNIX0NMT1NFID0gJ2N0YS1zZWFyY2gtZm9ybS1jbG9zZSc7XG5jb25zdCBDTEFTU19DVEFfU0VBUkNIX09WRVJMQVlTID0gJ3NlYXJjaC1vdmVybGF5JztcbmNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXG4vLyBMaXN0IGhvbGRpbmcgaW5zdGFuY2UgbGV2ZWwgZ2xvYmFsIGRhdGEgZm9yIGFsbCBpbnN0YW5jZXNcbmNvbnN0IF9pbnN0YW5jZXNEYXRhID0gW107XG5cbi8qKlxuICogX3VwZGF0ZVR5cGVhaGVhZCAtIHRha2VzIGRhdGEgZnJvbSB0aGUgc3VnZ2VzdGlvbnMgYXBpIGFuZCB1cGRhdGVzIHRoZSBkb20gd2l0aCByZXN1bHRzIGFzXG4gKiAgICAgICAgICAgICAgICAgICAgd2VsbCBhcyBtYWtpbmcgdGhlIHR5cGVhaGVhZCB2aXNpYmxlLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZGF0YSAgIG9iamVjdCBjb250YWluaW5nIHJhdyByZXN1bHRzIGZyb20gdGhlIGFwaVxuICogQHBhcmFtICB7b2JqZWN0fSAkaW5wdXQgalF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW4gdXNlLlxuICovXG5mdW5jdGlvbiBfdXBkYXRlVHlwZWFoZWFkKGRhdGEsICRpbnB1dCkge1xuICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdHMgJiYgZGF0YS5yZXN1bHRzLmxlbmd0aCkge1xuICAgIGNvbnN0IHJlc3VsdHNMaXN0ID0gZGF0YS5yZXN1bHRzO1xuICAgIGNvbnN0ICR0eXBlYWhlYWQgPSAkaW5wdXQuc2libGluZ3MoQ0xBU1NfVFlQRUFIRUFEKTtcbiAgICBjb25zdCBmb3JtQWN0aW9uID0gJGlucHV0LnBhcmVudHMoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKTtcbiAgICBsZXQgbGlzdEh0bWwgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0c0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGJ1aWxkIHRoZSBodG1sIHRvIGFkZCB0byB0aGUgZG9tLlxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IHJlc3VsdHNMaXN0W2ldO1xuICAgICAgY29uc3QgZW5jb2RlZFN1Z2dlc3Rpb24gPSBlbmNvZGVVUkkoc3VnZ2VzdGlvbik7XG4gICAgICBjb25zdCBsaW5rID0gYCR7Zm9ybUFjdGlvbn0/cT0ke2VuY29kZWRTdWdnZXN0aW9ufSZyZWY9YXV0b2A7XG5cbiAgICAgIGxpc3RIdG1sICs9IGA8bGkgcm9sZT1cIm9wdGlvblwiIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiPjxhIGhyZWY9XCIke2xpbmt9XCIgZGF0YS1xdWVyeT1cIiR7c3VnZ2VzdGlvbn1cIiB0aXRsZT1cIlNlYXJjaCBmb3IgJHtzdWdnZXN0aW9ufVwiPiR7c3VnZ2VzdGlvbn08L2E+PC9saT5cXG5gO1xuICAgIH1cblxuICAgICR0eXBlYWhlYWRcbiAgICAgIC5yZW1vdmVDbGFzcygnaXMtaGlkZGVuJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcbiAgICAgIC5maW5kKCd1bCcpXG4gICAgICAuaHRtbChsaXN0SHRtbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHN1Z2dlc3Rpb25zIGNsZWFyIHRoZSB0eXBlYWhlYWQgdWkuXG4gICAgX2NsZWFyVHlwZWFoZWFkKCRpbnB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBfY2xlYXJUeXBlYWhlYWQgLSBjbGVhcnMgdGhlIHR5cGVhaGVhZCByZXN1bHRzIGFuZCBoaWRlcyBpdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICRpbnB1dCBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbnB1dCBpbiB1c2UuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICBhbGxvdyBldmVudCB0byBwcm9wYWdhdGUuXG4gKi9cbmZ1bmN0aW9uIF9jbGVhclR5cGVhaGVhZCgkaW5wdXQpIHtcbiAgY29uc3QgJHR5cGVhaGVhZCA9ICRpbnB1dC5zaWJsaW5ncyhDTEFTU19UWVBFQUhFQUQpO1xuXG4gICR0eXBlYWhlYWRcbiAgICAuYWRkQ2xhc3MoJ2lzLWhpZGRlbicpXG4gICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcbiAgICAuZmluZCgndWwnKVxuICAgIC5lbXB0eSgpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIF9nZXRNYXRjaGluZ1N1Z2dlc3Rpb25zTGlzdCAtIGNyZWF0ZXMgYSBsaXN0IG9mIG1hdGNoaW5nIHN1Z2dlc3Rpb25zIGZyb20gdGhlIGRhdGEgcG9vbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFZhbHVlICB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGFzIGEgdHJpbW1lZCBzdHJpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSAkaW5wdXQgIHRoZSAkaW5wdXQgZWxlbWVudCBqUXVlcnkgb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9ICBsaXN0IG9mIG1hdGNoaW5nIHN1Z2dlc3Rpb25zIGZyb20gaW5wdXQgcXVlcnkgYWdhaW5zdCBhdXRvIHN1Z2dlc3QgcmVzdWx0IGRhdGEgcG9vbFxuICovXG5mdW5jdGlvbiBfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QoaW5wdXRWYWx1ZSwgJGlucHV0KSB7XG4gIGNvbnN0IG1heFN1Z2dlc3RDb3VudCA9ICRpbnB1dC5hdHRyKCdkYXRhLW1heC1zdWdnZXN0aW9ucycpO1xuICBjb25zdCBpbnN0YW5jZUlkID0gcGFyc2VJbnQoJGlucHV0LmF0dHIoJ2RhdGEtaW5zdGFuY2UtaWQnKSwgMTApO1xuICBjb25zdCBpbnN0YW5jZURhdGEgPSBfaW5zdGFuY2VzRGF0YVtpbnN0YW5jZUlkIC0gMV0gfHwge307XG4gIGNvbnN0IGF1dG9TdWdnZXN0UG9vbERhdGEgPSBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhIHx8IFtdO1xuICBjb25zdCBtYXRjaGluZ1N1Z2dlc3Rpb25zID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdXRvU3VnZ2VzdFBvb2xEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF1dG9TdWdnZXN0UG9vbERhdGFbaV07XG4gICAgaWYgKHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGlucHV0VmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpID09PSAwKSB7XG4gICAgICBtYXRjaGluZ1N1Z2dlc3Rpb25zLnB1c2goc3VnZ2VzdGlvbik7XG4gICAgICBpZiAobWF0Y2hpbmdTdWdnZXN0aW9ucy5sZW5ndGggPj0gbWF4U3VnZ2VzdENvdW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaGluZ1N1Z2dlc3Rpb25zO1xufVxuXG4vKipcbiAqIF9maW5kU3VnZ2VzdGlvbnMgLSBtYWtlcyB0aGUgcmVxdWVzdCB0byB0aGUgc3VnZ2VzdGlvbnMgYXBpIGFuZCBhY3RzIGFjY29yZGluZ2x5IHRocm91Z2hcbiAqICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBpbnB1dFZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgYXMgYSB0cmltbWVkIHN0cmluZy5cbiAqIEBwYXJhbSAge29iamVjdH0gJGlucHV0IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGlucHV0IGluIHVzZS5cbiAqL1xuZnVuY3Rpb24gX2ZpbmRTdWdnZXN0aW9ucyhpbnB1dFZhbHVlLCAkaW5wdXQpIHtcbiAgLy8gVE9ETzogdXBkYXRlIHRvIGdldCBzdWdnZXN0aW9uIHJlc3VsdHMgbGlzdCBmcm9tIFMmUCBlbmRwb2ludCBvbmNlIHRoZSBKU09OIGZlZWQgaXMgcmVhZHlcblxuICAvLyBwcmVwIHN1Z2dlc3Rpb24gZGF0YSBmb3IgdmlldyB1cGRhdGVzXG4gIGNvbnN0IHN1Z2dlc3Rpb25zRGF0YSA9IHtcbiAgICByZXN1bHRzOiBfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QoaW5wdXRWYWx1ZSwgJGlucHV0KSxcbiAgfTtcblxuICAvLyB0aGlzIGZ1bmN0aW9uIGNsZWFucyB1cCB0aGUgdHlwZWFoZWFkIGlmIG5vIHJlc3VsdHMgYXJlIHJldHVybmVkIG9yIGlmIGFuIGVycm9yIGhhc1xuICAvLyBvY2N1cnJlZCwgc28gbm8gZXJyb3IgY2FsbGJhY2sgaXMgcmVxdWlyZWQuXG4gIF91cGRhdGVUeXBlYWhlYWQoc3VnZ2VzdGlvbnNEYXRhLCAkaW5wdXQpO1xufVxuXG4vKipcbiAqIF9rZXlib2FyZE5hdmlnYXRpb24gLSBhbGxvd3Mga2V5Ym9hcmQgbmF2aWdhdGlvbiB0aHJvdWdoIGFuZCBvdXQgb2YgdGhlIHR5cGVhaGVhZC4gdGhpcyBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgZnVuY3Rpb25zIGJvdW5kIHRvIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgdHlwZWFoZWFkLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gJGlucHV0ICAgICBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbnB1dCBpbiB1c2UuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICR0eXBlYWhlYWQgalF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHlwZWFoZWFkIGRpc3BsYXllZC5cbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgICAgICB0aGUga2V5ZG93biBldmVudFxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgIHByZXZlbnQgZGVmYXVsdCBldmVudCBiZWhhdmlvdXJcbiAqL1xuZnVuY3Rpb24gX2tleWJvYXJkTmF2aWdhdGlvbigkaW5wdXQsICR0eXBlYWhlYWQsIGV2ZW50KSB7XG4gIGNvbnN0IGlucHV0SXNGb2N1c3NlZCA9ICRpbnB1dC5pcygnOmZvY3VzJyk7XG4gIGNvbnN0ICRzdWdnZXN0aW9ucyA9ICR0eXBlYWhlYWQuZmluZCgnYScpO1xuICBjb25zdCBudW1TdWdnZXN0aW9ucyA9ICRzdWdnZXN0aW9ucy5sZW5ndGg7XG5cbiAgLy8gaWYgdGhlIGlucHV0IGZvY3Vzc2VkIGp1bXAgdG8gZWl0aGVyIGVuZCBvZiB0aGUgdHlwZWFoZWFkIHN1Z2dlc3Rpb25zLlxuICBpZiAoaW5wdXRJc0ZvY3Vzc2VkICYmICQuaW5BcnJheShldmVudC5rZXlDb2RlLCBbS0VZQ09ERV9VUCxcbiAgICBLRVlDT0RFX0RPV05dKSA+IC0xKSB7XG4gICAgY29uc3Qgc2VsZWN0SW5kZXggPSAoZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9ET1dOKSA/IDAgOiBudW1TdWdnZXN0aW9ucyAtIDE7XG4gICAgX3VwZGF0ZVNlbGVjdGVkU3VnZ2VzdGlvbigkc3VnZ2VzdGlvbnMsIHNlbGVjdEluZGV4KTtcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGl0cyBlbnRlciBvbiBhIHR5cGVhaGVhZCBzdWdnZXN0aW9uLCByZWRpcmVjdCB0aGVtIHRvIHRoZSBzZWFyY2ggcmVzdWx0cywgYXNcbiAgLy8gbG9uZyBhcyB0aGV5IGFyZW4ndCBjdXJyZW50bHkgb24gdGhlIHJlc3VsdHMgcGFnZS5cbiAgfSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9FTlRFUiAmJiAhSVNfUkVTVUxUU19QQUdFICYmICFpbnB1dElzRm9jdXNzZWQpIHtcbiAgICB3aW5kb3cubG9jYXRpb24gPSBldmVudC5jdXJyZW50VGFyZ2V0LmhyZWY7XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmIHRoZXkgYXJlIHVzaW5nIGFycm93IG9yIHRhYiBuYXZpZ2F0aW9uIG1vdmUgdGhlbSB0byB0aGUgbmV4dCBhcHByb3ByaWF0ZSByZXN1bHQuXG4gIH0gaWYgKCQuaW5BcnJheShldmVudC5rZXlDb2RlLCBbS0VZQ09ERV9UQUIsXG4gICAgS0VZQ09ERV9VUCxcbiAgICBLRVlDT0RFX0RPV05dKSA+IC0xKSB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gJHN1Z2dlc3Rpb25zLmluZGV4KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIC8vIGdvIGRvd24gYW4gaW5kZXggZm9yIHVwIGFycm93IG9yIHNoaWZ0LXRhYiwgb3RoZXJ3aXNlIHVwLlxuICAgIGNvbnN0IGluZGV4T2Zmc2V0ID0gKGV2ZW50LmtleUNvZGUgPT09IEtFWUNPREVfVVBcbiAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9UQUIpKSA/IC0xIDogMTtcbiAgICBjb25zdCBzZWxlY3RJbmRleCA9IGN1cnJlbnRJbmRleCArIGluZGV4T2Zmc2V0O1xuXG4gICAgaWYgKHNlbGVjdEluZGV4ID09PSAtMSB8fCBzZWxlY3RJbmRleCA9PT0gbnVtU3VnZ2VzdGlvbnMpIHtcbiAgICAgIC8vIGlmIG5vdCBhbiBpbmRleCB3aXRoaW4gdGhlIHJhbmdlIGZvY3VzIHRoZSBpbnB1dFxuICAgICAgJGlucHV0LmZvY3VzKCk7XG4gICAgICBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uKCRzdWdnZXN0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBuYXZpZ2F0ZSB0aGUgdHlwZWFoZWFkLlxuICAgICAgX3VwZGF0ZVNlbGVjdGVkU3VnZ2VzdGlvbigkc3VnZ2VzdGlvbnMsIHNlbGVjdEluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gaWYgKCFpbnB1dElzRm9jdXNzZWQgJiYgZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9FU0NBUEUpIHtcbiAgICAkaW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm4gX2NsZWFyVHlwZWFoZWFkKCRpbnB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uIC0gdXBkYXRlIGF1dG8gc3VnZ2VzdGlvbiBpdGVtIHNlbGVjdGVkIHN0YXRlcyBvbiB2aWV3XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAkc3VnZ2VzdGlvbnMgIGpxdWVyeSBjb2xsZWN0aW9uIG9mIGFsbCBzdWdnZXN0aW9uIGFuY2hvciBpdGVtc1xuICogQHBhcmFtICB7b2JqZWN0fSBzZWxlY3RJbmRleCAgY3VycmVudCBzZWxlY3RlZCBpdGVtIGluZGV4XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uKCRzdWdnZXN0aW9ucywgc2VsZWN0SW5kZXggPSAtMSkge1xuICAkc3VnZ2VzdGlvbnMuZWFjaCgoaWR4LCBlbGUpID0+IHtcbiAgICBjb25zdCAkc3VnZ2VzdGlvbiA9ICQoZWxlKTtcbiAgICBjb25zdCAkc3VnZ2VzdGlvbldyYXBwZXIgPSAkc3VnZ2VzdGlvbi5wYXJlbnQoJ2xpJyk7XG4gICAgaWYgKGlkeCA9PT0gc2VsZWN0SW5kZXgpIHtcbiAgICAgICRzdWdnZXN0aW9uLmZvY3VzKCk7XG4gICAgICAkc3VnZ2VzdGlvbldyYXBwZXIuYXR0cignYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRzdWdnZXN0aW9uV3JhcHBlci5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBfaW5wdXRLZXlCaW5kaW5ncyAtIG1vbml0b3Iga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBzZWFyY2ggaW5wdXQgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGUgYmVoYXZpb3VyLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgICB0aGUga2V5dXAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIF9pbnB1dEtleUJpbmRpbmdzKGV2ZW50KSB7XG4gIGNvbnN0ICRpbnB1dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gIGNvbnN0IGlucHV0VmFsdWUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlLnRyaW0oKTtcblxuICAvLyBwcmV2ZW50IGFycm93IGtleXMgZnJvbSBrZXlib2FyZCBuYXYgZnJvbSByZS1yZW5kZXJpbmcgdGhlIHN1Z2dlc3Rpb25zLlxuICBpZiAoJC5pbkFycmF5KGV2ZW50LmtleUNvZGUsIFtLRVlDT0RFX0VOVEVSLFxuICAgIEtFWUNPREVfVEFCLFxuICAgIEtFWUNPREVfVVAsXG4gICAgS0VZQ09ERV9ET1dOXSkgPiAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbnB1dFZhbHVlLmxlbmd0aCA+PSBDSEFSX1RIUkVTSE9MRCkge1xuICAgIC8vIHRyeSB0byBwcm92aWRlIHN1Z2dlc3Rpb25zIGluIHRoZSB0eXBlYWhlYWQgZHJvcGRvd25cbiAgICBfZmluZFN1Z2dlc3Rpb25zKGlucHV0VmFsdWUsICRpbnB1dCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY2xlYW4gdXAgYW5kIGNsb3NlIHRoZSB0eXBlYWhlYWQuXG4gICAgcmV0dXJuIF9jbGVhclR5cGVhaGVhZCgkaW5wdXQpO1xuICB9XG59XG5cbi8qKlxuICogX2lucHV0TmF2QmluZGluZ3MgLSBhbGxvdyB0aGUgdXNlciB0byBlbnRlciB0aGUgdHlwZWFoZWFkIHVzaW5nIGFycm93IGtleXMuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBldmVudCAgIHRoZSBrZXlkb3duIGV2ZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvdXIuXG4gKi9cbmZ1bmN0aW9uIF9pbnB1dE5hdkJpbmRpbmdzKGV2ZW50KSB7XG4gIGNvbnN0ICRpbnB1dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gIGNvbnN0ICR0eXBlYWhlYWQgPSAkaW5wdXQuc2libGluZ3MoQ0xBU1NfVFlQRUFIRUFEKTtcblxuICAvLyB1cCBhbmQgZG93biBhcnJvd3Mgd2lsbCBlbnRlciB0aGUgdHlwZWFoZWFkLlxuICBpZiAoJC5pbkFycmF5KGV2ZW50LmtleUNvZGUsIFtLRVlDT0RFX0VTQ0FQRSxcbiAgICBLRVlDT0RFX0VOVEVSLFxuICAgIEtFWUNPREVfVVAsXG4gICAgS0VZQ09ERV9ET1dOXSkgPiAtMSkge1xuICAgIC8vIGlmIHRoZSB0eXBlYWhlYWQgaXNuJ3QgdmlzaWJsZSwgZG9uJ3QgaGlqYWNrIHRoZSBrZXlib2FyZC5cbiAgICBpZiAoISR0eXBlYWhlYWQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBrZXlib2FyZCBuYXZpZ2F0aW9uIGludG8gYW5kIG91dCBvZiB0eXBlYWhlYWQgZnJvbSBpbnB1dC5cbiAgICByZXR1cm4gX2tleWJvYXJkTmF2aWdhdGlvbigkaW5wdXQsICR0eXBlYWhlYWQsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIF90eXBlYWhlYWRLZXlCaW5kaW5ncyAtIHNldHRpbmcgdXAgaGFuZGxpbmcgb2Yga2V5Ym9hcmQgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIHR5cGVhaGVhZC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGV2ZW50ICAgdGhlIGtleWRvd24gZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIF90eXBlYWhlYWRLZXlCaW5kaW5ncyhldmVudCkge1xuICBjb25zdCAkdHlwZWFoZWFkID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KENMQVNTX1RZUEVBSEVBRCk7XG4gIGNvbnN0ICRpbnB1dCA9ICR0eXBlYWhlYWQuc2libGluZ3MoQ0xBU1NfSU5QVVQpO1xuXG4gIHJldHVybiBfa2V5Ym9hcmROYXZpZ2F0aW9uKCRpbnB1dCwgJHR5cGVhaGVhZCwgZXZlbnQpO1xufVxuXG4vKipcbiAqIF9oYW5kbGVGb3JtU3VibWlzc2lvbiAtIGhpamFja3MgdGhlIGZvcm0gc3VibWlzc2lvbiBzbyB0aGUgcXVlcnkgc3RyaW5nIGNhbiBiZSB1cmkgZW5jb2RlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGJlaW5nIG1hbnVhbGx5IHJlZGlyZWN0ZWQgdG8gdGhlIHJlc3VsdHMgcGFnZS5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGV2ZW50ICB0aGUgc3VibWl0IGV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSAgcHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbi5cbiAqL1xuZnVuY3Rpb24gX2hhbmRsZUZvcm1TdWJtaXNzaW9uKGV2ZW50KSB7XG4gIGNvbnN0ICRmb3JtID0gJChldmVudC50YXJnZXQpO1xuICBjb25zdCAkaW5wdXQgPSAkZm9ybS5maW5kKENMQVNTX0lOUFVUKTtcbiAgY29uc3QgcXVlcnkgPSAkaW5wdXQudmFsKCkudHJpbSgpO1xuICB3aW5kb3cubG9jYXRpb24gPSBgJHskZm9ybS5hdHRyKCdhY3Rpb24nKX0/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YDtcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogX2hhbmRsZVNlYXJjaEZpZWxkRm9jdXNDaGFuZ2UgLSB1cGRhdGUgcHJlc2VudGF0aW9uYWwgZm9jdXMgc3RhdGUgd2hlbiBzZWFyY2ggZmllbGQgZm9jdXMgc3RhdGUgY2hhbmdlc1xuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgIHRoZSBmb2N1cyBjaGFuZ2UgZXZlbnRzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBfaGFuZGxlU2VhcmNoRmllbGRGb2N1c0NoYW5nZShldmVudCkge1xuICBjb25zdCAkaW5wdXRXcmFwcGVyID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoQ0xBU1NfV1JBUFBFUik7XG4gIGlmIChldmVudC50eXBlID09PSAnZm9jdXMnKSB7XG4gICAgJGlucHV0V3JhcHBlci5hZGRDbGFzcyhDT05TVEFOVFMuQ0xBU1NFUy5GT0NVU0VEKTtcbiAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAnYmx1cicpIHtcbiAgICAkaW5wdXRXcmFwcGVyLnJlbW92ZUNsYXNzKENPTlNUQU5UUy5DTEFTU0VTLkZPQ1VTRUQpO1xuICB9XG59XG5cbi8qKlxuICogX2Nsb3NlVHlwZWFoZWFkT25CbHVyIC0gZGlzbWlzcyBhbGwgdHlwZWFoZWFkcyB3aGVuIGNsaWNrIG91dCBvZiB0aGUgc2VhcmNoIGlucHV0XG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gIGRvIG5vdCBwcmV2ZW50IHByb3BhZ2F0aW9uLlxuICovXG5mdW5jdGlvbiBfY2xvc2VUeXBlYWhlYWRPbkJsdXIoZXZlbnQpIHtcbiAgY29uc3QgY2xpY2tlZE91dHNpZGVTZWFyY2hGb3JtID0gISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KENMQVNTX1dSQVBQRVIpLmxlbmd0aDtcblxuICBpZiAoY2xpY2tlZE91dHNpZGVTZWFyY2hGb3JtKSB7XG4gICAgJChgJHtDTEFTU19JTlBVVH1bZGF0YS10eXBlYWhlYWQ9dHJ1ZV1gKS5lYWNoKCgkZWxlbWVudCkgPT4ge1xuICAgICAgX2NsZWFyVHlwZWFoZWFkKCQoJGVsZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIF9pbml0VHlwZWFoZWFkIC0gc2V0IHVwIHZhcmlvdXMgZXZlbnQgYmluZGluZ3MgdG8gY29udHJvbCB0aGUgdHlwZWFoZWFkLlxuICovXG5mdW5jdGlvbiBfaW5pdFR5cGVhaGVhZCgpIHtcbiAgJChkb2N1bWVudClcbiAgICAvLyBiaW5kIHRvIGtleSBldmVudHMgb24gdGhlIGlucHV0cy5cbiAgICAub24oJ2lucHV0JywgYCR7Q0xBU1NfSU5QVVR9W2RhdGEtdHlwZWFoZWFkPXRydWVdYCwgZGVib3VuY2UoX2lucHV0S2V5QmluZGluZ3MsIEFVVE9fU1VHR0VTVF9ERUJPVU5DRV9XQUlUKSlcbiAgICAub24oJ2tleWRvd24nLCBgJHtDTEFTU19JTlBVVH1bZGF0YS10eXBlYWhlYWQ9dHJ1ZV1gLCBfaW5wdXROYXZCaW5kaW5ncylcbiAgICAub24oJ2ludGVybmFsLXNlYXJjaCcsIGAke0NMQVNTX0lOUFVUfVtkYXRhLXR5cGVhaGVhZD10cnVlXWAsIChlKSA9PiB7XG4gICAgICBfY2xlYXJUeXBlYWhlYWQoJChlLnRhcmdldCkpO1xuICAgIH0pXG5cbiAgICAvLyBiaW5kIGtleSBldmVudHMgdG8gdGhlIHR5cGVhaGVhZCBhbmNob3JzLlxuICAgIC5vbigna2V5ZG93bicsIGAke0NMQVNTX1RZUEVBSEVBRH0gYWAsIF90eXBlYWhlYWRLZXlCaW5kaW5ncylcbiAgICAub24oJ2NsaWNrJywgX2Nsb3NlVHlwZWFoZWFkT25CbHVyKTtcbn1cblxuLyoqXG4gKiBfYmluZEV2ZW50cyAtIGJpbmQgc2VhcmNoIGZvcm0gZXZlbnRzXG4gKlxuICogTm90ZTogdGhpcyBtZXRob2Qgc3VwcG9ydHMgaGFuZGxpbmcgcGVyIGluZGl2aWR1YWwgc2VhcmNoIGZvcm0gY29tcG9uZW50IGluc3RhbmNlc1xuICovXG5mdW5jdGlvbiBfYmluZEV2ZW50cygpIHtcbiAgJChDTEFTU19JTlBVVCkub24oJ2JsdXIgZm9jdXMnLCBfaGFuZGxlU2VhcmNoRmllbGRGb2N1c0NoYW5nZSk7XG5cbiAgLy8gVE9ETzogcHJvYmFibHkgbmVlZCB0byBtb3ZlICdJU19SRVNVTFRTX1BBR0UnIGZsYWcgaW50byBBRU0gYXMgY29tcG9uZW50IGNvbmZpZ1xuICBpZiAoIUlTX1JFU1VMVFNfUEFHRSkge1xuICAgIC8vIHN1Ym1pdCBzZWFyY2ggZm9ybSBvbmx5IGlmIG5vdCBhbHJlYWR5IG9uIHNlYXJjaCByZXN1bHRzIHBhZ2VcbiAgICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJy5zZWFyY2gtZm9ybScsIF9oYW5kbGVGb3JtU3VibWlzc2lvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBfb3BlbkRyYXdlciAtIG9wZW5zIHVwIHRoZSBzZWFyY2ggZHJhd2VyLlxuICovXG5mdW5jdGlvbiBfb3BlbkRyYXdlcihlKSB7XG4gIGNvbnN0ICRzZWFyY2hXcmFwcGVyID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmhlYWRlci13cmFwJyk7XG4gIGNvbnN0ICRzZWFyY2hPdmVybGF5ID0gJHNlYXJjaFdyYXBwZXIuZmluZChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKTtcbiAgY29uc3QgJHNlYXJjaENvbnRhaW5lciA9ICRzZWFyY2hPdmVybGF5LnNpYmxpbmdzKCcuc2VhcmNoLWZvcm0tY29udGFpbmVyJyk7XG4gIGNvbnN0ICRzZWFyY2hpbnB1dCA9ICRzZWFyY2hDb250YWluZXIuZmluZChDTEFTU19JTlBVVCk7XG5cbiAgJHNlYXJjaENvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRzZWFyY2hpbnB1dC5mb2N1cygpO1xuICAkc2VhcmNoT3ZlcmxheS5hZGRDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRib2R5LmFkZENsYXNzKENMQVNTX05PX1NDUk9MTCk7XG4gICQoYC4ke0NMQVNTX0NUQV9TRUFSQ0hfT1BFTn1gKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gIHNldFJlc3RyaWN0Rm9jdXMoJ3NlYXJjaGJhcicsICRzZWFyY2hDb250YWluZXIpO1xufVxuXG4vKipcbiAqIF9jbG9zZURyYXdlciAtIGNsb3NlIHRoZSBzZWFyY2ggZHJhd2VyXG4gKi9cbmZ1bmN0aW9uIF9jbG9zZURyYXdlcihlKSB7XG4gIGNvbnN0ICRzZWFyY2hXcmFwcGVyID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmhlYWRlci13cmFwJyk7XG4gIGNvbnN0ICRzZWFyY2hPdmVybGF5ID0gJHNlYXJjaFdyYXBwZXIuZmluZChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKTtcbiAgY29uc3QgJHNlYXJjaENvbnRhaW5lciA9ICRzZWFyY2hPdmVybGF5LnNpYmxpbmdzKCcuc2VhcmNoLWZvcm0tY29udGFpbmVyJyk7XG4gIGNvbnN0ICRzZWFyY2hPcGVuQnV0dG9uID0gJHNlYXJjaFdyYXBwZXIuZmluZCgnLmN0YS1zZWFyY2gtZm9ybS1vcGVuJyk7XG5cbiAgJHNlYXJjaENvbnRhaW5lci5yZW1vdmVDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRzZWFyY2hPcGVuQnV0dG9uLmZvY3VzKCk7XG4gICRzZWFyY2hPdmVybGF5LnJlbW92ZUNsYXNzKENMQVNTX0RSQVdFUl9PUEVOKTtcbiAgJGJvZHkucmVtb3ZlQ2xhc3MoQ0xBU1NfTk9fU0NST0xMKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PUEVOfWApLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gIHVuc2V0UmVzdHJpY3RGb2N1cygnc2VhcmNoYmFyJywgJHNlYXJjaENvbnRhaW5lcik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBfaW5pdERyYXdlciAtIHNldCB1cCB2YXJpb3VzIGJpbmRpbmdzIHRvIGNvbnRyb2wgdGhlIHNlYXJjaCBkcmF3ZXIuXG4gKlxuICogTm90ZTogdGhpcyBtZXRob2QgYXNzdW1lcyB0aGVyZSdzIG9ubHkgb25lIGluc3RhbmNlIG9mIHNlYXJjaCBmb3JtIGNvbXBvbmVudCB0aGF0J3MgY291cGxlZCB3aXRoIHRvcCBuYXZcbiAqL1xuZnVuY3Rpb24gX2luaXREcmF3ZXIoKSB7XG4gIC8vIGlmIHlvdSBjbGljayBvbiB0aGUgc2VhcmNoIGJ1dHRvbiwgb3BlbiB0aGUgc2VhcmNoIG1vZGFsLlxuICAkKGAuJHtDTEFTU19DVEFfU0VBUkNIX09QRU59YCkub24oJ2NsaWNrJywgKGUpID0+IF9vcGVuRHJhd2VyKGUpKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9DTE9TRX1gKS5vbignY2xpY2snLCAoZSkgPT4gX2Nsb3NlRHJhd2VyKGUpKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKS5vbignY2xpY2snLCAoZSkgPT4gX2Nsb3NlRHJhd2VyKGUpKTtcbn1cblxuZnVuY3Rpb24gX3ByZXBJbnN0YW5jZXNBbmREYXRhKCkge1xuICBjb25zdCAkYWxsU2VhcmNoSW5wdXRzID0gJChDTEFTU19JTlBVVCk7XG5cbiAgLy8gUG9wdWxhdGUgaW5zdGFuY2UgbGV2ZWwgZ2xvYmFsIGRhdGEgYXJyYXkgZm9yIGFsbCBpbnN0YW5jZXNcbiAgJGFsbFNlYXJjaElucHV0cy5lYWNoKChpZHgsIGVsZSkgPT4ge1xuICAgIGNvbnN0ICRpbnB1dCA9ICQoZWxlKTtcbiAgICBjb25zdCBpbnN0YW5jZUlkID0gaWR4ICsgMTtcbiAgICBjb25zdCBhdXRvU3VnZ2VzdEVuZHBvaW50ID0gJGlucHV0LmF0dHIoJ2RhdGEtYXBpLWJhc2UnKSB8fCAnJztcbiAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB7XG4gICAgICBpZDogaW5zdGFuY2VJZCxcbiAgICAgIGF1dG9TdWdnZXN0RW5kcG9pbnQsXG4gICAgICBhdXRvU3VnZ2VzdFByb21pc2U6IG51bGwsXG4gICAgICBhdXRvU3VnZ2VzdERhdGE6IG51bGwsXG4gICAgfTtcblxuICAgIC8vIHVwZGF0ZSBnbG9iYWwgaW5zdGFuY2VzIGRhdGEgbGlzdFxuICAgIF9pbnN0YW5jZXNEYXRhLnB1c2goaW5zdGFuY2VEYXRhKTtcblxuICAgIC8vIHVwZGF0ZSBpbnN0YW5jZSBpZCB0byB2aWV3XG4gICAgY29uc3QgYXV0b1N1Z2dlc3RMaXN0SWQgPSBgc2VhcmNoLWZvcm0tYXV0by1zdWdnZXN0aW9ucy0ke2luc3RhbmNlSWR9YDtcbiAgICBjb25zdCAkYXV0b1N1Z2dlc3RMaXN0ID0gJGlucHV0LmNsb3Nlc3QoQ0xBU1NfV1JBUFBFUikuZmluZChgJHtDTEFTU19UWVBFQUhFQUR9ID4gdWxgKTtcbiAgICAkaW5wdXRcbiAgICAgIC5hdHRyKHtcbiAgICAgICAgJ2RhdGEtaW5zdGFuY2UtaWQnOiBpbnN0YW5jZUlkLFxuICAgICAgICAnYXJpYS1vd25zJzogYXV0b1N1Z2dlc3RMaXN0SWQsXG4gICAgICB9KTtcbiAgICAkYXV0b1N1Z2dlc3RMaXN0LmF0dHIoJ2lkJywgYXV0b1N1Z2dlc3RMaXN0SWQpO1xuXG4gICAgLy8gY2hlY2sgYXV0byBzdWdnZXN0IHBvb2wgZW5kcG9pbnRcbiAgICBpZiAoIWF1dG9TdWdnZXN0RW5kcG9pbnQubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTRl0nLCAnSW52YWxpZCBhdXRvIHN1Z2dlc3QgZGF0YSBlbmRwb2ludCBmb3IgaW5zdGFuY2U6JywgaW5zdGFuY2VJZCwgYXV0b1N1Z2dlc3RFbmRwb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgY3VycmVudCBpbnN0YW5jZSdzIGVuZHBvaW50IGlzIHRoZSBzYW1lIGFzIHByZXZpb3VzIG9uZSB0byBzYXZlIHVubmVjZXNzYXJ5IHJlbW90ZSBjYWxsc1xuICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2VJbmRleCA9IGlkeCAtIDE7XG4gICAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlRGF0YSA9IF9pbnN0YW5jZXNEYXRhW3ByZXZpb3VzSW5zdGFuY2VJbmRleF0gfHwge307XG4gICAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlQXV0b1N1Z2dlc3RFbmRwb2ludCA9IHByZXZpb3VzSW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0RW5kcG9pbnQ7XG4gICAgICBpZiAoYXV0b1N1Z2dlc3RFbmRwb2ludC5sZW5ndGggJiYgYXV0b1N1Z2dlc3RFbmRwb2ludCA9PT0gcHJldmlvdXNJbnN0YW5jZUF1dG9TdWdnZXN0RW5kcG9pbnQpIHtcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHByZXZpb3VzIGF1dG8gc3VnZ2VzdCByZXF1ZXN0IHByb21pc2UgaWYgZW5kcG9pbnQgbWF0Y2hlc1xuICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID0gcHJldmlvdXNJbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIG5vIHNhbWUgZW5kcG9pbnQgcmVxdWVzdCBmb3VuZCBmcm9tIG90aGVyIGluc3RhbmNlcywgY3JlYXRlIG5ld1xuICAgIGlmIChpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID09PSBudWxsKSB7XG4gICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID0gJC5nZXQoYXV0b1N1Z2dlc3RFbmRwb2ludCk7XG4gICAgfVxuXG4gICAgLy8gcmV0cmlldmUgYmFzaWMgYXV0byBzdWdnZXN0IHJlc3VsdHMgcG9vbCBkYXRhXG4gICAgaW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0UHJvbWlzZVxuICAgICAgLmRvbmUoKGRhdGFTdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NGXScsICdJbnZhbGlkIGF1dG8gc3VnZ2VzdCBkYXRhIHN0cmluZzonLCBpbnN0YW5jZUlkLCBkYXRhU3RyaW5nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RlOiBTJlAgYXV0byBjb21wbGV0ZSBkYXRhIHNvdXJjZSByZXR1cm5zIGluIGRlcHJlY2F0ZWQgSlNPTlAgc3RyaW5nIGZvcm1hdCxcbiAgICAgICAgLy8gbmVlZCBjbGVhbi11cCBiZWZvcmUgcGFyc2UgaXRcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IGRhdGFTdHJpbmcudHJpbSgpLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhID0gSlNPTi5wYXJzZShqc29uU3RyaW5nLnRyaW0oKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhID0gbnVsbDtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTRl0nLCAnSW52YWxpZCBhdXRvIHN1Z2dlc3QgSlNPTiBzdHJpbmc6JywgaW5zdGFuY2VJZCwganNvblN0cmluZywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmFpbCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NGXScsICdFcnJvciBnZXR0aW5nIGF1dG8gc3VnZ2VzdCByZXN1bHRzIHBvb2wgZGF0YScsIGluc3RhbmNlSWQpO1xuICAgICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0KCkge1xuICBfYmluZEV2ZW50cygpO1xuICBfaW5pdERyYXdlcigpO1xuXG4gIC8vIHVwZGF0ZSBpbmRpdmlkdWFsIGluc3RhbmNlIGVsZW1lbnQgRE9NIGFuZCBwcmVwIGluc3RhbmNlIGRhdGFcbiAgLy8gdGhpcyB3aWxsIGdldCAnX2luc3RhbmNlc0RhdGEnIGxpc3QgcmVhZHlcbiAgX3ByZXBJbnN0YW5jZXNBbmREYXRhKCk7XG5cbiAgLy8gb25seSBpbml0IHR5cGUgYWhlYWQgd2hlbiBhbGwgaW5zdGFuY2VzIGhhdmUgcmVzb2x2ZSB0aGVpciByZW1vdGUgcmVxdWVzdHNcbiAgY29uc3QgYWxsSW5zdGFuY2VzUHJvbWlzZXMgPSBbXTtcbiAgX2luc3RhbmNlc0RhdGEuZm9yRWFjaCgoaW5zdGFuY2VEYXRhKSA9PiB7XG4gICAgaWYgKGluc3RhbmNlRGF0YS5hdXRvU3VnZ2VzdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgIGFsbEluc3RhbmNlc1Byb21pc2VzLnB1c2goaW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0UHJvbWlzZSk7XG4gICAgfVxuICB9KTtcbiAgJC53aGVuKC4uLmFsbEluc3RhbmNlc1Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICBfaW5pdFR5cGVhaGVhZCgpO1xuICB9KTtcbn1cblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBpbml0KCk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///7876
// EXTERNAL MODULE: ./node_modules/picturefill/dist/picturefill.js
var picturefill = __webpack_require__(7229);; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/polyfills/objectFit.js
/* eslint-disable no-undef */
function objectFit() {
// Constants
var CLASS_OBJECT_FIT = 'js-object-fit';
/**
* _parseSourceset($context)
*
* @param {jQuery} $source - source item as jquery object
* @return {string} source - best path available in the srcset for the current source item
*/
function _parseSourceset($source) {
var source = false;
if (window.matchMedia($source.attr('media')).matches) {
var srcset = $source.attr('srcset');
var regEx = new RegExp(' [0-9]+w$');
source = srcset.replace(regEx, '');
}
return source;
}
/**
* retrieveSource($img, isPicture)
*
* @param {jQuery} $img - current image with the class js-object-it
* @param {boolean} isPicture - if the image is inside a picture tag or not
* @return {String} - the best available source for the current image
*/
function _retrieveSource($img, isPicture) {
// if srcset feature is available
// just return the current source used
if (Modernizr.srcset) {
return $img[0].currentSrc;
} // if it's a picture tag and the srcset feature does not work
// parse the source nodes to find the best value possible
if (isPicture) {
var $sources = $img.parent().find('source');
var source = false;
$sources.each(function() {
source = source || _parseSourceset($(this));
});
if (source) {
return source;
}
} // or just return the src attribute from the image tag
return $img.prop('src');
}
/**
* _init()
*
* if you place the class .js-object-fit on an <img> element which uses the object-fit css
* property, this polyfill will replace the element with a div and use background styles to
* emulate the appearance. this works within a <picture> element too, as long as the classes are
* placed on the <img> within it.
*/
function init() {
if (Modernizr && Modernizr.objectfit) {
return;
}
$(".".concat(CLASS_OBJECT_FIT)).each(function() {
var $node = $(this);
var $img;
var $picture;
var isAdaptiveImg = $node.hasClass('adpimg__container');
if (isAdaptiveImg) {
// Adaptive image
$img = $node.find('img');
$picture = $node.find('picture');
} else {
// img tag with js-object-fit
$img = $node;
$picture = $node.parent('picture');
}
var isPicture = $picture.length;
var imgCurrentSrc = _retrieveSource($img, isPicture);
var imgClasses = $img.attr('class');
var $nodeToReplace = isPicture ? $picture : $img; // create the new dom node.
var $newNode = $('<div>').css({
backgroundImage: "url(".concat(imgCurrentSrc, ")")
}).addClass("".concat(imgClasses, " polyfill-object-fit")).removeClass(CLASS_OBJECT_FIT); // Remove class from adaptive image container
if (isAdaptiveImg) {
$node.removeClass(CLASS_OBJECT_FIT);
} // setup a min-height in case the image is providing the height for it's parent.
if (isPicture) {
$newNode.css({
minHeight: $img.height(),
minWidth: $img.width()
});
} // replace the img element.
$nodeToReplace.replaceWith($newNode);
});
}
return init();
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/picture/clientlib/src/js/picture.js
// NOTE: Consider whether this should be integrated with Modernizr
window.addEventListener('load', function() {
objectFit();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvcG9seWZpbGxzL29iamVjdEZpdC5qcz80NDI1Iiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL3BpY3R1cmUvY2xpZW50bGliL3NyYy9qcy9waWN0dXJlLmpzP2M0MmMiXSwibmFtZXMiOlsib2JqZWN0Rml0IiwiQ0xBU1NfT0JKRUNUX0ZJVCIsIl9wYXJzZVNvdXJjZXNldCIsIiRzb3VyY2UiLCJzb3VyY2UiLCJ3aW5kb3ciLCJtYXRjaE1lZGlhIiwiYXR0ciIsIm1hdGNoZXMiLCJzcmNzZXQiLCJyZWdFeCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJfcmV0cmlldmVTb3VyY2UiLCIkaW1nIiwiaXNQaWN0dXJlIiwiTW9kZXJuaXpyIiwiY3VycmVudFNyYyIsIiRzb3VyY2VzIiwicGFyZW50IiwiZmluZCIsImVhY2giLCIkIiwicHJvcCIsImluaXQiLCJvYmplY3RmaXQiLCIkbm9kZSIsIiRwaWN0dXJlIiwiaXNBZGFwdGl2ZUltZyIsImhhc0NsYXNzIiwibGVuZ3RoIiwiaW1nQ3VycmVudFNyYyIsImltZ0NsYXNzZXMiLCIkbm9kZVRvUmVwbGFjZSIsIiRuZXdOb2RlIiwiY3NzIiwiYmFja2dyb3VuZEltYWdlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIm1pbkhlaWdodCIsImhlaWdodCIsIm1pbldpZHRoIiwid2lkdGgiLCJyZXBsYWNlV2l0aCIsImFkZEV2ZW50TGlzdGVuZXIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNPLFNBQVNBLFNBQVQsR0FBcUI7RUFDMUI7RUFDQSxJQUFNQyxnQkFBZ0IsR0FBRyxlQUF6QjtFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFDRSxTQUFTQyxlQUFULENBQXlCQyxPQUF6QixFQUFrQztJQUNoQyxJ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RCxDQTdCd0MsQ0ErQnpDOzs7TUFDQSxJQUFJYyxTQUFKLEVBQWU7UUFDYm1CLFFBQVEsQ0FBQ0MsR0FBVCxDQUFhO1VBQ1hJLFNBQVMsRUFBRXpCLElBQUksQ0FBQzBCLE1BQUwsRUFEQTtVQUVYQyxRQUFRLEVBQUUzQixJQUFJLENBQUM0QixLQUFMO1FBRkMsQ0FBYjtNQUlELENBckN3QyxDQXVDekM7OztNQUNBVCxjQUFjLENBQUNVLFdBQWYsQ0FBMkJULFFBQTNCO0lBQ0QsQ0F6Q0Q7RUEwQ0Q7O0VBRUQsT0FBT1YsSUFBSSxFQUFYO0FBQ0QsQzs7Q0NqSHFCOztBQUN0QjtBQUVBbkIsTUFBTSxDQUFDdUMsZ0JBQVAsQ0FBd0IsTUFBeEIsRUFBZ0MsWUFBTTtFQUNwQzVDLFNBQVM7QUFDVixDQUZEIiwiZmlsZSI6IjU3MDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEZpdCgpIHtcbiAgLy8gQ29uc3RhbnRzXG4gIGNvbnN0IENMQVNTX09CSkVDVF9GSVQgPSAnanMtb2JqZWN0LWZpdCc7XG5cbiAgLyoqXG4gICAqIF9wYXJzZVNvdXJjZXNldCgkY29udGV4dClcbiAgICpcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRzb3VyY2UgICAtIHNvdXJjZSBpdGVtIGFzIGpxdWVyeSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfSBzb3VyY2UgLSBiZXN0IHBhdGggYXZhaWxhYmxlIGluIHRoZSBzcmNzZXQgZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBpdGVtXG4gICAqL1xuICBmdW5jdGlvbiBfcGFyc2VTb3VyY2VzZXQoJHNvdXJjZSkge1xuICAgIGxldCBzb3VyY2UgPSBmYWxzZTtcblxuICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgkc291cmNlLmF0dHIoJ21lZGlhJykpLm1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IHNyY3NldCA9ICRzb3VyY2UuYXR0cignc3Jjc2V0Jyk7XG4gICAgICBjb25zdCByZWdFeCA9IG5ldyBSZWdFeHAoJyBbMC05XSt3JCcpO1xuICAgICAgc291cmNlID0gc3Jjc2V0LnJlcGxhY2UocmVnRXgsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHJpZXZlU291cmNlKCRpbWcsIGlzUGljdHVyZSlcbiAgICpcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRpbWcgICAgICAgLSBjdXJyZW50IGltYWdlIHdpdGggdGhlIGNsYXNzIGpzLW9iamVjdC1pdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUGljdHVyZSAgLSBpZiB0aGUgaW1hZ2UgaXMgaW5zaWRlIGEgcGljdHVyZSB0YWcgb3Igbm90XG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgICAtIHRoZSBiZXN0IGF2YWlsYWJsZSBzb3VyY2UgZm9yIHRoZSBjdXJyZW50IGltYWdlXG4gICAqL1xuICBmdW5jdGlvbiBfcmV0cmlldmVTb3VyY2UoJGltZywgaXNQaWN0dXJlKSB7XG4gICAgLy8gaWYgc3Jjc2V0IGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gICAgLy8ganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc291cmNlIHVzZWRcbiAgICBpZiAoTW9kZXJuaXpyLnNyY3NldCkge1xuICAgICAgcmV0dXJuICRpbWdbMF0uY3VycmVudFNyYztcbiAgICB9XG5cbiAgICAvLyBpZiBpdCdzIGEgcGljdHVyZSB0YWcgYW5kIHRoZSBzcmNzZXQgZmVhdHVyZSBkb2VzIG5vdCB3b3JrXG4gICAgLy8gcGFyc2UgdGhlIHNvdXJjZSBub2RlcyB0byBmaW5kIHRoZSBiZXN0IHZhbHVlIHBvc3NpYmxlXG4gICAgaWYgKGlzUGljdHVyZSkge1xuICAgICAgY29uc3QgJHNvdXJjZXMgPSAkaW1nLnBhcmVudCgpLmZpbmQoJ3NvdXJjZScpO1xuICAgICAgbGV0IHNvdXJjZSA9IGZhbHNlO1xuICAgICAgJHNvdXJjZXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZSB8fCBfcGFyc2VTb3VyY2VzZXQoJCh0aGlzKSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9yIGp1c3QgcmV0dXJuIHRoZSBzcmMgYXR0cmlidXRlIGZyb20gdGhlIGltYWdlIHRhZ1xuICAgIHJldHVybiAkaW1nLnByb3AoJ3NyYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIF9pbml0KClcbiAgICpcbiAgICogaWYgeW91IHBsYWNlIHRoZSBjbGFzcyAuanMtb2JqZWN0LWZpdCBvbiBhbiA8aW1nPiBlbGVtZW50IHdoaWNoIHVzZXMgdGhlIG9iamVjdC1maXQgY3NzXG4gICAqIHByb3BlcnR5LCB0aGlzIHBvbHlmaWxsIHdpbGwgcmVwbGFjZSB0aGUgZWxlbWVudCB3aXRoIGEgZGl2IGFuZCB1c2UgYmFja2dyb3VuZCBzdHlsZXMgdG9cbiAgICogZW11bGF0ZSB0aGUgYXBwZWFyYW5jZS4gdGhpcyB3b3JrcyB3aXRoaW4gYSA8cGljdHVyZT4gZWxlbWVudCB0b28sIGFzIGxvbmcgYXMgdGhlIGNsYXNzZXMgYXJlXG4gICAqIHBsYWNlZCBvbiB0aGUgPGltZz4gd2l0aGluIGl0LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBpZiAoTW9kZXJuaXpyICYmIE1vZGVybml6ci5vYmplY3RmaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkKGAuJHtDTEFTU19PQkpFQ1RfRklUfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgJG5vZGUgPSAkKHRoaXMpO1xuICAgICAgbGV0ICRpbWc7XG4gICAgICBsZXQgJHBpY3R1cmU7XG5cbiAgICAgIGNvbnN0IGlzQWRhcHRpdmVJbWcgPSAkbm9kZS5oYXNDbGFzcygnYWRwaW1nX19jb250YWluZXInKTtcbiAgICAgIGlmIChpc0FkYXB0aXZlSW1nKSB7XG4gICAgICAgIC8vIEFkYXB0aXZlIGltYWdlXG4gICAgICAgICRpbWcgPSAkbm9kZS5maW5kKCdpbWcnKTtcbiAgICAgICAgJHBpY3R1cmUgPSAkbm9kZS5maW5kKCdwaWN0dXJlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbWcgdGFnIHdpdGgganMtb2JqZWN0LWZpdFxuICAgICAgICAkaW1nID0gJG5vZGU7XG4gICAgICAgICRwaWN0dXJlID0gJG5vZGUucGFyZW50KCdwaWN0dXJlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzUGljdHVyZSA9ICRwaWN0dXJlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGltZ0N1cnJlbnRTcmMgPSBfcmV0cmlldmVTb3VyY2UoJGltZywgaXNQaWN0dXJlKTtcbiAgICAgIGNvbnN0IGltZ0NsYXNzZXMgPSAkaW1nLmF0dHIoJ2NsYXNzJyk7XG4gICAgICBjb25zdCAkbm9kZVRvUmVwbGFjZSA9IChpc1BpY3R1cmUpID8gJHBpY3R1cmUgOiAkaW1nO1xuXG4gICAgICAvLyBjcmVhdGUgdGhlIG5ldyBkb20gbm9kZS5cbiAgICAgIGNvbnN0ICRuZXdOb2RlID0gJCgnPGRpdj4nKS5jc3MoeyBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJHtpbWdDdXJyZW50U3JjfSlgIH0pXG4gICAgICAgIC5hZGRDbGFzcyhgJHtpbWdDbGFzc2VzfSBwb2x5ZmlsbC1vYmplY3QtZml0YClcbiAgICAgICAgLnJlbW92ZUNsYXNzKENMQVNTX09CSkVDVF9GSVQpO1xuXG4gICAgICAvLyBSZW1vdmUgY2xhc3MgZnJvbSBhZGFwdGl2ZSBpbWFnZSBjb250YWluZXJcbiAgICAgIGlmIChpc0FkYXB0aXZlSW1nKSB7XG4gICAgICAgICRub2RlLnJlbW92ZUNsYXNzKENMQVNTX09CSkVDVF9GSVQpO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXR1cCBhIG1pbi1oZWlnaHQgaW4gY2FzZSB0aGUgaW1hZ2UgaXMgcHJvdmlkaW5nIHRoZSBoZWlnaHQgZm9yIGl0J3MgcGFyZW50LlxuICAgICAgaWYgKGlzUGljdHVyZSkge1xuICAgICAgICAkbmV3Tm9kZS5jc3Moe1xuICAgICAgICAgIG1pbkhlaWdodDogJGltZy5oZWlnaHQoKSxcbiAgICAgICAgICBtaW5XaWR0aDogJGltZy53aWR0aCgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVwbGFjZSB0aGUgaW1nIGVsZW1lbnQuXG4gICAgICAkbm9kZVRvUmVwbGFjZS5yZXBsYWNlV2l0aCgkbmV3Tm9kZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gaW5pdCgpO1xufVxuIiwiaW1wb3J0ICdwaWN0dXJlZmlsbCc7IC8vIE5PVEU6IENvbnNpZGVyIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgaW50ZWdyYXRlZCB3aXRoIE1vZGVybml6clxuaW1wb3J0IHsgb2JqZWN0Rml0IH0gZnJvbSAnUG9seWZpbGxzL29iamVjdEZpdCc7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICBvYmplY3RGaXQoKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///5702
_satellite.setCookie("sat_track", "true");
if (true) {
module.exports = __webpack_require__(53);
} else {}
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzPzQwMjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6QyxFQUFFLHdDQUE2RDtBQUMvRCxDQUFDLE1BQU0sRUFFTiIsImZpbGUiOiIzODQwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///3840
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/restrictFocus.js
function set(namespace, $container) {
var eventType = 'focusin.' + namespace;
$container.attr('tabindex', '0');
$(document).on(eventType, function(event) {
if (!$container[0].contains(event.target)) {
event.stopPropagation();
$container.focus();
}
});
}
function unset(namespace, $container) {
var eventType = 'focusin.' + namespace;
$container.attr('tabindex', '-1');
$(document).off(eventType);
}; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/variables/constants.js
var CONSTANTS = {
HASH_CHAR_LIMIT: 50,
CLASSES: {
HIDDEN: 'is-hidden',
ACTIVE: 'is-active',
CURRENT: 'is-current',
FOCUSED: 'is-focused',
ERROR: 'is-error',
OPEN: 'is-open',
DISABLED: 'is-disabled',
HAS_ERROR: 'has-error'
},
KEYBOARD: {
BACKSPACE: 8,
TAB: 9,
ENTER: 13,
ESCAPE: 27,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
DELETE: 46,
FORWARD_SLASH: 191
},
ATTRIBUTES: {
DISABLED: 'disabled',
READONLY: 'readonly',
REQUIRED: 'required',
MAX: 'max',
MIN: 'min'
},
BREAKPOINTS: {
XSM: 0,
SM: 480,
MD: 680,
LG: 970,
XL: 1170,
XXL: 1600
}
};; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/isMq.js
var mq = {
xsm: 0,
sm: 480,
md: 680,
lg: 970,
xl: 1170,
xxl: 1600
};
function isMq(min) {
return window.matchMedia("(min-width: ".concat(mq[min], "px)"));
}
function isBetween(min, max) {
return window.matchMedia("(min-width: ".concat(mq[min], "px) and (max-width: ").concat(mq[max] - 1, "px)"));
} // example of how to use above
// Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Testing_media_queries
// apAEM.HELPERS.isMq('lg').addListener(function(){
// if (apAEM.HELPERS.isMq('lg').matches) {
// console.log('matches');
// } else {
// console.log('does not match');
// }
// });
// apAEM.HELPERS.isBetween('lg', 'xl').addListener(function(){
// if (apAEM.HELPERS.isBetween('lg', 'xl').matches) {
// console.log('matches');
// } else {
// console.log('does not match');
// }
// });
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/scrollTo.js
/**
* scrollToTarget - scroll page to a position or a target element
*
* @param {Object|Number} target target to scroll page to, either be a scroll position or an jQuery object
* @param {Object} shouldScrollFromTop whether should start scrolling from page top
* @return {void}
*/
var scrollToTarget = function scrollToTarget(target) {
var shouldScrollFromTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var speed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
var offset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
var ATTR_SCROLLING = 'data-is-scrolling';
var $body = $('body');
var isScrolling = $body.attr(ATTR_SCROLLING) === 'true';
if (isScrolling) {
return false;
} // check target type and determine target scroll position
var targetPosition;
var $target = $(target[0]);
if (typeof $target === 'number') {
targetPosition = Math.round(Math.abs($target));
} else {
var targetPositionNum = _getTargetScrollPosition($target);
if (targetPositionNum) {
targetPosition = targetPositionNum;
} else {
targetPosition = 0;
}
} // set page scroll to top
var $page = $('html, body');
if (shouldScrollFromTop) {
$page.scrollTop(0);
if (targetPosition === 0) {
return false;
}
} // animate page scroll position
$body.attr(ATTR_SCROLLING, 'true');
$page.animate({
scrollTop: targetPosition + offset
}, speed, function() {
$body.removeAttr(ATTR_SCROLLING);
});
};
/**
* _getTargetScrollPosition - returns target element's scroll position
*
* @param {Object} $target jQuery object of target to scroll page to
* @return {number}
*/
var _getTargetScrollPosition = function _getTargetScrollPosition($target) {
if (!$target || !$target.length) {
return null;
}
var $subnav = $('.subnav[data-sticky-subnav="true"]');
var $globalHeader = $('.global-header#header');
var isMqLG = isMq('lg').matches;
var adjustment = 0;
if (isMqLG && $subnav.length) {
adjustment = $subnav.height();
} else if (!isMqLG && $globalHeader.length) {
adjustment = $globalHeader.height();
}
return $($target[0]).offset().top - adjustment;
};; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/nav.js
// analytics and satellite should be defined globally
analytics = analytics || {};
_satellite = _satellite || {};
analytics.component = analytics.component || {};
analytics.component.link = analytics.component.link || {};
_satellite.track = _satellite.track || function() {
console.warn('_satellite.track is not defined');
};
var UUID_PREFIX = 'MM';
var CLASS_HEADER = '.global-header, .global-header-old';
var CLASS_PRIMARY_NAV = 'primary-nav';
var CLASS_MICROSITE_NAV = 'main-nav';
var CLASS_MICROSITE_NAV_LOGO_LINK = 'main-nav-logo-link';
var CLASS_PRIMARY_CONTAINER = 'pn-container';
var CLASS_PRIMARY_LIST = 'pn-list';
var CLASS_PRIMARY_ITEM = 'pn-item';
var CLASS_PRIMARY_LINK = 'pn-link';
var CLASS_PRIMARY_LOGIN_ITEM = 'pn-login';
var CLASS_PRIMARY_LINK_EXPANDABLE = 'pn-link--expandable';
var CLASS_PRIMARY_LINK_EXPANDABLE_LOCKED = 'pn-link--expandable-locked';
var CLASS_PRIMARY_TOOLS_LIST_CONTAINER = 'pn-tools-list-container';
var CLASS_PRIMARY_TOOLS_LIST = 'pn-link--tools';
var CLASS_PRIMARY_UTILITY_LIST_CONTAINER = 'pn-utility-list-container';
var CLASS_PRIMARY_UTILITY_LIST = 'pn-link--utility';
var CLASS_PRIMARY_TOGGLE = 'js-pn-toggle';
var CLASS_PRIMARY_TRIGGER_OPEN = 'pn-trigger-open';
var CLASS_PRIMARY_TRIGGER_CLOSE = 'js-pn-trigger-close-mobile';
var CLASS_SUBNAV_CONTAINER = 'sub-pn';
var CLASS_SUBNAV_EXPANDABLE = 'sub-pn--expandable';
var CLASS_SUBNAV_LIST = 'sub-pn-list';
var CLASS_SUBNAV_LINK = 'sub-pn-link';
var CLASS_OPEN = 'is-open';
var CLASS_ACTIVE = 'is-active';
var CLASS_TRANSITIONING = 'is-transitioning';
var CLASS_CLOSING = 'is-closing';
var CLASS_HOVER = 'is-hover';
var CLASS_FOCUS = 'is-focused';
var CLASS_NO_SCROLL = 'no-scroll';
var CLASS_HAS_CHILDREN = 'has-children';
var CLASS_BACK_TO_PARENT = 'cta-back-to-parent';
var TIME_SLIDE = 500;
var TIME_EXPANDABLE = 300;
var $body = $('body');
var $header = $(CLASS_HEADER);
var $primaryNav = $(".".concat(CLASS_PRIMARY_NAV));
var $nav = $(".".concat(CLASS_PRIMARY_CONTAINER));
var $micrositeNav = $(".".concat(CLASS_MICROSITE_NAV));
var $micrositeNavLogoLink = $(".".concat(CLASS_MICROSITE_NAV_LOGO_LINK));
var $toolsList = $(".".concat(CLASS_PRIMARY_TOOLS_LIST_CONTAINER));
var $toolsListItem = $(".".concat(CLASS_PRIMARY_TOOLS_LIST));
var $utilityList = $(".".concat(CLASS_PRIMARY_UTILITY_LIST_CONTAINER));
var $trigger = $(".".concat(CLASS_PRIMARY_TOGGLE));
var $triggerOpen = $(".".concat(CLASS_PRIMARY_TRIGGER_OPEN));
var $hasChildren = $(".".concat(CLASS_HAS_CHILDREN));
var $backToParent = $(".".concat(CLASS_BACK_TO_PARENT));
var $childlessLinks = $(".".concat(CLASS_PRIMARY_LINK)).not(".".concat(CLASS_HAS_CHILDREN));
var $expandables = $("\n .".concat(CLASS_SUBNAV_CONTAINER, ",\n .").concat(CLASS_SUBNAV_EXPANDABLE, ",\n .").concat(CLASS_PRIMARY_LINK_EXPANDABLE, ",\n .").concat(CLASS_SUBNAV_LINK, ".").concat(CLASS_HAS_CHILDREN, "\n "));
var isMobile;
/**
* track - analytics for mobile and desktop navs
*
* @param {HTMLElement} el the trackable element.
* @returns {void}
*/
function _track(el) {
analytics.component.link.type = isMobile ? 'mobile nav' : 'desktop nav';
analytics.component.link.category = el.dataset.category;
analytics.component.link.description = el.dataset.description;
_satellite.track('main-navigation');
}
/**
* unHideMobileNavFromSC - un-hides the mobile nav from screen readers
*
* @returns {void}
*/
function _unHideMobileNavFromSC() {
$nav.find(':focusable').removeAttr('tabindex aria-hidden');
}
/**
* hideMobileNavFromSC - hides the mobile nav from screen readers
*
* @returns {void}
*/
function _hideMobileNavFromSC() {
$nav.find(':focusable').attr({
tabindex: '-1',
'aria-hidden': 'true'
});
}
/**
* _unHideMicrositeMobileNavFromSC - un-hides the microsite
* mobile nav from screen readers
*
* @returns {void}
*/
function _unHideMicrositeMobileNavFromSC() {
$micrositeNavLogoLink.removeAttr('tabindex aria-hidden');
$micrositeNav.find(':focusable').removeAttr('tabindex aria-hidden');
}
/**
* _hideMicrositeMobileNavFromSC - hides the microsite
* mobile nav from screen readers
*
* @returns {void}
*/
function _hideMicrositeMobileNavFromSC() {
$micrositeNavLogoLink.attr({
tabindex: '-1',
'aria-hidden': 'true'
});
$micrositeNav.find(':focusable').attr({
tabindex: '-1',
'aria-hidden': 'true'
});
}
/**
* _toolsAndUtilityMenuHide - Hide Tools list and Utility list sub menus
*
* @returns {void}
*/
function _toolsAndUtilityMenuHide() {
// For mobile menu Tools list and Utility list are always expanded
$toolsList.attr({
'aria-hidden': 'true',
'aria-expanded': 'false'
});
$utilityList.attr({
'aria-hidden': 'true',
'aria-expanded': 'false'
});
}
/**
* _toolsAndUtilityMenuShow - Show Tools list and Utility list sub menus
*
* @returns {void}
*/
function _toolsAndUtilityMenuShow() {
// For mobile menu Tools list and Utility list are always expanded
$toolsList.attr({
'aria-hidden': 'false'
}); // On desktop aria-expanded is set by a trigger on mouse over
$toolsList.removeAttr('aria-expanded');
$utilityList.attr({
'aria-hidden': 'false'
}); // On desktop aria-expanded is not required for utility list
$utilityList.removeAttr('aria-expanded');
}
/**
* _subNavControlOff - removes the event handler for subnav menus
*
* @returns {void}
*/
function _subNavControlOff() {
$hasChildren.off('click.subNavTrigger');
_unHideMicrositeMobileNavFromSC(); // The tools menu is shared by both desktop and mobile unlike
// other menu items. In desktop view, the links in tools
// should not have tabindex=-1
$toolsListItem.each(function(i, toolsListItem) {
$(toolsListItem).removeAttr('tabindex');
});
_unHideMobileNavFromSC();
_toolsAndUtilityMenuHide();
}
/**
* _subNavControlOn - adds the event handler for subnav menus
*
* @returns {void}
*/
function _subNavControlOn() {
// Megamenu adds a sub-pn class when breakpoint > 970px
// Remove this when the mobile nav is enabled
$childlessLinks.removeClass(CLASS_SUBNAV_CONTAINER);
_hideMicrositeMobileNavFromSC();
_toolsAndUtilityMenuShow();
_hideMobileNavFromSC(); // Event listener for elements with the class name 'has-children'
$hasChildren.on('click.subNavTrigger', function(e) {
// Prevent accordion behaviour on platform variants so accordion trigger acts like an anchor link.
if ($(e.currentTarget).hasClass(CLASS_PRIMARY_LINK_EXPANDABLE_LOCKED)) {
return;
}
e.preventDefault();
var $this = $(this);
var $subNav = $this.next(".".concat(CLASS_SUBNAV_CONTAINER));
var $parent = $this.parents(".".concat(CLASS_SUBNAV_CONTAINER)); // These menus are positioned inside divs that have to be relative
// positioned to the accordion to work, so we need to set the top property on the
// first level subnav to be the distance to the top of the viewport.
// Each child will inherit the relative position, so we don't want to update those
if ($parent.length === 1) {
var rect = $parent[0].getBoundingClientRect();
var posTop = rect.top + $primaryNav.scrollTop();
$subNav.css({
top: "-".concat(posTop, "px")
});
}
if ($parent.length > 0) {
// Set the submenu to be the height of the container
var scrollHeight = $primaryNav.prop('scrollHeight');
$subNav.css({
height: "".concat(scrollHeight, "px")
});
} // Add the 'is-transitioning' class
_addTransitioningState($subNav); // If the nav is currently open, close it
if ($this.hasClass(CLASS_OPEN)) {
_toggleOpeningState($this, $subNav); // Timer to remove the 'is-closing' class
setTimeout(function() {
// DTN-1565: Don't set aria-expanded for tools and utility menu in mobile view
// since they have no collapse and expand
if (!($this.hasClass(CLASS_PRIMARY_TOOLS_LIST) || $this.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
$this.removeClass(CLASS_CLOSING);
if (!$this.hasClass(CLASS_SUBNAV_LINK)) {
$this.attr('aria-expanded', 'false');
}
}
if (!($subNav.hasClass(CLASS_PRIMARY_TOOLS_LIST) || $subNav.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
$subNav.attr('aria-hidden', 'true').removeClass(CLASS_CLOSING);
}
}, TIME_EXPANDABLE);
} else {
// If it's an expandable link, collapse all the rest
if ($this.hasClass(CLASS_PRIMARY_LINK_EXPANDABLE)) {
_collapseExpandables($this);
} // Add the opening class and set aria attributes
$this.addClass(CLASS_OPEN);
if (!$this.hasClass(CLASS_SUBNAV_LINK)) {
$this.attr('aria-expanded', 'true');
}
$subNav.attr('aria-hidden', 'false').addClass(CLASS_OPEN);
} // Set the timer to remove the 'is-transitioning' class
_removeTransitioningStateTimer($subNav);
});
}
/**
* _collapseExpandables - collapse every expandable sub navigation
*
* @param {HTMLElement} el the collapsable link element.
* @returns {void}
*/
function _collapseExpandables(el) {
// Prevent login expandable from closing other expandables on platform variant
if ($(el).closest('.header-wrap').attr('data-nav-type') === 'platform') {
return;
}
var $elements = $expandables.not(el); // Note: filter out login nav panel item and its children due to
// UX treat login as separate entity, not part of the nav panels expandables group
$elements.filter(function(index, elem) {
var $elem = $(elem);
var isLoginItem = $elem.hasClass(CLASS_PRIMARY_LOGIN_ITEM);
var isChildOfLoginItem = !!$elem.closest(".".concat(CLASS_PRIMARY_LOGIN_ITEM)).length;
return !isLoginItem && !isChildOfLoginItem;
});
$elements.removeClass(CLASS_OPEN);
$elements.filter(function(index, elem) {
var $elem = $(elem);
return !$elem.hasClass(CLASS_SUBNAV_LINK);
}).attr({
'aria-expanded': 'false'
});
_addTransitioningState($elements);
_removeTransitioningStateTimer($elements);
}
/**
* _addTransitioningState - adds .is-transitioning class on click
*
* @param {HTMLElement} el the transitioning element.
* @returns {void}
*/
function _addTransitioningState(el) {
el.addClass(CLASS_TRANSITIONING);
}
/**
* _removeTransitioningStateTimer - sets the timer to remove the
* .is-transitioning class
*
* @param {HTMLElement} el the transitioning element.
* @returns {void}
*/
function _removeTransitioningStateTimer(el) {
setTimeout(function() {
el.removeClass(CLASS_TRANSITIONING);
}, TIME_EXPANDABLE);
}
/**
* _removeClosingStateTimer - sets the timer to remove the
* .is-closing class
*
* @param {...HTMLElement} params elements to remove the class from.
* @returns {void}
*/
function _removeClosingStateTimer() {
for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
params[_key] = arguments[_key];
}
params.forEach(function(el) {
setTimeout(function() {
el.removeClass(CLASS_CLOSING);
}, TIME_SLIDE);
});
}
/**
* _toggleOpeningState - toggle opening/closing states
*
* @param {...HTMLElement} params elements to toggle
* @returns {void}
*/
function _toggleOpeningState() {
for (var _len2 = arguments.length, params = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
params[_key2] = arguments[_key2];
}
params.forEach(function(el) {
el.removeClass(CLASS_OPEN).addClass(CLASS_CLOSING);
});
}
/**
* _removeSubNavEventHandler - remove the subnavtrigger click event
*
* @returns {void}
*/
function _removeSubNavEventHandler() {
$hasChildren.off('click.subNavTrigger');
}
/**
* _callbackTrigger - event callback for trigger element
*
* @param {Event} e the event.
* @returns {void}
*/
function _callbackTrigger(e) {
e.preventDefault();
if ($(this).hasClass(CLASS_PRIMARY_TRIGGER_OPEN)) {
openNavigation();
} else {
closeNavigation();
}
}
/**
* _callbackBackToParent - event callback for trigger element
*
* @returns {void}
*/
function _callbackBackToParent() {
var $subNav = $(this).closest(".".concat(CLASS_SUBNAV_CONTAINER));
var $anchor = $subNav.siblings(".".concat(CLASS_OPEN));
_toggleOpeningState($anchor, $subNav);
_removeClosingStateTimer($anchor, $subNav);
}
/**
* _callbackTrack - event callback for trackable links
*
* @returns {void}
*/
function _callbackTrack() {
_track(this);
}
/**
* _handleResizeChange - event callback for page resizing
*
* @returns {void}
*/
function _handleResizeChange() {
// Multiple orientation changes/resizes cause the event handler to fire multiple times
_removeSubNavEventHandler();
if (isMq('lg').matches) {
_subNavControlOff();
isMobile = false;
} else {
_subNavControlOn();
isMobile = true;
}
}
/**
* _toggleMobileNavTabLoop - toggle tabbing behaviour within the mobile nav side overlay
*
* @param {boolean} toEnable if to enable the accessibility enhancement
* @returns {void}
*/
function _toggleMobileNavTabLoop(toEnable) {
var blurEventString = 'blur.mobile-nav-tab-loop';
var keydownEventString = 'keydown.mobile-nav-tab-loop';
var $mobileNavCloseTrigger = $nav.find(".".concat(CLASS_PRIMARY_TRIGGER_CLOSE));
var $firstFocusItemInMobileNav = $($nav.find(".".concat(CLASS_PRIMARY_LINK, ":focusable"))[0]); // clean up residue event handlers regardless
$mobileNavCloseTrigger.off(blurEventString);
$firstFocusItemInMobileNav.off(keydownEventString); // enable enahncements
if (toEnable) {
// enable forward tab loop so after close trigger, focus go back to first nav item
$mobileNavCloseTrigger.on(blurEventString, function() {
$firstFocusItemInMobileNav.focus();
}); // cancel backward tab on first nav item so cannot exit nav overlay from the top
$firstFocusItemInMobileNav.on(keydownEventString, function(e) {
if (e.keyCode === CONSTANTS.KEYBOARD.TAB && e.shiftKey) {
e.preventDefault();
return false;
}
});
}
}
/**
* _triggerHashAnchorScroll - trigger scroll on hash links
*
* @returns {void}
*/
function _triggerHashAnchorScroll(e) {
var href = $(e.currentTarget).attr('href'); // Only scroll if href starts with a hash
if (href.substr(0, 1) !== '#') {
return;
}
e.preventDefault(); // Scroll to anchor point
if (isMobile) {
$nav.find(".".concat(CLASS_PRIMARY_TRIGGER_CLOSE)).click(); // Give mobile navigation time to close before scrolling
setTimeout(function() {
var offset = $(href).data('scroll-offset-y-mobile') || 0;
scrollToTarget($(href), true, 500, offset);
}, 300);
} else {
var offset = $(href).data('scroll-offset-y') || 0;
scrollToTarget($(href), true, 500, offset);
} // Update url
window.history.pushState(null, '', href);
}
/**
* init - init nav
*
* @returns {void}
*/
function navInit() {
// Mega menu setup
$primaryNav.megaMenu({
/* prefix for generated unique id attributes, which are required
to indicate aria-owns, aria-controls and aria-labelledby */
uuidPrefix: UUID_PREFIX,
/* css class used to define the megamenu styling */
menuClass: CLASS_PRIMARY_LIST,
/* css class for a top-level navigation item in the megamenu */
topNavItemClass: CLASS_PRIMARY_ITEM,
/* css class for a megamenu panel */
panelClass: CLASS_SUBNAV_CONTAINER,
/* css class for a group of items within a megamenu panel */
panelGroupClass: CLASS_SUBNAV_LIST,
/* css class for the hover state */
hoverClass: CLASS_HOVER,
/* css class for the focus state */
focusClass: CLASS_FOCUS,
/* css class for the open state */
openClass: CLASS_OPEN
});
isMq('lg').addListener(function() {
// run function on resize
_handleResizeChange();
}); // open/close
$trigger.on('click', _callbackTrigger); // return to parent
$backToParent.on('click', _callbackBackToParent); // track click on links in the navigation
$header.on('click', '[data-navigation][data-category][data-description]', _callbackTrack); // Override scroll behaviour of hash links in primary nav
$header.on('click', '.pn-link', _triggerHashAnchorScroll); // handle resize on orientation changed
$(window).on('orientationchangeend', _handleResizeChange); // run function on load
_handleResizeChange();
}
/**
* openNavigation - opens the mobile navigation
*
* @returns {void}
*/
function openNavigation() {
var currentBodyPosition = "-".concat($body.scrollTop(), "px");
$nav.addClass(CLASS_ACTIVE);
_toolsAndUtilityMenuShow();
_unHideMicrositeMobileNavFromSC();
_unHideMobileNavFromSC();
$body.addClass(CLASS_NO_SCROLL).css('top', currentBodyPosition);
$triggerOpen.attr('aria-expanded', 'true'); // DTN-1562 - enable better accessibility when mobile nav side overlay is active
_toggleMobileNavTabLoop(true);
}
/**
* closeNavigation - closes the mobile navigation
*
* @returns {void}
*/
function closeNavigation() {
collapseLoginItem();
var currentBodyPosition = parseInt($body.css('top'), 10) * -1;
$nav.removeClass(CLASS_ACTIVE);
_hideMicrositeMobileNavFromSC();
_hideMobileNavFromSC();
_toolsAndUtilityMenuHide();
$triggerOpen.attr('aria-expanded', 'false');
setTimeout(function() {
$body.removeClass(CLASS_NO_SCROLL).removeAttr('style').scrollTop(currentBodyPosition);
}, 200); // DTN-1562 - remove tabbing accessibility enhancement when mobile nav side overlay is inactive
_toggleMobileNavTabLoop(false);
}
/**
* expandLoginItem - expand login item in mobile navigation
*
* @returns {void}
*/
function expandLoginItem() {
var $loginItemAnchor = $(".".concat(CLASS_PRIMARY_LOGIN_ITEM)).children(".".concat(CLASS_HAS_CHILDREN));
var $loginItemSubNav = $loginItemAnchor.next(".".concat(CLASS_SUBNAV_CONTAINER)); // ignore if already open
if ($loginItemAnchor.hasClass(CLASS_OPEN) && $loginItemSubNav.hasClass(CLASS_OPEN)) {
return false;
}
$loginItemSubNav.attr({
'aria-hidden': 'false',
'aria-expanded': 'true'
}).addClass(CLASS_OPEN);
$loginItemAnchor.attr('aria-expanded', 'true').addClass(CLASS_OPEN).focus();
}
/**
* collapseLoginItem - collapse login item in mobile navigation
*
* @returns {void}
*/
function collapseLoginItem() {
var $loginItemAnchor = $('.pn-login').children(".".concat(CLASS_HAS_CHILDREN));
var $loginItemSubNav = $loginItemAnchor.next(".".concat(CLASS_SUBNAV_CONTAINER)); // ignore if already closed
if (!$loginItemAnchor.hasClass(CLASS_OPEN) && !$loginItemSubNav.hasClass(CLASS_OPEN)) {
return false;
}
$loginItemAnchor.attr('aria-expanded', 'false').removeClass(CLASS_OPEN);
$loginItemSubNav.attr({
'aria-hidden': 'true',
'aria-expanded': 'false'
}).removeClass(CLASS_OPEN);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/nav-login.js
// mobile view elements
var $mobileHeader = $('#header');
var $mobileContainer = $mobileHeader.find('.login-options-container--mobile'); // mobile login container in old IA
var $mobileNavPanel = $mobileHeader.find('.pn-container'); // mobile nav panel from left
var $mobileLoginButton = $mobileHeader.find('.btn-login-trigger--mobile'); // login button from mobile header
// desktop view elements
var $topNav = $('.top-nav');
var $topNavLoginItem = $topNav.find('.top-nav-list-item--login');
var $desktopLoginButton = $topNav.find('.btn-login-trigger--desktop');
var loginNamespace = 'global-header-login';
var timeout;
/**
*
* Mobile functions
*/
function _openMobileContainer() {
// for old IA mobile container
set(loginNamespace, $mobileContainer);
$mobileLoginButton.attr('aria-expanded', 'true');
$mobileContainer.addClass('is-open');
$mobileContainer.attr('aria-hidden', 'false');
}
function _closeMobileContainer() {
// for old IA mobile container
unset(loginNamespace, $mobileContainer);
$mobileLoginButton.attr('aria-expanded', 'false');
$mobileContainer.removeClass('is-open');
$mobileContainer.attr('aria-hidden', 'true');
}
function _openMobileNavPanel() {
// opens mobile nav panel on left and expand login item
openNavigation();
expandLoginItem();
}
function _closeMobileNavPanel() {
// opens mobile nav panel on left
closeNavigation();
}
function _mobileEvents() {
$mobileLoginButton.on('click', function() {
// old IA: popup login container
if ($mobileContainer.length) {
if ($mobileContainer.hasClass(CONSTANTS.CLASSES.OPEN)) {
_closeMobileContainer();
} else {
_openMobileContainer();
}
return;
} // new left panel IA
if ($mobileNavPanel.hasClass(CONSTANTS.CLASSES.ACTIVE)) {
_closeMobileNavPanel();
} else {
_openMobileNavPanel();
}
});
}
/**
*
* Desktop functions
*
*/
// TODO: update desktop code to suit new IA design, code below still applies to old IA design
function _openDesktopContainer() {
$topNavLoginItem.addClass('is-expanded');
$desktopLoginButton.attr('aria-expanded', true);
set(loginNamespace, $topNavLoginItem);
}
function _closeDesktopContainer() {
$topNavLoginItem.removeClass('is-expanded');
$desktopLoginButton.attr('aria-expanded', false);
unset(loginNamespace, $topNavLoginItem);
}
function _desktopContainerIn() {
clearInterval(timeout);
}
function _desktopContainerOut() {
// setTimeout is required to get the current active element
setTimeout(function() {
var $focus = $(document.activeElement);
var isButton = $focus.is('.btn-login-trigger--desktop');
var isLink = $focus.is('.login-option-link');
if (!isButton && !isLink) {
timeout = setTimeout(_closeDesktopContainer, 250);
}
}, 0);
}
function _desktopEvents() {
$desktopLoginButton.on('click', function() {
if ($topNavLoginItem.hasClass('is-expanded')) {
_closeDesktopContainer();
} else {
_openDesktopContainer();
}
});
$topNavLoginItem.on('mouseenter', function() {
if (!$topNavLoginItem.hasClass('is-expanded')) {
_openDesktopContainer();
}
_desktopContainerIn();
});
$topNavLoginItem.on('focusin', _desktopContainerIn);
$topNavLoginItem.on('focusout', _desktopContainerOut);
$topNavLoginItem.on('mouseleave', _desktopContainerOut);
}
function navLoginInit() {
_mobileEvents();
_desktopEvents();
$desktopLoginButton.attr('aria-expanded', false);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/stickyNav.js
var stickyNav_$header = $('#header');
var isGlobalHeader = $('.global-header, .global-header-old').length;
var isPolWrapperBody;
var headerOffset;
/**
* _areAlertsPresent()
*/
function _areAlertsPresent() {
return !!$('.js-global-notification-dismiss').length;
}
/**
* _setRelative()
*
* if alert components are present, add is-relative to $header
*
* when alert is dismissed, redefine the headerOffset and check
* again if some other alert is still present
*
* if alert components are not present, kill alert.dismissed event
* remove is-relative from $header
*
* if alert components are not present and is not tier one or post
* office locator, stickyNav is not required, just kill all eventListenner
*/
function _setRelative() {
if (_areAlertsPresent()) {
stickyNav_$header.addClass('is-relative');
$(window).on('alert.dismissed', function() {
_defineHeaderOffset();
_setRelative();
});
} else {
$(window).off('alert.dismissed');
stickyNav_$header.removeClass('is-relative');
if (isPolWrapperBody) {
stop();
}
}
}
/**
* _defineHeaderOffset()
*/
function _defineHeaderOffset() {
headerOffset = stickyNav_$header.offset().top;
}
/**
* _stopScrollEvent()
*/
function _stopScrollEvent() {
$(window).off('scroll.stickynav');
}
/**
* _startScrollEvent()
*
* if alert components are present, redefine the header offset
* if it's not the case, header offset has to be 0
*
* on scroll, add or remove the is-sticky class
*/
function _startScrollEvent() {
if (_areAlertsPresent()) {
_defineHeaderOffset();
} else {
headerOffset = 0;
}
$(window).on('scroll.stickynav', function() {
if ($(window).scrollTop() > headerOffset) {
stickyNav_$header.addClass('is-sticky');
} else {
stickyNav_$header.removeClass('is-sticky');
}
});
}
/**
* _handleResizeChange()
*
* start or stop the scroll event depending of the current mq matches
*/
function stickyNav_handleResizeChange() {
if (isMq('lg').matches) {
_stopScrollEvent();
} else {
_startScrollEvent();
}
}
/**
* stop()
*
* kill all eventListeners and remove global-header modifier classes
*/
function stop() {
stickyNav_$header.removeClass('is-sticky');
stickyNav_$header.removeClass('is-relative');
_stopScrollEvent();
window.removeEventListener('orientationchange.stickynav', stickyNav_handleResizeChange);
isMq('lg').removeListener(stickyNav_handleResizeChange);
}
/**
* init()
*
* stickyNav is required if
* - global header is present on the page
* - the page is a post office locator page OR an alert component is present
*/
function stickyNavInit() {
isPolWrapperBody = $('.pol-wrapper-body').length;
if (isGlobalHeader || isGlobalHeader && isPolWrapperBody || _areAlertsPresent()) {
stickyNav_handleResizeChange();
window.addEventListener('orientationchange.stickynav', stickyNav_handleResizeChange);
isMq('lg').addListener(stickyNav_handleResizeChange);
_setRelative();
}
}
// EXTERNAL MODULE: ./ui.frontend/src/main/global/js/vendors/megamenu.js
var megamenu = __webpack_require__(115);; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/header-corporate.js
$(document).ready(function() {
navLoginInit();
navInit();
stickyNavInit();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvaGVscGVycy9yZXN0cmljdEZvY3VzLmpzPzczZDYiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL3ZhcmlhYmxlcy9jb25zdGFudHMuanM/YWUxYyIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvaGVscGVycy9pc01xLmpzPzA2YmMiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL2hlbHBlcnMvc2Nyb2xsVG8uanM/ZWY4YiIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9hdXNwb3N0L2hlYWRlci1jb3Jwb3JhdGUvY2xpZW50bGliL3NyYy9qcy9pbXBvcnQvbmF2LmpzP2ZkYTQiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuYXBwcy9zcmMvbWFpbi9jb250ZW50L2pjcl9yb290L2FwcHMvZ2xvYmFsL2NvbXBvbmVudHMvYXVzcG9zdC9oZWFkZXItY29ycG9yYXRlL2NsaWVudGxpYi9zcmMvanMvaW1wb3J0L25hdi1sb2dpbi5qcz8wODkxIiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL2F1c3Bvc3QvaGVhZGVyLWNvcnBvcmF0ZS9jbGllbnRsaWIvc3JjL2pzL2ltcG9ydC9zdGlja3lOYXYuanM/YWY3NCIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9hdXNwb3N0L2hlYWRlci1jb3Jwb3JhdGUvY2xpZW50bGliL3NyYy9qcy9oZWFkZXItY29ycG9yYXRlLmpzP2EzNzEiXSwibmFtZXMiOlsic2V0IiwibmFtZXNwYWNlIiwiJGNvbnRhaW5lciIsImV2ZW50VHlwZSIsImF0dHIiLCIkIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50IiwiY29udGFpbnMiLCJ0YXJnZXQiLCJzdG9wUHJvcGFnYXRpb24iLCJmb2N1cyIsInVuc2V0Iiwib2ZmIiwiQ09OU1RBTlRTIiwiSEFTSF9DSEFSX0xJTUlUIiwiQ0xBU1NFUyIsIkhJRERFTiIsIkFDVElWRSIsIkNVUlJFTlQiLCJGT0NVU0VEIiwiRVJST1IiLCJPUEVOIiwiRElTQUJMRUQiLCJIQVNfRVJST1IiLCJLRVlCT0FSRCIsIkJBQ0tTUEFDRSIsIlRBQiIsIkVOVEVSIiwiRVNDQVBFIiwiTEVGVCIsIlVQIiwiUklHSFQiLCJET1dOIiwiREVMRVRFIiwiRk9SV0FSRF9TTEFTSCIsIkFUVFJJQlVURVMiLCJSRUFET05MWSIsIlJFUVVJUkVEIiwiTUFYIiwiTUlOIiwiQlJFQUtQT0lOVFMiLCJYU00iLCJTTSIsIk1EIiwiTEciLCJYTCIsIlhYTCIsIm1xIiwieHNtIiwic20iLCJtZCIsImxnIiwieGwiLCJ4eGwiLCJpc01xIiwibWluIiwid2luZG93IiwibWF0Y2hNZWRpYSIsImlzQmV0d2VlbiIsIm1heCIsInNjcm9sbFRvVGFyZ2V0Iiwic2hvdWxkU2Nyb2xsRnJvbVRvcCIsInNwZWVkIiwib2Zmc2V0IiwiQVRUUl9TQ1JPTExJTkciLCIkYm9keSIsImlzU2Nyb2xsaW5nIiwidGFyZ2V0UG9zaXRpb24iLCIkdGFyZ2V0IiwiTWF0aCIsInJvdW5kIiwiYWJzIiwidGFyZ2V0UG9zaXRpb25OdW0iLCJfZ2V0VGFyZ2V0U2Nyb2xsUG9zaXRpb24iLCIkcGFnZSIsInNjcm9sbFRvcCIsImFuaW1hdGUiLCJyZW1vdmVBdHRyIiwibGVuZ3RoIiwiJHN1Ym5hdiIsIiRnbG9iYWxIZWFkZXIiLCJpc01xTEciLCJtYXRjaGVzIiwiYWRqdXN0bWVudCIsImhlaWdodCIsInRvcCIsImFuYWx5dGljcyIsIl9zYXRlbGxpdGUiLCJjb21wb25lbnQiLCJsaW5rIiwidHJhY2siLCJjb25zb2xlIiwid2FybiIsIlVVSURfUFJFRklYIiwiQ0xBU1NfSEVBREVSIiwiQ0xBU1NfUFJJTUFSWV9OQVYiLCJDTEFTU19NSUNST1NJVEVfTkFWIiwiQ0xBU1NfTUlDUk9TSVRFX05BVl9MT0dPX0xJTksiLCJDTEFTU19QUklNQVJZX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfTElTVCIsIkNMQVNTX1BSSU1BUllfSVRFTSIsIkNMQVNTX1BSSU1BUllfTElOSyIsIkNMQVNTX1BSSU1BUllfTE9HSU5fSVRFTSIsIkNMQVNTX1BSSU1BUllfTElOS19FWFBBTkRBQkxFIiwiQ0xBU1NfUFJJTUFSWV9MSU5LX0VYUEFOREFCTEVfTE9DS0VEIiwiQ0xBU1NfUFJJTUFSWV9UT09MU19MSVNUX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfVE9PTFNfTElTVCIsIkNMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUIiwiQ0xBU1NfUFJJTUFSWV9UT0dHTEUiLCJDTEFTU19QUklNQVJZX1RSSUdHRVJfT1BFTiIsIkNMQVNTX1BSSU1BUllfVFJJR0dFUl9DTE9TRSIsIkNMQVNTX1NVQk5BVl9DT05UQUlORVIiLCJDTEFTU19TVUJOQVZfRVhQQU5EQUJMRSIsIkNMQVNTX1NVQk5BVl9MSVNUIiwiQ0xBU1NfU1VCTkFWX0xJTksiLCJDTEFTU19PUEVOIiwiQ0xBU1NfQUNUSVZFIiwiQ0xBU1NfVFJBTlNJVElPTklORyIsIkNMQVNTX0NMT1NJTkciLCJDTEFTU19IT1ZFUiIsIkNMQVNTX0ZPQ1VTIiwiQ0xBU1NfTk9fU0NST0xMIiwiQ0xBU1NfSEFTX0NISUxEUkVOIiwiQ0xBU1NfQkFDS19UT19QQVJFTlQiLCJUSU1FX1NMSURFIiwiVElNRV9FWFBBTkRBQkxFIiwiJGhlYWRlciIsIiRwcmltYXJ5TmF2IiwiJG5hdiIsIiRtaWNyb3NpdGVOYXYiLCIkbWljcm9zaXRlTmF2TG9nb0xpbmsiLCIkdG9vbHNMaXN0IiwiJHRvb2xzTGlzdEl0ZW0iLCIkdXRpbGl0eUxpc3QiLCIkdHJpZ2dlciIsIiR0cmlnZ2VyT3BlbiIsIiRoYXNDaGlsZHJ